This tutorial covers how to leverage Lexicon patterns in your app’s forms, navigation, and search results to make them more user-friendly.
You can learn how to update your navigation next.
Applying Lexicon to the Navigation Bar
All administration apps in Liferay DXP 7.0 have a navigation bar. Applying Lexicon to your existing navigation bar takes only one additional attribute.
If your app already has a navigation bar implemented with the aui:nav-bar
tag, you can reuse it by adding the attribute markupView="lexicon"
.
For example, Liferay’s Trash app has the configuration below:
<aui:nav-bar cssClass="collapse-basic-search" markupView="lexicon">
Alternatively, you can use non-bordered tabs with the liferay-ui:tabs
taglib
as the Lexicon Guidelines
state.
Sweet! Now you know how to style a navigation bar with Lexicon. Next, you’ll learn how to apply Lexicon to your forms.
Applying Lexicon Patterns to the Application Body
To ensure that your application uses all available screen real state from left to right, make the application body fluid in all portlet views. This helps provide a consistent user-experience across all app views.
To make your app’s content fluid, add the container-fluid-1280
class in a
<div>
(or equivalent) element that contains all the portlet’s content
(excluding the Nav Bar and Management Bar).
If your app’s view (or views) are already contained within a <div>
element,
add the container-fluid-1280
class to it. Otherwise add an uppermost
<div>
element for this purpose:
<div class="container-fluid-1280">
...
</div>
Next, you can learn how to apply Lexicon to your forms.
Improving your Forms with Lexicon
Follow these steps to apply Lexicon to your forms:
-
Encapsulate your
fieldset
s with the following taglib:<aui:fieldset-group markupView="lexicon"> </aui:fieldset-group>
-
The
fieldset
insidefieldset-group
should be collapsible, so you can hide it when it’s not being used. Add thecollapsed
andcollapsible
attributes to youraui:fieldset
taglib:<aui:fieldset collapsed="<%= true %>" collapsible="<%= true %>" label="permissions"> ... </aui:fieldset>
-
Finally, add the
btn-lg
CSS class to your form’s buttons to increase the click area:<aui:button-row> <aui:button cssClass="btn-lg" type="submit" /> <aui:button cssClass="btn-lg" href="<%= redirect %>" type="cancel" /> </aui:button-row>
Your forms are now configured to use Lexicon! Next, you can learn how to apply Lexicon to the Actions menu for your entities.
Applying Lexicon to Your Entity’s Actions Menus
Your Actions menus can also benefit from Lexicon patterns. Learn how to apply Lexicon patterns to your Admin app’s actions in the Configuring Your Admin app’s Actions Menu tutorial. For regular apps, follow these steps:
-
Open your module’s actions JSP (
guestbook_actions.jsp
for example) and update the<liferay-ui:icon-menu>
to use Lexicon’s markup with themarkupView
attribute:<liferay-ui:icon-menu direction="left-side" icon="<%= StringPool.BLANK %>" markupView="lexicon" message="<%= StringPool.BLANK %>" showWhenSingleIcon="<%= true %>" >
-
To follow the Lexicon guidelines, the Actions menu should only display an icon if it is one action. If the Actions menu contains multiple actions, remove the icon’s
image
attribute and replace it with themessage
attribute displaying the action’s title. Below is an example configuration:<liferay-ui:icon message="Edit" url="<%= editURL.toString() %>" />
Next you can update your search iterator.
Applying Lexicon to your Search iterator
To apply Lexicon to your search iterator, add the markupView="lexicon"
attribute:
<liferay-ui:search-iterator
displayStyle="<%= displayStyle %>"
markupView="lexicon"
searchContainer="<%= searchContainer %>"
/>
The displayStyle
attribute specifies which display style is set for the
management bar. You can learn how to configure display styles in the
Implementing Management Bar Display Styles
tutorial.
If the results contain different sets of entries (folders and documents,
categories and threads, etc.), you must use a class that implements
*ResultRowSplitter
to divide the results. This is covered next.
Creating a Result Row Splitter
Classes that implement the *ResultRowSplitter
class divide and categorize
the results based on the different entry types. Follow these steps to create
a result row splitter:
-
Create a Java class that implements the
ResultRowSplitter
interface. For example, thecom.liferay.bookmarks.web
module has the followingBookmarksResultRowSplitter
class to split its folder and bookmark results:public class BookmarksResultRowSplitter implements ResultRowSplitter {
-
Override the
split()
method:@Override public List<ResultRowSplitterEntry> split(List<ResultRow> resultRows) { List<ResultRowSplitterEntry> resultRowSplitterEntries = new ArrayList<>();
-
Create an
ArrayList
for each type of entity, as shown in the example below:List<ResultRow> entryResultRows = new ArrayList<>(); List<ResultRow> folderResultRows = new ArrayList<>();
-
Loop through the results and add your entities to the proper
ArrayList
:for (ResultRow resultRow : resultRows) { Object object = resultRow.getObject(); if (object instanceof BookmarksFolder) { folderResultRows.add(resultRow); } else { entryResultRows.add(resultRow); } }
-
Create a new
ResultRowSplitterEntry
for each entity, passing the name of the entity and the ArrayList:if (!folderResultRows.isEmpty()) { resultRowSplitterEntries.add( new ResultRowSplitterEntry("folders", folderResultRows)); } if (!entryResultRows.isEmpty()) { resultRowSplitterEntries.add( new ResultRowSplitterEntry("bookmarks", entryResultRows)); }
-
Return the List of
resultRowSplitter
Entries. -
Use the
resultRowSplitter
attribute in yourliferay-ui:search-iterator
taglib to create a new instance of your*ResultRowSplitter
as shown in the example below:<liferay-ui:search-iterator displayStyle="<%= displayStyle %>" markupView="lexicon" resultRowSplitter="<%= new BookmarksResultRowSplitter() %>" searchContainer="<%= bookmarksSearchContainer %>" />
Now you know how to apply Lexicon patterns to your app’s forms, navigation, and search results!