segunda-feira, 19 de dezembro de 2016

Impressão com NodeJS

Esta é uma simples solução para quando temos uma aplicação de Intranet com NodeJS, e que gera documentos que precisam ser impressos, contudo os usuários desta intranet compartilham uma única impressora conectada ao e instalada no servidor.
Vamos utilizar o pacote printer. Para instalar basta
 npm install -g node-gyp
 npm install printer --msvs_version=2013
Continuando com a simplicidade, agora vamos a um exemplo:

var fs = require('fs');
var printer = require("printer");
fs.readFile("teste.pdf", 'utf8', function(err, file){
  if (err) throw err;
  console.log("Trying to print...");
  printer.printDirect({data:file,
      type: 'PDF',
      success:function(jobID){
 console.log("Trabalho enviado à impressora - ID: "+jobID);
      },
      error:function(err){
 console.log(err);
      }
  });
});

Neste exemplo utilizamos um pdf qualquer para ser impresso na impressora configurada como padrão. Existem várias opções customizáveis, acho válido citar que os dados podem vir de um arquivo ou de uma string. Você pode por exemplo utilizar renderizadores de templates em html como handlebars e passar a string diretamente para impressão. Você pode adicionar um parâmetro printer com o nome de uma impressora que não seja a padrão se houver mais de uma conectada ao servidor. Pois então, esta foi uma pequena dica!

quarta-feira, 20 de abril de 2016

Validação Customizada de Formulários com Angular

Angular facilita a organização de nossas aplicações em tudo, inclusive na validação de formulários. Porém nenhum framework existente cobre a necessidade de todos os programadores. Com certeza em algum momento você vai querer adicionar alguma funcionalidade à sua aplicação que não é coberta pelo framework. No presente post eu quero inserir uma validação para cpf de um input em meu formulário e não quebrar a validação de angular e não ter de fazer gambiarras. Vamos lá, faremos isto utilizando directives. Para executar esta tarefa me baseei no Post de Ben Lesh e na documentação oficial. 
O pulo do gato é bem descrito por Ben Lesh, utilizando a função $setValidity pertencente ao ngModelController definimos se o valor de um ngModel de determinado campo é válido ou não. Vale à pena conhecer a documentação de ngModelController.

Vamos ao código:
 
dir.directive("cpfValidate", function(){
 return{
  // iremos utilizar a diretiva como atributo
  restrict: 'A', 
  // o elemento a ser validado deve conter o atributo ng-model
  require: 'ngModel',
  link: function(scope, elem, attr, ctrl) {
   /*
    $parser é um array de funções para sanitizar os dados,
    aqui eu adiciono a minha função de validação.
   */
   ctrl.$parsers.unshift(function(value) {
    /* 
     TestaCPF é uma função qualquer para testar um cpf 
     você pode implementar a sua ou copiar na internet.
    */
    var valid = TestaCPF(value);
    ctrl.$setValidity('cpfValidate', valid);
    // se for válido retorno valid, else retorna undefined.
    return valid ? value : undefined;
   });
  }
 };
});