diff --git a/changelog/79_UNRELEASED_xx-xx-xxxx.md b/changelog/79_UNRELEASED_xx-xx-xxxx.md
index ae026555..625c583c 100644
--- a/changelog/79_UNRELEASED_xx-xx-xxxx.md
+++ b/changelog/79_UNRELEASED_xx-xx-xxxx.md
@@ -50,7 +50,7 @@
### 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
diff --git a/public/js/grocy.js b/public/js/grocy.js
index a1f3d2aa..221700e3 100644
--- a/public/js/grocy.js
+++ b/public/js/grocy.js
@@ -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)
{
e.preventDefault();
@@ -799,10 +827,9 @@ $(document).on("click", ".show-as-dialog-link", function(e)
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
{
diff --git a/public/viewjs/consume.js b/public/viewjs/consume.js
index 96307398..b5cb748e 100644
--- a/public/viewjs/consume.js
+++ b/public/viewjs/consume.js
@@ -91,7 +91,7 @@
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("CloseLastModal"), Grocy.BaseUrl);
}
diff --git a/public/viewjs/inventory.js b/public/viewjs/inventory.js
index f7afb14d..c74d1568 100644
--- a/public/viewjs/inventory.js
+++ b/public/viewjs/inventory.js
@@ -130,7 +130,7 @@ $('#save-inventory-button').on('click', function(e)
{
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("CloseLastModal"), Grocy.BaseUrl);
});
diff --git a/public/viewjs/purchase.js b/public/viewjs/purchase.js
index 951a34c7..a033f9c3 100644
--- a/public/viewjs/purchase.js
+++ b/public/viewjs/purchase.js
@@ -174,7 +174,7 @@ $('#save-purchase-button').on('click', function(e)
{
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("ShowSuccessMessage", successMessage), Grocy.BaseUrl);
window.parent.postMessage(WindowMessageBag("Ready"), Grocy.BaseUrl);
@@ -648,7 +648,7 @@ function UndoStockBooking(bookingId)
Grocy.Api.Get('stock/bookings/' + bookingId.toString(),
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)
{
@@ -673,7 +673,7 @@ function UndoStockTransaction(transactionId)
Grocy.Api.Get('stock/transactions/' + transactionId.toString(),
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)
{
diff --git a/public/viewjs/stockentries.js b/public/viewjs/stockentries.js
index 56748172..e4b1e614 100644
--- a/public/viewjs/stockentries.js
+++ b/public/viewjs/stockentries.js
@@ -92,7 +92,7 @@ $(document).on('click', '.stock-consume-button', function(e)
Grocy.FrontendHelpers.EndUiBusy();
RefreshStockEntryRow(stockRowId);
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)
{
@@ -137,7 +137,7 @@ $(document).on('click', '.product-open-button', function(e)
}
RefreshStockEntryRow(stockRowId);
- window.top.postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", productId)), Grocy.BaseUrl);
+ Grocy.GetTopmostWindow().postMessage(WindowMessageBag("BroadcastMessage", WindowMessageBag("ProductChanged", productId)), Grocy.BaseUrl);
},
function(xhr)
{
@@ -332,7 +332,7 @@ function UndoStockBookingEntry(bookingId, stockRowId, productId)
Grocy.Api.Post('stock/bookings/' + bookingId.toString() + '/undo', {},
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"));
},
function(xhr)
diff --git a/public/viewjs/stockentryform.js b/public/viewjs/stockentryform.js
index c2558e29..b8286aed 100644
--- a/public/viewjs/stockentryform.js
+++ b/public/viewjs/stockentryform.js
@@ -62,7 +62,7 @@
{
var successMessage = __t('Stock entry successfully updated') + '
' + __t("Undo") + '';
- 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("Ready"), Grocy.BaseUrl);
window.parent.postMessage(WindowMessageBag("CloseLastModal"), Grocy.BaseUrl);
diff --git a/public/viewjs/transfer.js b/public/viewjs/transfer.js
index 931c430c..f60d76ac 100644
--- a/public/viewjs/transfer.js
+++ b/public/viewjs/transfer.js
@@ -70,7 +70,7 @@
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("CloseLastModal"), Grocy.BaseUrl);
}