(function($){ $('.ss-gridfield').entwine({ /** * @param {Object} Additional options for jQuery.ajax() call * @param {successCallback} callback to call after reloading succeeded. */ reload: function(ajaxOpts, successCallback) { var self = this, form = this.closest('form'), focusedElName = this.find(':input:focus').attr('name'), // Save focused element for restoring after refresh data = form.find(':input').serializeArray(); if(!ajaxOpts) ajaxOpts = {}; if(!ajaxOpts.data) ajaxOpts.data = []; ajaxOpts.data = ajaxOpts.data.concat(data); // Include any GET parameters from the current URL, as the view state might depend on it. // For example, a list prefiltered through external search criteria might be passed to GridField. if(window.location.search) { ajaxOpts.data = window.location.search.replace(/^\?/, '') + '&' + $.param(ajaxOpts.data); } form.addClass('loading'); $.ajax($.extend({}, { headers: {"X-Get-Fragment" : 'CurrentField'}, type: "POST", url: this.data('url'), dataType: 'html', success: function(data) { // Replace the grid field with response, not the form. // TODO Only replaces all its children, to avoid replacing the current scope // of the executing method. Means that it doesn't retrigger the onmatch() on the main container. self.empty().append($(data).children()); // Refocus previously focused element. Useful e.g. for finding+adding // multiple relationships via keyboard. if(focusedElName) self.find(':input[name="' + focusedElName + '"]').focus(); form.removeClass('loading'); if(successCallback) successCallback.apply(this, arguments); self.trigger('reload', self); }, error: function(e) { alert(ss.i18n._t('GRIDFIELD.ERRORINTRANSACTION')); form.removeClass('loading'); } }, ajaxOpts)); }, showDetailView: function(url) { window.location.href = url; }, getItems: function() { return this.find('.ss-gridfield-item'); }, /** * @param {String} * @param {Mixed} */ setState: function(k, v) { var state = this.getState(); state[k] = v; this.find(':input[name="' + this.data('name') + '[GridState]"]').val(JSON.stringify(state)); }, /** * @return {Object} */ getState: function() { return JSON.parse(this.find(':input[name="' + this.data('name') + '[GridState]"]').val()); } }); $('.ss-gridfield *').entwine({ getGridField: function() { return this.closest('.ss-gridfield'); } }); $('.ss-gridfield .ss-gridfield-item').entwine({ onclick: function(e) { if($(e.target).closest('.action').length) { this._super(e); return false; } var editLink = this.find('.edit-link'); if(editLink.length) this.getGridField().showDetailView(editLink.prop('href')); }, onmouseover: function() { if(this.find('.edit-link').length) this.css('cursor', 'pointer'); }, onmouseout: function() { this.css('cursor', 'default'); } }); $('.ss-gridfield .action').entwine({ onclick: function(e){ this.getGridField().reload({data: [{name: this.attr('name'), value: this.val()}]}); e.preventDefault(); } }); $('.ss-gridfield .action.gridfield-button-delete').entwine({ onclick: function(e){ if(!confirm(ss.i18n._t('TABLEFIELD.DELETECONFIRMMESSAGE'))) { e.preventDefault(); return false; } else { this._super(e); } } }); $('.ss-gridfield .action.gridfield-button-print').entwine({ UUID: null, onmatch: function() { this._super(); this.setUUID(new Date().getTime()); }, onclick: function(e){ var self = this, iframeID = 'gridfield-print-iframe' + this.getUUID(); var printIframe = $('#' + iframeID); if(!printIframe.length){ printIframe = $('