Source: admin/javascript/engine/extensions/datatable_default_actions.js

/* --------------------------------------------------------------
 datatable_default_actions.js 2016-10-12
 Gambio GmbH
 http://www.gambio.de
 Copyright (c) 2016 Gambio GmbH
 Released under the GNU General Public License (Version 2)
 [http://www.gnu.org/licenses/gpl-2.0.html]
 --------------------------------------------------------------
 */

/**
 * ## Enable Default Dropdown Actions
 *
 * This extension will handle the "defaultRowAction" and "defaultBulkAction" data attributes of the table upon
 * initialization or user click.
 *
 * ### Options
 *
 * **Default Row Action | `data-datatable_default_actions-row` | String | Required**
 *
 * Provide the default row action. This will automatically be mapped to the defaultRowAction data value of the table.
 *
 * **Default Bulk Action | `data-datatable_default_actions-bulk` | String | Required**
 *
 * Provide the default bulk action. This will automatically be mapped to the defaultBulkAction data value of the table.
 *
 * **Bulk Action Selector | `data-datatable_default_actions-bulk-action-selector` | String | Optional**
 *
 * Provide a selector for the bulk action dropdown widget. The default value is '.bulk-action'.
 *
 * ### Methods
 *
 * **Ensure Default Task**
 *
 * This method will make sure that there is a default task selected. Call it after you setup the row or bulk dropdown
 * actions. Sometimes the user_configuration db value might contain a default value that is not present in the dropdowns
 * anymore (e.g. removed module). In order to make sure that there will always be a default value use this method after
 * creating the dropdown actions and it will use the first dropdown action as default if needed.
 *
 * ```javascript
 * // Ensure default row actions.
 * $('.table-main').datatable_default_actions('ensure', 'row');
 *
 * // Ensure default bulk actions.
 * $('.table-main').datatable_default_actions('ensure', 'bulk');
 * ```
 *
 * @module Admin/extensions/datatable_default_actions
 */
gx.extensions.module('datatable_default_actions', [`${gx.source}/libs/button_dropdown`], function(data) {
	
	'use strict';
	
	// ------------------------------------------------------------------------
	// VARIABLES
	// ------------------------------------------------------------------------
	
	
	/**
	 * Module Selector
	 *
	 * @type {jQuery}
	 */
	const $this = $(this);
	
	/**
	 * Default Options
	 *
	 * @type {Object}
	 */
	const defaults = {
		bulkActionSelector: '.bulk-action'
	};
	
	/**
	 * Final Options
	 *
	 * @type {Object}
	 */
	const options = $.extend(true, {}, defaults, data);
	
	/**
	 * Module Instance
	 *
	 * @type {Object}
	 */
	const module = {};
	
	// ------------------------------------------------------------------------
	// FUNCTIONS
	// ------------------------------------------------------------------------
	
	/**
	 * Ensure that there will be a default action in the row or bulk dropdowns.
	 *
	 * @param {String} type Can be whether 'row' or 'bulk'.
	 */
	function _ensure(type) {
		const $table = $(this);
		
		switch (type) {
			case 'row':
				const $rowActions = $table.find('tbody .btn-group.dropdown');
				// debugger;
				$rowActions.each(function () {
					if ($(this).find('button:empty').length) {
						const $actionLink = $(this).find('ul li:first a');
						jse.libs.button_dropdown.setDefaultAction($(this), $actionLink);
					}
				});
				
				break;
			
			case 'bulk':
				const $bulkAction = $(options.bulkActionSelector);
				
				if ($bulkAction.find('button:first').text() === '') {
					const $actionLink = $bulkAction.find('ul li:first a');
					jse.libs.button_dropdown.setDefaultAction($bulkAction, $actionLink);
				}
				
				break;
			
			default:
				throw new Error(`Invalid "ensure" type given (expected "row" or "bulk" got : "${type}").`);
		}
	}
	
	/**
	 * On Button Drodpown Action Click
	 *
	 * Update the defaultBulkAction and defaultRowAction data attributes.
	 */
	function _onButtonDropdownActionClick() {
		const property = $(this).parents('.btn-group')[0] === $(options.bulkActionSelector)[0]
			? 'defaultBulkAction' : 'defaultRowAction';
		
		$this.data(property, $(this).data('configurationValue'));
	}
	
	// ------------------------------------------------------------------------
	// INITIALIZATION
	// ------------------------------------------------------------------------
	
	module.init = function(done) {
		$this.data({
			defaultRowAction: options.row,
			defaultBulkAction: options.bulk
		});
		
		$this.on('click', '.btn-group.dropdown a', _onButtonDropdownActionClick);
		$('body').on('click', options.bulkActionSelector, _onButtonDropdownActionClick);
		
		// Bind module api to jQuery object. 
		$.fn.extend({
			datatable_default_actions: function(action, ...args) {
				switch (action) {
					case 'ensure':
						return _ensure.apply(this, args);
				}
			}
		});
		
		done();
	};
	
	return module;
	
});