217 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			217 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * @copyright  (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 | |
|  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 | |
|  */
 | |
| 
 | |
| (function() {
 | |
| 	"use strict";
 | |
| 
 | |
| 	/**
 | |
| 	 * Process modal fields in parent.
 | |
| 	 *
 | |
| 	 * @param   string  fieldPrefix  The fields to be updated prefix.
 | |
| 	 * @param   string  id           The new id for the item.
 | |
| 	 * @param   string  title        The new title for the item.
 | |
| 	 * @param   string  catid        Future usage.
 | |
| 	 * @param   object  object       Future usage.
 | |
| 	 * @param   string  url          Future usage.
 | |
| 	 * @param   string  language     Future usage.
 | |
| 	 *
 | |
| 	 * @return  boolean
 | |
| 	 *
 | |
| 	 * @since   3.7.0
 | |
| 	 */
 | |
| 	window.processModalParent = function (fieldPrefix, id, title, catid, url, language, object)
 | |
| 	{
 | |
| 		var fieldId = document.getElementById(fieldPrefix + '_id') || document.getElementById(fieldPrefix + '_value'),
 | |
| 			fieldTitle = document.getElementById(fieldPrefix + '_name') || document.getElementById(fieldPrefix);
 | |
| 
 | |
| 		// Default values.
 | |
| 		id       = id || '';
 | |
| 		title    = title || '';
 | |
| 		catid    = catid || '';
 | |
| 		object   = object || '';
 | |
| 		url      = url || '';
 | |
| 		language = language || '';
 | |
| 
 | |
| 		var isChanged = fieldId.value !== id;
 | |
| 
 | |
| 		if (id)
 | |
| 		{
 | |
| 			fieldId.value    = id;
 | |
| 			fieldTitle.value = title;
 | |
| 
 | |
| 			if (document.getElementById(fieldPrefix + '_select'))
 | |
| 			{
 | |
| 				document.getElementById(fieldPrefix + '_select').classList.add('hidden');
 | |
| 			}
 | |
| 			if (document.getElementById(fieldPrefix + '_new'))
 | |
| 			{
 | |
| 				document.getElementById(fieldPrefix + '_new').classList.add('hidden');
 | |
| 			}
 | |
| 			if (document.getElementById(fieldPrefix + '_edit'))
 | |
| 			{
 | |
| 				document.getElementById(fieldPrefix + '_edit').classList.remove('hidden');
 | |
| 			}
 | |
| 			if (document.getElementById(fieldPrefix + '_clear'))
 | |
| 			{
 | |
| 				document.getElementById(fieldPrefix + '_clear').classList.remove('hidden');
 | |
| 			}
 | |
| 			if (document.getElementById(fieldPrefix + '_propagate'))
 | |
| 			{
 | |
| 				document.getElementById(fieldPrefix + '_propagate').classList.remove('hidden');
 | |
| 			}
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			fieldId.value    = '';
 | |
| 			fieldTitle.value = fieldId.getAttribute('data-text');
 | |
| 
 | |
| 			if (document.getElementById(fieldPrefix + '_select'))
 | |
| 			{
 | |
| 				document.getElementById(fieldPrefix + '_select').classList.remove('hidden');
 | |
| 			}
 | |
| 			if (document.getElementById(fieldPrefix + '_new'))
 | |
| 			{
 | |
| 				document.getElementById(fieldPrefix + '_new').classList.remove('hidden');
 | |
| 			}
 | |
| 			if (document.getElementById(fieldPrefix + '_edit'))
 | |
| 			{
 | |
| 				document.getElementById(fieldPrefix + '_edit').classList.add('hidden');
 | |
| 			}
 | |
| 			if (document.getElementById(fieldPrefix + '_clear'))
 | |
| 			{
 | |
| 				document.getElementById(fieldPrefix + '_clear').classList.add('hidden');
 | |
| 			}
 | |
| 			if (document.getElementById(fieldPrefix + '_propagate'))
 | |
| 			{
 | |
| 				document.getElementById(fieldPrefix + '_propagate').classList.add('hidden');
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if (isChanged) {
 | |
| 			fieldId.dispatchEvent(new CustomEvent('change', { bubbles: true, cancelable: true }));
 | |
| 		}
 | |
| 
 | |
| 		if (fieldId.getAttribute('data-required') == '1')
 | |
| 		{
 | |
| 			document.formvalidator.validate(fieldId);
 | |
| 			document.formvalidator.validate(fieldTitle);
 | |
| 		}
 | |
| 
 | |
| 		return false;
 | |
| 	};
 | |
| 
 | |
| 	/**
 | |
| 	 * Process new/edit modal fields in child.
 | |
| 	 *
 | |
| 	 * @param   object  element       The modal footer button element.
 | |
| 	 * @param   string  fieldPrefix   The fields to be updated prefix.
 | |
| 	 * @param   string  action        Modal action (add, edit).
 | |
| 	 * @param   string  itemType      The item type (Article, Contact, etc).
 | |
| 	 * @param   string  task          Task to be done (apply, save, cancel).
 | |
| 	 * @param   string  formId        Id of the form field (defaults to itemtype-form).
 | |
| 	 * @param   string  idFieldId     Id of the id field (defaults to jform_id).
 | |
| 	 * @param   string  titleFieldId  Id of the title field (defaults to jform_title).
 | |
| 	 *
 | |
| 	 * @return  boolean
 | |
| 	 *
 | |
| 	 * @since   3.7.0
 | |
| 	 */
 | |
| 	window.processModalEdit = function (element, fieldPrefix, action, itemType, task, formId, idFieldId, titleFieldId)
 | |
| 	{
 | |
| 		formId       = formId || itemType.toLowerCase() + '-form';
 | |
| 		idFieldId    = idFieldId || 'jform_id';
 | |
| 		titleFieldId = titleFieldId || 'jform_title';
 | |
| 
 | |
| 		var modalId = element.parentNode.parentNode.parentNode.parentNode.id, submittedTask = task;
 | |
| 		var iframe  = document.getElementById(modalId).getElementsByTagName('iframe')[0];
 | |
| 
 | |
| 		// Set frame id.
 | |
| 		iframe.id = 'Frame_' + modalId;
 | |
| 
 | |
| 		var iframeDocument = iframe.contentDocument;
 | |
| 
 | |
| 		// If Close (cancel task), close the modal.
 | |
| 		if (task === 'cancel')
 | |
| 		{
 | |
| 			// Submit button on child iframe so we can check out.
 | |
| 			iframe.contentWindow.Joomla.submitbutton(itemType.toLowerCase() + '.' + task);
 | |
| 
 | |
| 			Joomla.Modal.getCurrent().close();
 | |
| 		}
 | |
| 		// For Save (apply task) and Save & Close (save task).
 | |
| 		else
 | |
| 		{
 | |
| 			// Attach onload event to the iframe.
 | |
| 			iframe.addEventListener('load', function()
 | |
| 			{
 | |
| 				// Reload iframe document var value.
 | |
| 				iframeDocument = this.contentDocument;
 | |
| 
 | |
| 				// Validate the child form and update parent form.
 | |
| 				if (
 | |
| 					iframeDocument.getElementById(idFieldId)
 | |
| 					&& iframeDocument.getElementById(idFieldId).value != '0'
 | |
| 					&& [].slice.call(iframeDocument.querySelectorAll('joomla-alert[type="danger"]')).length == 0
 | |
| 				) {
 | |
| 					window.processModalParent(fieldPrefix, iframeDocument.getElementById(idFieldId).value, iframeDocument.getElementById(titleFieldId).value);
 | |
| 
 | |
| 					// If Save & Close (save task), submit the edit close action (so we don't have checked out items).
 | |
| 					if (task === 'save')
 | |
| 					{
 | |
| 						window.processModalEdit(element, fieldPrefix, 'edit', itemType, 'cancel', formId, idFieldId, titleFieldId);
 | |
| 					}
 | |
| 				}
 | |
| 
 | |
| 				// Show the iframe again for future modals or in case of error.
 | |
| 				iframe.classList.remove('visually-hidden');
 | |
| 			});
 | |
| 
 | |
| 			// Submit button on child iframe.
 | |
| 			if (iframeDocument.formvalidator.isValid(iframeDocument.getElementById(formId)))
 | |
| 			{
 | |
| 				// For Save & Close (save task) when creating we need to replace the task as apply because of redirects after submit and hide the iframe.
 | |
| 				if (task === 'save')
 | |
| 				{
 | |
| 					submittedTask = 'apply';
 | |
| 					iframe.classList.add('visually-hidden');
 | |
| 				}
 | |
| 
 | |
| 				iframe.contentWindow.Joomla.submitbutton(itemType.toLowerCase() + '.' + submittedTask);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return false;
 | |
| 	};
 | |
| 
 | |
| 	/**
 | |
| 	 * Process select modal fields in child.
 | |
| 	 *
 | |
| 	 * @param   string  itemType     The item type (Article, Contact, etc).
 | |
| 	 * @param   string  fieldPrefix  The fields to be updated prefix.
 | |
| 	 * @param   string  id           The new id for the item.
 | |
| 	 * @param   string  title        The new title for the item.
 | |
| 	 * @param   string  catid        Future usage.
 | |
| 	 * @param   object  object       Future usage.
 | |
| 	 * @param   string  url          Future usage.
 | |
| 	 * @param   string  language     Future usage.
 | |
| 	 *
 | |
| 	 * @return  boolean
 | |
| 	 *
 | |
| 	 * @since   3.7.0
 | |
| 	 */
 | |
| 	window.processModalSelect = function(itemType, fieldPrefix, id, title, catid, object, url, language) {
 | |
| 		window.processModalParent(fieldPrefix, id, title, catid, url, language, object);
 | |
| 
 | |
| 		// Close Modal only when necessary.
 | |
| 		if (Joomla.Modal.getCurrent())
 | |
| 		{
 | |
| 			Joomla.Modal.getCurrent().close();
 | |
| 		}
 | |
| 
 | |
| 		return false;
 | |
| 	};
 | |
| 
 | |
| }());
 |