Handle window.top in embedded iframe situations (fixes #2686)

This commit is contained in:
Bernd Bestel
2025-02-24 19:52:43 +01:00
parent ce5be6645e
commit 2b994fd2ee
8 changed files with 41 additions and 14 deletions

View File

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

View File

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

View File

@@ -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);
} }

View File

@@ -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);
}); });

View File

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

View File

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

View File

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

View File

@@ -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);
} }