Source: table.js

import $ from 'jquery';

import datatableview from './datatableview';
import QuerybuilderAPI from './querybuilderapi';
import registerWidgetClass from './registerwidgetclass';

if (datatableview.auto_initialize) {
    datatableview.initialize($('.datatable'));
}

/** Class representing an AJAX datatable.
 * @constructor
 * @param containerID {string} - DOM element ID assigned to the widget
 * @param formID {string} - ID of the FilterForm, optional
 * @param endpointName {string} - name of the widget used for routing requests
 * @param api {QuerybuilderAPI} - data source
 * @param widgetParams {string} - manually defined data that will be passed
 to the API together with the request
 */
class Table {
    constructor(containerID, formID, endpointName, api, widgetParams) {
        this.containerID = containerID;
        this.endpointName = endpointName;
        this.api = api;
        this.widgetParams = widgetParams;
        this.form = null;
        this._linkWithFilterForm(formID);
        this._storeTableInDOM();
        this._initializeTableView();
    }

    retrieveData(client_params, widget_params, callback) {
        this.api.retrieveData(this.endpointName, client_params, widget_params, callback);
    }

    _linkWithFilterForm(formID) {
        if (formID) {
            this.form = this._getFilterForm(formID);
            this.form.onSubmit(this._getData.bind(this));
        }
    }

    _getFilterForm(formID) {
        return $(formID).data('FilterForm');
    }

    _getData(event) {
        event.preventDefault();
        var parameters = this.form.serialize();
        $(this.containerID).data('Table:client_params', parameters);
        $(this.containerID).data('Table:widget_params', this.widgetParams);
        this.tableview._fnAjaxUpdate();
    }

    _storeTableInDOM() {
        $(this.containerID).data('Table', this);
        $(this.containerID).data('Table:widget_params', this.widgetParams);
    }

    _initializeTableView() {
        this.tableview = datatableview.initialize($(this.containerID + '_t'), {
            tableID: this.containerID,
            endpointName: this.endpointName,
            initComplete: this._initSubmit
        });
    }

    _initSubmit() {
        if (this.formID && this.tableview) {
            $(this.formID).trigger("submit");
        }
    }

    static register(element) {
        var tableData = $(element).data("django-querybuilder-table");
        var api = new QuerybuilderAPI(tableData.endpointUrl);
        return new Table(tableData.containerID, tableData.formID, tableData.endpointName,
            api, tableData.params);
    }

}

registerWidgetClass("table", Table);

export default Table;