markusslima / bootstrap-filestyle

jQuery customization of input html file for Bootstrap Twitter

Home Page:http://markusslima.github.io/bootstrap-filestyle/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

How it works?

renanleandrof opened this issue · comments

Hello,
I have 2 pages with the same HTML, CSS structure that display a file input in a modal (bootstrap).
It works fine on one, but not on the other. On the failing page, when i click the Choose button, nothing happens.

How does Filestyle works?

I couldn't find any javascript event in the button to trigger the browser choose files. I believe if i understand how does it work, i can find the problem...

I need an example or code to analyze, anyway, I find your problem and order of javascript.

Cara preciso de um exemplo ou código pra poder analisar, de qualquer forma, acho seu problema e ordem de javascript.

 , prepararUploadAjax: function () {
        $('.file-uploader').each( (i, element) => {
            let inputUpload = $(element);
            inputUpload.filestyle( {htmlIcon: "<i class='far fa-folder-open'></i> ", text: "Enviar", buttonBefore :true, btnClass : "btn-danger"});
        });
    }

Is the same javascripts that runs on both pages.

Dude, can you send as much code as possible? Because this is difficult to help.

Cara dá pra você enviar o máximo de código possível? Por que assim fica difícil de ajudar.

The code:

const CamposDinamicos = {
    template: `<div class='col-md-{3}'><div class='form-group'><label for='campo_{0}'>{1}</label>{2}</div></div>`

    , templateObrigatorio: `<div class='col-md-{3}'>
                                <div class='form-group'>
                                    <label for='campo_{0}'>{1}</label> 
                                    <div class='input-group'>{2}
                                        <span class='input-group-addon' data-toggle='tooltip' title='Obrigatório'><i class='fa fa-asterisk'></i></span> 
                                    </div>
                                </div>
                            </div>`

    , templateCheckbox: `<div class='col-md-{3}'>
                            <div class="checkbox c-checkbox needsclick c-checkbox-no-font">
                                <label class="needsclick" for='campo_{0}'>
                                    {2}
                                    <span class="glyphicon glyphicon-ok"></span>
                                    {1}
                                </label>
                            </div>
                        </div>`

    , gerarFormulario: function (campos, target, idFormParaValidacao) {
        $(target).html("");
        cgu.sortByKey(campos, "ordem");
        campos.filter(function (f) {
            return f.id.campo.ativo;
        }).forEach(function (c) {
            const campo = c.id.campo;
            const obrigatorio = c.obrigatorio;
            const tamanhoFormulario = c.tamanhoFormulario;
            try {
                const html = CamposDinamicos.gerarCampo[campo.formato](campo, obrigatorio, tamanhoFormulario);
                $(target).append(html);
            } catch (err) {
                console.log(c);
                console.log(err);
                cgu.exibirErro("Não foi possível renderizar o campo dinâmico do formato: " + campo.formato);
            }
        });
        $("[data-toggle='tooltip']").tooltip();
        $("[data-campo-dinamico=true][data-autocomplete-tipo]").each(function () {
            Autocomplete.criarAutocomplete($(this));
        });
        cgu.aplicarMascaraMoney();
        CamposDinamicos.gerarValidacaoDoForm(campos, idFormParaValidacao);
        CamposDinamicos.prepararUploadAjax();
    }

    , gerarCampo: {
        decidirObrigatorio: function (input, campo, obrigatorio, tamanho, apenasCampo = false) {
            if (apenasCampo) {
                return input;
            }
            return obrigatorio ?
                cgu.format(CamposDinamicos.templateObrigatorio, campo.id, campo.nome, input, tamanho) :
                cgu.format(CamposDinamicos.template, campo.id, campo.nome, input, tamanho);
        }

        , TEXTO_CURTO: function (campo, obrigatorio, tamanho, apenasCampo) {
            const input = cgu.format("<input type='text' id='campo_{0}' name='{2}' placeholder='{1}' class='form-control' " +
                "data-campo-dinamico='true' data-toggle='tooltip' data-placement='bottom' title='{1}'/>",
                campo.id, campo.tooltip, campo.alias);
            return CamposDinamicos.gerarCampo.decidirObrigatorio(input, campo, obrigatorio, tamanho, apenasCampo);
        }

        , TEXTO_LONGO: function (campo, obrigatorio, tamanho, apenasCampo) {
            const input = cgu.format("<textarea id='campo_{0}' name='{1}' rows='4' class='form-control' " +
                "data-toggle='tooltip' data-placement='bottom' title='{1}' data-campo-dinamico='true'></textarea>",
                campo.id, campo.alias);
            return CamposDinamicos.gerarCampo.decidirObrigatorio(input, campo, obrigatorio, tamanho, apenasCampo);
        }

        , NUMERICO: function (campo, obrigatorio, tamanho, apenasCampo) {
            const input = cgu.format("<input type='number' id='campo_{0}' name='{2}' placeholder='{1}' class='form-control' " +
                "data-toggle='tooltip' data-placement='bottom' title='{1}' data-campo-dinamico='true'/>",
                campo.id, campo.tooltip, campo.alias);
            return CamposDinamicos.gerarCampo.decidirObrigatorio(input, campo, obrigatorio, tamanho, apenasCampo);
        }

        , VALOR: function (campo, obrigatorio, tamanho, apenasCampo) {
            const input = cgu.format("<input type='text' id='campo_{0}' name='{2}' placeholder='{1}' class='form-control money-mask' " +
                "data-toggle='tooltip' data-placement='bottom' title='{1}' data-campo-dinamico='true'/>",
                campo.id, campo.tooltip, campo.alias);
            return CamposDinamicos.gerarCampo.decidirObrigatorio(input, campo, obrigatorio, tamanho, apenasCampo);
        }

        , DATA: function (campo, obrigatorio, tamanho, apenasCampo) {
            const input = cgu.format("<input type='date' id='campo_{0}' name='{2}' placeholder='{1}' class='form-control' " +
                "data-toggle='tooltip' data-placement='bottom' title='{1}' data-campo-dinamico='true'/>",
                campo.id, campo.tooltip, campo.alias);
            return CamposDinamicos.gerarCampo.decidirObrigatorio(input, campo, obrigatorio, tamanho, apenasCampo);
        }

        , DATA_HORA: function (campo, obrigatorio, tamanho, apenasCampo) {
            const input = cgu.format("<input type='datetime-local' id='campo_{0}' name='{2}' placeholder='{1}' class='form-control' " +
                "data-toggle='tooltip' data-placement='bottom' title='{1}' data-campo-dinamico='true'/>",
                campo.id, campo.tooltip, campo.alias);
            return CamposDinamicos.gerarCampo.decidirObrigatorio(input, campo, obrigatorio, tamanho, apenasCampo);
        }

        , LISTA: function (campo, obrigatorio, tamanho, apenasCampo) {
            let options = "<option value=''>-- Selecione --</option>";
            campo.dominioCampoLista.forEach(function (v) {
                options += cgu.format("<option value='{0}'>{1}</option>", v.id, v.valor);
            });
            const input = cgu.format("<select id='campo_{0}' name='{2}' class='form-control' " +
                "data-campo-dinamico='true' data-toggle='tooltip' data-placement='bottom' title='{1}'>{3}</select>",
                campo.id, campo.tooltip, campo.alias, options);
            return CamposDinamicos.gerarCampo.decidirObrigatorio(input, campo, obrigatorio, tamanho, apenasCampo);
        }

        , LISTA_MULTIVALOR: function (campo, obrigatorio, tamanho, apenasCampo) {
            let options = "";
            campo.dominioCampoLista.forEach(function (v) {
                options += cgu.format("<option value='{0}'>{1}</option>", v.id, v.valor);
            });
            const input = cgu.format("<select id='campo_{0}' multiple='multiple' name='{2}' class='form-control' " +
                "data-campo-dinamico='true' data-toggle='tooltip' data-placement='bottom' title='{1}'>{3}</select>",
                campo.id, campo.tooltip, campo.alias, options);

            return CamposDinamicos.gerarCampo.decidirObrigatorio(input, campo, obrigatorio, tamanho, apenasCampo);
        }

        , BOOLEANO: function (campo, obrigatorio, tamanho, apenasCampo) {
            const input = cgu.format("<input type='checkbox' id='campo_{0}' name='{1}' data-campo-dinamico='true'/>",
                campo.id, campo.alias);
            return cgu.format(CamposDinamicos.templateCheckbox, campo.id, campo.nome, input, tamanho, apenasCampo);
        }

        , REFERENCIA: function (campo, obrigatorio, tamanho, apenasCampo) {
            let input = `<div class='input-group autocomplete-criar'>
                            <input type='text' id='campo_${campo.id}' name='${campo.alias}' placeholder='${campo.tooltip}' class='form-control'
                                data-campo-dinamico='true' data-autocomplete-tipo='${campo.entidadeReferenciada}' data-autocomplete-maximo-itens='1' 
                                data-busca-avancada='${campo.entidadeReferenciada}' data-criacao-entidade='${campo.criar ? 'Criar':''}'/>
                            <span class="input-group-btn" data-toggle="tooltip" title="Busca Avançada">
                                <a href="#" class="btn btn-warning"><i class="fa fa-filter"></i></a>
                            </span>
                            ${obrigatorio ? "<span class='input-group-addon' data-toggle='tooltip' title='Obrigatório'><i class='fa fa-asterisk'></i></span>" : ""}
                         </div>`;

            if (!apenasCampo && campo.criar) {
                input = `<span class='btn-autocomplete-criar pull-right'>
                            <a href='#' class='btn btn-primary'><i class='fa fa-plus'></i> Criar</a>
                        </span>${input}`;
            }
            return CamposDinamicos.gerarCampo.decidirObrigatorio(input, campo, false, tamanho, apenasCampo);
        }

        , REFERENCIAS: function (campo, obrigatorio, tamanho, apenasCampo) {
            let input = `<div class='input-group autocomplete-criar'>
                            <input type='text' id='campo_${campo.id}' name='${campo.alias}' placeholder='${campo.tooltip}' class='form-control'
                                data-campo-dinamico='true' data-autocomplete-tipo='${campo.entidadeReferenciada}' data-autocomplete-maximo-itens='15' 
                                data-busca-avancada='${campo.entidadeReferenciada}' data-criacao-entidade='${campo.criar ? 'Novo':''}'/>
                            <span class="input-group-btn" data-toggle="tooltip" title="Busca Avançada">
                                <a href="#" class="btn btn-warning"><i class="fa fa-filter"></i></a>
                            </span>
                            ${obrigatorio ? "<span class='input-group-addon' data-toggle='tooltip' title='Obrigatório'><i class='fa fa-asterisk'></i></span>" : ""}
                         </div>`;

            if (!apenasCampo && campo.criar) {
                input = `<span class='btn-autocomplete-criar pull-right'>
                            <a href='#' class='btn btn-primary'><i class='fa fa-plus'></i> Novo</a>
                        </span>${input}`;
            }

            return CamposDinamicos.gerarCampo.decidirObrigatorio(input, campo, false, tamanho, apenasCampo);
        }

        , ARQUIVO: function (campo, obrigatorio, tamanho, apenasCampo) {
            const input = `
                <div class="row">
                    <div class="col-xs-9">
                        <input type='file' id='campo_${campo.id}' name='upload${campo.alias}' placeholder='${campo.tooltip}' 
                                    class='form-control file-uploader' data-id-campo-dinamico="${campo.id}"/>
                        <input type='hidden' id='uploadCampo_${campo.id}' name='${campo.alias}' data-campo-dinamico='true'/>
                    </div>
                    <div class="col-xs-3" id="progress_${campo.id}"></div>
                </div>`;


            return CamposDinamicos.gerarCampo.decidirObrigatorio(input, campo, obrigatorio, tamanho, apenasCampo);
        }

        , ARQUIVOS: function (campo, obrigatorio, tamanho, apenasCampo) {

            const input =
                `<span class='btn-autocomplete-criar pull-right'>
                <a href='#' class='btn btn-primary' id="btnNovoArquivo_${campo.id}" onclick='CamposDinamicos.adicionarArquivo("${campo.id}", "${campo.alias}", "${campo.tooltip}");'><i class='fa fa-plus'></i> Novo</a>
                </span>
                <div><br></div>
                <div class="panel panel-default" id="" style="">
                <div id="lista_wrapper" class="dataTables_wrapper form-inline dt-bootstrap no-footer">
                <table id="tabela_arquivos_campo_${campo.id}" class="table table-hover table-striped table-bordered width="100%">
                    <caption class="hidden"></caption>
                    <thead>
                    <tr>
                        <th>Arquivo</th><th>Descrição</th><th>Ação</th>
                    </tr>
                    </thead>
                    <tbody id='tabelaArquivo_${campo.id}'>
                    </tbody>
                </table>
                </div>
                </div>`;

            return CamposDinamicos.gerarCampo.decidirObrigatorio(input, campo, obrigatorio, tamanho, apenasCampo);
        }
    }

    , adicionarArquivo: function (id, alias, tooltip ) {

        let idAleatorio =  Math.random().toString().split('.')[1];
        const input =
            `<tr id="${idAleatorio}">
                <td>
                    <input type='file' id='campo_${idAleatorio}' name='upload${idAleatorio}' placeholder='${tooltip}' 
                    class='form-control file-uploader' data-id-campo-dinamico="${idAleatorio}"/>
                    <input type='hidden' id='uploadCampo_${idAleatorio}' name='${alias}' data-campo-dinamico='true' data-formato-campo='ARQUIVOS'/>
                    <div class="col-xs-12" id="progress_${idAleatorio}"></div>
                </td>
                <td>
                    <input type='text' id='descricao_${idAleatorio}' name='descricao_${idAleatorio}' maxlength="200" size="80" disabled="true" class="form-control"
                    onblur="CamposDinamicos.atualizarDescricaoArquivo('${idAleatorio}');"/>
                </td>
                <td class="dt-center">
                    <button type="button" onclick="CamposDinamicos.removerArquivo('${idAleatorio}');" title="Remover arquivo" class="btn btn-danger"><i class="fas fa-trash"></i></button>                   
                </td>
            </tr>`;

        $("#tabelaArquivo_" + id).append(input);
        CamposDinamicos.prepararUploadAjax();
    }

    , removerArquivo: function (idLinhaArquivo) {
        $('#' + idLinhaArquivo).remove();
    }

    , atualizarDescricaoArquivo: function (id) {
        const idArquivo = $('#campo_' + id).val();
        const descArquivo = $('#descricao_' + id).val();
        if (!cgu.isStringVaziaNullOuUndefined(idArquivo) && !cgu.isStringVaziaNullOuUndefined(descArquivo)) {
            $.ajax({
                type: "POST",
                data: descArquivo,
                contentType: "application/json",
                dataType: "json",
                url: springUrl + "api/auth/arquivo/" + idArquivo + "/atualizardescricao"
            });
        }
    }

    , serializarFormulario: function (formId) {
        let valor;
        const camposDinamicos = {};
        $(formId + " [data-campo-dinamico]").each(function () {
            if ($(this).is(":checkbox")) {
                valor = !!$(this).is(":checked");
            } else {
                valor = $(this).val();
                if (valor !== null) {
                    valor = valor.toString();
                }
            }
            if ($(this).data("formato-campo") === "ARQUIVOS") {
                if (!cgu.isStringVaziaNullOuUndefined(camposDinamicos[$(this).attr("name")]) && !cgu.isStringVaziaNullOuUndefined(valor)) {
                    valor = camposDinamicos[$(this).attr("name")] + ',' + valor;
                }
            }
            camposDinamicos[$(this).attr("name")] = valor;
        });
        return camposDinamicos;
    }

    , gerarValidacaoDoForm: function (campos, idFormParaValidacao) {
        if (cgu.isNullOuUndefined(idFormParaValidacao)) {
            return;
        }

        const validation = {rules: {}};
        campos.forEach(function (c) {
            if (c.obrigatorio) {
                validation.rules[c.id.campo.alias] = {required: true};
            }
        });

        $(idFormParaValidacao).validate(validation);
    }
    
    , prepararUploadAjax: function () {
        $('.file-uploader').each( (i, element) => {
            let inputUpload = $(element);
            inputUpload.fileupload({
                url: springUrl + "api/auth/arquivo/novo",
                dataType: "json",
                done: function (e, data) {
                    let idCampoDinamico = inputUpload.data("id-campo-dinamico");
                    $(`#uploadCampo_${idCampoDinamico}`).val(data._response.result.id);
                    $(`#descricao_${idCampoDinamico}`).prop("disabled", false);
                },
                progressall: function (e, data) {
                    let progress = parseInt(data.loaded / data.total * 100, 10);
                    let idCampoDinamico = inputUpload.data("id-campo-dinamico");
                    if (progress !== 100) {
                        let progressDecimal = (progress + "").substr(0, 1);
                        $(`#progress_${idCampoDinamico}`).html(`<div class="radial-bar radial-bar-${progressDecimal}0 radial-bar-sm radial-bar-danger" data-label="${progress}%"></div>`);
                    } else {
                        $(`#progress_${idCampoDinamico}`).html("");
                    }
                }
            });

            inputUpload.filestyle( {htmlIcon: "<i class='far fa-folder-open'></i> ", text: "Enviar", buttonBefore :true, btnClass : "btn-danger"});
        });
    }

};

That code generates a dinamic form, based on some database configuration.
In that specific case, it's beeing generated by this input:

CamposDinamicos.gerarFormulario({[{"@id":2,"id":{"tipoInteracao":1,"campo":{"alias":"Providencias","ativo":true,"campoDaEntidadeConcreta":false,"classeCampoPadrao":null,"criar":false,"dominioCampoLista":[],"entidadeReferenciada":"","formato":"TEXTO_LONGO","formatoReferenciaOuReferencias":false,"id":39,"mascara":"","nome":"Providências ","tooltip":"Registre as providências"}},"obrigatorio":false,"ordem":2,"tamanhoFormulario":12,"campo":{"alias":"Providencias","ativo":true,"campoDaEntidadeConcreta":false,"classeCampoPadrao":null,"criar":false,"dominioCampoLista":[],"entidadeReferenciada":"","formato":"TEXTO_LONGO","formatoReferenciaOuReferencias":false,"id":39,"mascara":"","nome":"Providências ","tooltip":"Registre as providências"},"tipoInteracao":1},{"@id":3,"id":{"tipoInteracao":1,"campo":{"alias":"Anexo","ativo":true,"campoDaEntidadeConcreta":false,"classeCampoPadrao":null,"criar":false,"dominioCampoLista":[],"entidadeReferenciada":"","formato":"ARQUIVO","formatoReferenciaOuReferencias":false,"id":40,"mascara":"Anexo","nome":"Arquivos em Anexo","tooltip":"Arquivos em Anexo"}},"obrigatorio":false,"ordem":1,"tamanhoFormulario":12,"campo":{"alias":"Anexo","ativo":true,"campoDaEntidadeConcreta":false,"classeCampoPadrao":null,"criar":false,"dominioCampoLista":[],"entidadeReferenciada":"","formato":"ARQUIVO","formatoReferenciaOuReferencias":false,"id":40,"mascara":"Anexo","nome":"Arquivos em Anexo","tooltip":"Arquivos em Anexo"},"tipoInteracao":1}]}, "#camposDoTipoInteracao .campos-dinamicos", "#formInteracao");

The modal html:

<div class="modal fade" id="modalRegistrarInteracao" tabindex="-1" role="dialog" aria-labelledby="modalRegistrarInteracaoLabel">
    <form id="formInteracao" method="post">
        <div class="modal-dialog modal-lg" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Fechar"><span aria-hidden="true">&times;</span></button>
                    <h4 class="modal-title" id="tituloModalRegistrarInteracao">Registrar Interação</h4>
                </div>
                <div class="modal-body">
                    <div class="form-group">
                        <label for="idTipoInteracao">Tipo de Interação</label>
                        <div class="input-group">
                            <select class="form-control" id="idTipoInteracao" name="idTipoInteracao">
                            </select>
                            <span class="input-group-addon" data-toggle="tooltip" title="Obrigatório"><i class="fa fa-asterisk"></i></span>
                        </div>
                    </div>
                </div>
                <div class="" id="camposDoTipoInteracao" style="display:none;">
                    <div class="campos-dinamicos"><br/></div>
                </div>

                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">Cancelar</button>
                    <button type="button" class="btn btn-success" id="btnRegistrar" onclick=""><i class="fa fa-save"></i> Registrar</button>
                </div>
            </div>
        </div>
    </form>
</div>

I know is a lot of things, so, i've simplified the question to how does it work.
How your component knows that when i click the button, it should trigger the browser file browse?

Não existe click no filestyle, clicar em um input file de um formulário é falha de segurança e o próprio browser bloqueia.

done: function (e, data) {
   let idCampoDinamico = inputUpload.data("id-campo-dinamico");
   $(`#uploadCampo_${idCampoDinamico}`).val(data._response.result.id);
   $(`#descricao_${idCampoDinamico}`).prop("disabled", false);
   $(element).filestyle( {htmlIcon: "<i class='far fa-folder-open'></i> ", text: "Enviar", buttonBefore :true, btnClass : "btn-danger"});
},

Tenta isto

Deu não. Esse DONE é o evento que o outro componente de upload (pra fazer upload ajax) dispara após o upload ser concluído.

Eu ja tentei remover esse outro componente, só pra ver se ele estava interferindo, mas não é o caso. Até por que, em uma tela funciona e na outra não.

Qual que é a mágica pro botão "choose" do filestyle disparar a escolha de arquivos do navegador?
Eu vi que vc esconde o input normal usando o position:absolute + clip, mas não entendi como que o clique do botão dispara a escolha.. Talvez eu tenha algum código interferindo nessa forma sua.

Você tem um evento que chama essas telas. O Filestyle deve rodar por ultimo, outra coisa é que já há relatos de incompatibilidade com o fileupload. Mas não sei exatamente se é incompatibilidade.

É a label que referencia o campo.

Dá um inspect no resultado final do campo e print aqui. Tanto o que funciona e o que não funciona.

Certo, eu rodo ele por ultimo sim. Depois que os inputs já estão na tela, a modal já está exibida e tudo mais, aí eu chamo essa parte do filestyle e do fileupload.

Não funciona:

<div class="modal fade in" id="modalRegistrarInteracao" tabindex="-1" role="dialog" aria-labelledby="modalRegistrarInteracaoLabel" style="display: block; padding-right: 17px;">
    <form id="formInteracao" method="post" novalidate="novalidate">
        <div class="modal-dialog modal-lg" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Fechar"><span aria-hidden="true">×</span></button>
                    <h4 class="modal-title" id="tituloModalRegistrarInteracao">Registrar Interação</h4>
                </div>
                <div class="modal-body">
                    <div class="form-group">
                        <label for="idTipoInteracao">Tipo de Interação</label>
                        <div class="input-group">
                            <select class="form-control" id="idTipoInteracao" name="idTipoInteracao" aria-invalid="false"><option value="">-- Selecione --</option><option value="1">Registra Providência</option><option value="2">Cancelamento</option><option value="3">Enviar ao Gestor</option><option value="5">Suspender</option><option value="7">Solicitação de Providências</option><option value="4">Concluir Análise</option></select>
                            <span class="input-group-addon" data-toggle="tooltip" title="" data-original-title="Obrigatório"><i class="fa fa-asterisk"></i></span>
                        </div>
                    </div>
                </div>
                <div class="" id="camposDoTipoInteracao" style="">
                    <div class="campos-dinamicos"><div class="col-md-12"><div class="form-group"><label for="campo_40">Arquivos em Anexo</label>
                <div class="row">
                    <div class="col-xs-9">
                        <input type="file" id="campo_40" name="uploadAnexo" placeholder="Arquivos em Anexo" class="form-control file-uploader" data-id-campo-dinamico="40" tabindex="-1" style="position: absolute; clip: rect(0px, 0px, 0px, 0px);"><div class="bootstrap-filestyle input-group"><div name="filedrag" style="position: absolute; width: 100%; height: 36px; z-index: -1;"></div><span class="group-span-filestyle input-group-btn" tabindex="0"><label for="campo_40" style="margin-bottom: 0px; border-top-left-radius: 0.25rem; border-bottom-left-radius: 0.25rem;" class="btn btn-danger "><i class="far fa-folder-open"></i> <span class="buttonText">Enviar</span></label></span><input type="text" class="form-control " placeholder="" disabled=""> </div>
                        <input type="hidden" id="uploadCampo_40" name="Anexo" data-campo-dinamico="true">
                    </div>
                    <div class="col-xs-3" id="progress_40"></div>
                </div></div></div><div class="col-md-12"><div class="form-group"><label for="campo_39">Providências </label><textarea id="campo_39" name="Providencias" rows="4" class="form-control" data-toggle="tooltip" data-placement="bottom" title="" data-campo-dinamico="true" data-original-title="Providencias"></textarea></div></div></div>
                </div>

                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">Cancelar</button>
                    <button type="button" class="btn btn-success" id="btnRegistrar" onclick=""><i class="fa fa-save"></i> Registrar</button>
                </div>
            </div>
        </div>
    </form>
</div>

Funciona:

<div class="modal fade in" id="modalRegistrarInteracao" tabindex="-1" role="dialog" aria-labelledby="modalRegistrarInteracaoLabel" style="display: block; padding-right: 17px;">
    <form id="formInteracao" method="post" novalidate="novalidate">
        <div class="modal-dialog modal-lg" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Fechar"><span aria-hidden="true">×</span></button>
                    <h4 class="modal-title" id="tituloModalRegistrarInteracao">Registrar Interação</h4>
                </div>
                <div class="modal-body">
                    <div class="form-group">
                        <label for="idTipoInteracao">Tipo de Interação</label>
                        <div class="input-group">
                            <select class="form-control" id="idTipoInteracao" name="idTipoInteracao" aria-invalid="false"><option value="">-- Selecione --</option><option value="1">Registra Providência</option><option value="7">Solicitação de Providências</option><option value="2">Cancelamento</option><option value="3">Enviar ao Gestor</option><option value="4">Concluir Análise</option><option value="5">Suspender</option></select>
                            <span class="input-group-addon" data-toggle="tooltip" title="" data-original-title="Obrigatório"><i class="fa fa-asterisk"></i></span>
                        </div>
                    </div>
                </div>
                <div class="" id="camposDoTipoInteracao" style="">
                    <div class="campos-dinamicos"><div class="col-md-12"><div class="form-group"><label for="campo_40">Arquivos em Anexo</label>
                <div class="row">
                    <div class="col-xs-9">
                        <input type="file" id="campo_40" name="uploadAnexo" placeholder="Arquivos em Anexo" class="form-control file-uploader" data-id-campo-dinamico="40" tabindex="-1" style="position: absolute; clip: rect(0px, 0px, 0px, 0px);"><div class="bootstrap-filestyle input-group"><div name="filedrag" style="position: absolute; width: 100%; height: 36px; z-index: -1;"></div><span class="group-span-filestyle input-group-btn" tabindex="0"><label for="campo_40" style="margin-bottom: 0px; border-top-left-radius: 0.25rem; border-bottom-left-radius: 0.25rem;" class="btn btn-danger "><i class="far fa-folder-open"></i> <span class="buttonText">Enviar</span></label></span><input type="text" class="form-control " placeholder="" disabled=""> </div>
                        <input type="hidden" id="uploadCampo_40" name="Anexo" data-campo-dinamico="true">
                    </div>
                    <div class="col-xs-3" id="progress_40"></div>
                </div></div></div><div class="col-md-12"><div class="form-group"><label for="campo_39">Providências </label><textarea id="campo_39" name="Providencias" rows="4" class="form-control" data-toggle="tooltip" data-placement="bottom" title="" data-campo-dinamico="true" data-original-title="Providencias"></textarea></div></div></div>
                </div>

                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">Cancelar</button>
                    <button type="button" class="btn btn-success" id="btnRegistrar" onclick=""><i class="fa fa-save"></i> Registrar</button>
                </div>
            </div>
        </div>
    </form>
</div>

Está ai seu problema. Os Ids são iguais. O registro sempre valerá para o primeiro que achar

Não era isso não.. Mas me ajudou a identificar o problema!
Essas modais são exibidas em telas diferentes.
Na tela que nao funcionava tinha 2 inputs com id campo_40. Aí provavelmente o filestyle devia ta apontando pro primeiro, q não era um input.

Valeu a ajuda!
E parabéns pelo componente! É excelente.

Obrigado! Que bom que ajudei. :)
Se você não estiver usando nenhum plugin pra exibir mensagens dá uma olhada no que fiz recentemente.
https://markusslima.github.io/bird-alert/

Abraços