You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2020/01/23 12:03:52 UTC

[isis] branch master updated (0ef79d2 -> 8515c9b)

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git.


    from 0ef79d2  ISIS-2158: fix smoketest: don't return detached entity in action
     new 9f8fab6  ISIS-2264:  renames WhereAmIModel (since it isn't a wicket model)
     new 43f6132  ISIS-2062: updates home page
     new f884aa6  ISIS-2264: removes 'checkModuleExtent' validator
     new 1a4cad9  ISIS-2264: sync adoc after removing some unused config props
     new 73c2d74  ISIS-2062: style updates.
     new 288dd0a  ISIS-2271: adds fullcalendar
     new 911cb39  ISIS-2062: sync adoc
     new 8515c9b  ISIS-2062: sync adoc

The 8 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../ROOT/pages/landing-page/quick-start.adoc       |  27 ++--
 antora/playbooks/site-vw.yml                       |  10 ++
 antora/playbooks/site.yml                          |   3 +
 antora/supplemental-ui/css/home/style.css          |   2 +
 antora/supplemental-ui/index.html                  | 159 +++++++++++----------
 .../generated/isis.core.meta-model.validator.adoc  |   5 -
 .../generated/isis.viewer.restfulobjects.adoc      |   6 -
 .../config/examples/generated/resteasy.adoc        |  10 ++
 .../apache/isis/core/config/IsisConfiguration.java |   2 -
 core/pom.xml                                       |   3 +-
 extensions/pom.xml                                 |  12 ++
 .../vw/{pdfjs => fullcalendar}/adoc/antora.yml     |   0
 .../adoc/modules/fullcalendar}/nav.adoc            |   0
 .../adoc/modules/fullcalendar/pages/about.adoc     |   5 +
 .../modules/fullcalendar/partials/module-nav.adoc  |   2 +
 extensions/vw/fullcalendar/applib/pom.xml          |  52 +++++++
 .../fullcalendar/applib/CalendarEventable.java     |  47 ++++++
 .../fullcalendar/applib/Calendarable.java          |  29 ++++
 .../applib/IsisModuleExtFullCalendarApplib.java    |   7 +
 .../spi/CalendarableDereferencingService.java      |  19 +++
 .../fullcalendar/applib/value/CalendarEvent.java   |  87 +++++++++++
 .../value/CalendarEventSemanticsProvider.java      |  33 +++++
 extensions/vw/fullcalendar/pom.xml                 |  43 ++++++
 extensions/vw/fullcalendar/ui/pom.xml              |  56 ++++++++
 ...g.apache.isis.viewer.wicket.ui.ComponentFactory |   2 +
 .../ui/component/CalendaredCollectionAbstract.java | 103 +++++++++++++
 .../CalendaredCollectionFactoryAbstract.java       |  57 ++++++++
 .../ui/component/EventProviderAbstract.java        | 141 ++++++++++++++++++
 .../component/FullCalendarWithEventHandling.java   |  69 +++++++++
 .../ui/component/IsisModuleExtFullCalendarUi.java  |  13 ++
 .../CalendarableCollectionAsFullCalendar.css       |  44 ++++++
 .../CalendarableCollectionAsFullCalendar.html      |  13 ++
 .../CalendarableCollectionAsFullCalendar.java      |  37 +++++
 ...alendarableCollectionAsFullCalendarFactory.java |  26 ++++
 .../calendarable/CalendarableEventProvider.java    |  50 +++++++
 .../CalendarEventableCollectionAsFullCalendar.css  |  34 +++++
 .../CalendarEventableCollectionAsFullCalendar.html |  13 ++
 .../CalendarEventableCollectionAsFullCalendar.java |  36 +++++
 ...arEventableCollectionAsFullCalendarFactory.java |  26 ++++
 .../CalendarEventableEventProvider.java            |  50 +++++++
 .../metamodel/JdoProgrammingModelPlugin.java       |  76 ----------
 .../adoc/modules/ROOT/partials/component-nav.adoc  |   1 +
 .../WhereAmIHelper.java}                           |  34 +++--
 .../model/models/whereami/WhereAmIModel.java       |  56 --------
 .../viewer/wicket/ui/pages/entity/EntityPage.java  |   6 +-
 45 files changed, 1262 insertions(+), 244 deletions(-)
 copy extensions/vw/{pdfjs => fullcalendar}/adoc/antora.yml (100%)
 copy {viewers/wicket/adoc/modules/ROOT => extensions/vw/fullcalendar/adoc/modules/fullcalendar}/nav.adoc (100%)
 create mode 100644 extensions/vw/fullcalendar/adoc/modules/fullcalendar/pages/about.adoc
 create mode 100644 extensions/vw/fullcalendar/adoc/modules/fullcalendar/partials/module-nav.adoc
 create mode 100644 extensions/vw/fullcalendar/applib/pom.xml
 create mode 100644 extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/CalendarEventable.java
 create mode 100644 extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/Calendarable.java
 create mode 100644 extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/IsisModuleExtFullCalendarApplib.java
 create mode 100644 extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/spi/CalendarableDereferencingService.java
 create mode 100644 extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEvent.java
 create mode 100644 extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemanticsProvider.java
 create mode 100644 extensions/vw/fullcalendar/pom.xml
 create mode 100644 extensions/vw/fullcalendar/ui/pom.xml
 create mode 100644 extensions/vw/fullcalendar/ui/src/main/java/META-INF/services/org.apache.isis.viewer.wicket.ui.ComponentFactory
 create mode 100644 extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/CalendaredCollectionAbstract.java
 create mode 100644 extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/CalendaredCollectionFactoryAbstract.java
 create mode 100644 extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/EventProviderAbstract.java
 create mode 100644 extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/FullCalendarWithEventHandling.java
 create mode 100644 extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/IsisModuleExtFullCalendarUi.java
 create mode 100644 extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendarable/CalendarableCollectionAsFullCalendar.css
 create mode 100644 extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendarable/CalendarableCollectionAsFullCalendar.html
 create mode 100644 extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendarable/CalendarableCollectionAsFullCalendar.java
 create mode 100644 extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendarable/CalendarableCollectionAsFullCalendarFactory.java
 create mode 100644 extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendarable/CalendarableEventProvider.java
 create mode 100644 extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendareventable/CalendarEventableCollectionAsFullCalendar.css
 create mode 100644 extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendareventable/CalendarEventableCollectionAsFullCalendar.html
 create mode 100644 extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendareventable/CalendarEventableCollectionAsFullCalendar.java
 create mode 100644 extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendareventable/CalendarEventableCollectionAsFullCalendarFactory.java
 create mode 100644 extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendareventable/CalendarEventableEventProvider.java
 rename viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/{models/whereami/WhereAmIModelDefault.java => modelhelpers/WhereAmIHelper.java} (72%)
 delete mode 100644 viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/whereami/WhereAmIModel.java


[isis] 03/08: ISIS-2264: removes 'checkModuleExtent' validator

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit f884aa6a2ad77794665af56a2bf45fcd7636ab3a
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Jan 22 13:49:56 2020 +0000

    ISIS-2264: removes 'checkModuleExtent' validator
    
    ... this was already commented out, can't see that it adds much value in the context of Spring Boot.
    
    (cherry picked from commit 35a5ccabc429fc12ea8f96a36e5d7d0de52168f0)
---
 .../apache/isis/core/config/IsisConfiguration.java |  2 -
 .../metamodel/JdoProgrammingModelPlugin.java       | 76 ----------------------
 2 files changed, 78 deletions(-)

diff --git a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
index 7e79ae7..a5ced53 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
@@ -1282,8 +1282,6 @@ public class IsisConfiguration {
                  */
                 private boolean ensureUniqueObjectTypes = true;
 
-                // TODO: to remove
-                private boolean checkModuleExtent = true;
                 /**
                  * If set, then checks that the supports <code>hideXxx</code> and <code>disableXxx</code> methods for
                  * actions do not have take parameters.
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metamodel/JdoProgrammingModelPlugin.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metamodel/JdoProgrammingModelPlugin.java
index 3736f1a..773e991 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metamodel/JdoProgrammingModelPlugin.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metamodel/JdoProgrammingModelPlugin.java
@@ -111,10 +111,6 @@ public class JdoProgrammingModelPlugin implements MetaModelRefiner {
         if(config.getCore().getMetaModel().getValidator().isEnsureUniqueObjectTypes()) {
             addValidatorToEnsureUniqueObjectIds();
         }
-        
-        if(config.getCore().getMetaModel().getValidator().isCheckModuleExtent()) {
-            addValidatorToCheckModuleExtent();
-        }
 
     }
 
@@ -218,77 +214,5 @@ public class JdoProgrammingModelPlugin implements MetaModelRefiner {
         pm.addValidator(ensureUniqueObjectIds);
     }
 
-    private void addValidatorToCheckModuleExtent() {
-
-        final Map<String, List<String>> domainObjectClassNamesByPackage = _Maps.newConcurrentHashMap();
-
-        MetaModelValidatorVisiting.SummarizingVisitor visitor = new MetaModelValidatorVisiting.SummarizingVisitor(){
-
-            @Override
-            public boolean visit(ObjectSpecification objSpec, MetaModelValidator validator) {
-                Class<?> correspondingClass = objSpec.getCorrespondingClass();
-                if(correspondingClass == null) {
-                    return true;
-                }
-                Package aPackage = correspondingClass.getPackage();
-                if(aPackage == null) {
-                    return true;
-                }
-                final String packageName = aPackage.getName();
-
-                //noinspection StatementWithEmptyBody
-                if (objSpec.isValue() || objSpec.isAbstract() || objSpec.isMixin() ||
-                        objSpec.isParentedOrFreeCollection() ||
-                        objSpec.getFullIdentifier().startsWith("java") ||
-                        objSpec.getFullIdentifier().startsWith("org.joda") ||
-                        objSpec.getFullIdentifier().startsWith("org.apache.isis")) {
-                    // ignore
-                } else {
-                    List<String> classNames = domainObjectClassNamesByPackage.computeIfAbsent(packageName, k -> _Lists.newArrayList());
-                    classNames.add(objSpec.getFullIdentifier());
-                }
-                return true;
-            }
-
-            @Override
-            public void summarize(final MetaModelValidator validator) {
-                //FIXME[2112] module (legacy) specific, remove?
-                //                final Set<String> modulePackageNames = modulePackageNamesFrom(appManifest);
-                //
-                //                final Set<String> domainObjectPackageNames = domainObjectClassNamesByPackage.keySet();
-                //                for (final String pkg : domainObjectPackageNames) {
-                //                    List<String> domainObjectClassNames = domainObjectClassNamesByPackage.get(pkg);
-                //                    boolean withinSomeModule = isWithinSomeModule(modulePackageNames, pkg);
-                //                    if(!withinSomeModule) {
-                //                        String csv = stream(domainObjectClassNames)
-                //                                .collect(Collectors.joining(","));
-                //                        validationFailures.add(
-                //                                "Domain objects discovered in package '%s' are not in the set of modules obtained from "
-                //                                        + "the AppManifest's top-level module '%s'.  Classes are: %s",
-                //                                        pkg, topLevelModule.getClass().getName(), csv);
-                //                    }
-                //                }
-            }
-            //FIXME[2112] module (legacy) specific, remove?
-            //            private Set<String> modulePackageNamesFrom(final AppManifest appManifest) {
-            //                final List<Class<?>> modules = appManifest.getModules();
-            //                return modules.stream()
-            //                        .map(aClass->aClass.getPackage().getName())
-            //                        .collect(Collectors.toCollection(HashSet::new));
-            //            }
-            //
-            //            private boolean isWithinSomeModule(final Set<String> modulePackageNames, final String pkg) {
-            //                for (final String modulePackageName : modulePackageNames) {
-            //                    if(pkg.startsWith(modulePackageName)) {
-            //                        return true;
-            //                    }
-            //                }
-            //                return false;
-            //            }
-        };
-
-        pm.addValidator(visitor);
-    }
-
 
 }


[isis] 07/08: ISIS-2062: sync adoc

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 911cb3966f67376953dc8282db646e975893324d
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Jan 22 17:40:56 2020 +0000

    ISIS-2062: sync adoc
    
    (cherry picked from commit 5db29ab999b47a5890c7072901a093e61b6cb493)
---
 .../layout/component/ActionLayoutDataOwner.java    |  4 ++-
 .../layout/component/CollectionLayoutData.java     | 21 ++++++++-------
 .../examples/layout/component/FieldSet.java        | 31 ++++++++++++----------
 .../layout/component/PropertyLayoutData.java       | 14 ++++++----
 .../examples/layout/grid/bootstrap3/BS3Col.java    | 15 ++++++-----
 .../config/examples/generated/resteasy.adoc        | 10 +++++++
 6 files changed, 59 insertions(+), 36 deletions(-)

diff --git a/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/ActionLayoutDataOwner.java b/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/ActionLayoutDataOwner.java
index c4b07bb..c4153d0 100644
--- a/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/ActionLayoutDataOwner.java
+++ b/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/ActionLayoutDataOwner.java
@@ -21,6 +21,8 @@ package org.apache.isis.applib.layout.component;
 import java.util.List;
 
 public interface ActionLayoutDataOwner extends Owner {
+    
     List<ActionLayoutData> getActions();
-    void setActions(List<ActionLayoutData> actions);
+    void addAction(ActionLayoutData actionLayoutData);
+    
 }
diff --git a/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/CollectionLayoutData.java b/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/CollectionLayoutData.java
index 46d4bb2..6991c75 100644
--- a/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/CollectionLayoutData.java
+++ b/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/CollectionLayoutData.java
@@ -19,17 +19,18 @@
 package org.apache.isis.applib.layout.component;
 
 import java.io.Serializable;
-import java.util.ArrayList;
 import java.util.List;
 
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.layout.links.Link;
+import org.apache.isis.core.commons.internal.concurrent._ConcurrentListWrapper;
 
 /**
  * Describes the layout of a single collection, broadly corresponds to the {@link org.apache.isis.applib.annotation.CollectionLayout} annotation.
@@ -196,23 +197,23 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed {
         this.sortedBy = sortedBy;
     }
 
-
-
-    private List<ActionLayoutData> actions = new ArrayList<>();
+    private _ConcurrentListWrapper<ActionLayoutData> actions = new _ConcurrentListWrapper<>();
 
     // no wrapper
     @Override
-    @XmlElement(name = "action", required = false)
+    @XmlElementRef(type = ActionLayoutData.class, name = "action", required = false)
     public List<ActionLayoutData> getActions() {
-        return actions;
+        return actions.snapshot();
     }
 
-    @Override
     public void setActions(List<ActionLayoutData> actionLayoutDatas) {
-        this.actions = actionLayoutDatas;
+        this.actions.replace(actionLayoutDatas);
+    }
+    
+    @Override
+    public void addAction(ActionLayoutData actionLayoutData) {
+        this.actions.add(actionLayoutData);
     }
-
-
 
     private CollectionLayoutDataOwner owner;
     /**
diff --git a/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/FieldSet.java b/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/FieldSet.java
index 335d65a..c5e071b 100644
--- a/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/FieldSet.java
+++ b/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/FieldSet.java
@@ -19,7 +19,6 @@
 package org.apache.isis.applib.layout.component;
 
 import java.io.Serializable;
-import java.util.ArrayList;
 import java.util.List;
 
 import javax.xml.bind.annotation.XmlAttribute;
@@ -30,6 +29,7 @@ import javax.xml.bind.annotation.XmlType;
 
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.layout.grid.bootstrap3.BS3Col;
+import org.apache.isis.core.commons.internal.concurrent._ConcurrentListWrapper;
 
 /**
  * A {@link MemberRegion region} of the page containing a set of
@@ -133,36 +133,39 @@ Serializable {
         this.name = name;
     }
 
-
-
-    private List<ActionLayoutData> actions = new ArrayList<>();
+    private _ConcurrentListWrapper<ActionLayoutData> actions = new _ConcurrentListWrapper<>();
 
     // no wrapper
     @Override
     @XmlElement(name = "action", required = false)
     public List<ActionLayoutData> getActions() {
-        return actions;
+        return actions.snapshot();
     }
 
-    @Override
     public void setActions(List<ActionLayoutData> actionLayoutDatas) {
-        this.actions = actionLayoutDatas;
+        this.actions.replace(actionLayoutDatas);
     }
-
-
-
-    private List<PropertyLayoutData> properties = new ArrayList<>();
+    
+    @Override
+    public void addAction(ActionLayoutData actionLayoutData) {
+        this.actions.add(actionLayoutData);
+    }
+    
+    private _ConcurrentListWrapper<PropertyLayoutData> properties = new _ConcurrentListWrapper<>();
 
     // no wrapper; required=false because may be auto-generated
     @XmlElement(name = "property", required = false)
     public List<PropertyLayoutData> getProperties() {
-        return properties;
+        return properties.snapshot();
     }
 
     public void setProperties(List<PropertyLayoutData> properties) {
-        this.properties = properties;
+        this.properties.replace(properties);
+    }
+    
+    public void addProperty(PropertyLayoutData actionLayoutData) {
+        this.properties.add(actionLayoutData);
     }
-
 
     private FieldSetOwner owner;
     /**
diff --git a/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/PropertyLayoutData.java b/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/PropertyLayoutData.java
index 817a6aa..a782ff4 100644
--- a/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/PropertyLayoutData.java
+++ b/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/PropertyLayoutData.java
@@ -19,7 +19,6 @@
 package org.apache.isis.applib.layout.component;
 
 import java.io.Serializable;
-import java.util.ArrayList;
 import java.util.List;
 
 import javax.xml.bind.annotation.XmlAttribute;
@@ -34,6 +33,7 @@ import org.apache.isis.applib.annotation.RenderDay;
 import org.apache.isis.applib.annotation.Repainting;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.layout.links.Link;
+import org.apache.isis.core.commons.internal.concurrent._ConcurrentListWrapper;
 
 /**
  * Describes the layout of a single property, broadly corresponds to the {@link org.apache.isis.applib.annotation.PropertyLayout} annotation.
@@ -234,18 +234,22 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed  {
         this.repainting = repainting;
     }
 
-    private List<ActionLayoutData> actions = new ArrayList<>();
+    private _ConcurrentListWrapper<ActionLayoutData> actions = new _ConcurrentListWrapper<>();
 
     // no wrapper
     @Override
     @XmlElement(name = "action", required = false)
     public List<ActionLayoutData> getActions() {
-        return actions;
+        return actions.snapshot();
     }
 
-    @Override
     public void setActions(List<ActionLayoutData> actionLayoutDatas) {
-        this.actions = actionLayoutDatas;
+        this.actions.replace(actionLayoutDatas);
+    }
+    
+    @Override
+    public void addAction(ActionLayoutData actionLayoutData) {
+        this.actions.add(actionLayoutData);
     }
 
 
diff --git a/api/applib/src/main/adoc/modules/applib-cm/examples/layout/grid/bootstrap3/BS3Col.java b/api/applib/src/main/adoc/modules/applib-cm/examples/layout/grid/bootstrap3/BS3Col.java
index 7f44432..439b9b1 100644
--- a/api/applib/src/main/adoc/modules/applib-cm/examples/layout/grid/bootstrap3/BS3Col.java
+++ b/api/applib/src/main/adoc/modules/applib-cm/examples/layout/grid/bootstrap3/BS3Col.java
@@ -35,6 +35,7 @@ import org.apache.isis.applib.layout.component.DomainObjectLayoutData;
 import org.apache.isis.applib.layout.component.DomainObjectLayoutDataOwner;
 import org.apache.isis.applib.layout.component.FieldSet;
 import org.apache.isis.applib.layout.component.FieldSetOwner;
+import org.apache.isis.core.commons.internal.concurrent._ConcurrentListWrapper;
 
 /**
  * A column within a row which, depending on its {@link #getSpan()}, could be as narrow as 1/12th of the page's width, all the way up to spanning the entire page.
@@ -171,23 +172,25 @@ CollectionLayoutDataOwner, DomainObjectLayoutDataOwner {
     }
 
 
-
-    private List<ActionLayoutData> actions = new ArrayList<>();
+    private _ConcurrentListWrapper<ActionLayoutData> actions = new _ConcurrentListWrapper<>();
 
     // no wrapper
     @Override
     @XmlElementRef(type = ActionLayoutData.class, name = "action", required = false)
     public List<ActionLayoutData> getActions() {
-        return actions;
+        return actions.snapshot();
     }
 
+    public void setActions(List<ActionLayoutData> actionLayoutDatas) {
+        this.actions.replace(actionLayoutDatas);
+    }
+    
     @Override
-    public void setActions(final List<ActionLayoutData> actions) {
-        this.actions = actions;
+    public void addAction(ActionLayoutData actionLayoutData) {
+        this.actions.add(actionLayoutData);
     }
 
 
-
     private List<BS3Row> rows = new ArrayList<>();
 
     // no wrapper
diff --git a/core/config/src/main/adoc/modules/config/examples/generated/resteasy.adoc b/core/config/src/main/adoc/modules/config/examples/generated/resteasy.adoc
index 644481d..250cd05 100644
--- a/core/config/src/main/adoc/modules/config/examples/generated/resteasy.adoc
+++ b/core/config/src/main/adoc/modules/config/examples/generated/resteasy.adoc
@@ -6,6 +6,16 @@
 | 
 | 
 
+| resteasy.jaxrs.app. +
+registration
+| 
+| 
+
+| resteasy.jaxrs.default-path
+|  /restful
+| Note that this is used rather than `resteasy.servlet.mapping.prefix` because there is _NO_ implementation of ``javax.ws.rs.core.Application``, so we rely on it being automatically created.
+
+
 | resteasy.resteasy-settings
 | 
 | 


[isis] 06/08: ISIS-2271: adds fullcalendar

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 288dd0add5810c0699cfef47ff953280c3ac7506
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Jan 22 17:38:48 2020 +0000

    ISIS-2271: adds fullcalendar
    
    (cherry picked from commit 747acd81641288977175a0eb4646f1af182e5aad)
---
 .../ROOT/pages/landing-page/quick-start.adoc       |  27 ++--
 antora/playbooks/site-vw.yml                       |  10 ++
 antora/playbooks/site.yml                          |   3 +
 antora/supplemental-ui/index.html                  | 159 +++++++++++----------
 core/pom.xml                                       |   3 +-
 extensions/pom.xml                                 |  12 ++
 extensions/vw/fullcalendar/adoc/antora.yml         |   2 +
 .../adoc/modules/fullcalendar/nav.adoc             |   1 +
 .../adoc/modules/fullcalendar/pages/about.adoc     |   5 +
 .../modules/fullcalendar/partials/module-nav.adoc  |   2 +
 extensions/vw/fullcalendar/applib/pom.xml          |  52 +++++++
 .../fullcalendar/applib/CalendarEventable.java     |  47 ++++++
 .../fullcalendar/applib/Calendarable.java          |  29 ++++
 .../applib/IsisModuleExtFullCalendarApplib.java    |   7 +
 .../spi/CalendarableDereferencingService.java      |  19 +++
 .../fullcalendar/applib/value/CalendarEvent.java   |  87 +++++++++++
 .../value/CalendarEventSemanticsProvider.java      |  33 +++++
 extensions/vw/fullcalendar/pom.xml                 |  43 ++++++
 extensions/vw/fullcalendar/ui/pom.xml              |  56 ++++++++
 ...g.apache.isis.viewer.wicket.ui.ComponentFactory |   2 +
 .../ui/component/CalendaredCollectionAbstract.java | 103 +++++++++++++
 .../CalendaredCollectionFactoryAbstract.java       |  57 ++++++++
 .../ui/component/EventProviderAbstract.java        | 141 ++++++++++++++++++
 .../component/FullCalendarWithEventHandling.java   |  69 +++++++++
 .../ui/component/IsisModuleExtFullCalendarUi.java  |  13 ++
 .../CalendarableCollectionAsFullCalendar.css       |  44 ++++++
 .../CalendarableCollectionAsFullCalendar.html      |  13 ++
 .../CalendarableCollectionAsFullCalendar.java      |  37 +++++
 ...alendarableCollectionAsFullCalendarFactory.java |  26 ++++
 .../calendarable/CalendarableEventProvider.java    |  50 +++++++
 .../CalendarEventableCollectionAsFullCalendar.css  |  34 +++++
 .../CalendarEventableCollectionAsFullCalendar.html |  13 ++
 .../CalendarEventableCollectionAsFullCalendar.java |  36 +++++
 ...arEventableCollectionAsFullCalendarFactory.java |  26 ++++
 .../CalendarEventableEventProvider.java            |  50 +++++++
 .../adoc/modules/ROOT/partials/component-nav.adoc  |   1 +
 36 files changed, 1226 insertions(+), 86 deletions(-)

diff --git a/antora/components/toc/modules/ROOT/pages/landing-page/quick-start.adoc b/antora/components/toc/modules/ROOT/pages/landing-page/quick-start.adoc
index 5d5597b..8468570 100644
--- a/antora/components/toc/modules/ROOT/pages/landing-page/quick-start.adoc
+++ b/antora/components/toc/modules/ROOT/pages/landing-page/quick-start.adoc
@@ -3,10 +3,10 @@
 
 To get started with a new application, use one of the two git repos on Github that provide a starter app.
 
-* link:https://github.com/apache/isis-app-helloworld[HelloWorld]
-+
-This is a very minimal app, intended just as a starting point to learn what the framework is all about.
-+
+== HelloWorld
+
+The helloworld app is  very minimal app, intended just as a starting point to learn what the framework is all about.
+
 [source,bash]
 ----
 REPO=isis-app-helloworld
@@ -20,10 +20,14 @@ mvn clean install
 mvn spring-boot:run
 ----
 
-* link:https://github.com/apache/isis-app-simpleapp[Simple App]
-+
+The source code can be found in this link:https://github.com/apache/isis-app-helloworld[git repo]
+
+
+== Simple App
+
+
 This app has the same functionality as _HelloWorld_, but is structured so it can be used as a starting point for developing your own applications.
-+
+
 [source,bash]
 ----
 REPO=isis-app-simpleapp
@@ -36,10 +40,15 @@ cd $REPO
 mvn clean install
 mvn -pl webapp spring-boot:run
 ----
-+
+
 It also includes some xref:testing:integtestsupport:about.adoc[integration tests], xref:testing:fixtures:about.adoc[fixtures], and xref:testing:specsupport[BDD (Cucumber)] specs.
 
-In both cases you can bump to newer versions of the framework just by updating the `<version>` of the `<parent>`:
+The source code can be found in this link:https://github.com/apache/isis-app-simpleapp[git repo]
+
+
+== Updating to Newer Versions
+
+For both apps you can bump to newer versions of the framework just by updating the `<version>` of the `<parent>`:
 
 [source,bash]
 .pom.xml
diff --git a/antora/playbooks/site-vw.yml b/antora/playbooks/site-vw.yml
index b0de651..0cb1628 100644
--- a/antora/playbooks/site-vw.yml
+++ b/antora/playbooks/site-vw.yml
@@ -16,6 +16,16 @@ content:
       start_path: core/viewers/wicket/src/main/adoc # vw
       branches: HEAD
 
+# extensions
+    - url: .
+      start_path: extensions/vw/exceldownload/adoc # vw
+      branches: HEAD
+    - url: .
+      start_path: extensions/vw/fullcalendar/adoc # vw
+      branches: HEAD
+    - url: .
+      start_path: extensions/vw/pdfjs/adoc # vw
+      branches: HEAD
 
 
 ui:
diff --git a/antora/playbooks/site.yml b/antora/playbooks/site.yml
index e639893..1114844 100644
--- a/antora/playbooks/site.yml
+++ b/antora/playbooks/site.yml
@@ -121,6 +121,9 @@ content:
       start_path: extensions/vw/exceldownload/adoc # vw
       branches: HEAD
     - url: .
+      start_path: extensions/vw/fullcalendar/adoc # vw
+      branches: HEAD
+    - url: .
       start_path: extensions/vw/pdfjs/adoc # vw
       branches: HEAD
 
diff --git a/antora/supplemental-ui/index.html b/antora/supplemental-ui/index.html
index 6a345bf..b48f202 100644
--- a/antora/supplemental-ui/index.html
+++ b/antora/supplemental-ui/index.html
@@ -81,7 +81,7 @@
         <li class="menu-active"><a href="#body">Home</a></li>
         <li><a href="#why">Why?</a></li>
         <li class="menu-has-children">
-          <a href="#portfolio">What?</a>
+          <a href="#testimonials">What?</a>
           <ul>
             <li><a href="#testimonials">Reviews</a></li>
             <li><a href="#portfolio">Examples</a></li>
@@ -168,16 +168,16 @@
         </div>
 
         <div class="col-lg-6 content">
-          <h3><b>Apps built using Apache Isis™ automatically expose the concepts of your business domain in the user interface</b></h3>
+          <h3><b>Apache Isis™ provides your apps with a standard, automatically generated UI.  That means:</b></h3>
 
           <ul>
             <li><i class="ion-android-checkmark-circle"></i><span>Working on new apps, the business domain experts and the techies can work closely to learn, discover and then deliver.</span></li>
             <li><i class="ion-android-checkmark-circle"></i><span>Existing apps are easy to modify - the extra UI code over and above the business domain is kept to a minimum.</span></li>
             <li><i class="ion-android-checkmark-circle"></i><span>For business users, the app is easy to learn since the business concepts are clear and obvious</span></li>
-            <li><i class="ion-android-checkmark-circle"></i><span>When integrating to other systems, the development effort required is minimized through built-in mechanisms</span></li>
+            <li><i class="ion-android-checkmark-circle"></i><span>When integrating to other systems, the development cost is minimized through built-in mechanisms</span></li>
           </ul>
 
-          <p>And... Apache Isis™ is <b>open source, built on industry and de-facto standards</b>, so there is no vendor lock-in</p>
+          <p>And because Apache Isis™ is <b>open source</b>, built on industry/de-facto standards, there's no vendor lock-in.</p>
         </div>
       </div>
 
@@ -185,69 +185,6 @@
   </section>
 
   <!--==========================
-  Examples
-  ============================-->
-  <section id="portfolio" class="wow fadeInUp">
-    <div class="container">
-      <div class="section-header">
-        <h2>Examples</h2>
-        <p>Apache Isis apps are often (though not exclusively) line-of-business systems.  The section below shows some examples of built using by the Apache Isis user community.  You can read more about these apps <a href="toc/powered-by/powered-by.html">here</a>.</p>
-      </div>
-    </div>
-
-    <div class="container-fluid">
-      <div class="row no-gutters">
-
-        <div class="col-lg-3 col-md-4">
-          <div class="portfolio-item wow fadeInUp">
-            <a href="_/img/home/portfolio/transportplanner/TransportDemand.png" class="portfolio-popup">
-              <img src="_/img/home/portfolio/transportplanner/TransportDemand.png" alt="">
-              <div class="portfolio-overlay">
-                <div class="portfolio-info"><h2 class="wow fadeInUp">Transport Planner</h2></div>
-              </div>
-            </a>
-          </div>
-        </div>
-
-        <div class="col-lg-3 col-md-4">
-          <div class="portfolio-item wow fadeInUp">
-            <a href="_/img/home/portfolio/commapp/screenshot-1.png" class="portfolio-popup">
-              <img src="_/img/home/portfolio/commapp/screenshot-1.png" height="141px" alt="">
-              <div class="portfolio-overlay">
-                <div class="portfolio-info"><h2 class="wow fadeInUp">CommApp</h2></div>
-              </div>
-            </a>
-          </div>
-        </div>
-
-        <div class="col-lg-3 col-md-4">
-          <div class="portfolio-item wow fadeInUp">
-            <a href="_/img/home/portfolio/estatio/est-invoice.png" class="portfolio-popup">
-              <img src="_/img/home/portfolio/estatio/est-invoice.png" alt="">
-              <div class="portfolio-overlay">
-                <div class="portfolio-info"><h2 class="wow fadeInUp">Estatio</h2></div>
-              </div>
-            </a>
-          </div>
-        </div>
-
-        <div class="col-lg-3 col-md-4">
-          <div class="portfolio-item wow fadeInUp">
-            <a href="_/img/home/portfolio/gesconsultor-grc/fig-3-custom-ui-analyzing-risk-scenarios.png" class="portfolio-popup">
-              <img src="_/img/home/portfolio/gesconsultor-grc/fig-3-custom-ui-analyzing-risk-scenarios.png" alt="">
-              <div class="portfolio-overlay">
-                <div class="portfolio-info"><h2 class="wow fadeInUp">GRC</h2></div>
-              </div>
-            </a>
-          </div>
-        </div>
-
-      </div>
-
-    </div>
-  </section>
-
-  <!--==========================
   Testimonials
   ============================-->
   <section id="testimonials" class="wow fadeInUp">
@@ -488,6 +425,70 @@ commented out Johan's, cos he's since come on board as a committer.
 
 
   <!--==========================
+Examples
+============================-->
+  <section id="portfolio" class="wow fadeInUp">
+    <div class="container">
+      <div class="section-header">
+        <h2>Examples</h2>
+        <p>Apache Isis apps are often (though not exclusively) line-of-business systems.  The section below shows some examples of built using by the Apache Isis user community.  You can read more about these apps <a href="toc/powered-by/powered-by.html">here</a>.</p>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+      <div class="row no-gutters">
+
+        <div class="col-lg-3 col-md-4">
+          <div class="portfolio-item wow fadeInUp">
+            <a href="_/img/home/portfolio/transportplanner/TransportDemand.png" class="portfolio-popup">
+              <img src="_/img/home/portfolio/transportplanner/TransportDemand.png" alt="">
+              <div class="portfolio-overlay">
+                <div class="portfolio-info"><h2 class="wow fadeInUp">Transport Planner</h2></div>
+              </div>
+            </a>
+          </div>
+        </div>
+
+        <div class="col-lg-3 col-md-4">
+          <div class="portfolio-item wow fadeInUp">
+            <a href="_/img/home/portfolio/commapp/screenshot-1.png" class="portfolio-popup">
+              <img src="_/img/home/portfolio/commapp/screenshot-1.png" height="141px" alt="">
+              <div class="portfolio-overlay">
+                <div class="portfolio-info"><h2 class="wow fadeInUp">CommApp</h2></div>
+              </div>
+            </a>
+          </div>
+        </div>
+
+        <div class="col-lg-3 col-md-4">
+          <div class="portfolio-item wow fadeInUp">
+            <a href="_/img/home/portfolio/estatio/est-invoice.png" class="portfolio-popup">
+              <img src="_/img/home/portfolio/estatio/est-invoice.png" alt="">
+              <div class="portfolio-overlay">
+                <div class="portfolio-info"><h2 class="wow fadeInUp">Estatio</h2></div>
+              </div>
+            </a>
+          </div>
+        </div>
+
+        <div class="col-lg-3 col-md-4">
+          <div class="portfolio-item wow fadeInUp">
+            <a href="_/img/home/portfolio/gesconsultor-grc/fig-3-custom-ui-analyzing-risk-scenarios.png" class="portfolio-popup">
+              <img src="_/img/home/portfolio/gesconsultor-grc/fig-3-custom-ui-analyzing-risk-scenarios.png" alt="">
+              <div class="portfolio-overlay">
+                <div class="portfolio-info"><h2 class="wow fadeInUp">GRC</h2></div>
+              </div>
+            </a>
+          </div>
+        </div>
+
+      </div>
+
+    </div>
+  </section>
+
+
+  <!--==========================
   How it works
   ============================-->
   <section id="how-it-works">
@@ -501,21 +502,21 @@ commented out Johan's, cos he's since come on board as a committer.
         <div class="col-lg-4">
           <div class="box wow fadeInUp">
             <h2>UI &amp; REST &ldquo;for free&rdquo;</h2>
-            <p class="description">Apache Isis dynamically builds both a generic user interface and also a rich hypermedia REST API directly from the underlying domain objects. This makes for extremely rapid prototyping and a short feedback cycle, perfect for agile development. The UI can also be extended for specific use cases, and can be themed using Bootstrap.</p>
+            <p class="description">Apache Isis™ dynamically builds both a generic user interface and also a rich hypermedia REST API directly from the underlying domain objects. This makes for extremely rapid prototyping and a short feedback cycle, perfect for agile development. The UI can also be extended for specific use cases, and can be themed using Bootstrap.</p>
           </div>
         </div>
 
         <div class="col-lg-4">
           <div class="box wow fadeInUp" data-wow-delay="0.1s">
             <h2>Domain-Driven</h2>
-            <p class="description">The core of an Apache Isis application are the domain objects, either persisted entities or view models. Business rules can be associated directly with domain objects, or can be factored out into separate services. Apache Isis performs dependency injection everywhere to ensure that the application remains decoupled and testable.</p>
+            <p class="description">The core of an Apache Isis™ application are the domain objects, either persisted entities or view models. Business rules can be associated directly with domain objects, or can be factored out into separate services. Apache Isis performs dependency injection everywhere to ensure that the application remains decoupled and testable.</p>
           </div>
         </div>
 
         <div class="col-lg-4">
           <div class="box wow fadeInUp" data-wow-delay="0.1s">
             <h2>Add-ons</h2>
-            <p class="description">Apache Isis includes a large number of add-on modules for security, auditing, command profiling, mail merge and other cross-cutting concerns. It also has a number of UI extensions for maps, calendars etc. as well as a catalog of generic subdomains such as documents, communications, notes and tasks. All are open source and designed for out-of-the-box use or to modify as you require.</p>
+            <p class="description">Apache Isis™ includes a large number of add-on modules for security, auditing, command profiling, mail merge and other cross-cutting concerns. It also has a number of UI extensions for maps, calendars etc. as well as a catalog of generic subdomains such as documents, communications, notes and tasks. All are open source and designed for out-of-the-box use or to modify as you require.</p>
           </div>
         </div>
 
@@ -540,7 +541,7 @@ commented out Johan's, cos he's since come on board as a committer.
     <div class="container">
       <div class="section-header">
         <h2>Built with</h2>
-        <p>Apache Isis is built on top of industry leading open source products, all licensed with business-friendly Apache Software License v2.0 or MIT.</p>
+        <p>Apache Isis™ is built on top of industry leading open source products, all licensed with business-friendly Apache Software License v2.0 or MIT.</p>
       </div>
 
       <div class="row">
@@ -601,9 +602,12 @@ commented out Johan's, cos he's since come on board as a committer.
       <div class="row">
         <div class="col-lg-12 text-center text-lg-left">
           <h3 class="cta-title">Quick Start</h3>
-          <p class="cta-text">Start developing your own Apache Isis application from either the minimal <a href="https://github.com/apache/isis-app-helloworld">helloworld</a> starter app or with the more structured <a href="https://github.com/apache/isis-app-simpleapp">simpleapp</a> starter app.</p>
+
           <div class="row">
             <div class="col-lg-6 text-left text-lg-left">
+              <p class="cta-text text-center">
+                Learn about Apache Isis™ by running the minimal <a href="https://github.com/apache/isis-app-helloworld">helloworld</a>&nbsp;starter&nbsp;app.
+              </p>
               <p>
                 <pre>
 APP=helloworld
@@ -619,6 +623,9 @@ mvn spring-boot:run</pre>
               </p>
             </div>
             <div class="col-lg-6 text-left text-lg-left">
+              <p class="cta-text text-center">
+                Develop your own Apache Isis™ app using the more structured <a href="https://github.com/apache/isis-app-simpleapp">simpleapp</a>&nbsp;starter&nbsp;app.</p>
+              </p>
               <p>
                 <pre>
 APP=simpleapp
@@ -634,8 +641,10 @@ mvn -pl webapp spring-boot:run</pre>
               </p>
             </div>
           </div>
-          <p class="cta-text">If you want to use the previous 1.x version, you can use these Maven archetypes.</p>
           <div class="row">
+            <p class="cta-text text-center" style="margin-block-end: 0; margin-left: 20px; margin-top: 20px;">
+              If you want to use the previous 1.x version, you can use these Maven archetypes.
+            </p>
             <div class="col-lg-6 text-left text-lg-left">
               <p>
                 <pre>
@@ -843,8 +852,8 @@ mvn -pl webapp jetty:run</pre>
 
       <div class="col-md-8">
         <div class="copyright">
-          Copyright © 2010~2019 The Apache Software Foundation, licensed under the Apache License, v2.0.
-          Apache, the Apache feather logo, Apache Isis, and the Apache Isis project logo are all trademarks of The Apache Software Foundation.
+          Copyright © 2010~2020 The Apache Software Foundation, licensed under the Apache License, v2.0.
+          Apache, the Apache feather logo, Apache Isis™, and the Apache Isis project logo are all trademarks of The Apache Software Foundation.
         </div>
       </div>
 
diff --git a/core/pom.xml b/core/pom.xml
index a26328c..8790974 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -174,7 +174,7 @@
 		<wicket-bootstrap.version>2.0.11</wicket-bootstrap.version> <!-- de.agilecoders.wicket:wicket-bootstrap-core -->
 		<wicket-bootstrap-core.version>2.0.11</wicket-bootstrap-core.version>
 		<wicket-bootstrap-datetimepicker.version>4.17.37-1</wicket-bootstrap-datetimepicker.version>
-		<wicket-fullcalendar.version>2.2.0</wicket-fullcalendar.version>
+		<wicket-fullcalendar.version>4.2</wicket-fullcalendar.version>
 		<wicket-source.version>7.0.0</wicket-source.version>
 		<wicket-webjars.version>2.0.15</wicket-webjars.version>
 
@@ -1115,7 +1115,6 @@
 				<artifactId>wicket-fullcalendar-core</artifactId>
 				<version>${wicket-fullcalendar.version}</version>
 			</dependency>
-
 			<dependency>
 				<groupId>net.ftlines.wicket-source</groupId>
 				<!-- <groupId>com.github.jennybrown8.wicket-source</groupId> -->
diff --git a/extensions/pom.xml b/extensions/pom.xml
index f0c4e2c..e2b6362 100644
--- a/extensions/pom.xml
+++ b/extensions/pom.xml
@@ -97,6 +97,17 @@
 
 			<dependency>
 				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-fullcalendar-applib</artifactId>
+				<version>2.0.0-M3-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-fullcalendar-ui</artifactId>
+				<version>2.0.0-M3-SNAPSHOT</version>
+			</dependency>
+
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
 				<artifactId>isis-extensions-secman</artifactId>
 				<version>2.0.0-M3-SNAPSHOT</version>
 			</dependency>
@@ -159,6 +170,7 @@
 		<module>vro/cors</module>
 
 		<module>vw/exceldownload</module>
+		<module>vw/fullcalendar</module>
 		<module>vw/pdfjs</module>
 
 	</modules>
diff --git a/extensions/vw/fullcalendar/adoc/antora.yml b/extensions/vw/fullcalendar/adoc/antora.yml
new file mode 100644
index 0000000..cb832ae
--- /dev/null
+++ b/extensions/vw/fullcalendar/adoc/antora.yml
@@ -0,0 +1,2 @@
+name: vw
+version: master
diff --git a/extensions/vw/fullcalendar/adoc/modules/fullcalendar/nav.adoc b/extensions/vw/fullcalendar/adoc/modules/fullcalendar/nav.adoc
new file mode 100644
index 0000000..bd5d2e6
--- /dev/null
+++ b/extensions/vw/fullcalendar/adoc/modules/fullcalendar/nav.adoc
@@ -0,0 +1 @@
+include::vw:ROOT:partial$component-nav.adoc[]
diff --git a/extensions/vw/fullcalendar/adoc/modules/fullcalendar/pages/about.adoc b/extensions/vw/fullcalendar/adoc/modules/fullcalendar/pages/about.adoc
new file mode 100644
index 0000000..2ae06a8
--- /dev/null
+++ b/extensions/vw/fullcalendar/adoc/modules/fullcalendar/pages/about.adoc
@@ -0,0 +1,5 @@
+= Fullcalendar
+: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 ag [...]
+
+TODO: v2: placeholder for documentation about fullcalendar
+
diff --git a/extensions/vw/fullcalendar/adoc/modules/fullcalendar/partials/module-nav.adoc b/extensions/vw/fullcalendar/adoc/modules/fullcalendar/partials/module-nav.adoc
new file mode 100644
index 0000000..256a568
--- /dev/null
+++ b/extensions/vw/fullcalendar/adoc/modules/fullcalendar/partials/module-nav.adoc
@@ -0,0 +1,2 @@
+** xref:vw:fullcalendar:about.adoc[fullcalendar]
+
diff --git a/extensions/vw/fullcalendar/applib/pom.xml b/extensions/vw/fullcalendar/applib/pom.xml
new file mode 100644
index 0000000..fc2ca2a
--- /dev/null
+++ b/extensions/vw/fullcalendar/applib/pom.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.isis.extensions</groupId>
+        <artifactId>isis-extensions-fullcalendar</artifactId>
+        <version>2.0.0-M3-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>isis-extensions-fullcalendar-applib</artifactId>
+    <name>Apache Isis Ext - Wicket Viewer - fullcalendar (applib)</name>
+
+    <properties>
+        <jar-plugin.automaticModuleName>org.apache.isis.extensions.fullcalendar.applib</jar-plugin.automaticModuleName>
+        <git-plugin.propertiesDir>org/apache/isis/extensions/fullcalendar/applib</git-plugin.propertiesDir>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-applib</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>de.agilecoders.wicket</groupId>
+            <artifactId>wicket-bootstrap-core</artifactId>
+            <!-- to avoid polluting the classpath -->
+            <optional>true</optional>
+        </dependency>
+
+    </dependencies>
+</project>
diff --git a/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/CalendarEventable.java b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/CalendarEventable.java
new file mode 100644
index 0000000..1c59879
--- /dev/null
+++ b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/CalendarEventable.java
@@ -0,0 +1,47 @@
+package org.apache.isis.extensions.fullcalendar.applib;
+
+import com.google.common.base.Function;
+
+import org.apache.isis.extensions.fullcalendar.applib.value.CalendarEvent;
+
+public interface CalendarEventable {
+
+    /**
+     * The name of the calendar to which this event belongs.
+     *
+     * <p>
+     *     For example, an <code>Employee</code> might provide have a <code>employedOn</code>, so the calendar name
+     *     would be &quot;employedOn&quot;
+     * </p>
+     *
+     * <p>
+     *     If there is possibly more than one date associated with the entity, then use
+     *     {@link Calendarable} instead.
+     * </p>
+     */
+    String getCalendarName();
+
+    CalendarEvent toCalendarEvent();
+
+    public static class Functions  {
+        private Functions(){}
+
+        public static <T extends CalendarEventable> Function<T, String> getCalendarName() {
+            return new Function<T, String>(){
+                @Override
+                public String apply(T calendarEventable) {
+                    return calendarEventable.getCalendarName();
+                }};
+        }
+
+        public static <T extends CalendarEventable> Function<T, CalendarEventable> cast() {
+            return new Function<T, CalendarEventable>(){
+                @Override
+                public CalendarEventable apply(CalendarEventable toDoItem) {
+                    return toDoItem;
+                }
+            };
+        }
+    }
+
+}
diff --git a/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/Calendarable.java b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/Calendarable.java
new file mode 100644
index 0000000..92ca181
--- /dev/null
+++ b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/Calendarable.java
@@ -0,0 +1,29 @@
+package org.apache.isis.extensions.fullcalendar.applib;
+
+import java.util.Set;
+
+import com.google.common.collect.ImmutableMap;
+
+
+public interface Calendarable {
+
+    /**
+     * The names of unique &quot;calendar&quot;s provided by this object.
+     * 
+     * <p>
+     * The &quot;calendar&quot; is a string identifier that indicates the nature of this event.
+     * 
+     * <p>
+     * For example, an event of a lease's <code>FixedBreakOption</code> has three dates: the <i>break date</i>,
+     * the <i>exercise date</i> and the <i>reminder date</i>.  These therefore correspond to three different 
+     * calendar names, respectively <i>Fixed break</i>, <i>Fixed break exercise</i> and 
+     * <i>Fixed break exercise reminder</i>.
+     */
+    Set<String> getCalendarNames();
+    
+    /**
+     * The events associated with this object, keyed by their corresponding {@link #getCalendarNames() calendar name}.
+     */
+	ImmutableMap<String, CalendarEventable> getCalendarEvents();
+	
+}
diff --git a/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/IsisModuleExtFullCalendarApplib.java b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/IsisModuleExtFullCalendarApplib.java
new file mode 100644
index 0000000..3226606
--- /dev/null
+++ b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/IsisModuleExtFullCalendarApplib.java
@@ -0,0 +1,7 @@
+package org.apache.isis.extensions.fullcalendar.applib;
+
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class IsisModuleExtFullCalendarApplib {
+}
diff --git a/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/spi/CalendarableDereferencingService.java b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/spi/CalendarableDereferencingService.java
new file mode 100644
index 0000000..d5b299d
--- /dev/null
+++ b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/spi/CalendarableDereferencingService.java
@@ -0,0 +1,19 @@
+package org.apache.isis.extensions.fullcalendar.applib.spi;
+
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.extensions.fullcalendar.applib.CalendarEventable;
+import org.apache.isis.extensions.fullcalendar.applib.Calendarable;
+
+/**
+ * Optional SPI service that allows a {@link Calendarable} or {@link CalendarEventable} object to be translated/dereferenced to some other object, typically its owner.  The markers on the calendar then open up the dereferenced object, rather than the original
+ * {@link Calendarable} or {@link CalendarEventable} object.
+ *
+ * <p>
+ *     For example, the <tt>incode-module-commchannel</tt>'s <tt>Note</tt> implements <tt>CalendarEventable</tt>, but this service allows the <i>owner</i> of the
+ *     <tt>Note</tt> (ie the <tt>Notable</tt>) sto be shown instead.
+ * </p>
+ *
+ */
+public interface CalendarableDereferencingService {
+	Object dereference(final Object calendarableOrCalendarEventable);
+}
diff --git a/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEvent.java b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEvent.java
new file mode 100644
index 0000000..7a614ee
--- /dev/null
+++ b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEvent.java
@@ -0,0 +1,87 @@
+package org.apache.isis.extensions.fullcalendar.applib.value;
+
+import java.io.Serializable;
+
+import org.joda.time.DateTime;
+
+import org.apache.isis.applib.annotation.Value;
+import org.apache.isis.applib.util.ObjectContracts;
+
+/**
+ * Value type representing an event on a calendar.
+ */
+@Value(semanticsProviderClass=CalendarEventSemanticsProvider.class)
+public class CalendarEvent implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+    
+    private static final String KEY_FIELDS = "dateTime, calendarName";
+	static final CalendarEvent DEFAULT_VALUE = null; // no default
+	
+    private final DateTime dateTime;
+    private final String calendarName;
+    private final String title;
+    private final String notes;
+	
+	public CalendarEvent(final DateTime dateTime, final String calendarName, final String title) {
+        this(dateTime, calendarName, title, null);
+	}
+
+    public CalendarEvent(final DateTime dateTime, final String calendarName, final String title, final String notes) {
+        this.dateTime = dateTime;
+        this.calendarName = calendarName;
+        this.title = title;
+        this.notes = notes;
+    }
+
+    public DateTime getDateTime() {
+        return dateTime;
+    }
+    
+    public String getCalendarName() {
+        return calendarName;
+    }
+    
+    public String getTitle() {
+        return title;
+    }
+    
+    public String getNotes() {
+        return notes;
+    }
+   
+	public CalendarEvent withDateTime(final DateTime date) {
+		return new CalendarEvent(date, this.calendarName, this.title, this.notes);
+	}
+	
+	public CalendarEvent withCalendarName(final String calendarName) {
+	    return new CalendarEvent(this.dateTime, calendarName, this.title, this.notes);
+	}
+	
+	public CalendarEvent withTitle(final String title) {
+	    return new CalendarEvent(this.dateTime, this.calendarName, title, this.notes);
+	}
+	
+	public CalendarEvent withNotes(final String notes) {
+	    return new CalendarEvent(this.dateTime, this.calendarName, this.title, notes);
+	}
+
+	@Override
+    public int hashCode() {
+	    return ObjectContracts.hashCode(this, KEY_FIELDS);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        return ObjectContracts.equals(this, obj, KEY_FIELDS);
+    }
+
+    @Override
+    public String toString() {
+        return ObjectContracts.toString(this, KEY_FIELDS);
+    }
+    
+    public static int typicalLength() {
+		return 30;
+	}
+}
diff --git a/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemanticsProvider.java b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemanticsProvider.java
new file mode 100644
index 0000000..eef7487
--- /dev/null
+++ b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemanticsProvider.java
@@ -0,0 +1,33 @@
+package org.apache.isis.extensions.fullcalendar.applib.value;
+
+import org.apache.isis.applib.adapters.DefaultsProvider;
+import org.apache.isis.applib.adapters.EncoderDecoder;
+import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
+
+/**
+ * For internal use; allows Isis to parse etc.
+ */
+public class CalendarEventSemanticsProvider implements ValueSemanticsProvider<CalendarEvent> {
+
+	public DefaultsProvider<CalendarEvent> getDefaultsProvider() {
+		return null;
+	}
+
+	public EncoderDecoder<CalendarEvent> getEncoderDecoder() {
+	    return null;
+	}
+
+	public Parser<CalendarEvent> getParser() {
+	    return null;
+	}
+
+	public boolean isEqualByContent() {
+		return true;
+	}
+
+	public boolean isImmutable() {
+		return true;
+	}
+
+}
diff --git a/extensions/vw/fullcalendar/pom.xml b/extensions/vw/fullcalendar/pom.xml
new file mode 100644
index 0000000..777891d
--- /dev/null
+++ b/extensions/vw/fullcalendar/pom.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.isis.extensions</groupId>
+        <artifactId>isis-extensions</artifactId>
+        <version>2.0.0-M3-SNAPSHOT</version>
+        <relativePath>../../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>isis-extensions-fullcalendar</artifactId>
+    <name>Apache Isis Ext - Wicket Viewer - fullcalendar (parent)</name>
+    <packaging>pom</packaging>
+
+    <description>
+        A component for Apache Isis' Wicket viewer, displaying collections of objects that have a date on a fullcalendar.io (javascript widget).
+    </description>
+
+    <modules>
+        <module>applib</module>
+        <module>ui</module>
+    </modules>
+
+</project>
diff --git a/extensions/vw/fullcalendar/ui/pom.xml b/extensions/vw/fullcalendar/ui/pom.xml
new file mode 100644
index 0000000..f5cfb50
--- /dev/null
+++ b/extensions/vw/fullcalendar/ui/pom.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.isis.extensions</groupId>
+        <artifactId>isis-extensions-fullcalendar</artifactId>
+        <version>2.0.0-M3-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>isis-extensions-fullcalendar-ui</artifactId>
+    <name>Apache Isis Ext - Wicket Viewer - fullcalendar (ui)</name>
+
+    <properties>
+        <jar-plugin.automaticModuleName>org.apache.isis.extensions.fullcalendar.ui</jar-plugin.automaticModuleName>
+        <git-plugin.propertiesDir>org/apache/isis/extensions/fullcalendar/ui</git-plugin.propertiesDir>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.isis.extensions</groupId>
+            <artifactId>isis-extensions-fullcalendar-applib</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.isis.viewer</groupId>
+            <artifactId>isis-viewer-wicket-ui</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>net.ftlines.wicket-fullcalendar</groupId>
+            <artifactId>wicket-fullcalendar-core</artifactId>
+        </dependency>
+
+    </dependencies>
+
+</project>
diff --git a/extensions/vw/fullcalendar/ui/src/main/java/META-INF/services/org.apache.isis.viewer.wicket.ui.ComponentFactory b/extensions/vw/fullcalendar/ui/src/main/java/META-INF/services/org.apache.isis.viewer.wicket.ui.ComponentFactory
new file mode 100644
index 0000000..b7b31ca
--- /dev/null
+++ b/extensions/vw/fullcalendar/ui/src/main/java/META-INF/services/org.apache.isis.viewer.wicket.ui.ComponentFactory
@@ -0,0 +1,2 @@
+org.apache.isis.extensions.fullcalendar.ui.component.calendareventable.CalendarEventableCollectionAsFullCalendarFactory
+org.apache.isis.extensions.fullcalendar.ui.component.calendarable.CalendarableCollectionAsFullCalendarFactory
\ No newline at end of file
diff --git a/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/CalendaredCollectionAbstract.java b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/CalendaredCollectionAbstract.java
new file mode 100644
index 0000000..1e30a60
--- /dev/null
+++ b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/CalendaredCollectionAbstract.java
@@ -0,0 +1,103 @@
+package org.apache.isis.extensions.fullcalendar.ui.component;
+
+import java.util.Collection;
+import java.util.Set;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
+import net.ftlines.wicket.fullcalendar.Config;
+import net.ftlines.wicket.fullcalendar.EventProvider;
+import net.ftlines.wicket.fullcalendar.EventSource;
+import net.ftlines.wicket.fullcalendar.FullCalendar;
+import net.ftlines.wicket.fullcalendar.selector.EventSourceSelector;
+
+import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable;
+import org.apache.wicket.markup.head.IHeaderResponse;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+import org.apache.isis.viewer.wicket.ui.panels.PanelUtil;
+
+/**
+ * {@link PanelAbstract Panel} that represents a {@link EntityCollectionModel
+ * collection of entity}s rendered using {@link AjaxFallbackDefaultDataTable}.
+ */
+public abstract class CalendaredCollectionAbstract extends PanelAbstract<EntityCollectionModel> {
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String ID_SELECTOR = "selector";
+    private static final String ID_FULL_CALENDAR = "fullCalendar";
+    private static final String ID_FEEDBACK = "feedback";
+
+    private final static String[] COLORS = {
+        "#63BA68", "#B1ADAC", "#E6CC7F"
+    };
+    
+    public CalendaredCollectionAbstract(final String id, final EntityCollectionModel model) {
+        super(id, model);
+
+        buildGui();
+    }
+
+    private void buildGui() {
+
+        final EntityCollectionModel model = getModel();
+        
+        final NotificationPanel feedback = new NotificationPanel(ID_FEEDBACK);
+        feedback.setOutputMarkupId(true);
+        addOrReplace(feedback);
+
+        final Config config = new Config();
+        config.setSelectable(true);
+        config.setSelectHelper(false);
+        
+        final Collection<ManagedObject> entityList = model.getObject();
+        final Iterable<String> calendarNames = getCalendarNames(entityList);
+
+        int i=0;
+        for (final String calendarName: calendarNames) {
+            final EventSource namedCalendar = new EventSource();
+            namedCalendar.setTitle(calendarName);
+            namedCalendar.setEventsProvider(newEventProvider(model, calendarName));
+            namedCalendar.setEditable(true);
+            String color = COLORS[i++ % COLORS.length];
+            namedCalendar.setBackgroundColor(color);
+            namedCalendar.setBorderColor(color);
+            config.add(namedCalendar);
+        }
+
+        config.setAspectRatio(2.5f);
+        
+        config.getHeader().setLeft("prevYear,prev,next,nextYear, today");
+        config.getHeader().setCenter("title");
+        config.getHeader().setRight("");
+
+        config.setLoading("function(bool) { if (bool) $(\"#loading\").show(); else $(\"#loading\").hide(); }");
+
+        config.setAllDaySlot(true);
+        
+        final FullCalendar calendar = new FullCalendarWithEventHandling(ID_FULL_CALENDAR, config, feedback);
+        addOrReplace(calendar);
+
+        addOrReplace(new EventSourceSelector(ID_SELECTOR, calendar));
+    }
+
+    protected abstract EventProvider newEventProvider(
+            final EntityCollectionModel model, final String calendarName);
+
+    protected abstract Set<String> getCalendarNames(final Collection<ManagedObject> entityList);
+    
+    @Override
+    protected void onModelChanged() {
+        buildGui();
+    }
+
+    @Override
+    public void renderHead(IHeaderResponse response) {
+        super.renderHead(response);
+
+        PanelUtil.renderHead(response, getClass());
+    }
+}
diff --git a/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/CalendaredCollectionFactoryAbstract.java b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/CalendaredCollectionFactoryAbstract.java
new file mode 100644
index 0000000..67c40d2
--- /dev/null
+++ b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/CalendaredCollectionFactoryAbstract.java
@@ -0,0 +1,57 @@
+package org.apache.isis.extensions.fullcalendar.ui.component;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+import org.apache.isis.viewer.wicket.ui.CollectionContentsAsFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+
+public abstract class CalendaredCollectionFactoryAbstract extends ComponentFactoryAbstract implements CollectionContentsAsFactory {
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String NAME = "calendar";
+
+    private Class<?> cls;
+
+    public CalendaredCollectionFactoryAbstract(final Class<?> cls) {
+        super(ComponentType.COLLECTION_CONTENTS, NAME);
+        this.cls = cls;
+    }
+
+    @Override
+    public ApplicationAdvice appliesTo(final IModel<?> model) {
+        if(!(model instanceof EntityCollectionModel)) {
+            return ApplicationAdvice.DOES_NOT_APPLY;
+        }
+        final EntityCollectionModel entityCollectionModel = (EntityCollectionModel) model;
+        
+        final ObjectSpecification elementSpec = entityCollectionModel.getTypeOfSpecification();
+        final Class<?> correspondingClass = elementSpec.getCorrespondingClass();
+        
+        return appliesIf(cls.isAssignableFrom(correspondingClass));
+    }
+
+    @Override
+    public Component createComponent(final String id, final IModel<?> model) {
+        final EntityCollectionModel collectionModel = (EntityCollectionModel) model;
+        return newComponent(id, collectionModel);
+    }
+
+    protected abstract Component newComponent(final String id, final EntityCollectionModel collectionModel);
+
+
+    @Override
+    public IModel<String> getTitleLabel() {
+        return Model.of("Calendar");
+    }
+
+    @Override
+    public IModel<String> getCssClass() {
+        return Model.of("fa fa-calendar");
+    }
+}
diff --git a/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/EventProviderAbstract.java b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/EventProviderAbstract.java
new file mode 100644
index 0000000..4adf9bc
--- /dev/null
+++ b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/EventProviderAbstract.java
@@ -0,0 +1,141 @@
+package org.apache.isis.extensions.fullcalendar.ui.component;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Maps;
+
+import org.joda.time.DateTime;
+import org.joda.time.Interval;
+
+import org.apache.isis.applib.services.registry.ServiceRegistry;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.runtime.context.IsisContext;
+import org.apache.isis.core.runtime.context.session.RuntimeContextBase;
+import org.apache.isis.extensions.fullcalendar.applib.spi.CalendarableDereferencingService;
+import org.apache.isis.extensions.fullcalendar.applib.value.CalendarEvent;
+import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+
+import lombok.val;
+
+import net.ftlines.wicket.fullcalendar.Event;
+import net.ftlines.wicket.fullcalendar.EventNotFoundException;
+import net.ftlines.wicket.fullcalendar.EventProvider;
+
+public abstract class EventProviderAbstract implements EventProvider {
+
+    private static final long serialVersionUID = 1L;
+
+    private final Map<String, Event> eventById = Maps.newLinkedHashMap();
+
+    // //////////////////////////////////////
+
+    public EventProviderAbstract(final EntityCollectionModel collectionModel, final String calendarName) {
+        createEvents(collectionModel, calendarName);
+    }
+
+    private void createEvents(final EntityCollectionModel model, final String calendarName) {
+        final Collection<ManagedObject> entityList = model.getObject();
+        final Iterable<Event> events = Iterables.filter(
+                Iterables.transform(entityList, newEvent(calendarName)), NOT_NULL);
+        for (final Event event : events) {
+            eventById.put(event.getId(), event);
+        }
+    }
+
+    private Object dereference(final Object domainObject) {
+        return getServiceRegistry().map(serviceRegistry -> {
+            val services = serviceRegistry.select(CalendarableDereferencingService.class);
+            for (final CalendarableDereferencingService dereferencingService : services) {
+                final Object dereferencedObject = dereferencingService.dereference(domainObject);
+                if (dereferencedObject != null && dereferencedObject != domainObject) {
+                    return dereferencedObject;
+                }
+            }
+            return domainObject;
+        }).orElse(null);
+    }
+
+    protected abstract CalendarEvent calendarEventFor(final Object domainObject, final String calendarName);
+
+    private Function<ManagedObject, Event> newEvent(final String calendarName) {
+        return input -> {
+
+            final Object domainObject = input.getPojo();
+            final CalendarEvent calendarEvent = calendarEventFor(domainObject, calendarName);
+            if(calendarEvent == null) {
+                return null;
+            }
+
+            final Event event = new Event();
+
+            final DateTime start = calendarEvent.getDateTime();
+            final DateTime end = start;
+            event.setStart(start);
+            event.setEnd(end);
+            event.setAllDay(true);
+
+            final Object dereferencedObject = dereference(domainObject);
+
+            return IsisContext.getCurrentIsisSession()
+                    .map(isisSession -> {
+                        final SpecificationLoader specificationLoader = isisSession.getSpecificationLoader();
+                        final ObjectSpecification spec = specificationLoader.loadSpecification(dereferencedObject.getClass());
+                        final ManagedObject dereferencedManagedObject = ManagedObject.of(spec, dereferencedObject);
+
+                        if(dereferencedManagedObject instanceof ObjectAdapter) {
+                            final ObjectAdapter dereferencedObjectAdapter = (ObjectAdapter) dereferencedManagedObject;
+
+                            final String oidStr = dereferencedObjectAdapter.getOid().enString();
+                            event.setId(oidStr + "-" + calendarName);
+
+                            event.setClassName("fullCalendar2-event-" + calendarName);
+                            event.setEditable(false);
+                            event.setPayload(oidStr);
+                            event.setTitle(calendarEvent.getTitle());
+
+                            //event.setBackgroundColor(backgroundColor)
+                            //event.setBorderColor(borderColor)
+                            //event.setColor(color)
+                            //event.setTextColor(textColor)
+                            //event.setUrl(url)
+
+                            return event;
+
+                        } else {
+                            return null;
+                        }
+                    })
+                    .orElse(null);
+        };
+    }
+
+    final static Predicate<Event> NOT_NULL = Objects::nonNull;
+
+    // //////////////////////////////////////
+
+    public Collection<Event> getEvents(final DateTime start, final DateTime end) {
+        final Interval interval = new Interval(start, end);
+        final Predicate<Event> withinInterval = input -> interval.contains(input.getStart());
+        final Collection<Event> values = eventById.values();
+        return Collections2.filter(values, withinInterval);
+    }
+
+    public Event getEventForId(String id) throws EventNotFoundException {
+        return eventById.get(id);
+    }
+
+    Optional<ServiceRegistry> getServiceRegistry() {
+        return IsisContext.getCurrentIsisSession().map(RuntimeContextBase::getServiceRegistry);
+    }
+
+}
diff --git a/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/FullCalendarWithEventHandling.java b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/FullCalendarWithEventHandling.java
new file mode 100644
index 0000000..ab2dc2b
--- /dev/null
+++ b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/FullCalendarWithEventHandling.java
@@ -0,0 +1,69 @@
+package org.apache.isis.extensions.fullcalendar.ui.component;
+
+import org.apache.wicket.RestartResponseException;
+
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.context.MetaModelContext;
+import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
+import org.apache.isis.core.metamodel.objectmanager.load.ObjectLoader;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoaderDefault;
+import org.apache.isis.core.runtime.context.IsisContext;
+import org.apache.isis.core.webapp.context.IsisWebAppCommonContext;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
+
+import lombok.val;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
+import net.ftlines.wicket.fullcalendar.CalendarResponse;
+import net.ftlines.wicket.fullcalendar.Config;
+import net.ftlines.wicket.fullcalendar.FullCalendar;
+import net.ftlines.wicket.fullcalendar.callback.ClickedEvent;
+
+final class FullCalendarWithEventHandling extends FullCalendar {
+    
+    @SuppressWarnings("unused")
+	private final NotificationPanel feedback;
+    private static final long serialVersionUID = 1L;
+
+    FullCalendarWithEventHandling(
+            final String id,
+            final Config config,
+            final NotificationPanel feedback) {
+        super(id, config);
+        this.feedback = feedback;
+    }
+
+    @Override
+    protected void onEventClicked(
+            final ClickedEvent event,
+            final CalendarResponse response) {
+
+        final String oidStr = (String) event.getEvent().getPayload();
+        final RootOid oid = RootOid.deString(oidStr);
+
+        IsisContext.getCurrentIsisSession()
+                .map(isisSession -> {
+                    final SpecificationLoader specificationLoader = isisSession.getSpecificationLoader();
+                    final MetaModelContext metaModelContext = isisSession.getMetaModelContext();
+                    final ObjectManager objectManager = isisSession.getObjectManager();
+                    final IsisWebAppCommonContext webAppCommonContext = IsisWebAppCommonContext.of(metaModelContext);
+
+                    val spec = specificationLoader.loadSpecification(oid.getObjectSpecId());
+                    val objectId = oid.getIdentifier();
+                    val managedObject = objectManager.loadObject(ObjectLoader.Request.of(spec, objectId));
+
+                    final EntityModel entityModel = EntityModel.ofAdapter(webAppCommonContext, managedObject);
+                    return entityModel.getPageParameters();
+                }).ifPresent(pageParameters -> {
+                    throw new RestartResponseException(EntityPage.class, pageParameters);
+                });
+
+        // otherwise ignore
+    }
+
+
+
+}
diff --git a/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/IsisModuleExtFullCalendarUi.java b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/IsisModuleExtFullCalendarUi.java
new file mode 100644
index 0000000..a2e98d8
--- /dev/null
+++ b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/IsisModuleExtFullCalendarUi.java
@@ -0,0 +1,13 @@
+package org.apache.isis.extensions.fullcalendar.ui.component;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+
+import org.apache.isis.extensions.fullcalendar.applib.IsisModuleExtFullCalendarApplib;
+
+@Configuration
+@Import({
+        IsisModuleExtFullCalendarApplib.class
+})
+public class IsisModuleExtFullCalendarUi {
+}
diff --git a/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendarable/CalendarableCollectionAsFullCalendar.css b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendarable/CalendarableCollectionAsFullCalendar.css
new file mode 100644
index 0000000..92e5913
--- /dev/null
+++ b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendarable/CalendarableCollectionAsFullCalendar.css
@@ -0,0 +1,44 @@
+/*
+ *  Copyright 2013 Dan Haywood
+ *
+ *  Licensed 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.
+ */
+
+.calendarableCollectionAsFullCalendar .selector {
+	float: right;
+	margin-bottom: -25px;
+	margin-top: 10px;
+}
+
+.calendarableCollectionAsFullCalendar .fc-header-title {
+	margin-top: 5px;
+}
+
+.calendarableCollectionAsFullCalendar div.fc-event-inner {
+    cursor: pointer;
+}
+
+a span.ViewLinkItem.calendar {
+    background-image:url('icon_calendar_off.png');
+    background-position: center center;
+    background-repeat:no-repeat;
+    background-size: 16px 16px;
+}
+
+span.ViewLinkItem.calendar {
+    background-image:url('icon_calendar_on.png');
+    background-position: center center;
+    background-repeat:no-repeat;
+    background-size: 16px 16px;
+}
diff --git a/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendarable/CalendarableCollectionAsFullCalendar.html b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendarable/CalendarableCollectionAsFullCalendar.html
new file mode 100644
index 0000000..7187b17
--- /dev/null
+++ b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendarable/CalendarableCollectionAsFullCalendar.html
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<html xmlns:wicket="http://wicket.apache.org">
+    <body>
+        <wicket:panel>
+            <div class="calendarableCollectionAsFullCalendar">
+                <div wicket:id="feedback"></div>
+                <ul wicket:id="selector" class="selector"></ul>
+                <div wicket:id="fullCalendar"></div>
+                <div id="loading">Loading...</div>
+            </div>
+        </wicket:panel>
+    </body>
+</html>
diff --git a/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendarable/CalendarableCollectionAsFullCalendar.java b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendarable/CalendarableCollectionAsFullCalendar.java
new file mode 100644
index 0000000..fdbc26f
--- /dev/null
+++ b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendarable/CalendarableCollectionAsFullCalendar.java
@@ -0,0 +1,37 @@
+package org.apache.isis.extensions.fullcalendar.ui.component.calendarable;
+
+import java.util.Collection;
+import java.util.Set;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Sets;
+
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.extensions.fullcalendar.ui.component.CalendaredCollectionAbstract;
+import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+
+import net.ftlines.wicket.fullcalendar.EventProvider;
+
+
+public class CalendarableCollectionAsFullCalendar extends CalendaredCollectionAbstract {
+
+    private static final long serialVersionUID = 1L;
+    
+    public CalendarableCollectionAsFullCalendar(final String id, final EntityCollectionModel model) {
+        super(id, model);
+    }
+
+    @Override
+    protected EventProvider newEventProvider(
+            final EntityCollectionModel model,
+            final String calendarName) {
+        return new CalendarableEventProvider(model, calendarName);
+    }
+
+    @Override
+    protected Set<String> getCalendarNames(final Collection<ManagedObject> entityList) {
+        return Sets.newLinkedHashSet(Iterables.concat(
+                        Iterables.transform(entityList, CalendarableEventProvider.GET_CALENDAR_NAMES)));
+    }
+
+}
diff --git a/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendarable/CalendarableCollectionAsFullCalendarFactory.java b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendarable/CalendarableCollectionAsFullCalendarFactory.java
new file mode 100644
index 0000000..f9604e3
--- /dev/null
+++ b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendarable/CalendarableCollectionAsFullCalendarFactory.java
@@ -0,0 +1,26 @@
+package org.apache.isis.extensions.fullcalendar.ui.component.calendarable;
+
+import org.apache.isis.extensions.fullcalendar.applib.Calendarable;
+
+import org.apache.wicket.Component;
+
+import org.apache.isis.extensions.fullcalendar.ui.component.CalendaredCollectionFactoryAbstract;
+import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+
+/**
+ * {@link ComponentFactory} for {@link CalendarableCollectionAsFullCalendar}.
+ */
+public class CalendarableCollectionAsFullCalendarFactory extends CalendaredCollectionFactoryAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    public CalendarableCollectionAsFullCalendarFactory() {
+        super(Calendarable.class);
+    }
+
+    @Override
+    protected Component newComponent(String id, EntityCollectionModel collectionModel) {
+        return new CalendarableCollectionAsFullCalendar(id, collectionModel);
+    }
+}
diff --git a/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendarable/CalendarableEventProvider.java b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendarable/CalendarableEventProvider.java
new file mode 100644
index 0000000..056b358
--- /dev/null
+++ b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendarable/CalendarableEventProvider.java
@@ -0,0 +1,50 @@
+package org.apache.isis.extensions.fullcalendar.ui.component.calendarable;
+
+import java.util.Map;
+
+import com.google.common.base.Function;
+
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.extensions.fullcalendar.applib.CalendarEventable;
+import org.apache.isis.extensions.fullcalendar.applib.Calendarable;
+import org.apache.isis.extensions.fullcalendar.applib.value.CalendarEvent;
+import org.apache.isis.extensions.fullcalendar.ui.component.EventProviderAbstract;
+import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+
+public class CalendarableEventProvider extends EventProviderAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    public CalendarableEventProvider(
+            final EntityCollectionModel collectionModel,
+            final String calendarName) {
+        super(collectionModel, calendarName);
+    }
+
+    @Override
+    protected CalendarEvent calendarEventFor(
+            final Object domainObject,
+            final String calendarName) {
+        if(!(domainObject instanceof Calendarable)) {
+            return null;
+        }
+        final Calendarable calendarable = (Calendarable)domainObject;
+        final Map<String, CalendarEventable> calendarEvents = calendarable.getCalendarEvents();
+        final CalendarEventable calendarEventable = calendarEvents.get(calendarName);
+        return calendarEventable!=null
+                ?calendarEventable.toCalendarEvent()
+                :null;
+    }
+
+    static final Function<ManagedObject, Iterable<String>> GET_CALENDAR_NAMES =
+            input -> {
+                final Object domainObject = input.getPojo();
+                if(!(domainObject instanceof Calendarable)) {
+                    return null;
+                }
+                final Calendarable calendarable = (Calendarable) domainObject;
+                return calendarable.getCalendarNames();
+            };
+
+
+}
diff --git a/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendareventable/CalendarEventableCollectionAsFullCalendar.css b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendareventable/CalendarEventableCollectionAsFullCalendar.css
new file mode 100644
index 0000000..7e14ec6
--- /dev/null
+++ b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendareventable/CalendarEventableCollectionAsFullCalendar.css
@@ -0,0 +1,34 @@
+/*
+ *  Copyright 2013 Dan Haywood
+ *
+ *  Licensed 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.
+ */
+
+.calendarEventableCollectionAsFullCalendar .selector {
+	float: right;
+	margin-bottom: -25px;
+	margin-top: 10px;
+}
+
+.calendarEventableCollectionAsFullCalendar .fc-header-title {
+	margin-top: 5px;
+}
+
+.calendarEventableCollectionAsFullCalendar div.fc-event-inner {
+    cursor: pointer;
+}
+
+.calendarEventableCollectionAsFullCalendar ul.selector {
+	list-style-type: none;
+}
diff --git a/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendareventable/CalendarEventableCollectionAsFullCalendar.html b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendareventable/CalendarEventableCollectionAsFullCalendar.html
new file mode 100644
index 0000000..101468b
--- /dev/null
+++ b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendareventable/CalendarEventableCollectionAsFullCalendar.html
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<html xmlns:wicket="http://wicket.apache.org">
+    <body>
+        <wicket:panel>
+            <div class="calendarEventableCollectionAsFullCalendar">
+                <div wicket:id="feedback"></div>
+                <ul wicket:id="selector" class="selector"></ul>
+                <div wicket:id="fullCalendar"></div>
+                <div id="loading">Loading...</div>
+            </div>
+        </wicket:panel>
+    </body>
+</html>
diff --git a/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendareventable/CalendarEventableCollectionAsFullCalendar.java b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendareventable/CalendarEventableCollectionAsFullCalendar.java
new file mode 100644
index 0000000..a62db78
--- /dev/null
+++ b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendareventable/CalendarEventableCollectionAsFullCalendar.java
@@ -0,0 +1,36 @@
+package org.apache.isis.extensions.fullcalendar.ui.component.calendareventable;
+
+import java.util.Collection;
+import java.util.Set;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Sets;
+
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.extensions.fullcalendar.ui.component.CalendaredCollectionAbstract;
+import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+
+import net.ftlines.wicket.fullcalendar.EventProvider;
+
+public class CalendarEventableCollectionAsFullCalendar extends CalendaredCollectionAbstract {
+
+    private static final long serialVersionUID = 1L;
+    
+    public CalendarEventableCollectionAsFullCalendar(final String id, final EntityCollectionModel model) {
+        super(id, model);
+    }
+
+    @Override
+    protected EventProvider newEventProvider(
+            final EntityCollectionModel model,
+            final String calendarName) {
+        return new CalendarEventableEventProvider(model, calendarName);
+    }
+
+    @Override
+    protected Set<String> getCalendarNames(final Collection<ManagedObject> entityList) {
+        return Sets.newLinkedHashSet(
+                Iterables.transform(entityList, CalendarEventableEventProvider.GET_CALENDAR_NAME));
+    }
+
+}
diff --git a/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendareventable/CalendarEventableCollectionAsFullCalendarFactory.java b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendareventable/CalendarEventableCollectionAsFullCalendarFactory.java
new file mode 100644
index 0000000..40f85b6
--- /dev/null
+++ b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendareventable/CalendarEventableCollectionAsFullCalendarFactory.java
@@ -0,0 +1,26 @@
+package org.apache.isis.extensions.fullcalendar.ui.component.calendareventable;
+
+import org.apache.isis.extensions.fullcalendar.applib.CalendarEventable;
+
+import org.apache.wicket.Component;
+
+import org.apache.isis.extensions.fullcalendar.ui.component.CalendaredCollectionFactoryAbstract;
+import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+
+/**
+ * {@link ComponentFactory} for {@link CalendarEventableCollectionAsFullCalendar}.
+ */
+public class CalendarEventableCollectionAsFullCalendarFactory extends CalendaredCollectionFactoryAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    public CalendarEventableCollectionAsFullCalendarFactory() {
+        super(CalendarEventable.class);
+    }
+
+    @Override
+    protected Component newComponent(String id, EntityCollectionModel collectionModel) {
+        return new CalendarEventableCollectionAsFullCalendar(id, collectionModel);
+    }
+}
diff --git a/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendareventable/CalendarEventableEventProvider.java b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendareventable/CalendarEventableEventProvider.java
new file mode 100644
index 0000000..5ab653f
--- /dev/null
+++ b/extensions/vw/fullcalendar/ui/src/main/java/org/apache/isis/extensions/fullcalendar/ui/component/calendareventable/CalendarEventableEventProvider.java
@@ -0,0 +1,50 @@
+package org.apache.isis.extensions.fullcalendar.ui.component.calendareventable;
+
+import com.google.common.base.Function;
+import com.google.common.base.Objects;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.extensions.fullcalendar.ui.component.EventProviderAbstract;
+import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+
+import org.apache.isis.extensions.fullcalendar.applib.value.CalendarEvent;
+import org.apache.isis.extensions.fullcalendar.applib.CalendarEventable;
+
+public class CalendarEventableEventProvider extends EventProviderAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    public CalendarEventableEventProvider(
+            final EntityCollectionModel collectionModel,
+            final String calendarName) {
+        super(collectionModel, calendarName);
+    }
+
+    @Override
+    protected CalendarEvent calendarEventFor(
+            final Object domainObject,
+            final String calendarName) {
+        if(!(domainObject instanceof CalendarEventable)) {
+            return null;
+        }
+        final CalendarEventable calendarEventable = (CalendarEventable)domainObject;
+        return Objects.equal(calendarName, calendarEventable.getCalendarName())
+                ? calendarEventable.toCalendarEvent()
+                : null;
+    }
+
+    static final Function<ManagedObject, String> GET_CALENDAR_NAME = new Function<ManagedObject, String>() {
+        @Override
+        public String apply(final ManagedObject input) {
+            final Object domainObject = input.getPojo();
+            if(!(domainObject instanceof CalendarEventable)) {
+                return null;
+            }
+            final CalendarEventable calendarEventable = (CalendarEventable) domainObject;
+            return calendarEventable.getCalendarName();
+        }
+    };
+
+
+}
diff --git a/viewers/wicket/adoc/modules/ROOT/partials/component-nav.adoc b/viewers/wicket/adoc/modules/ROOT/partials/component-nav.adoc
index 8fac32c..993fe1b 100644
--- a/viewers/wicket/adoc/modules/ROOT/partials/component-nav.adoc
+++ b/viewers/wicket/adoc/modules/ROOT/partials/component-nav.adoc
@@ -2,5 +2,6 @@ include::vw:ROOT:partial$module-nav.adoc[]
 
 * Extensions
 include::vw:exceldownload:partial$module-nav.adoc[]
+include::vw:fullcalendar:partial$module-nav.adoc[]
 include::vw:pdfjs:partial$module-nav.adoc[]
 


[isis] 08/08: ISIS-2062: sync adoc

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 8515c9b2e688d20ee30315fbb1b884da00d6e9ee
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Thu Jan 23 11:29:23 2020 +0000

    ISIS-2062: sync adoc
---
 .../layout/component/ActionLayoutDataOwner.java    |  4 +--
 .../layout/component/CollectionLayoutData.java     | 21 +++++++--------
 .../examples/layout/component/FieldSet.java        | 31 ++++++++++------------
 .../layout/component/PropertyLayoutData.java       | 14 ++++------
 .../examples/layout/grid/bootstrap3/BS3Col.java    | 15 +++++------
 5 files changed, 36 insertions(+), 49 deletions(-)

diff --git a/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/ActionLayoutDataOwner.java b/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/ActionLayoutDataOwner.java
index c4153d0..c4b07bb 100644
--- a/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/ActionLayoutDataOwner.java
+++ b/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/ActionLayoutDataOwner.java
@@ -21,8 +21,6 @@ package org.apache.isis.applib.layout.component;
 import java.util.List;
 
 public interface ActionLayoutDataOwner extends Owner {
-    
     List<ActionLayoutData> getActions();
-    void addAction(ActionLayoutData actionLayoutData);
-    
+    void setActions(List<ActionLayoutData> actions);
 }
diff --git a/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/CollectionLayoutData.java b/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/CollectionLayoutData.java
index 6991c75..46d4bb2 100644
--- a/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/CollectionLayoutData.java
+++ b/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/CollectionLayoutData.java
@@ -19,18 +19,17 @@
 package org.apache.isis.applib.layout.component;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.List;
 
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.layout.links.Link;
-import org.apache.isis.core.commons.internal.concurrent._ConcurrentListWrapper;
 
 /**
  * Describes the layout of a single collection, broadly corresponds to the {@link org.apache.isis.applib.annotation.CollectionLayout} annotation.
@@ -197,24 +196,24 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed {
         this.sortedBy = sortedBy;
     }
 
-    private _ConcurrentListWrapper<ActionLayoutData> actions = new _ConcurrentListWrapper<>();
+
+
+    private List<ActionLayoutData> actions = new ArrayList<>();
 
     // no wrapper
     @Override
-    @XmlElementRef(type = ActionLayoutData.class, name = "action", required = false)
+    @XmlElement(name = "action", required = false)
     public List<ActionLayoutData> getActions() {
-        return actions.snapshot();
+        return actions;
     }
 
-    public void setActions(List<ActionLayoutData> actionLayoutDatas) {
-        this.actions.replace(actionLayoutDatas);
-    }
-    
     @Override
-    public void addAction(ActionLayoutData actionLayoutData) {
-        this.actions.add(actionLayoutData);
+    public void setActions(List<ActionLayoutData> actionLayoutDatas) {
+        this.actions = actionLayoutDatas;
     }
 
+
+
     private CollectionLayoutDataOwner owner;
     /**
      * Owner.
diff --git a/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/FieldSet.java b/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/FieldSet.java
index c5e071b..335d65a 100644
--- a/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/FieldSet.java
+++ b/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/FieldSet.java
@@ -19,6 +19,7 @@
 package org.apache.isis.applib.layout.component;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.List;
 
 import javax.xml.bind.annotation.XmlAttribute;
@@ -29,7 +30,6 @@ import javax.xml.bind.annotation.XmlType;
 
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.layout.grid.bootstrap3.BS3Col;
-import org.apache.isis.core.commons.internal.concurrent._ConcurrentListWrapper;
 
 /**
  * A {@link MemberRegion region} of the page containing a set of
@@ -133,40 +133,37 @@ Serializable {
         this.name = name;
     }
 
-    private _ConcurrentListWrapper<ActionLayoutData> actions = new _ConcurrentListWrapper<>();
+
+
+    private List<ActionLayoutData> actions = new ArrayList<>();
 
     // no wrapper
     @Override
     @XmlElement(name = "action", required = false)
     public List<ActionLayoutData> getActions() {
-        return actions.snapshot();
+        return actions;
     }
 
-    public void setActions(List<ActionLayoutData> actionLayoutDatas) {
-        this.actions.replace(actionLayoutDatas);
-    }
-    
     @Override
-    public void addAction(ActionLayoutData actionLayoutData) {
-        this.actions.add(actionLayoutData);
+    public void setActions(List<ActionLayoutData> actionLayoutDatas) {
+        this.actions = actionLayoutDatas;
     }
-    
-    private _ConcurrentListWrapper<PropertyLayoutData> properties = new _ConcurrentListWrapper<>();
+
+
+
+    private List<PropertyLayoutData> properties = new ArrayList<>();
 
     // no wrapper; required=false because may be auto-generated
     @XmlElement(name = "property", required = false)
     public List<PropertyLayoutData> getProperties() {
-        return properties.snapshot();
+        return properties;
     }
 
     public void setProperties(List<PropertyLayoutData> properties) {
-        this.properties.replace(properties);
-    }
-    
-    public void addProperty(PropertyLayoutData actionLayoutData) {
-        this.properties.add(actionLayoutData);
+        this.properties = properties;
     }
 
+
     private FieldSetOwner owner;
     /**
      * Owner.
diff --git a/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/PropertyLayoutData.java b/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/PropertyLayoutData.java
index a782ff4..817a6aa 100644
--- a/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/PropertyLayoutData.java
+++ b/api/applib/src/main/adoc/modules/applib-cm/examples/layout/component/PropertyLayoutData.java
@@ -19,6 +19,7 @@
 package org.apache.isis.applib.layout.component;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.List;
 
 import javax.xml.bind.annotation.XmlAttribute;
@@ -33,7 +34,6 @@ import org.apache.isis.applib.annotation.RenderDay;
 import org.apache.isis.applib.annotation.Repainting;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.layout.links.Link;
-import org.apache.isis.core.commons.internal.concurrent._ConcurrentListWrapper;
 
 /**
  * Describes the layout of a single property, broadly corresponds to the {@link org.apache.isis.applib.annotation.PropertyLayout} annotation.
@@ -234,22 +234,18 @@ HasCssClass, HasDescribedAs, HasHidden, HasNamed  {
         this.repainting = repainting;
     }
 
-    private _ConcurrentListWrapper<ActionLayoutData> actions = new _ConcurrentListWrapper<>();
+    private List<ActionLayoutData> actions = new ArrayList<>();
 
     // no wrapper
     @Override
     @XmlElement(name = "action", required = false)
     public List<ActionLayoutData> getActions() {
-        return actions.snapshot();
+        return actions;
     }
 
-    public void setActions(List<ActionLayoutData> actionLayoutDatas) {
-        this.actions.replace(actionLayoutDatas);
-    }
-    
     @Override
-    public void addAction(ActionLayoutData actionLayoutData) {
-        this.actions.add(actionLayoutData);
+    public void setActions(List<ActionLayoutData> actionLayoutDatas) {
+        this.actions = actionLayoutDatas;
     }
 
 
diff --git a/api/applib/src/main/adoc/modules/applib-cm/examples/layout/grid/bootstrap3/BS3Col.java b/api/applib/src/main/adoc/modules/applib-cm/examples/layout/grid/bootstrap3/BS3Col.java
index 439b9b1..7f44432 100644
--- a/api/applib/src/main/adoc/modules/applib-cm/examples/layout/grid/bootstrap3/BS3Col.java
+++ b/api/applib/src/main/adoc/modules/applib-cm/examples/layout/grid/bootstrap3/BS3Col.java
@@ -35,7 +35,6 @@ import org.apache.isis.applib.layout.component.DomainObjectLayoutData;
 import org.apache.isis.applib.layout.component.DomainObjectLayoutDataOwner;
 import org.apache.isis.applib.layout.component.FieldSet;
 import org.apache.isis.applib.layout.component.FieldSetOwner;
-import org.apache.isis.core.commons.internal.concurrent._ConcurrentListWrapper;
 
 /**
  * A column within a row which, depending on its {@link #getSpan()}, could be as narrow as 1/12th of the page's width, all the way up to spanning the entire page.
@@ -172,25 +171,23 @@ CollectionLayoutDataOwner, DomainObjectLayoutDataOwner {
     }
 
 
-    private _ConcurrentListWrapper<ActionLayoutData> actions = new _ConcurrentListWrapper<>();
+
+    private List<ActionLayoutData> actions = new ArrayList<>();
 
     // no wrapper
     @Override
     @XmlElementRef(type = ActionLayoutData.class, name = "action", required = false)
     public List<ActionLayoutData> getActions() {
-        return actions.snapshot();
+        return actions;
     }
 
-    public void setActions(List<ActionLayoutData> actionLayoutDatas) {
-        this.actions.replace(actionLayoutDatas);
-    }
-    
     @Override
-    public void addAction(ActionLayoutData actionLayoutData) {
-        this.actions.add(actionLayoutData);
+    public void setActions(final List<ActionLayoutData> actions) {
+        this.actions = actions;
     }
 
 
+
     private List<BS3Row> rows = new ArrayList<>();
 
     // no wrapper


[isis] 01/08: ISIS-2264: renames WhereAmIModel (since it isn't a wicket model)

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 9f8fab66bfb19eacecb7f7daac4083df397e091b
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Tue Jan 21 21:35:40 2020 +0000

    ISIS-2264:  renames WhereAmIModel (since it isn't a wicket model)
    
    (cherry picked from commit 0c53ad6d6bb93d4ded06a0d8b83d250f8bb6ad0e)
---
 .../WhereAmIHelper.java}                           | 34 ++++++++-----
 .../model/models/whereami/WhereAmIModel.java       | 56 ----------------------
 .../viewer/wicket/ui/pages/entity/EntityPage.java  |  6 +--
 3 files changed, 26 insertions(+), 70 deletions(-)

diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/whereami/WhereAmIModelDefault.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/modelhelpers/WhereAmIHelper.java
similarity index 72%
rename from viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/whereami/WhereAmIModelDefault.java
rename to viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/modelhelpers/WhereAmIHelper.java
index f3f7b3f..c302672 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/whereami/WhereAmIModelDefault.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/modelhelpers/WhereAmIHelper.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.isis.viewer.wicket.model.models.whereami;
+package org.apache.isis.viewer.wicket.model.modelhelpers;
 
 import java.util.LinkedList;
 import java.util.stream.Stream;
@@ -30,25 +30,28 @@ import lombok.val;
 
 /**
  *
+ * @implNote - previously this was called WhereAmIModel, but it isn't really a model in the Wicket sense (it's not serializable, for a start), hence renamed.
  * @since 2.0
- *
  */
-class WhereAmIModelDefault implements WhereAmIModel {
+public class WhereAmIHelper {
+
+    public static WhereAmIHelper of(EntityModel startOfChain) {
+        return new WhereAmIHelper(startOfChain);
+    }
 
     private final LinkedList<Object> reversedChainOfParents = new LinkedList<>();
     private final EntityModel startOfChain;
     private final IsisWebAppCommonContext commonContext;
 
-    private boolean isWhereAmIEnabled;
-    private int maxChainLength;
-    
-    public WhereAmIModelDefault(final EntityModel startOfChain) {
+    private final boolean isWhereAmIEnabled;
+
+    public WhereAmIHelper(final EntityModel startOfChain) {
         this.startOfChain = startOfChain;
         this.commonContext = startOfChain.getCommonContext();
 
         val settings = commonContext.getConfiguration().getViewer().getWicket().getBreadcrumbs();
         this.isWhereAmIEnabled = settings.isEnabled();
-        this.maxChainLength = settings.getMaxParentChainLength();
+        int maxChainLength = settings.getMaxParentChainLength();
 
         val adapter = startOfChain.getObject();
         final Object startNode = adapter.getPojo();
@@ -58,12 +61,18 @@ class WhereAmIModelDefault implements WhereAmIModel {
         .forEach(reversedChainOfParents::addFirst);
     }
 
-    @Override
+    /**
+     *
+     * @return the immutable start node of the navigable parent chain
+     */
     public EntityModel getStartOfChain() {
         return startOfChain;
     }
 
-    @Override
+    /**
+     * The navigable parent chain requires a minimum length of 2 in order to be shown.
+     * @return whether the where-am-I hint should be shown or hidden
+     */
     public boolean isShowWhereAmI() {
         if(!isWhereAmIEnabled) {
             return false; // this will prevent rendering
@@ -71,7 +80,10 @@ class WhereAmIModelDefault implements WhereAmIModel {
         return !reversedChainOfParents.isEmpty();
     }
 
-    @Override
+    /**
+     * Streams the linked nodes of this model's navigable parent chain in reverse order.
+     * @return reversed order stream of linked parent nodes, which does not include the start node
+     */
     public Stream<EntityModel> streamParentChainReversed() {
         if(!isWhereAmIEnabled)
             return Stream.empty(); //[ahuber] unexpected call, we could log a warning
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/whereami/WhereAmIModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/whereami/WhereAmIModel.java
deleted file mode 100644
index 99ba91e..0000000
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/whereami/WhereAmIModel.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.isis.viewer.wicket.model.models.whereami;
-
-import java.util.stream.Stream;
-
-import org.apache.isis.viewer.wicket.model.models.EntityModel;
-
-/**
- * Represents a navigable chain of parent nodes starting at the current node.
- *
- * @since 2.0
- *
- */
-public interface WhereAmIModel {
-
-    public static WhereAmIModel of(EntityModel startOfChain) {
-        return new WhereAmIModelDefault(startOfChain);
-    }
-
-    /**
-     * The navigable parent chain requires a minimum length of 2 in order to be shown.
-     * @return whether the where-am-I hint should be shown or hidden
-     */
-    public boolean isShowWhereAmI();
-
-    /**
-     * Streams the linked nodes of this model's navigable parent chain in reverse order.
-     * @return reversed order stream of linked parent nodes, which does not include the start node
-     */
-    public Stream<EntityModel> streamParentChainReversed();
-
-    /**
-     *
-     * @return the immutable start node of the navigable parent chain
-     */
-    public EntityModel getStartOfChain();
-
-}
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
index f94f7a6..bb41432 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
@@ -42,7 +42,7 @@ import org.apache.isis.core.webapp.context.IsisWebAppCommonContext;
 import org.apache.isis.viewer.wicket.model.common.PageParametersUtils;
 import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
-import org.apache.isis.viewer.wicket.model.models.whereami.WhereAmIModel;
+import org.apache.isis.viewer.wicket.model.modelhelpers.WhereAmIHelper;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.components.entity.icontitle.EntityIconAndTitlePanel;
 import org.apache.isis.viewer.wicket.ui.components.widgets.breadcrumbs.BreadcrumbModel;
@@ -203,7 +203,7 @@ public class EntityPage extends PageAbstract {
 
         themeDiv.addOrReplace(entityPageContainer);
 
-        addWhereAmIIfShown(entityPageContainer, WhereAmIModel.of(model));
+        addWhereAmIIfShown(entityPageContainer, WhereAmIHelper.of(model));
 
         addChildComponents(entityPageContainer, model);
 
@@ -218,7 +218,7 @@ public class EntityPage extends PageAbstract {
 
     protected void addWhereAmIIfShown(
             WebMarkupContainer entityPageContainer,
-            WhereAmIModel whereAmIModel) {
+            WhereAmIHelper whereAmIModel) {
 
         val whereAmIContainer = new WebMarkupContainer("whereAmI-container");
         entityPageContainer.addOrReplace(whereAmIContainer);


[isis] 02/08: ISIS-2062: updates home page

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 43f6132cc87d85bde99969944548356722d3dfa3
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Jan 22 13:47:29 2020 +0000

    ISIS-2062: updates home page
    
    (cherry picked from commit 74661f69d521df6286f434ce31c86352e0b8227c)
---
 antora/supplemental-ui/index.html | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/antora/supplemental-ui/index.html b/antora/supplemental-ui/index.html
index 84a05da..6a345bf 100644
--- a/antora/supplemental-ui/index.html
+++ b/antora/supplemental-ui/index.html
@@ -132,7 +132,7 @@
 <section id="intro">
 
   <div class="intro-content">
-    <h2>Software that<br/>reflects your business</h2>
+    <h2>Build software that's<br/>in step with your business</h2>
 <!--
     <img src="_/img/home/isis-logo-568x286.png"/>
 -->
@@ -176,6 +176,8 @@
             <li><i class="ion-android-checkmark-circle"></i><span>For business users, the app is easy to learn since the business concepts are clear and obvious</span></li>
             <li><i class="ion-android-checkmark-circle"></i><span>When integrating to other systems, the development effort required is minimized through built-in mechanisms</span></li>
           </ul>
+
+          <p>And... Apache Isis™ is <b>open source, built on industry and de-facto standards</b>, so there is no vendor lock-in</p>
         </div>
       </div>
 


[isis] 05/08: ISIS-2062: style updates.

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 73c2d74d14bd1d108795dcf0ad5d13d7a4639614
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Jan 22 14:09:56 2020 +0000

    ISIS-2062: style updates.
    
    (cherry picked from commit 46f00d65170ddc80fb6f8a9ee80186c48e13b9ec)
---
 antora/supplemental-ui/css/home/style.css | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/antora/supplemental-ui/css/home/style.css b/antora/supplemental-ui/css/home/style.css
index d692650..0c3437c 100644
--- a/antora/supplemental-ui/css/home/style.css
+++ b/antora/supplemental-ui/css/home/style.css
@@ -144,6 +144,7 @@ h6 {
   color: #0c2e8a;
   line-height: 1;
   display: inline-block;
+  font-size: smaller;
 }
 
 #header #logo h1 a span {
@@ -155,6 +156,7 @@ h6 {
   margin: 0;
   margin-top: -5px;
   margin-right: 10px;
+  height: 48px;
 }
 
 /*--------------------------------------------------------------


[isis] 04/08: ISIS-2264: sync adoc after removing some unused config props

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 1a4cad9376a8cd2f5e1ff942dadc04c57d9f73e4
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Jan 22 14:09:44 2020 +0000

    ISIS-2264: sync adoc after removing some unused config props
    
    (cherry picked from commit e28fcd2f862b40b9818331a10efb56692a2fda09)
---
 .../config/examples/generated/isis.core.meta-model.validator.adoc   | 5 -----
 .../config/examples/generated/isis.viewer.restfulobjects.adoc       | 6 ------
 2 files changed, 11 deletions(-)

diff --git a/core/config/src/main/adoc/modules/config/examples/generated/isis.core.meta-model.validator.adoc b/core/config/src/main/adoc/modules/config/examples/generated/isis.core.meta-model.validator.adoc
index 85940d8..5baec14 100644
--- a/core/config/src/main/adoc/modules/config/examples/generated/isis.core.meta-model.validator.adoc
+++ b/core/config/src/main/adoc/modules/config/examples/generated/isis.core.meta-model.validator.adoc
@@ -17,11 +17,6 @@ Note that this settings has no effect if the programming model has been configur
 
 
 | isis.core.meta-model. +
-validator.check-module-extent
-|  true
-| 
-
-| isis.core.meta-model. +
 validator. +
 ensure-unique-object-types
 |  true
diff --git a/core/config/src/main/adoc/modules/config/examples/generated/isis.viewer.restfulobjects.adoc b/core/config/src/main/adoc/modules/config/examples/generated/isis.viewer.restfulobjects.adoc
index 96fc48b..543d0f9 100644
--- a/core/config/src/main/adoc/modules/config/examples/generated/isis.viewer.restfulobjects.adoc
+++ b/core/config/src/main/adoc/modules/config/examples/generated/isis.viewer.restfulobjects.adoc
@@ -79,9 +79,3 @@ suppress-update-link
 This is disabled by default. If enabled, then the representations returned are non-standard with respect to the RO Spec v1.0.
 
 
-| isis.viewer.restfulobjects. +
-gsoc2013.legacy-param-details
-| 
-| @deprecated
-
-