Please consider this file:
https://docs.sencha.com/extjs/6.7.0/...anel.js-1.html

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

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

            me.setMasked(waitMsg);
        }

        if (api) {
            api = Ext.direct.Manager.resolveApi(api, me);
            me.setApi(api);
 
            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) {
                    me.setMasked(false);
 
                    if (success) {
                        successFn(response, data);
                    }
The lines highlighted in green correctly create a mask when
PHP Code:
options.waitMsg 
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:
options.waitMsg 
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.