--HG--
branch : dev
This commit is contained in:
Renaud Paquay
2010-11-25 18:36:27 -08:00
9 changed files with 148 additions and 25 deletions

View File

@@ -170,8 +170,10 @@ namespace Orchard.Specs.Bindings {
[When(@"I follow ""(.*)""")]
public void WhenIFollow(string linkText) {
var link = _doc.DocumentNode
.SelectNodes("//a")
.Single(elt => elt.InnerText == linkText);
.SelectNodes("//a")
.SingleOrDefault(elt => elt.InnerText == linkText)
?? _doc.DocumentNode
.SelectSingleNode(string.Format("//a[@title='{0}']", linkText));
var urlPath = link.Attributes["href"].Value;

View File

@@ -206,6 +206,11 @@
<DesignTime>True</DesignTime>
<DependentUpon>WebHosting.feature</DependentUpon>
</Compile>
<Compile Include="Widgets.feature.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Widgets.feature</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<Content Include="Hosting\Orchard.Web\Web.config">
@@ -278,6 +283,10 @@
<Generator>SpecFlowSingleFileGenerator</Generator>
<LastGenOutput>UsingSpecFlow.feature.cs</LastGenOutput>
</None>
<None Include="Widgets.feature">
<Generator>SpecFlowSingleFileGenerator</Generator>
<LastGenOutput>Widgets.feature.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Orchard.Web\Core\Orchard.Core.csproj">

View File

@@ -0,0 +1,17 @@
Feature: Widgets
In order to add and manage widgets on my site
As an author
I want to create and edit widgets and layers
Scenario: I can edit a default layer
Given I have installed Orchard
When I go to "admin/widgets"
And I follow "Edit Default layer"
And I fill in
| name | value |
| Description | This is the default layer. |
And I hit "Save"
And I am redirected
Then I should see "Your Layer has been saved"
When I follow "Edit Default layer"
Then I should see "<textarea[^>]*>\s*This is the default layer.\s*</textarea>"

93
src/Orchard.Specs/Widgets.feature.cs generated Normal file
View File

@@ -0,0 +1,93 @@
// ------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by SpecFlow (http://www.specflow.org/).
// SpecFlow Version:1.4.0.0
// Runtime Version:4.0.30319.1
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
// ------------------------------------------------------------------------------
#region Designer generated code
namespace Orchard.Specs
{
using TechTalk.SpecFlow;
[System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "1.4.0.0")]
[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[NUnit.Framework.TestFixtureAttribute()]
[NUnit.Framework.DescriptionAttribute("Widgets")]
public partial class WidgetsFeature
{
private static TechTalk.SpecFlow.ITestRunner testRunner;
#line 1 "Widgets.feature"
#line hidden
[NUnit.Framework.TestFixtureSetUpAttribute()]
public virtual void FeatureSetup()
{
testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner();
TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en-US"), "Widgets", "In order to add and manage widgets on my site\r\nAs an author\r\nI want to create and" +
" edit widgets and layers", GenerationTargetLanguage.CSharp, ((string[])(null)));
testRunner.OnFeatureStart(featureInfo);
}
[NUnit.Framework.TestFixtureTearDownAttribute()]
public virtual void FeatureTearDown()
{
testRunner.OnFeatureEnd();
testRunner = null;
}
public virtual void ScenarioSetup(TechTalk.SpecFlow.ScenarioInfo scenarioInfo)
{
testRunner.OnScenarioStart(scenarioInfo);
}
[NUnit.Framework.TearDownAttribute()]
public virtual void ScenarioTearDown()
{
testRunner.OnScenarioEnd();
}
[NUnit.Framework.TestAttribute()]
[NUnit.Framework.DescriptionAttribute("I can edit a default layer")]
public virtual void ICanEditADefaultLayer()
{
TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("I can edit a default layer", ((string[])(null)));
#line 6
this.ScenarioSetup(scenarioInfo);
#line 7
testRunner.Given("I have installed Orchard");
#line 8
testRunner.When("I go to \"admin/widgets\"");
#line 9
testRunner.And("I follow \"Edit Default layer\"");
#line hidden
TechTalk.SpecFlow.Table table1 = new TechTalk.SpecFlow.Table(new string[] {
"name",
"value"});
table1.AddRow(new string[] {
"Description",
"This is the default layer."});
#line 10
testRunner.And("I fill in", ((string)(null)), table1);
#line 13
testRunner.And("I hit \"Save\"");
#line 14
testRunner.And("I am redirected");
#line 15
testRunner.Then("I should see \"Your Layer has been saved\"");
#line 16
testRunner.When("I follow \"Edit Default layer\"");
#line 17
testRunner.Then("I should see \"<textarea[^>]*>\\s*This is the default layer.\\s*</textarea>\"");
#line hidden
testRunner.CollectScenarioErrors();
}
}
}
#endregion

View File

@@ -44,16 +44,19 @@ namespace Orchard.ContentTypes.Controllers {
if (!Services.Authorizer.Authorize(Permissions.CreateContentTypes, T("Not allowed to create a content type.")))
return new HttpUnauthorizedResult();
if(String.IsNullOrWhiteSpace(viewModel.DisplayName)) {
ModelState.AddModelError("DisplayName", T("The Content Type name can't be empty.").ToString());
viewModel.DisplayName = viewModel.DisplayName ?? String.Empty;
viewModel.Name = viewModel.Name ?? String.Empty;
if (String.IsNullOrWhiteSpace(viewModel.DisplayName)) {
ModelState.AddModelError("DisplayName", T("The Display Name name can't be empty.").ToString());
}
if ( _contentDefinitionService.GetTypes().Any(t => String.Equals(t.Name.Trim(), viewModel.Name.Trim(), StringComparison.OrdinalIgnoreCase)) ) {
ModelState.AddModelError("Name", T("A type with the same technical name already exists.").ToString());
ModelState.AddModelError("Name", T("A type with the same Id already exists.").ToString());
}
if ( _contentDefinitionService.GetTypes().Any(t => String.Equals(t.DisplayName.Trim(), viewModel.DisplayName.Trim(), StringComparison.OrdinalIgnoreCase)) ) {
ModelState.AddModelError("DisplayName", T("A type with the same name already exists.").ToString());
ModelState.AddModelError("DisplayName", T("A type with the same Name already exists.").ToString());
}
if (!ModelState.IsValid) {

View File

@@ -5,7 +5,7 @@
<fieldset>
<label for="DisplayName">@T("Display Name")</label>
@Html.TextBoxFor(m => m.DisplayName, new {@class = "textMedium", autofocus = "autofocus"})
<label for="Name">@T("Technical Name")</label>
<label for="Name">@T("Content Type Id")</label>
@Html.TextBoxFor(m => m.Name, new {@class = "text"})
</fieldset>
<fieldset>

View File

@@ -12,11 +12,12 @@
@Html.ValidationSummary()
<fieldset>
<label for="DisplayName">@T("Display Name")</label>
@Html.TextBoxFor(m => m.DisplayName, new { @class = "textMedium" }) @T("Technical name: {0}", Model.Name)
@Html.TextBoxFor(m => m.DisplayName, new { @class = "textMedium" })
<span class="hint">@T("Content Type Id: {0}", Model.Name)</span>
@* todo: if we continue to go down the midrodata route, some helpers would be nice *@
<meta itemprop="DisplayName" content="@Model.DisplayName" />
@* has unintended consequences (renamging the type) - changing the name creates a new type of that name *@
<meta itemprop="Name" content="@Model.Name" />
<meta itemprop="Id" content="@Model.Name" />
@Html.HiddenFor(m => m.Name)
</fieldset>
@{ Html.RenderTemplates(Model.Templates); }

View File

@@ -33,18 +33,21 @@ namespace Orchard.Widgets.Drivers {
protected override DriverResult Editor(LayerPart layerPart, IUpdateModel updater, dynamic shapeHelper) {
if(updater.TryUpdateModel(layerPart, Prefix, null, null)) {
if ( String.IsNullOrWhiteSpace(layerPart.LayerRule) ) {
if (String.IsNullOrWhiteSpace(layerPart.LayerRule)) {
layerPart.LayerRule = "true";
}
if ( _widgetsService.GetLayers().Any(l => String.Equals(l.Name, layerPart.Name, StringComparison.InvariantCultureIgnoreCase))) {
if (_widgetsService.GetLayers()
.Any(l =>
l.Id != layerPart.Id
&& String.Equals(l.Name, layerPart.Name, StringComparison.InvariantCultureIgnoreCase))) {
updater.AddModelError("Name", T("A Layer with the same name already exists"));
}
try {
_ruleManager.Matches(layerPart.LayerRule);
}
catch ( Exception e ) {
catch (Exception e) {
updater.AddModelError("Description", T("The rule is not valid: {0}", e.Message));
}
}

View File

@@ -52,21 +52,16 @@
<div class="widgets-layers">
<ul>
@foreach (var layer in Model.Layers) {
var layerClass = "widgets-editLayer";
if (layer.Id == Model.CurrentLayer.Id) {
<li class="widgets-currentLayer widgets-editLayer">
<a href="@Url.Action("EditLayer", new { @layer.Id })">
<img width="15" height="15" src="@Url.Content("~/modules/orchard.widgets/Content/Admin/images/edit.png")" />
</a>
@Html.ActionLink(@layer.Name, "Index", new { @layer.Id })
</li>
} else {
<li class="widgets-editLayer">
<a href="@Url.Action("EditLayer", new { @layer.Id })">
<img width="15" height="15" src="@Url.Content("~/modules/orchard.widgets/Content/Admin/images/edit.png")" />
</a>
@Html.ActionLink(@layer.Name, "Index", new { @layer.Id })
</li>
layerClass += " widgets-currentLayer";
}
<li class="@layerClass">
<a href="@Url.Action("EditLayer", new { @layer.Id })" title="@T("Edit {0} layer", layer.Name)">
<img width="15" height="15" src="@Url.Content("~/modules/orchard.widgets/Content/Admin/images/edit.png")" />
</a>
@Html.ActionLink(@layer.Name, "Index", new { @layer.Id })
</li>
}
</ul>
<div class="new-layer">