mirror of
https://github.com/grocy/grocy.git
synced 2025-08-20 04:12:59 +00:00
Handle window.top in embedded iframe situations (fixes #2686)
This commit is contained in:
@@ -50,7 +50,7 @@
|
|||||||
|
|
||||||
### General
|
### General
|
||||||
|
|
||||||
- xxx
|
- Fixed that most dialogs didn't work when hosting Grocy "embedded" in an `iframe` (affecting e.g. the [Home Assistant Add-on](https://github.com/hassio-addons/addon-grocy))
|
||||||
|
|
||||||
### API
|
### API
|
||||||
|
|
||||||
|
@@ -786,6 +786,34 @@ $(window).on("message", function(e)
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
window.IsGrocy = true;
|
||||||
|
Grocy.GetTopmostWindow = function()
|
||||||
|
{
|
||||||
|
if (window.top.IsGrocy)
|
||||||
|
{
|
||||||
|
// If the top window is Grocy (so when we're currently not running in an iframe) return that immediately
|
||||||
|
return window.top;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Otherwise, so when we're currently running in an iframe, climb up the window chain and check for the top most Grocy window
|
||||||
|
var topmostGrocyWindow = window;
|
||||||
|
|
||||||
|
var currentWindow = window;
|
||||||
|
while (currentWindow != window.top)
|
||||||
|
{
|
||||||
|
if (currentWindow.IsGrocy)
|
||||||
|
{
|
||||||
|
topmostGrocyWindow = currentWindow;
|
||||||
|
}
|
||||||
|
|
||||||
|
currentWindow = currentWindow.parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
return topmostGrocyWindow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$(document).on("click", ".show-as-dialog-link", function(e)
|
$(document).on("click", ".show-as-dialog-link", function(e)
|
||||||
{
|
{
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
@@ -799,10 +827,9 @@ $(document).on("click", ".show-as-dialog-link", function(e)
|
|||||||
dialogType = element.attr("data-dialog-type")
|
dialogType = element.attr("data-dialog-type")
|
||||||
}
|
}
|
||||||
|
|
||||||
if (window.top != window.self)
|
if (Grocy.GetTopmostWindow() != window.self)
|
||||||
{
|
{
|
||||||
window.top.postMessage(WindowMessageBag("IframeModal", { "Link": link, "DialogType": dialogType }), Grocy.BaseUrl);
|
Grocy.GetTopmostWindow().postMessage(WindowMessageBag("IframeModal", { "Link": link, "DialogType": dialogType }), Grocy.BaseUrl);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@@ -91,7 +91,7 @@
|
|||||||
|
|
||||||
if (GetUriParam("embedded") !== undefined)
|
if (GetUriParam("embedded") !== undefined)
|
||||||
{
|
{
|
||||||
window.top.postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", jsonForm.product_id)), Grocy.BaseUrl);
|
Grocy.GetTopmostWindow().postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", jsonForm.product_id)), Grocy.BaseUrl);
|
||||||
window.parent.postMessage(WindowMessageBag("ShowSuccessMessage", successMessage), Grocy.BaseUrl);
|
window.parent.postMessage(WindowMessageBag("ShowSuccessMessage", successMessage), Grocy.BaseUrl);
|
||||||
window.parent.postMessage(WindowMessageBag("CloseLastModal"), Grocy.BaseUrl);
|
window.parent.postMessage(WindowMessageBag("CloseLastModal"), Grocy.BaseUrl);
|
||||||
}
|
}
|
||||||
|
@@ -130,7 +130,7 @@ $('#save-inventory-button').on('click', function(e)
|
|||||||
{
|
{
|
||||||
Grocy.Components.UserfieldsForm.Save(function()
|
Grocy.Components.UserfieldsForm.Save(function()
|
||||||
{
|
{
|
||||||
window.top.postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", jsonForm.product_id)), Grocy.BaseUrl);
|
Grocy.GetTopmostWindow().postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", jsonForm.product_id)), Grocy.BaseUrl);
|
||||||
window.parent.postMessage(WindowMessageBag("ShowSuccessMessage", successMessage), Grocy.BaseUrl);
|
window.parent.postMessage(WindowMessageBag("ShowSuccessMessage", successMessage), Grocy.BaseUrl);
|
||||||
window.parent.postMessage(WindowMessageBag("CloseLastModal"), Grocy.BaseUrl);
|
window.parent.postMessage(WindowMessageBag("CloseLastModal"), Grocy.BaseUrl);
|
||||||
});
|
});
|
||||||
|
@@ -174,7 +174,7 @@ $('#save-purchase-button').on('click', function(e)
|
|||||||
{
|
{
|
||||||
Grocy.Components.UserfieldsForm.Save(function()
|
Grocy.Components.UserfieldsForm.Save(function()
|
||||||
{
|
{
|
||||||
window.top.postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", jsonForm.product_id)), Grocy.BaseUrl);
|
Grocy.GetTopmostWindow().postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", jsonForm.product_id)), Grocy.BaseUrl);
|
||||||
window.parent.postMessage(WindowMessageBag("AfterItemAdded", GetUriParam("listitemid")), Grocy.BaseUrl);
|
window.parent.postMessage(WindowMessageBag("AfterItemAdded", GetUriParam("listitemid")), Grocy.BaseUrl);
|
||||||
window.parent.postMessage(WindowMessageBag("ShowSuccessMessage", successMessage), Grocy.BaseUrl);
|
window.parent.postMessage(WindowMessageBag("ShowSuccessMessage", successMessage), Grocy.BaseUrl);
|
||||||
window.parent.postMessage(WindowMessageBag("Ready"), Grocy.BaseUrl);
|
window.parent.postMessage(WindowMessageBag("Ready"), Grocy.BaseUrl);
|
||||||
@@ -648,7 +648,7 @@ function UndoStockBooking(bookingId)
|
|||||||
Grocy.Api.Get('stock/bookings/' + bookingId.toString(),
|
Grocy.Api.Get('stock/bookings/' + bookingId.toString(),
|
||||||
function(result)
|
function(result)
|
||||||
{
|
{
|
||||||
window.top.postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", result.product_id)), Grocy.BaseUrl);
|
Grocy.GetTopmostWindow().postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", result.product_id)), Grocy.BaseUrl);
|
||||||
},
|
},
|
||||||
function(xhr)
|
function(xhr)
|
||||||
{
|
{
|
||||||
@@ -673,7 +673,7 @@ function UndoStockTransaction(transactionId)
|
|||||||
Grocy.Api.Get('stock/transactions/' + transactionId.toString(),
|
Grocy.Api.Get('stock/transactions/' + transactionId.toString(),
|
||||||
function(result)
|
function(result)
|
||||||
{
|
{
|
||||||
window.top.postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", result[0].product_id)), Grocy.BaseUrl);
|
Grocy.GetTopmostWindow().postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", result[0].product_id)), Grocy.BaseUrl);
|
||||||
},
|
},
|
||||||
function(xhr)
|
function(xhr)
|
||||||
{
|
{
|
||||||
|
@@ -92,7 +92,7 @@ $(document).on('click', '.stock-consume-button', function(e)
|
|||||||
Grocy.FrontendHelpers.EndUiBusy();
|
Grocy.FrontendHelpers.EndUiBusy();
|
||||||
RefreshStockEntryRow(stockRowId);
|
RefreshStockEntryRow(stockRowId);
|
||||||
toastr.success(toastMessage);
|
toastr.success(toastMessage);
|
||||||
window.top.postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", productId)), Grocy.BaseUrl);
|
Grocy.GetTopmostWindow().postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", productId)), Grocy.BaseUrl);
|
||||||
},
|
},
|
||||||
function(xhr)
|
function(xhr)
|
||||||
{
|
{
|
||||||
@@ -137,7 +137,7 @@ $(document).on('click', '.product-open-button', function(e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
RefreshStockEntryRow(stockRowId);
|
RefreshStockEntryRow(stockRowId);
|
||||||
window.top.postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", productId)), Grocy.BaseUrl);
|
Grocy.GetTopmostWindow().postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", productId)), Grocy.BaseUrl);
|
||||||
},
|
},
|
||||||
function(xhr)
|
function(xhr)
|
||||||
{
|
{
|
||||||
@@ -332,7 +332,7 @@ function UndoStockBookingEntry(bookingId, stockRowId, productId)
|
|||||||
Grocy.Api.Post('stock/bookings/' + bookingId.toString() + '/undo', {},
|
Grocy.Api.Post('stock/bookings/' + bookingId.toString() + '/undo', {},
|
||||||
function(result)
|
function(result)
|
||||||
{
|
{
|
||||||
window.top.postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", productId)), Grocy.BaseUrl);
|
Grocy.GetTopmostWindow().postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", productId)), Grocy.BaseUrl);
|
||||||
toastr.success(__t("Booking successfully undone"));
|
toastr.success(__t("Booking successfully undone"));
|
||||||
},
|
},
|
||||||
function(xhr)
|
function(xhr)
|
||||||
|
@@ -62,7 +62,7 @@
|
|||||||
{
|
{
|
||||||
var successMessage = __t('Stock entry successfully updated') + '<br><a class="btn btn-secondary btn-sm mt-2" href="#" onclick="UndoStockBookingEntry(\'' + result.id + '\',\'' + Grocy.EditObjectRowId + '\')"><i class="fa-solid fa-undo"></i> ' + __t("Undo") + '</a>';
|
var successMessage = __t('Stock entry successfully updated') + '<br><a class="btn btn-secondary btn-sm mt-2" href="#" onclick="UndoStockBookingEntry(\'' + result.id + '\',\'' + Grocy.EditObjectRowId + '\')"><i class="fa-solid fa-undo"></i> ' + __t("Undo") + '</a>';
|
||||||
|
|
||||||
window.top.postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", Grocy.EditObjectProductId)), Grocy.BaseUrl);
|
Grocy.GetTopmostWindow().postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", Grocy.EditObjectProductId)), Grocy.BaseUrl);
|
||||||
window.parent.postMessage(WindowMessageBag("ShowSuccessMessage", successMessage), Grocy.BaseUrl);
|
window.parent.postMessage(WindowMessageBag("ShowSuccessMessage", successMessage), Grocy.BaseUrl);
|
||||||
window.parent.postMessage(WindowMessageBag("Ready"), Grocy.BaseUrl);
|
window.parent.postMessage(WindowMessageBag("Ready"), Grocy.BaseUrl);
|
||||||
window.parent.postMessage(WindowMessageBag("CloseLastModal"), Grocy.BaseUrl);
|
window.parent.postMessage(WindowMessageBag("CloseLastModal"), Grocy.BaseUrl);
|
||||||
|
@@ -70,7 +70,7 @@
|
|||||||
|
|
||||||
if (GetUriParam("embedded") !== undefined)
|
if (GetUriParam("embedded") !== undefined)
|
||||||
{
|
{
|
||||||
window.top.postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", jsonForm.product_id)), Grocy.BaseUrl);
|
Grocy.GetTopmostWindow().postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", jsonForm.product_id)), Grocy.BaseUrl);
|
||||||
window.parent.postMessage(WindowMessageBag("ShowSuccessMessage", successMessage), Grocy.BaseUrl);
|
window.parent.postMessage(WindowMessageBag("ShowSuccessMessage", successMessage), Grocy.BaseUrl);
|
||||||
window.parent.postMessage(WindowMessageBag("CloseLastModal"), Grocy.BaseUrl);
|
window.parent.postMessage(WindowMessageBag("CloseLastModal"), Grocy.BaseUrl);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user