[ https://issues.apache.org/jira/browse/ISIS-1747?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Dan Haywood resolved ISIS-1747. ------------------------------- Resolution: Fixed > Update docs, hints-n-tips for view models > ----------------------------------------- > > Key: ISIS-1747 > URL: https://issues.apache.org/jira/browse/ISIS-1747 > Project: Isis > Issue Type: Improvement > Affects Versions: 1.15.1 > Reporter: Dan Haywood > Assignee: Dan Haywood > Priority: Minor > Fix For: 1.16.0 > > > see https://github.com/incodehq/incode-platform/issues/10 > ~~~~~~~~~ > here's the text that has been removed > ## Demo App: Highlighting Current > As a by-the-by, the demo app has one further "trick up its sleeve". > If you run the app you'll notice that the currently selected `DemoObject` is > highlighted in the left-hand table of the `HomePageViewModel`. > This is accomplished by having the view model collaborate with a subscribing > domain service that configures a CSS class. > We start by ensuring that the `DemoObject` emits an event for its CSS class: > .DemoObject.java > ````java > @DomainObjectLayout( > ... > cssClassUiEvent = DemoObject.CssClassUiEvent.class > ) > public class DemoObject ... { > public static class CssClassUiEvent > extends > org.apache.isis.applib.services.eventbus.CssClassUiEvent<DemoObject> {} > ... > } > ```` > Next, we define the domain service to act as the subscriber. > Since it will be interact > .HomePageViewModel.java > ````java > public class HomePageViewModel ... { > @DomainService(nature = NatureOfService.DOMAIN) > public static class CssHighlighter extends AbstractSubscriber { > @EventHandler > @Subscribe > public void on(DemoObject.CssClassUiEvent ev) { > if(getContext() == null) { > return; > } > if(ev.getSource() == getContext().getSelected()) { // <1> > ev.setCssClass("selected"); > } > } > private HomePageViewModel getContext() { // <2> > return (HomePageViewModel) scratchpad.get("context"); > } > void setContext(final HomePageViewModel homePageViewModel) { > scratchpad.put("context", homePageViewModel); > } > @Inject > Scratchpad scratchpad; // <3> > } > } > ```` > <1> If the domain object is the currently selected then set the CSS class > <2> Provide methods to set and get the current `HomePageViewModel` (acting as > the context) > <3> Store the context using the `Scratchpad` domain service (request-scoped > so thread-safe). > The `HomePageViewModel` is responsible for setting itself as the context for > the domain service: > .HomePageViewModel.java > ````java > public class HomePageViewModel ... { > ... > public TranslatableString title() { > cssHighlighter.setContext(this); // <1> > ... > } > ... > @javax.inject.Inject > CssHighlighter cssHighlighter; > } > ```` > <1> set the context on the domain service > Finally we just need some CSS, in the `application.css` file: > .application.css > ````css > .selected { > font-style: italic; > font-weight: bolder; > } > ```` -- This message was sent by Atlassian JIRA (v6.4.14#64029)