= Screencasts
:page-role: -narrow -toc

:Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR  CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.


// TODO: v2: NICE-TO-HAVE: update these screenshots for v2

We've prepared a number of screencasts to help you see what Apache Isis has to offer.

While these each follow on from each other, you should be able to watch them in any order; the typical duration is
3 minutes.
The number of each screencast (eg 'link:https://www.youtube.com/watch?v=OTNHR5EdAs8[001^]') is a link over
to youtube.

Or, if you have a little more time, you can watch the screencasts by playlist.
You can either watch
link:https://www.youtube.com/playlist?list=PLbRpnAmQ6xsA-m4d2iwAuWrX1icJz0SnM[ALL] of them one after the other, or you
can use one of the themed playlists to explore particular aspects of the framework.
The table below indicates which screencasts are in which playlist.

[NOTE]
====
These screencasts were recorded using v1.12.x.
There have been a number of UI improvements since these releases.
====


Finally, you can also find some screencasts for earlier versions of the framework link:./screencasts-older.html[here].




[cols="3a,1a,1a,1a,1a,1a,1a,1a,1a,1a,1a,1a"]
|===



|    11+|*Playlists*


12+| *IDE, layouts*

include::screencasts/playlists.adoc[]


//|https://www.youtube.com/watch?v=RQ_FFYd7npU[000^] +
//Searching and using the Apache Isis docs
//|X||||||||||


//|link:https://www.youtube.com/watch?v=OTNHR5EdAs8[001^] +
//Generating an app using the xref:docs:starters:simpleapp.adoc[SimpleApp archetype]
//
//|X||||||||||



|link:https://www.youtube.com/watch?v=6GPtec5Hu5Q[002^] +
Importing the generated app into an xref:setupguide:ROOT:about.adoc[IDE] +

|X||X||||||||



|link:https://www.youtube.com/watch?v=xVTjtiJM8XM[003^] +
Walking through the main classes that make up the SimpleApp: `SimpleObject` persistent entity, `HomePageViewModel`xref:userguide:fun:view-models.adoc[view model] and `SimpleObjects` domain service (repository).
||||X|||||||


|link:https://www.youtube.com/watch?v=KCJ1ZPPB3pA[004^] +
Using the optional `Xxx.layout.xml` file to provide xref:userguide:fun:ui.adoc#object-layout[layout metadata] to dynamically render a domain object using the link:http://getbootstrap.com[Bootstrap 3] grid system.
||X|||||||||







12+| *Fixture scripts, rules, tests*

include::screencasts/playlists.adoc[]


|link:https://www.youtube.com/watch?v=pH02g0l2GKY[005^] +
Using xref:testing:fixtures:about.adoc[fixture scripts] to initialize the database, eg while prototyping and for demos
||X|||||||||




|link:https://www.youtube.com/watch?v=dXtmxmYxa30[006^] +
Implementing xref:userguide:fun:business-rules.adoc[business rules]for domain object members, using supporting methods ("see it, use it, do it")
|X||||||||||

|link:https://www.youtube.com/watch?v=imHfxQGUgV8[007^] +
Writing xref:testing:unittestsupport:about.adoc[unit tests] for a domain object responsibility
||X|||||||||



|link:https://www.youtube.com/watch?v=-lAt4UWiBjE[008^] +
Writing end-to-end xref:testing:integtestsupport:about.adoc[integration tests] for a domain object responsibility
||X|||||||||





12+| *Swagger UI*

include::screencasts/playlists.adoc[]

|link:https://www.youtube.com/watch?v=lkZxRSS0Zwg[009^] +
Using the Swagger UI to access the xref:vro:ROOT:about.adoc[REST API] automatically exposed for domain services, entities, and/or view models
||||||||||X|



// FIXME: currently removed in v2, may reinstate
//|link:https://www.youtube.com/watch?v=yOh3WphhR1E[010^].
//Using the xref:refguide:mvn:about.adoc[Apache Isis maven plugin] to validate domain object models during the build process (rather than at runtime).
//||||||||X|||









12+| *Actions*


include::screencasts/playlists.adoc[]


|link:https://www.youtube.com/watch?v=dfRZeYqzMtI[012^] +
Implementing business logic using a (no-arg) action, and associating with a property using either the `@MemberOrder` annotations or using xref:userguide:fun:ui.adoc#object-layout[dynamic (XML) layouts].
|X||||||||X||






12+| *Titles and icons, UI event subscribers*


include::screencasts/playlists.adoc[]


|link:https://www.youtube.com/watch?v=CwM430UH5WE[014^] +

Using the xref:refguide:applib-methods:ui-hints.adoc#title[title()], xref:refguide:applib-methods:ui-hints.adoc#iconName()] and xref:refguide:applib-methods:ui-hints.adoc#cssClass[cssClass()] so that end-users can distinguish domain objects within the UI.
|X||X||||||X||



|link:https://www.youtube.com/watch?v=7ToRKBOeemM[015^] +
Moving the responsibility to specify the icon for a domain object out and into a subscriber, using the xref:refguide:applib-classes:events.adoc#lifecycle-events[IconUiEvent] as per the xref:refguide:applib:index/annotation/DomainObjectLayout.adoc#iconUiEvent[@DomainObjectLayout#iconUiEvent()] annotation
||||||X|||||





12+| *Derived collections*


|link:https://www.youtube.com/watch?v=ckT8Lt20SE4[016^] +
How to implement a derived collection on a domain object.
|||||||||X||





12+| *More on fixture scripts*


|link:https://www.youtube.com/watch?v=l_oZymgb65I[017^] +
Extending a xref:testing:fixtures:about.adoc[fixture script] to more easily demonstrate new functionality.
||X|||||||||





12+| *Page size of collections*


|link:https://www.youtube.com/watch?v=39Hpd7C4Kvo[018^] +
Using xref:userguide:fun:ui.adoc#object-layout[dynamic (XML) layouts] to specify the page size for a domain object's collection.
||||X|||||||






12+| *Hints and end-user features*


include::screencasts/playlists.adoc[]

|link:https://www.youtube.com/watch?v=0d713-V4vrg[019^] +
Demonstrates how Apache Isis' xref:vw:ROOT:about.adoc[Web UI (Wicket viewer)] remembers the state of rendered domain objects, and how the end-user of the
 application can clear these UI hints using the (framework-provided) xref:refguide:viewer:index/wicket/viewer/mixins/Object_clearHints.adoc["clear hints"] mixin action.
|||X||||||||



|link:https://www.youtube.com/watch?v=Kqch-XNlBMA[020^] +
Demonstrates how the end-user can copy and share URLs for domain objects - including UI hints - using Apache Isis' xref:vw:ROOT:about.adoc[Web UI (Wicket viewer)].
|||X||||||||



|link:https://www.youtube.com/watch?v=a0QQLT_16To[021^] +
Demonstrates how the end-user can use bookmarks and breadcrumbs within Apache Isis' xref:vw:ROOT:about.adoc[Web UI (Wicket viewer)], and how the developer can ensure that xref:refguide:applib:index/annotation/DomainObjectLayout.adoc#bookmarking[domain objects] and (xref:refguide:applib:index/annotation/Action.adoc#semantics[query-only]) xref:refguide:applib:index/annotation/ActionLayout.adoc#bookmarking[actions] can be bookmarked.
|||X||||||||






12+| *Decoupling (mixins & subscribers)*


include::screencasts/playlists.adoc[]


|link:https://www.youtube.com/watch?v=Wn5215K7_Jg[022^] +
Shows how to refactor a domain object to move an action implementation out of the domain object itself, and instead implement as a xref:userguide:fun:overview.adoc#mixins[mixin] (useful for decoupling).
|X|||||X|||||



|link:https://www.youtube.com/watch?v=m633OEBpWqQ[023^] +
Shows how to refactor a domain object to move (derived) collections out of the domain object and reimplement as a xref:userguide:fun:overview.adoc#mixins[mixin].
||||||X|||||



|link:https://www.youtube.com/watch?v=-AQJb9GtIqI[024^] +
Using a xref:refguide:applib-classes:events/domainevent.adoc[domain event] subscriber to xref:userguide:fun:overview.adoc#domain-events[decouple] and abstract business rules for validation.
||||||X|||||



|link:https://www.youtube.com/watch?v=6GjLW0hlrm4[025^] +
Using a domain event subscriber to hide functionality, in this case the xref:refguide:viewer:index/wicket/viewer/mixins/Object_clearHints.adoc["clear hints"] action automatically provided by the framework.
||||||||||X|





12+| *Titles using the @Title annotation*



|link:https://www.youtube.com/watch?v=qj4bMkQRBUY[026^] +
Using the xref:refguide:applib:index/annotation/Title.adoc[@Title] annotation (instead of the xref:refguide:applib-methods:ui-hints.adoc#title[title()] reserved method) to obtain the title of a domain object, so that the end-user can distinguish one object from another.
|X||||||||X||





12+| *Integration testing of mixins*




|link:https://www.youtube.com/watch?v=yi52Gbd3lmY[027^] +
How to write an xref:testing:integtestsupport:about.adoc[integration test] for a mixin.
||X|||||||||






12+| *Removing boilerplate*



include::screencasts/playlists.adoc[]


|link:https://www.youtube.com/watch?v=SLJPBruFMKY[028^] +
Using link:https://projectlombok.org/[Project Lombok] to remove boilerplate from your domain objects (getters and setters).
||||||||X|||









12+| *Action validation*



include::screencasts/playlists.adoc[]


|link:https://www.youtube.com/watch?v=ORoEYlg6XFM[030^] +
How to validate action parameters using a supporting xref:refguide:applib-methods:prefixes.adoc#validate[validate...()] method.
|X||||||||X||



|link:https://www.youtube.com/watch?v=1Vlzob89pYI[031^] +
How to validate action parameters using the xref:refguide:applib:index/annotation/Parameter.adoc#mustSatisfy[@Parameter#mustSatisfy()]  and the Specification interface.
|||||||||X||




12+| *Instantiating/Initializing Objects*





|link:https://www.youtube.com/watch?v=fYJjXAepWAs[032^] +
How to instantiate/initialize objects using xref:refguide:applib:index/services/repository/RepositoryService.adoc[RepositoryService], xref:refguide:applib:index/services/registry/ServiceRegistry.adoc[ServiceRegistry] and/or xref:refguide:applib:index/services/factory/FactoryService.adoc[FactoryService].
|X||||||||X||




12+| *Property and parameter choices*



include::screencasts/playlists.adoc[]


|link:https://www.youtube.com/watch?v=cQ06PoMNDPw[033^] +
How to provide a set of xref:refguide:applib-methods:prefixes.adoc#choices[choices] (a drop-down list) when editing a property.
|X||||||||X||



|link:https://www.youtube.com/watch?v=afEnYKljBQs[034^] +
How to provide a set of xref:refguide:applib-methods:prefixes.adoc#choices[choices] (a drop-down list) when invoking an action.
|||||||||X||



|link:https://www.youtube.com/watch?v=fKo6aTPK-gk[035^] +
How to use the xref:refguide:applib-methods:prefixes.adoc#choices[choices] supporting methods as a source for default values within a xref:testing:fixtures:about.adoc[fixture script].
||X|||||||X||



|link:https://www.youtube.com/watch?v=ZWOzmwCJVzA[036^] +
How to use an enum for choices (drop down list) for both a property or an action parameter.
|||||||||X||




12+| *Hiding columns*



include::screencasts/playlists.adoc[]


|link:https://www.youtube.com/watch?v=1SCyBlMM2Bo[037^] +
How to hide properties as columns in tables (parented collections or standalone collections), using the dynamic XML layout (equivalent to xref:refguide:applib:index/annotation/PropertyLayout.adoc#hidden[@PropertyLayout#hidden()]).
||||X|||||||


|link:https://www.youtube.com/watch?v=H11yby1Xkbc[038^] +
How to hide properties as columns in tables, using CSS.
||||X|||||||




12+| *Fixture scripts defaults / fake data*



include::screencasts/playlists.adoc[]


|link:https://www.youtube.com/watch?v=NKaR7ZedI8E[039^] +
Using the xref:testing:fixtures:about.adoc#fixturescript[FixtureScript] `defaultParam(...)` method to reflectively default parameters to fixture scripts that have not been set by the caller.
||X|||||||||



|link:https://www.youtube.com/watch?v=-jMiD9n1L5U[040^] +
Using the (non-ASF) link:https://platform.incode.org[Incode Platform^]'s fakedata module's `FakeDataService` to provide fake (random) names within a fixture script.
||X|||X||||||




12+| *BigDecimals*


include::screencasts/playlists.adoc[]


|link:https://www.youtube.com/watch?v=esujf_DFeWA[041^] +
Using BigDecimal as a property within a domain object, also demonstrating the "summary" view within the xref:vw:ROOT:about.adoc[Web UI (Wicket viewer)].
|||||||X||X|X|




|link:https://www.youtube.com/watch?v=n9Oy0m2bplw[042^] +
How to use the xref:refguide:applib-ant:Digits.adoc[@Digits] annotation for action parameters of type ``java.math.BigDecimal``.
|||||||||X||




12+| *Action parameters*



include::screencasts/playlists.adoc[]


|link:https://www.youtube.com/watch?v=Rt4JoV4ssVY[043^] +
How to use the supporting xref:refguide:applib-methods:prefixes.adoc#default[defaultXxx(...)] supporting method to provide a default argument value for action parameters.
|X||||||||X||


|link:https://www.youtube.com/watch?v=qAJDGxztWIQ[044^] +
How to use xref:refguide:applib:index/annotation/DomainObject.adoc#bounding[@DomainObject#bounding()] so that a drop-down list is automatically provided for any parameters to actions that are for (domain entity) reference types.
|||||||||X||


|link:https://www.youtube.com/watch?v=0ro_YhXOpJU[045^] +
How to use the xref:refguide:applib-methods:prefixes.adoc#choices[choicesXxx(...)] supporting method to provide a drop-down list for parameters to actions that are for reference types (domain entities or view models).
|||||||||X||


|link:https://www.youtube.com/watch?v=K36IJQ_hDfs[046^] +
How to use the xref:refguide:applib-methods:prefixes.adoc#autoComplete[autoCompleteXxx(...)] supporting method to provide a drop-down list for parameters to actions that are for reference types (domain entities or view models).
|||||||||X||




12+| *Excel, Calendars, Maps*



include::screencasts/playlists.adoc[]


|link:https://www.youtube.com/watch?v=SoREp-8MQz0[047^] +
Configuring an Apache Isis app to allow tables of objects to be downloaded as an Excel spreadsheet, using the (non-ASF) link:https://platform.incode.org[Incode Platform^]'s excel wicket component.
|||||X||||||


|link:https://www.youtube.com/watch?v=bqjLx8gMOEw[048^] +
Configuring an Apache Isis app to allow tables of domain objects with date information to be rendered on a full-page
calendar, using the (non-ASF) link:https://platform.incode.org[Incode Platform^]'s fullcalendar2 wicket
component.
|||||X||||||


|link:https://www.youtube.com/watch?v=0YoFa44Xr6M[049^] +
Using the xref:refguide:applib:index/annotation/Programmatic.adoc[@Programmatic] annotation to exclude methods from a domain object
(eg implementing methods of an interface as defined by the (non-ASF) link:https://platform.incode.org[Incode Platform^]'s fullcalendar2 wicket component) that would
otherwise be part of the Apache Isis metamodel (and thus show up in the UI).
||||||||||X|


|link:https://www.youtube.com/watch?v=mIwptdeZ67Q[050^] +
Configuring an Apache Isis app to allow tables of domain objects with location information to be rendered on map,
 using the (non-ASF) link:https://platform.incode.org[Incode Platform^]'s gmap3 wicket component.
|||||X||||||


|link:https://www.youtube.com/watch?v=3n_70HJ23uY[051^] +
Using derived properties to persist value types (such as gmap3's Location value type) as regular primitive datatypes.
|||||||X||||




12+| *View Models*



include::screencasts/playlists.adoc[]


|link:https://www.youtube.com/watch?v=puG-pzxRSd0[052^] +
How to write a xref:userguide:fun:view-models.adoc#jaxb[(JAXB) view model], holding references to two domain objects.
|X||||||||X||


|link:https://www.youtube.com/watch?v=tdBkmA2CCZY[053^] +
Updating the title, icon and layout of a xref:userguide:fun:view-models.adoc#jaxb[(JAXB) view model].
||||X|||||||


|link:https://www.youtube.com/watch?v=TKF0FB_od00[054^] +
How to expose information from underlying domain entities referenced by a xref:userguide:fun:view-models.adoc#jaxb[(JAXB) view model] using derived properties
||||||||||X|


|link:https://www.youtube.com/watch?v=TMMeVhRNi8A[055^] +
Adding an action to a xref:userguide:fun:view-models.adoc#jaxb[(JAXB) view model], and adjusting the layout using custom CSS.
||||X|||||||




12+| *Renaming*



include::screencasts/playlists.adoc[]


|link:https://www.youtube.com/watch?v=BYmSlgJP5KY[056^] +
The (very simple) steps required to rename a domain entity class.
|X||||||||||



|link:https://www.youtube.com/watch?v=J5xobU6X0ng[057^] +
How to rename a menu (on the top-level menubar) as rendered in the  xref:vw:ROOT:about.adoc[Web UI (Wicket viewer)].
|X||||||||||


|link:https://www.youtube.com/watch?v=mgHqRxQrp28[058^] +
How to rename various elements (collections, title) of the xref:refguide:applib:index/annotation/HomePage.adoc[home page] view model,
for an improved initial page.
||||||||||X|



|link:https://www.youtube.com/watch?v=1i6N4wES6iw[059^] +
How to rename the application name as it appears in the header.
||||||||||X|



|link:https://www.youtube.com/watch?v=9nfDyhqCSvA[060^] +
Updating the logo for the application as it appears in the header.
||||||||||X|




12+| *Decoupling*


include::screencasts/playlists.adoc[]


|link:https://www.youtube.com/watch?v=vntv_5Z8Ros[061^] +
Refactoring a mixin action, teasing out its separate responsibilities in order to decouple the code and uncover new concepts.
||||||X|||||


|link:https://www.youtube.com/watch?v=Fgo2zFhRVco[062^] +
Separating out the responsibilities of the persistent domain entities from those of view models that act upon those domain entities.
||||||X|||||





12+| *(Parented) collections*



include::screencasts/playlists.adoc[]

|link:https://www.youtube.com/watch?v=9PgOSqf7rYE[063^] +
How to implement a bidirectional 1-to-many association between two domain entities.
|||||||X||||


|link:https://www.youtube.com/watch?v=0fbVg8xJ9sE[064^] +
How domain entities can be automatically persisted just by being associated with an already persistent entity.
|||||||X||||


|link:https://www.youtube.com/watch?v=FwzuCSlLLRM[065^] +
How bidirectional relationships between domain entities can be automatically maintained.
|||||||X||||


|link:https://www.youtube.com/watch?v=IzZPbNYNJl4[066^] +
How deleting one persistent entity can, if required, automatically delete another associated entity.
|||||||X||||





12+| *Metadata fieldset*

include::screencasts/playlists.adoc[]


|link:https://www.youtube.com/watch?v=kdhwMc0f7_k[067^] +
Improving the layout of domain entities by adding a metadata fieldset.
||||X|||||||


//12+| *for Contributors and Committers*
//
//include::screencasts/playlists.adoc[]
//
//
//|https://www.youtube.com/watch?v=RQ_FFYd7npU[068^] +
//Contributing to the documentation
//|||||||||||X
//
//
//|https://youtu.be/CKSLZBBHjME[069^] +
//Merging pull requests
//|||||||||||X


|===


