



# mreAutocomplete2








`<mre-autocomplete-2>` é um componente de input que exibe um drop-down dos resultados da pesquisa realizada.
 Esse componente possibilita a customização da listagem dos itens exibidos através do `<mre-autocomplete-template>`.
 E a customização do que será exibido quando nenhum item é encontrado através do `<mre-autocomplete-not-found>`.

 Permite também destacar e customizar através de CSS a parte do resultado que combina com a pesquisa.
 Feito pela utilização da diretiva `mre-ac-highlight` no elemento que contém o texto.

## Instalação

- Adicionar o arquivo CSS no HTML

```html
<link rel="stylesheet" href="/vendor/mre-autocomplete-2/assets/css/mre-autocomplete-2.css">
```
- Adicionar o arquivo JS no HTML

```html
<scprit src="/vendor/mre-autocomplete-2/src/mre-autocomplete-2.js"></script>
```
- Injetar o módulo na aplicação

```javascript
angular.module('seu.module', [
     'mre.autocomplete2'
]);
```

No `<mre-autocomplete-template>` monta-se o template de exibição de cada item da listagem através de HTML. Sendo
os valores dos itens acessados da mesma forma que o ng-repeat, utilizando a variavel `item` declarada em `items`.
Por exemplo, caso na diretiva em `items` esteja `item in resultados` o objeto poderá ser acessado normalmente com `{{ item.dsItem }}`.

No `<mre-autocomplete-not-found>` monta-se o template do que será exibido caso nenhum item corresponda a pesquisa, utilizando HTML.

Quando se for listar itens retornados de um resource, a declaração dos objetos em `items`
(no exemplo: item in `pesquisaResultados(modelTexto)`) deve retornar a promise desta, o que é feito acrescentado `.$promise` ao final da função da resource, conforme o exemplo abaixo.

### Javascript
```javascript
  function AppController($scope, ServicoResource) {
    $scope.pesquisaResultados = function(searchText) {
      return ServicoResource.get({param: vlParam}, function (response) {

      }, function (error) {
          Materialize.toast(error.message);
      }).$promise;
    };

    $scope.mudancaTexto = function (modelTexto) {
      console.log(modelTexto);
     }
  }
```

### HTML
```html
<mre-autocomplete-2
     input-id="idInput"
     input-name="nomeInput"
     floating-label="Label do Input"
     placeholder="Placeholder do Input"
     list-class="classe-lista"
     search-text-model="modelTexto"
     items="item in pesquisaResultados(modelTexto)"
     item-text="item.dsItemResultado"
     text-change="mudancaTexto(modelTexto)"
     delay="500"
     obj-path="caminho.objeto"
     on-change="SuaController.function(item)"
     is-required="(condição ou true)"
     min-length="3"
     on-blur="function()"
>
  <mre-autocomplete-template>
     <div class="classe-item" style="padding: 16px; line-height: 16px">
         <div mre-ac-highlight>{{ item.dsItemResultado }}</div>
     </div>
  </mre-autocomplete-template>
  <mre-autocomplete-not-found>
     <div>
         Nenhum Item Encontrado.
     </div>
  </mre-autocomplete-not-found>
</mre-autocomplete-2>
```

É utilizado `<mre-autocomplete-template>` para especificar o layout dos itens a serem exibidos e o `<mre-autocomplete-not-found>`
para o layout de quando nenhum item for encontrado.

Também utiliza-se da diretiva `<mre-ac-highlight>` dentro de um elemento do `<mre-autocomplete-template>` para se
destacar o termo pesquisado no texto dentro deste.

# is-select

Para layout padrão utiliza-se da clase `mre-autocomplete-select` no parâmetro `list-class` da diretiva, e o conteúdo a ser exibido dentro da tag `span` no `</mre-autocomplete-template>` e `<mre-autocomplete-not-found>`

Em `items` deve-se passar um array de objetos para ser feita a busca nestes, no exemplo `arrayObjetos`.

### Javascript
```javascript
  function AppController($scope, ServicoResource) {
     $scope.arrayObjetos = [
         {
             "id": 1,
             "descricao": 'Teste 1'
         },
         {
             "id": 2,
             "descricao": 'Teste 2'
         },
         {
             "id": 3,
             "descricao": 'Teste 3'
         },
         {
             "id": 4,
             "descricao": 'Teste 4'
         },
         {
             "id": 5,
             "descricao": 'Descricao 1'
         },
         {
             "id": 6,
             "descricao": 'Descricao 2'
         },
     ];

  }
```

### HTML
```html
<mre-autocomplete-2
     input-id="idInput"
     input-name="nomeInput"
     floating-label="Label do Input"
     placeholder="Placeholder do Input"
     list-class="mre-autocomplete-select"
     search-text-model="modelTexto"
     items="item in arrayObjetos"
     item-text="item.descricao"
     on-change="SuaController.function(item)"
     is-required="(condição ou true)"
     on-blur="function()"
     is-select>
     <mre-autocomplete-template>
         <span mre-ac-highlight>
             {{ item.descricao }}
         </span>
     </mre-autocomplete-template>

     <mre-autocomplete-not-found>
         <span>
             Nenhum Item Encontrado.
         </span>
     </mre-autocomplete-not-found>
</mre-autocomplete-2>
```








## Usage



* as attribute:
    ```
    <ANY
      items=""
      [text-change=""]
      [search-text-model=""]
      [selected-item=""]
      [item-text=""]
      [placeholder=""]
      [min-length=""]
      [delay=""]
      [list-class=""]
      [floating-label=""]
      [input-name=""]
      [input-id=""]
      [is-select=""]>
    ...
    </ANY>
    ```




### Arguments

| Param | Type | Details |
| :--: | :--: | :--: |
| items | expression | <p>Uma expressão no formato <code>item in resultados</code>. O <code>resultados</code> pode ser uma função que retorna os resultados de forma sincrona ou assincrona (por Promise)</p>  |
| text-change | expression= | <p>Um expressão que irá rodar cada vez que o texto de busca mudar.</p>  |
| search-text-model | expression= | <p>Uma model utilizada para armazenar o texto de busca.</p>  |
| selected-item | object= | <p>Uma model para armazenar o item selecionado.</p>  |
| item-text | expression= | <p>Uma expressão que vai converter seu objeto para uma string.</p>  |
| placeholder | string= | <p>Texto do Placeholder que será aplicado no input.</p>  |
| min-length | number= | <p>Determina o número minimo de caracteres do texto para o autocomplete fazer sugestões.</p>  |
| delay | number= | <p>Determina a quantidade de tempo (em milliseconds) para esperar antes de buscar resultados.</p>  |
| list-class | string= | <p>Aplica a classe CSS na caixa que engloba a listagem do autocomplete.</p>  |
| floating-label | string= | <p>Texto da label do autocomplete.</p>  |
| input-name | string= | <p>O atributo name do elemento input</p>  |
| input-id | string= | <p>O ID do elemento input</p>  |
| is-select | string= | <p>Quando presente altera o autocomplete para parecer um select</p>  |
| on-blur | string= | <p>Ao tirar o focu do campo executar uma ação</p>  |




# mreAcHighlight








A diretiva `mre-ac-highlight` faz com que seja possível aplicar CSS ao texto pesquisado no autocomplete em um
elemento.  O texto será colocado dentro de um `<span class="highlight"></span>` que pode ser estilizado.








## Usage


```
### Exemplo
<hljs lang="html">
<mre-autocomplete-2
     input-id="idInput"
     input-name="nomeInput"
     floating-label="Label Input"
     search-text-model="modelTexto"
     items="item in pesquisaResultados(modelTexto)"
     item-text="item.dsItemResultado"
     delay="500"
     obj-path="caminho.objeto"
     min-length="3"
     on-blur="function()">
  <mre-autocomplete-template>
     <div style="padding: 16px; line-height: 16px">
         <div mre-ac-highlight>{{ item.dsItemResultado }}</div>
     </div>
  </mre-autocomplete-template>
     <mre-autocomplete-not-found>
         <div>
             Nenhum Item Encontrado.
         </div>
     </mre-autocomplete-not-found>
</mre-autocomplete-2>
</hljs>

É utilizado o atributo `mre-ac-highlight` dentro do `mre-autocomplete-template` para se destacar o termo
pesquisado no texto dentro daquela <div>.
```








