mercoledì 4 luglio 2012

Wicket - Input Text con Autocomplete

Prima o poi ti chiedono anche di fare un input text con i suggerimenti alla Google. Wicket ci permette di farlo in pochi passi.

final AutoCompleteTextField destinatario = new AutoCompleteTextField("destinatario", new PropertyModel<String>(email,"userNameDestinatario"))
 {
      protected Iterator getChoices(String input)
      {
          if (Strings.isEmpty(input))
          {
              return Collections.EMPTY_LIST.iterator();
          }
          
          List<String> elencoFittizio = new ArrayList<String>();
          elencoFittizio.add("Pippo");
          elencoFittizio.add("Pluto");
          elencoFittizio.add("Paperino");
          elencoFittizio.add("Minnie");
          elencoFittizio.add("Paperone");
          elencoFittizio.add("Nonna Papera");
          
          List<String> elencoPulito = new ArrayList<String>();
          
          for (String nome : elencoFittizio){
              nome = nome.toLowerCase();
              String probe = input.toLowerCase();
              if (nome.contains(probe)){
                  elencoPulito.add(nome);
              }
          }
          return  elencoPulito.iterator();
       }
 };

Per farlo usiamo il componente AutoCompleteTextField che aggancieremo ad un tag HTML classico di tipo INPUT TEXT.

Come vedete il costruttore è piuttosto classico. Si definisce il wicket:id (destinatario) e nel mio caso il PropertyModel così da riempire direttamente la proprietà userNameDestinatario dentro l'oggetto email.

A questo punto occorre implementare il metodo che gestisce cosa farci vedere. Come vedete ci viene dato in ingresso una stringa input che rappresenta ciò che l'utente sta inserendo.

Il metodo richiede in uscita un Iterator ovvero l'oggetto che permette a Java di scorrere le Collections ovvero qualsiasi oggetti che rappresenta un elenco di qualcosa.

Se la stringa è vuota, creo una Collections vuota e ritorno l'iterator.

Negli altri casi, devo ritornare l'iterator della lista pulita ovvero della lista risultante dal controllo con l'input inserito.

Nel codice sopra ho mokkato il codice inserendo una lista finta. E' ipotizzabile che qui agganciate un metodo che vada su DB a fare la query e ritorni una lista di cui poi ritornerete l'iterator.

Per farvi capire bene però, nell'esempio ho una lista completa che poi vado a sfoltire sulla base della stringa in ingresso. Nel caso sopra creo una nuova lista con gli elementi della prima che contengono la stringa in input.

Se invece avessi voluto l'aggancio ad un eventuale DB tramite un manager, avrei avuto:


final AutoCompleteTextField destinatario = new AutoCompleteTextField("destinatario", new PropertyModel<String>(email,"userNameDestinatario"))
 {
      protected Iterator getChoices(String input)
      {
          if (Strings.isEmpty(input))
          {
              return Collections.EMPTY_LIST.iterator();
          }
          
          List<String> utentiFiltrati = getManager().cercaUtentiLike(input);
          return  utentiFiltrati.iterator();
       }
 };

Come vedete non mi interessa cosa faccia la cercaUtentiLike, mi interessa solo che mi ritorni una Lista di Stringhe, probabilmente filtrate in fase di interrogazione al DB.

Nessun commento:

Posta un commento