Please consider this file:

Specifically the following lines from load method of Ext.field.Panel:

        if (options.waitMsg) {
            if (typeof waitMsg === 'string') {
                waitMsg = {
                    xtype: 'loadmask',
                    message: waitMsg


        if (api) {
            api =, me);
            load = api.load;
            if (!load) {
                Ext.raise("Cannot find Ext Direct API method for load action");
            args = load.$directCfg.method.getArgs({
                params: me.getParams(options.params),
                paramOrder: me.getParamOrder(),
                paramsAsHash: me.getParamsAsHash(),
                scope: me,
                callback: function(data, response, success) {
                    if (success) {
                        successFn(response, data);
The lines highlighted in green correctly create a mask when
PHP Code:
is specified. However the line highlighted in red always removes the mask, even when one was NOT created by the load method itself.

In our case, our application is creating a mask while submitting the form, but does NOT need the mask to be removed after the submit is complete as we have other work to do where the user needs to wait. So, we do NOT specify waitMsg on the field Panel in the submit call but create it ourselves before invoking submit. However the field panel still removes the mask (without checking for
PHP Code:
in the callback).

Yeah, the fix is easy. We create the mask again in our success callback. However it would be nice to have this fixed in the toolkit where the mask is removed by the toolkit only if it created it in the first place.