Implemented Removing event.

This commit is contained in:
Sipke Schoorstra
2015-09-30 01:07:43 +01:00
parent 6a7452d68b
commit 39a6e10c76
28 changed files with 168 additions and 35 deletions
@@ -4,6 +4,7 @@ using Orchard.DynamicForms.Services;
using Orchard.DynamicForms.Services.Models;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Framework.Elements;
using Orchard.Layouts.Services;
namespace Orchard.DynamicForms.Handlers {
@@ -46,11 +47,12 @@ namespace Orchard.DynamicForms.Handlers {
}
void IElementEventHandler.CreatingDisplay(ElementCreatingDisplayShapeContext context) { }
void IElementEventHandler.Displayed(ElementDisplayedContext context) {}
void IElementEventHandler.Displayed(ElementDisplayedContext context) { }
void IFormElementEventHandler.GetElementValue(FormElement element, ReadElementValuesContext context) { }
void IElementEventHandler.Creating(ElementCreatingContext context) {}
void IElementEventHandler.Created(ElementCreatedContext context) {}
void IElementEventHandler.BuildEditor(ElementEditorContext context) {}
void IElementEventHandler.UpdateEditor(ElementEditorContext context) {}
void IElementEventHandler.Creating(ElementCreatingContext context) { }
void IElementEventHandler.Created(ElementCreatedContext context) { }
void IElementEventHandler.BuildEditor(ElementEditorContext context) { }
void IElementEventHandler.UpdateEditor(ElementEditorContext context) { }
void IElementEventHandler.Removing(ElementRemovingContext context) { }
}
}
@@ -53,6 +53,7 @@
"inputs": [
"Assets/JavaScript/Models/Helpers.js",
"Assets/JavaScript/Models/Editor.js",
"Assets/JavaScript/Models/RecycleBin.js",
"Assets/JavaScript/Models/Element.js",
"Assets/JavaScript/Models/Container.js",
"Assets/JavaScript/Models/Canvas.js",
@@ -39,6 +39,7 @@
var index = _(this.children).indexOf(child);
if (index >= 0) {
this.children.splice(index, 1);
this.editor.recycleBin.add(child);
if (child.getIsActive())
this.editor.activeElement = null;
if (child.getIsFocused()) {
@@ -10,6 +10,7 @@
this.dropTargetElement = null;
this.isDragging = false;
this.isResizing = false;
this.recycleBin = new LayoutEditor.RecycleBin();
this.resetToolboxElements = function () {
this.toolboxElements = [
@@ -0,0 +1,27 @@
var LayoutEditor;
(function (LayoutEditor) {
LayoutEditor.RecycleBin = function () {
this.elements = [];
this.add = function(element) {
this.elements.push(element);
};
this.toObject = function () {
var result = {
type: "RecycleBin",
children: []
};
for (var i = 0; i < this.elements.length; i++) {
var element = this.elements[i];
var dto = element.toObject();
result.children.push(dto);
}
return result;
};
};
})(LayoutEditor || (LayoutEditor = {}));
@@ -5,6 +5,7 @@ using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;
using Orchard.ContentManagement.Handlers;
using Orchard.DisplayManagement;
using Orchard.Layouts.Elements;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Framework.Elements;
@@ -103,12 +104,12 @@ namespace Orchard.Layouts.Drivers {
updater.TryUpdateModel(viewModel, Prefix, null, new[] { "Part", "Templates" });
var describeContext = new DescribeElementsContext { Content = part };
var elementInstances = _mapper.ToLayoutModel(viewModel.LayoutEditor.Data, describeContext).ToArray();
var removedElementInstances = _serializer.Deserialize(viewModel.LayoutEditor.Trash, describeContext).ToArray();
var recycleBin = (RecycleBin)_mapper.ToLayoutModel(viewModel.LayoutEditor.RecycleBin, describeContext).Single();
var context = new LayoutSavingContext {
Content = part,
Updater = updater,
Elements = elementInstances,
RemovedElements = removedElementInstances
RemovedElements = recycleBin.Elements
};
_elementManager.Saving(context);
@@ -0,0 +1,8 @@
using Orchard.Layouts.Framework.Elements;
namespace Orchard.Layouts.Elements {
public class RecycleBin : Container {
public override string Category { get { return null; } }
public override bool IsSystemElement { get { return true; } }
}
}
@@ -15,9 +15,10 @@ namespace Orchard.Layouts.Framework.Elements {
Category = category;
GetDrivers = Enumerable.Empty<IElementDriver>;
CreatingDisplay = context => { };
Displaying = context => {};
Displaying = context => { };
Editor = context => { };
UpdateEditor = context => { };
Removing = context => { };
StateBag = new Dictionary<string, object>();
}
@@ -33,6 +34,7 @@ namespace Orchard.Layouts.Framework.Elements {
public Action<ElementDisplayedContext> Displayed { get; set; }
public Action<ElementEditorContext> Editor { get; set; }
public Action<ElementEditorContext> UpdateEditor { get; set; }
public Action<ElementRemovingContext> Removing { get; set; }
public bool IsSystemElement { get; set; }
public bool EnableEditorDialog { get; set; }
public IDictionary<string, object> StateBag { get; set; }
@@ -79,6 +79,7 @@
<Reference Include="System.Xml.Linq" />
</ItemGroup>
<ItemGroup>
<Content Include="Assets\JavaScript\Models\RecycleBin.js" />
<Content Include="Default.html" />
<Content Include="Assets.json" />
<Content Include="Images\azure.png" />
@@ -370,6 +371,7 @@
<Compile Include="Helpers\StringHelper.cs" />
<Compile Include="Permissions.cs" />
<Compile Include="Providers\PlaceableContentElementHarvester.cs" />
<Compile Include="Elements\RecycleBin.cs" />
<Compile Include="ViewModels\PlaceableContentItemViewModel.cs" />
<Compile Include="Recipes\Builders\CustomElementsStep.cs" />
<Compile Include="Recipes\Executors\CustomElementsStep.cs" />
@@ -15,6 +15,7 @@ using Orchard.Layouts.Framework.Harvesters;
using Orchard.Layouts.Helpers;
using Orchard.Layouts.Settings;
using Orchard.Layouts.ViewModels;
using ContentItem = Orchard.ContentManagement.ContentItem;
namespace Orchard.Layouts.Providers {
public class PlaceableContentElementHarvester : Component, IElementHarvester {
@@ -38,6 +39,7 @@ namespace Orchard.Layouts.Providers {
UpdateEditor = UpdateEditor,
ToolboxIcon = "\uf1b2",
EnableEditorDialog = true,
Removing = RemoveContentItem,
StateBag = new Dictionary<string, object> {
{ "ContentTypeName", contentTypeDefinition.Name }
}
@@ -123,6 +125,15 @@ namespace Orchard.Layouts.Providers {
context.EditorResult.Add(editorWrapper);
}
private void RemoveContentItem(ElementRemovingContext context) {
var element = (PlaceableContentItem) context.Element;
var contentItemId = element.ContentItemId;
var contentItem = contentItemId != null ? _contentManager.Value.Get(contentItemId.Value, VersionOptions.Latest) : default(ContentItem);
if(contentItem != null)
_contentManager.Value.Remove(contentItem);
}
private IEnumerable<ContentTypeDefinition> GetPlaceableContentTypeDefinitions() {
var contentTypeDefinitionsQuery =
from contentTypeDefinition in _contentManager.Value.GetContentTypeDefinitions()
@@ -66,6 +66,11 @@
return JSON.stringify(layoutData, null, "\t");
};
var serializeRecycleBin = function () {
var recycleBinData = self.editor.recycleBin.toObject();
return JSON.stringify(recycleBinData, null, "\t");
};
var applyTemplate = function (templateId) {
var layoutData = serializeCanvas();
@@ -95,9 +100,12 @@
var serializeLayout = function () {
var layoutDataField = self.element.find(".layout-data-field");
var recycleBinDataField = self.element.find(".recycle-bin-data-field");
var layoutDataDataJson = serializeCanvas();
var recycleBinDataJson = serializeRecycleBin();
layoutDataField.val(layoutDataDataJson);
recycleBinDataField.val(recycleBinDataJson);
};
this.element.on("change", ".template-picker select", function (e) {
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
@@ -45,7 +45,7 @@ namespace Orchard.Layouts.Services {
element.HtmlClass = (string)node["htmlClass"];
element.HtmlStyle = (string)node["htmlStyle"];
element.IsTemplated = (bool)(node["isTemplated"] ?? false);
element.Rule = (string) node["rule"];
element.Rule = (string)node["rule"];
}
protected bool? ReadBoolean(JToken node) {
@@ -113,7 +113,7 @@ namespace Orchard.Layouts.Services {
element.HtmlClass = (string)node["htmlClass"];
element.HtmlStyle = (string)node["htmlStyle"];
element.IsTemplated = (bool)(node["isTemplated"] ?? false);
element.Rule = (string) node["rule"];
element.Rule = (string)node["rule"];
return element;
}
@@ -161,4 +161,19 @@ namespace Orchard.Layouts.Services {
return element;
}
}
public class RecycleBinModelMap : ILayoutModelMap {
public int Priority { get { return 0; } }
public string LayoutElementType { get { return "RecycleBin"; } }
public bool CanMap(Element element) {
return element.Type == "RecycleBin";
}
public Element ToElement(IElementManager elementManager, DescribeElementsContext describeContext, JToken node) {
return new RecycleBin();
}
public void FromElement(Element element, DescribeElementsContext describeContext, JToken node) {
}
}
}
@@ -1,14 +1,16 @@
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Framework.Elements;
namespace Orchard.Layouts.Services {
public abstract class ElementEventHandlerBase : Component, IElementEventHandler {
public virtual void Creating(ElementCreatingContext context) { }
public virtual void Created(ElementCreatedContext context) { }
public virtual void CreatingDisplay(ElementCreatingDisplayShapeContext context) {}
public virtual void CreatingDisplay(ElementCreatingDisplayShapeContext context) { }
public virtual void Displaying(ElementDisplayingContext context) { }
public virtual void Displayed(ElementDisplayedContext context) { }
public virtual void BuildEditor(ElementEditorContext context) { }
public virtual void UpdateEditor(ElementEditorContext context) { }
public virtual void Removing(ElementRemovingContext context) { }
}
}
@@ -147,7 +147,16 @@ namespace Orchard.Layouts.Services {
}
public void Removing(LayoutSavingContext context) {
var elementInstances = context.RemovedElements.Flatten();
var elementInstances = context.RemovedElements.Flatten().ToList();
InvokeElementAction(elementInstances, (elementInstance) => {
var elementContext = new ElementRemovingContext(context) {
Element = elementInstance
};
_elementEventHandler.Removing(elementContext);
elementInstance.Descriptor.Removing(elementContext);
});
InvokeDriver(elementInstances, (driver, elementInstance) => driver.Removing(new ElementRemovingContext(context) {
Element = elementInstance
}));
@@ -188,6 +197,12 @@ namespace Orchard.Layouts.Services {
return dictionary;
}
private void InvokeElementAction(IEnumerable<Element> elements, Action<Element> action) {
foreach (var element in elements) {
action(element);
}
}
private void InvokeDriver(IEnumerable<Element> elements, Action<IElementDriver, Element> driverAction) {
foreach (var element in elements) {
var drivers = GetDrivers(element.Descriptor);
@@ -1,6 +1,7 @@
using Orchard.Events;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Framework.Elements;
namespace Orchard.Layouts.Services {
public interface IElementEventHandler : IEventHandler {
@@ -11,5 +12,6 @@ namespace Orchard.Layouts.Services {
void Displayed(ElementDisplayedContext context);
void BuildEditor(ElementEditorContext context);
void UpdateEditor(ElementEditorContext context);
void Removing(ElementRemovingContext context);
}
}
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
@@ -7,7 +7,7 @@ namespace Orchard.Layouts.ViewModels {
public IContent Content { get; set; }
public string Data { get; set; }
public string ConfigurationData { get; set; }
public string Trash { get; set; }
public string RecycleBin { get; set; }
public int? TemplateId { get; set; }
public string SessionKey { get; set; }
public IList<LayoutPart> Templates { get; set; }
@@ -69,6 +69,7 @@
@Html.HiddenFor(m => m.SessionKey)
@Html.HiddenFor(m => m.Data, new { @class = "layout-data-field" })
@Html.HiddenFor(m => m.RecycleBin, new { @class = "recycle-bin-data-field" })
<div class="layout-editor-toolbar">
<ol class="layout-editor-toolbar-group">
<li>
@@ -1,8 +1,12 @@
@using Orchard.ContentManagement
@{
var contentItem = (ContentItem)Model.ContentItem;
var title = Html.ItemDisplayText(contentItem);
}
<div class="layout-placeholder">
@String.Format("{0} - {1}", title, contentItem.TypeDefinition.DisplayName)
@if (contentItem != null) {
@String.Format("{0} - {1}", Html.ItemDisplayText(contentItem), contentItem.TypeDefinition.DisplayName)
}
else {
@T("Content Item Not Found");
}
</div>