mirror of
https://github.com/grocy/grocy.git
synced 2025-04-29 01:32:38 +00:00
This commit is contained in:
parent
38825c70da
commit
8020f92d6b
@ -49,6 +49,16 @@ class BaseController
|
||||
}
|
||||
$container->view->set('embedded', $embedded);
|
||||
|
||||
$constants = get_defined_constants();
|
||||
foreach ($constants as $constant => $value)
|
||||
{
|
||||
if (substr($constant, 0, 19) !== 'GROCY_FEATURE_FLAG_')
|
||||
{
|
||||
unset($constants[$constant]);
|
||||
}
|
||||
}
|
||||
$container->view->set('featureFlags', $constants);
|
||||
|
||||
try
|
||||
{
|
||||
$usersService = new UsersService();
|
||||
|
@ -121,7 +121,13 @@ class StockApiController extends BaseApiController
|
||||
$specificStockEntryId = $requestBody['stock_entry_id'];
|
||||
}
|
||||
|
||||
$bookingId = $this->StockService->ConsumeProduct($args['productId'], $requestBody['amount'], $spoiled, $transactionType, $specificStockEntryId);
|
||||
$recipeId = null;
|
||||
if (array_key_exists('recipe_id', $requestBody) && is_numeric($requestBody['recipe_id']))
|
||||
{
|
||||
$recipeId = $requestBody['recipe_id'];
|
||||
}
|
||||
|
||||
$bookingId = $this->StockService->ConsumeProduct($args['productId'], $requestBody['amount'], $spoiled, $transactionType, $specificStockEntryId, $recipeId);
|
||||
return $this->ApiResponse(array('booking_id' => $bookingId));
|
||||
}
|
||||
catch (\Exception $ex)
|
||||
|
@ -40,7 +40,8 @@ class StockController extends BaseController
|
||||
public function Consume(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args)
|
||||
{
|
||||
return $this->AppContainer->view->render($response, 'consume', [
|
||||
'products' => $this->Database->products()->orderBy('name')
|
||||
'products' => $this->Database->products()->orderBy('name'),
|
||||
'recipes' => $this->Database->recipes()->orderBy('name')
|
||||
]);
|
||||
}
|
||||
|
||||
|
@ -1115,6 +1115,11 @@
|
||||
"stock_entry_id": {
|
||||
"type": "string",
|
||||
"description": "A specific stock entry id to consume, if used, the amount has to be 1"
|
||||
},
|
||||
"recipe_id": {
|
||||
"type": "number",
|
||||
"format": "integer",
|
||||
"description": "A valid recipe id for which this product was used (for statistical purposes only)"
|
||||
}
|
||||
},
|
||||
"example": {
|
||||
|
@ -333,5 +333,7 @@ return array(
|
||||
'Do not check against the shopping list when adding missing items to it' => 'Do not check against the shopping list when adding missing items to it',
|
||||
'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list' => 'By default the amount to be added to the shopping list is "needed amount - stock amount - shopping list amount" - when this is enabled, it is only checked against the stock amount, not against what is already on the shopping list',
|
||||
'Picture' => 'Picture',
|
||||
'Uncheck ingredients to not put them on the shopping list' => 'Uncheck ingredients to not put them on the shopping list'
|
||||
'Uncheck ingredients to not put them on the shopping list' => 'Uncheck ingredients to not put them on the shopping list',
|
||||
'This is for statistical purposes only' => 'This is for statistical purposes only',
|
||||
'You have to select a recipe' => 'You have to select a recipe'
|
||||
);
|
||||
|
2
migrations/0055.sql
Normal file
2
migrations/0055.sql
Normal file
@ -0,0 +1,2 @@
|
||||
ALTER TABLE stock_log
|
||||
ADD recipe_id INTEGER;
|
55
public/viewjs/components/recipepicker.js
Normal file
55
public/viewjs/components/recipepicker.js
Normal file
@ -0,0 +1,55 @@
|
||||
Grocy.Components.RecipePicker = { };
|
||||
|
||||
Grocy.Components.RecipePicker.GetPicker = function()
|
||||
{
|
||||
return $('#recipe_id');
|
||||
}
|
||||
|
||||
Grocy.Components.RecipePicker.GetInputElement = function()
|
||||
{
|
||||
return $('#recipe_id_text_input');
|
||||
}
|
||||
|
||||
Grocy.Components.RecipePicker.GetValue = function()
|
||||
{
|
||||
return $('#recipe_id').val();
|
||||
}
|
||||
|
||||
Grocy.Components.RecipePicker.SetValue = function(value)
|
||||
{
|
||||
Grocy.Components.RecipePicker.GetInputElement().val(value);
|
||||
Grocy.Components.RecipePicker.GetInputElement().trigger('change');
|
||||
}
|
||||
|
||||
$('.recipe-combobox').combobox({
|
||||
appendId: '_text_input',
|
||||
bsVersion: '4',
|
||||
clearIfNoMatch: true
|
||||
});
|
||||
|
||||
var prefillByName = Grocy.Components.RecipePicker.GetPicker().parent().data('prefill-by-name').toString();
|
||||
if (typeof prefillByName !== "undefined")
|
||||
{
|
||||
possibleOptionElement = $("#recipe_id option:contains('" + prefillByName + "')").first();
|
||||
|
||||
if (possibleOptionElement.length > 0)
|
||||
{
|
||||
$('#recipe_id').val(possibleOptionElement.val());
|
||||
$('#recipe_id').data('combobox').refresh();
|
||||
$('#recipe_id').trigger('change');
|
||||
|
||||
var nextInputElement = $(Grocy.Components.RecipePicker.GetPicker().parent().data('next-input-selector').toString());
|
||||
nextInputElement.focus();
|
||||
}
|
||||
}
|
||||
|
||||
var prefillById = Grocy.Components.RecipePicker.GetPicker().parent().data('prefill-by-id').toString();
|
||||
if (typeof prefillById !== "undefined")
|
||||
{
|
||||
$('#recipe_id').val(prefillById);
|
||||
$('#recipe_id').data('combobox').refresh();
|
||||
$('#recipe_id').trigger('change');
|
||||
|
||||
var nextInputElement = $(Grocy.Components.RecipePicker.GetPicker().parent().data('next-input-selector').toString());
|
||||
nextInputElement.focus();
|
||||
}
|
@ -21,6 +21,11 @@
|
||||
jsonData.stock_entry_id = jsonForm.specific_stock_entry;
|
||||
}
|
||||
|
||||
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_RECIPES && Grocy.Components.RecipePicker.GetValue().toString().length > 0)
|
||||
{
|
||||
jsonData.recipe_id = Grocy.Components.RecipePicker.GetValue();
|
||||
}
|
||||
|
||||
Grocy.Api.Get('stock/products/' + jsonForm.product_id,
|
||||
function(productDetails)
|
||||
{
|
||||
@ -38,6 +43,10 @@
|
||||
|
||||
$('#amount').val(1);
|
||||
Grocy.Components.ProductPicker.SetValue('');
|
||||
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_RECIPES)
|
||||
{
|
||||
Grocy.Components.RecipePicker.SetValue('');
|
||||
}
|
||||
Grocy.Components.ProductPicker.GetInputElement().focus();
|
||||
Grocy.FrontendHelpers.ValidateForm('consume-form');
|
||||
},
|
||||
|
@ -68,7 +68,7 @@ class RecipesService extends BaseService
|
||||
{
|
||||
if ($recipePosition->only_check_single_unit_in_stock == 0)
|
||||
{
|
||||
$this->StockService->ConsumeProduct($recipePosition->product_id, $recipePosition->amount, false, StockService::TRANSACTION_TYPE_CONSUME);
|
||||
$this->StockService->ConsumeProduct($recipePosition->product_id, $recipePosition->amount, false, StockService::TRANSACTION_TYPE_CONSUME, 'default', $recipeId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -165,7 +165,7 @@ class StockService extends BaseService
|
||||
}
|
||||
}
|
||||
|
||||
public function ConsumeProduct(int $productId, float $amount, bool $spoiled, $transactionType, $specificStockEntryId = 'default')
|
||||
public function ConsumeProduct(int $productId, float $amount, bool $spoiled, $transactionType, $specificStockEntryId = 'default', $recipeId = null)
|
||||
{
|
||||
if (!$this->ProductExists($productId))
|
||||
{
|
||||
@ -206,7 +206,8 @@ class StockService extends BaseService
|
||||
'stock_id' => $stockEntry->stock_id,
|
||||
'transaction_type' => $transactionType,
|
||||
'price' => $stockEntry->price,
|
||||
'opened_date' => $stockEntry->opened_date
|
||||
'opened_date' => $stockEntry->opened_date,
|
||||
'recipe_id' => $recipeId
|
||||
));
|
||||
$logRow->save();
|
||||
|
||||
@ -228,7 +229,8 @@ class StockService extends BaseService
|
||||
'stock_id' => $stockEntry->stock_id,
|
||||
'transaction_type' => $transactionType,
|
||||
'price' => $stockEntry->price,
|
||||
'opened_date' => $stockEntry->opened_date
|
||||
'opened_date' => $stockEntry->opened_date,
|
||||
'recipe_id' => $recipeId
|
||||
));
|
||||
$logRow->save();
|
||||
|
||||
|
19
views/components/recipepicker.blade.php
Normal file
19
views/components/recipepicker.blade.php
Normal file
@ -0,0 +1,19 @@
|
||||
@push('componentScripts')
|
||||
<script src="{{ $U('/viewjs/components/recipepicker.js', true) }}?v={{ $version }}"></script>
|
||||
@endpush
|
||||
|
||||
@php if(empty($prefillByName)) { $prefillByName = ''; } @endphp
|
||||
@php if(empty($prefillById)) { $prefillById = ''; } @endphp
|
||||
@php if(!isset($isRequired)) { $isRequired = true; } @endphp
|
||||
@php if(empty($hint)) { $hint = ''; } @endphp
|
||||
|
||||
<div class="form-group" data-next-input-selector="{{ $nextInputSelector }}" data-prefill-by-name="{{ $prefillByName }}" data-prefill-by-id="{{ $prefillById }}">
|
||||
<label for="recipe_id">{{ $L('Recipe') }} <span id="{{ $hintId }}" class="small text-muted">{{ $hint }}</span></label>
|
||||
<select class="form-control recipe-combobox" id="recipe_id" name="recipe_id" @if($isRequired) required @endif>
|
||||
<option value=""></option>
|
||||
@foreach($recipes as $recipe)
|
||||
<option value="{{ $recipe->id }}">{{ $recipe->name }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
<div class="invalid-feedback">{{ $L('You have to select a recipe') }}</div>
|
||||
</div>
|
@ -42,6 +42,14 @@
|
||||
</label>
|
||||
</div>
|
||||
|
||||
@if (GROCY_FEATURE_FLAG_RECIPES)
|
||||
@include('components.recipepicker', array(
|
||||
'recipes' => $recipes,
|
||||
'isRequired' => false,
|
||||
'hint' => $L('This is for statistical purposes only')
|
||||
))
|
||||
@endif
|
||||
|
||||
<button id="save-consume-button" class="btn btn-success">{{ $L('OK') }}</button>
|
||||
<button id="save-mark-as-open-button" class="btn btn-secondary">{{ $L('Mark as opened') }}</button>
|
||||
|
||||
|
@ -54,6 +54,7 @@
|
||||
Grocy.Culture = '{{ GROCY_CULTURE }}';
|
||||
Grocy.Currency = '{{ GROCY_CURRENCY }}';
|
||||
Grocy.UserSettings = {!! json_encode($userSettings) !!};
|
||||
Grocy.FeatureFlags = {!! json_encode($featureFlags) !!};
|
||||
</script>
|
||||
</head>
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user