mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-04-05 21:01:35 +08:00

- Pushed the editElement function further down from Content to Element, which means even less code for custom container elements. - Fixed a bug where client-side element editor state would not be applied after editing that element. - Pushed down the toObject function from Content to Element, which means less code is necessary for custom container elements. -
1 line
15 KiB
JavaScript
1 line
15 KiB
JavaScript
var LayoutEditor;!function(t){Array.prototype.move=function(t,i){this.splice(i,0,this.splice(t,1)[0])},t.childrenFrom=function(i){return _(i).map(function(i){return t.elementFrom(i)})};var i=t.registerFactory=function(i,n){var e=t.factories=t.factories||{};e[i]=n};i("Canvas",function(i){return t.Canvas.from(i)}),i("Grid",function(i){return t.Grid.from(i)}),i("Row",function(i){return t.Row.from(i)}),i("Column",function(i){return t.Column.from(i)}),i("Content",function(i){return t.Content.from(i)}),t.elementFrom=function(i){var n=t.factories[i.type];if(!n)throw new Error('No element with type "'+i.type+'" was found.');var e=n(i);return e},t.setModel=function(t,i){$(t).scope().element=i},t.getModel=function(t){return $(t).scope().element}}(LayoutEditor||(LayoutEditor={}));var LayoutEditor;!function(t){t.Editor=function(i,n){this.config=i,this.canvas=t.Canvas.from(n),this.initialState=JSON.stringify(this.canvas.toObject()),this.activeElement=null,this.focusedElement=null,this.dropTargetElement=null,this.isDragging=!1,this.isResizing=!1,this.recycleBin=new t.RecycleBin,this.resetToolboxElements=function(){this.toolboxElements=[t.Row.from({children:[]})]},this.isDirty=function(){var t=JSON.stringify(this.canvas.toObject());return this.initialState!=t},this.resetToolboxElements(),this.canvas.setEditor(this)}}(LayoutEditor||(LayoutEditor={}));var LayoutEditor;!function(t){t.RecycleBin=function(){this.elements=[],this.add=function(t){this.elements.push(t)},this.toObject=function(){for(var t={type:"RecycleBin",children:[]},i=0;i<this.elements.length;i++){var n=this.elements[i],e=n.toObject();t.children.push(e)}return t}}}(LayoutEditor||(LayoutEditor={}));var LayoutEditor;!function(t){t.Element=function(t,i,n,e,o,s,h){if(!t)throw new Error("Parameter 'type' is required.");var r=this;this.type=t,this.data=i,this.htmlId=n,this.htmlClass=e,this.htmlStyle=o,this.isTemplated=s,this.rule=h,this.templateStyles={},this.editor=null,this.parent=null,this.setIsFocusedEventHandlers=[],this.setEditor=function(t){this.editor=t,this.children&&_.isArray(this.children)&&_(this.children).each(function(i){i.setEditor(t)})},this.setParent=function(t){this.parent=t,this.parent.onChildAdded(this);for(var i=t;i;)i.onDescendantAdded(this,t),i=i.parent},this.setIsTemplated=function(t){this.isTemplated=t,this.children&&_.isArray(this.children)&&_(this.children).each(function(i){i.setIsTemplated(t)})},this.applyElementEditorModel=function(){},this.getIsActive=function(){return this.editor?this.editor.activeElement===this&&!this.getIsFocused():!1},this.setIsActive=function(t){this.editor&&(this.editor.isDragging||this.editor.isResizing||(t?this.editor.activeElement=this:this.editor.activeElement=this.parent))},this.getIsFocused=function(){return this.editor?this.editor.focusedElement===this:!1},this.setIsFocused=function(){this.editor&&(this.children||!this.isTemplated)&&(this.editor.isDragging||this.editor.isResizing||(this.editor.focusedElement=this,_(this.setIsFocusedEventHandlers).each(function(t){try{t()}catch(i){}})))},this.getIsSelected=function(){return this.getIsFocused()?!0:this.children&&_.isArray(this.children)?_(this.children).any(function(t){return t.getIsSelected()}):!1},this.getIsDropTarget=function(){return this.editor?this.editor.dropTargetElement===this:!1},this.setIsDropTarget=function(t){this.editor&&(t?this.editor.dropTargetElement=this:this.editor.dropTargetElement=null)},this.canDelete=function(){return this.isTemplated||!this.parent?!1:!0},this["delete"]=function(){this.canDelete()&&this.parent.deleteChild(this)},this.canMoveUp=function(){return this.isTemplated||!this.parent?!1:this.parent.canMoveChildUp(this)},this.moveUp=function(){this.canMoveUp()&&this.parent.moveChildUp(this)},this.canMoveDown=function(){return this.isTemplated||!this.parent?!1:this.parent.canMoveChildDown(this)},this.moveDown=function(){this.canMoveDown()&&this.parent.moveChildDown(this)},this.elementToObject=function(){return{type:this.type,data:this.data,htmlId:this.htmlId,htmlClass:this.htmlClass,htmlStyle:this.htmlStyle,isTemplated:this.isTemplated,rule:this.rule,contentType:this.contentType,hasEditor:this.hasEditor}},this.getEditorObject=function(){return{}},this.toObject=function(){return r.elementToObject()},this.copy=function(t){var i=this.getInnerText();t.setData("text/plain",i);var n=this.toObject(),e=JSON.stringify(n,null," ");t.setData("text/json",e)},this.cut=function(t){this.canDelete()&&(this.copy(t),this["delete"]())},this.paste=function(t){this.parent&&this.parent.paste(t)},this.getTemplateStyles=function(){var t=this.templateStyles||{},i="";for(var n in t)i+=n+":"+t[n]+";";return i}}}(LayoutEditor||(LayoutEditor={}));var LayoutEditor;!function(t){t.Container=function(i,n){this.allowedChildTypes=i,this.children=n,this.isContainer=!0,this.containerTemplateStyles={};var e=this;this.onChildAdded=function(t){},this.onDescendantAdded=function(t,i){},this.setChildren=function(t){this.children=t,_(this.children).each(function(t){t.setParent(e)})},this.setChildren(n),this.getIsSealed=function(){return _(this.children).any(function(t){return t.isTemplated})};var o=this.setIsFocused;this.setIsFocused=function(){this.getIsSealed()||o.call(this)},this.addChild=function(t){_(this.children).contains(t)||!_(this.allowedChildTypes).contains(t.type)&&!t.isContainable||this.children.push(t),t.setEditor(this.editor),t.setIsTemplated(!1),t.setParent(this)},this.deleteChild=function(t){var i=_(this.children).indexOf(t);i>=0&&(this.children.splice(i,1),this.editor.recycleBin.add(t),t.getIsActive()&&(this.editor.activeElement=null),t.getIsFocused()&&(this.children.length>i?this.children[i].setIsFocused():i>0?this.children[i-1].setIsFocused():this.setIsFocused()))},this.moveFocusPrevChild=function(t){if(!(this.children.length<2)){var i=_(this.children).indexOf(t);i>0&&this.children[i-1].setIsFocused()}},this.moveFocusNextChild=function(t){if(!(this.children.length<2)){var i=_(this.children).indexOf(t);i<this.children.length-1&&this.children[i+1].setIsFocused()}},this.insertChild=function(t,i){if(!_(this.children).contains(t)){var n=Math.max(_(this.children).indexOf(i),0);this.children.splice(n+1,0,t),t.setEditor(this.editor),t.parent=this}},this.moveChildUp=function(t){if(this.canMoveChildUp(t)){var i=_(this.children).indexOf(t);this.children.move(i,i-1)}},this.moveChildDown=function(t){if(this.canMoveChildDown(t)){var i=_(this.children).indexOf(t);this.children.move(i,i+1)}},this.canMoveChildUp=function(t){var i=_(this.children).indexOf(t);return i>0},this.canMoveChildDown=function(t){var i=_(this.children).indexOf(t);return i<this.children.length-1},this.childrenToObject=function(){return _(this.children).map(function(t){return t.toObject()})},this.getInnerText=function(){return _(this.children).reduce(function(t,i){return t+"\n"+i.getInnerText()},"")},this.paste=function(i){var n=i.getData("text/json");if(n){var e=JSON.parse(n),o=t.elementFrom(e);this.pasteChild(o)}},this.pasteChild=function(t){_(this.allowedChildTypes).contains(t.type)||t.isContainable?(this.addChild(t),t.setIsFocused()):this.parent&&this.parent.pasteChild(t)},this.getContainerTemplateStyles=function(){var t=this.containerTemplateStyles||{},i="";for(var n in t)i+=n+":"+t[n]+";";return i}}}(LayoutEditor||(LayoutEditor={}));var LayoutEditor;!function(t){t.Canvas=function(i,n,e,o,s,h,r){t.Element.call(this,"Canvas",i,n,e,o,s,h),t.Container.call(this,["Canvas","Grid","Content"],r),this.isContainable=!0,this.toObject=function(){var t=this.elementToObject();return t.children=this.childrenToObject(),t}},t.Canvas.from=function(i){var n=new t.Canvas(i.data,i.htmlId,i.htmlClass,i.htmlStyle,i.isTemplated,i.rule,t.childrenFrom(i.children));return n.toolboxIcon=i.toolboxIcon,n.toolboxLabel=i.toolboxLabel,n.toolboxDescription=i.toolboxDescription,n}}(LayoutEditor||(LayoutEditor={}));var LayoutEditor;!function(t){t.Grid=function(i,n,e,o,s,h,r){t.Element.call(this,"Grid",i,n,e,o,s,h),t.Container.call(this,["Row"],r),this.toObject=function(){var t=this.elementToObject();return t.children=this.childrenToObject(),t}},t.Grid.from=function(i){var n=new t.Grid(i.data,i.htmlId,i.htmlClass,i.htmlStyle,i.isTemplated,i.rule,t.childrenFrom(i.children));return n.toolboxIcon=i.toolboxIcon,n.toolboxLabel=i.toolboxLabel,n.toolboxDescription=i.toolboxDescription,n}}(LayoutEditor||(LayoutEditor={}));var LayoutEditor;!function(t){t.Row=function(n,e,o,s,h,r,l){function a(){return _(d.children).reduce(function(t,i){return t+i.offset+i.width},0)}function c(t){function n(t){return e>0?t.width<12:0>e?t.width>1:!1}if(0==t)return!0;var e=t;if(0>e){var o=12-a();e+=o,e>0&&(e=0)}for(;0>e&&_(d.children).any(function(t){return t.offset>0});)for(i=0;i<d.children.length&&0>e;i++){var s=d.children[i];s.offset>0&&(s.offset--,e++)}for(;0!=e&&_(d.children).any(n);)for(i=0;i<d.children.length&&0!=e;i++){var s=d.children[i%d.children.length];if(n(s)){var h=e/Math.abs(e);s.width+=h,e-=h}}return 0==e}t.Element.call(this,"Row",n,e,o,s,h,r),t.Container.call(this,["Column"],l);var d=this,u=!1;this.canAddColumn=function(){return this.children.length<12},this.beginAddColumn=function(t){if(u)throw new Error("Column add operation is already in progress.");return _(this.children).each(function(t){t.beginChange()}),c(-t)?(u=!0,!0):(_(this.children).each(function(t){t.rollbackChange()}),!1)},this.commitAddColumn=function(){if(!u)throw new Error("No column add operation in progress.");_(this.children).each(function(t){t.commitChange()}),u=!1},this.rollbackAddColumn=function(){if(!u)throw new Error("No column add operation in progress.");_(this.children).each(function(t){t.rollbackChange()}),u=!1};var f=this.deleteChild;this.deleteChild=function(t){var i=t.width;f.call(this,t),c(i)},this.canContractColumnRight=function(t,i){var n=_(this.children).indexOf(t);return n>=0?t.width>1:!1},this.contractColumnRight=function(t,i){if(this.canContractColumnRight(t,i)){var n=_(this.children).indexOf(t);if(n>=0&&t.width>1&&(t.width--,this.children.length>n+1)){var e=this.children[n+1];i&&0==e.offset?e.width++:e.offset++}}},this.canExpandColumnRight=function(t,i){var n=_(this.children).indexOf(t);if(n>=0){if(t.width>=12)return!1;if(this.children.length>n+1){var e=this.children[n+1];return i&&0==e.offset?e.width>1:e.offset>0}return a()<12}return!1},this.expandColumnRight=function(t,i){if(this.canExpandColumnRight(t,i)){var n=_(this.children).indexOf(t);if(n>=0){if(this.children.length>n+1){var e=this.children[n+1];i&&0==e.offset?e.width--:e.offset--}t.width++}}},this.canExpandColumnLeft=function(t,i){var n=_(this.children).indexOf(t);if(n>=0){if(t.width>=12)return!1;if(n>0){var e=this.children[n-1];if(i&&0==t.offset)return e.width>1}return t.offset>0}return!1},this.expandColumnLeft=function(t,i){if(this.canExpandColumnLeft(t,i)){var n=_(this.children).indexOf(t);if(n>=0){if(n>0){var e=this.children[n-1];i&&0==t.offset?e.width--:t.offset--}else t.offset--;t.width++}}},this.canContractColumnLeft=function(t,i){var n=_(this.children).indexOf(t);return n>=0?t.width>1:!1},this.contractColumnLeft=function(t,i){if(this.canContractColumnLeft(t,i)){var n=_(this.children).indexOf(t);if(n>=0){if(n>0){var e=this.children[n-1];i&&0==t.offset?e.width++:t.offset++}else t.offset++;t.width--}}},this.evenColumns=function(){if(0!=this.children.length){var t=Math.floor(12/this.children.length);_(this.children).each(function(i){i.width=t,i.offset=0});var i=12%this.children.length;i>0&&c(i)}};var m=this.pasteChild;this.pasteChild=function(t){"Column"==t.type?this.beginAddColumn(t.width)&&(this.commitAddColumn(),m.call(this,t)):this.parent&&this.parent.pasteChild(t)},this.toObject=function(){var t=this.elementToObject();return t.children=this.childrenToObject(),t}},t.Row.from=function(i){var n=new t.Row(i.data,i.htmlId,i.htmlClass,i.htmlStyle,i.isTemplated,i.rule,t.childrenFrom(i.children));return n.toolboxIcon=i.toolboxIcon,n.toolboxLabel=i.toolboxLabel,n.toolboxDescription=i.toolboxDescription,n}}(LayoutEditor||(LayoutEditor={}));var LayoutEditor;!function(t){t.Column=function(i,n,e,o,s,h,r,l,a,c){t.Element.call(this,"Column",i,n,e,o,s,a),t.Container.call(this,["Grid","Content"],c),this.width=h,this.offset=r,this.collapsible=l;var d=!1,u=0,f=0;this.beginChange=function(){if(d)throw new Error("Column already has a pending change.");d=!0,u=this.width,f=this.offset},this.commitChange=function(){if(!d)throw new Error("Column has no pending change.");u=0,f=0,d=!1},this.rollbackChange=function(){if(!d)throw new Error("Column has no pending change.");this.width=u,this.offset=f,u=0,f=0,d=!1},this.canSplit=function(){return this.isTemplated?!1:this.width>1},this.split=function(){if(this.canSplit()){var i=Math.floor(this.width/2),n=t.Column.from({data:null,htmlId:null,htmlClass:null,htmlStyle:null,width:i,offset:0,children:[]});this.width=this.width-i,this.parent.insertChild(n,this),n.setIsFocused()}},this.canContractRight=function(t){return this.isTemplated?!1:this.parent.canContractColumnRight(this,t)},this.contractRight=function(t){this.canContractRight(t)&&this.parent.contractColumnRight(this,t)},this.canExpandRight=function(t){return this.isTemplated?!1:this.parent.canExpandColumnRight(this,t)},this.expandRight=function(t){this.canExpandRight(t)&&this.parent.expandColumnRight(this,t)},this.canExpandLeft=function(t){return this.isTemplated?!1:this.parent.canExpandColumnLeft(this,t)},this.expandLeft=function(t){this.canExpandLeft(t)&&this.parent.expandColumnLeft(this,t)},this.canContractLeft=function(t){return this.isTemplated?!1:this.parent.canContractColumnLeft(this,t)},this.contractLeft=function(t){this.canContractLeft(t)&&this.parent.contractColumnLeft(this,t)},this.toObject=function(){var t=this.elementToObject();return t.width=this.width,t.offset=this.offset,t.collapsible=this.collapsible,t.children=this.childrenToObject(),t}},t.Column.from=function(i){var n=new t.Column(i.data,i.htmlId,i.htmlClass,i.htmlStyle,i.isTemplated,i.width,i.offset,i.collapsible,i.rule,t.childrenFrom(i.children));return n.toolboxIcon=i.toolboxIcon,n.toolboxLabel=i.toolboxLabel,n.toolboxDescription=i.toolboxDescription,n},t.Column.times=function(i){return _.times(i,function(n){return t.Column.from({data:null,htmlId:null,htmlClass:null,isTemplated:!1,width:12/i,offset:0,collapsible:null,children:[]})})}}(LayoutEditor||(LayoutEditor={}));var LayoutEditor;!function(t){t.Content=function(i,n,e,o,s,h,r,l,a,c,d){t.Element.call(this,"Content",i,n,e,o,s,d),this.contentType=h,this.contentTypeLabel=r,this.contentTypeClass=l,this.html=a,this.hasEditor=c,this.getInnerText=function(){return $($.parseHTML("<div>"+this.html+"</div>")).text()},this.setHtml=function(t){this.html=t,this.htmlUnsafe=t};var u=this.toObject;this.toObject=function(){var t=u();return t.contentTypeLabel=this.contentTypeLabel,t.contentTypeClass=this.contentTypeClass,t.html=this.html,t},this.setHtml(a)},t.Content.from=function(i){var n=new t.Content(i.data,i.htmlId,i.htmlClass,i.htmlStyle,i.isTemplated,i.contentType,i.contentTypeLabel,i.contentTypeClass,i.html,i.hasEditor,i.rule);return n}}(LayoutEditor||(LayoutEditor={})); |