Como carregar último valor informado em cada campo do Formulário

Visão Geral

Neste tópico vamos descobrir como carregar o último valor informado em cada campo pelo usuário, para facilitar por exemplo, o preenchimento de campos de filtros e parâmetros.

Este tutorial se aplica apenas aos campos usados no Formulário. Esta abordagem não funcionará para os parâmetros da Consulta.

Estrutura do Formulário

Para desenvolver o Formulário, vamos precisar apenas de uma variável chamada “autoCompleteFields” e de um arquivo Javascript, adicionado na seção “Arquivos Javascript”.

Variáveis

  • A variável autoCompleteKey é a chave identificadora do conjunto de campo/valor. Se nenhum valor for especificado nesta variável, o Cód. de Atualização do Formulário será utilizado como identificador, fazendo com que cada Formário tenha seu próprio conjunto de campo/valor. Use essa variável para ter mais controle sobre qual conjunto de campo/valor será usado.

  • A variável autoCompleteFields precisa receber o nome de todos os campos que vão ser tratados pela rotina de autocompletar. Use , (vírgula) para separar o nome dos campos.

Use o evento "Load" do Formulário para preencher essa variaveis.

Arquivo Javascript

Adicione o código a seguir na seção de Arquivo Javascripts do Formulário. Este código vai preencher os campos logo que o Formulário for carregado e vai armazenar o valor dos campos sempre que um evento for disparado, levando em consideração o nome dos campos informados na variável “autoCompleteFields”.

const formState = (function () {

    const _storageKeyPrefix = 'la_fieldstate:';
    let _storageKey;
    let _storageKeyPrev;

    // A variável "autoCompleteFields" recebe o nome dos campos que serão tratados
    // na rotina de autocompletar, separados por "," (vírgula)
    let _autoCompleteFields;
    let _autoCompleteFieldsPrev;

    // Adiciona Callbacks no Formulário
    latromi.formManager.setOnFormCreatedCallback(onFormCreated);
    latromi.formManager.setOnEventFiringCallback(onEventFiring);
    latromi.formManager.setOnFieldValueChangedCallback(onFieldValueChanged);

    // Ocorre logo após o form ser inicializado
    function onFormCreated(ev) {

        // O Valor da variável do Formulário "autoCompleteKey" pode ser 
        // usada como identificador do conjunto. Se nenhum valor for especificado, 
        // a chave será o Código de Atualização do Formulário.
        _storageKey = ev.form.getVariableValue('autoCompleteKey');
        //
        if (_storageKey === null || _storageKey === undefined || _storageKey === '')
            _storageKey = ev.form.upgradeCode

        // Alimenta a variável javascript com o valor da variável do Formulário.
        _autoCompleteFields = ev.form.getVariableValue('autoCompleteFields');

        // Carrega o valor dos campos
        loadFieldsState(_storageKey, _autoCompleteFields);
    }

    // Ocorre quando um evento é disparado no Form
    function onEventFiring(ev) {

        // Armazena o valor dos campos
        storeFieldsState(
            _storageKeyPrev || _storageKey,
            _autoCompleteFields || _autoCompleteFieldsPrev
        );
    }

    // Ocorre quando o valor de um campo é alterado no Form
    function onFieldValueChanged(ev) { }

    function loadFieldsState(storageKey, fields) {

        if (!fields) return;
        
        if (!storageKey) {
            console.error('Argument "storageKey" must be specified.');
            return;
        }

        const form = latromi.formManager.getFormInstance();
        const json = localStorage.getItem(_storageKeyPrefix + storageKey);
        if (json && json.indexOf("{") === 0) {
            const state = JSON.parse(json);
            if (state) {
                Object.keys(state).forEach(function (key) {
                    // Verifica se o campo está marcado para autocompletar
                    if (new RegExp('\\b' + key + '\\b').test(fields))
                        form.setFieldValue(key, state[key]);
                });
            }
        }

        _storageKeyPrev = storageKey;
        _autoCompleteFieldsPrev = fields;
    }

    function storeFieldsState(storageKey, fields) {

        if (!fields) return;
        
        if (!storageKey) {
            console.error('Argument "storageKey" must be specified.');
            return;
        }

        const form = latromi.formManager.getFormInstance();
        const state = {};
        Object.keys(form.fields).forEach(function (key) {
            // Verifica se o campo está marcado para autocompletar
            if (new RegExp('\\b' + key + '\\b').test(fields))
                state[key] = form.getFieldValue(key);
        });
        localStorage.setItem(_storageKeyPrefix + storageKey, JSON.stringify(state));
    }


    // Todas as funções acima são "privadas", e não podem ser chamadas externamente.
    // As únicas funções que podem ser chamadas externamente são as que compões o resultado a seguir:
    return {
        load: function (options) {
            if (!options) options = {};
            if (!options.key) options.key = options.key = _autoCompleteFields;
            if (!options.fields) options.fields = options.fields = _autoCompleteFields;

            loadFieldsState(
                options.key || _storageKeyPrev,
                options.fields || _autoCompleteFields
            );
        },
        store: function (options) {
            if (!options) options = {};
            if (!options.key) options.key = options.key = _autoCompleteFields;
            if (!options.fields) options.fields = options.fields = _autoCompleteFields;

            storeFieldsState(
                options.key || _storageKeyPrev,
                options.fields || _autoCompleteFields,
            );
        }
    }
})();

1 curtida