Merged 1.9.x into dev.

This commit is contained in:
Daniel Stolt
2015-06-20 23:30:49 +03:00
23 changed files with 926 additions and 546 deletions

View File

@@ -0,0 +1,45 @@
using System.Collections.Generic;
using System.Linq;
using Orchard.Layouts.Elements;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.ViewModels;
using Orchard.Services;
namespace Orchard.Layouts.Drivers {
public class HeadingElementDriver : ElementDriver<Heading> {
private readonly IEnumerable<IHtmlFilter> _htmlFilters;
public HeadingElementDriver(IEnumerable<IHtmlFilter> htmlFilters) {
_htmlFilters = htmlFilters;
}
protected override EditorResult OnBuildEditor(Heading element, ElementEditorContext context) {
var viewModel = new HeadingEditorViewModel {
Text = element.Content,
Level = element.Level
};
var editor = context.ShapeFactory.EditorTemplate(TemplateName: "Elements.Heading", Model: viewModel);
if (context.Updater != null) {
context.Updater.TryUpdateModel(viewModel, context.Prefix, null, null);
element.Content = viewModel.Text;
element.Level = viewModel.Level;
}
return Editor(context, editor);
}
protected override void OnDisplaying(Heading element, ElementDisplayContext context) {
var text = element.Content;
var flavor = "html";
var processedText = ApplyHtmlFilters(text, flavor);
context.ElementShape.ProcessedText = processedText;
context.ElementShape.Level = element.Level;
}
private string ApplyHtmlFilters(string content, string flavor) {
return _htmlFilters.Aggregate(content, (t, filter) => filter.ProcessContent(t, flavor));
}
}
}

View File

@@ -8,11 +8,6 @@ using Orchard.Services;
namespace Orchard.Layouts.Drivers {
public class ParagraphElementDriver : ElementDriver<Paragraph> {
private readonly IEnumerable<IHtmlFilter> _htmlFilters;
public ParagraphElementDriver(IEnumerable<IHtmlFilter> htmlFilters) {
_htmlFilters = htmlFilters;
}
protected override EditorResult OnBuildEditor(Paragraph element, ElementEditorContext context) {
var viewModel = new ParagraphEditorViewModel {
Text = element.Content
@@ -26,17 +21,5 @@ namespace Orchard.Layouts.Drivers {
return Editor(context, editor);
}
protected override void OnDisplaying(Paragraph element, ElementDisplayingContext context) {
var text = element.Content;
var flavor = "html";
var processedText = ApplyHtmlFilters(text, flavor);
context.ElementShape.ProcessedText = processedText;
}
private string ApplyHtmlFilters(string content, string flavor) {
return _htmlFilters.Aggregate(content, (t, filter) => filter.ProcessContent(t, flavor));
}
}
}

View File

@@ -0,0 +1,24 @@
using Orchard.Layouts.Helpers;
using Orchard.Localization;
namespace Orchard.Layouts.Elements {
public class Heading : ContentElement {
public override string Category {
get { return "Content"; }
}
public override LocalizedString DisplayText {
get { return T("Heading h1-h6"); }
}
public override string ToolboxIcon {
get { return "\uf1dc"; }
}
public int Level {
get { return this.Retrieve(h => h.Level); }
set { this.Store(h => h.Level, value);}
}
}
}

View File

@@ -320,6 +320,7 @@
<Compile Include="Drivers\CanvasElementDriver.cs" />
<Compile Include="Drivers\MenuElementDriver.cs" />
<Compile Include="Drivers\NotificationsElementDriver.cs" />
<Compile Include="Drivers\HeadingElementDriver.cs" />
<Compile Include="Drivers\ShapeElementDriver.cs" />
<Compile Include="Drivers\BreakElementDriver.cs" />
<Compile Include="Elements\Breadcrumbs.cs" />
@@ -327,6 +328,7 @@
<Compile Include="Elements\ContentElement.cs" />
<Compile Include="Elements\Menu.cs" />
<Compile Include="Elements\Notifications.cs" />
<Compile Include="Elements\Heading.cs" />
<Compile Include="Elements\Shape.cs" />
<Compile Include="Elements\Break.cs" />
<Compile Include="Elements\UIElement.cs" />
@@ -427,6 +429,7 @@
<Compile Include="ViewModels\LayoutEditor.cs" />
<Compile Include="ViewModels\LayoutEditorPropertiesViewModel.cs" />
<Compile Include="ViewModels\MenuEditorViewModel.cs" />
<Compile Include="ViewModels\HeadingEditorViewModel.cs" />
<Compile Include="ViewModels\VectorImageEditorViewModel.cs" />
<Compile Include="ViewModels\ImageEditorViewModel.cs" />
<Compile Include="ViewModels\MarkdownEditorViewModel.cs" />
@@ -568,6 +571,12 @@
<Content Include="Views\Elements\Notifications.cshtml" />
<Content Include="Views\Elements\Notifications.Design.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Elements\Heading.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\EditorTemplates\Elements.Heading.cshtml" />
</ItemGroup>
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -114,8 +114,16 @@
};
$(document).on("cut copy paste", function (e) {
// The real clipboard is supported, so disable the peudo clipboard.
clipboard.disable();
// If the pseudo clipboard was already invoked (which happens on the first clipboard
// operation after page load even if native clipboard support exists) then sit this
// one operation out, but make sure whatever is on the pseudo clipboard gets migrated
// to the native clipboard for subsequent operations.
if (clipboard.wasInvoked()) {
e.originalEvent.clipboardData.setData("text/plain", clipboard.getData("text/plain"));
e.originalEvent.clipboardData.setData("text/json", clipboard.getData("text/json"));
e.preventDefault();
}
else {
var focusedElement = $scope.element.focusedElement;
if (!!focusedElement) {
$scope.$apply(function () {
@@ -142,6 +150,10 @@
e.preventDefault();
}
}
// Native clipboard support obviously exists, so disable the peudo clipboard from now on.
clipboard.disable();
});
}
],

View File

@@ -3,17 +3,29 @@
var Clipboard = function () {
var self = this;
this.clipboardData = {};
this.setData = function(contentType, data, realClipBoard) {
self.clipboardData[contentType] = data;
};
this.getData = function (contentType, realClipBoard) {
return self.clipboardData[contentType];
};
this._clipboardData = {};
this._isDisabled = false;
this._wasInvoked = false;
this.disable = function() {
this.disabled = true;
this.setData = function(contentType, data) {
self._clipboardData[contentType] = data;
self._wasInvoked = true;
};
this.getData = function (contentType) {
return self._clipboardData[contentType];
self._wasInvoked = true;
};
this.disable = function() {
self._isDisabled = true;
self._wasInvoked = false;
self._clipboardData = {};
};
this.isDisabled = function () {
return self._isDisabled;
}
this.wasInvoked = function () {
return self._wasInvoked;
}
}
LayoutEditor.Clipboard = new Clipboard();
@@ -25,7 +37,9 @@
return {
setData: LayoutEditor.Clipboard.setData,
getData: LayoutEditor.Clipboard.getData,
disable: LayoutEditor.Clipboard.disable
disable: LayoutEditor.Clipboard.disable,
isDisabled: LayoutEditor.Clipboard.isDisabled,
wasInvoked: LayoutEditor.Clipboard.wasInvoked
};
}
]);

View File

@@ -15,12 +15,11 @@
var resetFocus = false;
var element = $scope.element;
if (element.editor.isDragging || element.editor.inlineEditingIsActive)
return;
// If the "real" clipboard works, then the pseudo-clipboard will have been disabled.
if (!clipboard.disabled) {
// If native clipboard support exists, the pseudo-clipboard will have been disabled.
if (!clipboard.isDisabled()) {
var focusedElement = element.editor.focusedElement;
if (!!focusedElement) {
// Pseudo clipboard handling for browsers not allowing real clipboard operations.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -167,7 +167,6 @@
this.copy = function (clipboardData) {
var text = this.getInnerText();
clipboardData.setData("text/plain", text);
console.log(text);
var data = this.toObject();
var json = JSON.stringify(data, null, "\t");

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,8 @@
@import "Variables.less";
@import "Reset.less";
.layout-editor {
.layout-content {
.layout-content, .layout-html {
min-height: 1em;
> .layout-element-wrapper {
@@ -12,7 +13,7 @@
line-height: normal;
// Reset to HTML5 W3C standard default styling within content.
@import "Reset.less";
.reset();
> *:first-child {
margin-top: 0 !important; // Important because site.css of the admin theme styles heading margins with a very high specificity.

View File

@@ -1,4 +1,6 @@
* {
.reset() {
* {
margin: 0;
padding: 0;
box-sizing: content-box;
@@ -229,12 +231,10 @@ dir, dl, ol, ul {
dd {
margin-left: 40px;
}
/* LTR-specific: use 'margin-right' for rtl elements */
dir, ol, ul {
padding-left: 40px;
}
/* LTR-specific: use 'padding-right' for rtl elements */
ol {
list-style-type: decimal;
@@ -333,7 +333,6 @@ table, td, th {
thead, tbody, tfoot, tr {
border-color: inherit;
}
/*table[rules=none i], table[rules=groups i], table[rules=rows i],
table[rules=cols i], table[rules=all i], table[frame=void i],
table[frame=above i], table[frame=below i], table[frame=hsides i],
@@ -361,7 +360,6 @@ table[rules=cols i] > tfoot > tr > td, table[rules=cols i] > tfoot > tr > th,
table[rules=all i] > tfoot > tr > td, table[rules=all i] > tfoot > tr > th {
border-color: black;
}*/
input, select, option, optgroup, button, textarea, keygen {
text-indent: initial;
}
@@ -397,3 +395,4 @@ legend {
padding-left: 2px;
padding-right: 2px;
}
}

View File

@@ -17,6 +17,8 @@
&.sticky-top {
position: fixed;
top: 0;
max-height: 100%;
overflow-y: auto;
}
&.sticky-bottom {

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,6 @@
namespace Orchard.Layouts.ViewModels {
public class HeadingEditorViewModel {
public string Text { get; set; }
public int Level { get; set; }
}
}

View File

@@ -0,0 +1,20 @@
@model Orchard.Layouts.ViewModels.HeadingEditorViewModel
@{
Script.Include("AutoFocus.js");
}
<fieldset>
<legend>@T("Level")</legend>
<ul>
@for (var i = 1; i <= 6; i++) {
<li>
@Html.RadioButtonFor(m => m.Level, i, new {id = "h" + i})
<label for="@("h" + i)" class="forcheckbox">@T("&lt;h{0}/&gt;", i)</label>
</li>
}
</ul>
</fieldset>
<fieldset class="autofocus">
@Html.LabelFor(m => m.Text, T("Text"))
@Html.TextBoxFor(m => m.Text, new { @class = "text large tokenized", autofocus = "autofocus" })
@Html.Hint(T("Note: HTML markup will be rendered unencoded."))
</fieldset>

View File

@@ -0,0 +1,6 @@
@using Orchard.Layouts.Helpers
@{
var tagBuilder = TagBuilderExtensions.CreateElementTagBuilder(Model, "h" + (Model.Level >= 1 && Model.Level <= 6 ? Model.Level : 1));
tagBuilder.InnerHtml = Model.ProcessedText;
}
@tagBuilder.ToHtmlString()

View File

@@ -1 +1 @@
@Html.Raw((string)Model.Element.Content)
<p>@Html.Raw((string)Model.Element.Content)</p>

View File

@@ -1,6 +1 @@
@using Orchard.Layouts.Helpers
@{
var tagBuilder = TagBuilderExtensions.CreateElementTagBuilder(Model, "p");
tagBuilder.InnerHtml = Model.ProcessedText;
}
@tagBuilder.ToHtmlString()
<p>@Html.Raw((string)Model.Element.Content)</p>