npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

monte.js

v1.0.1

Published

A easy litter framework with jquery that works plugins (pages, components and forms) and manager front routes.

Downloads

3

Readme

monte.js

  1. Dependências de desenvolvimento
  2. Instalação
  3. Adicionando dependências de desenvolvimento
  4. Adicionando dependências ao projeto
  5. Gulp: buildando o projeto (diretório /assets)
  6. Sistema
    1. Styles
      1. Alguns estilos desenvolvidos
    2. Scripts
      1. Utils
        1. Tradução de mensagens
        2. Mensagens no console
        3. Caixa de diálogo (modal)
      2. Pages
      3. Components
        1. Requisições HTTP ao October
      4. Forms
      5. Rotas front-end
        1. Requisição de páginas (rotas)
    3. Templates
      1. Criando templates
      2. Renderizando templates
        1. Resetando conteúdo da div
        2. Preservando conteúdo da div
        3. Funções auxiliares
      3. Elements
        1. Alguns elements desenvolvidos
        2. Criando um element
        3. Registrando um element
        4. Renderizando um element
      4. Forms
    4. Exemplo de criação de rota, requisição, renderização e chamada ajax

Dependências de desenvolvimento

npm install -g bower
npm install -g handlebars
npm install -g gulp

Instalação

npm install

Adicionando dependências de desenvolvimento

npm install --save-dev **plugin**

ou

bower install --save-dev **plugin**

Adicionando dependências ao projeto

npm install --save **plugin**

ou

bower install --save **plugin**

Gulp: buildando o projeto (diretório /public)

O diretório /public é gerado dinâmicamente, utilizando a tecnologia Gulp. Somente esse diretório é acessível ao usuário e seus arquivos são o resultado da build do projeto.

Para desenvolvimento utilize o comando npm start. Como alternativa você também pode utilizar o comando gulp watch.

Para gerar uma versão buildada do projeto utilize o comando npm run build.

Sistema

Esse projeto serve como aplicação front-end ao OctoberCMS.

Utiliza-se o padrão de "single page application", ou seja, uma única página manipulada por javascript.

Assim sendo uma aplicação front-end, requisições HTTP ocorrem via Ajax (Request) aos Components desenvolvidos no OctoberCMS.

Alguns aspectos deste projeto:

Styles

Frameworks utilizados no desenvolvimento do estilo:

O estilo do projeto foi desenvolvido utilizando o pré-processador Sass, que otimiza e acelera o desenvolvimento de css.

Alguns estilos desenvolvidos

Algumas classes foram desenvolvidas no intuito de agilizar ainda mais o processo de montagem de layout:

  • center-force: centraliza div na tela;
  • center-force-remove-p: centraliza div na tela e remove paddings laterais;
  • center-force-mobile: centraliza div na tela somente se max-width < 992px;
  • center-force-mobile-remove-p: centraliza div na tela somente se max-width < 992px e remove paddings laterais;
  • right: seta float para right;
  • remove-margins: remove margins laterais;
  • remove-paddings: remove paddings laterais;
  • remove-mp: remove margins e paddings laterais;
  • remove-mt: remove margin-top;
  • remove-mb: remove margin-bottom;
  • remove-p-l: remove apenas padding-left;
  • remove-p-r: remove apenas padding-right;

Exemplo:

<div class="col-md-8">
    <div class="col-md-6 center-force">
        This div is centralized
    </div>
</div>
<div class="col-md-4 remove-mp">
    This div has no margin and padding left/right.
</div>

Scripts

Desenvolvido com jQuery para manipulação de documentos HTML, manipulação de eventos, animação e Ajax. A fim de desenvolvimento, os arquivos do diretório /scripts devem ser buildados para terem efeito no diretório /public.

Tradução de mensagens

Toda e qualquer mensagem que seja renderizada ao usuário deve passar pela função translate(string msg).

Exemplo:

let msg = translate( 'Aqui minha mensagem em pt-br' ); // <-- return string translated

Mensagens no console

Para mostrar mensagens no console do navegador deve-se utilizar a função consoleLog(string msg).

Para mostrar mensagens de erro utilize a função consoleError(string msg).

Exemplo:

consoleLog( translate('Aqui minha mensagem no console') );
consoleError( translate('Aqui minha mensagem de erro no console') );

*Caso o cookie debug esteja setado como false as mensagens não serão exibidas.

Caixa de diálogo (modal)

Foram desenvolvidos métodos baseados em Bootstrap3 Dialog que facilitam a criação de caixas de diálogo. São elas: confirmDialog(json data) e modalDialog(json data). Não é necessário passar as strings pelo método translate() pois essa transformação já ocorre internamente nos métodos desenvolvidos.

Exemplos:

confirmDialog({
    title: 'Confirmação',
    message: 'Você realmente deseja confirmar essa ação?',
    button: { // <-- main button
        icon: 'fa fa-check',
        label: 'Confirmar',
        action: (dialogItself) => {
            // code
            dialogItself.close(); // <-- close modal
        }
    }
});
modalDialog({
    headerBackground: 'rgb(0,95,108)',
    title: 'Modal',
    message: '<h2>html content</h2>',
    onshown: () => {
        // call in show modal
        // code
    },
    button: { // <-- main button
        icon: 'fa fa-edit',
        label: 'Ok modal',
        cssClass: 'btn-success',
        action: (dialogItself) => {
            //code
            dialogItself.close(); // <-- close modal
        }
    }
});

Requisições HTTP ao OctoberCMS

Chamada ajax

Para fazer uma requisição Ajax ao OctoberCMS utilize a função createRequest(string component, json data). Essa função retorna um elemento $.request, ou seja, o seu resultado é acessível através do método .done( (response) => { ... } );, onde response é o json de resposta do component do OctoberCMS.

Exemplo:

createRequest('myComponent', { name: 'name' }).done( (response) => {
    consoleLog(response); // <-- log json result
});

Rotas front-end

O sistema de rotas do front-end utiliza Routie.js para gerenciar as requisições ao front-end. Routie captura e modifica o histórico do navegador, utilizando hash #.

As rotas estão definidas no arquivo /scripts/core/routes.js.

Exemplo:

routie({
    '/home': () => {
        // code
    },

    '*': () => { // <-- default route
        routie('/home'); // <-- go to 'home' route
    }
});

Assim, para o usuário navegar entre as rotas, basta criar um link apontando para #/nomeDaRota.

Exemplo:

<a href="#/home"> Go to home </a>

Requisição de páginas (rotas)

O projeto trabalha com requisição de arquivos javascript por demanda, ou seja, cada arquivo é carregado somente se for requisitado. Assim, para cada página existe um arquivo .js em /scripts/pages/ contendo seus métodos específicos. O método getPage(string page) cria uma Promise que requisita o arquivo javascript correspondente, ou seja, retorna um método .then( () => { ... } ) quando o arquivo for carregado.

Exemplo:

getPage('home').then( () => {
   // file '/scripts/pages/_home.js' is loaded
});

Templates

Os templates são pré-compilados utilizando a tecnologia Handlebars. Os arquivos .hbs estão no diretório /templates.

O Handlebars é responsável por transformar cada arquivo de template em um .js, e o salva em /public/assets/js/templates.

Criando templates

Para criar um template siga os passos:

  • crie um arquivo .hbs em /templates. Exemplo: home.hbs
  • edite home.hbs e escreva html normalmente, inserindo o objeto que deverá renderizar no template. Para maiores informações sobre a sintaxe de Handlebars, clique aqui.
  • gulp templates (se quiser buildar separadamente)

Exemplo:

<div class="col-md-10 center-force">
    <h1>{{title}}</h1>
</div>

Renderizando templates

Cada chamada de renderização de templates trabalha com a tecnologia Promise para requisitar um template para a página. Sendo assim, toda e qualquer lógica referente ao template deve ser escrito dentro do método .then( () => { ... }), que recebe uma função sem parâmetros. Isso garante que os códigos escritos dentro dessa função sejam executados somente após a renderização do template no html.

O objeto json data é o que será integrado com o template Handlebars. Esse parâmetro é opcional.

Resetando conteúdo da div

Para requisitar um template e renderizá-lo, substituindo o valor atual de HTML da div associada, utilize a função htmlDiv($(element) $div, string template, json data).

Exemplo:

let $div = $('#root');
htmlDiv($div, 'home', {title:  translate('Título do meu template')}).then( () => {
    // template 'home.hbs' is render as new #root content
});
Preservando conteúdo da div

Para requisitar um template e renderizá-lo, preservando o valor HTML da div e adicionando o novo conteúdo, utilize a função appendDiv($(element) $div, string template, json data).

Exemplo:

let $div = $('#root');
appendDiv($div, 'home', {title:  translate('Título do meu template')}).then( () => {
    // template 'home.hbs' is added in #root content
});
Funções auxiliares
  • clearDiv(array $divs) Limpa o conteúdo HTML de uma div. Espera como parâmetro um array de elementos jQuery.
  • getTemplate(string template) Cria uma Promise que requisita o template associado e retorna uma função .then( (t) => { ... } ), onde t é a função Handlebars contendo o template pré-compilado.

Exemplo:

let json = {title:  translate('Título do meu template')};
getTemplate('home').then( (t) => {
    let $div = $('#root');
    $div.html( t(json) ); // <-- insert json data in template and print in div
});

Elements

Alguns elementos foram criados com o intuito de facilitar e agilizar o desenvolvimento do projeto. Cada element é um fragmento de html, disposto num arquivo .hbs no diretório /templates/elements/. Assim, para popular um element basta passar um objeto json com as opções disponíveis para cada fragmento.

Alguns elements desenvolvidos
input-text, input-email, input-password: {
    label: translate('Título'),
    id: 'id',
    name: 'name',
    hint: translate('Mensagem no rodapé do campo'),
    value: 'value',
    option: 'required'
}

button: {
    id: 'btn-login',
    class: 'success btn-submit', // <-- class 'btn-submit' to form submit button
    title: translate('Entrar')
}
Criando um element

Para criar um element crie um arquivo .hbs em /templates/elements/:

Exemplo: /templates/elements/button.hbs

<button type="button"
        id="{{ id }}"
        class="btn btn-{{ class }}">

    {{ title }}

</button>
Registrando um element

Para que um element seja chamado dentro de um template, conforme a documentação do Handlebars, deve ser registrado como uma Partial. Isso deve ser feito no método registerPartials() em /scripts/core/_templates.js.

Exemplo:

const registerPartials = () => {
    Handlebars.registerPartial('button', Chip.templates['button']);
};
Renderizando um element

Um element é renderizado dentro de um template, ou seja, existe uma "tag" do Handlebars específica para chamar Partials: {{> element-name }}. Uma Partial não herda os atributos json do template pai, mas é possível passar um atributo do pai para a partial.

let data = {
    title: translate('Título do meu template home'),
    btn: {
        id: 'btn-reset-password',
        class: 'success btn-submit',
        title: translate('Alterar senha e entrar')
    }
};

let $div = $('#root');
htmlDiv($div, 'home', data).then( () => { // <-- render 'home' template
    // 'template' rendered
});

/templates/home.hbs:

<div class="col-md-12 remove-mp">
    <h1>{{title}}</h1>

    <div class="col-md-12 text-center"> <!-- button center -->
        {{> button btn }} <!-- partial button receive object 'btn' -->
    </div>

</div>

Forms

Para facilitar a manutenção de formulários, o template (.hbs) dos mesmos devem ser desenvolvidos separadamente no diretório /templates/forms. Para requisitar um formulário utilize o método getForms(string form).then( (t) => { ... }), que retorna uma Promise contendo a função t Handlebars de criação do modelo de layout. Assim, basta passar os dados json para retornar o html do layout.

Exemplo:

const json = {item: 'myitem'};
getForms('myform').then( (t) => { // <-- load myform
    let html = t(json); // <-- html content
});

Exemplo de criação de rota, requisição, renderização e chamada ajax

Exemplo de criação de rota e requisição:

routie({

    '/home': () => { // <-- create route 'home'
        refreshToken().then( () => { // <-- refresh access_token
           getPage('home').then( () => { // <-- load page 'home'
               renderHome(); // <-- call method in '/scripts/pages/home.js'
           });
        });
    }

});

Exemplo de renderização e chamada ajax (/scripts/pages/home.js):

const renderHome = () => {
    let $div = $('#root'); // <-- div where content will render
    htmlDiv($div, 'home', {
        title: translate('Título do meu template home')
    }).then( () => {
        // all ready, template 'home.hbs' is render as new #root content

        refreshToken().then( () => { // <-- refresh access_token
            createAjax('GET', 'url', {data: data}, {header: header}).done( (result) => {
                consoleLog(result); // <-- ajax result
            });
        });
    });
};