
Hello, I'm trying to create a navigation menu in yesod. First I thought about creating a widget. But, afaik, I'd need to add it in each handler of the site, after all, the menu should be always visible. So I ditched that approach. I wrote the menu code right in default-layout.hamlet. I wrote a loop that iterates over menuRoutes, which is a list of tuples composed of route and the menu name for that route. Like this: menuRoutes = [(RootR, "Home"), (TeamR, "Team")] During the iteration I add each of those. I created that in Site.hs, right after mkYesodData. The problem with that approach is that the link for the current site should be disabled. So, if we're at RootR, then there should be a <b>Home</b> in the menu instead of <a href="/">Home</a>. That's where I got stuck. I can't really pass anything to defaultLayout when I'm at the handler function and there doesn't seem to be the information of which handler was executed to create the current view. I thought the information could be in the Foundation (via getYesod), but I couldn't find anything. What's the recommended way of creating such menus? []'s Rafael

I think the function getCurrentRoute[1] will help you out here. It
will return Maybe (SiteRoute); the Maybe for the case where you're
dealing with a 404 response. Just compare each route against the
result.
Now if you need something more complicated like menu hierarchies, I
would recommend YesodBreadcrumbs, but for your use case I think this
is sufficient.
Michael
[1] http://hackage.haskell.org/packages/archive/yesod/0.6.7/doc/html/Yesod-Handl...
On Thu, Feb 3, 2011 at 5:53 AM, Rafael Cunha de Almeida
Hello,
I'm trying to create a navigation menu in yesod. First I thought about creating a widget. But, afaik, I'd need to add it in each handler of the site, after all, the menu should be always visible.
So I ditched that approach. I wrote the menu code right in default-layout.hamlet. I wrote a loop that iterates over menuRoutes, which is a list of tuples composed of route and the menu name for that route. Like this:
menuRoutes = [(RootR, "Home"), (TeamR, "Team")]
During the iteration I add each of those. I created that in Site.hs, right after mkYesodData. The problem with that approach is that the link for the current site should be disabled. So, if we're at RootR, then there should be a <b>Home</b> in the menu instead of <a href="/">Home</a>. That's where I got stuck.
I can't really pass anything to defaultLayout when I'm at the handler function and there doesn't seem to be the information of which handler was executed to create the current view. I thought the information could be in the Foundation (via getYesod), but I couldn't find anything. What's the recommended way of creating such menus?
[]'s Rafael
_______________________________________________ web-devel mailing list web-devel@haskell.org http://www.haskell.org/mailman/listinfo/web-devel

I wrote a module to help create navigation menus using jstree[1]. The
key interface is:
data Nav y = Nav {
navTitle :: String
, navRoute :: Route y
}
navTitle :: Route y -> GHandler sub y String
navChildren :: Route y -> GHandler sub y [Nav y]
navTitle is used when rendering the initial tree (with the node for
the current page collapsed). Expanding a node calls navChildren via
ajax to get the children.
If anyone's interested, I can put it up somewhere with an example tomorrow.
-matt
[1] http://www.jstree.com/
On Wed, Feb 2, 2011 at 8:00 PM, Michael Snoyman
I think the function getCurrentRoute[1] will help you out here. It will return Maybe (SiteRoute); the Maybe for the case where you're dealing with a 404 response. Just compare each route against the result.
Now if you need something more complicated like menu hierarchies, I would recommend YesodBreadcrumbs, but for your use case I think this is sufficient.
Michael
[1] http://hackage.haskell.org/packages/archive/yesod/0.6.7/doc/html/Yesod-Handl...
On Thu, Feb 3, 2011 at 5:53 AM, Rafael Cunha de Almeida
wrote: Hello,
I'm trying to create a navigation menu in yesod. First I thought about creating a widget. But, afaik, I'd need to add it in each handler of the site, after all, the menu should be always visible.
So I ditched that approach. I wrote the menu code right in default-layout.hamlet. I wrote a loop that iterates over menuRoutes, which is a list of tuples composed of route and the menu name for that route. Like this:
menuRoutes = [(RootR, "Home"), (TeamR, "Team")]
During the iteration I add each of those. I created that in Site.hs, right after mkYesodData. The problem with that approach is that the link for the current site should be disabled. So, if we're at RootR, then there should be a <b>Home</b> in the menu instead of <a href="/">Home</a>. That's where I got stuck.
I can't really pass anything to defaultLayout when I'm at the handler function and there doesn't seem to be the information of which handler was executed to create the current view. I thought the information could be in the Foundation (via getYesod), but I couldn't find anything. What's the recommended way of creating such menus?
[]'s Rafael
_______________________________________________ web-devel mailing list web-devel@haskell.org http://www.haskell.org/mailman/listinfo/web-devel
_______________________________________________ web-devel mailing list web-devel@haskell.org http://www.haskell.org/mailman/listinfo/web-devel

Minus the navTitle name conflicts, of course.
On Wed, Feb 2, 2011 at 10:48 PM, Matt Brown
I wrote a module to help create navigation menus using jstree[1]. The key interface is:
data Nav y = Nav { navTitle :: String , navRoute :: Route y }
navTitle :: Route y -> GHandler sub y String navChildren :: Route y -> GHandler sub y [Nav y]
navTitle is used when rendering the initial tree (with the node for the current page collapsed). Expanding a node calls navChildren via ajax to get the children.
If anyone's interested, I can put it up somewhere with an example tomorrow.
-matt
On Wed, Feb 2, 2011 at 8:00 PM, Michael Snoyman
wrote: I think the function getCurrentRoute[1] will help you out here. It will return Maybe (SiteRoute); the Maybe for the case where you're dealing with a 404 response. Just compare each route against the result.
Now if you need something more complicated like menu hierarchies, I would recommend YesodBreadcrumbs, but for your use case I think this is sufficient.
Michael
[1] http://hackage.haskell.org/packages/archive/yesod/0.6.7/doc/html/Yesod-Handl...
On Thu, Feb 3, 2011 at 5:53 AM, Rafael Cunha de Almeida
wrote: Hello,
I'm trying to create a navigation menu in yesod. First I thought about creating a widget. But, afaik, I'd need to add it in each handler of the site, after all, the menu should be always visible.
So I ditched that approach. I wrote the menu code right in default-layout.hamlet. I wrote a loop that iterates over menuRoutes, which is a list of tuples composed of route and the menu name for that route. Like this:
menuRoutes = [(RootR, "Home"), (TeamR, "Team")]
During the iteration I add each of those. I created that in Site.hs, right after mkYesodData. The problem with that approach is that the link for the current site should be disabled. So, if we're at RootR, then there should be a <b>Home</b> in the menu instead of <a href="/">Home</a>. That's where I got stuck.
I can't really pass anything to defaultLayout when I'm at the handler function and there doesn't seem to be the information of which handler was executed to create the current view. I thought the information could be in the Foundation (via getYesod), but I couldn't find anything. What's the recommended way of creating such menus?
[]'s Rafael
_______________________________________________ web-devel mailing list web-devel@haskell.org http://www.haskell.org/mailman/listinfo/web-devel
_______________________________________________ web-devel mailing list web-devel@haskell.org http://www.haskell.org/mailman/listinfo/web-devel
participants (3)
-
Matt Brown
-
Michael Snoyman
-
Rafael Cunha de Almeida