From 4eb3477942b016a26627f197d7a8364a448a5af9 Mon Sep 17 00:00:00 2001 From: Nathan Heskew Date: Wed, 9 Jun 2010 16:14:47 -0700 Subject: [PATCH 1/3] 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(); From 2efcb8d6da1f83c1b38ca60c582972e339823411 Mon Sep 17 00:00:00 2001 From: Bertrand Le Roy Date: Wed, 9 Jun 2010 16:53:40 -0700 Subject: [PATCH 2/3] Updated credits.txt with new dependencies. --HG-- branch : dev --- CREDITS.txt | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index d442a8f10..9940c0d8b 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -63,6 +63,18 @@ Website: http://fluentnhibernate.org/ Copyright: Copyright (c) 2008-2009 James Gregory and contributors License: New BSD +FluentPath +----- +Website: http://fluentpath.codeplex.com/ +Copyright: Copyright (c) 2010 Bertrand Le Roy +License: MS-PL + +Html Agility Pack +----- +Website: http://htmlagilitypack.codeplex.com/ +Copyright: Copyright (c) 2003-20010 Simon Mourier +License: MS-PL + IESI Collections ----- Website: http://www.codeproject.com/KB/recipes/sets.aspx @@ -93,6 +105,12 @@ Log4Net Website: http://logging.apache.org/log4net/index.html Copyright: Copyright (c) 2007 Apache Software Foundation License: Apache Software Foundation License 2.0 + +Lucene.net +----- +Website: http://incubator.apache.org/projects/lucene.net.html +Copyright: Copyright (c) 2009 Apache Software Foundation +License: Apache Software Foundation License 2.0 Moq ----- @@ -125,6 +143,12 @@ Website: http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx Copyright: Copyright (c) 2000-2009 IC#Code License: Modified GPL: http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx +SpecFlow +----- +Website: http://www.specflow.org/ +Copyright: Copyright (c) 2009 TechTalk +License: New BSD + SQLite ----- Website: http://www.sqlite.org @@ -137,6 +161,12 @@ WebSite: http://tinymce.moxiecode.com/ Copyright: Copyright (c) 2003-2009 Moxiecode Systems AB License: LGPL 2.1 +WCat +----- +WebSite: http://www.iis.net/community/default.aspx?tabid=34&i=1466&g=6 +Copyright: Copyright (c) 2007 Microsoft +License: "Free" + Yamlnet ----- Website: http://code.google.com/p/yamlnet/ From aa69044b9905e36738a8c889acfb7c65bf75f89e Mon Sep 17 00:00:00 2001 From: Bertrand Le Roy Date: Wed, 9 Jun 2010 17:01:50 -0700 Subject: [PATCH 3/3] Fixing typos and lorem ipsum. --HG-- branch : dev --- .hgignore | 1 + .../Core/App_Data/Localization/fr-FR/orchard.core.po | 2 +- src/Orchard.Web/Core/Indexing/Commands/IndexingCommands.cs | 2 +- .../Modules/Orchard.Search/Controllers/AdminController.cs | 2 +- src/Orchard.Web/Modules/Orchard.Search/Module.txt | 2 +- 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.hgignore b/.hgignore index 91673c801..8ec3e6972 100644 --- a/.hgignore +++ b/.hgignore @@ -15,3 +15,4 @@ glob:src/Orchard.Azure.suo glob:src/Orchard.5.0.ReSharper glob:log.xml glob:profiling +glob:*.csproj.orig diff --git a/src/Orchard.Web/Core/App_Data/Localization/fr-FR/orchard.core.po b/src/Orchard.Web/Core/App_Data/Localization/fr-FR/orchard.core.po index 584707fec..df5797be4 100644 --- a/src/Orchard.Web/Core/App_Data/Localization/fr-FR/orchard.core.po +++ b/src/Orchard.Web/Core/App_Data/Localization/fr-FR/orchard.core.po @@ -1811,7 +1811,7 @@ msgstr "Changer le mot de passe" #: ~/Modules/Orchard.Users/Views/Account/ChangePassword.ascx #| msgid : "Use the form below to change your password." msgid "Use the form below to change your password." -msgstr "Veuillez utiliser le forumulaire ci-dessous pour changer votre mot de passe." +msgstr "Veuillez utiliser le formulaire ci-dessous pour changer votre mot de passe." #: ~/Modules/Orchard.Users/Views/Account/ChangePassword.ascx #| msgid : "New passwords are required to be a minimum of {0} characters in length." diff --git a/src/Orchard.Web/Core/Indexing/Commands/IndexingCommands.cs b/src/Orchard.Web/Core/Indexing/Commands/IndexingCommands.cs index 2cb83c3e6..02c33923d 100644 --- a/src/Orchard.Web/Core/Indexing/Commands/IndexingCommands.cs +++ b/src/Orchard.Web/Core/Indexing/Commands/IndexingCommands.cs @@ -124,7 +124,7 @@ namespace Orchard.Core.Indexing.Commands { } [CommandName("index delete")] - [CommandHelp("index delete /ContenItem:\r\n\t" + "Deletes the specifed fromthe index")] + [CommandHelp("index delete /ContenItem:\r\n\t" + "Deletes the specifed from the index")] [OrchardSwitches("ContentItem")] public string Delete() { int contenItemId; diff --git a/src/Orchard.Web/Modules/Orchard.Search/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Search/Controllers/AdminController.cs index 88ba378be..5d98de72c 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Controllers/AdminController.cs @@ -21,7 +21,7 @@ namespace Orchard.Search.Controllers { var viewModel = new SearchIndexViewModel {HasIndexToManage = _searchService.HasIndexToManage, IndexUpdatedUtc = _searchService.GetIndexUpdatedUtc()}; if (!viewModel.HasIndexToManage) - Services.Notifier.Information(T("There is not search index to manage for this site.")); + Services.Notifier.Information(T("There is no search index to manage for this site.")); return View(viewModel); } diff --git a/src/Orchard.Web/Modules/Orchard.Search/Module.txt b/src/Orchard.Web/Modules/Orchard.Search/Module.txt index 9aaf4589a..c6946e0c9 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Module.txt +++ b/src/Orchard.Web/Modules/Orchard.Search/Module.txt @@ -4,7 +4,7 @@ author: The Orchard Team website: http://orchardproject.net version: 0.1 orchardversion: 0.1.2010.0312 -description: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent ut arcu turpis, et placerat nunc. Nunc sollicitudin iaculis est, in ultricies mi facilisis et. Aenean et tortor non metus adipiscing laoreet in a justo. Pellentesque faucibus nisl ac lectus mollis quis pellentesque tortor egestas. Curabitur vel velit semper nunc gravida scelerisque. Vivamus at tellus dolor, in ultrices quam posuere. +description: Orchard's built-in search module. features: Orchard.Search: Description: Standard interface to Orchard's built-in search.