Blog

Seleção global dos elementos da coluna em tabelas html

Em casos onde temos mais de uma coluna com o recurso de seleção global dentro de uma tabela html, podemos usar o exemplo abaixo para controlar qual elemento foi selecionado.

<th data-sortable="false" width="150px" class="text-danger">
    <input class="form-check-input" type="checkbox" id="chkSelectAllRem" />
    <label for="chkSelectAllRem">Todas/Nenhuma</label>
</th>
<th data-sortable="false" width="150px" class="text-success">
    <input class="form-check-input" type="checkbox" id="chkSelectAllEnc" />
    <label for="chkSelectAllEnc">Todas/Nenhuma</label>
</th>

...

<td>
    <div class="form-check">
        <input class="form-check-input" type="checkbox" name="op_rem[]" value="<?= $row->id_pr_ordens ?>"
               id="op_rem.<?= $row->id_pr_ordens ?>">
        <label class="form-check-label text-danger" for="op_rem.<?= $row->id_pr_ordens ?>">Remover</label>
    </div>
</td>
<td>
    <div class="form-check">
        <input class="form-check-input" type="checkbox" name="op_enc[]" value="<?= $row->id_pr_ordens ?>"
               id="op_enc.<?= $row->id_pr_ordens ?>" />
        <label class="form-check-label text-success" for="op_enc.<?= $row->id_pr_ordens ?>">Encerrar</label>
    </div>
</td>

...

<script>
$("th input[type='checkbox']").on("change", function() {
    // remove seleção de todos checkboxes
    $('input[type="checkbox"]').not(this).prop("checked", false);
    // seleciona todos os elemento da coluna selecionada
    var cb = $(this), // checkbox that was changed
        th = cb.parent(), // get parent th
        col = th.index() + 1; // get column index. note nth-child starts at 1, not zero
    $("tbody td:nth-child(" + col + ") input").prop("checked", this.checked); // select the inputs and [un]check it
});

$(document).ready(function() {
    // uncheck other boxes on the same row
    $(".form-check-input").click(function() {
        $('input[type="checkbox"]').change(function() {
            $(this).closest('tr').find('input[type="checkbox"]').not(this).prop('checked', false);
        });
    });
});
</script>

Atualizando estado da linha da tabela com jQuery

De acordo com o conteúdo de cada linha de uma tabela html podemos modificar as propriedades dos elementos usando jQuery.

No exemplo abaixo temos uma tabela onde atribuímos os valores a serem observados nos campos data dentro da tag <tr>.

<form action="<?= $acao_aplicar ?>" method="post" id="form1">
    <input type="hidden" name="id_requisicao" value="<?= $requisicao->id ?> ">
    <table class="table table-sm small table-striped" id="itensTable">
        <thead>
            <tr>
                <th>Item</th>
                <th>Produto</th>
                <th>Descrição</th>
                <th>Unidade</th>
                <th class="text-end">Qt. Calculada</th>
                <th class="text-end">Saldo</th>
                <th width="140px" class="text-end">Qt. Solicitada</th>
            </tr>
        </thead>

        <tbody>
            <?php foreach ($itens as $row): ?>
                <tr class="align-middle" data-produto-ativo="<?= $row->produto_ativo ?>"
                    data-quantidade="<?= $row->qt_solicitada ?>">
                    <!-- item -->
                    <td>
                        <?= $row->item ?>
                    </td>
                    <!-- produto -->
                    <td>
                        <?= $row->produto_codigo ?>
                    </td>
                    <!-- descricao -->
                    <td>
                        <?= $row->produto_descricao ?>
                    </td>
                    <!-- unidade -->
                    <td>
                        <?= $row->produto_unidade ?>
                    </td>
                    <!-- quantidade calculada -->
                    <td class="text-end">
                        <?= number_format($row->qt_calculada, 3, ',', '.') ?>
                    </td>
                    <!-- saldo -->
                    <td class="text-end">
                        <?= number_format($row->saldo, 3, ',', '.') ?>
                    </td>
                    <!-- quantidade solicitada -->
                    <td>
                        <input type="hidden" name="id[]" value="<?= $row->id ?>">
                        <input type="number" style="text-align:right" class="form-control form-control-sm"
                               name="qt_solicitada[]" value="<?= $row->qt_solicitada ?>" required>
                    </td>
                </tr>
            <?php endforeach ?>
        </tbody>

    </table>
</form>

Em seguida, o código jQuery faz as alterações nos elementos.

<script>
    $(document).ready(function () {
        $('#itensTable tbody tr').each(function () {
            var produto_ativo = $(this).data('produto-ativo');
            var quantidade = $(this).data('quantidade');
            if (produto_ativo === 'f') {
                $(this).find('td').addClass('text-danger');
                $(this).find('input').prop('disabled', true);
                $(this).find('input').prop('required', false);
            }
            if (quantidade == 0) {
                $(this).find('td').addClass('text-secondary');
                $(this).find('input').prop('disabled', true);
                $(this).find('input').prop('required', false);
            }
        });
    });
</script>

Dica: nunca utilize underscore nos nomes dos campos data (ex: data-produto_inativo).

XDebug no VSCode para CodeIgniter 4

A junção do PHP com o XDebug permite a depuração do código em passos com a visualização dos valores das variáveis em tempo real.

Para quem tem projetos CI4, a configuração abaixo deve ser inserida no arquivo launch.json do VSCode.

{
    "name": "CI4 Spark XDebug",
    "type": "php",
    "request": "launch",
    "runtimeArgs": [
        "spark",
        "serve",
        "-dxdebug.mode=debug",
        "-dxdebug.start_with_request=yes",
        "-S",
        "localhost:8080",
    ],
    "env": {
        "XDEBUG_MODE": "debug",
        "XDEBUG_SESSION": "factor",
    },
    "externalConsole": false,
    "program": "",
    "cwd": "${workspaceRoot}",
    "port": 9003,
    "serverReadyAction": {
        "action": "openExternally",
        "killOnServerStop": false
}

Campos DATA de bancos MySQL no PDI

Dependendo da versão das bibliotecas de acesso a um banco MySQL, o Pentaho pode retornar erro ao ler colunas do tipo DATE, especialmente no que se refere à interpretação do fuso horário.

A mensagem que normalmente aparece é

HOUR_OF_DAY: 0 -> 1

Definindo o fuso horário nas opções de carga dos aplicativos do PDI resolve esse problema. Por exemplo, colocando a definição “-Duser.timezone=GMT-3” dentro do spoon.bat na linha set OPT=…

Executando jobs e transformações do Pentaho no prompt de comando

Não necessariamente somos obrigados a configurar um PDI Server para agendar a execução dos trabalhos e transformações em um servidor.

É possível executar um comando no servidor que dispara a rotina desejada.

Para executar transformações (ktr) usamos o seguinte comando:

sh pan.sh -rep: -file=<arquivo>.ktr

Para executar trabalhos (kjb) usamos o seguinte comando:

sh kitchen.sh -rep: -file=<arquivo>.kjb

Instalando o PDI 9.3 no Windows 10/11

Passos:

Opcionalmente, para fixar o atalho no menu iniciar, crie uma pasta (ex: Extras) em %appdata%/Microsoft/Windows/Start Menu/Programs/ e mova o arquivo do atalho para essa pasta. Na sequencia, abra o menu iniciar e procure pelo nome do atalho, a opção de fixar em iniciar estará disponível.

Scroll natural do mouse no Windows 10/11

Se você também alterna o uso entre desktops Linux/Mac/Windows já percebeu que o único sistema que inverte a ordem do scroll no mouse é o Windows.

Graças a esse comando abaixo, executado no power shell em modo administrador, você pode alterar esse comportamento.

$mode = Read-host "How do you like your mouse scroll (0 or 1)?"; Get-PnpDevice -Class Mouse -PresentOnly -Status OK | ForEach-Object { "$($_.Name): $($_.DeviceID)"; Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Enum\$($_.DeviceID)\Device Parameters" -Name FlipFlopWheel -Value $mode; "+--- Value of FlipFlopWheel is set to " + (Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Enum\$($_.DeviceID)\Device Parameters").FlipFlopWheel + "`n" }

Não esqueça de reiniciar seu Windows após a execução desse comando.

Fonte: https://gist.github.com/gagarine/d313ee6510009b3f3973c6e0929b1e1c

Alternando entre versões do PHP no MacOS

Você pode se deparar com a necessidade de executar um código baseado em uma versão específica do PHP no MacOS. Para tal podemos recorrer ao Docker ou a uma máquina virtual. Mas se você simplesmente quer usar o PHP direto no próprio sistema operacional, essa dica pode te ajudar.

A instalação das versões suportadas do PHP pode ser feita pelo brew e a troca das versões pode ser feita da seguinte maneira dentro do prompt de comando:

brew unlink php@8.2
brew link php@7.4

Para versões não mais suportadas do PHP, podemos utilizar o repositório shivammathur/php:

brew tap shivammathur/php
brew install shivammathur/php/php@7.3

Happy coding!

Oracle Cloud Free Tier

A Oracle oferece uma faixa gratuita de máquinas virtuais com recursos limitados que podem ajudar muito para pequenos projetos ou serviços temporários de avaliação.

https://www.oracle.com/cloud

Basta fazer um cadastro com fornecimento de um cartão de crédito (caso você ultrapasse a faixa gratuita, será debitado) para ter acesso ao painel de configuração.

Em Compute -> Instances podemos criar as máquinas virtuais. Atente para o selo “Always Free” ao lado de cada opção que fizer.

Juntamente com as instâncias, as redes (net e sub-net) são criadas.

Podemos escolher uma imagem de SO e uma plataforma de hardware. Essa combinação pode ou não ser gratuita de acordo com os recursos selecionados.

Nas configuração da rede criada, as configurações de portas do firewall deverão ser habilitadas bem como dentro do SO instalado.

Lembrando que a imagem Ubuntu fornecida é modificada pela Oracle e precisa da configuração do iptables para abrir portas. Exemplo:

sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 443 -j ACCEPT
sudo netfilter-persistent save

Migrando um site WordPress

Existem várias formas de migrar um site em WordPress entre servidores diferentes.

Aqui seguem alguns passos sobre uma forma de executar esse processo.

  1. Certifique-se de que o sistema de recuperação de senha está funcionando no site origem. Após a migração a conta do administrador pode sofrer alteração de senha e você pode ficar com dificuldade em logar novamente no servidor destino.
  2. Instalar o plugin UpdraftPlus WordPress Backup na origem. Esse plugin também poderá ser usado para backup com armazenamento nos serviços de nuvem.
  3. Faça um backup dentro desse plugin em Backup/Restauração.
  4. Em Backups Existentes, baixe o arquivo de cada recurso para sua máquina local (Banco de dados, Plugins, Temas, etc).
  5. No servidor destino, crie um site padrão WordPress que vai receber o backup. Atenção para o detalhe da senha do administrador que será alterada após a restauração do backup para o valor usado no site de origem.
  6. Altere o registro DNS para apontar para o IP do servidor destino.
  7. Ative a versão ssl do site com o comando:
    certbot –apache –redirect -d site.com -m user@mail.com –agree-tos
  8. Acesse o site destino e instale o plugin UpdraftPlus WordPress Backup.
  9. Enviar os arquivos de backup para o servidor e executar a restauração.
  10. Deletar as pasta antigas (delete old folders).
  11. Verifique se os links estão funcionando. Caso necessário, altere os links permanentes para o formato padrão.