new static files.
Signed-off-by: rscnt <rascnt@gmail.com>
This commit is contained in:
		
					parent
					
						
							
								83e792bcaa
							
						
					
				
			
			
				commit
				
					
						fe4f6c97d5
					
				
			
		
					 778 changed files with 71557 additions and 0 deletions
				
			
		
							
								
								
									
										493
									
								
								static/cms/js/modules/cms.structureboard.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										493
									
								
								static/cms/js/modules/cms.structureboard.js
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,493 @@ | |||
| /*##################################################|*/ | ||||
| /* #CMS# */ | ||||
| (function($) { | ||||
| // CMS.$ will be passed for $
 | ||||
| $(document).ready(function () { | ||||
| 	/*! | ||||
| 	 * StructureBoard | ||||
| 	 * handles drag & drop, mode switching and | ||||
| 	 */ | ||||
| 	CMS.StructureBoard = new CMS.Class({ | ||||
| 
 | ||||
| 		implement: [CMS.API.Helpers], | ||||
| 
 | ||||
| 		options: { | ||||
| 			'speed': 300 | ||||
| 		}, | ||||
| 
 | ||||
| 		initialize: function (options) { | ||||
| 			this.container = $('.cms_structure'); | ||||
| 			this.options = $.extend(true, {}, this.options, options); | ||||
| 			this.config = CMS.config; | ||||
| 			this.settings = CMS.settings; | ||||
| 
 | ||||
| 			// elements
 | ||||
| 			this.toolbar = $('#cms_toolbar'); | ||||
| 			this.sortables = $('.cms_draggables'); // use global scope
 | ||||
| 			this.plugins = $('.cms_plugin'); | ||||
| 			this.render_model = $('.cms_render_model'); | ||||
| 			this.placeholders = $('.cms_placeholder'); | ||||
| 			this.dragitems = $('.cms_draggable'); | ||||
| 			this.dragareas = $('.cms_dragarea'); | ||||
| 			this.dropareas = $('.cms_droppable'); | ||||
| 			this.dimmer = this.container.find('.cms_structure-dimmer'); | ||||
| 			this.clipboard = $('.cms_clipboard'); | ||||
| 
 | ||||
| 			// states
 | ||||
| 			this.click = (document.ontouchstart !== null) ? 'click.cms' : 'tap.cms click.cms'; | ||||
| 			this.timer = function () {}; | ||||
| 			this.interval = function () {}; | ||||
| 			this.state = false; | ||||
| 			this.dragging = false; | ||||
| 
 | ||||
| 			// setup initial stuff
 | ||||
| 			this._setup(); | ||||
| 
 | ||||
| 			// setup events
 | ||||
| 			this._events(); | ||||
| 		}, | ||||
| 
 | ||||
| 		// initial methods
 | ||||
| 		_setup: function () { | ||||
| 			var that = this; | ||||
| 
 | ||||
| 			// cancel if there are no dragareas
 | ||||
| 			if(!this.dragareas.length) return false; | ||||
| 
 | ||||
| 			// cancel if there is no structure / content switcher
 | ||||
| 			if(!this.toolbar.find('.cms_toolbar-item-cms-mode-switcher').length) return false; | ||||
| 
 | ||||
| 			// setup toolbar mode
 | ||||
| 			if(this.settings.mode === 'structure') setTimeout(function () { that.show(true); }, 100); | ||||
| 
 | ||||
| 			// check if modes should be visible
 | ||||
| 			if(this.placeholders.length) { | ||||
| 				this.toolbar.find('.cms_toolbar-item-cms-mode-switcher').show(); | ||||
| 			} | ||||
| 
 | ||||
| 			// add drag & drop functionality
 | ||||
| 			this._drag(); | ||||
| 			// prevent click events to detect double click
 | ||||
| 			// this.preventEvents(this.plugins);
 | ||||
| 		}, | ||||
| 
 | ||||
| 		_events: function () { | ||||
| 			var that = this; | ||||
| 			var modes = this.toolbar.find('.cms_toolbar-item-cms-mode-switcher a'); | ||||
| 
 | ||||
| 			// show edit mode
 | ||||
| 			modes.eq(1).bind(this.click, function (e) { | ||||
| 				e.preventDefault(); | ||||
| 				// cancel if already active
 | ||||
| 				if(that.settings.mode === 'edit') return false; | ||||
| 				// otherwise hide
 | ||||
| 				that.hide(); | ||||
| 			}); | ||||
| 			// show structure mode
 | ||||
| 			modes.eq(0).bind(this.click, function (e) { | ||||
| 				e.preventDefault(); | ||||
| 				// cancel if already active
 | ||||
| 				if(that.settings.mode === 'structure') return false; | ||||
| 				// otherwise show
 | ||||
| 				that.show(); | ||||
| 			}); | ||||
| 
 | ||||
| 			// keyboard handling
 | ||||
| 			$(document).bind('keydown', function (e) { | ||||
| 				// check if we have an important focus
 | ||||
| 				var fields = $('*:focus'); | ||||
| 				// 32 = space
 | ||||
| 				if(e.keyCode === 32 && that.settings.mode === 'structure' && !fields.length) { | ||||
| 					// cancel if there is no structure / content switcher
 | ||||
| 					if(!that.toolbar.find('.cms_toolbar-item-cms-mode-switcher').length) return false; | ||||
| 					e.preventDefault(); | ||||
| 					that.hide(); | ||||
| 				} else if(e.keyCode === 32 && that.settings.mode === 'edit' && !fields.length) { | ||||
| 					// cancel if there is no structure / content switcher
 | ||||
| 					if(!that.toolbar.find('.cms_toolbar-item-cms-mode-switcher').length) return false; | ||||
| 					e.preventDefault(); | ||||
| 					that.show(); | ||||
| 				} | ||||
| 			}); | ||||
| 		}, | ||||
| 
 | ||||
| 		// public methods
 | ||||
| 		show: function (init) { | ||||
| 			// cancel show if live modus is active
 | ||||
| 			if(CMS.config.mode === 'live') return false; | ||||
| 
 | ||||
| 			// set active item
 | ||||
| 			var modes = this.toolbar.find('.cms_toolbar-item-cms-mode-switcher a'); | ||||
| 				modes.removeClass('cms_btn-active').eq(0).addClass('cms_btn-active'); | ||||
| 
 | ||||
| 			// show clipboard
 | ||||
| 			this.clipboard.css('opacity', 1).fadeIn(this.options.speed); | ||||
| 
 | ||||
| 			// apply new settings
 | ||||
| 			this.settings.mode = 'structure'; | ||||
| 			if(!init) this.settings = this.setSettings(this.settings); | ||||
| 
 | ||||
| 			// ensure all elements are visible
 | ||||
| 			this.dragareas.show(); | ||||
| 
 | ||||
| 			// show canvas
 | ||||
| 			this._showBoard(); | ||||
| 		}, | ||||
| 
 | ||||
| 		hide: function (init) { | ||||
| 			// cancel show if live modus is active
 | ||||
| 			if(CMS.config.mode === 'live') return false; | ||||
| 
 | ||||
| 			// set active item
 | ||||
| 			var modes = this.toolbar.find('.cms_toolbar-item-cms-mode-switcher a'); | ||||
| 				modes.removeClass('cms_btn-active').eq(1).addClass('cms_btn-active'); | ||||
| 
 | ||||
| 			// hide clipboard if in edit mode
 | ||||
| 			this.container.find('.cms_clipboard').hide(); | ||||
| 
 | ||||
| 			// hide clipboard
 | ||||
| 			this.clipboard.hide(); | ||||
| 
 | ||||
| 			this.settings.mode = 'edit'; | ||||
| 			if(!init) this.settings = this.setSettings(this.settings); | ||||
| 
 | ||||
| 			// hide canvas
 | ||||
| 			this._hideBoard(); | ||||
| 		}, | ||||
| 
 | ||||
| 		getId: function (el) { | ||||
| 			// cancel if no element is defined
 | ||||
| 			if(el === undefined || el === null || el.length <= 0) return false; | ||||
| 
 | ||||
| 			var id = null; | ||||
| 			var cls = el.attr('class').split(' ')[1]; | ||||
| 
 | ||||
| 			if(el.hasClass('cms_plugin')) { | ||||
| 				id = cls.replace('cms_plugin-', ''); | ||||
| 			} else if(el.hasClass('cms_draggable')) { | ||||
| 				id = cls.replace('cms_draggable-', ''); | ||||
| 			} else if(el.hasClass('cms_placeholder')) { | ||||
| 				id = cls.replace('cms_placeholder-', ''); | ||||
| 			} else if(el.hasClass('cms_dragbar')) { | ||||
| 				id = cls.replace('cms_dragbar-', ''); | ||||
| 			} else if(el.hasClass('cms_dragarea')) { | ||||
| 				id = cls.replace('cms_dragarea-', ''); | ||||
| 			} | ||||
| 
 | ||||
| 			return id; | ||||
| 		}, | ||||
| 
 | ||||
| 		getIds: function (els) { | ||||
| 			var that = this; | ||||
| 			var array = []; | ||||
| 			els.each(function () { | ||||
| 				array.push(that.getId($(this))); | ||||
| 			}); | ||||
| 			return array; | ||||
| 		}, | ||||
| 
 | ||||
| 		setActive: function (id, state) { | ||||
| 			var that = this; | ||||
| 			// resets
 | ||||
| 			this.dragitems.removeClass('cms_draggable-selected'); | ||||
| 			this.plugins.removeClass('cms_plugin-active'); | ||||
| 
 | ||||
| 			// only reset if no id is provided
 | ||||
| 			if(id === false) return false; | ||||
| 
 | ||||
| 			// attach active class to current element
 | ||||
| 			var dragitem = $('.cms_draggable-' + id); | ||||
| 			var plugin = $('.cms_plugin-' + id); | ||||
| 
 | ||||
| 			// if we switch from content to edit, show only a single plcaeholder
 | ||||
| 			if(state) { | ||||
| 				// quick show
 | ||||
| 				this._showBoard(); | ||||
| 
 | ||||
| 				// show clipboard
 | ||||
| 				this.clipboard.show().css('opacity', 0.2); | ||||
| 
 | ||||
| 				// prevent default visibility
 | ||||
| 				this.dragareas.css('opacity', 0.2); | ||||
| 
 | ||||
| 				// show single placeholder
 | ||||
| 				dragitem.closest('.cms_dragarea').show().css('opacity', 1); | ||||
| 
 | ||||
| 			// otherwise hide and reset the board
 | ||||
| 			} else { | ||||
| 				this.hide(); | ||||
| 			} | ||||
| 
 | ||||
| 			// collapse all previous elements
 | ||||
| 			var collapsed = dragitem.parentsUntil('.cms_dragarea').siblings().not('.cms_dragitem-expanded'); | ||||
| 				collapsed.trigger(this.click); | ||||
| 
 | ||||
| 			// set new classes
 | ||||
| 			dragitem.addClass('cms_draggable-selected'); | ||||
| 			plugin.addClass('cms_plugin-active'); | ||||
| 		}, | ||||
| 
 | ||||
| 		preventEvents: function (elements) { | ||||
| 			var clicks = 0; | ||||
| 			var delay = 500; | ||||
| 			var timer = function () {}; | ||||
| 
 | ||||
| 			// unbind click event if already initialized
 | ||||
| 			elements.find('a').bind(this.click, function (e) { | ||||
| 				e.preventDefault(); | ||||
| 
 | ||||
| 				// increment
 | ||||
| 				clicks++; | ||||
| 
 | ||||
| 				// single click
 | ||||
| 				if(clicks === 1) { | ||||
| 					timer = setTimeout(function () { | ||||
| 						clicks = 0; | ||||
| 						// cancel if link contains a hash
 | ||||
| 						if($(e.currentTarget).attr('href').indexOf('#') === 0) return false; | ||||
| 						// we need to redirect to the default behaviours
 | ||||
| 						// all events will be lost in edit mode, use '#' if href should not be triggered
 | ||||
| 						window.location.href = $(e.currentTarget).attr('href'); | ||||
| 					}, delay); | ||||
| 				} | ||||
| 
 | ||||
| 				// double click
 | ||||
| 				if(clicks === 2) { | ||||
| 					clearTimeout(timer); | ||||
| 					clicks = 0; | ||||
| 				} | ||||
| 			}); | ||||
| 		}, | ||||
| 
 | ||||
| 		// private methods
 | ||||
| 		_showBoard: function () { | ||||
| 			var that = this; | ||||
| 			var timer = function () {}; | ||||
| 
 | ||||
| 			// show container
 | ||||
| 			this.container.show(); | ||||
| 			this.dimmer.fadeIn(100); | ||||
| 			this.dragareas.css('opacity', 1); | ||||
| 
 | ||||
| 			// add dimmer close
 | ||||
| 			this.dimmer.bind('mousedown mouseup', function (e) { | ||||
| 				// cancel on rightclick
 | ||||
| 				if(e.which === 3 || e.button === 2) return false; | ||||
| 				// proceed
 | ||||
| 				clearTimeout(timer); | ||||
| 				timer = setTimeout(function () { | ||||
| 					that.hide(); | ||||
| 				}, 500); | ||||
| 
 | ||||
| 				if(e.type === 'mouseup') clearTimeout(timer); | ||||
| 			}); | ||||
| 
 | ||||
| 			this.plugins.not(this.render_model).hide(); | ||||
| 			this.placeholders.show(); | ||||
| 
 | ||||
| 			// attach event
 | ||||
| 			$(window).bind('resize.sideframe', function () { | ||||
| 				that._resizeBoard(); | ||||
| 			}).trigger('resize.sideframe'); | ||||
| 
 | ||||
| 		}, | ||||
| 
 | ||||
| 		_hideBoard: function () { | ||||
| 			// hide elements
 | ||||
| 			this.container.hide(); | ||||
| 			this.plugins.show(); | ||||
| 			this.placeholders.hide(); | ||||
| 			this.dimmer.hide(); | ||||
| 
 | ||||
| 			// detach event
 | ||||
| 			$(window).unbind('resize.sideframe'); | ||||
| 
 | ||||
| 			// clear interval
 | ||||
| 			clearInterval(this.interval); | ||||
| 
 | ||||
| 			$(window).trigger('structureboard_hidden.sideframe'); | ||||
| 		}, | ||||
| 
 | ||||
| 		_resizeBoard: function () { | ||||
| 			// calculate placeholder position
 | ||||
| 			var id = null; | ||||
| 			var area = null; | ||||
| 			var min = null; | ||||
| 			var areaParentOffset = null; | ||||
| 
 | ||||
| 			// start calculating
 | ||||
| 			this.placeholders.each(function (index, item) { | ||||
| 				item = $(item); | ||||
| 				id = item.data('settings').placeholder_id; | ||||
| 				area = $('.cms_dragarea-' + id); | ||||
| 				// to calculate the correct offset, we need to set the
 | ||||
| 				// placeholders correct heights and than set the according position
 | ||||
| 				item.height(area.outerHeight(true)); | ||||
| 				// set min width
 | ||||
| 				min = (item.width()) ? 0 : 150; | ||||
| 				// as area is "css positioned" and jquery offset function is relative to the
 | ||||
| 				// document (not the first relative/absolute parent) we need to substract
 | ||||
| 				// first relative/absolute parent offset.
 | ||||
| 				areaParentOffset = $(area).offsetParent().offset(); | ||||
| 				area.css({ | ||||
| 					'top': item.offset().top - areaParentOffset.top - 5, | ||||
| 					'left': item.offset().left - areaParentOffset.left - min, | ||||
| 					'width': item.width() + min | ||||
| 				}); | ||||
| 			}); | ||||
| 		}, | ||||
| 
 | ||||
| 		_drag: function () { | ||||
| 			var that = this; | ||||
| 			var dropped = false; | ||||
| 			var droparea = null; | ||||
| 			var dropzone = null; | ||||
| 
 | ||||
| 			this.sortables.nestedSortable({ | ||||
| 				'items': '.cms_draggable', | ||||
| 				'handle': '.cms_dragitem', | ||||
| 				'placeholder': 'cms_droppable', | ||||
| 				'connectWith': this.sortables, | ||||
| 				'tolerance': 'pointer', | ||||
| 				'toleranceElement': '> div', | ||||
| 				'dropOnEmpty': true, | ||||
| 				'forcePlaceholderSize': true, | ||||
| 				'helper': 'clone', | ||||
| 				'appendTo': 'body', | ||||
| 				'cursor': 'move', | ||||
| 				'opacity': 0.4, | ||||
| 				'zIndex': 9999999, | ||||
| 				'delay': 100, | ||||
| 				'refreshPositions': true, | ||||
| 				// nestedSortable
 | ||||
| 				'listType': 'div.cms_draggables', | ||||
| 				'doNotClear': true, | ||||
| 				//'disableNestingClass': 'cms_draggable-disabled',
 | ||||
| 				//'errorClass': 'cms_draggable-disallowed',
 | ||||
| 				//'hoveringClass': 'cms_draggable-hover',
 | ||||
| 				// methods
 | ||||
| 				'start': function (e, ui) { | ||||
| 					that.dragging = true; | ||||
| 					// show empty
 | ||||
| 					$('.cms_dragbar-empty-wrapper').show(); | ||||
| 					// ensure all menus are closed
 | ||||
| 					$('.cms_dragitem .cms_submenu').hide(); | ||||
| 					// remove classes from empty dropzones
 | ||||
| 					$('.cms_dragbar-empty').removeClass('cms_draggable-disallowed'); | ||||
| 					// fixes placeholder height
 | ||||
| 					ui.placeholder.height(ui.item.height()); | ||||
| 					// show placeholder without entries
 | ||||
| 					$('.cms_draggables').each(function () { | ||||
| 						if($(this).children().length === 0) { | ||||
| 							$(this).show(); | ||||
| 						} | ||||
| 					}); | ||||
| 				}, | ||||
| 
 | ||||
| 				'stop': function (event, ui) { | ||||
| 					that.dragging = false; | ||||
| 					// hide empty
 | ||||
| 					$('.cms_dragbar-empty-wrapper').hide(); | ||||
| 
 | ||||
| 					// cancel if isAllowed returns false
 | ||||
| 					if(!that.state) return false; | ||||
| 
 | ||||
| 					// handle dropped event
 | ||||
| 					if(dropped) { | ||||
| 						droparea.prepend(ui.item); | ||||
| 						dropped = false; | ||||
| 					} | ||||
| 
 | ||||
| 					// we pass the id to the updater which checks within the backend the correct place
 | ||||
| 					//var id = ui.item.attr('class').replace('cms_draggable cms_draggable-', '');
 | ||||
| 					var id = that.getId(ui.item); | ||||
| 					var plugin = $('.cms_plugin-' + id); | ||||
| 
 | ||||
| 					// check if we copy/paste a plugin or not
 | ||||
| 					if(plugin.closest('.cms_clipboard').length) { | ||||
| 						plugin.trigger('cms.plugin.update'); | ||||
| 					} else { | ||||
| 						plugin.trigger('cms.plugins.update'); | ||||
| 					} | ||||
| 
 | ||||
| 					// reset placeholder without entries
 | ||||
| 					$('.cms_draggables').each(function () { | ||||
| 						if($(this).children().length === 0) { | ||||
| 							$(this).hide(); | ||||
| 						} | ||||
| 					}); | ||||
| 				}, | ||||
| 				'isAllowed': function(placeholder, placeholderParent, originalItem) { | ||||
| 					// cancel if action is excecuted
 | ||||
| 					if(CMS.API.locked) return false; | ||||
| 					// getting restriction array
 | ||||
| 					var bounds = []; | ||||
| 					// save original state events
 | ||||
| 					var original = $('.cms_plugin-' + that.getId(originalItem)); | ||||
| 					// cancel if item has no settings
 | ||||
| 					if(original.length === 0 || original.data('settings') === null) return false; | ||||
| 					var type = original.data('settings').plugin_type; | ||||
| 					// prepare variables for bound
 | ||||
| 					var holderId = that.getId(placeholder.closest('.cms_dragarea')); | ||||
| 					var holder = $('.cms_placeholder-' + holderId); | ||||
| 					var plugin = $('.cms_plugin-' + that.getId(placeholder.closest('.cms_draggable'))); | ||||
| 
 | ||||
| 					// now set the correct bounds
 | ||||
| 					if(holder.length) bounds = holder.data('settings').plugin_restriction; | ||||
| 					if(plugin.length) bounds = plugin.data('settings').plugin_restriction; | ||||
| 					if(dropzone) bounds = dropzone.data('settings').plugin_restriction; | ||||
| 
 | ||||
| 					// if parent has class disabled, dissalow drop
 | ||||
| 					if(placeholder.parent().hasClass('cms_draggable-disabled')) return false; | ||||
| 
 | ||||
| 					// if restrictions is still empty, proceed
 | ||||
| 					that.state = (bounds.length <= 0 || $.inArray(type, bounds) !== -1) ? true : false; | ||||
| 
 | ||||
| 					return that.state; | ||||
| 				} | ||||
| 			}); | ||||
| 
 | ||||
| 			// attach escape event to cancel dragging
 | ||||
| 			$(document).bind('keyup.cms', function(e, cancel){ | ||||
| 				if(e.keyCode === 27 || cancel) { | ||||
| 					that.state = false; | ||||
| 					that.sortables.sortable('cancel'); | ||||
| 				} | ||||
| 			}); | ||||
| 
 | ||||
| 			// define droppable helpers
 | ||||
| 			this.dropareas.droppable({ | ||||
| 				'greedy': true, | ||||
| 				'accept': '.cms_draggable', | ||||
| 				'tolerance': 'pointer', | ||||
| 				'activeClass': 'cms_draggable-allowed', | ||||
| 				'hoverClass': 'cms_draggable-hover-allowed', | ||||
| 				'over': function (event) { | ||||
| 					dropzone = $('.cms_placeholder-' + that.getId($(event.target).parent().prev())); | ||||
| 					timer = setInterval(function () { | ||||
| 						// reset other empty placeholders
 | ||||
| 						$('.cms_dragbar-empty').removeClass('cms_draggable-disallowed'); | ||||
| 						if(that.state) { | ||||
| 							$(event.target).removeClass('cms_draggable-disallowed'); | ||||
| 						} else { | ||||
| 							$(event.target).addClass('cms_draggable-disallowed'); | ||||
| 						} | ||||
| 					}, 10); | ||||
| 				}, | ||||
| 				'out': function (event) { | ||||
| 					dropzone = null; | ||||
| 					$(event.target).removeClass('cms_draggable-disallowed'); | ||||
| 					clearInterval(timer); | ||||
| 				}, | ||||
| 				'drop': function (event) { | ||||
| 					dropped = true; | ||||
| 					droparea = $(event.target).parent().nextAll('.cms_draggables').first(); | ||||
| 					clearInterval(timer); | ||||
| 				} | ||||
| 			}); | ||||
| 		} | ||||
| 
 | ||||
| 	}); | ||||
| 
 | ||||
| }); | ||||
| })(CMS.$); | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue