Ocultar Variação indisponivel

Opa, tem alguma maneira de ocultar a variação que esta sem estoque e mostrar somente as que ainda tem estoque, ou até mesmo aparecer um “x” no tamanho indisponivel para o clientes saber que nao tem?

1 curtida

Achei um bom tópico, não lembro de ter visto nenhuma dúvida ou tópico a respeito disso. Desenvolvi na pressa, mas acredito que deva funcionar.

  • Testei somente com um produto que tem grade de cores e tamanhos. Se tiver alguma grade diferente, pode ser que quebre alguma coisa, portanto, recomendo testar todos os cenários possíveis.
  • Desativei o clique do mouse, como não trabalho muito com variação tô meio por fora. Se quiser deixar habilitado é só remover no css: pointer-events: none.
  • Removi o svg de select da div, ou seja, mesmo que não tenha e você clique na variação, subia um ícone de check, agora não aparece mais.

Meu contato: (61) 9 8121-8775

<script>
$(document).ready(function () {
  const variacoesIndisponiveis = new Set();

  $('.acoes-produto.indisponivel').each(function () {
    const comboId = $(this).data('variacao-id');
    if (comboId) {
      variacoesIndisponiveis.add(comboId);
    }
  });

  $('.atributo-item').each(function () {
    const $item = $(this);
    const thisVarId = $item.data('variacao-id');
    let temDisponivel = false;

    $('.acoes-produto').each(function () {
      const $combo = $(this);
      const comboId = $combo.data('variacao-id');

      if ($combo.hasClass('indisponivel')) return;

      if (comboId && comboId.toString().split('-').includes(thisVarId.toString())) {
        temDisponivel = true;
        return false; // sai do each
      }
    });

    if (!temDisponivel) {
      $item.addClass('sem-estoque');
      $item.closest('li').find('div.selecionado').remove();
    }
  });
});
</script>
<style>
.atributo-item.sem-estoque {
  position: relative;
  opacity: 0.4;
  pointer-events: none;
}
.atributo-item.sem-estoque::after {
  content: '✖';
  color: red;
  font-size: 16px;
  font-weight: bold;
  position: absolute;
  top: 8px;
  right: 15px;
}
</style>


1 curtida

Cara funcionou velho! Obrigado, vou ate te fazer um pix de agradecimento, confirma se é o seu telefone

1 curtida

Vou te enviar o pix no privado. A propósito, melhorei ainda mais o script, vi que o site dispara o clique automático/seleciona a primeira variação, mesmo que ela esteja indisponível.

Com esse script, além de mostrar que os produtos não tem em estoque, ele ativa o clique/seleciona a primeira variação DISPONÍVEL.

<script>
$(document).ready(function () {
  const variacoesIndisponiveis = new Set();

  $('.acoes-produto.indisponivel').each(function () {
    const comboId = $(this).data('variacao-id');
    if (comboId) {
      variacoesIndisponiveis.add(comboId);
    }
  });

  $('.atributo-item').each(function () {
    const $item = $(this);
    const thisVarId = $item.data('variacao-id');
    let temDisponivel = false;

    $('.acoes-produto').each(function () {
      const $combo = $(this);
      const comboId = $combo.data('variacao-id');

      if ($combo.hasClass('indisponivel')) return;

      if (comboId && comboId.toString().split('-').includes(thisVarId.toString())) {
        temDisponivel = true;
        return false; // sai do each
      }
    });

    if (!temDisponivel) {
      $item.addClass('sem-estoque');
      $item.closest('li').find('div.selecionado').remove();
    }
  });

  $('.atributo-comum').each(function () {
    const $grupo = $(this);
    const $active = $grupo.find('li.active');

    if ($active.length && $active.find('a.sem-estoque').length) {
      $active.removeClass('active');

      const $primeiroDisponivel = $grupo.find('a.atributo-item:not(.sem-estoque)').first().closest('li');

      if ($primeiroDisponivel.length) {
        $primeiroDisponivel.addClass('active');
        // Dispara o clique para atualizar seleção real no sistema
        $primeiroDisponivel.find('a.atributo-item').trigger('click');
      }
    }
  });
});
</script>
<style>
.atributo-item.sem-estoque {
  position: relative;
  opacity: 0.4;
}

.atributo-item.sem-estoque::after {
  content: '✖';
  color: red;
  font-size: 16px;
  font-weight: bold;
  position: absolute;
  top: 8px;
  right: 15px;
}
</style>
2 curtidas