diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/AdminServlet.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/AdminServlet.java index fecfff9b4..e6a46a12a 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/admin/AdminServlet.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/AdminServlet.java @@ -29,6 +29,7 @@ import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.templating.Templating; import com.arsdigita.ui.SiteBanner; import com.arsdigita.ui.UserBanner; +import com.arsdigita.ui.admin.applications.ApplicationsTab; import com.arsdigita.ui.admin.categories.CategoriesTab; import com.arsdigita.ui.admin.configuration.ConfigurationTab; import com.arsdigita.web.BaseApplicationServlet; @@ -114,7 +115,7 @@ public class AdminServlet extends BaseApplicationServlet { tabbedPane.addTab( new Label(new GlobalizedMessage("ui.admin.tab.applications", ADMIN_BUNDLE)), - new ApplicationsAdminTab()); + new ApplicationsTab()); tabbedPane.addTab( new Label(new GlobalizedMessage( diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationTypePropertySheetModel.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationTypePropertySheetModel.java index 338633ccb..374c44be6 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationTypePropertySheetModel.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationTypePropertySheetModel.java @@ -38,6 +38,7 @@ public class ApplicationTypePropertySheetModel implements PropertySheetModel { private static enum AppTypeProperty { NAME, + TITLE, DESC, APP_CLASS, CREATOR, @@ -97,6 +98,8 @@ public class ApplicationTypePropertySheetModel implements PropertySheetModel { switch(currentProperty) { case NAME: return applicationType.name(); + case TITLE: + return getAppTypeTitle(); case DESC: return getAppTypeDesc(); case APP_CLASS: @@ -114,6 +117,13 @@ public class ApplicationTypePropertySheetModel implements PropertySheetModel { } } + private String getAppTypeTitle() { + final org.libreccm.web.ApplicationManager appManager = CdiUtil.createCdiUtil().findBean( + org.libreccm.web.ApplicationManager.class); + + return appManager.getApplicationTypeTitle(applicationType); + } + private String getAppTypeDesc() { final org.libreccm.web.ApplicationManager appManager = CdiUtil.createCdiUtil().findBean( org.libreccm.web.ApplicationManager.class); diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationTypeTreeNode.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationTypeTreeNode.java index 6bf781408..90aaa22fd 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationTypeTreeNode.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationTypeTreeNode.java @@ -20,6 +20,7 @@ package com.arsdigita.ui.admin.applications; import com.arsdigita.bebop.tree.TreeNode; +import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.web.ApplicationType; /** @@ -36,16 +37,19 @@ public class ApplicationTypeTreeNode implements TreeNode { @Override public Object getKey() { - return applicationType.applicationClass().getName(); + return applicationType.name(); } @Override public Object getElement() { - return applicationType.name(); + final org.libreccm.web.ApplicationManager appManager = CdiUtil + .createCdiUtil().findBean(org.libreccm.web.ApplicationManager.class); + + return appManager.getApplicationTypeTitle(applicationType); } public ApplicationType getApplicationType() { return applicationType; } - + } diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationsTab.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationsTab.java index 093fbec09..69e1c3073 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationsTab.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationsTab.java @@ -18,12 +18,24 @@ */ package com.arsdigita.ui.admin.applications; +import com.arsdigita.bebop.ActionLink; +import com.arsdigita.bebop.BoxPanel; +import com.arsdigita.bebop.Label; import com.arsdigita.bebop.Page; +import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.ParameterSingleSelectionModel; +import com.arsdigita.bebop.PropertySheet; +import com.arsdigita.bebop.Text; import com.arsdigita.bebop.Tree; import com.arsdigita.bebop.parameters.StringParameter; +import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.toolbox.ui.LayoutPanel; +import org.libreccm.cdi.utils.CdiUtil; +import org.libreccm.web.ApplicationType; + +import static com.arsdigita.ui.admin.AdminUiConstants.*; + /** * * @author Jens Pelzetter @@ -37,6 +49,10 @@ public class ApplicationsTab extends LayoutPanel { private final ParameterSingleSelectionModel selectedAppInstance; private final Tree applicationTree; + private final BoxPanel managementLinks; + private final Text placeholderInstances; + private final Text placeholderSingletonSettings; + private final BoxPanel appInfo; public ApplicationsTab() { super(); @@ -45,28 +61,212 @@ public class ApplicationsTab extends LayoutPanel { selectedAppTypeParam = new StringParameter("selectedAppType"); selectedAppType = new ParameterSingleSelectionModel<>( - selectedAppTypeParam); + selectedAppTypeParam); selectedAppInstanceParam = new StringParameter("selectedAppInstance"); selectedAppInstance = new ParameterSingleSelectionModel<>( - selectedAppInstanceParam); + selectedAppInstanceParam); applicationTree = new Tree(new ApplicationTreeModelBuilder()); applicationTree.addChangeListener(e -> { + final PageState state = e.getPageState(); + + final Object key = applicationTree.getSelectedKey(state); + if (key instanceof Long) { + + } else if (key instanceof String) { + //ApplicationType node is selected + showManagementLinks(state); + final String appTypeKey = (String) key; + + selectedAppType.setSelectedKey(state, appTypeKey); + + final org.libreccm.web.ApplicationManager appManager = CdiUtil + .createCdiUtil().findBean( + org.libreccm.web.ApplicationManager.class); + final ApplicationType appType = appManager.getApplicationTypes() + .get(appTypeKey); + + if (appType.singleton()) { + showSingletonAppSettings(state); + } else { + showInstances(state); + } + + } else { + throw new IllegalArgumentException( + "The key of the selected must be Long or a String"); + } }); setLeft(applicationTree); + final BoxPanel managementPanel = new BoxPanel(BoxPanel.VERTICAL); + managementLinks = new BoxPanel(BoxPanel.HORIZONTAL); + + final ActionLink singletonAppSettingsLink + = new SingletonAppSettingsLink( + new GlobalizedMessage("ui.admin.applications.singleton.link", + ADMIN_BUNDLE)); + singletonAppSettingsLink.addActionListener(e -> { + final PageState state = e.getPageState(); + + showSingletonAppSettings(state); + }); + managementLinks.add(singletonAppSettingsLink); + + final ActionLink instancesLink = new InstancesLink( + new GlobalizedMessage("ui.admin.applications.instances.link", + ADMIN_BUNDLE)); + instancesLink.addActionListener(e -> { + final PageState state = e.getPageState(); + + showInstances(state); + }); + managementLinks.add(instancesLink); + + final ActionLink infoLink = new ActionLink(new GlobalizedMessage( + "ui.admin.applications.info.link", ADMIN_BUNDLE)); + infoLink.addActionListener(e -> { + final PageState state = e.getPageState(); + + showAppInfo(state); + }); + managementLinks.add(infoLink); + + managementPanel.add(managementLinks); + + placeholderInstances = new Text("placeholder instances"); + managementPanel.add(placeholderInstances); + + placeholderSingletonSettings + = new Text("placeholder singleton settings"); + managementPanel.add(placeholderSingletonSettings); + + appInfo = new BoxPanel(BoxPanel.VERTICAL); + final Label appInfoHeading = new Label(new GlobalizedMessage( + "ui.admin.applications.info.heading", ADMIN_BUNDLE)); + appInfoHeading.setClassAttr("heading"); + appInfo.add(appInfoHeading); + + final PropertySheet appInfoSheet = new PropertySheet( + new ApplicationTypePropertySheetModelBuilder(selectedAppType)); + appInfo.add(appInfoSheet); + managementPanel.add(appInfo); + + setBody(managementPanel); + } @Override public void register(final Page page) { super.register(page); - + page.addGlobalStateParam(selectedAppTypeParam); page.addGlobalStateParam(selectedAppInstanceParam); + page.setVisibleDefault(managementLinks, false); + page.setVisibleDefault(placeholderInstances, false); + page.setVisibleDefault(placeholderSingletonSettings, false); + page.setVisibleDefault(appInfo, false); + + } + + protected void showManagementLinks(final PageState state) { + managementLinks.setVisible(state, true); + } + + protected void hideManagementLinks(final PageState state) { + managementLinks.setVisible(state, false); + } + + protected void showInstances(final PageState state) { + placeholderInstances.setVisible(state, true); + placeholderSingletonSettings.setVisible(state, false); + appInfo.setVisible(state, false); + } + + protected void hideInstances(final PageState state) { + placeholderInstances.setVisible(state, false); + } + + protected void showSingletonAppSettings(final PageState state) { + placeholderInstances.setVisible(state, false); + placeholderSingletonSettings.setVisible(state, true); + appInfo.setVisible(state, false); + } + + protected void hideSingletonAppSettings(final PageState state) { + placeholderSingletonSettings.setVisible(state, false); + } + + protected void showAppInfo(final PageState state) { + placeholderInstances.setVisible(state, false); + placeholderSingletonSettings.setVisible(state, false); + appInfo.setVisible(state, true); + } + + protected void hideAppInfo(final PageState state) { + appInfo.setVisible(state, false); + } + + private class SingletonAppSettingsLink extends ActionLink { + + public SingletonAppSettingsLink(final GlobalizedMessage label) { + super(label); + } + + @Override + public boolean isVisible(final PageState state) { + if (super.isVisible(state)) { + if (selectedAppType.getSelectedKey(state) == null) { + return false; + } else { + final org.libreccm.web.ApplicationManager appManager + = CdiUtil + .createCdiUtil().findBean( + org.libreccm.web.ApplicationManager.class); + final ApplicationType appType = appManager + .getApplicationTypes().get(selectedAppType + .getSelectedKey(state)); + + return appType.singleton(); + } + } else { + return false; + } + } + + } + + private class InstancesLink extends ActionLink { + + public InstancesLink(final GlobalizedMessage label) { + super(label); + } + + @Override + public boolean isVisible(final PageState state) { + if (super.isVisible(state)) { + if (selectedAppType.getSelectedKey(state) == null) { + return false; + } else { + final org.libreccm.web.ApplicationManager appManager + = CdiUtil + .createCdiUtil().findBean( + org.libreccm.web.ApplicationManager.class); + final ApplicationType appType = appManager + .getApplicationTypes().get(selectedAppType + .getSelectedKey(state)); + + return !appType.singleton(); + } + } else { + return false; + } + } + } } diff --git a/ccm-core/src/main/java/org/libreccm/web/ApplicationManager.java b/ccm-core/src/main/java/org/libreccm/web/ApplicationManager.java index e2c0d9464..8c025d099 100644 --- a/ccm-core/src/main/java/org/libreccm/web/ApplicationManager.java +++ b/ccm-core/src/main/java/org/libreccm/web/ApplicationManager.java @@ -150,6 +150,28 @@ public class ApplicationManager { } } + public String getApplicationTypeTitle( + final ApplicationType applicationType) { + + final String descBundle; + if (Strings.isBlank(applicationType.descBundle())) { + descBundle = String.join("", applicationType.name(), "Description"); + } else { + descBundle = applicationType.descBundle(); + } + + final ResourceBundle bundle; + try { + bundle = ResourceBundle.getBundle( + descBundle, globalizationHelper.getNegotiatedLocale()); + return bundle.getString(applicationType.titleKey()); + } catch (MissingResourceException ex) { + LOGGER.warn("Failed to find resource bundle '{}'.", ex); + + return applicationType.name(); + } + } + public String getApplicationTypeDescription( final ApplicationType applicationType) { @@ -164,13 +186,12 @@ public class ApplicationManager { try { bundle = ResourceBundle.getBundle( descBundle, globalizationHelper.getNegotiatedLocale()); + return bundle.getString(applicationType.descKey()); } catch (MissingResourceException ex) { LOGGER.warn("Failed to find resource bundle '{}'.", ex); - + return ""; } - - return bundle.getString(applicationType.descKey()); } } diff --git a/ccm-core/src/main/java/org/libreccm/web/ApplicationType.java b/ccm-core/src/main/java/org/libreccm/web/ApplicationType.java index e8a19a4fe..e582b6cf0 100644 --- a/ccm-core/src/main/java/org/libreccm/web/ApplicationType.java +++ b/ccm-core/src/main/java/org/libreccm/web/ApplicationType.java @@ -54,13 +54,23 @@ public @interface ApplicationType { String descBundle() default ""; /** - * The (optional) key for the description of the application in its resource + * The (optional) key for the title of the application in its resource * bundle. Defaults to {@code application_title} * * @return + * + * @return */ - String descKey() default "application_title"; - + String titleKey() default "application_title"; + + /** + * The (optional) key for the description of the application in its resource + * bundle. Defaults to {@code application_desc} + * + * @return + */ + String descKey() default "application_desc"; + /** * The application type class. Default is {@link CcmApplication}. Most * application types will no need to extend these class and can leave the diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties index 0e3a12968..6cb97f0d0 100644 --- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties +++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties @@ -527,3 +527,14 @@ ui.admin.categories.category.name.visible=Visible? ui.admin.categories.category.name.abstract=Abstract? ui.admin.appliations.type_pane.info_sheet=About application_title=Administration +ui.admin.applications.singleton.link=Settings +ui.admin.applications.info.link=About +ui.admin.applications.type.property_sheet.name=Name +ui.admin.applications.type.property_sheet.title=Title +ui.admin.applications.type.property_sheet.desc=Description +ui.admin.applications.type.property_sheet.app_class=Application Class +ui.admin.applications.type.property_sheet.creator=Creator class +ui.admin.applications.type.property_sheet.singleton=Singleton? +ui.admin.applications.type.property_sheet.servlet_class=Servlet +ui.admin.applications.type.property_sheet.servlet_path=Servlet path +ui.admin.applications.info.heading=About the application type diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties index ecb2629bc..cae914f2f 100644 --- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties +++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties @@ -530,3 +530,14 @@ ui.admin.categories.category.name.visible=Sichtbar? ui.admin.categories.category.name.abstract=Abstrakt? ui.admin.appliations.type_pane.info_sheet=\u00dcber application_title=Administration +ui.admin.applications.singleton.link=Einstellungen +ui.admin.applications.info.link=Info +ui.admin.applications.type.property_sheet.name=Name +ui.admin.applications.type.property_sheet.title=Titel +ui.admin.applications.type.property_sheet.desc=Beschreibung +ui.admin.applications.type.property_sheet.app_class=Applikationsklasse +ui.admin.applications.type.property_sheet.creator=Creator class +ui.admin.applications.type.property_sheet.singleton=Singleton? +ui.admin.applications.type.property_sheet.servlet_class=Servlet +ui.admin.applications.type.property_sheet.servlet_path=Servlet-Pfad +ui.admin.applications.info.heading=\u00dcber den Applikationstyp diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties index bfe3297c2..a330375c2 100755 --- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties +++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties @@ -523,3 +523,14 @@ ui.admin.categories.category.name.visible=Visible? ui.admin.categories.category.name.abstract=Abstract? ui.admin.appliations.type_pane.info_sheet=About application_title=Administration +ui.admin.applications.singleton.link=Settings +ui.admin.applications.info.link=About +ui.admin.applications.type.property_sheet.name=Name +ui.admin.applications.type.property_sheet.title=Title +ui.admin.applications.type.property_sheet.desc=Description +ui.admin.applications.type.property_sheet.app_class=Application Class +ui.admin.applications.type.property_sheet.creator=Creator class +ui.admin.applications.type.property_sheet.singleton=Singleton? +ui.admin.applications.type.property_sheet.servlet_class=Servlet +ui.admin.applications.type.property_sheet.servlet_path=Servlet path +ui.admin.applications.info.heading=About the application type diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties index 1f9aa601b..f116fc351 100755 --- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties +++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties @@ -514,3 +514,14 @@ ui.admin.categories.category.name.visible=Visible? ui.admin.categories.category.name.abstract=Abstract? ui.admin.appliations.type_pane.info_sheet=About application_title=Administration +ui.admin.applications.singleton.link=Settings +ui.admin.applications.info.link=About +ui.admin.applications.type.property_sheet.name=Name +ui.admin.applications.type.property_sheet.title=Title +ui.admin.applications.type.property_sheet.desc=Description +ui.admin.applications.type.property_sheet.app_class=Application Class +ui.admin.applications.type.property_sheet.creator=Creator class +ui.admin.applications.type.property_sheet.singleton=Singleton? +ui.admin.applications.type.property_sheet.servlet_class=Servlet +ui.admin.applications.type.property_sheet.servlet_path=Servlet path +ui.admin.applications.info.heading=About the application type