Magnolia 5.7 reached extended end of life on May 31, 2022. Support for this branch is limited, see End-of-life policy. Please note that to cover the extra maintenance effort, this EEoL period is a paid extension in the life of the branch. Customers who opt for the extended maintenance will need a new license key to run future versions of Magnolia 5.7. If you have any questions or to subscribe to the extended maintenance, please get in touch with your local contact at Magnolia.
In this tutorial you will get to know about content apps and how are they created.
What is a content app?
See the content app page to know more about content apps.
Create a module
Your content app needs to be deployed as a Magnolia module. Choose from these options depending on your skill level.
Option 1: Clone the project in Git
Choose this option if you know how to work with a Magnolia project and Git. You get a project that you can edit it in your IDE and customize to your needs.
- Clone the
app-tutorial
repository.
git clone https://git.magnolia-cms.com/scm/documentation/app-tutorial.git
- Import the project into your IDE. Here's what the project looks like in IntelliJ IDEA:
- Build the project into a JAR and deploy it to Magnolia instance. Or run the project in your IDE.
Option 2: Download the module JAR
Choose this option if you are new to Magnolia. Download the module JAR and follow the standard module installation instructions. You get the complete content app and can learn how it works.
- Download magnolia-app-tutorial-1.4.8.jar from Nexus.
- Copy the JAR into
<CATALINA_HOME>/webapps/<contextPath>/WEB-INF/lib
folder. Typically this is<CATALINA_HOME>/webapps/magnoliaAuthor/WEB-INF/lib
. - Restart your Magnolia instance and run the Web update. This will install the App Tutorial module.
Option 3: Run a Groovy Script
If you already have a module, and want to quickly create a new App, you can use the Groovy App:
- Open the Groovy app.
- Edit the script
/createAppScript
. - Update the parameters you can see between line 9 and 14:
app_display_name
, here you can specify the name of your appparent_module
, this is where the app will be created (enter your module name)app_group
, the group on the app launcher in which your app should display.app_icon
, the icon of your appapp_repository
, here you can keep the default repositoryapp_folder_support
, if you want to be able to create folders within your app
Module contents
The module contains the following source files:
- Module descriptor:
magnolia-module-app-tutorial.xml
- App configuration
products.yaml
- App Launcher layout bootstrap:
config.modules.ui-admincentral.config.appLauncherLayout.groups.edit.apps.products.xml
- Sample products (cars):
products.cars.xml
- Images:
dam.cars.xml
- Custom node type
app-tutorial-nodetypes.xml
- User interface text in English:
app-products-messages_en.properties
- User interface text in Spanish:
app-products-messages_es.properties
App configuration
The app is configured in YAML in products.yaml
. Equivalent JCR configuration examples are provided below.
App descriptor
pages
since a Pages app already exists.appClass: info.magnolia.ui.contentapp.ContentApp class: info.magnolia.ui.contentapp.ContentAppDescriptor # subapps definition
Node name | Value |
---|---|
modules | |
my-module | |
apps | |
products | |
appClass | info.magnolia.ui.contentapp.ContentApp |
class | info.magnolia.ui.contentapp.ContentAppDescriptor |
App launcher layout
The app launcher can only be configured in the JCR.
In the app launcher layout we add the app to the Edit group.
Node name |
---|
modules |
ui-admincentral |
config |
appLauncherLayout |
groups |
edit |
apps |
pages |
assets |
contacts |
products |
Go to the app launcher and verify that you can see the Products app icon.
If you move the app to another group, log out and back in to see the change.
Browser subapp
The browser
subapp allows you to view and organize items. It is part of every content app.
appClass: info.magnolia.ui.contentapp.ContentApp class: info.magnolia.ui.contentapp.ContentAppDescriptor subApps: browser: subAppClass: info.magnolia.ui.contentapp.browser.BrowserSubApp class: info.magnolia.ui.contentapp.browser.BrowserSubAppDescriptor
Node name | Value |
---|---|
modules | |
app-tutorial | |
apps | |
products | |
subApps | |
browser | |
class | info.magnolia.ui.contentapp.browser.BrowserSubAppDescriptor |
subAppClass | info.magnolia.ui.contentapp.browser.BrowserSubApp |
Content connector
A content connector tells the app where the content resides. In this case we store products in the repository so we use a JCR content connector. The configuration identifies the workspace and a path. It also configures the node type the app operates on.
appClass: info.magnolia.ui.contentapp.ContentApp class: info.magnolia.ui.contentapp.ContentAppDescriptor subApps: browser: subAppClass: info.magnolia.ui.contentapp.browser.BrowserSubApp class: info.magnolia.ui.contentapp.browser.BrowserSubAppDescriptor contentConnector: includeProperties: false workspace: products rootPath: / defaultOrder: jcrName nodeTypes: - name: mgnl:product icon: icon-items - name: mgnl:folder icon: icon-folder
Node name | Value |
---|---|
subApps | |
browser | |
contentConnector | |
nodeTypes | |
product | |
icon | icon-items |
name | mgnl:product |
folders | |
icon | icon-folder |
name | mgnl:folder |
defaultOrder | jcrName |
includeProperties | false |
rootPath | / |
workspace | products |
Workbench
In this app, the workbench displays two node types: mgnl:folder
and mgnl:product
.
appClass: info.magnolia.ui.contentapp.ContentApp class: info.magnolia.ui.contentapp.ContentAppDescriptor subApps: browser: subAppClass: info.magnolia.ui.contentapp.browser.BrowserSubApp class: info.magnolia.ui.contentapp.browser.BrowserSubAppDescriptor # contentConnector definition workbench: dropConstraintClass: info.magnolia.ui.workbench.tree.drop.AlwaysTrueDropConstraint editable: false
Node name | Value |
---|---|
browser | |
workbench | |
dropConstraintClass | info.magnolia.ui.workbench.tree.drop.AlwaysTrueDropConstraint |
editable | false |
Content views
A content view defines how the content is displayed to the user. Under workbench
, we have four views: tree, list, thumbnail and search. The tree view defines columns: Name, Status and Modification date. The other views extend the tree view, displaying the same columns.
appClass: info.magnolia.ui.contentapp.ContentApp class: info.magnolia.ui.contentapp.ContentAppDescriptor subApps: browser: subAppClass: info.magnolia.ui.contentapp.browser.BrowserSubApp class: info.magnolia.ui.contentapp.browser.BrowserSubAppDescriptor # contentConnector definition workbench: dropConstraintClass: info.magnolia.ui.workbench.tree.drop.AlwaysTrueDropConstraint editable: false contentViews: - name: tree class: info.magnolia.ui.workbench.tree.TreePresenterDefinition columns: myColumns - name: name editable: true sortable: true propertyName: jcrName class: info.magnolia.ui.workbench.column.definition.PropertyColumnDefinition - name: status width: 45 displayInChooseDialog: false formatterClass: info.magnolia.ui.workbench.column.StatusColumnFormatter class: info.magnolia.ui.workbench.column.definition.StatusColumnDefinition - name: moddate width: 160 sortable: true displayInChooseDialog: false formatterClass: info.magnolia.ui.workbench.column.DateColumnFormatter propertyName: mgnl:lastModified class: info.magnolia.ui.workbench.column.definition.MetaDataColumnDefinition - name: list class: info.magnolia.ui.workbench.list.ListPresenterDefinition columns: *myColumns - name: thumbnail class: info.magnolia.ui.workbench.thumbnail.ThumbnailPresenterDefinition - name: search class: info.magnolia.ui.workbench.search.SearchPresenterDefinition columns: *myColumns
Node name | Value |
---|---|
workbench | |
contentViews | |
tree | |
columns | |
name | |
class | info.magnolia.ui.workbench.column.definition.PropertyColumnDefinition |
editable | true |
label | Product name |
propertyName | jcrName |
sortable | true |
status | |
class | info.magnolia.ui.workbench.column.definition.StatusColumnDefinition |
displayInChooseDialog | false |
formatterClass | info.magnolia.ui.workbench.column.StatusColumnFormatter |
label | Status |
width | 45 |
moddate | |
class | info.magnolia.ui.workbench.column.definition.MetaDataColumnDefinition |
displayInChooseDialog | false |
formatterClass | info.magnolia.ui.workbench.column.DateColumnFormatter |
label | Modification date |
propertyName | mgnl:lastModified |
sortable | true |
width | 160 |
class | info.magnolia.ui.workbench.tree.TreePresenterDefinition |
list | |
columns | |
extends | ../../tree/columns |
class | info.magnolia.ui.workbench.list.ListPresenterDefinition |
thumbnail | |
class | info.magnolia.ui.workbench.thumbnail.ThumbnailPresenterDefinition |
search | |
columns | |
extends | ../../tree/columns |
class | info.magnolia.ui.workbench.search.SearchPresenterDefinition |
Here's the tree view:
Test the other views too. Search is case sensitive by default.
Actions
Actions allow you to add, edit and delete folders and products. Each action adheres to an action definition.
appClass: info.magnolia.ui.contentapp.ContentApp class: info.magnolia.ui.contentapp.ContentAppDescriptor subApps: browser: subAppClass: info.magnolia.ui.contentapp.browser.BrowserSubApp class: info.magnolia.ui.contentapp.browser.BrowserSubAppDescriptor # contentConnector definition # workbench definition actions: addProduct: subAppId: detail icon: icon-add-item nodeType: mgnl:product appName: products class: info.magnolia.ui.contentapp.detail.action.CreateItemActionDefinition availability: root: true nodeTypes: - mgnl:folder addFolder: icon: icon-add-folder class: info.magnolia.ui.framework.action.AddFolderActionDefinition availability: root: true editFolder: icon: icon-edit dialogName: ui-framework:folder class: info.magnolia.ui.framework.action.OpenEditDialogActionDefinition deleteFolder: icon: icon-delete class: info.magnolia.ui.framework.action.DeleteItemActionDefinition editProduct: subAppId: detail icon: icon-edit appName: products class: info.magnolia.ui.contentapp.detail.action.EditItemActionDefinition availability: nodeTypes: - mgnl:product deleteProduct: icon: icon-delete class: info.magnolia.ui.framework.action.DeleteItemActionDefinition
Node name | Value |
---|---|
browser | |
actions | |
addProduct | |
availability | |
nodeTypes | |
folder | mgnl:folder |
root | true |
appName | products |
class | info.magnolia.ui.contentapp.detail.action.CreateItemActionDefinition |
icon | icon-add-item |
nodeType | mgnl:product |
subAppId | detail |
addFolder | |
availability | |
root | true |
class | info.magnolia.ui.framework.action.AddFolderActionDefinition |
icon | icon-add-folder |
editFolder | |
class | info.magnolia.ui.framework.action.OpenEditDialogActionDefinition |
dialogName | ui-framework:folder |
icon | icon-edit |
deleteFolder | |
class | info.magnolia.ui.framework.action.DeleteItemActionDefinition |
icon | icon-delete |
editProduct | |
availability | |
nodeTypes | |
product | mgnl:product |
appName | products |
class | info.magnolia.ui.contentapp.detail.action.EditItemActionDefinition |
icon | icon-edit |
subAppId | detail |
deleteProduct | |
class | info.magnolia.ui.framework.action.DeleteItemActionDefinition |
icon | icon-delete |
Action bar
appClass: info.magnolia.ui.contentapp.ContentApp class: info.magnolia.ui.contentapp.ContentAppDescriptor subApps: browser: subAppClass: info.magnolia.ui.contentapp.browser.BrowserSubApp class: info.magnolia.ui.contentapp.browser.BrowserSubAppDescriptor # contentConnector definition # workbench definition # actions definition actionbar: defaultAction: editProduct sections: - name: root groups: - name: addActions items: - name: addProduct - name: addFolder availability: nodes: false root: true - name: folder groups: - name: addActions items: - name: addProduct - name: addFolder - name: editActions items: - name: editFolder - name: deleteFolder availability: nodeTypes: - mgnl:folder - name: product groups: - name: editActions items: - name: editProduct - name: deleteProduct availability: nodeTypes: - mgnl:product
Node name | Value |
---|---|
browser | |
actionbar | |
sections | |
root | |
groups | |
addActions | |
items | |
addProduct | |
addFolder | |
availability | |
nodes | false |
root | true |
folder | |
groups | |
addActions | |
items | |
addProduct | |
addFolder | |
editActions | |
items | |
editFolder | |
deleteFolder | |
availability | |
nodeTypes | |
folder | mgnl:folder |
product | |
groups | |
editActions | |
items | |
editProduct | |
deleteProduct | |
availability | |
nodeTypes | |
product | mgnl:product |
defaultAction | editProduct |
Image provider
Image provider is a component that renders images used in apps. It generates the portrait image at the bottom of the action bar and the thumbnails for the thumbnail view.
appClass: info.magnolia.ui.contentapp.ContentApp class: info.magnolia.ui.contentapp.ContentAppDescriptor subApps: browser: subAppClass: info.magnolia.ui.contentapp.browser.BrowserSubApp class: info.magnolia.ui.contentapp.browser.BrowserSubAppDescriptor # contentConnector definition # workbench definition # actions definition # actionbar definition imageProvider: class: info.magnolia.dam.app.ui.imageprovider.DamLinkImageProviderDefinition damLinkPropertyName: image
Node name | Value |
---|---|
browser | |
imageProvider | |
class | info.magnolia.dam.app.ui.imageprovider.DamLinkImageProviderDefinition |
damLinkPropertyName | image |
Select an item in the browser subapp to test the preview. The preview image is displayed at the bottom of the action bar.
Detail subapp
A detail subapp allows you to edit a product. It is configured with a subapp descriptor just like a browser subapp but the classes are different.
appClass: info.magnolia.ui.contentapp.ContentApp class: info.magnolia.ui.contentapp.ContentAppDescriptor subApps: # browser subapp definition detail: subAppClass: info.magnolia.ui.contentapp.detail.DetailSubApp class: info.magnolia.ui.contentapp.detail.DetailSubAppDescriptor
Node name | Value |
---|---|
subApps | |
detail | |
class | info.magnolia.ui.contentapp.detail.DetailSubAppDescriptor |
subAppClass | info.magnolia.ui.contentapp.detail.DetailSubApp |
Content connector
A JCR content connector is also needed in the detail subapp. Here the definition is simpler. You just need to name the workspace.
appClass: info.magnolia.ui.contentapp.ContentApp class: info.magnolia.ui.contentapp.ContentAppDescriptor subApps: # browser subapp definition detail: subAppClass: info.magnolia.ui.contentapp.detail.DetailSubApp class: info.magnolia.ui.contentapp.detail.DetailSubAppDescriptor contentConnector: workspace: products
Node name | Value |
---|---|
subApps | |
detail | |
contentConnector | |
workspace | products |
The rootPath
property is omitted because the default value is /
which is the same as in browser subapp content connector. If you define these properties they must have the same value in both subapps. However, since /
is the default value you could omit the property in both subapps.
We highly recommend using the same
rootPath
in both the detail and browser sub-apps, to benefit from our standard set of actions provided out of the box.
Editor
detail
subapp. Define the node types the editor edits, a form for editing them, and actions for saving the edit.Node types
appClass: info.magnolia.ui.contentapp.ContentApp class: info.magnolia.ui.contentapp.ContentAppDescriptor subApps: # browser subapp definition detail: subAppClass: info.magnolia.ui.contentapp.detail.DetailSubApp class: info.magnolia.ui.contentapp.detail.DetailSubAppDescriptor # contentConnector definition editor: nodeType: icon: icon-items name: mgnl:product
Node name | Value |
---|---|
detail | |
editor | |
nodeType | |
icon | icon-items |
name | mgnl:product |
Form
Your app can edit any kind of content. What you plan to edit determines what fields you need on the form. In this tutorial the items are products so we create a form with three fields: product name, photo and photo credit.
appClass: info.magnolia.ui.contentapp.ContentApp class: info.magnolia.ui.contentapp.ContentAppDescriptor subApps: # browser subapp definition detail: subAppClass: info.magnolia.ui.contentapp.detail.DetailSubApp class: info.magnolia.ui.contentapp.detail.DetailSubAppDescriptor # contentConnector configuration editor: # nodeType definition form: tabs: - name: product fields: - name: jcrName fieldType: text - name: title class: info.magnolia.ui.form.field.definition.TextFieldDefinition - name: image fieldType: link targetWorkspace: dam appName: assets label: Select image identifierToPathConverter: class: info.magnolia.dam.app.assets.field.translator.AssetCompositeIdKeyTranslator contentPreviewDefinition: contentPreviewClass: info.magnolia.dam.app.ui.field.DamFilePreviewComponent - name: description fieldType: richText
Node name | Value |
---|---|
editor | |
form | |
tabs | |
product | |
fields | |
jcrName | |
fieldType | text |
name | jcrName |
title | |
fieldType | text |
name | title |
image | |
identifierToPathConverter | |
class | info.magnolia.dam.app.assets.field.translator.AssetCompositeIdKeyTranslator |
contentPreviewDefinition | |
contentPreviewClass | info.magnolia.dam.app.ui.field.DamFilePreviewComponent |
appName | assets |
fieldType | link |
label | Select image |
targetWorkspace | dam |
description | |
fieldType | richText |
Commit and cancel actions
Commit and cancel are generic reusable actions that save the form data. They are defined under the detail
subapp. The corresponding dialog buttons are in the editor (see above).
appClass: info.magnolia.ui.contentapp.ContentApp class: info.magnolia.ui.contentapp.ContentAppDescriptor subApps: # browser subapp definition detail: subAppClass: info.magnolia.ui.contentapp.detail.DetailSubApp class: info.magnolia.ui.contentapp.detail.DetailSubAppDescriptor # contentConnector definition editor: # nodeType definition # form definition actions: - name: commit - name: cancel
Node name | Value |
---|---|
detail | |
actions | |
commit | |
cancel |
Create a few items. Verify that you can edit existing items too.
Now do it yourself
Here are ways to create your own content app:
Option 1: Copy an app
- Copy the configuration nodes of an existing content app into a new app. You can copy one of Magnolia's native apps such as Contacts.
- Export the copied configuration nodes into XML.
- Open the XML in a text editor. Search and replace the item names. For example, if your app manages apples instead of oranges, replace
apple
withorange
. - Import the XML back to Magnolia.
- Register a new workspace in the module descriptor and create a new node type.
Option 2: Extend an app
This method works well if one of Magnolia's native apps does almost what you need. You don't need to change much. Extend the native app to get all its functionality and add something special. For example, configure a special Pages app that displays only one website branch. If editors mostly work in that branch the app saves them from having to navigate there.
- Extend an existing app to inherit configuration. For example, see how the JCR Browser app extends the Configuration app by inheriting its subapps.
- Define exceptions in your own app.
See also 3.3.5 Create an app in Magnolia Academy.
Enhancements
Here are ideas for enhancing your content app and making it ready for production use:
Add import and export actions
Add export and import actions so you can export products into XML. See how the actions are implement in the Contacts app. Copy the action configuration to your app. The Magnolia UI framework provides generic export and import actions that you can use out of the box.
/modules/contacts/apps/contacts/subApps/browser/actions/export /modules/contacts/apps/contacts/subApps/browser/actions/import /modules/contacts/apps/contacts/subApps/browser/actionbar/sections/root/groups/importExportActions /modules/contacts/apps/contacts/subApps/browser/actionbar/sections/contact/groups/importExportActions /modules/contacts/apps/contacts/subApps/browser/actionbar/sections/folder/groups/importExportActions
Add publishing actions
To add publishing actions:
- Add
activate
anddeactivate
actions so that you can publish products to the public instance. Copy the actions from the Contacts app. - Add the
activate
anddeactivate
actions in the action bar. You can copy these also from the Contacts app. - Add a subscription to the
products
workspace so that public instances receive the content.
Don't forget to install your module also on the public instance! You may not need the app on the public instance but you will need the
products
workspace so that products can be activated.
Add deletion approval
Prevent editors from deleting products with a single click. The best practice is to mark an item for deletion and require the editor to publish the change:
- Display a confirmation message, asking if the user really wants to delete the item.
- Mark the item as deleted.
- Activate the change. This finally deletes the item.
See how the Contacts app handles this and replicate the actions in your app. See also how the info.magnolia.ui.api.availability.IsNotDeletedRule
action availability rule is used in the activate action to make sure that the activatable item is not marked for deletion.
Display products on the website
You may want to display product images on the website or in a shop. Add a URI2RepositoryMapping for the products
workspace. The mapping tells Magnolia to serve content from the products
workspace when the request URL contains the /products
prefix.
To add a URI2RepositoryMapping:
- Go to Configuration >
/server/URI2RepositoryMapping/mappings
. Map the /products URI prefix to the
products
workspace.Node name Value serverURI2RepositoryMappingmappingsproductsURIPrefix/products
handlePrefixrepositoryproducts
- Activate the
products
node and its properties to the public instance. - Optional: Grant the
anonymous
role permission to read theproducts
workspace. This allows visitors to view the images on the public instance.
Photo credits:
- Riley Brooklands 1930 and Fiat Cinquecento, Pedro Ribeiro Simões. Creative Commons Attribution 2.0 Generic (CC BY 2.0)
- Pontiac 1952, Continental Mark II and Hudson 1927, John Lloyd. Creative Commons Attribution 2.0 Generic (CC BY 2.0)
Aston Martin DB5, Aston Martin Works
Aston Martin V8, Beltane43, Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
- Lotus Esprit S1, Don Griffin
9 Comments
Brice Nzuakue
Hi,
is there a better tutorial for creating a content app from an exisiting one? I want to create a content app from the native tours app and make it available on the app launcher. But the instructions you are giving here is not really helpful.
Thanks.
Christoph Meier
Hi
There is no better tutorial available so far. We will provide a better one in the mid-term future.
Sorry for this inconvenience.
Kind regards,
Christoph
Brice Nzuakue
Ok, I understand. Anyway, can you explain me how I can realise the following instruction for creating a content app from copyng the configuration node of an axisting one:
Christoph Meier
Here you go:
1)
Create an xml file describing / defining the node-type.
Have a look at the example used for
app-tutorial
https://git.magnolia-cms.com/projects/DOCUMENTATION/repos/app-tutorial/browse/src/main/resources/mgnl-nodetypes/app-tutorial-nodetypes.xml
2) Register a workspace and the node type in the module descriptor:
See https://git.magnolia-cms.com/projects/DOCUMENTATION/repos/app-tutorial/browse/src/main/resources/META-INF/magnolia/magnolia-module-app-tutorial.xml
Lines 30-38
Further readings:
- https://documentation.magnolia-cms.com/display/DOCS57/XML-based+module+descriptor#XML-basedmoduledescriptor-Workspaces
- https://documentation.magnolia-cms.com/display/DOCS57/Workspaces#Workspaces-Addingacustomworkspace
I hope this helps.
Cheers,
Christoph
Ravindra Kumar Verma
Brice Nzuakue Christoph Meier is it possible to generate content app using light module and show it in app launcher. I am using magnolia 5.7 version. ?
Christoph Meier
Ravindra Kumar Verma
Yes, it is possible.
The quickest/fastest way is to create a content app based on a content type.
Within the content type you also can define "JCR params" (workspace, nodetype(s), namespace(s)).
If you already have a JCR workspace (and node type), defined somewhere else, which you want to use with your content app, define the app wothout content type.
The app descriptor (that's an app definition), for the app named foobar must be stored at:
your-light-module/apps/foobar.yaml
To get an app launcher tile, add a new node to
/modules/ui-admincentral/config/appLauncherLayout/groups/edit/apps
.Links
I hope this helps,
cheers,
Christoph
Ravindra Kumar Verma
Thanks Christoph Meier As suggested I am successfully able to create app using light module and added the same to Applauncherlayut but when I click on the app icon I got the following exception , Please suggest , I am stuck tried a lot but didn't got the success.
is it possible to create workspace using light module yaml or any other way ?
javax.jcr.NoSuchWorkspaceException: dxpapp
at info.magnolia.repository.DefaultRepositoryManager.getSession(DefaultRepositoryManager.java:309) ~[magnolia-core-5.7.jar:?]
at info.magnolia.context.DefaultRepositoryStrategy.internalGetSession(DefaultRepositoryStrategy.java:61) ~[magnolia-core-5.7.jar:?]
at info.magnolia.context.AbstractRepositoryStrategy.getSession(AbstractRepositoryStrategy.java:75) ~[magnolia-core-5.7.jar:?]
at info.magnolia.context.AbstractContext.getJCRSession(AbstractContext.java:124) ~[magnolia-core-5.7.jar:?]
at info.magnolia.context.MgnlContext.getJCRSession(MgnlContext.java:642) ~[magnolia-core-5.7.jar:?]
at info.magnolia.ui.vaadin.integration.jcr.JcrItemUtil.getItemId(JcrItemUtil.java:177) ~[magnolia-ui-vaadin-integration-5.7.jar:?]
at info.magnolia.ui.vaadin.integration.contentconnector.JcrContentConnector.getDefaultItemId(JcrContentConnector.java:170) [magnolia-ui-vaadin-integration-5.7.jar:?]
at info.magnolia.ui.framework.availability.AvailabilityCheckerImpl.prepareShorthandRules(AvailabilityCheckerImpl.java:136) [magnolia-ui-framework-5.7.jar:?]
at info.magnolia.ui.framework.availability.AvailabilityCheckerImpl.prepareRules(AvailabilityCheckerImpl.java:119) [magnolia-ui-framework-5.7.jar:?]
at info.magnolia.ui.framework.availability.AvailabilityCheckerImpl.isAvailable(AvailabilityCheckerImpl.java:92) [magnolia-ui-framework-5.7.jar:?]
at info.magnolia.ui.contentapp.browser.BrowserSubApp.isSectionVisible(BrowserSubApp.java:355) [magnolia-ui-contentapp-5.7.jar:?]
at info.magnolia.ui.contentapp.browser.BrowserSubApp.getVisibleSection(BrowserSubApp.java:348) [magnolia-ui-contentapp-5.7.jar:?]
at info.magnolia.ui.contentapp.browser.BrowserSu
Christoph Meier
Dear Ravindra Kumar Verma
I have overlooked one of your earlier statements, where you said that you are using Magnolia 5.7.
Sorry!
With 5.7 you can not create workspaces via light module.
To create a workspace via light module utilizing the content-types module (by defining a content type), you need Magnolia 5.7.2 or higher (or Magnolia 6.0 or 6.1).
On the 5.7-series, 5.7.3 is the latest.
Regards,
Christoph
Ravindra Kumar Verma
Thanks Christoph Meier I have taken other way and able to create the content app using above mentioned app-tutorial project sample , and deploy the generated Jar in WEB-INF lib folder.
Now I have two questions