Das Modul linkki-f10-search stellt Suchkomponenten zur Verfügung, die alle Produkte für die primäre Suche nutzen können.

<dependency>
    <groupId>org.linkki-framework</groupId>
    <artifactId>linkki-f10-search</artifactId>
</dependency>

Die Suche lässt sich auf zwei verschiedene Arten einbinden:

Benötigte Klassen

Unabhängig von der Art der Suche werden einige Klassen benötigt, die selbst erstellt werden müssen.

Suchparameter

Ein Modellobjekt für Suchparameter

SampleSearchParameters
public class SampleSearchParameters {

    public static final String PROPERTY_PARTNER_NUMBER = "partnerNumber";
    // ggf. weitere Suchparameter

    private String partnerNumber;

    public String getPartnerNumber() {
        return partnerNumber;
    }

    public void setPartnerNumber(String partnerNumber) {
        this.partnerNumber = partnerNumber;
    }

}
PMO für Suchparameter

PMO für das Suchparameter-Modellobjekt um die Eingabe von Suchparameter zu ermöglichen

SampleSearchParametersPmo
public class SampleSearchParametersPmo {

    public static final String SECTOR_FINANCE = "Finanz und Versicherung";
    public static final String SECTOR_TELECOM = "Telekommunikation";

    private final Supplier<SampleSearchParameters> searchParameters;

    private boolean showMore;

    public SampleSearchParametersPmo(Supplier<SampleSearchParameters> searchParameters) {
        this.searchParameters = searchParameters;
        this.showMore = false;
    }

    @ModelObject
    public SampleSearchParameters getSearchParameters() {
        return searchParameters.get();
    }

    // @BindPlaceholder("z.B. B1230984EK")
    @BindAutoFocus
    @UITextField(position = 10, label = "Partnernummer",
            modelAttribute = SampleSearchParameters.PROPERTY_PARTNER_NUMBER)
    public void partnerNumber() {
        // model binding
    }

Wenn das erste UI Element mit @BindAutoFocus annotiert wird, dann wird dieses Element im Browser automatisch immer mit einem Focus-ring selektiert.

Gesammelte Suchergebnisse

Wrapper für eine Liste von einzelnen Suchergebnissen. Es muss möglich sein, aus den gesammelten Suchergebnissen eine MessageList mit evtl. aufgetretenen Fehlern auszulesen. Es empfiehlt sich daher, die Fehler aus dem Suchservice direkt in diesem Objekt zu speichern.

SampleSearchResult
public class SampleSearchResult {

    public static final int DEFAULT_MAX_RESULT_SIZE = 100;

    private List<SampleModelObject> result;
    private MessageList messages;

    SampleSearchResult(List<SampleModelObject> result, MessageList messages) {
        this.result = result;
        this.messages = messages;
    }

    public List<SampleModelObject> getResult() {
        return result;
    }

    public MessageList getMessages() {
        return messages;
    }

    public int getMaxResult() {
        return DEFAULT_MAX_RESULT_SIZE;
    }

}
Einzelnes Suchergebnis

Modellobjekt für ein einzelnes Suchergebnis

SampleModelObject
public class SampleModelObject {

    private String partnerNummber;
    // ggf. weitere Properties

    public SampleModelObject(String partnerNummber) {
        this.partnerNummber = partnerNummber;
    }

    public String getPartnerNummber() {
        return partnerNummber;
    }
}
PMO für ein einzelnes Suchergebnis

PMO für die Anzeige des Suchergebnis als Zeile in der Ergebnistabelle

SampleSearchResultRowPmo
public class SampleSearchResultRowPmo {

    private SampleModelObject modelObject;
    private List<MenuItemDefinition> additionalActions;

    public SampleSearchResultRowPmo(SampleModelObject result,
            List<MenuItemDefinition> additionalActions) {
        this.modelObject = result;
        this.additionalActions = additionalActions;
    }

    public SampleModelObject getModelObject() {
        return modelObject;
    }

    @UILink(position = 10, label = "Partnernummer")
    public String getPartnernummer() {
        return modelObject.getLink();
    }

    public String getPartnernummerCaption() {
        return modelObject.getPartnerNummber();
    }

    @UISearchResultAction
    public List<MenuItemDefinition> getActions() {
        return additionalActions;
    }
}

Für das RowPmo kann die UI Annotation @UISearchResultAction verwendet werden, um mögliche Aktionen auf der Tabellenzeile zu definieren. Diese Aktionen werden dann in einem Menü am Ende der Zeile angeboten.

SearchController

Der SearchController ist zuständig für das Ausführen der Suche. Je nach Suchtyp (kontextfrei, kontextabhängig) unterscheidet sich die Implementierung und die Verwendung. Mehr Details hierzu befinden sich auf der entsprechenden Unterseite für die kontextfreien Suche bzw. für die kontextabhängigen Suche.

Erstellen der Suchkomponente

Für die Suchkomponente wird ein SearchLayoutPmo verwendet, das mit dem SearchLayoutBuilder erzeugt wird.

Beispielimplementierung einer Suchkomponente mithilfe des SearchLayoutBuilder<PARAM, RESULT, MODELOBJECT, ROW>
        return SearchLayoutBuilder
                .<SampleSearchParameters, SampleSearchResult, SampleModelObject, SampleSearchResultRowPmo> with()
                .searchParametersPmo(SampleSearchParametersPmo::new)
                .searchResultRowPmo(m -> new SampleSearchResultRowPmo(m, getAdditionalActions(m)),
                                    SampleSearchResultRowPmo::getModelObject,
                                    SampleSearchResultRowPmo.class)
                .searchController(searchController, SampleSearchResult::getResult)
                .primaryAction(showObject)
                .maxResult(SampleSearchResult.DEFAULT_MAX_RESULT_SIZE)
                .build();

Die "primary action" wird beim Doppelklick auf eine Ergebniszeile ausgeführt. Bei einer kontextfreien Suche ist es üblich den Eintrag auf einer neuen Seite zu öffnen, bei einer kontextabhängigen Suche wird der Eintrag ausgewählt.

Index

  1. Als eigene Seite
  2. Innerhalb einer Seite