Checkbox dinâmicos

Tenho alguns checkbox que são montados dinâmicos

<mat-checkbox
*ngIf="forneTudoMarcadoLista[j].marcado"
[id]="fornecedor.id"
[name]="fornecedor.id"
[checked]="false"
[value]="fornecedor.valorCorreto"
(change)="
defineFornecedoresValorCorreto(
$event,
fornecedor.idInsumo,
fornecedor.valorCorreto,
fornecedor.total,
fornecedor.idFornecedor
)
"
matTooltip="Escolher ou não este item para este fornecedor"
></mat-checkbox>

Mas clicar na mesma linha, como fazer para apagar os outros checkbox ?

Vc quer apagar como assim? Limpar eles, ou remover eles da tela?

1 curtida

Vamos supor que o usuário na linha do Peixe, primeiro ele marcou o fornecedor Carnes Atacado. Mas depois ele errou, e marcou o fornecedor teste cnpj. O que estou precisando, é que desmarque todos os checkbox da linha Peixe, menos o que ele marcou atual, entende ?

Como está a estrutura dos dados dessa tabela? Imagino que vc tenha uma lista de fornecedores em algum lugar. Como está a implementação da função defineFornecedoresValorCorreto?

1 curtida

Método: defineFornecedoresValorCorreto

defineFornecedoresValorCorreto(
    tipo: any,
    idInsumo: number,
    valorCorreto: number,
    total: number,
    idFornecedor: number
  ): void {
    console.log(tipo);
    console.log(valorCorreto);
    this.fornecedoresItens.forEach((fornecedorItem: any) => {
      fornecedorItem.fornecedores.forEach((fornecedor: any) => {
        if (
          fornecedor.valorCorreto !== null &&
          valorCorreto !== fornecedor.valorCorreto
        ) {
          //fornecedor.id.checked = false;
        }
      });
    });
    this.defineFornecedoresValorCorretoFornecedor(
      total,
      idFornecedor,
      idInsumo,
      tipo.checked
    );
    const objeto = {
      idInsumo: idInsumo,
      valorCorreto: valorCorreto,
    };
    const result = this.fornecedoresValorCorreto.filter(function (el: any) {
      return el.idInsumo == idInsumo;
    });
    for (let elemento of result) {
      let index = this.fornecedoresValorCorreto.indexOf(elemento);
      this.fornecedoresValorCorreto.splice(index, 1);
    }
    this.fornecedoresValorCorreto.push(objeto);
  }

Método: defineFornecedoresValorCorretoFornecedor

private defineFornecedoresValorCorretoFornecedor(
    total: number,
    idFornecedor: number,
    idInsumo: number,
    tipo: any
  ): void {
    this.totalPreco.forEach((obj: any) => {
      if (obj.idInsumo === idInsumo) {
        obj.marcado = false;
        obj.total = 0;
      }
    });
    this.totalPreco.forEach((obj: any) => {
      if (obj.idFornecedor === idFornecedor && obj.idInsumo === idInsumo) {
        obj.marcado = true;
      }
    });
    this.totalPreco.forEach((obj: any) => {
      if (
        obj.idFornecedor === idFornecedor &&
        obj.idInsumo === idInsumo &&
        obj.marcado &&
        tipo
      ) {
        obj.total = total + obj.total;
      }
    });
    this.valorPreco.forEach((objValorPreco: any) => {
      objValorPreco.valor = 0;
    });
    this.totalPreco.forEach((objTotalPreco: any) => {
      this.valorPreco.forEach((objValorPreco: any) => {
        if (objValorPreco.idFornecedor === objTotalPreco.idFornecedor) {
          objValorPreco.valor = objValorPreco.valor + objTotalPreco.total;
        }
      });
    });
  }

Alguma ajuda …

Qual o linha de código que deveria está desmarcando os checkboxes no evento change?

Ao clicar no checkbox da linha, ele deve percorrer todos os checkbox existente na tela. Assim ele filtra todos os checkbox com o idInsumo igual a fornecedor.valorCorreto.substring(0,3). desmarcando eles. E só não desmarca o checkbox, atual, que value]=“fornecedor.valorCorreto”.

Entende ?

Até entendi, mas soh o código com esses vários forEach que tah confundindo. Pelo que entendi, essa parte:

this.totalPreco.forEach((obj: any) => {
      if (obj.idInsumo === idInsumo) {
        obj.marcado = false;
        obj.total = 0;
      }
    });

está desmarcando todos os checkboxes. E essa outra:

this.totalPreco.forEach((obj: any) => {
      if (obj.idFornecedor === idFornecedor && obj.idInsumo === idInsumo) {
        obj.marcado = true;
      }
    });

marca apenas o do fornecedor que foi clicado por ultimo. É isso?


Achei estranho isso no componente: [checked]="false", não deveria está considerando a propriedade marcado?

1 curtida

Estou melhorando esta parte, realmente está um pouco estranho.

Será que é isso ?

Vou testar

Nesse componente, tu tem o insumo e os fornecedores. Se tu mantesse uma estrutura insumo X fornecedores, para controlar qual fornecedor foi selecionado para determinado insumo, acredito que iria facilitar a manipulação dos dados. Algo assim:

class InsumoFornecedor {
	insumo: number;
	fornecedor: number
}

// crie essa classe no momento em que os dados dos insumos forem carregados na tela
class ControleInsumoFornecedor {
	values: InsumoFornecedor[] = [];
	
	static criar(insumos: Insumo[]) {
		// aqui tu pega a lista de insumos e inicializa o array "insumoFornecedor"
		// com o id do insumo e o fornecedor (caso já tenha algum fornecedor marcado)
	}
	
	// nessa classe tu pode ter funções para controlar os fornecedores escolhidos para determinado insumo, ex.:
	
	// essa função pode ser chamada no "change" do checkbox
	alterarFornecedor(insumo: number, fornecedor number) {
		const value = values.find(el => el.insumo === insumo);
		value.fornecedor = fornecedor;
	}
	
	getDados(): InsumoFornecedor[] {
		return values;
	}
}

É soh uma ideia. Assim, vc irá separar o controle dos dados numa estrutura mais fácil de manusear.

1 curtida