From 4eb3477942b016a26627f197d7a8364a448a5af9 Mon Sep 17 00:00:00 2001 From: Nathan Heskew Date: Wed, 9 Jun 2010 16:14:47 -0700 Subject: [PATCH] Initial culture management UI (could still use a few tweaks in appearance) --HG-- branch : dev --- src/Orchard.Web/Core/Orchard.Core.csproj | 5 +++ .../Settings/Controllers/AdminController.cs | 39 ++++++++++++++++++- .../Core/Settings/Styles/admin.css | 18 +++++++++ .../ViewModels/SettingsIndexViewModel.cs | 2 +- .../ViewModels/SiteCulturesViewModel.cs | 10 +++++ .../Core/Settings/Views/Admin/Culture.ascx | 17 ++++++++ .../Core/Settings/Views/Admin/Index.ascx | 39 ++++++++++--------- .../DisplayTemplates/CurrentCulture.ascx | 2 + .../DisplayTemplates/RemovableCulture.ascx | 6 +++ .../Services/DefaultCultureManager.cs | 10 +++++ .../Localization/Services/ICultureManager.cs | 1 + 11 files changed, 127 insertions(+), 22 deletions(-) create mode 100644 src/Orchard.Web/Core/Settings/Styles/admin.css create mode 100644 src/Orchard.Web/Core/Settings/ViewModels/SiteCulturesViewModel.cs create mode 100644 src/Orchard.Web/Core/Settings/Views/Admin/Culture.ascx create mode 100644 src/Orchard.Web/Core/Settings/Views/DisplayTemplates/CurrentCulture.ascx create mode 100644 src/Orchard.Web/Core/Settings/Views/DisplayTemplates/RemovableCulture.ascx diff --git a/src/Orchard.Web/Core/Orchard.Core.csproj b/src/Orchard.Web/Core/Orchard.Core.csproj index 86497731a..2dd46e48f 100644 --- a/src/Orchard.Web/Core/Orchard.Core.csproj +++ b/src/Orchard.Web/Core/Orchard.Core.csproj @@ -164,6 +164,7 @@ + @@ -216,7 +217,11 @@ + + + + diff --git a/src/Orchard.Web/Core/Settings/Controllers/AdminController.cs b/src/Orchard.Web/Core/Settings/Controllers/AdminController.cs index ceaa8e242..71d5b36dc 100644 --- a/src/Orchard.Web/Core/Settings/Controllers/AdminController.cs +++ b/src/Orchard.Web/Core/Settings/Controllers/AdminController.cs @@ -1,4 +1,6 @@ -using System.Web.Mvc; +using System.Globalization; +using System.Linq; +using System.Web.Mvc; using Orchard.Core.Settings.Models; using Orchard.Core.Settings.ViewModels; using Orchard.Localization; @@ -29,7 +31,7 @@ namespace Orchard.Core.Settings.Controllers { var model = new SettingsIndexViewModel { Site = _siteService.GetSiteSettings().As(), - AvailableCultures = _cultureManager.ListCultures() + SiteCultures = _cultureManager.ListCultures() }; model.ViewModel = Services.ContentManager.BuildEditorModel(model.Site); return View(model); @@ -51,6 +53,39 @@ namespace Orchard.Core.Settings.Controllers { return RedirectToAction("Index"); } + public ActionResult Culture() { + //todo: class and/or method attributes for our auth? + if (!Services.Authorizer.Authorize(Permissions.ManageSettings, T("Not authorized to manage settings"))) + return new HttpUnauthorizedResult(); + + var viewModel = new SiteCulturesViewModel { + CurrentCulture = CultureInfo.CurrentCulture.Name, + SiteCultures = _cultureManager.ListCultures(), + }; + viewModel.AvailableSystemCultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures) + .Select(ci => ci.Name) + .Where(s => !viewModel.SiteCultures.Contains(s)); + + return View(viewModel); + } + + [HttpPost] + public ActionResult AddCulture(string cultureName) { + if (!Services.Authorizer.Authorize(Permissions.ManageSettings, T("Not authorized to manage settings"))) + return new HttpUnauthorizedResult(); + + _cultureManager.AddCulture(cultureName); + return RedirectToAction("Culture"); + } + + [HttpPost] + public ActionResult DeleteCulture(string cultureName) { + if (!Services.Authorizer.Authorize(Permissions.ManageSettings, T("Not authorized to manage settings"))) + return new HttpUnauthorizedResult(); + + _cultureManager.DeleteCulture(cultureName); + return RedirectToAction("Culture"); + } bool IUpdateModel.TryUpdateModel(TModel model, string prefix, string[] includeProperties, string[] excludeProperties) { return TryUpdateModel(model, prefix, includeProperties, excludeProperties); diff --git a/src/Orchard.Web/Core/Settings/Styles/admin.css b/src/Orchard.Web/Core/Settings/Styles/admin.css new file mode 100644 index 000000000..53fc62882 --- /dev/null +++ b/src/Orchard.Web/Core/Settings/Styles/admin.css @@ -0,0 +1,18 @@ +.site-cultures { + font-size:1.2em; + overflow:auto; +} +.site-cultures li { + clear:left; + float:left; + overflow:auto; + padding:1px 6px; + margin:0 0 0 1em; +} +.site-cultures li:hover { + background:#EAEAEA; +} +.site-cultures div { + float:left; + width:6em; +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Settings/ViewModels/SettingsIndexViewModel.cs b/src/Orchard.Web/Core/Settings/ViewModels/SettingsIndexViewModel.cs index 1e96cdbf5..bce0c09da 100644 --- a/src/Orchard.Web/Core/Settings/ViewModels/SettingsIndexViewModel.cs +++ b/src/Orchard.Web/Core/Settings/ViewModels/SettingsIndexViewModel.cs @@ -7,7 +7,7 @@ using Orchard.Core.Settings.Models; namespace Orchard.Core.Settings.ViewModels { public class SettingsIndexViewModel : BaseViewModel { public SiteSettings Site { get; set; } - public IEnumerable AvailableCultures { get; set; } + public IEnumerable SiteCultures { get; set; } public ContentItemViewModel ViewModel { get; set; } diff --git a/src/Orchard.Web/Core/Settings/ViewModels/SiteCulturesViewModel.cs b/src/Orchard.Web/Core/Settings/ViewModels/SiteCulturesViewModel.cs new file mode 100644 index 000000000..98dd899d5 --- /dev/null +++ b/src/Orchard.Web/Core/Settings/ViewModels/SiteCulturesViewModel.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using Orchard.Mvc.ViewModels; + +namespace Orchard.Core.Settings.ViewModels { + public class SiteCulturesViewModel : BaseViewModel { + public string CurrentCulture { get; set; } + public IEnumerable SiteCultures { get; set; } + public IEnumerable AvailableSystemCultures { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Settings/Views/Admin/Culture.ascx b/src/Orchard.Web/Core/Settings/Views/Admin/Culture.ascx new file mode 100644 index 000000000..452c8091e --- /dev/null +++ b/src/Orchard.Web/Core/Settings/Views/Admin/Culture.ascx @@ -0,0 +1,17 @@ +<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> +<%@ Import Namespace="Orchard.Core.Settings.ViewModels" %><% + Html.RegisterStyle("admin.css"); %> +

<%:Html.TitleForPage(T("Manage Settings").ToString()) %>

+

<%:T("Cultures this site supports") %>

+<%=Html.UnorderedList( + Model.SiteCultures.OrderBy(s => s), + (s, i) => Html.DisplayFor(scvm => s, s == Model.CurrentCulture ? "CurrentCulture" : "RemovableCulture", "").ToString(), + "site-cultures", "culture", "odd")%> +<% using (Html.BeginFormAntiForgeryPost("AddCulture")) { %> +<%:Html.ValidationSummary() %> +
+ <%:T("Add a culture...") %> + <%:Html.DropDownList("CultureName", new SelectList(Model.AvailableSystemCultures.OrderBy(s => s), Model.CurrentCulture)) %> + +
+<% } %> \ No newline at end of file diff --git a/src/Orchard.Web/Core/Settings/Views/Admin/Index.ascx b/src/Orchard.Web/Core/Settings/Views/Admin/Index.ascx index a60b12ca0..c01dc960a 100644 --- a/src/Orchard.Web/Core/Settings/Views/Admin/Index.ascx +++ b/src/Orchard.Web/Core/Settings/Views/Admin/Index.ascx @@ -1,34 +1,35 @@ <%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> -<%@ Import Namespace="Orchard.Core.Settings.ViewModels"%> -

<%: Html.TitleForPage(T("Manage Settings").ToString())%>

-<%using (Html.BeginFormAntiForgeryPost()) { %> -<%: Html.ValidationSummary() %> +<%@ Import Namespace="Orchard.Core.Settings.ViewModels" %> +

<%:Html.TitleForPage(T("Manage Settings").ToString()) %>

+<% using (Html.BeginFormAntiForgeryPost()) { %> +<%:Html.ValidationSummary() %>
- <%: T("Global Settings")%> + <%:T("Global Settings") %>
- - <%: Html.EditorFor(m => m.SiteName)%> - <%: Html.ValidationMessage("SiteName", "*") %> + + <%:Html.EditorFor(m => m.SiteName) %> + <%:Html.ValidationMessage("SiteName", "*") %>
- <%=Html.DropDownList("SiteCulture", new SelectList(Model.AvailableCultures, Model.SiteCulture)) %> - <%=Html.ValidationMessage("SiteCulture", "*") %> + <%:Html.DropDownList("SiteCulture", new SelectList(Model.SiteCultures, Model.SiteCulture)) %> + <%:Html.ValidationMessage("SiteCulture", "*") %> + <%:Html.ActionLink(T("Add or remove supported cultures for the site.").ToString(), "Culture") %>
- - <%: Html.EditorFor(x => x.PageTitleSeparator)%> - <%: Html.ValidationMessage("PageTitleSeparator", "*")%> + + <%:Html.EditorFor(x => x.PageTitleSeparator) %> + <%:Html.ValidationMessage("PageTitleSeparator", "*") %>
- - <%: Html.EditorFor(x=>x.SuperUser) %> - <%: Html.ValidationMessage("SuperUser", "*") %> + + <%:Html.EditorFor(x=>x.SuperUser) %> + <%:Html.ValidationMessage("SuperUser", "*") %>
-<%: Html.EditorForItem(Model.ViewModel) %> +<%:Html.EditorForItem(Model.ViewModel) %>
- <%: Html.EditorFor(s => s.Id) %> - " /> + <%:Html.EditorFor(s => s.Id) %> + " />
<% } %> diff --git a/src/Orchard.Web/Core/Settings/Views/DisplayTemplates/CurrentCulture.ascx b/src/Orchard.Web/Core/Settings/Views/DisplayTemplates/CurrentCulture.ascx new file mode 100644 index 000000000..10d49b6ac --- /dev/null +++ b/src/Orchard.Web/Core/Settings/Views/DisplayTemplates/CurrentCulture.ascx @@ -0,0 +1,2 @@ +<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> +<%:Model %> \ No newline at end of file diff --git a/src/Orchard.Web/Core/Settings/Views/DisplayTemplates/RemovableCulture.ascx b/src/Orchard.Web/Core/Settings/Views/DisplayTemplates/RemovableCulture.ascx new file mode 100644 index 000000000..3abc6bfdf --- /dev/null +++ b/src/Orchard.Web/Core/Settings/Views/DisplayTemplates/RemovableCulture.ascx @@ -0,0 +1,6 @@ +<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> +
<%:Model %>
+<% using (Html.BeginFormAntiForgeryPost(Url.Action("DeleteCulture", "Admin", new { area = "Settings" }), FormMethod.Post, new {@class = "inline link"})) { %> + <%=Html.Hidden("cultureName", Model, new { id = "" }) %> + +<% } %> \ No newline at end of file diff --git a/src/Orchard/Localization/Services/DefaultCultureManager.cs b/src/Orchard/Localization/Services/DefaultCultureManager.cs index 58e6301f8..e689ab82b 100644 --- a/src/Orchard/Localization/Services/DefaultCultureManager.cs +++ b/src/Orchard/Localization/Services/DefaultCultureManager.cs @@ -32,6 +32,16 @@ namespace Orchard.Localization.Services { _cultureRepository.Create(new CultureRecord { Culture = cultureName }); } + public void DeleteCulture(string cultureName) { + if (!IsValidCulture(cultureName)) { + throw new ArgumentException("cultureName"); + } + + var culture = _cultureRepository.Get(cr => cr.Culture == cultureName); + if (culture != null) + _cultureRepository.Delete(culture); + } + public string GetCurrentCulture(HttpContext requestContext) { var requestCulture = _cultureSelectors .Select(x => x.GetCulture(requestContext)) diff --git a/src/Orchard/Localization/Services/ICultureManager.cs b/src/Orchard/Localization/Services/ICultureManager.cs index 5027105d1..0ae822a42 100644 --- a/src/Orchard/Localization/Services/ICultureManager.cs +++ b/src/Orchard/Localization/Services/ICultureManager.cs @@ -6,6 +6,7 @@ namespace Orchard.Localization.Services { public interface ICultureManager : IDependency { IEnumerable ListCultures(); void AddCulture(string cultureName); + void DeleteCulture(string cultureName); string GetCurrentCulture(HttpContext requestContext); CultureRecord GetCultureById(int id); string GetSiteCulture();