new static files.
Signed-off-by: rscnt <rascnt@gmail.com>
This commit is contained in:
		
					parent
					
						
							
								5da7cfab99
							
						
					
				
			
			
				commit
				
					
						bb68c32ba5
					
				
			
		
					 772 changed files with 71557 additions and 0 deletions
				
			
		
							
								
								
									
										775
									
								
								static/cms/js/modules/cms.plugins.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										775
									
								
								static/cms/js/modules/cms.plugins.js
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,775 @@
 | 
			
		|||
/*##################################################|*/
 | 
			
		||||
/* #CMS# */
 | 
			
		||||
(function($) {
 | 
			
		||||
// CMS.$ will be passed for $
 | 
			
		||||
$(document).ready(function () {
 | 
			
		||||
	/*!
 | 
			
		||||
	 * Plugins
 | 
			
		||||
	 * for created plugins or generics (static content)
 | 
			
		||||
	 */
 | 
			
		||||
	CMS.Plugin = new CMS.Class({
 | 
			
		||||
 | 
			
		||||
		implement: [CMS.API.Helpers],
 | 
			
		||||
 | 
			
		||||
		options: {
 | 
			
		||||
			'type': '', // bar, plugin or generic
 | 
			
		||||
			'placeholder_id': null,
 | 
			
		||||
			'plugin_type': '',
 | 
			
		||||
			'plugin_id': null,
 | 
			
		||||
			'plugin_language': '',
 | 
			
		||||
			'plugin_parent': null,
 | 
			
		||||
			'plugin_order': null,
 | 
			
		||||
			'plugin_breadcrumb': [],
 | 
			
		||||
			'plugin_restriction': [],
 | 
			
		||||
			'urls': {
 | 
			
		||||
				'add_plugin': '',
 | 
			
		||||
				'edit_plugin': '',
 | 
			
		||||
				'move_plugin': '',
 | 
			
		||||
				'copy_plugin': '',
 | 
			
		||||
				'delete_plugin': ''
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		initialize: function (container, options) {
 | 
			
		||||
			this.container = $('.' + container);
 | 
			
		||||
			this.options = $.extend(true, {}, this.options, options);
 | 
			
		||||
 | 
			
		||||
			// elements
 | 
			
		||||
			this.body = $(document);
 | 
			
		||||
 | 
			
		||||
			// states
 | 
			
		||||
			this.csrf = CMS.config.csrf;
 | 
			
		||||
			this.timer = function () {};
 | 
			
		||||
			this.timeout = 250;
 | 
			
		||||
			this.focused = false;
 | 
			
		||||
			this.click = (document.ontouchstart !== null) ? 'click.cms' : 'tap.cms click.cms';
 | 
			
		||||
 | 
			
		||||
			// bind data element to the container
 | 
			
		||||
			this.container.data('settings', this.options);
 | 
			
		||||
 | 
			
		||||
			// determine type of plugin
 | 
			
		||||
			switch(this.options.type) {
 | 
			
		||||
				case 'placeholder': // handler for placeholder bars
 | 
			
		||||
					this._setPlaceholder();
 | 
			
		||||
					this._collapsables();
 | 
			
		||||
					break;
 | 
			
		||||
				case 'plugin': // handler for all plugins
 | 
			
		||||
					this._setPlugin();
 | 
			
		||||
					this._collapsables();
 | 
			
		||||
					break;
 | 
			
		||||
				default: // handler for static content
 | 
			
		||||
					this._setGeneric();
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		// initial methods
 | 
			
		||||
		_setPlaceholder: function () {
 | 
			
		||||
			var that = this;
 | 
			
		||||
			var title = '.cms_dragbar-title';
 | 
			
		||||
			var expanded = 'cms_dragbar-title-expanded';
 | 
			
		||||
			var dragbar = $('.cms_dragbar-' + this.options.placeholder_id);
 | 
			
		||||
 | 
			
		||||
			// register the subnav on the placeholder
 | 
			
		||||
			this._setSubnav(dragbar.find('.cms_submenu'));
 | 
			
		||||
 | 
			
		||||
			// enable expanding/collapsing globally within the placeholder
 | 
			
		||||
			dragbar.find(title).bind(this.click, function () {
 | 
			
		||||
				($(this).hasClass(expanded)) ? that._collapseAll($(this)) : that._expandAll($(this));
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		_setPlugin: function () {
 | 
			
		||||
			var that = this;
 | 
			
		||||
			var timer = function () {};
 | 
			
		||||
 | 
			
		||||
			// adds double click to edit
 | 
			
		||||
			this.container.bind('dblclick', function (e) {
 | 
			
		||||
				e.preventDefault();
 | 
			
		||||
				e.stopPropagation();
 | 
			
		||||
				that.editPlugin(that.options.urls.edit_plugin, that.options.plugin_name, that.options.plugin_breadcrumb);
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			// adds edit tooltip
 | 
			
		||||
			this.container.bind('mouseover.cms mouseout.cms', function (e) {
 | 
			
		||||
				e.stopPropagation();
 | 
			
		||||
				var name = that.options.plugin_name;
 | 
			
		||||
				var id = that.options.plugin_id;
 | 
			
		||||
				(e.type === 'mouseover') ? that.showTooltip(name, id) : that.hideTooltip();
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			// adds listener for all plugin updates
 | 
			
		||||
			this.container.bind('cms.plugins.update', function (e) {
 | 
			
		||||
				e.stopPropagation();
 | 
			
		||||
				that.movePlugin();
 | 
			
		||||
			});
 | 
			
		||||
			// adds listener for copy/paste updates
 | 
			
		||||
			this.container.bind('cms.plugin.update', function (e) {
 | 
			
		||||
				e.stopPropagation();
 | 
			
		||||
 | 
			
		||||
				var el = $(e.delegateTarget);
 | 
			
		||||
				var dragitem = $('.cms_draggable-' + el.data('settings').plugin_id);
 | 
			
		||||
				var placeholder_id = that._getId(dragitem.parents('.cms_draggables').last().prevAll('.cms_dragbar').first());
 | 
			
		||||
 | 
			
		||||
				// if placeholder_id is empty, cancel
 | 
			
		||||
				if(!placeholder_id) return false;
 | 
			
		||||
 | 
			
		||||
				var data = el.data('settings');
 | 
			
		||||
					data.target = placeholder_id;
 | 
			
		||||
					data.parent= that._getId(dragitem.parent().closest('.cms_draggable'));
 | 
			
		||||
 | 
			
		||||
				that.copyPlugin(data);
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			// variables for dragitems
 | 
			
		||||
			var draggable = $('.cms_draggable-' + this.options.plugin_id);
 | 
			
		||||
			var dragitem = draggable.find('> .cms_dragitem');
 | 
			
		||||
			var submenu = draggable.find('.cms_submenu:eq(0)');
 | 
			
		||||
			var submenus = $('.cms_draggables').find('.cms_submenu');
 | 
			
		||||
 | 
			
		||||
			// attach event to the plugin menu
 | 
			
		||||
			this._setSubnav(draggable.find('> .cms_dragitem .cms_submenu'));
 | 
			
		||||
 | 
			
		||||
			// adds event for hiding the subnav
 | 
			
		||||
			draggable.bind('mouseenter mouseleave mouseover', function (e) {
 | 
			
		||||
				e.preventDefault();
 | 
			
		||||
				e.stopPropagation();
 | 
			
		||||
 | 
			
		||||
				if(that.focused) return false;
 | 
			
		||||
 | 
			
		||||
				if(e.type === 'mouseenter' || e.type === 'mouseover') $(this).data('active', true);
 | 
			
		||||
				if(e.type === 'mouseleave') {
 | 
			
		||||
					$(this).data('active', false);
 | 
			
		||||
					submenus.hide();
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				// add timeout to determine if we should hide the element
 | 
			
		||||
				setTimeout(function () {
 | 
			
		||||
					if(!$(e.currentTarget).data('active')) {
 | 
			
		||||
						$(e.currentTarget).find('.cms_submenu:eq(0)').hide();
 | 
			
		||||
					}
 | 
			
		||||
				}, 100);
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			// adds event for showing the subnav
 | 
			
		||||
			dragitem.bind('mouseenter', function (e) {
 | 
			
		||||
				e.preventDefault();
 | 
			
		||||
				e.stopPropagation();
 | 
			
		||||
 | 
			
		||||
				submenus.hide();
 | 
			
		||||
				submenu.show();
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			// adds double click to edit
 | 
			
		||||
			dragitem.bind('dblclick', function (e) {
 | 
			
		||||
				e.preventDefault();
 | 
			
		||||
				e.stopPropagation();
 | 
			
		||||
				that.editPlugin(that.options.urls.edit_plugin, that.options.plugin_name, that.options.plugin_breadcrumb);
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		_setGeneric: function () {
 | 
			
		||||
			var that = this;
 | 
			
		||||
 | 
			
		||||
			// adds double click to edit
 | 
			
		||||
			this.container.bind('dblclick', function (e) {
 | 
			
		||||
				e.preventDefault();
 | 
			
		||||
				e.stopPropagation();
 | 
			
		||||
				that.editPlugin(that.options.urls.edit_plugin, that.options.plugin_name, []);
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			// adds edit tooltip
 | 
			
		||||
			this.container.bind('mouseover.cms mouseout.cms', function (e) {
 | 
			
		||||
				e.stopPropagation();
 | 
			
		||||
				var name = that.options.plugin_name;
 | 
			
		||||
				var id = that.options.plugin_id;
 | 
			
		||||
				(e.type === 'mouseover') ? that.showTooltip(name, id) : that.hideTooltip();
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		// public methods
 | 
			
		||||
		addPlugin: function (type, name, parent) {
 | 
			
		||||
			// cancel request if already in progress
 | 
			
		||||
			if(CMS.API.locked) return false;
 | 
			
		||||
			CMS.API.locked = true;
 | 
			
		||||
 | 
			
		||||
			var that = this;
 | 
			
		||||
			var data = {
 | 
			
		||||
				'placeholder_id': this.options.placeholder_id,
 | 
			
		||||
				'plugin_type': type,
 | 
			
		||||
				'plugin_parent': parent || '',
 | 
			
		||||
				'plugin_language': this.options.plugin_language,
 | 
			
		||||
				'csrfmiddlewaretoken': this.csrf
 | 
			
		||||
			};
 | 
			
		||||
 | 
			
		||||
			$.ajax({
 | 
			
		||||
				'type': 'POST',
 | 
			
		||||
				'url': this.options.urls.add_plugin,
 | 
			
		||||
				'data': data,
 | 
			
		||||
				'success': function (data) {
 | 
			
		||||
					CMS.API.locked = false;
 | 
			
		||||
					that.newPlugin = data;
 | 
			
		||||
					that.editPlugin(data.url, name, data.breadcrumb);
 | 
			
		||||
				},
 | 
			
		||||
				'error': function (jqXHR) {
 | 
			
		||||
					CMS.API.locked = false;
 | 
			
		||||
					var msg = CMS.config.lang.error;
 | 
			
		||||
					// trigger error
 | 
			
		||||
					that._showError(msg + jqXHR.responseText || jqXHR.status + ' ' + jqXHR.statusText);
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		editPlugin: function (url, name, breadcrumb) {
 | 
			
		||||
			// trigger modal window
 | 
			
		||||
			var modal = new CMS.Modal({
 | 
			
		||||
				'newPlugin': this.newPlugin || false,
 | 
			
		||||
				'onClose': this.options.onClose || false,
 | 
			
		||||
				'redirectOnClose': this.options.redirectOnClose || false
 | 
			
		||||
			});
 | 
			
		||||
			modal.open(url, name, breadcrumb);
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		copyPlugin: function (options, source_language) {
 | 
			
		||||
			// cancel request if already in progress
 | 
			
		||||
			if(CMS.API.locked) return false;
 | 
			
		||||
			CMS.API.locked = true;
 | 
			
		||||
 | 
			
		||||
			var that = this;
 | 
			
		||||
			var move = (options || source_language) ? true : false;
 | 
			
		||||
			// set correct options
 | 
			
		||||
			options = options || this.options;
 | 
			
		||||
			if(source_language) {
 | 
			
		||||
				options.target = options.placeholder_id;
 | 
			
		||||
				options.plugin_id = '';
 | 
			
		||||
				options.parent = '';
 | 
			
		||||
			}
 | 
			
		||||
			else {
 | 
			
		||||
				source_language = options.plugin_language
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			var data = {
 | 
			
		||||
				'source_placeholder_id': options.placeholder_id,
 | 
			
		||||
				'source_plugin_id': options.plugin_id || '',
 | 
			
		||||
				'source_language': source_language,
 | 
			
		||||
				'target_plugin_id': options.parent || '',
 | 
			
		||||
				'target_placeholder_id': options.target || CMS.config.clipboard.id,
 | 
			
		||||
				'target_language': options.page_language || source_language,
 | 
			
		||||
				'csrfmiddlewaretoken': this.csrf
 | 
			
		||||
			};
 | 
			
		||||
			var request = {
 | 
			
		||||
				'type': 'POST',
 | 
			
		||||
				'url': options.urls.copy_plugin,
 | 
			
		||||
				'data': data,
 | 
			
		||||
				'success': function () {
 | 
			
		||||
					CMS.API.Toolbar.openMessage(CMS.config.lang.success);
 | 
			
		||||
					// reload
 | 
			
		||||
					CMS.API.Helpers.reloadBrowser();
 | 
			
		||||
				},
 | 
			
		||||
				'error': function (jqXHR) {
 | 
			
		||||
					CMS.API.locked = false;
 | 
			
		||||
					var msg = CMS.config.lang.error;
 | 
			
		||||
					// trigger error
 | 
			
		||||
					that._showError(msg + jqXHR.responseText || jqXHR.status + ' ' + jqXHR.statusText);
 | 
			
		||||
				}
 | 
			
		||||
			};
 | 
			
		||||
 | 
			
		||||
			if(move) {
 | 
			
		||||
				$.ajax(request);
 | 
			
		||||
			} else {
 | 
			
		||||
				// ensure clipboard is cleaned
 | 
			
		||||
				CMS.API.Clipboard.clear(function () {
 | 
			
		||||
					$.ajax(request);
 | 
			
		||||
				});
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		cutPlugin: function () {
 | 
			
		||||
			// if cut is once triggered, prevend additional actions
 | 
			
		||||
			if(CMS.API.locked) return false;
 | 
			
		||||
			CMS.API.locked = true;
 | 
			
		||||
 | 
			
		||||
			var that = this;
 | 
			
		||||
			var data = {
 | 
			
		||||
				'placeholder_id': CMS.config.clipboard.id,
 | 
			
		||||
				'plugin_id': this.options.plugin_id,
 | 
			
		||||
				'plugin_parent': '',
 | 
			
		||||
				'plugin_language': this.options.page_language,
 | 
			
		||||
				'plugin_order': [this.options.plugin_id],
 | 
			
		||||
				'csrfmiddlewaretoken': this.csrf
 | 
			
		||||
			};
 | 
			
		||||
 | 
			
		||||
			// ensure clipboard is cleaned
 | 
			
		||||
			CMS.API.Clipboard.clear(function () {
 | 
			
		||||
				// cancel request if already in progress
 | 
			
		||||
				if(CMS.API.locked) return false;
 | 
			
		||||
				CMS.API.locked = true;
 | 
			
		||||
 | 
			
		||||
				// move plugin
 | 
			
		||||
				$.ajax({
 | 
			
		||||
					'type': 'POST',
 | 
			
		||||
					'url': that.options.urls.move_plugin,
 | 
			
		||||
					'data': data,
 | 
			
		||||
					'success': function (response) {
 | 
			
		||||
						CMS.API.Toolbar.openMessage(CMS.config.lang.success);
 | 
			
		||||
						// if response is reload
 | 
			
		||||
						CMS.API.Helpers.reloadBrowser();
 | 
			
		||||
					},
 | 
			
		||||
					'error': function (jqXHR) {
 | 
			
		||||
						CMS.API.locked = false;
 | 
			
		||||
						var msg = CMS.config.lang.error;
 | 
			
		||||
						// trigger error
 | 
			
		||||
						that._showError(msg + jqXHR.responseText || jqXHR.status + ' ' + jqXHR.statusText);
 | 
			
		||||
					}
 | 
			
		||||
				});
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		movePlugin: function (options) {
 | 
			
		||||
			// cancel request if already in progress
 | 
			
		||||
			if(CMS.API.locked) return false;
 | 
			
		||||
			CMS.API.locked = true;
 | 
			
		||||
 | 
			
		||||
			var that = this;
 | 
			
		||||
			// set correct options
 | 
			
		||||
			options = options || this.options;
 | 
			
		||||
 | 
			
		||||
			var plugin = $('.cms_plugin-' + options.plugin_id);
 | 
			
		||||
			var dragitem = $('.cms_draggable-' + options.plugin_id);
 | 
			
		||||
 | 
			
		||||
			// SETTING POSITION
 | 
			
		||||
			this._setPosition(options.plugin_id, plugin, dragitem);
 | 
			
		||||
 | 
			
		||||
			// SAVING POSITION
 | 
			
		||||
			var placeholder_id = this._getId(dragitem.parents('.cms_draggables').last().prevAll('.cms_dragbar').first());
 | 
			
		||||
			var plugin_parent = this._getId(dragitem.parent().closest('.cms_draggable'));
 | 
			
		||||
			var plugin_order = this._getIds(dragitem.siblings('.cms_draggable').andSelf());
 | 
			
		||||
 | 
			
		||||
			// cancel here if we have no placeholder id
 | 
			
		||||
			if(placeholder_id === false) return false;
 | 
			
		||||
 | 
			
		||||
			// gather the data for ajax request
 | 
			
		||||
			var data = {
 | 
			
		||||
				'placeholder_id': placeholder_id,
 | 
			
		||||
				'plugin_id': options.plugin_id,
 | 
			
		||||
				'plugin_parent': plugin_parent || '',
 | 
			
		||||
				 // this is a hack: when moving to different languages use the global language
 | 
			
		||||
				'plugin_language': options.page_language,
 | 
			
		||||
				'plugin_order': plugin_order,
 | 
			
		||||
				'csrfmiddlewaretoken': this.csrf
 | 
			
		||||
			};
 | 
			
		||||
 | 
			
		||||
			$.ajax({
 | 
			
		||||
				'type': 'POST',
 | 
			
		||||
				'url': options.urls.move_plugin,
 | 
			
		||||
				'data': data,
 | 
			
		||||
				'success': function (response) {
 | 
			
		||||
					// if response is reload
 | 
			
		||||
					if(response.reload) CMS.API.Helpers.reloadBrowser();
 | 
			
		||||
 | 
			
		||||
					// enable actions again
 | 
			
		||||
					CMS.API.locked = false;
 | 
			
		||||
 | 
			
		||||
					// TODO: show only if(response.status)
 | 
			
		||||
					that._showSuccess(dragitem);
 | 
			
		||||
				},
 | 
			
		||||
				'error': function (jqXHR) {
 | 
			
		||||
					CMS.API.locked = false;
 | 
			
		||||
					var msg = CMS.config.lang.error;
 | 
			
		||||
					// trigger error
 | 
			
		||||
					that._showError(msg + jqXHR.responseText || jqXHR.status + ' ' + jqXHR.statusText);
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			// show publish button
 | 
			
		||||
			$('.cms_btn-publish').addClass('cms_btn-publish-active').parent().show();
 | 
			
		||||
 | 
			
		||||
			// enable revert to live
 | 
			
		||||
			$('.cms_toolbar-revert').removeClass('cms_toolbar-item-navigation-disabled');
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		deletePlugin: function (url, name, breadcrumb) {
 | 
			
		||||
			// trigger modal window
 | 
			
		||||
			var modal = new CMS.Modal({
 | 
			
		||||
				'newPlugin': this.newPlugin || false,
 | 
			
		||||
				'onClose': this.options.onClose || false,
 | 
			
		||||
				'redirectOnClose': this.options.redirectOnClose || false
 | 
			
		||||
			});
 | 
			
		||||
			modal.open(url, name, breadcrumb);
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		// private methods
 | 
			
		||||
		_setPosition: function (id, plugin, dragitem) {
 | 
			
		||||
			// after we insert the plugin onto its new place, we need to figure out where to position it
 | 
			
		||||
			var prevItem = dragitem.prev('.cms_draggable');
 | 
			
		||||
			var nextItem = dragitem.next('.cms_draggable');
 | 
			
		||||
			var parent = dragitem.parent().closest('.cms_draggable');
 | 
			
		||||
			var child = $('.cms_plugin-' + this._getId(parent));
 | 
			
		||||
			var placeholder = dragitem.closest('.cms_dragarea');
 | 
			
		||||
 | 
			
		||||
			// determine if there are other plugins within the same level, this makes the move easier
 | 
			
		||||
			if(prevItem.length) {
 | 
			
		||||
				plugin.insertAfter($('.cms_plugin-' + this._getId(prevItem)));
 | 
			
		||||
			} else if(nextItem.length) {
 | 
			
		||||
				plugin.insertBefore($('.cms_plugin-' + this._getId(nextItem)));
 | 
			
		||||
			} else if(parent.length) {
 | 
			
		||||
				// if we can't find a plugin on the same level, we need to travel higher
 | 
			
		||||
				// for this we need to find the deepest child
 | 
			
		||||
				while(child.children().length) {
 | 
			
		||||
					child = child.children();
 | 
			
		||||
				}
 | 
			
		||||
				child.append(plugin);
 | 
			
		||||
			} else if(placeholder.length) {
 | 
			
		||||
				// we also need to cover the case if we move the plugin to an empty placeholder
 | 
			
		||||
				plugin.append($('.cms_plugin-' + this._getId(placeholder)));
 | 
			
		||||
			} else {
 | 
			
		||||
				// if we did not found a match, reload
 | 
			
		||||
				CMS.API.Helpers.reloadBrowser();
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		editPluginPostAjax: function(caller, toolbar, response){
 | 
			
		||||
			if (typeof toolbar == 'undefined' || typeof response == 'undefined') {
 | 
			
		||||
				return function(toolbar, response) {
 | 
			
		||||
					var that = caller;
 | 
			
		||||
					that.editPlugin(response['url'], that.options.plugin_name, response['breadcrumb']);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			that.editPlugin(response['url'], that.options.plugin_name, response['breadcrumb']);
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		_setSubnav: function (nav) {
 | 
			
		||||
			var that = this;
 | 
			
		||||
 | 
			
		||||
			nav.bind('mouseenter mouseleave tap.cms', function (e) {
 | 
			
		||||
				e.preventDefault();
 | 
			
		||||
				e.stopPropagation();
 | 
			
		||||
				(e.type === 'mouseenter') ? that._showSubnav($(this)) : that._hideSubnav($(this));
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			nav.find('a').bind('click.cms tap.cms', function (e) {
 | 
			
		||||
				e.preventDefault();
 | 
			
		||||
				e.stopPropagation();
 | 
			
		||||
 | 
			
		||||
				// show loader and make sure scroll doesn't jump
 | 
			
		||||
				CMS.API.Toolbar._loader(true);
 | 
			
		||||
 | 
			
		||||
				var el = $(this);
 | 
			
		||||
 | 
			
		||||
				// set switch for subnav entries
 | 
			
		||||
				switch(el.attr('data-rel')) {
 | 
			
		||||
					case 'add':
 | 
			
		||||
						that.addPlugin(el.attr('href').replace('#', ''), el.text(), that._getId(el.closest('.cms_draggable')));
 | 
			
		||||
						break;
 | 
			
		||||
					case 'ajax_add':
 | 
			
		||||
						CMS.API.Toolbar.openAjax(el.attr('href'), JSON.stringify(el.data('post')), el.data('text'), that.editPluginPostAjax(that), el.data('on-success'));
 | 
			
		||||
						break;
 | 
			
		||||
					case 'edit':
 | 
			
		||||
						that.editPlugin(that.options.urls.edit_plugin, that.options.plugin_name, that.options.plugin_breadcrumb);
 | 
			
		||||
						break;
 | 
			
		||||
					case 'copy-lang':
 | 
			
		||||
						that.copyPlugin(this.options, el.attr('data-language'));
 | 
			
		||||
						break;
 | 
			
		||||
					case 'copy':
 | 
			
		||||
						that.copyPlugin();
 | 
			
		||||
						break;
 | 
			
		||||
					case 'cut':
 | 
			
		||||
						that.cutPlugin();
 | 
			
		||||
						break;
 | 
			
		||||
					case 'delete':
 | 
			
		||||
						that.deletePlugin(that.options.urls.delete_plugin, that.options.plugin_name, that.options.plugin_breadcrumb);
 | 
			
		||||
						break;
 | 
			
		||||
					default:
 | 
			
		||||
						CMS.API.Toolbar._loader(false);
 | 
			
		||||
						CMS.API.Toolbar._delegate(el);
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			nav.find('input').bind('keyup keydown focus blur click', function (e) {
 | 
			
		||||
				if(e.type === 'focus') that.focused = true;
 | 
			
		||||
				if(e.type === 'blur' && !that.traverse) {
 | 
			
		||||
					that.focused = false;
 | 
			
		||||
					that._hideSubnav(nav);
 | 
			
		||||
				}
 | 
			
		||||
				if(e.type === 'keyup') {
 | 
			
		||||
					clearTimeout(that.timer);
 | 
			
		||||
					// keybound is not required
 | 
			
		||||
					that.timer = setTimeout(function () {
 | 
			
		||||
						that._searchSubnav(nav, $(e.currentTarget).val());
 | 
			
		||||
					}, 100);
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			// set data attributes for original top positioning
 | 
			
		||||
			nav.find('.cms_submenu-dropdown').each(function () {
 | 
			
		||||
				$(this).data('top', $(this).css('top'))
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			// prevent propagnation
 | 
			
		||||
			nav.bind(this.click, function (e) {
 | 
			
		||||
				e.stopPropagation();
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		_showSubnav: function (nav) {
 | 
			
		||||
			var that = this;
 | 
			
		||||
			var dropdown = nav.find('.cms_submenu-dropdown');
 | 
			
		||||
			var offset = parseInt(dropdown.data('top'));
 | 
			
		||||
 | 
			
		||||
			// clearing
 | 
			
		||||
			clearTimeout(this.timer);
 | 
			
		||||
 | 
			
		||||
			// add small delay before showing submenu
 | 
			
		||||
			this.timer = setTimeout(function () {
 | 
			
		||||
				// reset z indexes
 | 
			
		||||
				var reset = $('.cms_submenu').parentsUntil('.cms_dragarea');
 | 
			
		||||
				var scrollHint = nav.find('.cms_submenu-scroll-hint');
 | 
			
		||||
 | 
			
		||||
				reset.css('z-index', 0);
 | 
			
		||||
 | 
			
		||||
				var parents = nav.parentsUntil('.cms_dragarea');
 | 
			
		||||
					parents.css('z-index', 999);
 | 
			
		||||
 | 
			
		||||
				// show subnav
 | 
			
		||||
				nav.find('.cms_submenu-quicksearch').show();
 | 
			
		||||
 | 
			
		||||
				// set visible states
 | 
			
		||||
				nav.find('> .cms_submenu-dropdown').show().on('scroll', function () {
 | 
			
		||||
					scrollHint.fadeOut(100);
 | 
			
		||||
					$(this).off('scroll');
 | 
			
		||||
				});
 | 
			
		||||
 | 
			
		||||
				// show scrollHint for FF on OSX
 | 
			
		||||
				window.console.log(nav[0], nav[0].scrollHeight);
 | 
			
		||||
				if(nav[0].scrollHeight > 245) scrollHint.show();
 | 
			
		||||
 | 
			
		||||
			}, 100);
 | 
			
		||||
 | 
			
		||||
			// add key events
 | 
			
		||||
			$(document).unbind('keydown.cms');
 | 
			
		||||
			$(document).bind('keydown.cms', function (e) {
 | 
			
		||||
				var anchors = nav.find('.cms_submenu-item:visible a');
 | 
			
		||||
				var index = anchors.index(anchors.filter(':focus'));
 | 
			
		||||
 | 
			
		||||
				// bind arrow down and tab keys
 | 
			
		||||
				if(e.keyCode === 40 || e.keyCode === 9) {
 | 
			
		||||
					that.traverse = true;
 | 
			
		||||
					e.preventDefault();
 | 
			
		||||
					if(index >= 0 && index < anchors.length - 1) {
 | 
			
		||||
						anchors.eq(index + 1).focus();
 | 
			
		||||
					} else {
 | 
			
		||||
						anchors.eq(0).focus();
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				// bind arrow up keys
 | 
			
		||||
				if(e.keyCode === 38) {
 | 
			
		||||
					e.preventDefault();
 | 
			
		||||
					if(anchors.is(':focus')) {
 | 
			
		||||
						anchors.eq(index - 1).focus();
 | 
			
		||||
					} else {
 | 
			
		||||
						anchors.eq(anchors.length).focus();
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				// hide subnav when hitting enter or escape
 | 
			
		||||
				if(e.keyCode === 13 || e.keyCode === 27) {
 | 
			
		||||
					that.traverse = false;
 | 
			
		||||
					nav.find('input').blur();
 | 
			
		||||
					that._hideSubnav(nav);
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			// calculate subnav bounds
 | 
			
		||||
			if($(window).height() + $(window).scrollTop() - nav.offset().top - dropdown.height() <= 10 && nav.offset().top - dropdown.height() >= 0) {
 | 
			
		||||
				dropdown.css('top', 'auto');
 | 
			
		||||
				dropdown.css('bottom', offset);
 | 
			
		||||
				// if parent is within a plugin, add additional offset
 | 
			
		||||
				if(dropdown.closest('.cms_draggable').length) dropdown.css('bottom', offset - 1);
 | 
			
		||||
			} else {
 | 
			
		||||
				dropdown.css('top', offset);
 | 
			
		||||
				dropdown.css('bottom', 'auto');
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		_hideSubnav: function (nav) {
 | 
			
		||||
			clearTimeout(this.timer);
 | 
			
		||||
 | 
			
		||||
			var that = this;
 | 
			
		||||
			// cancel if quicksearch is focues
 | 
			
		||||
			if(this.focused) return false;
 | 
			
		||||
 | 
			
		||||
			// set correct active state
 | 
			
		||||
			nav.closest('.cms_draggable').data('active', false);
 | 
			
		||||
 | 
			
		||||
			this.timer = setTimeout(function () {
 | 
			
		||||
				// set visible states
 | 
			
		||||
				nav.find('> .cms_submenu-dropdown').hide();
 | 
			
		||||
				nav.find('.cms_submenu-quicksearch').hide();
 | 
			
		||||
				// reset search
 | 
			
		||||
				nav.find('input').val('');
 | 
			
		||||
				that._searchSubnav(nav, '');
 | 
			
		||||
			}, this.timeout);
 | 
			
		||||
 | 
			
		||||
			// reset relativity
 | 
			
		||||
			$('.cms_dragbar').css('position', '');
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		_searchSubnav: function (nav, value) {
 | 
			
		||||
			var items = nav.find('.cms_submenu-item');
 | 
			
		||||
			var titles = nav.find('.cms_submenu-item-title');
 | 
			
		||||
 | 
			
		||||
			// cancel if value is zero
 | 
			
		||||
			if(value === '') {
 | 
			
		||||
				items.add(titles).show();
 | 
			
		||||
				return false;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// loop through items and figure out if we need to hide items
 | 
			
		||||
			items.find('a, span').each(function (index, item) {
 | 
			
		||||
				item = $(item);
 | 
			
		||||
				var text = item.text().toLowerCase();
 | 
			
		||||
				var search = value.toLowerCase();
 | 
			
		||||
 | 
			
		||||
				(text.indexOf(search) >= 0) ? item.parent().show() : item.parent().hide();
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			// check if a title is matching
 | 
			
		||||
			titles.filter(':visible').each(function (index, item) {
 | 
			
		||||
				titles.hide();
 | 
			
		||||
				$(item).nextUntil('.cms_submenu-item-title').show();
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			// always display title of a category
 | 
			
		||||
			items.filter(':visible').each(function (index, item) {
 | 
			
		||||
				if($(item).prev().hasClass('cms_submenu-item-title')) {
 | 
			
		||||
					$(item).prev().show();
 | 
			
		||||
				} else {
 | 
			
		||||
					$(item).prevUntil('.cms_submenu-item-title').last().prev().show();
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			// if there is no element visible, show only first categoriy
 | 
			
		||||
			nav.find('.cms_submenu-dropdown').show();
 | 
			
		||||
			if(items.add(titles).filter(':visible').length <= 0) {
 | 
			
		||||
				nav.find('.cms_submenu-dropdown').hide();
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// hide scrollHint
 | 
			
		||||
			nav.find('.cms_submenu-scroll-hint').hide();
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		_collapsables: function () {
 | 
			
		||||
			// one time setup
 | 
			
		||||
			var that = this;
 | 
			
		||||
			var settings = CMS.settings;
 | 
			
		||||
			var draggable = $('.cms_draggable-' + this.options.plugin_id);
 | 
			
		||||
 | 
			
		||||
			// check which button should be shown for collapsemenu
 | 
			
		||||
			this.container.each(function (index, item) {
 | 
			
		||||
				var els = $(item).find('.cms_dragitem-collapsable');
 | 
			
		||||
				var open = els.filter('.cms_dragitem-expanded');
 | 
			
		||||
				if(els.length === open.length && (els.length + open.length !== 0)) {
 | 
			
		||||
					$(item).find('.cms_dragbar-title').addClass('cms_dragbar-title-expanded');
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
			// cancel here if its not a draggable
 | 
			
		||||
			if(!draggable.length) return false;
 | 
			
		||||
 | 
			
		||||
			// attach events to draggable
 | 
			
		||||
			draggable.find('> .cms_dragitem-collapsable').bind(this.click, function () {
 | 
			
		||||
				var el = $(this);
 | 
			
		||||
				var id = that._getId($(this).parent());
 | 
			
		||||
 | 
			
		||||
				var settings = CMS.settings;
 | 
			
		||||
					settings.states = settings.states || [];
 | 
			
		||||
 | 
			
		||||
				// collapsable function and save states
 | 
			
		||||
				if(el.hasClass('cms_dragitem-expanded')) {
 | 
			
		||||
					settings.states.splice($.inArray(id, settings.states), 1);
 | 
			
		||||
					el.removeClass('cms_dragitem-expanded').parent().find('> .cms_draggables').hide();
 | 
			
		||||
				} else {
 | 
			
		||||
					settings.states.push(id);
 | 
			
		||||
					el.addClass('cms_dragitem-expanded').parent().find('> .cms_draggables').show();
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				// save settings
 | 
			
		||||
				CMS.API.Toolbar.setSettings(settings);
 | 
			
		||||
			});
 | 
			
		||||
			// adds double click event
 | 
			
		||||
			draggable.bind('dblclick', function (e) {
 | 
			
		||||
				e.stopPropagation();
 | 
			
		||||
				$('.cms_plugin-' + that._getId($(this))).trigger('dblclick');
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			// only needs to be excecuted once
 | 
			
		||||
			if(CMS.Toolbar.ready) return false;
 | 
			
		||||
 | 
			
		||||
			// removing dublicate entries
 | 
			
		||||
			var sortedArr = settings.states.sort();
 | 
			
		||||
			var filteredArray = [];
 | 
			
		||||
			for(var i = 0; i < sortedArr.length; i++) {
 | 
			
		||||
				if(sortedArr[i] !== sortedArr[i + 1]) {
 | 
			
		||||
					filteredArray.push(sortedArr[i]);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			settings.states = filteredArray;
 | 
			
		||||
 | 
			
		||||
			// loop through the items
 | 
			
		||||
			$.each(CMS.settings.states, function (index, id) {
 | 
			
		||||
				var el = $('.cms_draggable-' + id);
 | 
			
		||||
				// only add this class to elements which have a draggable area
 | 
			
		||||
				if(el.find('.cms_draggables').length) {
 | 
			
		||||
					el.find('> .cms_draggables').show();
 | 
			
		||||
					el.find('> .cms_dragitem').addClass('cms_dragitem-expanded');
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			// set global setup
 | 
			
		||||
			CMS.Toolbar.ready = true;
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		_expandAll: function (el) {
 | 
			
		||||
			var items = el.closest('.cms_dragarea').find('.cms_dragitem-collapsable');
 | 
			
		||||
			// cancel if there are no items
 | 
			
		||||
			if(!items.length) return false;
 | 
			
		||||
			items.each(function () {
 | 
			
		||||
				if(!$(this).hasClass('cms_dragitem-expanded')) $(this).trigger('click.cms');
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			el.addClass('cms_dragbar-title-expanded');
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		_collapseAll: function (el) {
 | 
			
		||||
			var items = el.closest('.cms_dragarea').find('.cms_dragitem-collapsable');
 | 
			
		||||
			items.each(function () {
 | 
			
		||||
				if($(this).hasClass('cms_dragitem-expanded')) $(this).trigger('click.cms');
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			el.removeClass('cms_dragbar-title-expanded');
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		_getId: function (el) {
 | 
			
		||||
			return CMS.API.StructureBoard.getId(el);
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		_getIds: function (els) {
 | 
			
		||||
			return CMS.API.StructureBoard.getIds(els);
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		_showError: function (msg) {
 | 
			
		||||
			return CMS.API.Toolbar.showError(msg, true);
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		_showSuccess: function (el) {
 | 
			
		||||
			var tpl = $('<div class="cms_dragitem-success"></div>');
 | 
			
		||||
			el.append(tpl);
 | 
			
		||||
			// start animation
 | 
			
		||||
			tpl.fadeOut(function () {
 | 
			
		||||
				$(this).remove()
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
});
 | 
			
		||||
})(CMS.$);
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue