quinta-feira, 4 de fevereiro de 2021

Implementando DOTENV nos seus projetos

Pra quem não conhece, o DOTENV é um package do NPM para armazenar de forma local informações que não devem ser compartilhadas em seus repositórios.

Vamos à um exemplo bem simples:

Você está atuando em um projeto, e precisa inserir dados de acesso para que você possa de forma tranquila utilizar uma tarefa do gulp onde ela observa o arquivo alterado e faz upload do mesmo para o ambiente do cliente, seja em produção ou desenvolvimento.

O .ENV fica na raiz do seu projeto, e nele você pode colocar informações de login, tokens e etc. Quando um repositório é criado, geralmente é gerado um arquivo chamado .gitignore

Para que serve?

O gitignore serve para você passar quais arquivos ou pastas ele irá ignorar na hora de subir seus commits para o repositório online. Ou seja, por padrão arquivos .env ja são configurados para não subirem para o servidor, sendo assim você tem menos risto de expor dados de acesso para qualquer um, mesmo que seu repositório não seja público.

Como utilizar o .ENV?

Dentro do seu repositório local (ou seja, na máquina já baixado do git ou de seu servidor), rode o seguinte comando;
npm i dotenv

Depois disso, aguarde a instalação do mesmo.

Agora, na raiz do seu projeto, crie um arquivo chamado .ENV (Sim, com ponto mesmo);

A syntaxe dele é bem simples. Com # você comenta as linhas;

# esta é uma linha de comentário
NOME = Canaleta Web
URL = https://canaletaweb.blogspot.com
USERNAME = login_username
PASS = password_aqui

Essas propriedades (nome, url, username, pass) você que irá configurar através do process.env;

No nosso caso utilizamos um arquivo na raiz em javascript chamado settings.js, onde carregamos a configuração do dotenv, e utilizamos o module.exports para configurar as propriedades, para poder repassa-las ao gulp;

// importando dotenv;
require('dotenv').config();
    
//configurando prorpiedades;
module.exports = {
	siteUrl: process.env.URL,
	username: process.env.USERNAME,
	password: process.env.PASS,
}
 
console.log(`Você esta no ambiente do cliente "${process.env.NOME}"!`)

Este código acima, pode ser salvo em um arquivo javascript na raiz do repositório também. Com isso você pode criar o arquivo gulpfile.js que será responsável por pegar as informações dentro do module.exports e repassar para o gulp-spsave, por exemplo.

Vou dar um exemplo simples do gulpfile. Lembrando que para usar este exemplo você também precisa ter o gulp e o gulp-spsave instalado em seu repositório.

let settings = require('./settings'),
	gulp = require(`gulp`),
	spsave = require(`gulp-spsave`),
	browserify = require('browserify');
    
    gulp.task(`watch-js`, function(){
    	gulp.watch([`./src/js/**/*.js`], function(event){
        	var b = browserify({
            	entries: event.path,
  				debug: true
            });
            
            return b
            	.pipe(spsave({
                	checkin: true,
                    checkinType: 1,
                    siteUrl: settings.siteUrl,
                    folder: `/style library/js/`
                });
        });
    });
  

Vejamos o código acima;

  1. Importamos as dependências que iremos utilizar; (gulp, gulp-spsave, browserify)
  2. Importamos as propriedades definidas no arquivo settings.js;
  3. Criamos uma tarefa chamada watch-js que observa todos os arquivos js localizados na pasta raiz src/js;
  4. Ao modificar um arquivo, ele armazena na variavel b os dados do arquivo modificado;
  5. No retorno, executamos a extensão spsave que recebe algumas propriedades, que são:
    1. checkin - se quer fazer checkin após altera-lo no SharePoint;
    2. checkinType - qual tipo de checkin você pretente fazer: check-in apenas para você ou checkin publico para todos;
    3. siteUrl: carrega os dados do module.exports lá no arquivo settings.js, que este, recebe o process.env.URL que foi configurado no arquivo .ENV
    4. folder - local onde você deseja salvar este arquivo no SharePoint;
Muito bom, né não?
Isso garante (pelo menos offline) que os dados fiquem apenas no seu computador e não no servidor, onde podem ser expostos por alguma falha, desatenção etc.

Espero que tenham gostado!

Continuar lendo

sexta-feira, 27 de maio de 2016

[SP] - Logo dinãmico em Master HTML (Sharepoint 2013)

Para adicionar o controle de Logo nativo do Sharepoint em sua master customizada na versão html, basta adicionar o seguinte código:


<!--MS:<sharepoint:sitelogoimage cssclass="ms-siteicon-img" id="onetidHeadbnnr2" logoimageurl="/_layouts/15/images/siteIcon.png?rev=23" name="onetidHeadbnnr0" runat="server">-->
<!--PS: Start of READ-ONLY PREVIEW (do not modify)--><img alt="Content site" class="ms-siteicon-img" src="http://dev-chalfin-website.simbiox.com.br/_layouts/15/images/siteIcon.png?rev=23" id="ctl00_onetidHeadbnnr2" name="onetidHeadbnnr0" /><!--PE: End of READ-ONLY PREVIEW-->
<!--ME:</SharePoint:SiteLogoImage>-->

Caso deseje adicionar o controle completo com o link:

<!--MS:<sharepoint:spsimplesitelink cssclass="ms-siteicon-a" id="onetidProjectPropertyTitleGraphic" runat="server">-->
<!--MS:<sharepoint:sitelogoimage cssclass="ms-siteicon-img" id="onetidHeadbnnr2" logoimageurl="/_layouts/15/images/siteIcon.png?rev=23" name="onetidHeadbnnr0" runat="server">-->
<!--PS: Start of READ-ONLY PREVIEW (do not modify)--><img alt="Content site" class="ms-siteicon-img" src="http://dev-chalfin-website.simbiox.com.br/_layouts/15/images/siteIcon.png?rev=23" id="ctl00_onetidHeadbnnr2" name="onetidHeadbnnr0" /<<!--PE: End of READ-ONLY PREVIEW-->
<!--ME:</sharepoint:sitelogoimage><!--ME:</sharepoint:spsimplesitelink>-->
Continuar lendo

segunda-feira, 29 de fevereiro de 2016

[SP 2013] Corrigir erro ao tentar adicionar APP's com master 2013 html


No novo modelo de master page aplicado no SharePoint 2013, podemos criar uma nova master em modelo HTML. as diretrizes e formas de utilização das tags mudaram um pouco, simplificando muita coisa e complicando no começo o entendimento, porém não é nenhum bixo de 7 cabeças.

As tags nesta master utilizam comentários, e são bem mais limpas que as master.master que customizavamos antes.

Peguei um problema estes dias, quando fiz um desenvolimento de Intranet com esta master html, e tive o seguinte problema: ao tentar adicionar um app (lista, biblioteca) não aparecia a opção de adicionar. Pesquisando verifiquei que, não existia os controles do menu lateral nativo do sharepoint, com isso algumas informações não carregam. Lembrando que em intranet's e ged's sempre exibimos o menu nativo para facilitar a navegação para o cliente, adicionei o código na master HTML e voltou a funcionar novamente!

<h1 id="pageTitle" class="ms-core-pageTitle">
                                    <!--SPM:<SharePoint:AjaxDelta id="DeltaPlaceHolderPageTitleInTitleArea" runat="server">-->
                                    <!--SPM:<asp:ContentPlaceHolder id="PlaceHolderPageTitleInTitleArea" runat="server">-->
                                    <!--SPM:<SharePoint:SPTitleBreadcrumb
                    runat="server"
                    RenderCurrentNodeAsLink="true"
                    SiteMapProvider="SPContentMapProvider"
    CentralAdminSiteMapProvider="SPXmlAdminContentMapProvider">-->
                                    <!--PS: Start of READ-ONLY PREVIEW (do not modify)--><span id="ctl00_DeltaPlaceHolderPageTitleInTitleArea">Home</span><!--PE: End of READ-ONLY PREVIEW-->
                                    <!--SPM:<PATHSEPARATORTEMPLATE>-->
                                    <!--SPM:<SharePoint:ClusteredDirectionalSeparatorArrow runat="server"/>-->
                                    <!--SPM:</PATHSEPARATORTEMPLATE>-->
                                    <!--SPM:</SharePoint:SPTitleBreadcrumb>-->
                                    <!--SPM:</asp:ContentPlaceHolder>-->
                                    <!--SPM:</SharePoint:AjaxDelta>-->
                                    <!--SPM:<SharePoint:AjaxDelta BlockElement="true" id="DeltaPlaceHolderPageDescription" CssClass="ms-displayInlineBlock ms-normalWrap" runat="server">-->
                                    <a href="javascript:;" id="ms-pageDescriptionDiv" style="display:none">
                                        <span id="ms-pageDescriptionImage">
                                        </span>
                                    </a>
                                    <span class="ms-accessible" id="ms-pageDescription">
                                        <!--SPM:<asp:ContentPlaceHolder id="PlaceHolderPageDescription" runat="server"/>-->
                                    </span>
                                    <!--SPM:<SharePoint:ScriptBlock runat="server">-->
                                    <!--SPM:_spBodyOnLoadFunctionNames.push("setupPageDescriptionCallout");-->
                                    <!--SPM:</SharePoint:ScriptBlock>-->
                                    <!--SPM:</SharePoint:AjaxDelta>-->
                                </h1>



Este código habilita a parte de conteúdo nativa para a adição de app's e a lateral nativa do sharepoint.

Bons códigos!
Continuar lendo

terça-feira, 23 de fevereiro de 2016

[SP & AngularJS] Paginação de n itens com Sharepoint e AngularJS

Com a nova tendencia da web com tecnologias mais modernas e rápidas, iniciamos um projeto de atrela-las ao Sharepoint, utilizando somente o Front-End.

Para iniciar começamos com o AngularJS, utilizei uma api pronta de loading e pagination para exibir n dados vindo do webservice que não teria como fazer paginação via rest api.

O refinador de resultado, trata o conteúdo carregado pelo angular, filtrando por todas as colunas.



Código de chamada do serviço, a função X2JS e para tranformar XML em JSON, utilizado no retorno do AngularJS.


var queryAPI = "/_vti_bin/PNA.Intranet.Worksite.Services/DataService.svc/" + $attrs.urlapi + "?Text=" + param

        $http.get(_spPageContextInfo.siteAbsoluteUrl + queryAPI, {
                withCredentials: true
            })
            .success(function(data) {
                var x2js = new X2JS();
                var aftCnv = x2js.xml_str2json(data);


                if (aftCnv.SearchResults._ItemCount == 1) {
                    var arrayUmItem = new Array();
                    arrayUmItem.push(aftCnv.SearchResults.Document != undefined ? aftCnv.SearchResults.Document : aftCnv.SearchResults.Workspace)
                    $scope.items = arrayUmItem;
                } else {
                    $scope.items = aftCnv.SearchResults.Document != undefined ? aftCnv.SearchResults.Document : aftCnv.SearchResults.Workspace;

                }

                if ($scope.items == undefined) {
                    $scope.vazio = '"Nenhum resultado encontrado no iManage"';
                } else {
                    $scope.vazio = ""
                }
            })
            .error(function(data, status) {
                var data = data || "Request failed";
                var status = status;
                alert(data);
            });



Ele foi feita no modelo webpart , editor de script

Git com o código completo.
Continuar lendo

[SP] XSL Import (Update)

Para tornar mais facil a customização de uma WebPart ou DataView, nós utilizamos o XSL Import. Trata-se de um código adicionado na customização da webpart, inserindo um arquivo externo para a edição do XSL.

EXEMPLO:
Temos a webpart customizada, com aquele código XSL gigantesco nativo. Nós deletaremos a tag "<xsl:stylesheet>" inteira, substituindo-a pelo código abaixo:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ddwrt2="urn:frontpage:internal">
   <xsl:import href="/Style Library/XSL Style Sheets/NomeDoArquivo.xsl"/>
   <xsl:template match="/">
    <xsl:apply-imports/>
   </xsl:template>
 </xsl:stylesheet>

Basicamente estamos dizendo que, ao carregar a webpart ele irá trazer informações deste arquivo externo que está no xsl:import. Estes arquivos .xsl ficam dentro da Style Library > XSL Style Sheets.

UPDATE DO ROLÊ!
Outra dica importante que descobrimos:
Dentro deste arquivo .xsl existe um código padrão a ser adicionado, abaixo segue um modelo a ser utilizado:

<xsl:stylesheet version="1.0" exclude-result-prefixes="x d xsl msxsl cmswrt ddwrt" xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" xmlns:cmswrt="http://schemas.microsoft.com/WebParts/v3/Publishing/runtime" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime">
  <xsl:include href="/_layouts/15/xsl/main.xsl"/>
  <xsl:include href="/_layouts/15/xsl/internal.xsl"/>
 <xsl:include href="/Style Library/XSL Style Sheets/Utils.xsl"/>
 <xsl:param name="AllRows" select="/dsQueryResponse/Rows/Row[$EntityName = '' or (position() &gt;= $FirstRow and position() &lt;= $LastRow)]"/>
 <xsl:param name="dvt_apos">'</xsl:param>
 <xsl:template match="/">
  
 </xsl:template>
</xsl:stylesheet>

Neste modelo acima, estamos usando uma tag diferente na primeira linha. esta tag stylesheet não insere atributos do SharePoint em seu html, deixando ele muito mais "clean" e facil de ler. Também deixei uma tag chamada <xsl:include que serve para fazer chamada de outro XSL dentro deste, ou seja, usamos para chamar um utils.xsl onde colocamos vários templates de XSL customizados.

E é isso, muito útil e facil de trabalhar, afnal, gostamos de códigos html mais limpos, correto? :D

Abraços!
Continuar lendo