You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by nm...@apache.org on 2021/01/15 08:04:17 UTC

[ofbiz-framework] branch trunk updated: Implemented: Add a framework method to get main webapp menu with the webapp name (OFBIZ-10601)

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

nmalin pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 7165768  Implemented: Add a framework method to get main webapp menu with the webapp name (OFBIZ-10601)
7165768 is described below

commit 7165768251cafeb967898c4b3241734486fd38c3
Author: Nicolas Malin <ni...@nereide.fr>
AuthorDate: Tue Jan 12 15:21:53 2021 +0100

    Implemented: Add a framework method to get main webapp menu with the webapp name
    (OFBIZ-10601)
    
    To improve theme management and provide better tools for new themes, we implement a method to obtain the main menu of a webapp.
    Instead of just managing a menu, we extend the functionality by offering a method to expose a summary of the webapp, to simplify the navigation.
    
    For this we add a new attribute on webapp definition app-shortcut-screen :
    
        <webapp name="mywebapp"
                ...
                app-shortcut-screen="component://mycomponent/widget/CommonScreens.xml#ShortcutApp"
                ...
        />
    
    The idea is to define a new purpose screen *Shortcut* that contains what defines a webapp when an action or navigation has been requested. With this screen you can load a menu, a search, a complex description and use all screen powerfulness to resolve what displaying and support by theming
    
        <screen name="ShortcutApp">
            <section>
                <actions>
                    <property-map resource="CommonUiLabels" map-name="uiLabelMap" global="true"/>
                </actions>
                <widgets>
                    <decorator-screen name="ShortcutDecorator" location="component://common/widget/CommonScreens.xml">
                        <decorator-section name="body">
                            <include-menu name="MyShortcutAppBar" location="component://mycomponent/widget/CommonMenus.xml"/>
                        </decorator-section>
                    </decorator-screen>
                </widgets>
            </section>
        </screen>
    
    Each component are self-sufficient to define what shortcuts to display without framework change or knowledge about other component.
    Each theme can implement and customize the display rendering at will.
    
    To illustrate an example of implementation we set sub menu for each webapp defined on applications and exploit it on bluelight theme.
    
    Thanks for Dennis Balkir, Jacques Leroux, Leila Mekika and Julien Nicolas for their involvement
---
 applications/accounting/ofbiz-component.xml        |  3 +
 applications/accounting/widget/AccountingMenus.xml | 32 +++++++++
 applications/accounting/widget/CommonScreens.xml   | 16 ++++-
 applications/accounting/widget/ap/ApMenus.xml      |  9 +++
 .../accounting/widget/ap/CommonScreens.xml         | 15 +++++
 applications/accounting/widget/ar/ArMenus.xml      |  7 ++
 .../accounting/widget/ar/CommonScreens.xml         | 15 +++++
 applications/content/ofbiz-component.xml           |  1 +
 applications/content/widget/CommonScreens.xml      | 16 ++++-
 .../content/widget/content/ContentMenus.xml        | 14 ++++
 applications/humanres/ofbiz-component.xml          |  1 +
 applications/humanres/widget/CommonScreens.xml     | 16 ++++-
 applications/humanres/widget/HumanresMenus.xml     | 14 ++++
 applications/manufacturing/ofbiz-component.xml     |  1 +
 .../widget/manufacturing/CommonScreens.xml         | 16 +++++
 .../widget/manufacturing/ManufacturingMenus.xml    | 56 ++++++++++++++++
 applications/marketing/ofbiz-component.xml         |  2 +
 applications/marketing/widget/CommonScreens.xml    | 15 +++++
 applications/marketing/widget/MarketingMenus.xml   |  8 +++
 .../marketing/widget/sfa/CommonScreens.xml         | 15 +++++
 applications/marketing/widget/sfa/SfaMenus.xml     | 14 ++++
 applications/order/ofbiz-component.xml             |  1 +
 .../order/widget/ordermgr/CommonScreens.xml        | 17 +++++
 applications/order/widget/ordermgr/OrderMenus.xml  | 75 ++++++++++++++++++++++
 applications/party/ofbiz-component.xml             |  1 +
 .../party/widget/partymgr/CommonScreens.xml        | 15 +++++
 applications/party/widget/partymgr/PartyMenus.xml  | 18 ++++++
 applications/product/ofbiz-component.xml           | 16 +++--
 .../product/widget/catalog/CatalogMenus.xml        | 17 +++++
 .../product/widget/catalog/CatalogScreens.xml      | 15 +++++
 .../product/widget/facility/FacilityMenus.xml      | 21 ++++++
 .../product/widget/facility/FacilityScreens.xml    | 12 ++++
 applications/workeffort/ofbiz-component.xml        |  1 +
 applications/workeffort/widget/CommonScreens.xml   | 16 +++++
 applications/workeffort/widget/WorkEffortMenus.xml | 12 ++++
 framework/base/dtd/ofbiz-component.xsd             |  8 +++
 .../ofbiz/base/component/ComponentConfig.java      | 18 ++++++
 framework/common/widget/CommonScreens.xml          | 10 +++
 themes/bluelight/template/AppBarOpen.ftl           | 10 ++-
 themes/bluelight/webapp/bluelight/style.css        | 17 +++++
 themes/common-theme/widget/CommonScreens.xml       | 20 ++++++
 themes/common-theme/widget/Theme.xml               |  1 +
 42 files changed, 596 insertions(+), 11 deletions(-)

diff --git a/applications/accounting/ofbiz-component.xml b/applications/accounting/ofbiz-component.xml
index ced2e50..503f300 100644
--- a/applications/accounting/ofbiz-component.xml
+++ b/applications/accounting/ofbiz-component.xml
@@ -80,6 +80,7 @@ under the License.
         server="default-server"
         location="webapp/accounting"
         base-permission="OFBTOOLS,ACCOUNTING"
+        app-shortcut-screen="component://accounting/widget/CommonScreens.xml#ShortcutApp"
         mount-point="/accounting"/>
 
     <webapp name="ar"
@@ -87,6 +88,7 @@ under the License.
         server="default-server"
         location="webapp/ar"
         base-permission="OFBTOOLS,ACCOUNTING"
+        app-shortcut-screen="component://accounting/widget/ar/CommonScreens.xml#ShortcutApp"
         mount-point="/ar"/>
 
     <webapp name="ap"
@@ -94,5 +96,6 @@ under the License.
         server="default-server"
         location="webapp/ap"
         base-permission="OFBTOOLS,ACCOUNTING"
+        app-shortcut-screen="component://accounting/widget/ap/CommonScreens.xml#ShortcutApp"
         mount-point="/ap"/>
 </ofbiz-component>
diff --git a/applications/accounting/widget/AccountingMenus.xml b/applications/accounting/widget/AccountingMenus.xml
index ecf4651..0f83119 100644
--- a/applications/accounting/widget/AccountingMenus.xml
+++ b/applications/accounting/widget/AccountingMenus.xml
@@ -53,6 +53,38 @@ under the License.
         <menu-item name="companies" title="${uiLabelMap.AccountingOrgGlSettings}"><link target="ListCompanies"/></menu-item>
     </menu>
 
+    <menu name="AccountingShortcutAppBar" title="${uiLabelMap.AccountingManager}">
+        <menu-item name="invoices" title="${uiLabelMap.AccountingInvoicesMenu}"><link target="/accounting/control/findInvoices" url-mode="inter-app"/></menu-item>
+        <menu-item name="payments" title="${uiLabelMap.AccountingPaymentsMenu}"><link target="/accounting/control/findPayments" url-mode="inter-app"/></menu-item>
+        <menu-item name="PaymentGroup" title="${uiLabelMap.AccountingPaymentGroup}"><link target="/accounting/control/FindPaymentGroup" url-mode="inter-app"/></menu-item>
+        <menu-item name="transaction" title="${uiLabelMap.AccountingTransactions}">
+            <condition>
+                <or>
+                    <if-has-permission permission="MANUAL" action="_PAYMENT"/>
+                    <if-has-permission permission="ACCOUNTING" action="_CREATE"/>
+                </or>
+            </condition>
+            <link target="/accounting/control/FindGatewayResponses" url-mode="inter-app"/>
+        </menu-item>
+        <menu-item name="PaymentGatewayConfig" title="${uiLabelMap.AccountingPaymentGatewayConfig}">
+            <condition>
+                <or>
+                    <if-has-permission permission="PAYPROC" action="_ADMIN"/>
+                    <if-has-permission permission="ACCOUNTING" action="_ADMIN"/>
+                </or>
+            </condition>
+            <link target="/accounting/control/FindPaymentGatewayConfig" url-mode="inter-app"/>
+        </menu-item>
+        <menu-item name="billingaccount" title="${uiLabelMap.AccountingBillingMenu}"><link target="/accounting/control/FindBillingAccount" url-mode="inter-app"/></menu-item>
+        <menu-item name="FindFinAccount" title="${uiLabelMap.AccountingFinAccount}"><link target="/accounting/control/FinAccountMain" url-mode="inter-app"/></menu-item>
+        <menu-item name="TaxAuthorities" title="${uiLabelMap.AccountingTaxAuthorities}"><link target="/accounting/control/FindTaxAuthority" url-mode="inter-app"/></menu-item>
+        <menu-item name="agreements" title="${uiLabelMap.AccountingAgreements}"><link target="/accounting/control/FindAgreement" url-mode="inter-app"/></menu-item>
+        <menu-item name="ListFixedAssets" title="${uiLabelMap.AccountingFixedAssets}"><link target="/accounting/control/ListFixedAssets" url-mode="inter-app"/></menu-item>
+        <menu-item name="ListBudgets" title="${uiLabelMap.AccountingBudgets}"><link target="/accounting/control/ListBudgets" url-mode="inter-app"/></menu-item>
+        <menu-item name="GlobalGLSettings" title="${uiLabelMap.AccountingGlobalGLSettings}"><link target="/accounting/control/globalGLSettings" url-mode="inter-app"/></menu-item>
+        <menu-item name="companies" title="${uiLabelMap.AccountingOrgGlSettings}"><link target="/accounting/control/ListCompanies" url-mode="inter-app"/></menu-item>
+    </menu>
+
     <menu name="InvoiceTabBar" extends="CommonTabBarMenu" extends-resource="component://common/widget/CommonMenus.xml">
         <menu-item name="find" title="${uiLabelMap.CommonFind}">
             <link target="findInvoices"/>
diff --git a/applications/accounting/widget/CommonScreens.xml b/applications/accounting/widget/CommonScreens.xml
index eb024e4..40d7168 100644
--- a/applications/accounting/widget/CommonScreens.xml
+++ b/applications/accounting/widget/CommonScreens.xml
@@ -47,7 +47,21 @@ under the License.
             </widgets>
         </section>
     </screen>
-
+    <screen name="ShortcutApp">
+        <section>
+            <actions>
+                <property-map resource="AccountingUiLabels" map-name="uiLabelMap" global="true"/>
+                <property-map resource="PartyUiLabels" map-name="uiLabelMap" global="true"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="ShortcutDecorator" location="component://common/widget/CommonScreens.xml">
+                    <decorator-section name="body">
+                        <include-menu name="AccountingShortcutAppBar" location="component://accounting/widget/AccountingMenus.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
     <screen name="CommonFinAccountDecorator">
         <section>
             <actions>
diff --git a/applications/accounting/widget/ap/ApMenus.xml b/applications/accounting/widget/ap/ApMenus.xml
index a23f271..04b784c 100644
--- a/applications/accounting/widget/ap/ApMenus.xml
+++ b/applications/accounting/widget/ap/ApMenus.xml
@@ -27,6 +27,15 @@ under the License.
         <menu-item name="reports" title="${uiLabelMap.AccountingReports}"><link target="listReports"/></menu-item>
     </menu>
 
+    <menu name="ApShortcutAppBar" title="${uiLabelMap.AccountingApManager}">
+        <menu-item name="agreements" title="${uiLabelMap.AccountingAgreements}"><link target="/ap/control/FindAgreement" url-mode="inter-app"/></menu-item>
+        <menu-item name="invoices" title="${uiLabelMap.AccountingInvoicesMenu}"><link target="/ap/control/FindApInvoices" url-mode="inter-app"/></menu-item>
+        <menu-item name="payments" title="${uiLabelMap.AccountingPaymentsMenu}"><link target="/ap/control/findPayments" url-mode="inter-app"/></menu-item>
+        <menu-item name="apPaymentGroups" title="${uiLabelMap.AccountingApPaymentGroupMenu}"><link target="/ap/control/FindApPaymentGroups" url-mode="inter-app"/></menu-item>
+        <menu-item name="findVendors" title="${uiLabelMap.AccountingApPageTitleFindVendors}"><link target="/ap/control/findVendors" url-mode="inter-app"/></menu-item>
+        <menu-item name="reports" title="${uiLabelMap.AccountingReports}"><link target="/ap/control/listReports" url-mode="inter-app"/></menu-item>
+    </menu>
+
     <menu name="ApInvoiceTabBar" extends="CommonTabBarMenu" extends-resource="component://common/widget/CommonMenus.xml"
             default-menu-item-name="viewInvoices">
         <menu-item name="viewInvoices" title="${uiLabelMap.CommonMain}">
diff --git a/applications/accounting/widget/ap/CommonScreens.xml b/applications/accounting/widget/ap/CommonScreens.xml
index 419b737..0e1561c 100644
--- a/applications/accounting/widget/ap/CommonScreens.xml
+++ b/applications/accounting/widget/ap/CommonScreens.xml
@@ -38,6 +38,21 @@ under the License.
             </widgets>
         </section>
     </screen>
+    <screen name="ShortcutApp">
+        <section>
+            <actions>
+                <property-map resource="AccountingUiLabels" map-name="uiLabelMap" global="true"/>
+                <property-map resource="PartyUiLabels" map-name="uiLabelMap" global="true"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="ShortcutDecorator" location="component://common/widget/CommonScreens.xml">
+                    <decorator-section name="body">
+                        <include-menu name="ApShortcutAppBar" location="component://accounting/widget/ap/ApMenus.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
 
     <screen name="main">
         <section>
diff --git a/applications/accounting/widget/ar/ArMenus.xml b/applications/accounting/widget/ar/ArMenus.xml
index c7392f6..6f8c82d 100644
--- a/applications/accounting/widget/ar/ArMenus.xml
+++ b/applications/accounting/widget/ar/ArMenus.xml
@@ -26,6 +26,13 @@ under the License.
         <menu-item name="paymentGroups" title="${uiLabelMap.AccountingArPaymentGroupMenu}"><link target="FindArPaymentGroups"/></menu-item>
         <menu-item name="reports" title="${uiLabelMap.AccountingReports}"><link target="ListReports"/></menu-item>
     </menu>
+    <menu name="ArShortcutAppBar" title="${uiLabelMap.AccountingArManager}">
+        <menu-item name="agreements" title="${uiLabelMap.AccountingAgreements}"><link target="/ar/control/FindAgreement" url-mode="inter-app"/></menu-item>
+        <menu-item name="invoices" title="${uiLabelMap.AccountingInvoicesMenu}"><link target="/ar/control/findInvoices" url-mode="inter-app"/></menu-item>
+        <menu-item name="payments" title="${uiLabelMap.AccountingPaymentsMenu}"><link target="/ar/control/findPayments" url-mode="inter-app"/></menu-item>
+        <menu-item name="paymentGroups" title="${uiLabelMap.AccountingArPaymentGroupMenu}"><link target="/ar/control/FindArPaymentGroups" url-mode="inter-app"/></menu-item>
+        <menu-item name="reports" title="${uiLabelMap.AccountingReports}"><link target="/ar/control/ListReports" url-mode="inter-app"/></menu-item>
+    </menu>
     <menu name="ArPaymentTabBar" extends="CommonTabBarMenu" extends-resource="component://common/widget/CommonMenus.xml">
         <menu-item name="findPayments" title="${uiLabelMap.PageTitleFindPayment}">
             <link target="findPayments"/>
diff --git a/applications/accounting/widget/ar/CommonScreens.xml b/applications/accounting/widget/ar/CommonScreens.xml
index b9baeed..7e2a552 100644
--- a/applications/accounting/widget/ar/CommonScreens.xml
+++ b/applications/accounting/widget/ar/CommonScreens.xml
@@ -40,6 +40,21 @@ under the License.
            </widgets>
         </section>
     </screen>
+    <screen name="ShortcutApp">
+        <section>
+            <actions>
+                <property-map resource="AccountingUiLabels" map-name="uiLabelMap" global="true"/>
+                <property-map resource="PartyUiLabels" map-name="uiLabelMap" global="true"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="ShortcutDecorator" location="component://common/widget/CommonScreens.xml">
+                    <decorator-section name="body">
+                        <include-menu name="ArShortcutAppBar" location="component://accounting/widget/ar/ArMenus.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
 
     <screen name="main">
         <section>
diff --git a/applications/content/ofbiz-component.xml b/applications/content/ofbiz-component.xml
index 1a19a78..1fa9978 100644
--- a/applications/content/ofbiz-component.xml
+++ b/applications/content/ofbiz-component.xml
@@ -49,6 +49,7 @@ under the License.
         server="default-server"
         location="webapp/content"
         base-permission="OFBTOOLS,CONTENTMGR"
+        app-shortcut-screen="component://content/widget/CommonScreens.xml#ShortcutApp"
         mount-point="/content"/>
     
     <webapp name="contentimages"
diff --git a/applications/content/widget/CommonScreens.xml b/applications/content/widget/CommonScreens.xml
index 24d0b42..423a6f8 100644
--- a/applications/content/widget/CommonScreens.xml
+++ b/applications/content/widget/CommonScreens.xml
@@ -44,7 +44,21 @@ under the License.
             </widgets>
         </section>
     </screen>
-
+    <screen name="ShortcutApp">
+        <section>
+            <actions>
+                <property-map resource="ContentUiLabels" map-name="uiLabelMap" global="true"/>
+                <property-map resource="PartyUiLabels" map-name="uiLabelMap" global="true"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="ShortcutDecorator" location="component://common/widget/CommonScreens.xml">
+                    <decorator-section name="body">
+                        <include-menu name="ContentShortcutAppBar" location="component://content/widget/content/ContentMenus.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
     <screen name="commonCmsDecorator">
         <section>
             <actions>
diff --git a/applications/content/widget/content/ContentMenus.xml b/applications/content/widget/content/ContentMenus.xml
index 103b168..7941d93 100644
--- a/applications/content/widget/content/ContentMenus.xml
+++ b/applications/content/widget/content/ContentMenus.xml
@@ -33,6 +33,20 @@ under the License.
         <menu-item name="CompDoc" title="${uiLabelMap.ContentCompDoc}"><link target="FindCompDoc"/></menu-item>
     </menu>
 
+    <menu name="ContentShortcutAppBar" title="${uiLabelMap.ContentContentManager}">
+        <menu-item name="websites" title="${uiLabelMap.ContentWebSites}"><link target="FindWebSite" url-mode="inter-app"/></menu-item>
+        <menu-item name="survey" title="${uiLabelMap.ContentSurvey}"><link target="FindSurvey" url-mode="inter-app"/></menu-item>
+        <menu-item name="Forum" title="${uiLabelMap.ContentForum}"><link target="findForumGroups" url-mode="inter-app"/></menu-item>
+        <menu-item name="Blog" title="${uiLabelMap.ContentBlog}"><link target="blogMain" url-mode="inter-app"/></menu-item>
+        <menu-item name="Content" title="${uiLabelMap.ContentContent}"><link target="findContent" url-mode="inter-app"/></menu-item>
+        <menu-item name="DataResource" title="${uiLabelMap.ContentDataResource}"><link target="findDataResource" url-mode="inter-app"/></menu-item>
+        <menu-item name="ContentSetupMenu" title="${uiLabelMap.ContentContentSetup}"><link target="ContentSetupMenu" url-mode="inter-app"/></menu-item>
+        <menu-item name="DataResourceSetupMenu" title="${uiLabelMap.ContentDataSetup}"><link target="DataSetupMenu" url-mode="inter-app"/></menu-item>
+        <menu-item name="Layout" title="${uiLabelMap.ContentTemplate}"><link target="LayoutMenu" url-mode="inter-app"/></menu-item>
+        <menu-item name="CMS" title="${uiLabelMap.ContentCMS}"><link target="CMSContentFind" url-mode="inter-app"/></menu-item>
+        <menu-item name="CompDoc" title="${uiLabelMap.ContentCompDoc}"><link target="FindCompDoc" url-mode="inter-app"/></menu-item>
+    </menu>
+
     <menu name="content"  menu-container-style="button-bar tab-bar" default-selected-style="selected" default-menu-item-name="content" default-permission-operation="HAS_AUTHOR_ROLE|CONTENT_ADMIN"
         default-permission-entity-action="_ADMIN" default-associated-content-id="${userLogin.userLoginId}" selected-menuitem-context-field-name="tabButtonItem"
         title="" type="simple">
diff --git a/applications/humanres/ofbiz-component.xml b/applications/humanres/ofbiz-component.xml
index 1c291c5..50b6644 100644
--- a/applications/humanres/ofbiz-component.xml
+++ b/applications/humanres/ofbiz-component.xml
@@ -38,5 +38,6 @@ under the License.
         location="webapp/humanres"
         base-permission="OFBTOOLS,HUMANRES"
         mount-point="/humanres"
+        app-shortcut-screen="component://humanres/widget/CommonScreens.xml#ShortcutApp"
         app-bar-display="true"/>
 </ofbiz-component>
diff --git a/applications/humanres/widget/CommonScreens.xml b/applications/humanres/widget/CommonScreens.xml
index 5b9eefb..df323fa 100644
--- a/applications/humanres/widget/CommonScreens.xml
+++ b/applications/humanres/widget/CommonScreens.xml
@@ -70,7 +70,21 @@ under the License.
             </widgets>
         </section>
     </screen>
-
+    <screen name="ShortcutApp">
+        <section>
+            <actions>
+                <property-map resource="HumanResUiLabels" map-name="uiLabelMap" global="true"/>
+                <property-map resource="PartyUiLabels" map-name="uiLabelMap" global="true"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="ShortcutDecorator" location="component://common/widget/CommonScreens.xml">
+                    <decorator-section name="body">
+                        <include-menu name="HumanResShortcutAppBar" location="component://humanres/widget/HumanresMenus.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
     <screen name="OrgTree">
         <section>
             <actions>
diff --git a/applications/humanres/widget/HumanresMenus.xml b/applications/humanres/widget/HumanresMenus.xml
index 063da40..f4c9e0f 100644
--- a/applications/humanres/widget/HumanresMenus.xml
+++ b/applications/humanres/widget/HumanresMenus.xml
@@ -34,6 +34,20 @@
         <menu-item name="Leave" title="${uiLabelMap.HumanResEmplLeave}"><link target="FindEmplLeaves"/></menu-item>
         <menu-item name="GlobalHRSettings" title="${uiLabelMap.HumanResGlobalHRSettings}" selected-style="selected"><link target="globalHRSettings"/></menu-item>
     </menu>
+    <menu name="HumanResShortcutAppBar" title="${uiLabelMap.HumanResManager}">
+        <menu-item name="Employees" title="${uiLabelMap.HumanResEmployees}"><link target="/humanres/control/findEmployees" url-mode="inter-app"/></menu-item>
+        <menu-item name="Employment" title="${uiLabelMap.HumanResEmployment}"><link target="/humanres/control/FindEmployments" url-mode="inter-app"/></menu-item>
+        <menu-item name="EmplPosition" title="${uiLabelMap.HumanResEmployeePosition}"><link target="/humanres/control/FindEmplPositions" url-mode="inter-app"/></menu-item>
+        <menu-item name="PerfReview" title="${uiLabelMap.HumanResPerfReview}"><link target="/humanres/control/FindPerfReviews" url-mode="inter-app"/></menu-item>
+        <menu-item name="EmplSkills" title="${uiLabelMap.HumanResSkills}"><link target="/humanres/control/FindPartySkills" url-mode="inter-app"/></menu-item>
+        <menu-item name="PartyQual" title="${uiLabelMap.HumanResPartyQualification}"><link target="/humanres/control/FindPartyQuals" url-mode="inter-app"/></menu-item>
+        <menu-item name="Recruitment" title="${uiLabelMap.HumanResRecruitment}"><link target="/humanres/control/FindJobRequisitions" url-mode="inter-app"/></menu-item>        
+        <menu-item name="Training" title="${uiLabelMap.HumanResTraining}"><link target="/humanres/control/TrainingCalendar" url-mode="inter-app"/></menu-item>
+        <menu-item name="EmploymentApp" title="${uiLabelMap.HumanResEmploymentApp}"><link target="/humanres/control/FindEmploymentApps" url-mode="inter-app"/></menu-item>
+        <menu-item name="PartyResume" title="${uiLabelMap.HumanResPartyResume}"><link target="/humanres/control/FindPartyResumes" url-mode="inter-app"/></menu-item>
+        <menu-item name="Leave" title="${uiLabelMap.HumanResEmplLeave}"><link target="/humanres/control/FindEmplLeaves" url-mode="inter-app"/></menu-item>
+        <menu-item name="GlobalHRSettings" title="${uiLabelMap.HumanResGlobalHRSettings}" selected-style="selected"><link target="/humanres/control/globalHRSettings" url-mode="inter-app"/></menu-item>
+    </menu>
     <menu name="EmploymentBar" default-menu-item-name="EditPartyBenefit" default-selected-style="selected"
         type="simple" menu-container-style="button-bar tab-bar" selected-menuitem-context-field-name="tabButtonItem">
         <actions>
diff --git a/applications/manufacturing/ofbiz-component.xml b/applications/manufacturing/ofbiz-component.xml
index 5568447..1b0612e 100644
--- a/applications/manufacturing/ofbiz-component.xml
+++ b/applications/manufacturing/ofbiz-component.xml
@@ -49,6 +49,7 @@ under the License.
         server="default-server"
         location="webapp/manufacturing"
         base-permission="OFBTOOLS,MANUFACTURING"
+        app-shortcut-screen="component://manufacturing/widget/manufacturing/CommonScreens.xml#ShortcutApp"
         mount-point="/manufacturing"/>
 
 </ofbiz-component>
diff --git a/applications/manufacturing/widget/manufacturing/CommonScreens.xml b/applications/manufacturing/widget/manufacturing/CommonScreens.xml
index 6649a94..1182c56 100644
--- a/applications/manufacturing/widget/manufacturing/CommonScreens.xml
+++ b/applications/manufacturing/widget/manufacturing/CommonScreens.xml
@@ -72,5 +72,21 @@ under the License.
             </widgets>
         </section>
     </screen>
+    <screen name="ShortcutApp">
+        <section>
+            <actions>
+                <property-map resource="ManufacturingUiLabels" map-name="uiLabelMap" global="true"/>
+                <property-map resource="ProductUiLabels" map-name="uiLabelMap" global="true"/>
+                <property-map resource="PartyUiLabels" map-name="uiLabelMap" global="true"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="ShortcutDecorator" location="component://common/widget/CommonScreens.xml">
+                    <decorator-section name="body">
+                        <include-menu name="ManufacturingShortcutAppBar" location="component://manufacturing/widget/manufacturing/ManufacturingMenus.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
 </screens>
 
diff --git a/applications/manufacturing/widget/manufacturing/ManufacturingMenus.xml b/applications/manufacturing/widget/manufacturing/ManufacturingMenus.xml
index b44acbe..c1c01f0 100644
--- a/applications/manufacturing/widget/manufacturing/ManufacturingMenus.xml
+++ b/applications/manufacturing/widget/manufacturing/ManufacturingMenus.xml
@@ -78,6 +78,62 @@ under the License.
         </menu-item>
     </menu>
 
+    <menu name="ManufacturingShortcutAppBar" title="${uiLabelMap.ManufacturingManager}">
+        <menu-item name="jobshop" title="${uiLabelMap.ManufacturingJobShop}">
+            <condition>
+                <if-has-permission permission="MANUFACTURING" action="_CREATE"/>
+            </condition>
+            <link target="/manufacturing/control/FindProductionRun" url-mode="inter-app"/>
+        </menu-item>
+        <menu-item name="routing" title="${uiLabelMap.ManufacturingRouting}">
+            <condition>
+                <if-has-permission permission="MANUFACTURING" action="_CREATE"/>
+            </condition>
+            <link target="/manufacturing/control/FindRouting" url-mode="inter-app"/>
+        </menu-item>
+        <menu-item name="routingTask" title="${uiLabelMap.ManufacturingRoutingTask}">
+            <condition>
+                <if-has-permission permission="MANUFACTURING" action="_CREATE"/>
+            </condition>
+            <link target="/manufacturing/control/FindRoutingTask" url-mode="inter-app"/>
+        </menu-item>
+        <menu-item name="calendar" title="${uiLabelMap.ManufacturingCalendar}">
+            <condition>
+                <if-has-permission permission="MANUFACTURING" action="_CREATE"/>
+            </condition>
+            <link target="/manufacturing/control/FindCalendar" url-mode="inter-app"/>
+        </menu-item>
+        <menu-item name="costs" title="${uiLabelMap.ManufacturingCostCalcs}">
+            <condition>
+                <if-has-permission permission="MANUFACTURING" action="_CREATE"/>
+            </condition>
+            <link target="/manufacturing/control/EditCostCalcs" url-mode="inter-app"/>
+        </menu-item>
+        <menu-item name="bom" title="${uiLabelMap.ManufacturingBillOfMaterials}">
+            <condition>
+                <if-has-permission permission="MANUFACTURING" action="_CREATE"/>
+            </condition>
+            <link target="/manufacturing/control/FindBom" url-mode="inter-app"/>
+        </menu-item>
+        <menu-item name="mrp" title="${uiLabelMap.ManufacturingMrp}">
+            <condition>
+                <if-has-permission permission="MANUFACTURING" action="_CREATE"/>
+            </condition>
+            <link target="/manufacturing/control/FindInventoryEventPlan" url-mode="inter-app"/>
+        </menu-item>
+        <menu-item name="ShipmentPlans" title="${uiLabelMap.ManufacturingShipmentPlans}">
+            <condition>
+                <if-has-permission permission="MANUFACTURING" action="_CREATE"/>
+            </condition>
+            <link target="/manufacturing/control/WorkWithShipmentPlans" url-mode="inter-app"/>
+        </menu-item>
+        <menu-item name="ManufacturingReports" title="${uiLabelMap.ManufacturingReports}">
+            <condition>
+                <if-has-permission permission="MANUFACTURING" action="_CREATE"/>
+            </condition>
+            <link target="/manufacturing/control/ManufacturingReports" url-mode="inter-app"/>
+        </menu-item>
+    </menu>
 
     <menu name="BomTabBar" extends="CommonTabBarMenu" extends-resource="component://common/widget/CommonMenus.xml">
         <menu-item name="findBom" title="${uiLabelMap.CommonFind}">
diff --git a/applications/marketing/ofbiz-component.xml b/applications/marketing/ofbiz-component.xml
index 9151748..f8c6106 100644
--- a/applications/marketing/ofbiz-component.xml
+++ b/applications/marketing/ofbiz-component.xml
@@ -40,12 +40,14 @@ under the License.
         server="default-server"
         location="webapp/marketing"
         base-permission="OFBTOOLS,MARKETING"
+        app-shortcut-screen="component://marketing/widget/CommonScreens.xml#ShortcutApp"
         mount-point="/marketing"/>
     <webapp name="SalesForceAutomation"
         title="SFA"
         server="default-server"
         location="webapp/sfa"
         base-permission="OFBTOOLS,SFA"
+        app-shortcut-screen="component://marketing/widget/sfa/CommonScreens.xml#ShortcutApp"
         mount-point="/sfa"/>
 </ofbiz-component>
 
diff --git a/applications/marketing/widget/CommonScreens.xml b/applications/marketing/widget/CommonScreens.xml
index 4574241..43939b2 100644
--- a/applications/marketing/widget/CommonScreens.xml
+++ b/applications/marketing/widget/CommonScreens.xml
@@ -120,4 +120,19 @@ under the License.
             </widgets>
         </section>
     </screen>
+    <screen name="ShortcutApp">
+        <section>
+            <actions>
+                <property-map resource="MarketingUiLabels" map-name="uiLabelMap" global="true"/>
+                <property-map resource="PartyUiLabels" map-name="uiLabelMap" global="true"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="ShortcutDecorator" location="component://common/widget/CommonScreens.xml">
+                    <decorator-section name="body">
+                        <include-menu name="MarketingShortcutAppBar" location="component://marketing/widget/MarketingMenus.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
 </screens>
diff --git a/applications/marketing/widget/MarketingMenus.xml b/applications/marketing/widget/MarketingMenus.xml
index 11b892e..0bdf478 100644
--- a/applications/marketing/widget/MarketingMenus.xml
+++ b/applications/marketing/widget/MarketingMenus.xml
@@ -26,4 +26,12 @@ under the License.
         <menu-item name="ContactList" title="${uiLabelMap.MarketingContactList}"><link target="FindContactLists"/></menu-item>
         <menu-item name="Reports" title="${uiLabelMap.MarketingReports}"><link target="MarketingReport"/></menu-item>
     </menu>
+    <menu name="MarketingShortcutAppBar" title="${uiLabelMap.MarketingManager}">
+        <menu-item name="DataSource" title="${uiLabelMap.DataSource}"><link target="/marketing/control/FindDataSource" url-mode="inter-app"/></menu-item>
+        <menu-item name="Campaign" title="${uiLabelMap.MarketingCampaign}"><link target="/marketing/control/FindMarketingCampaign" url-mode="inter-app"/></menu-item>
+        <menu-item name="Tracking" title="${uiLabelMap.MarketingTracking}"><link target="/marketing/control/FindTrackingCode" url-mode="inter-app"/></menu-item>
+        <menu-item name="Segment" title="${uiLabelMap.MarketingSegment}"><link target="/marketing/control/FindSegmentGroup" url-mode="inter-app"/></menu-item>
+        <menu-item name="ContactList" title="${uiLabelMap.MarketingContactList}"><link target="/marketing/control/FindContactLists" url-mode="inter-app"/></menu-item>
+        <menu-item name="Reports" title="${uiLabelMap.MarketingReports}"><link target="/marketing/control/MarketingReport" url-mode="inter-app"/></menu-item>
+    </menu>
 </menus>
diff --git a/applications/marketing/widget/sfa/CommonScreens.xml b/applications/marketing/widget/sfa/CommonScreens.xml
index 2c9d3e3..9f8ec35 100644
--- a/applications/marketing/widget/sfa/CommonScreens.xml
+++ b/applications/marketing/widget/sfa/CommonScreens.xml
@@ -72,6 +72,21 @@ under the License.
         </section>
     </screen>
 
+    <screen name="ShortcutApp">
+        <section>
+            <actions>
+                <property-map resource="MarketingUiLabels" map-name="uiLabelMap" global="true"/>
+                <property-map resource="PartyUiLabels" map-name="uiLabelMap" global="true"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="ShortcutDecorator" location="component://common/widget/CommonScreens.xml">
+                    <decorator-section name="body">
+                        <include-menu name="SfaShortcutAppBar" location="component://marketing/widget/sfa/SfaMenus.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
     <screen name="leftbar">
         <section>
             <condition><not><if-empty field="userLogin"/></not></condition>
diff --git a/applications/marketing/widget/sfa/SfaMenus.xml b/applications/marketing/widget/sfa/SfaMenus.xml
index c412d8c..a026f37 100644
--- a/applications/marketing/widget/sfa/SfaMenus.xml
+++ b/applications/marketing/widget/sfa/SfaMenus.xml
@@ -32,6 +32,20 @@ under the License.
         </menu-item>
     </menu>
 
+    <menu name="SfaShortcutAppBar" title="${uiLabelMap.SfaManager}">
+        <menu-item name="Accounts" title="${uiLabelMap.SfaAcccounts}"><link target="/sfa/control/FindAccounts" url-mode="inter-app"/></menu-item>
+        <menu-item name="Contacts" title="${uiLabelMap.SfaContacts}"><link target="/sfa/control/FindContacts" url-mode="inter-app"/></menu-item>
+        <menu-item name="Leads" title="${uiLabelMap.SfaLeads}"><link target="/sfa/control/FindLeads" url-mode="inter-app"/></menu-item>
+        <menu-item name="Events" title="${uiLabelMap.SfaEvents}"><link target="/sfa/control/Events" url-mode="inter-app"/></menu-item>
+        <menu-item name="Forecast" title="${uiLabelMap.SfaForecasts}"><link target="/sfa/control/FindSalesForecast" url-mode="inter-app"/></menu-item>
+        <menu-item name="Opportunities" title="${uiLabelMap.SfaOpportunities}"><link target="/sfa/control/FindSalesOpportunity" url-mode="inter-app"/></menu-item>
+        <menu-item name="Preferences" title="${uiLabelMap.CommonPreferences}" align-style="opposed">
+            <link target="/sfa/control/ManagePortalPages" link-type="anchor" url-mode="inter-app">
+                <parameter param-name="parentPortalPageId" from-field="parameters.parentPortalPageId"/>
+            </link>
+        </menu-item>
+    </menu>
+
     <menu name="OpportunityTabBar" extends="CommonTabBarMenu" extends-resource="component://common/widget/CommonMenus.xml">
         <menu-item name="ViewSalesOpportunity" title="${uiLabelMap.SfaOpportunitySummary}">
             <link target="ViewSalesOpportunity">
diff --git a/applications/order/ofbiz-component.xml b/applications/order/ofbiz-component.xml
index 1cad626..34db95f 100644
--- a/applications/order/ofbiz-component.xml
+++ b/applications/order/ofbiz-component.xml
@@ -58,6 +58,7 @@ under the License.
         title="Order"
         description="OrderComponentDescription"
         server="default-server"
+        app-shortcut-screen="component://order/widget/ordermgr/CommonScreens.xml#ShortcutApp"
         location="webapp/ordermgr"
         base-permission="OFBTOOLS,ORDERMGR"
         mount-point="/ordermgr"/>
diff --git a/applications/order/widget/ordermgr/CommonScreens.xml b/applications/order/widget/ordermgr/CommonScreens.xml
index 533909b..06b968c 100644
--- a/applications/order/widget/ordermgr/CommonScreens.xml
+++ b/applications/order/widget/ordermgr/CommonScreens.xml
@@ -129,5 +129,22 @@ under the License.
             </widgets>
         </section>
     </screen>
+
+    <screen name="ShortcutApp">
+        <section>
+            <actions>
+                <property-map resource="OrderUiLabels" map-name="uiLabelMap" global="true"/>
+                <property-map resource="PartyUiLabels" map-name="uiLabelMap" global="true"/>
+                <property-map resource="ProductUiLabels" map-name="uiLabelMap" global="true"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="ShortcutDecorator" location="component://common/widget/CommonScreens.xml">
+                    <decorator-section name="body">
+                        <include-menu name="OrderShortcutAppBar" location="component://order/widget/ordermgr/OrderMenus.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
 </screens>
 
diff --git a/applications/order/widget/ordermgr/OrderMenus.xml b/applications/order/widget/ordermgr/OrderMenus.xml
index d98e9c9..c3fcc12 100644
--- a/applications/order/widget/ordermgr/OrderMenus.xml
+++ b/applications/order/widget/ordermgr/OrderMenus.xml
@@ -93,6 +93,81 @@ under the License.
         </menu-item>
     </menu>
 
+    <menu name="OrderShortcutAppBar" title="${uiLabelMap.OrderManager}">
+        <menu-item name="request" title="${uiLabelMap.OrderRequests}">
+            <condition>
+                <or>
+                    <if-has-permission permission="ORDERMGR" action="_VIEW"/>
+                    <if-has-permission permission="ORDERMGR" action="_PURCHASE_VIEW"/>
+                </or>
+            </condition>
+            <link target="/ordermgr/control/FindRequest" url-mode="inter-app"/>
+        </menu-item>
+
+        <menu-item name="quote" title="${uiLabelMap.OrderOrderQuotes}">
+            <condition>
+                <or>
+                    <if-has-permission permission="ORDERMGR" action="_VIEW"/>
+                    <if-has-permission permission="ORDERMGR" action="_PURCHASE_VIEW"/>
+                </or>
+            </condition>
+            <link target="/ordermgr/control/FindQuote" url-mode="inter-app"/>
+        </menu-item>
+
+        <menu-item name="orderlist" title="${uiLabelMap.OrderOrderList}">
+            <condition>
+                <if-has-permission permission="ORDERMGR" action="_VIEW"/>
+            </condition>
+            <link target="/ordermgr/control/orderlist" url-mode="inter-app"/>
+        </menu-item>
+
+        <menu-item name="findorders" title="${uiLabelMap.OrderFindOrder}">
+            <condition>
+                <if-has-permission permission="ORDERMGR" action="_VIEW"/>
+            </condition>
+            <link target="/ordermgr/control/findorders" url-mode="inter-app"/>
+        </menu-item>
+
+        <menu-item name="orderentry" title="${uiLabelMap.OrderOrderEntry}">
+            <condition>
+                <or>
+                    <if-has-permission permission="ORDERMGR" action="_CREATE"/>
+                    <if-has-permission permission="ORDERMGR" action="_PURCHASE_CREATE"/>
+                </or>
+            </condition>
+            <link target="/ordermgr/control/orderentry" link-type="anchor" url-mode="inter-app"/>
+        </menu-item>
+
+        <menu-item name="return" title="${uiLabelMap.OrderOrderReturns}">
+            <condition>
+                <if-has-permission permission="ORDERMGR" action="_RETURN"/>
+            </condition>
+            <link target="/ordermgr/control/findreturn" url-mode="inter-app"/>
+        </menu-item>
+
+        <menu-item name="requirement" title="${uiLabelMap.OrderRequirements}">
+            <condition>
+                <or>
+                    <if-has-permission permission="ORDERMGR" action="_VIEW"/>
+                    <if-has-permission permission="ORDERMGR_ROLE" action="_VIEW"/>
+                </or>
+            </condition>
+            <link target="/ordermgr/control/FindRequirements" url-mode="inter-app"/>
+        </menu-item>
+
+        <menu-item name="reports" title="${uiLabelMap.CommonReports}">
+            <link target="/ordermgr/control/OrderPurchaseReportOptions" url-mode="inter-app"/>
+        </menu-item>
+
+        <menu-item name="stats" title="${uiLabelMap.CommonStats}">
+            <link target="/ordermgr/control/orderstats" url-mode="inter-app"/>
+        </menu-item>
+
+        <menu-item name="allocationPlan" title="${uiLabelMap.OrderAllocationPlan}">
+            <link target="/ordermgr/control/FindAllocationPlan" url-mode="inter-app"/>
+        </menu-item>
+    </menu>
+
     <menu name="RequirementsTabBar" extends="CommonTabBarMenu" extends-resource="component://common/widget/CommonMenus.xml">
         <menu-item name="FindRequirements" title="${uiLabelMap.OrderRequirements}">
             <link target="FindRequirements"/>
diff --git a/applications/party/ofbiz-component.xml b/applications/party/ofbiz-component.xml
index 056ea2b..456682b 100644
--- a/applications/party/ofbiz-component.xml
+++ b/applications/party/ofbiz-component.xml
@@ -46,5 +46,6 @@ under the License.
         server="default-server"
         location="webapp/partymgr"
         base-permission="OFBTOOLS,PARTYMGR"
+        app-shortcut-screen="component://party/widget/partymgr/CommonScreens.xml#ShortcutApp"
         mount-point="/partymgr"/>
 </ofbiz-component>
diff --git a/applications/party/widget/partymgr/CommonScreens.xml b/applications/party/widget/partymgr/CommonScreens.xml
index 6f728e7..5e4ded9 100644
--- a/applications/party/widget/partymgr/CommonScreens.xml
+++ b/applications/party/widget/partymgr/CommonScreens.xml
@@ -146,4 +146,19 @@ under the License.
             </widgets>
         </section>
     </screen>
+
+    <screen name="ShortcutApp">
+        <section>
+            <actions>
+                <property-map resource="PartyUiLabels" map-name="uiLabelMap" global="true"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="ShortcutDecorator" location="component://common/widget/CommonScreens.xml">
+                    <decorator-section name="body">
+                        <include-menu name="PartyShortcutAppBar" location="component://party/widget/partymgr/PartyMenus.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
 </screens>
diff --git a/applications/party/widget/partymgr/PartyMenus.xml b/applications/party/widget/partymgr/PartyMenus.xml
index 8d97479..0fceb29 100644
--- a/applications/party/widget/partymgr/PartyMenus.xml
+++ b/applications/party/widget/partymgr/PartyMenus.xml
@@ -38,6 +38,24 @@
         <menu-item name="importexport" title="${uiLabelMap.CommonImportExport}"><link target="ImportExport"/></menu-item>
     </menu>
 
+    <menu name="PartyShortcutAppBar" title="${uiLabelMap.PartyManager}">
+        <menu-item name="find" title="${uiLabelMap.PartyParties}"><link target="/partymgr/control/findparty" url-mode="inter-app"/></menu-item>
+        <menu-item name="mycomm" title="${uiLabelMap.PartyMyCommunications}"><link target="/partymgr/control/MyCommunicationEvents" url-mode="inter-app"/></menu-item>
+        <menu-item name="comm" title="${uiLabelMap.PartyCommunications}"><link target="/partymgr/control/FindCommunicationEvents" url-mode="inter-app"/></menu-item>
+        <menu-item name="visits" title="${uiLabelMap.PartyVisits}"><link target="/partymgr/control/findVisits" url-mode="inter-app"/></menu-item>
+        <menu-item name="loggedinusers" title="${uiLabelMap.PartyLoggedInUsers}"><link target="/partymgr/control/listLoggedInUsers" url-mode="inter-app"/></menu-item>
+        <menu-item name="classification" title="${uiLabelMap.PartyClassifications}"><link target="/partymgr/control/showclassgroups" url-mode="inter-app"/></menu-item>
+        <menu-item name="security" title="${uiLabelMap.CommonSecurity}">
+            <condition>
+                <if-service-permission service-name="partyBasePermissionCheck" main-action="VIEW"/>
+            </condition>
+            <link target="/partymgr/control/FindSecurityGroup" url-mode="inter-app"/>
+        </menu-item>
+        <menu-item name="addrmap" title="${uiLabelMap.PageTitleAddressMatchMap}"><link target="/partymgr/control/addressMatchMap" url-mode="inter-app"/></menu-item>
+        <menu-item name="partyinv" title="${uiLabelMap.PartyInvitation}"><link target="/partymgr/control/partyInvitation" url-mode="inter-app"/></menu-item>
+        <menu-item name="importexport" title="${uiLabelMap.CommonImportExport}"><link target="/partymgr/control/ImportExport" url-mode="inter-app"/></menu-item>
+    </menu>
+
     <menu name="ProfileTabBar" extends="CommonTabBarMenu" extends-resource="component://common/widget/CommonMenus.xml"
         default-menu-item-name="viewprofile">
         <menu-item name="viewprofile" title="${uiLabelMap.PartyProfile}">
diff --git a/applications/product/ofbiz-component.xml b/applications/product/ofbiz-component.xml
index 0ed83be..0673043 100644
--- a/applications/product/ofbiz-component.xml
+++ b/applications/product/ofbiz-component.xml
@@ -75,18 +75,20 @@ under the License.
     <test-suite loader="main" location="testdef/ProductPromoTests.xml"/>
     <test-suite loader="main" location="testdef/ProductConfigTests.xml"/>
 
-    <webapp name="catalog"
-        title="Catalog"
-        description="CatalogComponentDescription"
-        server="default-server"
-        location="webapp/catalog"
-        base-permission="OFBTOOLS,CATALOG"
-        mount-point="/catalog"/>
+        <webapp name="catalog"
+            title="Catalog"
+            description="CatalogComponentDescription"
+            server="default-server"
+            location="webapp/catalog"
+            base-permission="OFBTOOLS,CATALOG"
+            app-shortcut-screen="component://product/widget/catalog/CatalogScreens.xml#ShortcutApp"
+            mount-point="/catalog"/>
     <webapp name="facility"
         title="Facility"
         description="FacilityComponentDescription"
         server="default-server"
         location="webapp/facility"
         base-permission="OFBTOOLS,FACILITY"
+        app-shortcut-screen="component://product/widget/facility/FacilityScreens.xml#ShortcutApp"
         mount-point="/facility"/>
 </ofbiz-component>
diff --git a/applications/product/widget/catalog/CatalogMenus.xml b/applications/product/widget/catalog/CatalogMenus.xml
index fadce93..40fe887 100644
--- a/applications/product/widget/catalog/CatalogMenus.xml
+++ b/applications/product/widget/catalog/CatalogMenus.xml
@@ -35,6 +35,23 @@ under the License.
         <menu-item name="Imagemanagement" title="${uiLabelMap.ImageManagement}"><link target="Imagemanagement"/></menu-item>
     </menu>
 
+    <menu name="CatalogShortcutAppBar" title="${uiLabelMap.ProductCatalogManager}">
+        <menu-item name="catalogs" title="${uiLabelMap.ProductCatalogs}"><link target="/catalog/control/FindCatalog" url-mode="inter-app"/></menu-item>
+        <menu-item name="categories" title="${uiLabelMap.ProductCategories}"><link target="/catalog/control/FindCategory" url-mode="inter-app"/></menu-item>
+        <menu-item name="products" title="${uiLabelMap.ProductProducts}"><link target="/catalog/control/FindProduct" url-mode="inter-app"/></menu-item>
+        <menu-item name="featurecats" title="${uiLabelMap.ProductFeatureCats}"><link target="/catalog/control/EditFeatureCategories" url-mode="inter-app"/></menu-item>
+        <menu-item name="promos" title="${uiLabelMap.ProductPromos}"><link target="/catalog/control/FindProductPromo" url-mode="inter-app"/></menu-item>
+        <menu-item name="pricerules" title="${uiLabelMap.ProductPriceRules}"><link target="/catalog/control/FindProductPriceRules" url-mode="inter-app"/></menu-item>
+        <menu-item name="store" title="${uiLabelMap.ProductStores}"><link target="/catalog/control/FindProductStore" url-mode="inter-app"/></menu-item>
+        <menu-item name="storeGroup" title="${uiLabelMap.ProductProductStoreGroups}"><link target="/catalog/control/ListParentProductStoreGroup" url-mode="inter-app"/></menu-item>
+        <menu-item name="thesaurus" title="${uiLabelMap.ProductThesaurus}"><link target="/catalog/control/editKeywordThesaurus" url-mode="inter-app"/></menu-item>
+        <menu-item name="reviews" title="${uiLabelMap.ProductReviews}"><link target="/catalog/control/FindReviews" url-mode="inter-app"/></menu-item>
+        <menu-item name="configs" title="${uiLabelMap.ProductConfigItems}"><link target="/catalog/control/FindProductConfigItems" url-mode="inter-app"/></menu-item>
+        <menu-item name="Subscription" title="${uiLabelMap.ProductSubscriptions}"><link target="/catalog/control/FindSubscription" url-mode="inter-app"/></menu-item>
+        <menu-item name="shipping" title="${uiLabelMap.ProductShipping}"><link target="/catalog/control/ListShipmentMethodTypes" url-mode="inter-app"/></menu-item>
+        <menu-item name="Imagemanagement" title="${uiLabelMap.ImageManagement}"><link target="/catalog/control/Imagemanagement" url-mode="inter-app"/></menu-item>
+    </menu>
+
     <menu name="CatalogTabBar" extends="CommonTabBarMenu" extends-resource="component://common/widget/CommonMenus.xml">
         <menu-item name="ProductCatalog" title="${uiLabelMap.ProductCatalog}">
             <link target="EditProdCatalog">
diff --git a/applications/product/widget/catalog/CatalogScreens.xml b/applications/product/widget/catalog/CatalogScreens.xml
index acc0ee5..a2c2b8c 100644
--- a/applications/product/widget/catalog/CatalogScreens.xml
+++ b/applications/product/widget/catalog/CatalogScreens.xml
@@ -170,4 +170,19 @@ under the License.
             </widgets>
         </section>
     </screen>
+
+    <screen name="ShortcutApp">
+        <section>
+            <actions>
+                <property-map resource="ProductUiLabels" map-name="uiLabelMap" global="true"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="ShortcutDecorator" location="component://common/widget/CommonScreens.xml">
+                    <decorator-section name="body">
+                        <include-menu name="CatalogShortcutAppBar" location="component://product/widget/catalog/CatalogMenus.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
 </screens>
\ No newline at end of file
diff --git a/applications/product/widget/facility/FacilityMenus.xml b/applications/product/widget/facility/FacilityMenus.xml
index 51ad326..2661f12 100644
--- a/applications/product/widget/facility/FacilityMenus.xml
+++ b/applications/product/widget/facility/FacilityMenus.xml
@@ -42,6 +42,27 @@ under the License.
         </menu-item>
     </menu>
 
+    <menu name="FacilityShortcutAppBar" title="${uiLabelMap.ProductFacilityManager}">
+        <menu-item name="facility" title="${uiLabelMap.ProductFacilities}"><link target="/facility/control/FindFacility" url-mode="inter-app"/></menu-item>
+        <menu-item name="facilityGroup" title="${uiLabelMap.ProductFacilityGroups}"><link target="/facility/control/FindFacilityGroup" url-mode="inter-app"/></menu-item>
+        <menu-item name="inventoryItemLabel" title="${uiLabelMap.ProductInventoryItemLabels}"><link target="/facility/control/FindInventoryItemLabels" url-mode="inter-app"/></menu-item>
+        <menu-item name="ShipmentGatewayConfig" title="${uiLabelMap.FacilityShipmentGatewayConfig}">
+            <condition>
+                <if-has-permission permission="FACILITY" action="_ADMIN"/>
+            </condition>
+            <link target="/facility/control/FindShipmentGatewayConfig" url-mode="inter-app"/>
+        </menu-item>
+        <menu-item name="shipment" title="${uiLabelMap.ProductShipments}"><link target="/facility/control/FindShipment" url-mode="inter-app"/></menu-item>
+        <menu-item name="reports" title="${uiLabelMap.CommonReports}">
+            <condition>
+                <not><if-empty field="facilityId"/></not>
+            </condition>
+            <link target="/facility/control/InventoryReports" url-mode="inter-app">
+                <parameter param-name="facilityId"/>
+            </link>
+        </menu-item>
+    </menu>
+
     <menu name="FacilityActionBar" menu-container-style="button-bar button-style-2" default-selected-style="selected">
         <menu-item name="createNewFacility" title="${uiLabelMap.ProductNewFacility}">
             <condition>
diff --git a/applications/product/widget/facility/FacilityScreens.xml b/applications/product/widget/facility/FacilityScreens.xml
index 85f154e..50dc144 100644
--- a/applications/product/widget/facility/FacilityScreens.xml
+++ b/applications/product/widget/facility/FacilityScreens.xml
@@ -1572,4 +1572,16 @@ under the License.
             </widgets>
         </section>
     </screen>
+
+    <screen name="ShortcutApp">
+        <section>
+            <widgets>
+                <decorator-screen name="ShortcutDecorator" location="component://common/widget/CommonScreens.xml">
+                    <decorator-section name="body">
+                        <include-menu name="FacilityShortcutAppBar" location="component://product/widget/facility/FacilityMenus.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
 </screens>
diff --git a/applications/workeffort/ofbiz-component.xml b/applications/workeffort/ofbiz-component.xml
index b5a0e00..8ec2292 100644
--- a/applications/workeffort/ofbiz-component.xml
+++ b/applications/workeffort/ofbiz-component.xml
@@ -43,6 +43,7 @@ under the License.
         server="default-server"
         location="webapp/workeffort"
         base-permission="OFBTOOLS,WORKEFFORTMGR"
+        app-shortcut-screen="component://workeffort/widget/CommonScreens.xml#ShortcutApp"
         mount-point="/workeffort"/>
 
      <webapp name="ical"
diff --git a/applications/workeffort/widget/CommonScreens.xml b/applications/workeffort/widget/CommonScreens.xml
index a7bc76c..2b28817 100644
--- a/applications/workeffort/widget/CommonScreens.xml
+++ b/applications/workeffort/widget/CommonScreens.xml
@@ -201,4 +201,20 @@ under the License.
             </widgets>
         </section>
     </screen>
+
+    <screen name="ShortcutApp">
+        <section>
+            <actions>
+                <property-map resource="WorkEffortUiLabels" map-name="uiLabelMap" global="true"/>
+                <property-map resource="PartyUiLabels" map-name="uiLabelMap" global="true"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="ShortcutDecorator" location="component://common/widget/CommonScreens.xml">
+                    <decorator-section name="body">
+                        <include-menu name="WorkEffortShortcutAppBar" location="component://workeffort/widget/WorkEffortMenus.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
 </screens>
diff --git a/applications/workeffort/widget/WorkEffortMenus.xml b/applications/workeffort/widget/WorkEffortMenus.xml
index 1b6bbe0..ac3b323 100644
--- a/applications/workeffort/widget/WorkEffortMenus.xml
+++ b/applications/workeffort/widget/WorkEffortMenus.xml
@@ -31,6 +31,18 @@ under the License.
         <menu-item name="userJobs" title="${uiLabelMap.WorkEffortJobList}"><link target="UserJobs"/></menu-item>
         <menu-item name="WorkEffortICalendar" title="${uiLabelMap.WorkEffortICalendar}"><link target="FindICalendars"/></menu-item>
     </menu>
+
+    <menu name="WorkEffortShortcutAppBar" title="${uiLabelMap.WorkEffortManager}" default-menu-item-name="task" >
+        <menu-item name="task" title="${uiLabelMap.WorkEffortTaskList}"><link target="/workeffort/control/mytasks" url-mode="inter-app"/></menu-item>
+        <menu-item name="calendar" title="${uiLabelMap.WorkEffortCalendar}"><link target="/workeffort/control/calendar" url-mode="inter-app"/></menu-item>
+        <menu-item name="mytime" title="${uiLabelMap.WorkEffortTimesheetMyTime}"><link target="/workeffort/control/MyTimesheets" url-mode="inter-app"/></menu-item>
+        <menu-item name="request" title="${uiLabelMap.WorkEffortRequestList}"><link target="/workeffort/control/requestlist" url-mode="inter-app"/></menu-item>
+        <menu-item name="workeffort" title="${uiLabelMap.WorkEffortWorkEffort}"><link target="/workeffort/control/FindWorkEffort" url-mode="inter-app"/></menu-item>
+        <menu-item name="timesheet" title="${uiLabelMap.WorkEffortTimesheet}"><link target="/workeffort/control/FindTimesheet" url-mode="inter-app"/></menu-item>
+        <menu-item name="userJobs" title="${uiLabelMap.WorkEffortJobList}"><link target="/workeffort/control/UserJobs" url-mode="inter-app"/></menu-item>
+        <menu-item name="WorkEffortICalendar" title="${uiLabelMap.WorkEffortICalendar}"><link target="/workeffort/control/FindICalendars" url-mode="inter-app"/></menu-item>
+    </menu>
+
     <menu name="WorkEffortTabBar" extends="CommonTabBarMenu" extends-resource="component://common/widget/CommonMenus.xml"
           default-menu-item-name="WorkEffort">
         <menu-item name="WorkEffortRelatedSummary" title="${uiLabelMap.WorkEffortSummary}">
diff --git a/framework/base/dtd/ofbiz-component.xsd b/framework/base/dtd/ofbiz-component.xsd
index ff409ef..b6f7279 100644
--- a/framework/base/dtd/ofbiz-component.xsd
+++ b/framework/base/dtd/ofbiz-component.xsd
@@ -205,6 +205,14 @@ under the License.
                 </xs:documentation>
             </xs:annotation>
         </xs:attribute>
+        <xs:attribute name="app-shortcut-screen" use="optional">
+            <xs:annotation>
+                <xs:documentation>
+                    This value determines the location of a screen to use as application main menu shortcut.
+                    This can be used to display sub-menu on application main menu hover.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
         <xs:attribute type="xs:string" name="position"/>
         <xs:attribute type="xs:string" name="server" use="required"/>
         <xs:attribute type="xs:string" name="location" use="required"/>
diff --git a/framework/base/src/main/java/org/apache/ofbiz/base/component/ComponentConfig.java b/framework/base/src/main/java/org/apache/ofbiz/base/component/ComponentConfig.java
index 77f492f..a8cd26b 100644
--- a/framework/base/src/main/java/org/apache/ofbiz/base/component/ComponentConfig.java
+++ b/framework/base/src/main/java/org/apache/ofbiz/base/component/ComponentConfig.java
@@ -901,6 +901,7 @@ public final class ComponentConfig {
         private final String title;
         private final String description;
         private final String menuName;
+        private final String appShortcutScreen;
         private final String server;
         private final String mountPoint;
         private final String contextRoot;
@@ -951,6 +952,7 @@ public final class ComponentConfig {
             this.title = b.title;
             this.description = b.description;
             this.menuName = b.menuName;
+            this.appShortcutScreen = b.appShortcutScreen;
             this.server = b.server;
             this.mountPoint = b.mountPoint;
             this.contextRoot = b.contextRoot;
@@ -974,6 +976,7 @@ public final class ComponentConfig {
             private String title;
             private String description;
             private String menuName;
+            private String appShortcutScreen;
             private String server;
             private String mountPoint = "";
             private String contextRoot;
@@ -1057,6 +1060,16 @@ public final class ComponentConfig {
 
             /**
              * Server builder.
+             * @param appShortcutScreen the shortscreen to use
+             * @return the builder
+             */
+            public Builder appShortcutScreen(String appShortcutScreen) {
+                this.appShortcutScreen = appShortcutScreen;
+                return this;
+            }
+
+            /**
+             * Server builder.
              * @param server the server
              * @return the builder
              */
@@ -1223,6 +1236,7 @@ public final class ComponentConfig {
             } else {
                 this.menuName = "main";
             }
+            this.appShortcutScreen = element.getAttribute("app-shortcut-screen");
             this.position = element.getAttribute("position");
             // load the virtual hosts
             List<? extends Element> virtHostList = UtilXml.childElementList(element, "virtual-host");
@@ -1280,6 +1294,10 @@ public final class ComponentConfig {
             return name;
         }
 
+        public String getAppShortcutScreen() {
+            return appShortcutScreen;
+        }
+
         public String getMountPoint() {
             return mountPoint;
         }
diff --git a/framework/common/widget/CommonScreens.xml b/framework/common/widget/CommonScreens.xml
index d794276..092be69 100644
--- a/framework/common/widget/CommonScreens.xml
+++ b/framework/common/widget/CommonScreens.xml
@@ -170,6 +170,16 @@ under the License.
         </section>
     </screen>
 
+    <!-- Global decorator for Shortcut pop-up windows or layered CSS on webapp overview-->
+    <screen name="ShortcutDecorator">
+        <section>
+            <widgets>
+                <include-screen name="GlobalActions" />
+                <include-screen name="ShortcutDecorator" location="${groovy:commonScreenLocations.ShortcutDecorator?commonScreenLocations.ShortcutDecorator:commonDecoratorLocation}"/>
+            </widgets>
+        </section>
+    </screen>
+
     <!-- Simple decorator (no application and menu bars); it can be used:
          * for printer friendly html screens (no logo and no application bar, header and footer); a print button is also available at the top of the screen
          * for simple PDF report (a simple header with the logo/date is rendered and a footer with page numbers)
diff --git a/themes/bluelight/template/AppBarOpen.ftl b/themes/bluelight/template/AppBarOpen.ftl
index fdd2a7b..99e82bf 100644
--- a/themes/bluelight/template/AppBarOpen.ftl
+++ b/themes/bluelight/template/AppBarOpen.ftl
@@ -47,13 +47,21 @@ under the License.
               </#if>
               <#assign thisApp = StringUtil.wrapString(thisApp)>
               <#assign thisURL = thisApp>
+              <#assign thisAppShortcutScreen = display.getAppShortcutScreen()!>
               <#if thisApp != "/">
                 <#assign thisURL = thisURL + "/control/main">
               </#if>
               <#if layoutSettings.suppressTab?? && display.name == layoutSettings.suppressTab>
                 <!-- do not display this component-->
               <#else>
-                  <li <#if selected>class="selected"</#if>><a href="${thisURL + externalKeyParam}" <#if uiLabelMap??> title="${uiLabelMap[display.description]}">${uiLabelMap[display.title]}<#else> title="${display.description}">${display.title}</#if></a></li>
+                  <li <#if selected>class="selected"</#if>>
+                      <a href="${thisURL + externalKeyParam}" <#if uiLabelMap??> title="${uiLabelMap[display.description]}">${uiLabelMap[display.title]}<#else> title="${display.description}">${display.title}</#if></a>
+                      <#if thisAppShortcutScreen?has_content>
+                          <ul class="shortcut">
+                              ${screens.render(thisAppShortcutScreen)!}
+                          </ul>
+                      </#if>
+                  </li>
               </#if>
             </#list>
            </ul></li>
diff --git a/themes/bluelight/webapp/bluelight/style.css b/themes/bluelight/webapp/bluelight/style.css
index 39e4af5..26e7350 100644
--- a/themes/bluelight/webapp/bluelight/style.css
+++ b/themes/bluelight/webapp/bluelight/style.css
@@ -1199,6 +1199,23 @@ ul#preferences-menu li a.help-link {
     left: 204px;
 }
 
+#main-navigation ul li ul li ul.shortcut,
+#main-navigation ul li ul li ul.shortcut h2 {
+    display: none;
+}
+
+#main-navigation ul li ul li ul.shortcut div {
+    margin-left: -2px;
+}
+
+#main-navigation ul li ul li ul.shortcut:hover,
+#main-navigation ul li ul li a:hover + .shortcut {
+    margin-top: -20px;
+    margin-left: -2px;
+    display: block;
+    left: 104px;
+}
+
 /* ================================================= */
 /* ===== Screenlet Title Bar/Navigation Styles ===== */
 /* ================================================= */
diff --git a/themes/common-theme/widget/CommonScreens.xml b/themes/common-theme/widget/CommonScreens.xml
index 49d49ab..3536e9e 100644
--- a/themes/common-theme/widget/CommonScreens.xml
+++ b/themes/common-theme/widget/CommonScreens.xml
@@ -417,6 +417,26 @@ under the License.
         </section>
     </screen>
 
+    <!-- Global decorator for Shortcut pop-up windows or layered CSS on webapp overview-->
+    <screen name="ShortcutDecorator">
+        <section>
+            <actions>
+                <property-map resource="CommonUiLabels" map-name="uiLabelMap" global="true"/>
+                <service service-name="getUserPreferenceGroup" result-map="prefResult">
+                    <field-map field-name="userPrefGroupTypeId" value="GLOBAL_PREFERENCES"/>
+                </service>
+                <set field="userPreferences" from-field="prefResult.userPrefMap" global="true"/>
+
+                <property-map resource="general" map-name="generalProperties" global="true"/>
+                <set field="defaultOrganizationPartyId" from-field="userPreferences.ORGANIZATION_PARTY" global="true"/>
+
+                <set field="messagesTemplateLocation" from-field="layoutSettings.VT_MSG_TMPLT_LOC" default-value="component://common-theme/template/includes/Messages.ftl"/>
+            </actions>
+            <widgets>
+                <decorator-section-include name="body"/>
+            </widgets>
+        </section>
+    </screen>
     <!-- Simple decorator (no application and menu bars); it can be used:
          * for printer friendly html screens (no logo and no application bar, header and footer); a print button is also available at the top of the screen
          * for simple PDF report (a simple header with the logo/date is rendered and a footer with page numbers)
diff --git a/themes/common-theme/widget/Theme.xml b/themes/common-theme/widget/Theme.xml
index 9e581b1..80a4825 100644
--- a/themes/common-theme/widget/Theme.xml
+++ b/themes/common-theme/widget/Theme.xml
@@ -118,6 +118,7 @@ under the License.
             <screen name="GlobalActions"/>
             <screen name="GlobalDecorator"/>
             <screen name="LookupDecorator"/>
+            <screen name="ShortcutDecorator"/>
             <screen name="SimpleDecorator"/>
             <screen name="FoReportDecorator"/>
             <screen name="GlobalFoDecorator"/>