0

I am currently using vaadin v23. I want to navigate to (change view / page) to "Dashboard"

Default - login page view code looks like this:

package com.fd.jvmbackend.views.adminPanel.login

import com.fd.jvmbackend.extensions.isNull
import com.fd.jvmbackend.views.AdminPanelRoute
import com.fd.jvmbackend.views.BaseView
import com.fd.jvmbackend.views.Extras
import com.vaadin.flow.component.AttachEvent
import com.vaadin.flow.component.DetachEvent
import com.vaadin.flow.component.Text
import com.vaadin.flow.component.Unit
import com.vaadin.flow.component.button.Button
import com.vaadin.flow.component.html.Label
import com.vaadin.flow.component.notification.Notification
import com.vaadin.flow.router.*
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
import org.apache.commons.lang3.RandomStringUtils
import java.util.concurrent.TimeUnit


@Route(value = AdminPanelRoute.LOGIN)
@PageTitle("Login | FD CMS")
class LoginView() : BaseView() {

    private val TAG = "LoginView"

    private var viewModel: LoginViewModel? = null

    override fun onAttach(attachEvent: AttachEvent?) {
        super.onAttach(attachEvent)

        viewModel = LoginViewModel()

        val label = Label("Welcome.")

        val loginField = getLoginTextField("Login", "ex: mike", true, true)
        val passwordField = getPasswordField("Password", "ex. myLongPassword", true, true, true)

        val button = Button("Log in with credentials")
        button.setWidth(15F, Unit.PERCENTAGE)
        button.addClickListener { event ->
            viewModel?.onLoginClicked(loginField.value, passwordField.value)
        }

        add(label)
        add(loginField)
        add(passwordField)

        add(button)

        collectorsJob = lifecycleScope.launch {

            launch {
                viewModel?.getPageTitle()?.collect { value ->
                    println("$TAG -> getPageTitle -> ${value}")
                    ui.get().access {
                        ui.get().page.setTitle(value)
                    }
                }
            }

            launch {
                viewModel?.getErrorText()?.collect { value ->
                    if(value.isNull()){
                        return@collect
                    }

                    ui.get().access {
                        notification?.close()
                        notification = Notification.show(value,TimeUnit.SECONDS.toMillis(5).toInt(),Notification.Position.BOTTOM_CENTER)
                    }

                }
            }


            launch {
                viewModel?.getIsLoading()?.collect { value ->
                    ui.get().access {
                        if (value) {
                            progressDialog = getIndeterminateProgressDialog("Loading", "please wait")
                            progressDialog?.open()
                        } else {
                            progressDialog?.close()
                            progressDialog = null
                        }
                    }

                    ui.get().access {
                        loginField.isEnabled = !value
                    }

                    ui.get().access {
                        passwordField.isEnabled = !value
                    }

                    ui.get().access {
                        button.isEnabled = !value
                    }

                }
            }

            launch {
                viewModel?.getNavigationRouterLink()?.collect { value ->

                    if(value.isNull()){
                        return@collect
                    }

                    ui.get().access {
                        ui.get().navigate(
                            DashboardView::class.java,
                            RouteParameters(Extras.USER_ID, RandomStringUtils.randomAlphabetic(10))
                        )
                    }

                }
            }

        }
    }

    override fun onDetach(detachEvent: DetachEvent?) {
        viewModel?.onCleared()
        viewModel = null
        super.onDetach(detachEvent)
    }
}

AdminPanelRoute.LOGIN = "login", AdminPanelRoute.DASHBOARD = "dashboard"

Code which handles navigating to another page/view looks like this:

ui.get().navigate(DashboardView::class.java, RouteParameters(Extras.USER_ID, RandomStringUtils.randomAlphabetic(10)))

After execution this is what I get:

Caused by: com.vaadin.flow.router.NotFoundException: No route found for the given navigation target 'com.fd.jvmbackend.views.adminPanel.login.DashboardView' and parameters '{extra_user_id=ElKbspkysb}'

DashboardView.kt contents:

package com.fd.jvmbackend.views.adminPanel.login

import com.fd.jvmbackend.util.ResourceHandler
import com.fd.jvmbackend.views.AdminPanelRoute
import com.vaadin.flow.component.AttachEvent
import com.vaadin.flow.component.DetachEvent
import com.vaadin.flow.component.applayout.AppLayout
import com.vaadin.flow.component.applayout.DrawerToggle
import com.vaadin.flow.component.html.Image
import com.vaadin.flow.component.html.Label
import com.vaadin.flow.router.PageTitle
import com.vaadin.flow.router.Route


@Route(value = AdminPanelRoute.DASHBOARD)
@PageTitle("Dashboard | FD CMS")
class DashboardView:AppLayout() {

    private val TAG = "DashboardView"

    val label = Label("Secret message -> ")

    override fun onAttach(attachEvent: AttachEvent?) {
        super.onAttach(attachEvent)

    }

    override fun onDetach(detachEvent: DetachEvent?) {
        super.onDetach(detachEvent)
    }
}

Please tell me where is the mistake. What am I doing wrong ? The view -> DashboardView is registered with @Route annotation.

2 Answers 2

2

Looks like DashboardView::class.java is interpreted as the literal Java String "com.fd.jvmbackend.views.adminPanel.login.DashboardView", not the class object, and the wrong overload of ui.navigate is called. Try passing the Route String (AdminPanelRoute.DASHBOARD) instead.

EDIT: I note you're also passing route parameters with the second parameter of navigate. DashboardView doesn't accept route parameters, so you should remove those.

Sign up to request clarification or add additional context in comments.

Comments

0

The navigation is paramater sensitiv. That means if you navigate to the dashboard Route with Parameters it will not be found. Remove the argument from your UI.navigate expression or declare your @Route with a value like "dashboard/:id". See the URL Template Docu.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.