Home Reference Source

js/delegate/FormControllerDelegate.js

/**
 * Represents a form.
 * @interface
 */
export default class FormControllerDelegate {
    /**
     * Called when the form attempts to submit.
     * @param {FormController} controller
     * @param {FormError[]} errors
     */
    formDidError(controller, errors) {
        void 0;
    }

    /**
     * Called right before the form will submit.
     * @param {FormController} controller
     * @return {?boolean} if this returns. The return value will override
     *                    submission.
     */
    formWillSubmit(controller) {
        return void 0;
    }

    /**
     * Called right after the form has submited (succesful validation)
     * @param {FormController} controller
     */
    formDidSubmit(controller) {
        void 0;
    }
}

/**
 * Submits to same endpoint as original form but instead
 * @abstract
 */
export class AJAXFormControllerDelegate extends FormControllerDelegate {
    /**
     * Will perform AJAX submission for the form. If you are subclassing use
     * `return super.formWillSubmit(controller);`.
     *
     * @override
     * @param  {FormController} controller Form controller to request.
     * @return {boolean} Always false
     */
    formWillSubmit(controller) {
        this._performRequest(controller, controller.request);
        return false;
    }

    async _performRequest(controller, request) {
        this.setProgressState(controller, true);
        try {
            let response = await request.run();
            this.didSubmissionSuccess(controller, response);
        } catch(error) {
            this.didSubmissionError(controller, error);
        } finally {
            this.setProgressState(controller, false);
        }
    }

    /**
     * Sets the form's progress state.
     * @param {FormController} controller - FormController
     * @param {boolean} state - Loading state to set to.
     * @param {Object} response - Response data
     */
    setProgressState(controller, state) { return void 0; }

    /**
     * Called when AJAX finished with no error.
     * @param {FormController} controller - FormController
     * @param {Object} response - Response data
     */
    didSubmissionSuccess(controller, response) { return void 0; }

    /**
     * Called when AJAX errored
     * @param {FormController} controller - FormController
     * @param {Object} error - Error object
     * @param {number} status - Error status code.
     */
    didSubmissionError(controller, error) { return void 0; }
}