2020-01-21 17:30:09 +01:00
$ ( '#save-transfer-button' ) . on ( 'click' , function ( e )
2019-12-19 12:48:36 -06:00
{
e . preventDefault ( ) ;
var jsonForm = $ ( '#transfer-form' ) . serializeJSON ( ) ;
Grocy . FrontendHelpers . BeginUiBusy ( "transfer-form" ) ;
var apiUrl = 'stock/products/' + jsonForm . product _id + '/transfer' ;
var jsonData = { } ;
jsonData . amount = jsonForm . amount ;
jsonData . location _id _to = $ ( "#location_id_to" ) . val ( ) ;
jsonData . location _id _from = $ ( "#location_id_from" ) . val ( ) ;
if ( $ ( "#use_specific_stock_entry" ) . is ( ":checked" ) )
{
jsonData . stock _entry _id = jsonForm . specific _stock _entry ;
}
var bookingResponse = null ;
Grocy . Api . Get ( 'stock/products/' + jsonForm . product _id ,
function ( productDetails )
{
Grocy . Api . Post ( apiUrl , jsonData ,
function ( result )
{
var addBarcode = GetUriParam ( 'addbarcodetoselection' ) ;
bookingResponse = result ;
if ( addBarcode !== undefined )
{
var existingBarcodes = productDetails . product . barcode || '' ;
if ( existingBarcodes . length === 0 )
{
productDetails . product . barcode = addBarcode ;
}
else
{
productDetails . product . barcode += ',' + addBarcode ;
}
Grocy . Api . Put ( 'objects/products/' + productDetails . product . id , productDetails . product ,
function ( result )
{
$ ( "#flow-info-addbarcodetoselection" ) . addClass ( "d-none" ) ;
$ ( '#barcode-lookup-disabled-hint' ) . addClass ( 'd-none' ) ;
window . history . replaceState ( { } , document . title , U ( "/transfer" ) ) ;
} ,
function ( xhr )
{
console . error ( xhr ) ;
}
) ;
}
if ( productDetails . product . enable _tare _weight _handling == 1 )
{
var successMessage = _ _t ( 'Transfered %1$s of %2$s from %3$s to %4$s' , Math . abs ( jsonForm . amount - parseFloat ( productDetails . product . tare _weight ) ) + " " + _ _n ( jsonForm . amount , productDetails . quantity _unit _stock . name , productDetails . quantity _unit _stock . name _plural ) , productDetails . product . name , $ ( 'option:selected' , "#location_id_from" ) . text ( ) , $ ( 'option:selected' , "#location_id_to" ) . text ( ) ) + '<br><a class="btn btn-secondary btn-sm mt-2" href="#" onclick="UndoStockTransaction(\'' + bookingResponse . transaction _id + '\')"><i class="fas fa-undo"></i> ' + _ _t ( "Undo" ) + '</a>' ;
}
else
{
var successMessage = _ _t ( 'Transfered %1$s of %2$s from %3$s to %4$s' , Math . abs ( jsonForm . amount ) + " " + _ _n ( jsonForm . amount , productDetails . quantity _unit _stock . name , productDetails . quantity _unit _stock . name _plural ) , productDetails . product . name , $ ( 'option:selected' , "#location_id_from" ) . text ( ) , $ ( 'option:selected' , "#location_id_to" ) . text ( ) ) + '<br><a class="btn btn-secondary btn-sm mt-2" href="#" onclick="UndoStockTransaction(\'' + bookingResponse . transaction _id + '\')"><i class="fas fa-undo"></i> ' + _ _t ( "Undo" ) + '</a>' ;
}
if ( GetUriParam ( "embedded" ) !== undefined )
{
window . parent . postMessage ( WindowMessageBag ( "ProductChanged" , jsonForm . product _id ) , Grocy . BaseUrl ) ;
window . parent . postMessage ( WindowMessageBag ( "ShowSuccessMessage" , successMessage ) , Grocy . BaseUrl ) ;
window . parent . postMessage ( WindowMessageBag ( "CloseAllModals" ) , Grocy . BaseUrl ) ;
}
else
{
Grocy . FrontendHelpers . EndUiBusy ( "transfer-form" ) ;
toastr . success ( successMessage ) ;
$ ( "#specific_stock_entry" ) . find ( "option" ) . remove ( ) . end ( ) . append ( "<option></option>" ) ;
$ ( "#specific_stock_entry" ) . attr ( "disabled" , "" ) ;
$ ( "#specific_stock_entry" ) . removeAttr ( "required" ) ;
if ( $ ( "#use_specific_stock_entry" ) . is ( ":checked" ) )
{
$ ( "#use_specific_stock_entry" ) . click ( ) ;
}
$ ( "#location_id_from" ) . find ( "option" ) . remove ( ) . end ( ) . append ( "<option></option>" ) ;
$ ( "#amount" ) . attr ( "min" , "1" ) ;
$ ( "#amount" ) . attr ( "max" , "999999" ) ;
$ ( "#amount" ) . attr ( "step" , "1" ) ;
$ ( "#amount" ) . parent ( ) . find ( ".invalid-feedback" ) . text ( _ _t ( 'The amount cannot be lower than %s' , '1' ) ) ;
$ ( '#amount' ) . val ( Grocy . UserSettings . stock _default _transfer _amount ) ;
$ ( '#amount_qu_unit' ) . text ( "" ) ;
$ ( "#tare-weight-handling-info" ) . addClass ( "d-none" ) ;
Grocy . Components . ProductPicker . Clear ( ) ;
$ ( "#location_id_to" ) . val ( "" ) ;
$ ( "#location_id_from" ) . val ( "" ) ;
Grocy . Components . ProductPicker . GetInputElement ( ) . focus ( ) ;
2020-01-17 11:13:43 -06:00
Grocy . Components . ProductCard . Refresh ( jsonForm . product _id ) ;
2019-12-19 12:48:36 -06:00
Grocy . FrontendHelpers . ValidateForm ( 'transfer-form' ) ;
}
} ,
function ( xhr )
{
Grocy . FrontendHelpers . EndUiBusy ( "transfer-form" ) ;
console . error ( xhr ) ;
}
) ;
} ,
function ( xhr )
{
Grocy . FrontendHelpers . EndUiBusy ( "transfer-form" ) ;
console . error ( xhr ) ;
}
) ;
} ) ;
Grocy . Components . ProductPicker . GetPicker ( ) . on ( 'change' , function ( e )
{
$ ( "#specific_stock_entry" ) . find ( "option" ) . remove ( ) . end ( ) . append ( "<option></option>" ) ;
if ( $ ( "#use_specific_stock_entry" ) . is ( ":checked" ) )
{
$ ( "#use_specific_stock_entry" ) . click ( ) ;
}
$ ( "#location_id_to" ) . val ( "" ) ;
$ ( "#location_id_from" ) . val ( "" ) ;
var productId = $ ( e . target ) . val ( ) ;
if ( productId )
{
Grocy . Components . ProductCard . Refresh ( productId ) ;
Grocy . Api . Get ( 'stock/products/' + productId ,
function ( productDetails )
{
if ( productDetails . product . enable _tare _weight _handling == 1 ) {
Grocy . Components . ProductPicker . GetPicker ( ) . parent ( ) . find ( ".invalid-feedback" ) . text ( _ _t ( 'Products with Tare weight enabled are currently not supported for Transfer. Please select another product.' ) ) ;
Grocy . Components . ProductPicker . Clear ( ) ;
return ;
}
$ ( '#amount_qu_unit' ) . text ( productDetails . quantity _unit _stock . name ) ;
$ ( "#location_id_from" ) . find ( "option" ) . remove ( ) . end ( ) . append ( "<option></option>" ) ;
Grocy . Api . Get ( "stock/products/" + productId + '/locations' ,
function ( stockLocations )
{
var setDefault = 0 ;
stockLocations . forEach ( stockLocation =>
{
if ( productDetails . location . id == stockLocation . location _id )
{
$ ( "#location_id_from" ) . append ( $ ( "<option>" , {
value : stockLocation . location _id ,
text : stockLocation . location _name + " (" + _ _t ( "Default location" ) + ")"
} ) ) ;
$ ( "#location_id_from" ) . val ( productDetails . location . id ) ;
$ ( "#location_id_from" ) . trigger ( 'change' ) ;
setDefault = 1 ;
}
else
{
$ ( "#location_id_from" ) . append ( $ ( "<option>" , {
value : stockLocation . location _id ,
text : stockLocation . location _name
} ) ) ;
}
if ( setDefault == 0 )
{
$ ( "#location_id_from" ) . val ( stockLocation . location _id ) ;
$ ( "#location_id_from" ) . trigger ( 'change' ) ;
}
} ) ;
} ,
function ( xhr )
{
console . error ( xhr ) ;
}
) ;
if ( productDetails . product . allow _partial _units _in _stock == 1 )
{
$ ( "#amount" ) . attr ( "min" , "0.01" ) ;
$ ( "#amount" ) . attr ( "step" , "0.01" ) ;
$ ( "#amount" ) . parent ( ) . find ( ".invalid-feedback" ) . text ( _ _t ( 'The amount must be between %1$s and %2$s' , 0.01 . toLocaleString ( ) , parseFloat ( productDetails . stock _amount ) . toLocaleString ( ) ) ) ;
}
else
{
$ ( "#amount" ) . attr ( "min" , "1" ) ;
$ ( "#amount" ) . attr ( "step" , "1" ) ;
$ ( "#amount" ) . parent ( ) . find ( ".invalid-feedback" ) . text ( _ _t ( 'The amount must be between %1$s and %2$s' , "1" , parseFloat ( productDetails . stock _amount ) . toLocaleString ( ) ) ) ;
}
if ( productDetails . product . enable _tare _weight _handling == 1 )
{
$ ( "#amount" ) . attr ( "min" , productDetails . product . tare _weight ) ;
$ ( "#tare-weight-handling-info" ) . removeClass ( "d-none" ) ;
}
else
{
$ ( "#tare-weight-handling-info" ) . addClass ( "d-none" ) ;
}
if ( ( parseFloat ( productDetails . stock _amount ) || 0 ) === 0 )
{
Grocy . Components . ProductPicker . Clear ( ) ;
Grocy . FrontendHelpers . ValidateForm ( 'transfer-form' ) ;
Grocy . Components . ProductPicker . ShowCustomError ( _ _t ( 'This product is not in stock' ) ) ;
Grocy . Components . ProductPicker . GetInputElement ( ) . focus ( ) ;
}
else
{
Grocy . Components . ProductPicker . HideCustomError ( ) ;
Grocy . FrontendHelpers . ValidateForm ( 'transfer-form' ) ;
$ ( '#amount' ) . focus ( ) ;
}
} ,
function ( xhr )
{
console . error ( xhr ) ;
}
) ;
}
} ) ;
$ ( '#amount' ) . val ( Grocy . UserSettings . stock _default _transfer _amount ) ;
Grocy . FrontendHelpers . ValidateForm ( 'transfer-form' ) ;
$ ( "#location_id_from" ) . on ( 'change' , function ( e )
{
var locationId = $ ( e . target ) . val ( ) ;
var sumValue = 0 ;
var stockId = null ;
if ( locationId == $ ( "#location_id_to" ) . val ( ) )
{
$ ( "#location_id_to" ) . val ( "" ) ;
}
if ( GetUriParam ( "embedded" ) !== undefined )
{
stockId = GetUriParam ( 'stockId' ) ;
}
$ ( "#specific_stock_entry" ) . find ( "option" ) . remove ( ) . end ( ) . append ( "<option></option>" ) ;
if ( $ ( "#use_specific_stock_entry" ) . is ( ":checked" ) )
{
$ ( "#use_specific_stock_entry" ) . click ( ) ;
}
if ( locationId )
{
Grocy . Api . Get ( "stock/products/" + Grocy . Components . ProductPicker . GetValue ( ) + '/entries' ,
function ( stockEntries )
{
stockEntries . forEach ( stockEntry =>
{
var openTxt = _ _t ( "Not opened" ) ;
if ( stockEntry . open == 1 )
{
openTxt = _ _t ( "Opened" ) ;
}
if ( stockEntry . location _id == locationId )
{
$ ( "#specific_stock_entry" ) . append ( $ ( "<option>" , {
value : stockEntry . stock _id ,
amount : stockEntry . amount ,
text : _ _t ( "Amount: %1$s; Expires on %2$s; Bought on %3$s" , stockEntry . amount , moment ( stockEntry . best _before _date ) . format ( "YYYY-MM-DD" ) , moment ( stockEntry . purchased _date ) . format ( "YYYY-MM-DD" ) ) + "; " + openTxt
} ) ) ;
if ( stockEntry . stock _id == stockId )
{
$ ( "#specific_stock_entry" ) . val ( stockId ) ;
}
sumValue = sumValue + parseFloat ( stockEntry . amount ) ;
}
} ) ;
$ ( "#amount" ) . attr ( "max" , sumValue ) ;
if ( sumValue == 0 )
{
$ ( "#amount" ) . parent ( ) . find ( ".invalid-feedback" ) . text ( _ _t ( 'There are no units available at this location' ) ) ;
}
else
{
$ ( "#amount" ) . parent ( ) . find ( ".invalid-feedback" ) . text ( _ _t ( 'The amount must be between %1$s and %2$s' , "1" , sumValue ) ) ;
}
} ,
function ( xhr )
{
console . error ( xhr ) ;
}
) ;
}
} ) ;
$ ( "#location_id_to" ) . on ( 'change' , function ( e )
{
var locationId = $ ( e . target ) . val ( ) ;
if ( locationId == $ ( "#location_id_from" ) . val ( ) )
{
$ ( "#location_id_to" ) . parent ( ) . find ( ".invalid-feedback" ) . text ( _ _t ( 'This cannot be the same as the "From" location' ) ) ;
$ ( "#location_id_to" ) . val ( "" ) ;
}
} ) ;
$ ( '#amount' ) . on ( 'focus' , function ( e )
{
$ ( this ) . select ( ) ;
} ) ;
$ ( '#transfer-form input' ) . keyup ( function ( event )
{
Grocy . FrontendHelpers . ValidateForm ( 'transfer-form' ) ;
} ) ;
$ ( '#transfer-form select' ) . change ( function ( event )
{
Grocy . FrontendHelpers . ValidateForm ( 'transfer-form' ) ;
} ) ;
$ ( '#transfer-form input' ) . keydown ( function ( event )
{
if ( event . keyCode === 13 ) //Enter
{
event . preventDefault ( ) ;
if ( document . getElementById ( 'transfer-form' ) . checkValidity ( ) === false ) //There is at least one validation error
{
return false ;
}
else
{
$ ( '#save-transfer-button' ) . click ( ) ;
}
}
} ) ;
$ ( "#specific_stock_entry" ) . on ( "change" , function ( e )
{
if ( $ ( e . target ) . val ( ) == "" )
{
var sumValue = 0 ;
Grocy . Api . Get ( "stock/products/" + Grocy . Components . ProductPicker . GetValue ( ) + '/entries' ,
function ( stockEntries )
{
stockEntries . forEach ( stockEntry =>
{
if ( stockEntry . location _id == $ ( "#location_id_from" ) . val ( ) || stockEntry . location _id == "" )
{
sumValue = sumValue + parseFloat ( stockEntry . amount ) ;
}
} ) ;
$ ( "#amount" ) . attr ( "max" , sumValue ) ;
if ( sumValue == 0 )
{
$ ( "#amount" ) . parent ( ) . find ( ".invalid-feedback" ) . text ( _ _t ( 'There are no units available at this location' ) ) ;
}
else
{
$ ( "#amount" ) . parent ( ) . find ( ".invalid-feedback" ) . text ( _ _t ( 'The amount must be between %1$s and %2$s' , "1" , sumValue ) ) ;
}
} ,
function ( xhr )
{
console . error ( xhr ) ;
}
) ;
}
else
{
$ ( "#amount" ) . parent ( ) . find ( ".invalid-feedback" ) . text ( _ _t ( 'The amount must be between %1$s and %2$s' , "1" , $ ( 'option:selected' , this ) . attr ( 'amount' ) ) ) ;
$ ( "#amount" ) . attr ( "max" , $ ( 'option:selected' , this ) . attr ( 'amount' ) ) ;
}
} ) ;
$ ( "#use_specific_stock_entry" ) . on ( "change" , function ( )
{
var value = $ ( this ) . is ( ":checked" ) ;
if ( value )
{
$ ( "#specific_stock_entry" ) . removeAttr ( "disabled" ) ;
$ ( "#specific_stock_entry" ) . attr ( "required" , "" ) ;
}
else
{
$ ( "#specific_stock_entry" ) . attr ( "disabled" , "" ) ;
$ ( "#specific_stock_entry" ) . removeAttr ( "required" ) ;
$ ( "#specific_stock_entry" ) . val ( "" ) ;
$ ( "#location_id_from" ) . trigger ( 'change' ) ;
}
Grocy . FrontendHelpers . ValidateForm ( "transfer-form" ) ;
} ) ;
function UndoStockBooking ( bookingId )
{
Grocy . Api . Post ( 'stock/bookings/' + bookingId . toString ( ) + '/undo' , { } ,
function ( result )
{
toastr . success ( _ _t ( "Booking successfully undone" ) ) ;
} ,
function ( xhr )
{
console . error ( xhr ) ;
}
) ;
} ;
function UndoStockTransaction ( transactionId )
{
Grocy . Api . Post ( 'stock/transactions/' + transactionId . toString ( ) + '/undo' , { } ,
function ( result )
{
toastr . success ( _ _t ( "Transaction successfully undone" ) ) ;
} ,
function ( xhr )
{
console . error ( xhr ) ;
}
) ;
} ;
2020-01-21 17:30:09 +01:00
if ( GetUriParam ( "embedded" ) !== undefined )
{
var locationId = GetUriParam ( 'locationId' ) ;
if ( typeof locationId === 'undefined' )
{
Grocy . Components . ProductPicker . GetPicker ( ) . trigger ( 'change' ) ;
Grocy . Components . ProductPicker . GetInputElement ( ) . focus ( ) ;
}
else
{
$ ( "#location_id_from" ) . val ( locationId ) ;
$ ( "#location_id_from" ) . trigger ( 'change' ) ;
$ ( "#use_specific_stock_entry" ) . click ( ) ;
$ ( "#use_specific_stock_entry" ) . trigger ( 'change' ) ;
}
}
2020-01-26 15:35:01 +01:00
// Default input field
Grocy . Components . ProductPicker . GetInputElement ( ) . focus ( ) ;