Link Browser Window

Qualcuno sa se è possibile ottenere url come risultato di una ricerca all’interno di una finestra browser ? L’obiettivo è che a fronte una ricerca eseguita, sia possibile condividere il link url senza necessariamente salvare il filtro

Ciao @Fala70!

Purtroppo non è possibile ottenere quello che vuoi, da un lato per la mancanza di un API pubblica per impostare tutti i parametri di un controllo Filter, e dall’altra perché anche se potessi impostare tutti i parametri di un filtro, sarebbe un delirio mapparli tutti in una query string (con un limite teorico di circa 2000 caratteri).

Inoltre (non so se sia un baco o un comportamento “normale”) l’evento UrlParamsChangedEvent, che serve per caricare i parametri passati in query string, sembra che venga chiamato solo la prima volta che uno screen viene aperto. Se successivamente provi a cambiare i parametri nell’URL del browser, mentre lo screen è aperto, l’evento non viene mai più lanciato. Lo trovo un po’ “fuorviante” dato che se me lo chiami “UrlParamsChanged” mi aspetterei di essere avvisato sempre.

Comunque se ti vuoi divertire un po’ con le API degli URL, ti posto il codice che ho usato per fare un po’ di prove.

Nello specifico ho fatto un semplice pulsante nella finestra di browse che legge i parametri del filtro corrente e cambia l’URL mettendo tutte le chiavi=valore nella query string.
PS: legge SOLO chiave e valore, ma se guardi l’oggetto com.haulmont.cuba.gui.components.filter.condition.AbstractCondition vedrai che una singola “entry” di un filtro è descritta da un botto di proprietà, quindi se anche tu potessi impostare programmaticamente queste condizioni in un filtro, non riusciresti mai a trasporre TUTTI questi attributi in una query string e stare sotto i 2000 caratteri…

Poi con un evento UrlParamsChangedEvent provo a impostare i param del filtro corrente leggendoli dalla query string, e impostandoli con setParamValue. Il problema è che questo codice è inutile, e vedrai che non ha alcun effetto, perché il metodo setParamValue si aspetta di avere un filtro già costruito con tutte le sue proprietà, mentre noi stiamo semplicemente dicendo di impostare un valore per una configurazione che non esiste.

PS: il metodo che potrebbe servire a “ricostruire” da codice un filtro è protected ed è com.haulmont.cuba.gui.components.filter.FilterDelegateImpl.addCondition, ma comunque come scritto sopra non riusciresti a “serializzare” tutto in uno query string, soprattutto per filtri complessi…

@UiController("provalink_Cliente.browse")
@UiDescriptor("cliente-browse.xml")
@LookupComponent("clientesTable")
@LoadDataBeforeShow
@Route("clienti")
public class ClienteBrowse extends StandardLookup<Cliente> {
    @Inject
    protected Filter filter;

    @Inject
    protected UrlRouting urlRouting;

    @Inject
    protected Notifications notifications;

    @Subscribe("updateUrl")
    protected void onUpdateUrlClick(Button.ClickEvent event) {
        FilterDelegate delegate = ((WebFilter) filter).getDelegate();
        Map<String, String> urlParams = delegate.getConditionsTree().toConditionsList().stream()
                .collect(Collectors.toMap(condition -> condition.getParam().getName(), condition -> Objects.toString(condition.getParam().getValue(), "")));

        urlRouting.replaceState(this, urlParams);
    }

    @Subscribe
    protected void onUrlParamsChanged(UrlParamsChangedEvent event) {
        notifications.create().withCaption("PARAMETRI AGGIORNATI!").show();
        event.getParams().forEach((key, value) -> filter.setParamValue(key, value));
    }
}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<window xmlns="http://schemas.haulmont.com/cuba/screen/window.xsd"
        xmlns:c="http://schemas.haulmont.com/cuba/screen/jpql_condition.xsd"
        caption="msg://browseCaption"
        focusComponent="clientesTable"
        messagesPack="com.company.provalink.web.screens.cliente">
    <data readOnly="true">
        <collection id="clientesDc"
                    class="com.company.provalink.entity.Cliente"
                    view="_local">
            <loader id="clientesDl">
                <query>
                    <![CDATA[select e from provalink_Cliente e]]>
                </query>
            </loader>
        </collection>
    </data>
    <dialogMode height="600"
                width="800"/>
    <layout expand="clientesTable"
            spacing="true">
        <filter id="filter"
                applyTo="clientesTable"
                dataLoader="clientesDl">
            <properties include=".*"/>
        </filter>
        <groupTable id="clientesTable"
                    width="100%"
                    dataContainer="clientesDc">
            <actions>
                <action id="create" type="create"/>
                <action id="edit" type="edit"/>
                <action id="remove" type="remove"/>
            </actions>
            <columns>
                <column id="ragioneSociale"/>
                <column id="indirizzo"/>
                <column id="partitaIva"/>
                <column id="email"/>
            </columns>
            <rowsCount/>
            <buttonsPanel id="buttonsPanel"
                          alwaysVisible="true">
                <button id="createBtn" action="clientesTable.create"/>
                <button id="editBtn" action="clientesTable.edit"/>
                <button id="removeBtn" action="clientesTable.remove"/>
                <button id="updateUrl" caption="Aggiorna Url"/>
            </buttonsPanel>
        </groupTable>
        <hbox id="lookupActions" spacing="true" visible="false">
            <button action="lookupSelectAction"/>
            <button action="lookupCancelAction"/>
        </hbox>
    </layout>
</window>
1 Mi Piace

Come work around secondo te è possibile, salvare un filtro da codice (con anche i dati), e richiamarlo da url ?
Ovvero : viene impostato il filtro con anche i valori, poi attraverso un comando da menu o button, salvo il filtro per poter poi essere richiamato tramite url

Ciao!

Purtroppo non ho trovato nessun modo di costruire un generic filter da codice (i metodi sono protected).

Però si potrebbe vedere come dici tu se si può richiamare da codice un filtro con valori, e usare il nome del filtro come query string nell’url. Andrebbe visto il codice dietro le voci di menù del generic filter (save with values, ecc.).

P.