6.2.0-beta.1 • Published 3 years ago

vst-gridform v6.2.0-beta.1

Weekly downloads
4,820
License
-
Repository
-
Last release
3 years ago

vst-gridform. O que é?

A biblioteca vst-gridform digamos que é um syntax-sugar, ou mais específico, uma biblioteca que ajuda na implementação de um CRUD usando o devextreme. Esta biblioteca é completamente dependente do devextreme, assim não tendo direitos nenhum. Muito pelo contrário, essa biblioteca tem única intenção de ajudar o programador a desenvolver certos códigos de forma mais rápida e mais amigável, utilizando a checagem estática que o typescript fornece.

Disclaimer

A idéia foi para me ajudar a desenvolver projetos mais elaborados mais rapidamente.

A única licença para essa biblioteca é a do DevExtreme. Para usar o devextreme em projetos privados, por favor, pague a licença necessária (não é barato, mas vale a pena).

ATENÇÃO!! USE POR SUA CONTA E RISCO!!!

Dependencias

  • Angular 12 ou 13
  • DevExtreme 21

Por que?

Usar o devextreme no angular segue uma linha diferente ao de como o devextreme foi inicialmente proposto, com o uso em paralelo com o jQuery.

Para usar com o angular, apesar de muito bom, foi necessário ligar-se ao HTML, como porta de entrada dos parametros e funções. Funciona muito bem, porém em algumas situações o desenvolvedor perde o monitoramente de erros estáticos que os arquivos em typescript fornecem. Os seguintes componentes datagrid e form oferecem muitas opções de configurações em uma camada mais profunda que a checagem de tipo no HTML consegue monitorar.

Só foi escrito o datagrid e form de maneira schematica, pois são os mais usados com comportamentos padrões, de uma tela pra outra.

O desenvolvedor pode muito bem usar o @ViewChild do angular, e usar o lint do ts. Porém, o segundo motivo é: Funcionalidades adicionais. Existe funcionalidades que é necessário em toda dela de crud (ou comportamento), e não existe implementação no devextreme, por ser algo muito específico com o tipo de desenvolvimento.

E o último motivo, mas o principal é: COMPONENTES CUSTOMIZADOS E FORMULARIO COMPLETO NA DATAGRID.

A datagrid do devextreme abre um formulário muito limitado, e fica a cargo do desenvolvedor criar um formulário mais elaborado e ter que gerenciar tanto o formulário quando a datagrid. O novo modelo, a própria datagrid gerencia o formulário que pode receber N customizações possíveis, que podem ser modulares, estando em múltiplos projetos.

Como funciona

Essa biblioteca segue o padrão composition (mais conhecida no java). Que diz o seguinte:

The composition is a design technique in which your class can have an instance of another class as a field of your class. - Fonte: Google

A herança de componentes não funciona muito bem no angular, pois não herda a parte visual, somente o código escrito do js.

Então segue a documentação dos dois componentes:

O DxDataGridComponent equivale a VsGridComponent, e o seletor dx-data-grid equivale a vs-grid. Equivale pois tanto o component quando o seletor do componente datagrid original ainda pode ser usado normalmente, o vs-grid é só uma camada, ele não reescreve o comportamente original. E o mesmo vale para o form, que tem as equivalências DxFormComponent para VsFormComponent, e dx-form para vs-form.

DOCS

FORMULÁRIO

O básico, import { VsFormModule } from 'vst-gridform'.

O component VsForm recebe apenas 6 entradas:

  • hasSubmit: boolean
  • formOperation: "create" | "read" | "update"
  • data: T
  • keys: any
  • schema: VsFormSchema
  • format: 'readonly' | 'edit'

e possui 5 saídas:

  • dataChange: EventEmitter
  • keysChange: EventEmitter
  • onValueChanged: EventEmitter
  • formatChange: EventEmitter
  • onEvent: EventEmitter

@Input() hasSubmit: boolean; (Default: false)

O hasSubmit é responsável por colocar as tags form ao redor do vs-form, e internamente todo submit event é encaminhado a uma função que é necessário ser escrito no schema

Exemplo:

<vs-form ... [hasSubmit]="true"></vs-form>

@Input() formOperation: "create" | "read" | "update"; (Default: undefined)

O formOperation é apenas um valor que a grid passa ao formulário quando está em alguma operação informada. Por exemplo, se o usuário aperta no botão mais na grid, então a grid renderiza o formulário e seta a variável formOperation do formulário que ela está cuidando como "create", assim, para algumas funcionalidades dentro do schema, esse formOperation é passado, e o desenvolvedor pode ou não deixar alguns campos visíveis.

@Input() data: T; (Default: undefined)

O data é o armazenamento onde o formulário insere os valores dos editores, e onde os editores fazem a leitura para renderizarem o conteúdo.

Exemplo:

<vs-form ... [data]="myFormData"></vs-form>

@Input() keys: any; (Default: undefined)

O keys é a chave do data que está sendo renderizado. Usado mais pelo datagrid quando em submit do handler do schema.

@Input() format: CustomTemplateFormat; (Default: 'edit')

O format informa ao formulário como ele deve ser renderizado, se normal, quando "edit", ou se em modo leitura, quando format é igual a "readonly".

@Output() dataChange: EventEmitter;

Emite um sinal quando o data é alterado.

@Output() keysChange: EventEmitter;

Emite um sinal quando o keys é alterado.

@Output() onValueChanged: EventEmitter;

Emite um sinal quando qualquer editor realiza uma alteração no data.

@Output() formatChange: EventEmitter;

Emite um sinal quando o format é alterado.

@Output() onEvent: EventEmitter;

Documentação aqui

VsFormSchema

O schema é a parte mais importante do <vs-form ... [schema]="schema"></vs-form>, é o responsável por levar as instruções iniciais para o formulário se renderizar, e também regula o comportamento. Em sua maioria é composta por instruções e parametros definidos no DxForm, logo a maior parte da documentação do vsSchema é proprío da documentação original.

Porém, para as customizações realizadas no VsForm, adiante está maiores detalhes sobre o schema.

id: number | string;

É um identificador de formulário. Não tem utilidades.

handler: VsFormHandler;

Handler é uma interface. Algumas dessas implementações só funcionam se hasSubmit for igual a true.

interface VsFormHandler {
    onAppearing?: (e: VsOnAppearing) => void;
    onAppeared?: (e: VsOnAppeared) => void;
    onSubmiting?: (e: VsOnSubmiting) => any;
    onSubmited?: (e: VsOnSubmited) => any;
    toolbar?: VsFormToolbar;
    toolbarTop?: VsFormToolbar;
    cloneToolbarOnTop?: boolean;
    cancelButton?: VsFormButton;
    saveButton?: VsFormButton;
    backButton?: VsFormButton;
    showSubmitErrorSummary?: boolean;
}
CAMPODESCRIÇÃO
onAppearingÉ um evento que é disparado quando o formulário se torna visível, muito usado pelo datagrid, que gerencia o formulário. Ele é chamado depois do onInitialized (método do devextreme). O onAppearing recebe um objeto com informações do dado, component e instancia do VsFormComponent. Se quiser alterar, ou editar alguma informação dos dados pode ser aqui, usando o data, que a alteração é enviado para o formulário
onAppearedÉ um evento disparado após o formulário aparecer. Muito parecido com o onAppearing
onSubmitingÉ chamado quando hasSubmit==true. Recebe um objeto do tipo VsOnSubmiting que refere as chaves de alguma atualização no campo keys. Referencia os dados do formulário. Pode cancelar o envio de dados da datagrid com o cancel. Ele retorna um objeto dos dados enviados, ou um Promise do tipo resultado da operação.
onSubmitedÉ chamado quando hasSubmit==true. Recebe um objeto do tipo VsOnSubmited que refere keys e data parecido com o onSubmiting. Refere ao campo response que é o resultado do retorno do onSubmited. E refere ao campo goToGrid que bloqueia o retorno para a datagrid, se o formulário for gerenciado pela datagrid
toolbarÉ usado quando hasSubmit==true. É o toolbar que será incluido os botões configurados em backButton, cancelButton, saveButton
toolbarTopNão funciona. É usado quando hasSubmit==true. Ainda tem que terminar a implementaçao. Mas seria um toolbar no topo do formulário também, igual como no bottom.
cloneToolbarOnTopNão funciona. É usado quando hasSubmit==true. Seria pra copiar o toolbar no bottom no topo do formulário. Ainda é necessário implementação.
cancelButtonÉ usado quando hasSubmit==true. É aplicado quando o format do formulário for igual a "edit", e também tiver enabled.
saveButtonÉ usado quando hasSubmit==true. É aplicado quando o format do formulário for igual a "edit", e também tiver enabled.
backButtonÉ usado quando hasSubmit==true. É aplicado quando o format do formulário for igual a "readonly", e também tiver enabled.
showSubmitErrorSummaryÉ usado quando hasSubmit==true. Mostra o erro de submir no summario do devextreme. Mais fácil do que fazer widget de erro de submit para formulário.

Obs.: Os Botões tem:

  • confirmClick: boolean;
  • confirmMsg: string;

São responsáveis de confirmar ao usuário se ele tem certeza da operação. (Botões cancelButton, saveButton e cancelButton no Handler)

items: VsFormItems;

Novamente, é igual ao devextreme, só tem algumas adições para facilitar o desenvolvimento interno de algumas funcionalidades. Segue as customizações:

Todos os tipos de items tem o atributo name e dynamicOptions que logo será abordado.

Para o itemType igual a simple, o editorType tem uma nova opção, que é "vsCustomComponent", com isso o VsFormComponent liga os eventos e valores do dataField com o valor implementado no template. Leia mais em Componentes Customizados.

transform: VsTransform;

Ele aplica uma transformação no campo, e aplica css no html. // TODO: melhorar documentação

formClass: string;

Bota css na tag html.

savePartial

O savePartial é interessante. Ele salva no browser a atividade de preenchimento do formulário do usuário, se a internet cair, ou der erro, em vez do usuário perder o preenchimento que ele fez, a proxima vez que o formulário for aberto uma mensagem de recuperação de formulário entra como popup, se ele quiser todos os dados que o usuário pensou que perderia volta e o formulário é automaticamente preenchido. O problema que para formulários grandes pode dar uma travada ou outra, mas nada fora do comum.

CAMPODESCRIÇÃO
active: booleanAtiva ou desativa a funcionalidade. Default: false
saveas: stringObrigatório. Nome para salvar o formulário no cache
loadMode?: VsPartialLoadModeTipo de leitura, pode ser ask ou always. Caso seja o primeiro, é aberto um popup para perguntar ao usuário se ele quer recuperar os dados. O segundo ele sempre vai recuperar, e preencher automaticamente. Default: "ask"
onOperation?: "insert"Tipo de operação do formulário para que essa funcionarlidade funcione. Default: "insert"
askMessage?: stringMensagem para perguntar se gostaria de recuperar os dados. Default: "Observamos que a última inclusão não foi salva. Deseja recuperar os dados?"
delay?: numberTempo de delay para salvar os dados. Default: 400

COMPONENTES CUSTOMIZADOS

Chamamos de Componente Customizado o componente que pode entrar em um editorType: "vsCustomComponent" de um formulário. O componente tem que extender a classe abstrata e genérica VsCustomTemplateComponent<T>, sendo T o tipo do valor que seu componente assume, podendo ser um void, string, array, como até um objeto com formulário próprio.

Para instanciar um componente customizado no devextreme é necessário chamar o serviço de "ligação de nós". O VsTieCustomComponents é um serviço fornecido em root pelo vst-template. Nele existe dois métodos que devem ser usados nos atributos template dos items do devextreme.

Segue exemplo:

Implementando a classe customizada:

// FILE: endereco.component.ts
// Digamos que a classe seguinte é um componente customizado

@Component({
    ...
})
export class EnderecoComponent extends VsCustomComponent<Endereco> {
    
    ////////
    /// ...
    /// LOGICA
    /// ...
    ///////

    alterarEndereco(address) {
        // para alterar o valor e informar a árvore do devextreme. Basta fazer o seguinte:
        this.value = address;
    }

    // Esse método é usado para converter o valor iniciado pelo tiecomponentservice
    setValue(v: any) {
        if (typeof v !== "object") v = new Endereco(); // Inicializa endereço se por acaso não existe
        super.setValue(v); // Volta a inicializar normalmente o pai
    }

}

Usando a classe customizada:

// FILE: usuario.component.ts
// A CLASSE SEGUINTE EH UM CADASTRO DE USUARIO

@Component({
    ...
})
export class PerfilUsuarioComponent {

    // Segue com a definição de schema
    schema: VsFormSchema = {
        items: [
            { dataField: "name", label: {text: "Nome"}, ...},
            { dataField: "email", label: {text: "Email"}, ...},
            { dataField: "password", label: {text: "Senha"}, ...},
            // Agora queremos pedir o endereço do usuário
            { dataField: "address", label: {text: "Endereço"}, editorType: "vsCustomComponent", template: this.tie.onForm(EnderecoComponent) }, 
            // Pronto, o formulário desenvolvido dentro do componente endereço agora obedece ao formulário Perfil de Usuário
        ]
    }

    // Eh necessário pedir o servico de amarração
    constructor(private tie: VsTieCustomComponents) {}

}

Mais opções podem ser usada quando for usar this.tie.onForm, pois o método onForm recebe 3 entradas, primeiro a classe do componente, depois os inputs caso seja necessário usar o editorOptions, e também um callback que é chamado quando a classe está instanciada.

Exemplo2:

Usando a classe customizada:

// FILE: usuario.component.ts
// A CLASSE SEGUINTE EH UM CADASTRO DE USUARIO

@Component({
    ...
})
export class PerfilUsuarioComponent {

    // Segue com a definição de schema
    schema: VsFormSchema = {
        items: [
            ...
            // Agora queremos pedir o endereço do usuário.
            // Porem, quero inserir uma imagem no componente do endereço.
            // E o endereço pode ficar desabilitado enquanto o usuário ainda não digitou nem email e senha. 
            // O endereço tem um evento que ativa quando o usuário clica
            { dataField: "address", label: {text: "Endereço"}, 
                editorType: "vsCustomComponent", 
                template: this.tie.onForm(EnderecoComponent, ["disabled", "imageSrc"], (instance) => {
                    instance.someEvent.subscribe((e: any) => {
                        // DO SOMETHING
                    });
                }),
                editorOptions: {
                    imageSrc: "/assets/nome-da-imagem.jpg",
                },
                dynamicOptions: [{
                    toSet: "editorOptions.disabled",
                    value: (e) => (e.data.email && e.data.password)
                }]
            }, 
            // Pronto, o formulário desenvolvido dentro do componente endereço agora obedece ao formulário Perfil de Usuário
        ]
    }

    // Eh necessário pedir o servico de amarração
    constructor(private tie: VsTieCustomComponents) {}

}

Existe também o método onTemplate, que insere um componente em qualquer área que tem o atributo template do devextreme.

// todo: doc do onTemplate

GRADE

O básico, import { VsGridModule } from 'vst-gridform'.

O component VsFormComponent recebe apenas 4 components:

  • format: CustomTemplateFormat
  • templates: Array
  • useCssHiden: boolean = false
  • schema: VsGridSchema

e possui 3 saídas:

  • onEvent: EventEmitter
  • onFormEvent: EventEmitter
  • formatChange: EventEmitter

@Input() useCssHiden: boolean; (Default: false)

Se true insere o formulário no DOM, e gerencia usando CSS para esconder e aparecer. Caso contrário, o funcionamento padrão, trabalha com o formulário na memória. Usando useCssHiden pode demorar mais pra abrir a grid pela primeira vez, porém o formulário fica mais rápido.

@Input() format: CustomTemplateFormat; (Default: 'edit')

Como o datagrid deve ser renderizado.

@Input() templates: Array;

Templates customizados. É complicado dessa maneita. Recomendo usar o Customtemplate.

@Input('schema') schema: VsGridSchema;

Logo abaixo terá a definição do schema.

@Output() onEvent: EventEmitter;

Documentação aqui

@Output() onFormEvent: EventEmitter;

Entrega eventos que acontecem no formulário interno. Mesma definição do onEvent dentro do formulário acima.

@Output() formatChange: EventEmitter;

Emite um sinal quando o format é alterado.

VsGridSchema

O schema é a parte mais importante do <vs-grid ... [schema]="schema"></vs-grid>, é o responsável por levar as instruções iniciais para a datagrid se renderizar, e também regula o comportamento. Em sua maioria é composta por instruções e parametros definidos no DxDataGrid, logo a maior parte da documentação do VsGridSchema é proprío da documentação original.

O VsGrid tem muito menos customização que o VsForm. São apenas 3 customizações:

allowRefresh?: boolean;

Insere um botão na toolbar do datagrid. E esse botão permite ao usuário fazer refresh dos dados da tabela.

transform?: VsTransform;

Mesmo que o transform do formulário. Só que usa a transformação antes de enviar os dados para o datasurce.

gridClass?: string;

Uma classe CSS para a grade.

auxiliarDetail?: Array;

Lista de detalhes auxiliares. Para usar mais de um master details.

// toto: doc

auxiliarDetailStyle?: "tabs" | "rows" | "columns"; (Default: "rows")

Tipo de estilo em que os detalhes serão renderizados

columnsn.mask

Adição de máscara para o campo ficar visualmente melhor na datagrid.

DOC onEvent

@Output() onEvent: EventEmitter;

Emite sinais nas seguintes fases: | ENUM | DESCRIÇÃO | |------|-----------| | VsWidgetEvent.beforeInit | Dispara junto ao ngOnInit do Angular e antes do onInitialized do Devextreme. Porém esse Evento dispara antes das inicializações e configurações internas do VsWidget | | VsWidgetEvent.onInit | Dispara junto ao ngOnInit do Angular e antes do onInitialized do Devextreme. Porém esse Evento dispara depois das inicializações e configurações internas do VsWidget | | VsWidgetEvent.afterInit | Dispara junto ao ngAfterViewInit do Angular | | VsWidgetEvent.onDestroy | Dispara quando o componente entra em no processo de destruição pelo Angular | | VsWidgetEvent.hide | Quando o componente está se escondendo na tela. | | VsWidgetEvent.show | Quando o componente está aparecendo na tela. |

6.1.0

3 years ago

6.2.0-beta.1

3 years ago

6.0.5

3 years ago

6.0.1

3 years ago

6.0.0

3 years ago

6.0.3

3 years ago

6.0.2

3 years ago

6.0.4

3 years ago

6.0.0-beta.3

3 years ago

6.0.0-beta.1

3 years ago

6.0.0-beta.2

3 years ago

5.1.20-beta.31

3 years ago

5.1.20-beta.30

3 years ago

5.1.20-beta.33

3 years ago

5.1.20-beta.32

3 years ago

5.1.20-beta.28

3 years ago

5.1.20-beta.27

3 years ago

5.1.20-beta.26

4 years ago

5.1.20-beta.25

4 years ago

5.1.20-beta.29

3 years ago

5.1.20-beta.24

4 years ago

5.1.20-beta.23

4 years ago

5.1.20-beta.22

4 years ago

5.1.20-beta.21

4 years ago

5.1.20-beta.20

4 years ago

5.1.20-beta.19

4 years ago

5.1.20-beta.18

4 years ago

5.1.20-beta.17

4 years ago

5.1.20-beta.16

4 years ago

5.1.20-beta.15

4 years ago

5.1.20-beta.14

4 years ago

5.1.20-beta.13

4 years ago

5.1.20-beta.9

4 years ago

5.1.20-beta.6

4 years ago

5.1.20-beta.7

4 years ago

5.1.20-beta.8

4 years ago

5.1.20-beta.12

4 years ago

5.1.20-beta.11

4 years ago

5.1.20-beta.10

4 years ago

5.1.20-beta.4

4 years ago

5.1.20-beta.5

4 years ago

5.1.19

4 years ago

5.1.18

4 years ago

5.1.17

4 years ago

5.1.16

4 years ago

5.1.15

4 years ago

5.1.14

4 years ago

5.1.13

4 years ago

5.1.20-beta.1

4 years ago

5.1.20-beta.2

4 years ago

5.1.20-beta.3

4 years ago

5.1.12

4 years ago

5.1.11

4 years ago

5.1.9

4 years ago

5.1.10

4 years ago

5.1.9-beta.1

4 years ago

5.1.9-beta.0

4 years ago

5.1.8-beta.7

4 years ago

5.1.8-beta.2

4 years ago

5.1.8-beta.6

4 years ago

5.1.8-beta.5

4 years ago

5.1.8-beta.4

4 years ago

5.1.8-beta.3

4 years ago

5.1.8-beta.1

4 years ago

5.1.8-beta.0

4 years ago

5.1.7-beta.6

4 years ago

5.1.7-beta.7

4 years ago

5.1.7-beta.5

4 years ago

5.1.6-beta.0

4 years ago

5.1.6-beta.1

4 years ago

5.1.7-beta.2

4 years ago

5.1.7-beta.3

4 years ago

5.1.7-beta.4

4 years ago

5.1.7-beta.0

4 years ago

5.1.7-beta.1

4 years ago

5.1.5-beta.11

4 years ago

5.1.4-beta.12

4 years ago

5.1.4-beta.13

4 years ago

5.1.4-beta.14

4 years ago

5.1.4-beta.10

4 years ago

5.1.4-beta.11

4 years ago

5.1.5-beta.8

4 years ago

5.1.5-beta.9

4 years ago

5.1.5-beta.6

4 years ago

5.1.5-beta.7

4 years ago

5.1.5-beta.4

4 years ago

5.1.5-beta.5

4 years ago

5.1.5-beta.2

4 years ago

5.1.5-beta.3

4 years ago

5.1.5-beta.0

4 years ago

5.1.5-beta.1

4 years ago

5.1.4-beta.5

4 years ago

5.1.4-beta.7

4 years ago

5.1.4-beta.8

4 years ago

5.1.4-beta.9

4 years ago

5.1.5-beta.10

4 years ago

5.1.4-beta.4

4 years ago

5.1.4-beta.3

4 years ago

5.1.4-beta.0

4 years ago

5.1.4-beta.1

4 years ago

5.1.4-beta.2

4 years ago

5.1.3-beta.4

4 years ago

5.1.3-beta.1

4 years ago

5.1.3-beta.3

4 years ago

5.1.3-beta.2

4 years ago

5.1.3-beta.0

4 years ago

5.1.2-beta.30

4 years ago

5.1.2-beta.29

4 years ago

5.1.2-beta.26

4 years ago

5.1.2-beta.28

4 years ago

5.1.2-beta.27

4 years ago

5.1.2-beta.25

4 years ago

5.1.2-beta.24

4 years ago

5.1.2-beta.22

4 years ago

5.1.2-beta.21

4 years ago

5.1.2-beta.23

4 years ago

5.1.2-beta.20

4 years ago

5.1.2-beta.19

4 years ago

5.1.2-beta.18

4 years ago

5.1.2-beta.17

4 years ago

5.1.2-beta.16

4 years ago

5.1.2-beta.15

4 years ago

5.1.2-beta.14

4 years ago

5.1.2-beta.13

4 years ago

5.1.2-beta.12

4 years ago

5.1.2-beta.11

4 years ago

5.1.2-beta.10

4 years ago

5.1.2-beta.8

4 years ago

5.1.2-beta.9

4 years ago

5.1.2-beta.3

4 years ago

5.1.2-beta.4

4 years ago

5.1.2-beta.1

4 years ago

5.1.2-beta.2

4 years ago

5.1.2-beta.7

4 years ago

5.1.2-beta.5

4 years ago

5.1.2-beta.6

4 years ago

5.1.2-14

4 years ago

5.1.2-9

4 years ago

5.1.2-7

4 years ago

5.1.2-8

4 years ago

5.1.2-5

4 years ago

5.1.2-6

4 years ago

5.1.2-3

4 years ago

5.1.2-4

4 years ago

5.1.2-1

4 years ago

5.1.2-2

4 years ago

5.1.2

4 years ago

5.1.1

4 years ago

5.1.2-11

4 years ago

5.1.2-10

4 years ago

5.1.2-13

4 years ago

5.1.2-12

4 years ago

5.1.0

4 years ago

5.1.0-beta.1

4 years ago

5.1.0-beta.2

4 years ago

5.1.0-beta.3

4 years ago

5.0.13-beta.4

4 years ago

5.0.13-beta.5

4 years ago

5.0.13-beta.3

4 years ago

5.0.13-beta.8

4 years ago

5.0.13-beta.9

4 years ago

5.0.13-beta.6

4 years ago

5.0.13-beta.7

4 years ago

5.0.9

4 years ago

5.0.8

4 years ago

5.0.7

4 years ago

5.0.6

4 years ago

5.0.10

4 years ago

5.0.11

4 years ago

5.0.12

4 years ago

5.0.10-beta.10

4 years ago

5.0.13-beta.1

4 years ago

5.0.13-beta.2

4 years ago

5.0.10-beta.8

4 years ago

5.0.10-beta.7

4 years ago

5.0.10-beta.9

4 years ago

5.0.10-beta.3

4 years ago

5.0.10-beta.6

4 years ago

5.0.10-beta.5

4 years ago

5.0.10-beta.2

4 years ago

5.0.10-beta.1

4 years ago

5.0.5

4 years ago

5.0.4

4 years ago

5.0.3

4 years ago

5.0.2

4 years ago

5.0.1

4 years ago

5.0.0

4 years ago

5.0.0-beta.1

4 years ago

4.16.0

4 years ago

4.16.1

4 years ago

4.16.2

4 years ago

4.15.12

4 years ago

4.15.11

4 years ago

4.15.10

4 years ago

4.15.9

4 years ago

4.15.8

4 years ago

4.15.7

4 years ago

4.15.4

4 years ago

4.15.5

4 years ago

4.15.6

4 years ago

4.15.0

4 years ago

4.15.1

4 years ago

4.15.2

4 years ago

4.15.3

4 years ago

4.14.1

4 years ago

4.14.0-beta.1

4 years ago

4.13.2

5 years ago

4.13.1

5 years ago

4.13.0

5 years ago

4.12.1

5 years ago

4.12.2

5 years ago

4.12.0

5 years ago

4.12.0-beta.5

5 years ago

4.12.0-beta.4

5 years ago

4.12.0-beta.3

5 years ago

4.11.0-beta.8

5 years ago

4.12.0-beta.1

5 years ago

4.12.0-beta.2

5 years ago

4.11.0-beta.7

5 years ago

4.11.0-beta.5

5 years ago

4.11.0-beta.6

5 years ago

4.11.0-beta.1

5 years ago

4.11.0-beta.2

5 years ago

4.11.0-beta.3

5 years ago

4.11.0-beta.4

5 years ago

4.10.3

5 years ago

4.10.2

5 years ago

4.10.1

5 years ago

4.10.0

5 years ago

4.10.0-beta.64

5 years ago

4.10.0-beta.65

5 years ago

4.10.0-beta.63

5 years ago

4.10.0-beta.62

5 years ago

4.10.0-beta.61

5 years ago

4.10.0-beta.60

5 years ago

4.10.0-beta.59

5 years ago

4.10.0-beta.57

5 years ago

4.10.0-beta.58

5 years ago

4.10.0-beta.56

5 years ago

4.10.0-beta.55

5 years ago

4.10.0-beta.53

5 years ago

4.10.0-beta.54

5 years ago

4.10.0-beta.52

5 years ago

4.10.0-beta.51

5 years ago

4.10.0-beta.50

5 years ago

4.10.0-beta.49

5 years ago

4.10.0-beta.48

5 years ago

4.10.0-beta.46

5 years ago

4.10.0-beta.47

5 years ago

4.10.0-beta.44

5 years ago

4.10.0-beta.45

5 years ago

4.10.0-beta.42

5 years ago

4.10.0-beta.43

5 years ago

4.10.0-beta.41

5 years ago

4.10.0-beta.40

5 years ago

4.10.0-beta.39

5 years ago

4.10.0-beta.38

5 years ago

4.10.0-beta.37

5 years ago

4.10.0-beta.36

5 years ago

4.10.0-beta.35

5 years ago

4.10.0-beta.34

5 years ago

4.10.0-beta.33

5 years ago

4.10.0-beta.32

5 years ago

4.10.0-beta.29

5 years ago

4.10.0-beta.31

5 years ago

4.10.0-beta.28

5 years ago

4.10.0-beta.27

5 years ago

4.10.0-beta.26

5 years ago

4.10.0-beta.25

5 years ago

4.10.0-beta.24

5 years ago

4.10.0-beta.23

5 years ago

4.10.0-beta.22

5 years ago

4.10.0-beta.21

5 years ago

4.10.0-beta.20

5 years ago

4.10.0-beta.19

5 years ago

4.10.0-beta.18

5 years ago

4.10.0-beta.17

5 years ago

4.10.0-beta.15

5 years ago

4.10.0-beta.16

5 years ago

4.10.0-beta.13

5 years ago

4.10.0-beta.14

5 years ago

4.10.0-beta.12

5 years ago

4.10.0-beta.11

5 years ago

4.10.0-beta.10

5 years ago

4.10.0-beta.9

5 years ago

4.10.0-beta.8

5 years ago

4.10.0-beta.6

5 years ago

4.10.0-beta.7

5 years ago

4.10.0-beta.4

5 years ago

4.10.0-beta.5

5 years ago

4.9.5

5 years ago

4.10.0-beta.2

5 years ago

4.10.0-beta.1

5 years ago

4.9.4

5 years ago

4.9.3

5 years ago

4.9.2

5 years ago

4.9.1

5 years ago

4.9.0

5 years ago

4.8.2

5 years ago

4.8.1

5 years ago

4.8.0

5 years ago

4.7.7

5 years ago

4.7.6

5 years ago

4.7.5

5 years ago

4.7.4

5 years ago

4.7.2

5 years ago

4.7.1

5 years ago

4.7.3

5 years ago

4.7.0

5 years ago

4.6.11

5 years ago

4.6.10

5 years ago

4.6.9

5 years ago

4.6.8

5 years ago

4.6.7

5 years ago

4.6.6

5 years ago

4.6.5

5 years ago

4.6.4

5 years ago

4.6.3

5 years ago

4.6.2

5 years ago

4.6.1

5 years ago

4.6.0

5 years ago

4.5.5

5 years ago

4.5.0

5 years ago

4.5.2

5 years ago

4.5.1

5 years ago

4.5.4

5 years ago

4.5.3

5 years ago

4.4.4

5 years ago

4.4.3

5 years ago

4.4.2

5 years ago

4.4.1

5 years ago

4.4.0

5 years ago

4.3.15

5 years ago

4.3.14

5 years ago

4.3.13

5 years ago

4.3.12

5 years ago

4.3.11

5 years ago

4.3.10

5 years ago

4.3.9

5 years ago

4.3.8

5 years ago

4.3.6

5 years ago

4.3.7

5 years ago

4.3.5

5 years ago

4.3.4

5 years ago

4.3.3

5 years ago

4.3.2

5 years ago

4.3.1

5 years ago

4.3.0

5 years ago

4.2.4

5 years ago

4.2.3

5 years ago

4.2.2

5 years ago

4.2.1

5 years ago

4.2.0

5 years ago

4.1.2

5 years ago

4.1.0

5 years ago

4.1.1

5 years ago

4.0.3

5 years ago

4.0.2

5 years ago

4.0.1

5 years ago

4.0.0

5 years ago

3.3.1

5 years ago

3.3.0

5 years ago

3.3.0-beta.3

5 years ago

3.3.0-beta.2

5 years ago

3.3.0-beta.1

5 years ago

3.2.0

5 years ago

3.1.3

5 years ago

3.1.2

5 years ago

3.1.1

5 years ago

3.1.0

5 years ago

3.0.6

5 years ago

3.0.4

5 years ago

3.0.5

5 years ago

3.0.3

5 years ago

3.0.2

5 years ago

3.0.1

5 years ago

3.0.0-beta.22.1

5 years ago

3.0.0-beta.21

6 years ago

3.0.0-beta.20

6 years ago

3.0.0-beta.19

6 years ago

3.0.0-beta.17

6 years ago

3.0.0-beta.18

6 years ago

3.0.0-beta.14

6 years ago

3.0.0-beta.15

6 years ago

3.0.0-beta.13

6 years ago

3.0.0-beta.11

6 years ago

3.0.0-beta.12

6 years ago

3.0.0-beta.9

6 years ago

3.0.0-beta.10

6 years ago

3.0.0-beta.7

6 years ago

3.0.0-beta.6

6 years ago

3.0.0-beta.8

6 years ago

3.0.0-beta.5

6 years ago

3.0.0-beta.4

6 years ago

3.0.0-beta.3

6 years ago

3.0.0-beta.1

6 years ago

3.0.0-beta.2

6 years ago

3.0.0-alpha.43

6 years ago

3.0.0-alpha.42

6 years ago

3.0.0-alpha.41

6 years ago

3.0.0-alpha.40

6 years ago

3.0.0-alpha.36

6 years ago

3.0.0-alpha.35

6 years ago

3.0.0-alpha.34

6 years ago

3.0.0-alpha.33

6 years ago

3.0.0-alpha.32

6 years ago

3.0.0-alpha.31

6 years ago

3.0.0-alpha.30

6 years ago

3.0.0-alpha.29

6 years ago

3.0.0-alpha.28

6 years ago

3.0.0-alpha.27

6 years ago

3.0.0-alpha.26

6 years ago

3.0.0-alpha.25

6 years ago

3.0.0-alpha.24

6 years ago

3.0.0-alpha.23

6 years ago

3.0.0-alpha.22

6 years ago

3.0.0-alpha.21

6 years ago

3.0.0-alpha.20

6 years ago

3.0.0-alpha.19

6 years ago

3.0.0-alpha.18

6 years ago

3.0.0-alpha.17

6 years ago

3.0.0-alpha.16

6 years ago

3.0.0-alpha.15

6 years ago

3.0.0-alpha.14

6 years ago

3.0.0-alpha.13

6 years ago

3.0.0-alpha.12

6 years ago

3.0.0-alpha.11

6 years ago

3.0.0-alpha.10

6 years ago

3.0.0-alpha.9

6 years ago

3.0.0-alpha.8

6 years ago

3.0.0-alpha.7

6 years ago

3.0.0-alpha.6

6 years ago

3.0.0-alpha.5

6 years ago

3.0.0-alpha.4

6 years ago

3.0.0-alpha.3

6 years ago

3.0.0-alpha.2

6 years ago

3.0.0-alpha.1

6 years ago

2.3.0-beta.61

6 years ago

2.3.0-beta.60

6 years ago

2.3.0-beta.59

6 years ago

2.3.0-beta.58

6 years ago

2.3.0-beta.57

6 years ago

2.3.0-beta.56

6 years ago

2.3.0-beta.55

6 years ago

2.3.0-beta.54

6 years ago

2.3.0-beta.53

6 years ago

2.3.0-beta.52

6 years ago

2.3.0-beta.51

6 years ago

2.3.0-beta.50

6 years ago

2.3.0-beta.49

6 years ago

2.3.0-beta.48

6 years ago

2.3.0-beta.47

6 years ago

2.3.0-beta.46

6 years ago

2.3.0-beta.45

6 years ago

2.3.0-beta.44

6 years ago

2.3.0-beta.43

6 years ago

2.3.0-beta.42

6 years ago

2.3.0-beta.40

6 years ago

2.3.0-beta.39

6 years ago

2.3.0-beta.38

6 years ago

2.3.0-beta.37

6 years ago

2.3.0-beta.36

6 years ago

2.3.0-beta.35

6 years ago

2.3.0-beta.34

6 years ago

2.3.0-beta.33

6 years ago

2.3.0-beta.32

6 years ago

2.3.0-beta.31

6 years ago

2.3.0-beta.30

6 years ago

2.3.0-beta.26

6 years ago

2.3.0-beta.25

6 years ago

2.3.0-beta.22

6 years ago

2.3.0-beta.20

6 years ago

2.3.0-beta.19

6 years ago

2.3.0-beta.18

6 years ago

2.3.0-beta.17

6 years ago

2.3.0-beta.16

6 years ago

2.3.0-beta.15

6 years ago

2.3.0-beta.14

6 years ago

2.3.0-beta.13

6 years ago

2.3.0-beta.12

6 years ago

2.3.0-beta.11

6 years ago

2.3.0-beta.10

6 years ago

2.3.0-beta.9

6 years ago

2.3.0-beta.8

6 years ago

2.3.0-beta.7

6 years ago

2.3.0-beta.6

6 years ago

2.3.0-beta.5

6 years ago

2.3.0-beta.4

6 years ago

2.3.0-beta.3

6 years ago

2.3.0-beta.2

6 years ago

2.3.0-beta.1

6 years ago

2.3.0-beta.0

6 years ago

2.2.1

6 years ago

2.2.0

6 years ago

2.1.2

6 years ago

2.1.1

6 years ago

2.1.0

6 years ago

2.0.3

6 years ago

2.0.2

6 years ago

2.0.1

6 years ago

2.0.0-beta.5

6 years ago

2.0.0-beta.4

6 years ago

2.0.0-beta.3

6 years ago

2.0.0-beta.2

6 years ago

2.0.0-beta.1

6 years ago

1.12.0

6 years ago

1.11.1

6 years ago

1.11.0

6 years ago

1.10.2

6 years ago

1.10.0

6 years ago

1.9.0

6 years ago

1.8.2

6 years ago

1.8.1

6 years ago

1.8.0

6 years ago

1.7.3

6 years ago

1.7.2

6 years ago

1.7.1

6 years ago

1.7.0

6 years ago

1.6.2

6 years ago

1.6.1

6 years ago

1.6.0

6 years ago

1.5.1

6 years ago

1.5.0

6 years ago

1.4.2

6 years ago

1.4.1

6 years ago

1.4.0

6 years ago

1.2.0

6 years ago

1.1.3

6 years ago

1.1.2

6 years ago

1.1.1

6 years ago

1.1.0

6 years ago

1.0.0

6 years ago

0.1.10

6 years ago

0.1.9

6 years ago

0.1.8

6 years ago

0.1.7

6 years ago

0.1.6

6 years ago

0.1.5

6 years ago

0.1.4

6 years ago

0.1.3

6 years ago

0.1.2

6 years ago

0.1.1

6 years ago

0.1.0

6 years ago

0.0.36

6 years ago

0.0.35

6 years ago

0.0.33

6 years ago

0.0.32

6 years ago

0.0.31

6 years ago

0.0.30

6 years ago

0.0.29

6 years ago

0.0.28

6 years ago

0.0.27

6 years ago

0.0.26

6 years ago

0.0.25

6 years ago

0.0.24

6 years ago

0.0.23

6 years ago

0.0.22

7 years ago

0.0.21

7 years ago

0.0.20

7 years ago

0.0.19

7 years ago

0.0.18

7 years ago

0.0.17

7 years ago

0.0.16

7 years ago

0.0.15

7 years ago

0.0.14

7 years ago

0.0.13

7 years ago

0.0.12

7 years ago

0.0.11

7 years ago

0.0.10

7 years ago

0.0.9

7 years ago

0.0.8

7 years ago

0.0.7

7 years ago

0.0.6

7 years ago

0.0.4

7 years ago

0.0.3

7 years ago

0.0.2

7 years ago

0.0.1

7 years ago