/*! Semantic UI integration for DataTables' Editor * ©2018 SpryMedia Ltd - datatables.net/license */ (function( factory ){ if ( typeof define === 'function' && define.amd ) { // AMD define( ['jquery', 'datatables.net-se', 'datatables.net-editor'], function ( $ ) { return factory( $, window, document ); } ); } else if ( typeof exports === 'object' ) { // CommonJS module.exports = function (root, $) { if ( ! root ) { // CommonJS environments without a window global must pass a // root. This will give an error otherwise root = window; } if ( ! $ ) { $ = typeof window !== 'undefined' ? // jQuery's factory checks for a global window require('jquery') : require('jquery')( root ); } if ( ! $.fn.dataTable ) { require('datatables.net-se')(root, $); } if ( ! $.fn.dataTable ) { require('datatables.net-editor')(root, $); } return factory( $, root, root.document ); }; } else { // Browser factory( jQuery, window, document ); } }(function( $, window, document, undefined ) { 'use strict'; var DataTable = $.fn.dataTable; (function( factory ){ if ( typeof define === 'function' && define.amd ) { // AMD define( ['jquery', 'datatables.net-se', 'datatables.net-editor'], function ( $ ) { return factory( $, window, document ); } ); } else if ( typeof exports === 'object' ) { // CommonJS module.exports = function (root, $) { if ( ! root ) { root = window; } if ( ! $ || ! $.fn.dataTable ) { $ = require('datatables.net-se')(root, $).$; } if ( ! $.fn.dataTable.Editor ) { require('datatables.net-editor')(root, $); } return factory( $, root, root.document ); }; } else { // Browser factory( jQuery, window, document ); } }(function( $, window, document, undefined ) { 'use strict'; var DataTable = $.fn.dataTable; /* * Set the default display controller to be Semantic UI modal */ DataTable.Editor.defaults.display = "semanticui"; /* * Change the default classes from Editor to be classes for Bootstrap */ $.extend( true, $.fn.dataTable.Editor.classes, { "header": { "wrapper": "DTE_Header header" }, "body": { "wrapper": "DTE_Body content" }, "footer": { "wrapper": "DTE_Footer actions" }, "form": { "tag": "ui form", "button": "ui button", "buttonInternal": "ui button", "content": 'DTE_Form_Content' }, "field": { "wrapper": "DTE_Field inline fields", "label": "right aligned five wide field", "input": "eight wide field DTE_Field_Input", "error": "error has-error", "msg-labelInfo": "ui small", "msg-info": "ui small", "msg-message": "ui message small", "msg-error": "ui error message small", "multiValue": "ui message multi-value", "multiInfo": "small", "multiRestore": "ui message multi-restore" }, inline: { wrapper: "DTE DTE_Inline ui form" }, bubble: { table: "DTE_Bubble_Table ui form", bg: "ui dimmer modals page transition visible active" } } ); $.extend( true, DataTable.ext.buttons, { create: { formButtons: { className: 'primary' } }, edit: { formButtons: { className: 'primary' } }, remove: { formButtons: { className: 'negative' } } } ); DataTable.Editor.fieldTypes.datatable.tableClass = 'ui table'; /* * Bootstrap display controller - this is effectively a proxy to the Bootstrap * modal control. */ // Single shared model for all Editor instances const dom = { modal: $(''), close: $('') } let shown = false; let lastAppend; DataTable.Editor.display.semanticui = $.extend( true, {}, DataTable.Editor.models.displayController, { /* * API methods */ init: function ( dte ) { // Make select lists semantic ui dropdowns if possible if ($.fn.dropdown) { dte.on( 'displayOrder.dtesu open.dtesu', function ( e, display, action, form ) { $.each( dte.s.fields, function ( key, field ) { $('select', field.node()) .addClass('fluid') .dropdown(); } ); } ); } return DataTable.Editor.display.semanticui; }, open: function ( dte, append, callback ) { var modal = dom.modal; var appendChildren = $(append).children(); // Because we can't use a single element, we need to insert the existing // children back into their previous host so that can be reused later if (lastAppend) { modal.children().appendTo(lastAppend); } lastAppend = append; // Clean up any existing elements and then insert the elements to // display. In Semantic UI we need to have the header, content and // actions at the top level of the modal rather than as children of a // wrapper. modal .children() .detach(); modal .append( appendChildren ) .prepend( modal.children('.header') ) // order is important .addClass( append.className ) .prepend( dom.close ); dom.close .attr('title', dte.i18n.close) .off( 'click.dte-se' ) .on( 'click.dte-se', function (e) { dte.close('icon'); return false; } ); $(document) .off('click.dte-se') .on('click.dte-se', 'div.ui.dimmer.modals', function (e) { if ( $(e.target).hasClass('dimmer') ) { dte.background(); } } ); if ( shown ) { if ( callback ) { callback(); } return; } shown = true; $(modal) .modal( 'setting', { autofocus: false, closable: false, onVisible: function () { // Can only give elements focus when shown if ( dte.s.setFocus ) { dte.s.setFocus.focus(); } if ( callback ) { callback(); } }, onHidden: function () { $(append).append( appendChildren ); shown = false; } } ) .modal( 'show' ); }, close: function ( dte, callback ) { if ( ! shown ) { if ( callback ) { callback(); } return; } dom.modal.modal('hide'); lastAppend = null; shown = false; if ( callback ) { callback(); } }, node: function ( dte ) { return dom.modal[0]; } } ); return DataTable.Editor; })); return Editor; }));