From c7daff151800d73898ed2ebf77f132eb21115435 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Thu, 15 Dec 2011 16:26:54 -0800 Subject: [PATCH] #18277: Confirm deletions Work Item: 18277 --HG-- branch : 1.x --- .hgsubstate | 4 +- .../Views/Content.SummaryAdmin.cshtml | 2 +- .../Navigation/Controllers/AdminController.cs | 2 +- .../Core/Navigation/Views/Admin/Index.cshtml | 2 +- src/Orchard.Web/Core/Shapes/Scripts/base.js | 9 +++- .../Controllers/GalleryController.cs | 1 + .../Views/Gallery/Sources.cshtml | 9 ++-- .../Themes/TheAdmin/Scripts/admin.js | 9 ++++ .../Themes/TheAdmin/Views/Layout.cshtml | 8 ++++ src/Orchard/Mvc/Html/ContentItemExtensions.cs | 48 ++++++++++++++----- 10 files changed, 72 insertions(+), 22 deletions(-) diff --git a/.hgsubstate b/.hgsubstate index d1fbf570d..2500c517b 100644 --- a/.hgsubstate +++ b/.hgsubstate @@ -1,5 +1,5 @@ ec573e5476f7e8a5a61593d6393e9985e9484fcc src/Orchard.Web/Modules/Orchard.Forms -431490c4617992f03bcd1c150828a0ea35934d23 src/Orchard.Web/Modules/Orchard.Projections -01b83c05050bb731d9f69256bbe8884d458ea1c9 src/Orchard.Web/Modules/Orchard.Rules +541c387200e9354aa5d53b4cf8819349dd60d0d9 src/Orchard.Web/Modules/Orchard.Projections +1146de194cce920d47c00eced57f44bf6f135ad6 src/Orchard.Web/Modules/Orchard.Rules 65057c6a5cd71f7994ba9bcbeece50dbb737620e src/Orchard.Web/Modules/Orchard.TaskLease c2e3c396c1fc6c60b131bfc9f83564c6f8d18e58 src/Orchard.Web/Modules/Orchard.Tokens diff --git a/src/Orchard.Web/Core/Contents/Views/Content.SummaryAdmin.cshtml b/src/Orchard.Web/Core/Contents/Views/Content.SummaryAdmin.cshtml index a76fbfe77..3e77d7210 100644 --- a/src/Orchard.Web/Core/Contents/Views/Content.SummaryAdmin.cshtml +++ b/src/Orchard.Web/Core/Contents/Views/Content.SummaryAdmin.cshtml @@ -18,7 +18,7 @@ @if (Model.Content != null) {
@Display(Model.Content)
diff --git a/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs b/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs index a6996aeef..cd24a218d 100644 --- a/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs +++ b/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs @@ -109,7 +109,7 @@ namespace Orchard.Core.Navigation.Controllers { return RedirectToAction("Index"); } - [ValidateAntiForgeryTokenOrchard] + [HttpPost] public ActionResult Delete(int id) { if (!_services.Authorizer.Authorize(Permissions.ManageMainMenu, T("Couldn't manage the main menu"))) return new HttpUnauthorizedResult(); diff --git a/src/Orchard.Web/Core/Navigation/Views/Admin/Index.cshtml b/src/Orchard.Web/Core/Navigation/Views/Admin/Index.cshtml index 855edb6e4..83c531456 100644 --- a/src/Orchard.Web/Core/Navigation/Views/Admin/Index.cshtml +++ b/src/Orchard.Web/Core/Navigation/Views/Admin/Index.cshtml @@ -29,7 +29,7 @@ @if (!menuPartEntry.IsMenuItem) { } else {} - @T("Delete") + @Html.ActionLink(T("Delete").Text, "Delete", new { id = menuPartEntry.MenuItemId }, new { @class="remove", itemprop="RemoveUrl UnsafeUrl" }) ++menuPartEntryIndex; } diff --git a/src/Orchard.Web/Core/Shapes/Scripts/base.js b/src/Orchard.Web/Core/Shapes/Scripts/base.js index a52bb0e86..d94688056 100644 --- a/src/Orchard.Web/Core/Shapes/Scripts/base.js +++ b/src/Orchard.Web/Core/Shapes/Scripts/base.js @@ -208,7 +208,14 @@ } form.css({ "position": "absolute", "left": "-9999em" }); $("body").append(form); - _this.click(function () { form.submit(); return false; }); + _this.click(function () { + if (_this.filter("[itemprop~='RemoveUrl']").length == 1) { + if (!confirm(confirmRemoveMessage)) { + return false; + } + } + form.submit(); + }); }); }); })(jQuery); diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/GalleryController.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/GalleryController.cs index 026cdac90..e13f75479 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/GalleryController.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/GalleryController.cs @@ -63,6 +63,7 @@ namespace Orchard.Packaging.Controllers { }); } + [HttpPost] public ActionResult Remove(int id) { if (_shellSettings.Name != ShellSettings.DefaultName || !Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not authorized to remove sources"))) return new HttpUnauthorizedResult(); diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Views/Gallery/Sources.cshtml b/src/Orchard.Web/Modules/Orchard.Packaging/Views/Gallery/Sources.cshtml index 3d38b03be..24c9cfc01 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Views/Gallery/Sources.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Views/Gallery/Sources.cshtml @@ -6,7 +6,7 @@
@Html.ActionLink(T("Add Feed").Text, "AddSource", new { }, new { @class = "button primaryAction" })
- +@using (Html.BeginFormAntiForgeryPost()) {
@@ -21,12 +21,13 @@ - @foreach ( var item in Model.Sources ) { + @foreach (var item in Model.Sources) { - + }
@item.FeedTitle @Html.Link(item.FeedUrl, item.FeedUrl)@Html.ActionLink(T("Delete").ToString(), "Remove", new { id = item.Id })@Html.ActionLink(T("Delete").ToString(), "Remove", new { id = item.Id }, new { itemprop = "RemoveUrl UnsafeUrl" })
-
\ No newline at end of file + +} \ No newline at end of file diff --git a/src/Orchard.Web/Themes/TheAdmin/Scripts/admin.js b/src/Orchard.Web/Themes/TheAdmin/Scripts/admin.js index 280cc6d0c..d08d93ea2 100644 --- a/src/Orchard.Web/Themes/TheAdmin/Scripts/admin.js +++ b/src/Orchard.Web/Themes/TheAdmin/Scripts/admin.js @@ -61,4 +61,13 @@ $(".bulk-actions-auto select").change(function () { $(this).closest("form").find(".apply-bulk-actions-auto:first").click(); }); + + $("[itemprop~='RemoveUrl']").on("click", function (event) { + // don't show the confirm dialog if the link is also UnsafeUrl, as it will already be handled in base.js + if ($(this).filter("[itemprop~='UnsafeUrl']").length == 1) { + return false; + } + + return confirm(confirmRemoveMessage); + }); })(jQuery); \ No newline at end of file diff --git a/src/Orchard.Web/Themes/TheAdmin/Views/Layout.cshtml b/src/Orchard.Web/Themes/TheAdmin/Views/Layout.cshtml index f129c1827..b9df1a943 100644 --- a/src/Orchard.Web/Themes/TheAdmin/Views/Layout.cshtml +++ b/src/Orchard.Web/Themes/TheAdmin/Views/Layout.cshtml @@ -92,4 +92,12 @@ +} + +@using (Script.Foot()) { + } \ No newline at end of file diff --git a/src/Orchard/Mvc/Html/ContentItemExtensions.cs b/src/Orchard/Mvc/Html/ContentItemExtensions.cs index de99d7165..f5cf8ca04 100644 --- a/src/Orchard/Mvc/Html/ContentItemExtensions.cs +++ b/src/Orchard/Mvc/Html/ContentItemExtensions.cs @@ -13,6 +13,9 @@ namespace Orchard.Mvc.Html { return MvcHtmlString.Create(html.Encode(metadata.DisplayText)); } + public static MvcHtmlString ItemDisplayLink(this HtmlHelper html, IContent content) { + return ItemDisplayLink(html, null, content); + } public static MvcHtmlString ItemDisplayLink(this HtmlHelper html, string linkText, IContent content) { var metadata = content.ContentItem.ContentManager.GetItemMetadata(content); @@ -25,8 +28,39 @@ namespace Orchard.Mvc.Html { metadata.DisplayRouteValues); } - public static MvcHtmlString ItemDisplayLink(this HtmlHelper html, IContent content) { - return ItemDisplayLink(html, null, content); + public static string ItemDisplayUrl(this UrlHelper urlHelper, IContent content) { + var metadata = content.ContentItem.ContentManager.GetItemMetadata(content); + if (metadata.DisplayRouteValues == null) + return null; + + return urlHelper.Action( + Convert.ToString(metadata.DisplayRouteValues["action"]), + metadata.DisplayRouteValues); + } + + public static MvcHtmlString ItemRemoveLink(this HtmlHelper html, IContent content) { + return ItemRemoveLink(html, null, content, null); + } + + public static MvcHtmlString ItemRemoveLink(this HtmlHelper html, string linkText, IContent content, object additionalRouteValues) { + var metadata = content.ContentItem.ContentManager.GetItemMetadata(content); + if (metadata.RemoveRouteValues == null) + return null; + + return html.ActionLink( + NonNullOrEmpty(linkText, metadata.DisplayText, "remove"), + Convert.ToString(metadata.RemoveRouteValues["action"]), + metadata.RemoveRouteValues.Merge(additionalRouteValues)); + } + + public static string ItemRemoveUrl(this UrlHelper urlHelper, IContent content, object additionalRouteValues) { + var metadata = content.ContentItem.ContentManager.GetItemMetadata(content); + if (metadata.RemoveRouteValues == null) + return null; + + return urlHelper.Action( + Convert.ToString(metadata.RemoveRouteValues["action"]), + metadata.RemoveRouteValues.Merge(additionalRouteValues)); } public static MvcHtmlString ItemEditLinkWithReturnUrl(this HtmlHelper html, string linkText, IContent content) { @@ -67,16 +101,6 @@ namespace Orchard.Mvc.Html { metadata.AdminRouteValues.Merge(additionalRouteValues)); } - public static string ItemDisplayUrl(this UrlHelper urlHelper, IContent content) { - var metadata = content.ContentItem.ContentManager.GetItemMetadata(content); - if (metadata.DisplayRouteValues == null) - return null; - - return urlHelper.Action( - Convert.ToString(metadata.DisplayRouteValues["action"]), - metadata.DisplayRouteValues); - } - public static string ItemEditUrl(this UrlHelper urlHelper, IContent content) { var metadata = content.ContentItem.ContentManager.GetItemMetadata(content); if (metadata.DisplayRouteValues == null)