Merged 'feature/layouteditor' into 1.x.

This commit is contained in:
Daniel Stolt
2015-02-19 22:14:55 +01:00
parent d5c3a0e59f
commit 4b11d08ccd
482 changed files with 44305 additions and 5266 deletions

View File

@@ -23,6 +23,7 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
<UseVSHostingProcess>false</UseVSHostingProcess>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>

View File

@@ -1,3 +1,15 @@
@(Model.Required != null && Model.Required
? Html.TextBox("Text", (string)Model.Text, new { @class = "text large", required = "required" })
: Html.TextBox("Text", (string)Model.Text, new { @class = "text large" }))
@{
var htmlAttributes = new Dictionary<string, object> {
{"class", "text large"}
};
if (Model.Required == true) {
htmlAttributes["required"] = "required";
}
if (Model.AutoFocus == true) {
htmlAttributes["autofocus"] = "autofocus";
}
}
@Html.TextBox("Text", (string)Model.Text, htmlAttributes)

View File

@@ -1,3 +1,15 @@
@(Model.Required != null && Model.Required
? Html.TextBox("Text", (string)Model.Text, new { @class = "text small", required = "required" })
: Html.TextBox("Text", (string)Model.Text, new { @class = "text small" }))
@{
var htmlAttributes = new Dictionary<string, object> {
{"class", "text small"}
};
if (Model.Required == true) {
htmlAttributes["required"] = "required";
}
if (Model.AutoFocus == true) {
htmlAttributes["autofocus"] = "autofocus";
}
}
@Html.TextBox("Text", (string)Model.Text, htmlAttributes)

View File

@@ -1,3 +1,13 @@
@(Model.Required != null && Model.Required
? Html.TextArea("Text", (string)Model.Text, 10, 80, new { required = "required" })
: Html.TextArea("Text", (string)Model.Text, 10, 80, new { }))
@{
var htmlAttributes = new Dictionary<string, object>();
if (Model.Required == true) {
htmlAttributes["required"] = "required";
}
if (Model.AutoFocus == true) {
htmlAttributes["autofocus"] = "autofocus";
}
}
@Html.TextArea("Text", (string)Model.Text, 25, 80, htmlAttributes)

View File

@@ -1,3 +1,15 @@
@(Model.Required != null && Model.Required
? Html.TextBox("Text", (string)Model.Text, new { @class = "text medium", required = "required" })
: Html.TextBox("Text", (string)Model.Text, new { @class = "text medium" }))
@{
var htmlAttributes = new Dictionary<string, object> {
{"class", "text medium"}
};
if (Model.Required == true) {
htmlAttributes["required"] = "required";
}
if (Model.AutoFocus == true) {
htmlAttributes["autofocus"] = "autofocus";
}
}
@Html.TextBox("Text", (string)Model.Text, htmlAttributes)

View File

@@ -1,7 +1,18 @@
@using Orchard.Utility.Extensions;
@{
string editorFlavor = Model.EditorFlavor;
var htmlAttributes = new Dictionary<string, object> {
{"class", editorFlavor.HtmlClassify()}
};
if (Model.Required == true) {
htmlAttributes["required"] = "required";
}
if (Model.AutoFocus == true) {
htmlAttributes["autofocus"] = "autofocus";
}
}
@(Model.Required != null && Model.Required
? Html.TextArea("Text", (string)Model.Text, 25, 80, new { @class = editorFlavor.HtmlClassify(), required = "required" })
: Html.TextArea("Text", (string)Model.Text, 25, 80, new { @class = editorFlavor.HtmlClassify() }))
@Html.TextArea("Text", (string)Model.Text, 25, 80, htmlAttributes)

View File

@@ -2,6 +2,6 @@
@using Orchard.Core.Common.ViewModels;
<fieldset>
<label>@T("Body")</label>
@Display.Body_Editor(Text: Model.Text, EditorFlavor: Model.EditorFlavor, Required: false, ContentItem: Model.BodyPart.ContentItem)
@Display.Body_Editor(Text: Model.Text, EditorFlavor: Model.EditorFlavor, Required: false, AutoFocus: false, ContentItem: Model.BodyPart.ContentItem)
@Html.ValidationMessageFor(m => m.Text)
</fieldset>

View File

@@ -36,6 +36,7 @@
<WarningLevel>4</WarningLevel>
<CodeAnalysisRuleSet>..\..\OrchardBasicCorrectness.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>false</Prefer32Bit>
<UseVSHostingProcess>false</UseVSHostingProcess>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>

View File

@@ -4,8 +4,7 @@
Script.Require("OrchardMarkdown");
Style.Require("OrchardMarkdown");
string idPostfix = Html.FieldIdFor(m => m);
var idPostfix = Html.FieldIdFor(m => m);
var shellDescriptor = WorkContext.Resolve<ShellDescriptor>();
var mediaLibraryEnabled = shellDescriptor.Features.Any(x => x.Name == "Orchard.MediaLibrary");
@@ -18,22 +17,25 @@
Script.Require("OrchardMarkdown-MediaPicker");
}
var textAreaAttributes = new Dictionary<string, object> {
{"id", "wmd-input" + "-" + idPostfix},
{"class", "wmd-input"},
{"data-mediapicker-uploadpath", Model.AddMediaPath},
{"data-mediapicker-title", T("Insert/Update Media")}
};
// The markdown editor itself doesn't seem to (yet) support autofocus, but we'll set it on the textarea nonetheless.
if (Model.AutoFocus == true) {
textAreaAttributes["autofocus"] = "autofocus";
}
}
<div class="wmd-box has-grip">
<div class="wmd-innerbox">
<div class="wmd-editor-box">
<div id="wmd-button-bar-@idPostfix" class="wmd-button-bar"></div>
@Html.TextArea("Text", (string)Model.Text, 25, 80,
new Dictionary<string, object> {
{"id", "wmd-input" + "-" + idPostfix},
{"class", "wmd-input"},
{"data-mediapicker-uploadpath", Model.AddMediaPath},
{"data-mediapicker-title", T("Insert/Update Media")}
})
@Html.TextArea("Text", (string)Model.Text, 25, 80, textAreaAttributes)
</div>
<div class="wmd-preview-box">
<div id="wmd-preview-@idPostfix" class="wmd-panel wmd-preview"></div>
</div>

View File

@@ -553,10 +553,22 @@
<Content Include="Content\Strobe Media Playback Notice.docx" />
</ItemGroup>
<ItemGroup>
<Content Include="Scripts\lib\console-shim.min.js.map">
<DependentUpon>console-shim.min.js</DependentUpon>
</Content>
<Content Include="Scripts\lib\jstree.min.js.map">
<DependentUpon>jstree.min.js</DependentUpon>
</Content>
<Content Include="Scripts\lib\moment.min.js.map">
<DependentUpon>moment.min.js</DependentUpon>
</Content>
<None Include="Scripts\lib\MPEG Dash Notice.docx" />
<Content Include="Styles\cloudmedia-admin-settings.css.map">
<DependentUpon>cloudmedia-admin-settings.css</DependentUpon>
</Content>
<Content Include="Scripts\lib\underscore.min.js.map">
<DependentUpon>underscore.min.js</DependentUpon>
</Content>
</ItemGroup>
<ItemGroup>
<Content Include="Scripts\cloudmedia-admin-common.js.map" />

View File

@@ -117,6 +117,11 @@
<Name>Orchard.Widgets</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Content Include="Scripts\jquery.tmpl.min.js.map">
<DependentUpon>jquery.tmpl.min.js</DependentUpon>
</Content>
</ItemGroup>
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>

View File

@@ -6,7 +6,7 @@ namespace Orchard.DynamicForms.Bindings {
public class BodyPartBindings : Component, IBindingProvider {
public void Describe(BindingDescribeContext context) {
context.For<BodyPart>()
.Binding("Text", (part, s) => part.Text = s);
.Binding("Text", (contentItem, part, s) => part.Text = s);
}
}
}

View File

@@ -0,0 +1,24 @@
using System;
using Orchard.DynamicForms.Services;
using Orchard.DynamicForms.Services.Models;
using Orchard.Fields.Fields;
using Orchard.Localization;
namespace Orchard.DynamicForms.Bindings {
public class BooleanFieldBindings : Component, IBindingProvider {
public BooleanFieldBindings() {
T = NullLocalizer.Instance;
}
public Localizer T { get; set; }
public void Describe(BindingDescribeContext context) {
context.For<BooleanField>()
.Binding("Value", (contentItem, field, s) => field.Value = IsTrueish(s));
}
private bool IsTrueish(string s) {
return !String.IsNullOrWhiteSpace(s) && !String.Equals("false", s, StringComparison.OrdinalIgnoreCase) && !String.Equals(T("No").Text, s, StringComparison.OrdinalIgnoreCase);
}
}
}

View File

@@ -0,0 +1,16 @@
using System;
using Orchard.DynamicForms.Services;
using Orchard.DynamicForms.Services.Models;
using Orchard.Fields.Fields;
namespace Orchard.DynamicForms.Bindings {
public class EnumerationFieldBindings : Component, IBindingProvider {
public void Describe(BindingDescribeContext context) {
context.For<EnumerationField>()
.Binding("SelectedValues", (contentItem, field, s) => {
var items = (s ?? "").Split(new[] {',', ';'}, StringSplitOptions.RemoveEmptyEntries);
field.SelectedValues = items;
});
}
}
}

View File

@@ -0,0 +1,12 @@
using Orchard.DynamicForms.Services;
using Orchard.DynamicForms.Services.Models;
using Orchard.Fields.Fields;
namespace Orchard.DynamicForms.Bindings {
public class InputFieldBindings : Component, IBindingProvider {
public void Describe(BindingDescribeContext context) {
context.For<InputField>()
.Binding("Text", (contentItem, field, s) => field.Value = s);
}
}
}

View File

@@ -0,0 +1,36 @@
using System;
using System.Linq;
using Orchard.ContentManagement;
using Orchard.DynamicForms.Services;
using Orchard.DynamicForms.Services.Models;
using Orchard.Environment.Extensions;
using Orchard.Taxonomies.Fields;
using Orchard.Taxonomies.Models;
using Orchard.Taxonomies.Services;
namespace Orchard.DynamicForms.Bindings {
[OrchardFeature("Orchard.DynamicForms.Taxonomies")]
public class TaxonomyFieldBindings : Component, IBindingProvider {
private readonly ITaxonomyService _taxonomyService;
public TaxonomyFieldBindings(ITaxonomyService taxonomyService) {
_taxonomyService = taxonomyService;
}
public void Describe(BindingDescribeContext context) {
context.For<TaxonomyField>()
.Binding("Terms", (contentItem, field, s) => {
var selectedTerms =
s.Split(new []{',', ';'}, StringSplitOptions.RemoveEmptyEntries)
.Select(XmlHelper.Parse<int?>)
.Select(t => GetTerm(t.GetValueOrDefault()))
.Where(t => t != null).ToList();
_taxonomyService.UpdateTerms(contentItem, selectedTerms, field.Name);
});
}
private TermPart GetTerm(int termId) {
return _taxonomyService.GetTerm(termId);
}
}
}

View File

@@ -6,7 +6,7 @@ namespace Orchard.DynamicForms.Bindings {
public class TextFieldBindings : Component, IBindingProvider {
public void Describe(BindingDescribeContext context) {
context.For<TextField>()
.Binding("Text", (field, s) => field.Value = s);
.Binding("Text", (contentItem, field, s) => field.Value = s);
}
}
}

View File

@@ -6,7 +6,7 @@ namespace Orchard.DynamicForms.Bindings {
public class TitlePartBindings : Component, IBindingProvider {
public void Describe(BindingDescribeContext context) {
context.For<TitlePart>()
.Binding("Title", (part, s) => part.Title = s);
.Binding("Title", (contentItem, part, s) => part.Title = s);
}
}
}

View File

@@ -12,12 +12,12 @@ namespace Orchard.DynamicForms.Bindings {
public void Describe(BindingDescribeContext context) {
context.For<UserPart>()
.Binding("UserName", (part, s) => {
.Binding("UserName", (contentItem, part, s) => {
part.UserName = s;
part.NormalizedUserName = s.ToLowerInvariant();
})
.Binding("Email", (part, s) => part.Email = s)
.Binding("Password", (part, s) => {
.Binding("Email", (contentItem, part, s) => part.Email = s)
.Binding("Password", (contentItem, part, s) => {
part.HashAlgorithm = "SHA1";
_membershipService.SetPassword(part, s);
});

View File

@@ -27,12 +27,12 @@ namespace Orchard.DynamicForms.Drivers {
if (contentTypeDefinition == null)
return null;
var viewModel = new FormBindingSettings {
AvailableBindings = _bindingManager.DescribeBindingsFor(contentTypeDefinition).ToArray()
};
var viewModel = element.Data.GetModel<FormBindingSettings>() ?? new FormBindingSettings();
viewModel.AvailableBindings = _bindingManager.DescribeBindingsFor(contentTypeDefinition).ToArray();
if (context.Updater != null) {
context.Updater.TryUpdateModel(viewModel, null, null, new[] {"AvailableBindings"});
viewModel.Store(element.Data);
}
var bindingsEditor = context.ShapeFactory.EditorTemplate(TemplateName: "FormBindings", Model: viewModel);

View File

@@ -4,8 +4,8 @@ using Orchard.Forms.Services;
using Orchard.Layouts.Framework.Drivers;
namespace Orchard.DynamicForms.Drivers {
public class ButtonDriver : FormsElementDriver<Button> {
public ButtonDriver(IFormManager formManager) : base(formManager) { }
public class ButtonElementDriver : FormsElementDriver<Button> {
public ButtonElementDriver(IFormManager formManager) : base(formManager) { }
protected override IEnumerable<string> FormNames {
get { yield return "Button"; }

View File

@@ -6,10 +6,10 @@ using Orchard.Tokens;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
namespace Orchard.DynamicForms.Drivers {
public class CheckboxDriver : FormsElementDriver<CheckBox> {
public class CheckboxElementDriver : FormsElementDriver<CheckBox> {
private readonly ITokenizer _tokenizer;
public CheckboxDriver(IFormManager formManager, ITokenizer tokenizer)
public CheckboxElementDriver(IFormManager formManager, ITokenizer tokenizer)
: base(formManager) {
_tokenizer = tokenizer;
}

View File

@@ -6,10 +6,10 @@ using Orchard.Tokens;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
namespace Orchard.DynamicForms.Drivers {
public class EmailFieldDriver : FormsElementDriver<EmailField>{
public class EmailFieldElementDriver : FormsElementDriver<EmailField>{
private readonly ITokenizer _tokenizer;
public EmailFieldDriver(IFormManager formManager, ITokenizer tokenizer) : base(formManager) {
public EmailFieldElementDriver(IFormManager formManager, ITokenizer tokenizer) : base(formManager) {
_tokenizer = tokenizer;
}

View File

@@ -12,9 +12,9 @@ using Orchard.Utility.Extensions;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
namespace Orchard.DynamicForms.Drivers {
public class EnumerationDriver : FormsElementDriver<Enumeration> {
public class EnumerationElementDriver : FormsElementDriver<Enumeration> {
private readonly ITokenizer _tokenizer;
public EnumerationDriver(IFormManager formManager, ITokenizer tokenizer)
public EnumerationElementDriver(IFormManager formManager, ITokenizer tokenizer)
: base(formManager) {
_tokenizer = tokenizer;
}
@@ -55,12 +55,11 @@ namespace Orchard.DynamicForms.Drivers {
protected override void OnDisplaying(Enumeration element, ElementDisplayContext context) {
var tokenizedOptions = _tokenizer.Replace(element.Options).ToArray();
var typeName = element.GetType().Name;
var category = element.Category.ToSafeName();
var displayType = context.DisplayType;
context.ElementShape.TokenizedOptions = tokenizedOptions;
context.ElementShape.Metadata.Alternates.Add(String.Format("Element__{0}__{1}__{2}", category, typeName, element.InputType));
context.ElementShape.Metadata.Alternates.Add(String.Format("Element_{0}__{1}__{2}__{3}", displayType, category, typeName, element.InputType));
context.ElementShape.Metadata.Alternates.Add(String.Format("Elements_{0}__{1}", typeName, element.InputType));
context.ElementShape.Metadata.Alternates.Add(String.Format("Elements_{0}__{1}__{2}", displayType, typeName, element.InputType));
}
}
}

View File

@@ -15,13 +15,13 @@ using Orchard.Layouts.Helpers;
using Orchard.Layouts.Services;
namespace Orchard.DynamicForms.Drivers {
public class FormDriver : FormsElementDriver<Form> {
public class FormElementDriver : FormsElementDriver<Form> {
private readonly IContentDefinitionManager _contentDefinitionManager;
private readonly IFormService _formService;
private readonly ICurrentControllerAccessor _currentControllerAccessor;
private readonly ICultureAccessor _cultureAccessor;
public FormDriver(
public FormElementDriver(
IFormManager formManager,
IContentDefinitionManager contentDefinitionManager,
IFormService formService,
@@ -119,7 +119,7 @@ namespace Orchard.DynamicForms.Drivers {
form._FormMethod.Items.Add(new SelectListItem { Text = "GET", Value = "GET" });
// ContentType
var contentTypes = _contentDefinitionManager.ListTypeDefinitions().Where(IsCreatableContentType).ToArray();
var contentTypes = _contentDefinitionManager.ListTypeDefinitions().Where(IsFormBindingContentType).ToArray();
foreach (var contentType in contentTypes.OrderBy(x => x.DisplayName)) {
form._ContentType.Items.Add(new SelectListItem { Text = contentType.DisplayName, Value = contentType.Name });
}
@@ -147,7 +147,7 @@ namespace Orchard.DynamicForms.Drivers {
}
}
private static bool IsCreatableContentType(ContentTypeDefinition contentTypeDefinition) {
private static bool IsFormBindingContentType(ContentTypeDefinition contentTypeDefinition) {
var blacklist = new[] {"Site", "Layer"};
return !blacklist.Any(x => contentTypeDefinition.Name == x) && String.IsNullOrEmpty(contentTypeDefinition.Stereotype());

View File

@@ -7,9 +7,9 @@ using Orchard.Tokens;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
namespace Orchard.DynamicForms.Drivers {
public class HiddenFieldDriver : FormsElementDriver<HiddenField> {
public class HiddenFieldElementDriver : FormsElementDriver<HiddenField> {
private readonly ITokenizer _tokenizer;
public HiddenFieldDriver(IFormManager formManager, ITokenizer tokenizer) : base(formManager) {
public HiddenFieldElementDriver(IFormManager formManager, ITokenizer tokenizer) : base(formManager) {
_tokenizer = tokenizer;
}

View File

@@ -2,5 +2,5 @@
using Orchard.Layouts.Framework.Drivers;
namespace Orchard.DynamicForms.Drivers {
public class UserNameFieldDriver : ElementDriver<UserNameField> { }
public class IpAddressFieldElementDriver : ElementDriver<IpAddressField> { }
}

View File

@@ -4,8 +4,8 @@ using Orchard.Forms.Services;
using Orchard.Layouts.Framework.Drivers;
namespace Orchard.DynamicForms.Drivers {
public class LabelDriver : FormsElementDriver<Label> {
public LabelDriver(IFormManager formManager) : base(formManager) {}
public class LabelElementDriver : FormsElementDriver<Label> {
public LabelElementDriver(IFormManager formManager) : base(formManager) {}
protected override IEnumerable<string> FormNames {
get { yield return "Label"; }

View File

@@ -4,8 +4,8 @@ using Orchard.Layouts.Framework.Drivers;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
namespace Orchard.DynamicForms.Drivers {
public class PasswordFieldDriver : FormsElementDriver<PasswordField>{
public PasswordFieldDriver(IFormManager formManager) : base(formManager) {}
public class PasswordFieldElementDriver : FormsElementDriver<PasswordField>{
public PasswordFieldElementDriver(IFormManager formManager) : base(formManager) {}
protected override EditorResult OnBuildEditor(PasswordField element, ElementEditorContext context) {
var autoLabelEditor = BuildForm(context, "AutoLabel");

View File

@@ -18,12 +18,12 @@ using DescribeContext = Orchard.Forms.Services.DescribeContext;
namespace Orchard.DynamicForms.Drivers {
[OrchardFeature("Orchard.DynamicForms.Projections")]
public class QueryDriver : FormsElementDriver<Query> {
public class QueryElementDriver : FormsElementDriver<Query> {
private readonly IProjectionManager _projectionManager;
private readonly IContentManager _contentManager;
private readonly ITokenizer _tokenizer;
public QueryDriver(IFormManager formManager, IProjectionManager projectionManager, IContentManager contentManager, ITokenizer tokenizer)
public QueryElementDriver(IFormManager formManager, IProjectionManager projectionManager, IContentManager contentManager, ITokenizer tokenizer)
: base(formManager) {
_projectionManager = projectionManager;
_contentManager = contentManager;

View File

@@ -7,10 +7,10 @@ using Orchard.Tokens;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
namespace Orchard.DynamicForms.Drivers {
public class RadioButtonDriver : FormsElementDriver<RadioButton> {
public class RadioButtonElementDriver : FormsElementDriver<RadioButton> {
private readonly ITokenizer _tokenizer;
public RadioButtonDriver(IFormManager formManager, ITokenizer tokenizer)
public RadioButtonElementDriver(IFormManager formManager, ITokenizer tokenizer)
: base(formManager) {
_tokenizer = tokenizer;
}

View File

@@ -8,10 +8,10 @@ using Orchard.Layouts.Framework.Drivers;
namespace Orchard.DynamicForms.Drivers {
[OrchardFeature("Orchard.DynamicForms.AntiSpam")]
public class ReCaptchaDriver : FormsElementDriver<ReCaptcha>{
public class ReCaptchaElementDriver : FormsElementDriver<ReCaptcha>{
private readonly IOrchardServices _services;
public ReCaptchaDriver(IFormManager formManager, IOrchardServices services) : base(formManager) {
public ReCaptchaElementDriver(IFormManager formManager, IOrchardServices services) : base(formManager) {
_services = services;
}

View File

@@ -15,11 +15,11 @@ using DescribeContext = Orchard.Forms.Services.DescribeContext;
namespace Orchard.DynamicForms.Drivers {
[OrchardFeature("Orchard.DynamicForms.Taxonomies")]
public class TaxonomyDriver : FormsElementDriver<Taxonomy> {
public class TaxonomyElementDriver : FormsElementDriver<Taxonomy> {
private readonly ITaxonomyService _taxonomyService;
private readonly ITokenizer _tokenizer;
public TaxonomyDriver(IFormManager formManager, ITaxonomyService taxonomyService, ITokenizer tokenizer)
public TaxonomyElementDriver(IFormManager formManager, ITaxonomyService taxonomyService, ITokenizer tokenizer)
: base(formManager) {
_taxonomyService = taxonomyService;
_tokenizer = tokenizer;
@@ -96,12 +96,11 @@ namespace Orchard.DynamicForms.Drivers {
protected override void OnDisplaying(Taxonomy element, ElementDisplayContext context) {
var taxonomyId = element.TaxonomyId;
var typeName = element.GetType().Name;
var category = element.Category.ToSafeName();
var displayType = context.DisplayType;
context.ElementShape.TermOptions = GetTermOptions(element, taxonomyId).ToArray();
context.ElementShape.Metadata.Alternates.Add(String.Format("Element__{0}__{1}__{2}", category, typeName, element.InputType));
context.ElementShape.Metadata.Alternates.Add(String.Format("Element_{0}__{1}__{2}__{3}", displayType, category, typeName, element.InputType));
context.ElementShape.Metadata.Alternates.Add(String.Format("Elements_{0}__{1}", typeName, element.InputType));
context.ElementShape.Metadata.Alternates.Add(String.Format("Elements_{0}__{1}__{2}", displayType, typeName, element.InputType));
}
private IEnumerable<SelectListItem> GetTermOptions(Taxonomy element, int? taxonomyId) {

View File

@@ -7,9 +7,9 @@ using Orchard.Tokens;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
namespace Orchard.DynamicForms.Drivers {
public class TextAreaDriver : FormsElementDriver<TextArea> {
public class TextAreaElementDriver : FormsElementDriver<TextArea> {
private readonly ITokenizer _tokenizer;
public TextAreaDriver(IFormManager formManager, ITokenizer tokenizer) : base(formManager) {
public TextAreaElementDriver(IFormManager formManager, ITokenizer tokenizer) : base(formManager) {
_tokenizer = tokenizer;
}

View File

@@ -6,10 +6,10 @@ using Orchard.Tokens;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
namespace Orchard.DynamicForms.Drivers {
public class TextFieldDriver : FormsElementDriver<TextField>{
public class TextFieldElementDriver : FormsElementDriver<TextField>{
private readonly ITokenizer _tokenizer;
public TextFieldDriver(IFormManager formManager, ITokenizer tokenizer) : base(formManager) {
public TextFieldElementDriver(IFormManager formManager, ITokenizer tokenizer) : base(formManager) {
_tokenizer = tokenizer;
}

View File

@@ -2,5 +2,5 @@
using Orchard.Layouts.Framework.Drivers;
namespace Orchard.DynamicForms.Drivers {
public class IpAddressFieldDriver : ElementDriver<IpAddressField> { }
public class UserNameFieldElementDriver : ElementDriver<UserNameField> { }
}

View File

@@ -4,8 +4,8 @@ using Orchard.Forms.Services;
using Orchard.Layouts.Framework.Drivers;
namespace Orchard.DynamicForms.Drivers {
public class ValidationMessageDriver : FormsElementDriver<ValidationMessage> {
public ValidationMessageDriver(IFormManager formManager) : base(formManager) {}
public class ValidationMessageElementDriver : FormsElementDriver<ValidationMessage> {
public ValidationMessageElementDriver(IFormManager formManager) : base(formManager) {}
protected override IEnumerable<string> FormNames {
get { yield return "ValidationMessage"; }
@@ -17,8 +17,8 @@ namespace Orchard.DynamicForms.Drivers {
var form = shape.Fieldset(
Id: "ValidationMessage",
_ValidationMessageFor: shape.Textbox(
Id: "ValidationMessageFor",
Name: "ValidationMessageFor",
Id: "For",
Name: "For",
Title: "For",
Classes: new[] { "text", "large" },
Description: T("The name of the field this validation message is for.")));

View File

@@ -2,6 +2,6 @@
using Orchard.Layouts.Framework.Drivers;
namespace Orchard.DynamicForms.Drivers {
public class ValidationSummaryDriver : ElementDriver<ValidationSummary> {
public class ValidationSummaryElementDriver : ElementDriver<ValidationSummary> {
}
}

View File

@@ -2,13 +2,13 @@
namespace Orchard.DynamicForms.Elements {
public class Button : FormElement {
public override bool HasEditor {
get { return true; }
public override string ToolboxIcon {
get { return "\uf096"; }
}
public string Text {
get { return State.Get("ButtonText", "Submit"); }
set { State["ButtonText"] = value; }
get { return this.Retrieve(x => x.Text, () => "Submit"); }
set { this.Store(x => x.Text, value); }
}
}
}

View File

@@ -2,8 +2,12 @@
namespace Orchard.DynamicForms.Elements {
public class CheckBox : LabeledFormElement {
public override string ToolboxIcon {
get { return "\uf046"; }
}
public CheckBoxValidationSettings ValidationSettings {
get { return State.GetModel<CheckBoxValidationSettings>(""); }
get { return Data.GetModel<CheckBoxValidationSettings>(""); }
}
}
}

View File

@@ -3,7 +3,7 @@
namespace Orchard.DynamicForms.Elements {
public class EmailField : LabeledFormElement {
public EmailFieldValidationSettings ValidationSettings {
get { return State.GetModel<EmailFieldValidationSettings>(""); }
get { return Data.GetModel<EmailFieldValidationSettings>(""); }
}
}
}

View File

@@ -18,8 +18,8 @@ namespace Orchard.DynamicForms.Elements {
}
public string InputType {
get { return State.Get("InputType", "SelectList"); }
set { State["InputType"] = value; }
get { return this.Retrieve(x => x.InputType, () => "SelectList"); }
set { this.Store(x => x.InputType, value); }
}
private IEnumerable<SelectListItem> GetOptions() {
@@ -27,7 +27,7 @@ namespace Orchard.DynamicForms.Elements {
}
private IEnumerable<SelectListItem> ParseOptionsText() {
var data = State.Get("Options");
var data = this.Retrieve("Options", () => "");
var lines = Regex.Split(data, @"(?:\r\n|[\r\n])", RegexOptions.Multiline);
return lines.Select(ParseLine).Where(x => x != null);
}

View File

@@ -4,57 +4,57 @@ using Orchard.Layouts.Helpers;
namespace Orchard.DynamicForms.Elements {
public class Form : Container {
public override string Category {
get { return "Form"; }
get { return "Forms"; }
}
public string Name {
get { return State.Get("FormName", "Untitled"); }
set { State["FormName"] = value; }
get { return this.Retrieve("FormName", () => "Untitled"); }
set { this.Store("FormName", value); }
}
public bool? EnableClientValidation {
get { return State.Get("EnableClientValidation").ToBoolean(); }
set { State["EnableClientValidation"] = value.ToString(); }
get { return this.Retrieve(x => x.EnableClientValidation); }
set { this.Store(x => x.EnableClientValidation, value); }
}
public string Action {
get { return State.Get("FormAction"); }
set { State["FormAction"] = value; }
get { return this.Retrieve<string>("FormAction"); }
set { this.Store("FormAction", value); }
}
public string Method {
get { return State.Get("FormMethod"); }
set { State["FormMethod"] = value; }
get { return this.Retrieve<string>("FormMethod"); }
set { this.Store("FormMethod", value); }
}
public bool? StoreSubmission {
get { return State.Get("StoreSubmission").ToBoolean(); }
set { State["StoreSubmission"] = value != null ? value.Value.ToString() : null; }
get { return this.Retrieve(x => x.StoreSubmission); }
set { this.Store(x => x.StoreSubmission, value); }
}
public bool? CreateContent {
get { return State.Get("CreateContent").ToBoolean(); }
set { State["CreateContent"] = value != null ? value.Value.ToString() : null; }
get { return this.Retrieve(x => x.CreateContent); }
set { this.Store(x => x.CreateContent, value); }
}
public string ContentType {
get { return State.Get("CreateContentType"); }
set { State["CreateContentType"] = value; }
get { return this.Retrieve<string>("CreateContentType"); }
set { this.Store("CreateContentType", value); }
}
public string Publication {
get { return State.Get("Publication"); }
set { State["Publication"] = value; }
get { return this.Retrieve(x => x.Publication); }
set { this.Store(x => x.Publication, value); }
}
public string Notification {
get { return State.Get("Notification"); }
set { State["Notification"] = value; }
get { return this.Retrieve(x => x.Notification); }
set { this.Store(x => x.Notification, value); }
}
public string RedirectUrl {
get { return State.Get("RedirectUrl"); }
set { State["RedirectUrl"] = value; }
get { return this.Retrieve(x => x.RedirectUrl); }
set { this.Store(x => x.RedirectUrl, value); }
}
}
}

View File

@@ -5,7 +5,7 @@ using Orchard.Layouts.Framework.Harvesters;
namespace Orchard.DynamicForms.Elements {
public class FormCategoryProvider : Component, ICategoryProvider {
public IEnumerable<Category> GetCategories() {
yield return new Category("Form", T("Form"), T("Contains elements that help building forms."), 10);
yield return new Category("Forms", T("Forms"), T("Contains elements that help building forms."), 10);
}
}
}

View File

@@ -11,19 +11,15 @@ namespace Orchard.DynamicForms.Elements {
}
public override string Category {
get { return "Form"; }
}
public override bool HasEditor {
get { return true; }
get { return "Forms"; }
}
public virtual string Name {
get { return State.Get("InputName"); }
get { return this.Retrieve<string>("InputName"); }
}
public string Value {
get { return State.Get("Value"); }
get { return this.Retrieve(x => x.Value); }
}
/// <summary>
@@ -40,8 +36,8 @@ namespace Orchard.DynamicForms.Elements {
public string PostedValue { get; set; }
public string FormBindingContentType {
get { return State.Get("FormBindingContentType"); }
set { State["FormBindingContentType"] = value; }
get { return this.Retrieve(x => x.FormBindingContentType); }
set { this.Store(x => x.FormBindingContentType, value); }
}
public Form Form {

View File

@@ -4,7 +4,7 @@ using Orchard.Layouts.Helpers;
namespace Orchard.DynamicForms.Elements {
public class Label : Element {
public override string Category {
get { return "Form"; }
get { return "Forms"; }
}
public override bool HasEditor {
@@ -12,13 +12,13 @@ namespace Orchard.DynamicForms.Elements {
}
public string Text {
get { return State.Get("LabelText"); }
set { State["LabelText"] = value; }
get { return this.Retrieve<string>("LabelText"); }
set { this.Store("LabelText", value); }
}
public string For {
get { return State.Get("LabelFor"); }
set { State["LabelFor"] = value; }
get { return this.Retrieve<string>("LabelFor"); }
set { this.Store("LabelFor", value); }
}
}
}

View File

@@ -3,13 +3,13 @@
namespace Orchard.DynamicForms.Elements {
public abstract class LabeledFormElement : FormElement {
public string Label {
get { return State.Get("Label"); }
set { State["Label"] = value; }
get { return this.Retrieve(x => x.Label); }
set { this.Store(x => x.Label, value); }
}
public bool ShowLabel {
get { return State.Get("ShowLabel").ToBoolean().GetValueOrDefault(); }
set { State["ShowLabel"] = value.ToString(); }
get { return this.Retrieve(x => x.ShowLabel); }
set { this.Store(x => x.ShowLabel, value); }
}
}
}

View File

@@ -3,7 +3,7 @@
namespace Orchard.DynamicForms.Elements {
public class PasswordField : LabeledFormElement {
public PasswordFieldValidationSettings ValidationSettings {
get { return State.GetModel<PasswordFieldValidationSettings>(""); }
get { return Data.GetModel<PasswordFieldValidationSettings>(""); }
}
}
}

View File

@@ -4,26 +4,26 @@ namespace Orchard.DynamicForms.Elements {
public class Query : LabeledFormElement {
public string InputType {
get { return State.Get("InputType", "SelectList"); }
set { State["InputType"] = value; }
get { return this.Retrieve(x => x.InputType, () => "SelectList"); }
set { this.Store(x => x.InputType, value); }
}
public int? QueryId {
get { return State.Get("QueryId").ToInt32(); }
set { State["QueryId"] = value.ToString(); }
get { return this.Retrieve(x => x.QueryId); }
set { this.Store(x => x.QueryId, value); }
}
public string OptionLabel {
get { return State.Get("OptionLabel"); }
set { State["OptionLabel"] = value; }
get { return this.Retrieve(x => x.OptionLabel); }
set { this.Store(x => x.OptionLabel, value); }
}
public string TextExpression {
get { return State.Get("TextExpression", "{Content.Title}"); }
get { return this.Retrieve(x => x.TextExpression, () => "{Content.Title}"); }
}
public string ValueExpression {
get { return State.Get("ValueExpression", "{Content.Id}"); }
get { return this.Retrieve(x => x.ValueExpression, () => "{Content.Id}"); }
}
}
}

View File

@@ -1,4 +1,7 @@
namespace Orchard.DynamicForms.Elements {
public class RadioButton : LabeledFormElement {
public override string ToolboxIcon {
get { return "\uf192"; }
}
}
}

View File

@@ -3,7 +3,7 @@
namespace Orchard.DynamicForms.Elements {
public class ReCaptcha : FormElement {
public ReCaptchaValidationSettings ValidationSettings {
get { return State.GetModel<ReCaptchaValidationSettings>(""); }
get { return Data.GetModel<ReCaptchaValidationSettings>(""); }
}
}
}

View File

@@ -4,33 +4,33 @@ namespace Orchard.DynamicForms.Elements {
public class Taxonomy : LabeledFormElement {
public string InputType {
get { return State.Get("InputType", "SelectList"); }
set { State["InputType"] = value; }
get { return this.Retrieve(x => x.InputType, ()=> "SelectList"); }
set { this.Store(x => x.InputType, value); }
}
public int? TaxonomyId {
get { return State.Get("TaxonomyId").ToInt32(); }
set { State["TaxonomyId"] = value.ToString(); }
get { return this.Retrieve(x => x.TaxonomyId); }
set { this.Store(x => x.TaxonomyId, value); }
}
public string SortOrder {
get { return State.Get("SortOrder"); }
set { State["SortOrder"] = value; }
get { return this.Retrieve(x => x.SortOrder); }
set { this.Store(x => x.SortOrder, value); }
}
public string OptionLabel {
get { return State.Get("OptionLabel"); }
set { State["OptionLabel"] = value; }
get { return this.Retrieve(x => x.OptionLabel); }
set { this.Store(x => x.OptionLabel, value); }
}
public string TextExpression {
get { return State.Get("TextExpression"); }
set { State["TextExpression"] = value; }
get { return this.Retrieve(x => x.TextExpression); }
set { this.Store(x => x.TextExpression, value); }
}
public string ValueExpression {
get { return State.Get("ValueExpression"); }
set { State["ValueExpression"] = value; }
get { return this.Retrieve(x => x.ValueExpression); }
set { this.Store(x => x.ValueExpression, value); }
}
}
}

View File

@@ -4,17 +4,17 @@ using Orchard.Layouts.Helpers;
namespace Orchard.DynamicForms.Elements {
public class TextArea : LabeledFormElement {
public int? Rows {
get { return State.Get("Rows").ToInt32(); }
set { State["Rows"] = value.ToString(); }
get { return this.Retrieve(x => x.Rows); }
set { this.Store(x => x.Rows, value); }
}
public int? Columns {
get { return State.Get("Columns").ToInt32(); }
set { State["Columns"] = value.ToString(); }
get { return this.Retrieve(x => x.Columns); }
set { this.Store(x => x.Columns, value); }
}
public TextAreaValidationSettings ValidationSettings {
get { return State.GetModel<TextAreaValidationSettings>(""); }
get { return Data.GetModel<TextAreaValidationSettings>(""); }
}
}
}

View File

@@ -3,7 +3,7 @@
namespace Orchard.DynamicForms.Elements {
public class TextField : LabeledFormElement {
public TextFieldValidationSettings ValidationSettings {
get { return State.GetModel<TextFieldValidationSettings>(""); }
get { return Data.GetModel<TextFieldValidationSettings>(""); }
}
}
}

View File

@@ -1,13 +1,15 @@
using Orchard.Layouts.Framework.Elements;
using Orchard.Layouts.Helpers;
namespace Orchard.DynamicForms.Elements {
public class ValidationMessage : Element {
public override string Category {
get { return "Form"; }
get { return "Forms"; }
}
public override bool HasEditor {
get { return true; }
public string For {
get { return this.Retrieve(x => x.For); }
set { this.Store(x => x.For, value); }
}
}
}

View File

@@ -3,7 +3,7 @@
namespace Orchard.DynamicForms.Elements {
public class ValidationSummary : Element {
public override string Category {
get { return "Form"; }
get { return "Forms"; }
}
public override bool HasEditor {

View File

@@ -0,0 +1,22 @@
using Orchard.DisplayManagement.Descriptors;
using Orchard.Environment;
using Orchard.UI.Resources;
namespace Orchard.DynamicForms.Handlers {
public class LayoutEditorShapeEventHandler : IShapeTableProvider {
private readonly Work<IResourceManager> _resourceManager;
public LayoutEditorShapeEventHandler(Work<IResourceManager> resourceManager) {
_resourceManager = resourceManager;
}
public void Discover(ShapeTableBuilder builder) {
builder.Describe("EditorTemplate").OnDisplaying(context => {
if (context.Shape.TemplateName != "Parts.Layout")
return;
_resourceManager.Value.Require("stylesheet", "DynamicForms.FormElements");
_resourceManager.Value.Require("script", "DynamicForms.FormElements");
});
}
}
}

View File

@@ -23,7 +23,7 @@ namespace Orchard.DynamicForms {
.WithSetting("AutorouteSettings.PatternDefinitions", "[{\"Name\":\"Title\",\"Pattern\":\"{Content.Slug}\",\"Description\":\"my-form\"}]")
.WithSetting("AutorouteSettings.DefaultPatternIndex", "0"))
.WithPart("LayoutPart", p => p
.WithSetting("LayoutTypePartSettings.DefaultLayoutState",
.WithSetting("LayoutTypePartSettings.DefaultLayoutData",
"{" +
"\"elements\": [{" +
"\"typeName\": \"Orchard.DynamicForms.Elements.Form\"," +
@@ -44,7 +44,7 @@ namespace Orchard.DynamicForms {
.WithSetting("DateEditorSettings.ShowDateEditor", "false"))
.WithPart("WidgetPart")
.WithPart("LayoutPart", p => p
.WithSetting("LayoutTypePartSettings.DefaultLayoutState",
.WithSetting("LayoutTypePartSettings.DefaultLayoutData",
"{" +
"\"elements\": [{" +
"\"typeName\": \"Orchard.DynamicForms.Elements.Form\"," +

View File

@@ -10,7 +10,7 @@ Features:
Name: Dynamic Forms
Description: Create custom forms like contact forms using layouts.
Category: Forms
Dependencies: Orchard.Layouts, Orchard.Scripting.CSharp, Orchard.Tokens, Orchard.Workflows, Orchard.Users, Orchard.AuditTrail, Common
Dependencies: Orchard.Layouts, Orchard.Scripting.CSharp, Orchard.Tokens, Orchard.Workflows, Orchard.Users, Orchard.AuditTrail, Orchard.Fields, Common
Orchard.DynamicForms.AntiSpam:
Name: Anti-Spam Elements
Description: Provides anti-spam elements to protect your content from malicious submissions.

View File

@@ -48,6 +48,10 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\lib\newtonsoft.json\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.ComponentModel.DataAnnotations">
@@ -74,14 +78,25 @@
<Reference Include="System.Xml.Linq" />
</ItemGroup>
<ItemGroup>
<Content Include="Scripts\jquery.validate.js" />
<Content Include="Scripts\jquery.validate.min.js" />
<Content Include="Scripts\jquery.validate.unobtrusive.additional.js" />
<Content Include="Scripts\jquery.validate.unobtrusive.js" />
<Content Include="Scripts\jquery.validate.unobtrusive.min.js" />
<Content Include="Styles\form-elements.css" />
<Content Include="Scripts\Forms.js">
<DependentUpon>Forms.js.bundle</DependentUpon>
</Content>
<Content Include="Scripts\Forms.min.js">
<DependentUpon>Forms.js</DependentUpon>
</Content>
<Content Include="Scripts\Layouts\Directives\Form.js" />
<Content Include="Scripts\Layouts\Models\Form.js" />
<Content Include="Scripts\Lib\jquery.validate.js" />
<Content Include="Scripts\Lib\jquery.validate.min.js">
<DependentUpon>jquery.validate.js</DependentUpon>
</Content>
<Content Include="Scripts\Lib\jquery.validate.unobtrusive.additional.js" />
<Content Include="Scripts\Lib\jquery.validate.unobtrusive.js" />
<Content Include="Scripts\Lib\jquery.validate.unobtrusive.min.js">
<DependentUpon>jquery.validate.unobtrusive.js</DependentUpon>
</Content>
<Content Include="Styles\forms.css" />
<Content Include="Styles\forms-admin.css" />
<Content Include="Styles\form.designer.css" />
<Content Include="Styles\menu.dynamicforms-admin.css" />
<Content Include="Styles\menu.dynamicforms.png" />
<Content Include="Web.config" />
@@ -107,6 +122,10 @@
<Project>{3dd574cd-9c5d-4a45-85e1-ebba64c22b5f}</Project>
<Name>Orchard.AuditTrail</Name>
</ProjectReference>
<ProjectReference Include="..\Orchard.Fields\Orchard.Fields.csproj">
<Project>{3787dde5-e5c8-4841-bda7-dcb325388064}</Project>
<Name>Orchard.Fields</Name>
</ProjectReference>
<ProjectReference Include="..\Orchard.Forms\Orchard.Forms.csproj">
<Project>{642a49d7-8752-4177-80d6-bfbbcfad3de0}</Project>
<Name>Orchard.Forms</Name>
@@ -145,6 +164,10 @@
<Compile Include="Activities\AddModelErrorActivity.cs" />
<Compile Include="Activities\DynamicFormValidatingActivity.cs" />
<Compile Include="Activities\DynamicFormSubmittedActivity.cs" />
<Compile Include="Bindings\BooleanFieldBindings.cs" />
<Compile Include="Bindings\EnumerationFieldBindings.cs" />
<Compile Include="Bindings\InputFieldBindings.cs" />
<Compile Include="Bindings\TaxonomyFieldBindings.cs" />
<Compile Include="Forms\AddModelErrorForm.cs" />
<Compile Include="Forms\SelectDynamicForms.cs" />
<Compile Include="Bindings\TextFieldBindings.cs" />
@@ -153,12 +176,12 @@
<Compile Include="Controllers\SubmissionAdminController.cs" />
<Compile Include="Controllers\AdminController.cs" />
<Compile Include="Controllers\FormController.cs" />
<Compile Include="Drivers\EmailFieldDriver.cs" />
<Compile Include="Drivers\PasswordFieldDriver.cs" />
<Compile Include="Drivers\QueryDriver.cs" />
<Compile Include="Drivers\ReCaptchaDriver.cs" />
<Compile Include="Drivers\ValidationMessageDriver.cs" />
<Compile Include="Drivers\ValidationSummaryDriver.cs" />
<Compile Include="Drivers\EmailFieldElementDriver.cs" />
<Compile Include="Drivers\PasswordFieldElementDriver.cs" />
<Compile Include="Drivers\QueryElementDriver.cs" />
<Compile Include="Drivers\ReCaptchaElementDriver.cs" />
<Compile Include="Drivers\ValidationMessageElementDriver.cs" />
<Compile Include="Drivers\ValidationSummaryElementDriver.cs" />
<Compile Include="Elements\EmailField.cs" />
<Compile Include="Elements\PasswordField.cs" />
<Compile Include="Elements\Query.cs" />
@@ -167,7 +190,10 @@
<Compile Include="Elements\ValidationSummary.cs" />
<Compile Include="Forms\DynamicFormValidatingForm.cs" />
<Compile Include="Handlers\ClientValidationRegistrationCoordinator.cs" />
<Compile Include="Handlers\LayoutEditorShapeEventHandler.cs" />
<Compile Include="Handlers\WorkflowValidatorCoordinator.cs" />
<Compile Include="ResourceManifest.cs" />
<Compile Include="Services\FormModelMap.cs" />
<Compile Include="Services\Models\FormSubmissionTokenContext.cs" />
<Compile Include="Handlers\ValidatorsCoordinator.cs" />
<Compile Include="Handlers\FormSubmissionCoordinator.cs" />
@@ -203,13 +229,13 @@
<Compile Include="Services\Models\FormEventContext.cs" />
<Compile Include="Drivers\ValidationElementDriver.cs" />
<Compile Include="Drivers\BindingsElementDriver.cs" />
<Compile Include="Drivers\TaxonomyDriver.cs" />
<Compile Include="Drivers\HiddenFieldDriver.cs" />
<Compile Include="Drivers\CheckboxDriver.cs" />
<Compile Include="Drivers\TextAreaDriver.cs" />
<Compile Include="Drivers\RadioButtonDriver.cs" />
<Compile Include="Drivers\EnumerationDriver.cs" />
<Compile Include="Drivers\UserNameFieldDriver.cs" />
<Compile Include="Drivers\TaxonomyElementDriver.cs" />
<Compile Include="Drivers\HiddenFieldElementDriver.cs" />
<Compile Include="Drivers\CheckboxElementDriver.cs" />
<Compile Include="Drivers\TextAreaElementDriver.cs" />
<Compile Include="Drivers\RadioButtonElementDriver.cs" />
<Compile Include="Drivers\EnumerationElementDriver.cs" />
<Compile Include="Drivers\UserNameFieldElementDriver.cs" />
<Compile Include="Elements\LabeledFormElement.cs" />
<Compile Include="Elements\Taxonomy.cs" />
<Compile Include="Elements\HiddenField.cs" />
@@ -257,9 +283,9 @@
<Compile Include="Helpers\SubmissionExtensions.cs" />
<Compile Include="ViewModels\FormsIndexViewModel.cs" />
<Compile Include="Drivers\CommonFormElementDriver.cs" />
<Compile Include="Drivers\FormDriver.cs" />
<Compile Include="Drivers\ButtonDriver.cs" />
<Compile Include="Drivers\IpAddressFieldDriver.cs" />
<Compile Include="Drivers\FormElementDriver.cs" />
<Compile Include="Drivers\ButtonElementDriver.cs" />
<Compile Include="Drivers\IpAddressFieldElementDriver.cs" />
<Compile Include="Elements\IpAddressField.cs" />
<Compile Include="Handlers\IpAddressFieldHandler.cs" />
<Compile Include="AdminMenu.cs" />
@@ -272,8 +298,8 @@
<Compile Include="Services\FormService.cs" />
<Compile Include="Services\IFormElementEventHandler.cs" />
<Compile Include="Services\IFormService.cs" />
<Compile Include="Drivers\LabelDriver.cs" />
<Compile Include="Drivers\TextFieldDriver.cs" />
<Compile Include="Drivers\LabelElementDriver.cs" />
<Compile Include="Drivers\TextFieldElementDriver.cs" />
<Compile Include="Elements\FormCategoryProvider.cs" />
<Compile Include="Elements\FormElement.cs" />
<Compile Include="Elements\Form.cs" />
@@ -286,28 +312,25 @@
<Content Include="Views\SubmissionAdmin\Index.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-TextField.cshtml" />
<Content Include="Views\Elements\TextField.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form.Design.cshtml" />
<Content Include="Views\Elements\Button.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-Button.cshtml" />
<Content Include="Views\Elements\Form.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form.cshtml" />
<Content Include="Views\Elements\Label.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-Label.cshtml" />
<Content Include="Views\Elements\TextField.Design.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-TextField.Design.cshtml" />
<Content Include="Views\Elements\IpAddressField.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-IpAddressField.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-IpAddressField.Design.cshtml" />
<Content Include="Views\Elements\IpAddressField.Design.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Admin\Index.cshtml" />
@@ -319,58 +342,58 @@
<Content Include="Views\EditorTemplates\FormBindings.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-UserNameField.cshtml" />
<Content Include="Views\Elements\UserNameField.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-UserNameField.Design.cshtml" />
<Content Include="Views\Elements\UserNameField.Design.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-HiddenField.Design.cshtml" />
<Content Include="Views\Elements\HiddenField.Design.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-HiddenField.cshtml" />
<Content Include="Views\Elements\HiddenField.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-TextArea.cshtml" />
<Content Include="Views\Elements\TextArea.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-TextArea.Design.cshtml" />
<Content Include="Views\Elements\TextArea.Design.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-RadioButton.cshtml" />
<Content Include="Views\Elements\RadioButton.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-RadioButton.Design.cshtml" />
<Content Include="Views\Elements\RadioButton.Design.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-Checkbox.Design.cshtml" />
<Content Include="Views\Elements\Checkbox.Design.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-Checkbox.cshtml" />
<Content Include="Views\Elements\Checkbox.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-Enumeration-SelectList.cshtml" />
<Content Include="Views\Elements\Enumeration-SelectList.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-Enumeration-MultiSelectList.cshtml" />
<Content Include="Views\Elements\Enumeration-MultiSelectList.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-Enumeration-RadioList.cshtml" />
<Content Include="Views\Elements\Enumeration-RadioList.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-Enumeration-CheckList.cshtml" />
<Content Include="Views\Elements\Enumeration-CheckList.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-Taxonomy-SelectList.cshtml" />
<Content Include="Views\Elements\Taxonomy-SelectList.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-Taxonomy-RadioList.cshtml" />
<Content Include="Views\Elements\Taxonomy-RadioList.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-Taxonomy-MultiSelectList.cshtml" />
<Content Include="Views\Elements\Taxonomy-MultiSelectList.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-Taxonomy-CheckList.cshtml" />
<Content Include="Views\Elements\Taxonomy-CheckList.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Activity-DynamicFormSubmitted.cshtml" />
@@ -379,49 +402,70 @@
<Content Include="Views\BlueprintAdmin\Index.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-ValidationSummary.cshtml" />
<Content Include="Views\Elements\ValidationSummary.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-ValidationSummary.Design.cshtml" />
<Content Include="Views\Elements\ValidationSummary.Design.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-ValidationMessage.cshtml" />
<Content Include="Views\Elements\ValidationMessage.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-ValidationMessage.Design.cshtml" />
<Content Include="Views\Elements\ValidationMessage.Design.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\FormElement.Wrapper.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-PasswordField.Design.cshtml" />
<Content Include="Views\Elements\PasswordField.Design.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-PasswordField.cshtml" />
<Content Include="Views\Elements\PasswordField.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-Query-SelectList.cshtml" />
<Content Include="Views\Elements\Query-SelectList.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-Query-CheckList.cshtml" />
<Content Include="Views\Elements\Query-CheckList.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-Query-MultiSelectList.cshtml" />
<Content Include="Views\Elements\Query-MultiSelectList.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-Query-RadioList.cshtml" />
<Content Include="Views\Elements\Query-RadioList.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-EmailField.Design.cshtml" />
<Content Include="Views\Elements\EmailField.Design.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-EmailField.cshtml" />
<Content Include="Views\Elements\EmailField.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-ReCaptcha.cshtml" />
<Content Include="Views\Elements\ReCaptcha.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Element-Form-ReCaptcha.Design.cshtml" />
<Content Include="Views\Elements\ReCaptcha.Design.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Scripts\Lib\jquery.validate.min.js.map">
<DependentUpon>jquery.validate.min.js</DependentUpon>
</Content>
</ItemGroup>
<ItemGroup>
<Content Include="Scripts\Lib\jquery.validate.unobtrusive.min.js.map">
<DependentUpon>jquery.validate.unobtrusive.min.js</DependentUpon>
</Content>
</ItemGroup>
<ItemGroup>
<Content Include="Scripts\Forms.js.bundle" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\LayoutEditor.Template.Form.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Scripts\Forms.min.js.map">
<DependentUpon>Forms.min.js</DependentUpon>
</Content>
</ItemGroup>
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>

View File

@@ -0,0 +1,11 @@
using Orchard.UI.Resources;
namespace Orchard.DynamicForms {
public class ResourceManifest : IResourceManifestProvider {
public void BuildManifests(ResourceManifestBuilder builder) {
var manifest = builder.Add();
manifest.DefineStyle("DynamicForms.FormElements").SetUrl("forms-admin.css");
manifest.DefineScript("DynamicForms.FormElements").SetUrl("Forms.min.js", "Forms.js").SetDependencies("Layouts.LayoutEditor");
}
}
}

View File

@@ -0,0 +1,96 @@
angular
.module("LayoutEditor")
.directive("orcLayoutForm", function ($compile, scopeConfigurator, environment) {
return {
restrict: "E",
scope: { element: "=" },
controller: function ($scope, $element) {
scopeConfigurator.configureForElement($scope, $element);
scopeConfigurator.configureForContainer($scope, $element);
$scope.sortableOptions["axis"] = "y";
$scope.edit = function () {
$scope.$root.editElement($scope.element).then(function (args) {
if (args.cancel)
return;
$scope.element.data = decodeURIComponent(args.element.data);
$scope.element.name = args.elementEditorModel.name;
$scope.$apply();
});
};
},
templateUrl: environment.templateUrl("Form"),
replace: true
};
});
var LayoutEditor;
(function ($, LayoutEditor) {
LayoutEditor.Form = function (data, htmlId, htmlClass, htmlStyle, isTemplated, name, formBindingContentType, contentType, contentTypeLabel, contentTypeClass, hasEditor, children) {
LayoutEditor.Element.call(this, "Form", data, htmlId, htmlClass, htmlStyle, isTemplated);
LayoutEditor.Container.call(this, ["Grid", "Content"], children);
var self = this;
this.isContainable = true;
this.dropTargetClass = "layout-common-holder";
this.contentType = contentType;
this.contentTypeLabel = contentTypeLabel;
this.contentTypeClass = contentTypeClass;
this.name = name || "Untitled";
this.formBindingContentType = formBindingContentType;
this.hasEditor = hasEditor;
this.toObject = function () {
var result = this.elementToObject();
result.name = this.name;
result.formBindingContentType = formBindingContentType;
result.children = this.childrenToObject();
return result;
};
var getEditorObject = this.getEditorObject;
this.getEditorObject = function() {
var dto = getEditorObject();
return $.extend(dto, {
FormName: this.name,
FormBindingContentType: this.formBindingContentType
});
}
this.setChildren = function (children) {
this.children = children;
_(this.children).each(function (child) {
child.parent = self;
var getEditorObject = child.getEditorObject;
child.getEditorObject = function () {
var dto = getEditorObject();
return $.extend(dto, {
FormBindingContentType: self.formBindingContentType
});
};
});
};
this.setChildren(children);
};
LayoutEditor.Form.from = function (value) {
return new LayoutEditor.Form(
value.data,
value.htmlId,
value.htmlClass,
value.htmlStyle,
value.isTemplated,
value.name,
value.formBindingContentType,
value.contentType,
value.contentTypeLabel,
value.contentTypeClass,
value.hasEditor,
LayoutEditor.childrenFrom(value.children));
};
LayoutEditor.registerFactory("Form", function(value) { return LayoutEditor.Form.from(value); });
})(jQuery, LayoutEditor || (LayoutEditor = {}));

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<bundle xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://vswebessentials.com/schemas/v1/bundle.xsd">
<settings>
<!--Determines if the bundle file should be automatically optimized after creation/update.-->
<minify>true</minify>
<!--Determine whether to generate/re-generate this bundle on building the solution.-->
<runOnBuild>false</runOnBuild>
<!--Specifies a custom subfolder to save files to. By default, compiled output will be placed in the same folder and nested under the original file.-->
<outputDirectory />
</settings>
<!--The order of the <file> elements determines the order of the files in the bundle.-->
<files>
<file>/Scripts/Layouts/Directives/Form.js</file>
<file>/Scripts/Layouts/Models/Form.js</file>
</files>
</bundle>

View File

@@ -0,0 +1 @@
angular.module("LayoutEditor").directive("orcLayoutForm",function(n,t,i){return{restrict:"E",scope:{element:"="},controller:function(n,i){t.configureForElement(n,i);t.configureForContainer(n,i);n.sortableOptions.axis="y";n.edit=function(){n.$root.editElement(n.element).then(function(t){t.cancel||(n.element.data=decodeURIComponent(t.element.data),n.element.name=t.elementEditorModel.name,n.$apply())})}},templateUrl:i.templateUrl("Form"),replace:!0}});var LayoutEditor;(function(n,t){t.Form=function(i,r,u,f,e,o,s,h,c,l,a,v){var y,p;t.Element.call(this,"Form",i,r,u,f,e);t.Container.call(this,["Grid","Content"],v);y=this;this.isContainable=!0;this.dropTargetClass="layout-common-holder";this.contentType=h;this.contentTypeLabel=c;this.contentTypeClass=l;this.name=o||"Untitled";this.formBindingContentType=s;this.hasEditor=a;this.toObject=function(){var n=this.elementToObject();return n.name=this.name,n.formBindingContentType=s,n.children=this.childrenToObject(),n};p=this.getEditorObject;this.getEditorObject=function(){var t=p();return n.extend(t,{FormName:this.name,FormBindingContentType:this.formBindingContentType})};this.setChildren=function(t){this.children=t;_(this.children).each(function(t){t.parent=y;var i=t.getEditorObject;t.getEditorObject=function(){var t=i();return n.extend(t,{FormBindingContentType:y.formBindingContentType})}})};this.setChildren(v)};t.Form.from=function(n){return new t.Form(n.data,n.htmlId,n.htmlClass,n.htmlStyle,n.isTemplated,n.name,n.formBindingContentType,n.contentType,n.contentTypeLabel,n.contentTypeClass,n.hasEditor,t.childrenFrom(n.children))};t.registerFactory("Form",function(n){return t.Form.from(n)})})(jQuery,LayoutEditor||(LayoutEditor={}));

View File

@@ -0,0 +1,8 @@
{
"version":3,
"file":"Form.min.js",
"lineCount":1,
"mappings":"AAAAA,OACIC,OAAO,CAAC,cAAD,CACPC,UAAU,CAAC,eAAe,CAAE,QAAS,CAACC,CAAQ,CAAEC,CAAiB,CAAEC,CAA9B,CAA2C,CAC5E,MAAO,CACH,QAAQ,CAAE,GAAG,CACb,KAAK,CAAE,CAAE,OAAO,CAAE,GAAX,CAAgB,CACvB,UAAU,CAAEC,QAAS,CAACC,CAAM,CAAEC,CAAT,CAAmB,CACpCJ,CAAiBK,oBAAoB,CAACF,CAAM,CAAEC,CAAT,CAAkB,CACvDJ,CAAiBM,sBAAsB,CAACH,CAAM,CAAEC,CAAT,CAAkB,CACzDD,CAAMI,gBAAiBC,KAAQ,CAAE,GAAG,CACpCL,CAAMM,KAAM,CAAEC,QAAS,CAAA,CAAG,CACtBP,CAAMQ,MAAMC,YAAY,CAACT,CAAMU,QAAP,CAAgBC,KAAK,CAAC,QAAS,CAACC,CAAD,CAAO,CACtDA,CAAIC,O,GAERb,CAAMU,QAAQI,KAAM,CAAEC,kBAAkB,CAACH,CAAIF,QAAQI,KAAb,CAAmB,CAC3Dd,CAAMU,QAAQM,KAAM,CAAEJ,CAAIK,mBAAmBD,KAAK,CAClDhB,CAAMkB,OAAO,CAAA,EAL6C,CAAjB,CADvB,CAJU,CAavC,CACD,WAAW,CAAEpB,CAAWqB,YAAY,CAAC,MAAD,CAAQ,CAC5C,OAAO,CAAE,CAAA,CAlBN,CADqE,CAAtE,CAqBR,CCvBN,IAAIC,YAAY,EACf,QAAS,CAACC,CAAC,CAAED,CAAJ,CAAkB,CAExBA,CAAYE,KAAM,CAAEC,QAAS,CAACT,CAAI,CAAEU,CAAM,CAAEC,CAAS,CAAEC,CAAS,CAAEC,CAAW,CAAEX,CAAI,CAAEY,CAAsB,CAAEC,CAAW,CAAEC,CAAgB,CAAEC,CAAgB,CAAEC,CAAS,CAAEC,CAA5I,CAAsJ,CAI/K,IAAIC,EAmBAC,CAnBW,CAHff,CAAYgB,QAAQC,KAAK,CAAC,IAAI,CAAE,MAAM,CAAEvB,CAAI,CAAEU,CAAM,CAAEC,CAAS,CAAEC,CAAS,CAAEC,CAAnD,CAA+D,CACxFP,CAAYkB,UAAUD,KAAK,CAAC,IAAI,CAAE,CAAC,MAAM,CAAE,SAAT,CAAmB,CAAEJ,CAA5B,CAAqC,CAE5DC,CAAK,CAAE,I,CACX,IAAIK,cAAe,CAAE,CAAA,CAAI,CACzB,IAAIC,gBAAiB,CAAE,sBAAsB,CAC7C,IAAIX,YAAa,CAAEA,CAAW,CAC9B,IAAIC,iBAAkB,CAAEA,CAAgB,CACxC,IAAIC,iBAAkB,CAAEA,CAAgB,CACxC,IAAIf,KAAM,CAAEA,CAAK,EAAG,UAAU,CAC9B,IAAIY,uBAAwB,CAAEA,CAAsB,CACpD,IAAII,UAAW,CAAEA,CAAS,CAE1B,IAAIS,SAAU,CAAEC,QAAS,CAAA,CAAG,CACxB,IAAIC,EAAS,IAAIC,gBAAgB,CAAA,CAAE,CAKnC,OAJAD,CAAM3B,KAAM,CAAE,IAAIA,KAAK,CACvB2B,CAAMf,uBAAwB,CAAEA,CAAsB,CACtDe,CAAMV,SAAU,CAAE,IAAIY,iBAAiB,CAAA,CAAE,CAElCF,CANiB,CAO3B,CAEGR,CAAgB,CAAE,IAAIA,gB,CAC1B,IAAIA,gBAAiB,CAAEW,QAAQ,CAAA,CAAG,CAC9B,IAAIC,EAAMZ,CAAe,CAAA,CAAE,CAC3B,OAAOd,CAAC2B,OAAO,CAACD,CAAG,CAAE,CACjB,QAAQ,CAAE,IAAI/B,KAAK,CACnB,sBAAsB,CAAE,IAAIY,uBAFX,CAAN,CAFe,C,CAQlC,IAAIqB,YAAa,CAAEC,QAAS,CAACjB,CAAD,CAAW,CACnC,IAAIA,SAAU,CAAEA,CAAQ,CACxBkB,CAAC,CAAC,IAAIlB,SAAL,CAAemB,KAAK,CAAC,QAAS,CAACC,CAAD,CAAQ,CACnCA,CAAKC,OAAQ,CAAEpB,CAAI,CAEnB,IAAIC,EAAkBkB,CAAKlB,gBAAgB,CAC3CkB,CAAKlB,gBAAiB,CAAEoB,QAAS,CAAA,CAAG,CAChC,IAAIR,EAAMZ,CAAe,CAAA,CAAE,CAC3B,OAAOd,CAAC2B,OAAO,CAACD,CAAG,CAAE,CACjB,sBAAsB,CAAEb,CAAIN,uBADX,CAAN,CAFiB,CAJD,CAAlB,CAFc,CAatC,CAED,IAAIqB,YAAY,CAAChB,CAAD,CA/C+J,CAgDlL,CAEDb,CAAYE,KAAKkC,KAAM,CAAEC,QAAS,CAACC,CAAD,CAAQ,CACtC,OAAO,IAAItC,CAAYE,KAAK,CACxBoC,CAAK5C,KAAK,CACV4C,CAAKlC,OAAO,CACZkC,CAAKjC,UAAU,CACfiC,CAAKhC,UAAU,CACfgC,CAAK/B,YAAY,CACjB+B,CAAK1C,KAAK,CACV0C,CAAK9B,uBAAuB,CAC5B8B,CAAK7B,YAAY,CACjB6B,CAAK5B,iBAAiB,CACtB4B,CAAK3B,iBAAiB,CACtB2B,CAAK1B,UAAU,CACfZ,CAAYuC,aAAa,CAACD,CAAKzB,SAAN,CAZD,CADU,CAczC,CAEDb,CAAYwC,gBAAgB,CAAC,MAAM,CAAE,QAAQ,CAACF,CAAD,CAAQ,CAAE,OAAOtC,CAAYE,KAAKkC,KAAK,CAACE,CAAD,CAA/B,CAAzB,CApEJ,EAsE1B,CAACG,MAAM,CAAEzC,YAAa,EAAG,CAACA,YAAa,CAAE,CAAA,CAAhB,CAAzB,CAA6C",
"sources":["/Scripts/Layouts/Directives/Form.js","/Scripts/Layouts/Models/Form.js"],
"names":["angular","module","directive","$compile","scopeConfigurator","environment","controller","$scope","$element","configureForElement","configureForContainer","sortableOptions","axis","edit","$scope.edit","$root","editElement","element","then","args","cancel","data","decodeURIComponent","name","elementEditorModel","$apply","templateUrl","LayoutEditor","$","Form","LayoutEditor.Form","htmlId","htmlClass","htmlStyle","isTemplated","formBindingContentType","contentType","contentTypeLabel","contentTypeClass","hasEditor","children","self","getEditorObject","Element","call","Container","isContainable","dropTargetClass","toObject",".toObject","result","elementToObject","childrenToObject",".getEditorObject","dto","extend","setChildren",".setChildren","_","each","child","parent","child.getEditorObject","from","LayoutEditor.Form.from","value","childrenFrom","registerFactory","jQuery"]
}

View File

@@ -0,0 +1,24 @@
angular
.module("LayoutEditor")
.directive("orcLayoutForm", function ($compile, scopeConfigurator, environment) {
return {
restrict: "E",
scope: { element: "=" },
controller: function ($scope, $element) {
scopeConfigurator.configureForElement($scope, $element);
scopeConfigurator.configureForContainer($scope, $element);
$scope.sortableOptions["axis"] = "y";
$scope.edit = function () {
$scope.$root.editElement($scope.element).then(function (args) {
if (args.cancel)
return;
$scope.element.data = decodeURIComponent(args.element.data);
$scope.element.name = args.elementEditorModel.name;
$scope.$apply();
});
};
},
templateUrl: environment.templateUrl("Form"),
replace: true
};
});

View File

@@ -0,0 +1,72 @@
var LayoutEditor;
(function ($, LayoutEditor) {
LayoutEditor.Form = function (data, htmlId, htmlClass, htmlStyle, isTemplated, name, formBindingContentType, contentType, contentTypeLabel, contentTypeClass, hasEditor, children) {
LayoutEditor.Element.call(this, "Form", data, htmlId, htmlClass, htmlStyle, isTemplated);
LayoutEditor.Container.call(this, ["Grid", "Content"], children);
var self = this;
this.isContainable = true;
this.dropTargetClass = "layout-common-holder";
this.contentType = contentType;
this.contentTypeLabel = contentTypeLabel;
this.contentTypeClass = contentTypeClass;
this.name = name || "Untitled";
this.formBindingContentType = formBindingContentType;
this.hasEditor = hasEditor;
this.toObject = function () {
var result = this.elementToObject();
result.name = this.name;
result.formBindingContentType = formBindingContentType;
result.children = this.childrenToObject();
return result;
};
var getEditorObject = this.getEditorObject;
this.getEditorObject = function() {
var dto = getEditorObject();
return $.extend(dto, {
FormName: this.name,
FormBindingContentType: this.formBindingContentType
});
}
this.setChildren = function (children) {
this.children = children;
_(this.children).each(function (child) {
child.parent = self;
var getEditorObject = child.getEditorObject;
child.getEditorObject = function () {
var dto = getEditorObject();
return $.extend(dto, {
FormBindingContentType: self.formBindingContentType
});
};
});
};
this.setChildren(children);
};
LayoutEditor.Form.from = function (value) {
return new LayoutEditor.Form(
value.data,
value.htmlId,
value.htmlClass,
value.htmlStyle,
value.isTemplated,
value.name,
value.formBindingContentType,
value.contentType,
value.contentTypeLabel,
value.contentTypeClass,
value.hasEditor,
LayoutEditor.childrenFrom(value.children));
};
LayoutEditor.registerFactory("Form", function(value) { return LayoutEditor.Form.from(value); });
})(jQuery, LayoutEditor || (LayoutEditor = {}));

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,25 @@
using System;
using Newtonsoft.Json.Linq;
using Orchard.DynamicForms.Elements;
using Orchard.Layouts.Services;
using Orchard.Utility.Extensions;
namespace Orchard.DynamicForms.Services {
public class FormModelMap : LayoutModelMapBase<Form> {
protected override void ToElement(Form element, JToken node) {
base.ToElement(element, node);
element.Name = (string)node["name"];
element.ContentType = (string)node["formBindingContentType"];
}
public override void FromElement(Form element, DescribeElementsContext describeContext, JToken node) {
base.FromElement(element, describeContext, node);
node["name"] = element.Name;
node["formBindingContentType"] = element.ContentType;
node["hasEditor"] = element.HasEditor;
node["contentType"] = element.Descriptor.TypeName;
node["contentTypeLabel"] = element.Descriptor.DisplayText.Text;
node["contentTypeClass"] = String.Format(element.DisplayText.Text.HtmlClassify());
}
}
}

View File

@@ -15,7 +15,6 @@ using Orchard.DynamicForms.Helpers;
using Orchard.DynamicForms.Models;
using Orchard.DynamicForms.Services.Models;
using Orchard.DynamicForms.ViewModels;
using Orchard.Layouts.Framework.Serialization;
using Orchard.Layouts.Helpers;
using Orchard.Layouts.Models;
using Orchard.Layouts.Services;
@@ -65,7 +64,7 @@ namespace Orchard.DynamicForms.Services {
}
public Form FindForm(LayoutPart layoutPart, string formName = null) {
var elements = _serializer.Deserialize(layoutPart.LayoutState, new DescribeElementsContext { Content = layoutPart });
var elements = _serializer.Deserialize(layoutPart.LayoutData, new DescribeElementsContext { Content = layoutPart });
var forms = elements.Flatten().Where(x => x is Form).Cast<Form>();
return String.IsNullOrWhiteSpace(formName) ? forms.FirstOrDefault() : forms.FirstOrDefault(x => x.Name == formName);
}
@@ -255,7 +254,7 @@ namespace Orchard.DynamicForms.Services {
ReadElementValues(element, context);
var value = context.Output[element.Name];
var bindingSettings = element.State.GetModel<FormBindingSettings>(null);
var bindingSettings = element.Data.GetModel<FormBindingSettings>(null);
if (bindingSettings != null) {
foreach (var partBindingSettings in bindingSettings.Parts) {
@@ -320,7 +319,7 @@ namespace Orchard.DynamicForms.Services {
foreach (var binding in partBindingSettings.Bindings.Where(x => x.Enabled)) {
var localBinding = binding;
foreach (var partBinding in partBindings.Where(x => x.Name == localBinding.Name)) {
partBinding.Setter.DynamicInvoke(part, value);
partBinding.Setter.DynamicInvoke(contentItem, part, value);
}
}
}
@@ -358,7 +357,7 @@ namespace Orchard.DynamicForms.Services {
foreach (var binding in fieldBindingSettings.Bindings.Where(x => x.Enabled)) {
var localBinding = binding;
foreach (var fieldBinding in fieldBindings.Where(x => x.Name == localBinding.Name)) {
fieldBinding.Setter.DynamicInvoke(field, value);
fieldBinding.Setter.DynamicInvoke(contentItem, field, value);
}
}
}

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using Orchard.ContentManagement;
namespace Orchard.DynamicForms.Services.Models {
public abstract class BindingContext {
@@ -20,7 +21,7 @@ namespace Orchard.DynamicForms.Services.Models {
public BindingContext() : base(typeof(T).Name) {
}
public BindingContext<T> Binding(string name, Action<T, string> setter) {
public BindingContext<T> Binding(string name, Action<ContentItem, T, string> setter) {
_bindings.Add(new BindingDescriptor<T> {
Name = name,

View File

@@ -1,46 +0,0 @@
.layout-editor .canvas .x-form {
background: none repeat scroll 0 0 #fafafa;
border: 1px solid #bdbcbc;
margin: 0 0 0.3em;
padding: 4.3em 0.4em 2.5em 0.4em;
position: relative;
}
.layout-editor .canvas .x-form .form-toolbar {
padding: 0 0.5em 0 0.5em;
height: 27px;
}
.layout-editor .canvas .x-form .drag-handle {
background: none repeat scroll 0 0 #e4e4e4;
cursor: move;
left: -1px;
position: absolute;
right: -1px;
top: -1px;
z-index: 25;
border: 1px solid #bdbcbc;
height: 27px;
}
.layout-editor .canvas .x-form .drag-handle .name {
line-height: 1.5em;
}
.layout-editor .canvas .x-row .x-column .x-form .x-holder,
.layout-editor .canvas .x-form .x-holder {
min-height: 5em;
border: none;
}
.layout-editor .hidden-field {
background: #e5e5e5;
padding: 0.5em;
-ms-opacity: .5;
opacity: .5;
}
input.text.design,
textarea.text.design {
width: 99%;
}

View File

@@ -1,18 +1,12 @@
.dynamic-forms tbody.forms td:last-child,
.dynamic-forms-submissions tbody.submissions td:last-child {
text-align: right;
.layout-editor .layout-content > .layout-element-wrapper .layout-content-markup > .validation-message,
.layout-editor .layout-content > .layout-element-wrapper .layout-content-markup > .validation-summary {
border: 1px dashed #ccc;
padding: 0.2em;
background: #e8e8e8;
}
.bindings table thead th.property-type,
.bindings table tbody td.property-type {
width: 300px;
text-align: right;
}
th.validator-name {
width: 20%;
}
th.validator-settings {
width: 80%;
.layout-editor .layout-content > .layout-element-wrapper .layout-content-markup > .form-field-element input[type="text"],
.layout-editor .layout-content > .layout-element-wrapper .layout-content-markup > .form-field-element input[type="password"],
.layout-editor .layout-content > .layout-element-wrapper .layout-content-markup > .form-field-element textarea {
width: 100%;
}

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using Orchard.DynamicForms.Services.Models;
@@ -9,5 +10,32 @@ namespace Orchard.DynamicForms.ViewModels {
public IEnumerable<ContentPartBindingDescriptor> AvailableBindings { get; set; }
public IList<PartBindingSettings> Parts { get; set; }
public void Store(IDictionary<string, string> data) {
for (var partIndex = 0; partIndex < Parts.Count; partIndex++) {
var part = Parts[partIndex];
data[String.Format("FormBindingSettings.Parts[{0}].Name", partIndex)] = part.Name;
for (var partBindingIndex = 0; partBindingIndex < part.Bindings.Count; partBindingIndex++) {
var partBinding = part.Bindings[partBindingIndex];
data[String.Format("FormBindingSettings.Parts[{0}].Bindings[{1}].Name", partIndex, partBindingIndex)] = partBinding.Name;
data[String.Format("FormBindingSettings.Parts[{0}].Bindings[{1}].Enabled", partIndex, partBindingIndex)] = partBinding.Enabled.ToString();
}
for (var fieldIndex = 0; fieldIndex < part.Fields.Count; fieldIndex++) {
var field = part.Fields[fieldIndex];
data[String.Format("FormBindingSettings.Parts[{0}].Fields[{1}].Name", partIndex, fieldIndex)] = field.Name;
for (var fieldBindingIndex = 0; fieldBindingIndex < field.Bindings.Count; fieldBindingIndex++) {
var fieldBinding = field.Bindings[fieldBindingIndex];
data[String.Format("FormBindingSettings.Parts[{0}].Fields[{1}].Bindings[{2}].Name", partIndex, fieldIndex, fieldBindingIndex)] = fieldBinding.Name;
data[String.Format("FormBindingSettings.Parts[{0}].Fields[{1}].Bindings[{2}].Enabled", partIndex, fieldIndex, fieldBindingIndex)] = fieldBinding.Enabled.ToString();
}
}
}
}
}
}

View File

@@ -20,21 +20,24 @@
</tr>
</thead>
<tbody>
@foreach (var partBinding in partDescriptor.BindingContexts.SelectMany(x => x.Bindings)) {
@if (partDescriptor.BindingContexts.Any()) {
foreach (var partBinding in partDescriptor.BindingContexts.SelectMany(x => x.Bindings)) {
var partBindingId = String.Format("binding-{0}-{1}", partDescriptor.Part.PartDefinition.Name.HtmlClassify(), partBinding.Name.HtmlClassify());
var partBindingState = partState.Bindings.ElementAtOrDefault(partBindingIndex) ?? new BindingSettings();
<tr>
<td colspan="2">
<input type="hidden" name="Parts[@partIndex].Bindings[@partBindingIndex].Name" value="@partBinding.Name" />
<input type="checkbox" id="@partBindingId" name="Parts[@partIndex].Bindings[@partBindingIndex].Enabled" value="@Boolean.TrueString" @if (partBindingState.Enabled) { <text> checked="checked" </text> } />
<input type="checkbox" id="@partBindingId" name="Parts[@partIndex].Bindings[@partBindingIndex].Enabled" value="@Boolean.TrueString" @if (partBindingState.Enabled) {<text> checked="checked" </text>} />
<label class="forcheckbox" for="@partBindingId">@partBinding.Name</label>
</td>
</tr>
partBindingIndex++;
partBindingIndex++;
}
}
@foreach (var fieldDescriptor in partDescriptor.FieldBindings) {
var fieldBindingIndex = 0;
var fieldState = partState.Fields.ElementAtOrDefault(fieldIndex) ?? new FieldBindingSettings();
if (fieldDescriptor.BindingContexts.Any()) {
foreach (var fieldBinding in fieldDescriptor.BindingContexts.SelectMany(x => x.Bindings)) {
var fieldBindingId = String.Format("binding-{0}-{1}-{2}", partDescriptor.Part.PartDefinition.Name.HtmlClassify(), fieldDescriptor.Field.Name.HtmlClassify(), fieldBinding.Name.HtmlClassify());
var fieldBindingstate = fieldState.Bindings.ElementAtOrDefault(fieldBindingIndex) ?? new BindingSettings();
@@ -49,10 +52,11 @@ partBindingIndex++;
@fieldDescriptor.Field.FieldDefinition.Name
</td>
</tr>
fieldBindingIndex++;
fieldBindingIndex++;
}
fieldIndex++;
}
}
</tbody>
</table>
partIndex++;

View File

@@ -1,4 +0,0 @@
@{
var forFieldName = (string) Model.ValidationMessageFor;
}
<div class="hidden-field">@T("Validation message for {0}", forFieldName)</div>

View File

@@ -1,6 +0,0 @@
@using Orchard.Layouts.Helpers
@{
var forFieldName = (string) Model.ValidationMessageFor;
var commonAttributes = (IDictionary<string, object>) TagBuilderExtensions.GetCommonElementAttributes(Model);
}
@Html.ValidationMessage(forFieldName, commonAttributes)

View File

@@ -1 +0,0 @@
<div class="hidden-field">@T("Validation summary")</div>

View File

@@ -1,29 +0,0 @@
@using Orchard.DynamicForms.Elements
@using Orchard.Utility.Extensions
@{
Style.Include("form.designer.css");
}
@{
var element = (Form)Model.Element;
var isTemplated = element.IsTemplated;
var formTitle = !String.IsNullOrWhiteSpace(element.Name) ? element.Name.CamelFriendly() : T("Form").Text;
}
<div class="x-form x-element x-container x-container-widget @if (isTemplated) {<text>templated</text>}" data-element="@Model.ElementJson">
@if (!isTemplated) {
<div class="drag-handle">
<div class="toolbar form-toolbar group">
<div class="pull-left">
<a class="edit icon-cog" href="#" title="@T("Edit form properties")"></a>
<a class="remove icon-trash" href="#" title="@T("Remove form")"></a>
</div>
<div class="pull-right">
<span class="name">@formTitle</span>
</div>
</div>
</div>
}
<div class="element container x-holder drop-target">
@DisplayChildren(Model)
</div>
<a href="#" class="add" title="@T("Add Element")"></a>
</div>

View File

@@ -1,10 +1,8 @@
@using Orchard.DisplayManagement.Shapes
@using Orchard.DynamicForms.Elements
@using Orchard.Layouts.Helpers
@using Orchard.Layouts.Settings
@{
var element = (EmailField)Model.Element;
var commonSettings = element.State.GetModel<CommonElementSettings>();
var tagBuilder = (OrchardTagBuilder)TagBuilderExtensions.AddCommonElementAttributes(new OrchardTagBuilder("input"), Model);
tagBuilder.AddCssClass("text design");
@@ -15,7 +13,7 @@
@if (element.ShowLabel) {
<div>
<label for="@commonSettings.Id">@element.Label</label>
<label for="@element.HtmlId">@element.Label</label>
@Html.Raw(tagBuilder.ToString(TagRenderMode.SelfClosing))
</div>
}

View File

@@ -1,10 +1,8 @@
@using Orchard.DisplayManagement.Shapes
@using Orchard.DynamicForms.Elements
@using Orchard.Layouts.Helpers
@using Orchard.Layouts.Settings
@{
var element = (EmailField)Model.Element;
var commonSettings = element.State.GetModel<CommonElementSettings>();
var tagBuilder = (OrchardTagBuilder)TagBuilderExtensions.AddCommonElementAttributes(new OrchardTagBuilder("input"), Model);
tagBuilder.AddCssClass("text");
@@ -19,7 +17,7 @@
}
@if (element.ShowLabel) {
<label for="@commonSettings.Id">@element.Label</label>
<label for="@element.HtmlId">@element.Label</label>
}
@Html.Raw(tagBuilder.ToString(TagRenderMode.SelfClosing))
@if (element.ValidationSettings.ShowValidationMessage == true) {

View File

@@ -1,14 +1,12 @@
@using Orchard.DynamicForms.Elements
@using Orchard.Layouts.Helpers
@using Orchard.Layouts.Settings
@{
var element = (Enumeration)Model.Element;
var commonSettings = element.State.GetModel<CommonElementSettings>();
var attributes = (IDictionary<string, object>)TagBuilderExtensions.GetCommonElementAttributes(Model);
var name = String.IsNullOrWhiteSpace(element.Name) ? "MultiSelectList1" : element.Name;
var options = (IEnumerable<SelectListItem>)Model.TokenizedOptions;
}
@if (element.ShowLabel) {
<label for="@commonSettings.Id">@Html.Raw(element.Label)</label>
<label for="@element.HtmlId">@Html.Raw(element.Label)</label>
}
@Html.ListBox(name, options, attributes)

View File

@@ -1,14 +1,12 @@
@using Orchard.DynamicForms.Elements
@using Orchard.Layouts.Helpers
@using Orchard.Layouts.Settings
@{
var element = (Enumeration)Model.Element;
var commonSettings = element.State.GetModel<CommonElementSettings>();
var attributes = (IDictionary<string, object>)TagBuilderExtensions.GetCommonElementAttributes(Model);
var name = String.IsNullOrWhiteSpace(element.Name) ? "SelectList1" : element.Name;
var options = (IEnumerable<SelectListItem>)Model.TokenizedOptions;
}
@if (element.ShowLabel) {
<label for="@commonSettings.Id">@Html.Raw(element.Label)</label>
<label for="@element.HtmlId">@Html.Raw(element.Label)</label>
}
@Html.DropDownList(name, options, attributes)

View File

@@ -3,7 +3,7 @@
@using Orchard.DynamicForms.Elements
@using Orchard.Layouts.Helpers
@{
Style.Include("form-elements.css");
Style.Include("forms.css");
}
@{
var contentItem = (ContentItem) Model.ContentItem;
@@ -17,9 +17,9 @@
if (element.EnableClientValidation == true) {
Script.Require("jQuery").AtFoot();
Script.Include("jquery.validate.js", "jquery.validate.min.js").AtFoot();
Script.Include("jquery.validate.unobtrusive.js", "jquery.validate.unobtrusive.min.js").AtFoot();
Script.Include("jquery.validate.unobtrusive.additional.js").AtFoot();
Script.Include("lib/jquery.validate.js", "lib/jquery.validate.min.js").AtFoot();
Script.Include("lib/jquery.validate.unobtrusive.js", "lib/jquery.validate.unobtrusive.min.js").AtFoot();
Script.Include("lib/jquery.validate.unobtrusive.additional.js").AtFoot();
Html.EnableUnobtrusiveJavaScript();
Html.EnableClientValidation();

Some files were not shown because too many files have changed in this diff Show More