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