Search code examples
scalaintellij-ideaplayframeworktwirl

Inline if statement that Intellij understands


I'm trying to create some sort of class="active" functionality using Twirl and Play 2.3 but I can't find a solution that works, is short and doesn't throw my Intellij syntax all over the place.

This is what I currently have:

<ul class="nav navbar-nav">
    <li @(if (request.uri == "/") Html("""class="active""""))><a href="@routes.Application.home()">Home</a></li>
    <li @(if (request.uri == "/about") Html("""class="active""""))><a href="@routes.Application.about()">About</a></li>
    <li @(if (request.uri == "/features") Html("""class="active""""))><a href="@routes.Application.features()">Features</a></li>
</ul>

And this is what Intellij thinks of it: Screenshot of Intellij


Solution

  • Yeah, IntelliJ sometimes is confused with view's syntax, anyway you can create i.e. custom util for adding (or not) the active class (Java sample)

    package utils;
    
    import play.api.templates.Html;
    import play.mvc.Http;
    
    public class AttrHelpers {
        public static Html setActiveClass(String requiredPath, Http.Request request) {
            return (requiredPath.equals(request.uri())) ? Html.apply("class=\"active\"") : null;
        }
    }
    

    So then you can use it in your views like:

    <li @utils.AttrHelpers.setActiveClass("/about", request) >
        <a href="@routes.Application.about()">About</a>
    </li>
    
    <li @utils.AttrHelpers.setActiveClass("/features", request) >
        <a href="@routes.Application.features()">Features</a>
    </li>