Basic structure for the ApplicationsAdministrationTab.

git-svn-id: https://svn.libreccm.org/ccm/trunk@2217 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2013-06-18 18:26:12 +00:00
parent 6f227bab68
commit 6411140e9f
29 changed files with 1590 additions and 198 deletions

View File

@ -19,3 +19,12 @@ ui.debug.transform.on=Display transformation
ui.debug.transform.off=Hide transformation ui.debug.transform.off=Hide transformation
ui.debug.xml=View document XML ui.debug.xml=View document XML
ui.debug.xsl=Download XSL files ui.debug.xsl=Download XSL files
com.arsdigita.ui.admin.applications.tree.heading=Applications
com.arsdigita.ui.admin.applications.url.validation.not_blank=The URL of an application instance can is mandatory.
com.arsdigita.ui.admin.applications.url.valiation.minmaxlength=The length of an URL of an application instance must be between 1 and 100 characters.
com.arsdigita.ui.admin.applications.title.validation.not_blank=Title is mandatory for an application instance.
com.arsdigita.ui.admin.applications.title.valiation.minmaxlength=The minimum length of the title of an applicatio instance is one character, the maximum length are 200 characters
com.arsdigita.ui.admin.applications.desc.valiation.minmaxlength=The maximum length of a descrption of an application instance are 4000 characters.
com.arsdigita.ui.admin.applications.url.label=URL
com.arsdigita.ui.admin.applications.title.label=Title
com.arsdigita.ui.admin.applications.desc.label=Description

View File

@ -5,17 +5,26 @@ ui.admin.signout=Abmelden
ui.admin.portal=Meine Startseite ui.admin.portal=Meine Startseite
ui.admin.greeting=Willkommen ui.admin.greeting=Willkommen
ui.sitemap.site_node=Site Node: ui.sitemap.site_node=Site Node:
ui.sitemap.mounted_instance=Verf\u00FCgbare Instanz\: ui.sitemap.mounted_instance=Verf\u00fcgbare Instanz\:
ui.sitemap.enter_new_node_name_in_text_field=Tragen Sie einen neuen Namen im Textfeld ein. ui.sitemap.enter_new_node_name_in_text_field=Tragen Sie einen neuen Namen im Textfeld ein.
ui.sitemap.are_you_sure_you_want_to_remove_this_node=Sind Sie sicher, diesen Knoten zu entfernen? ui.sitemap.are_you_sure_you_want_to_remove_this_node=Sind Sie sicher, diesen Knoten zu entfernen?
ui.sitemap.are_you_sure_you_want_to_umount_this_instance=Sind Sie sicher, diese Instanz auszuh\u00E4ngen? ui.sitemap.are_you_sure_you_want_to_umount_this_instance=Sind Sie sicher, diese Instanz auszuh\u00e4ngen?
ui.sitemap.enter_name_for_new_package_instance_in_text_field_then_select_a_package_to_mount_from_list=Enter name for new package instance in text field, then select a package to mount from list. ui.sitemap.enter_name_for_new_package_instance_in_text_field_then_select_a_package_to_mount_from_list=Enter name for new package instance in text field, then select a package to mount from list.
ui.sitemap.h4sitemap_treeh4=<h4>SiteMap Tree</h4> ui.sitemap.h4sitemap_treeh4=<h4>SiteMap Tree</h4>
ui.sitemap.configure_sitemap_admin_page=Configure SiteMap Admin Page ui.sitemap.configure_sitemap_admin_page=Configure SiteMap Admin Page
ui.sitemap.h4emselect_sitenode_to_view_detailsemh4=<h4><em>Knoten f\u00FCr die Detailansicht w\u00E4hlen</em></h4> ui.sitemap.h4emselect_sitenode_to_view_detailsemh4=<h4><em>Knoten f\u00fcr die Detailansicht w\u00e4hlen</em></h4>
ui.sitemap.configuration_menu_placeholder=Configuration Menu Placeholder ui.sitemap.configuration_menu_placeholder=Configuration Menu Placeholder
ui.sitemap.access_denied_to_sitemap=Zugang zur SiteMap abgelehnt. ui.sitemap.access_denied_to_sitemap=Zugang zur SiteMap abgelehnt.
ui.debug.transform.on=Transformation anzeigen ui.debug.transform.on=Transformation anzeigen
ui.debug.transform.off=Transformation verbergen ui.debug.transform.off=Transformation verbergen
ui.debug.xml=XML Dokument ansehen ui.debug.xml=XML Dokument ansehen
ui.debug.xsl=Download XSL Dateien ui.debug.xsl=Download XSL Dateien
com.arsdigita.ui.admin.applications.tree.heading=Applikationen
com.arsdigita.ui.admin.applications.url.validation.not_blank=Die Angabe einer URL ist erforderlich
com.arsdigita.ui.admin.applications.url.valiation.minmaxlength=Die URL einer Applikations-Instanz muss zwischen einem und 100 Zeichen lang sein
com.arsdigita.ui.admin.applications.title.validation.not_blank=Der Titel ist f\u00fcr das Anlegen einer Applikations-Instanz erforderlich
com.arsdigita.ui.admin.applications.title.valiation.minmaxlength=Der Titel einer Applikations-Instanz muss zwischen einem und 200 Zeichen lang sein.
com.arsdigita.ui.admin.applications.desc.valiation.minmaxlength=Die Beschreibung einer Applikations-Instanz darf max. 4000 Zeichen lang sein
com.arsdigita.ui.admin.applications.url.label=URL
com.arsdigita.ui.admin.applications.title.label=Bezeichnung
com.arsdigita.ui.admin.applications.desc.label=Beschreibung

View File

@ -19,3 +19,12 @@ ui.debug.transform.on=Display transformation
ui.debug.transform.off=Hide transformation ui.debug.transform.off=Hide transformation
ui.debug.xml=View document XML ui.debug.xml=View document XML
ui.debug.xsl=Download XSL files ui.debug.xsl=Download XSL files
com.arsdigita.ui.admin.applications.tree.heading=Applications
com.arsdigita.ui.admin.applications.url.validation.not_blank=
com.arsdigita.ui.admin.applications.url.valiation.minmaxlength=
com.arsdigita.ui.admin.applications.title.validation.not_blank=
com.arsdigita.ui.admin.applications.title.valiation.minmaxlength=
com.arsdigita.ui.admin.applications.desc.valiation.minmaxlength=
com.arsdigita.ui.admin.applications.url.label=
com.arsdigita.ui.admin.applications.title.label=
com.arsdigita.ui.admin.applications.desc.label=

View File

@ -1,4 +1,4 @@
ui.admin.access_denied=Accès refusé ui.admin.access_denied=Acc\u00e8s refus\u00e9
ui.admin.help=Aide ui.admin.help=Aide
ui.admin.signout=se deconnecter ui.admin.signout=se deconnecter
ui.admin.portal=Ma Porte ui.admin.portal=Ma Porte
@ -14,4 +14,13 @@ ui.sitemap.h4sitemap_treeh4=<h4>Plan du site</h4>
ui.sitemap.configure_sitemap_admin_page=TRANSLATE THIS: Configure SiteMap Admin Page (ui.sitemap.configure_sitemap_admin_page) ui.sitemap.configure_sitemap_admin_page=TRANSLATE THIS: Configure SiteMap Admin Page (ui.sitemap.configure_sitemap_admin_page)
ui.sitemap.h4emselect_sitenode_to_view_detailsemh4=TRANSLATE THIS: <h4><em>Select SiteNode to View Details</em></h4> (ui.sitemap.h4emselect_sitenode_to_view_detailsemh4) ui.sitemap.h4emselect_sitenode_to_view_detailsemh4=TRANSLATE THIS: <h4><em>Select SiteNode to View Details</em></h4> (ui.sitemap.h4emselect_sitenode_to_view_detailsemh4)
ui.sitemap.configuration_menu_placeholder=TRANSLATE THIS: Configuration Menu Placeholder (ui.sitemap.configuration_menu_placeholder) ui.sitemap.configuration_menu_placeholder=TRANSLATE THIS: Configuration Menu Placeholder (ui.sitemap.configuration_menu_placeholder)
ui.sitemap.access_denied_to_sitemap=Vous n'avez pas accès au plan du site ui.sitemap.access_denied_to_sitemap=Vous n'avez pas acc\u00e8s au plan du site
com.arsdigita.ui.admin.applications.tree.heading=
com.arsdigita.ui.admin.applications.url.validation.not_blank=
com.arsdigita.ui.admin.applications.url.valiation.minmaxlength=
com.arsdigita.ui.admin.applications.title.validation.not_blank=
com.arsdigita.ui.admin.applications.title.valiation.minmaxlength=
com.arsdigita.ui.admin.applications.desc.valiation.minmaxlength=
com.arsdigita.ui.admin.applications.url.label=
com.arsdigita.ui.admin.applications.title.label=
com.arsdigita.ui.admin.applications.desc.label=

View File

@ -90,3 +90,40 @@ ui.admin.user.userpasswordform.confirmpasswordlabel=Confirm password:
ui.admin.user.userpasswordform.passwordlabel=Password: ui.admin.user.userpasswordform.passwordlabel=Password:
ui.admin.user.userpasswordform.question=Question: ui.admin.user.userpasswordform.question=Question:
ui.admin.user.userpasswordform.submit=Change ui.admin.user.userpasswordform.submit=Change
ui.admin.tab.applications.title=Applications
ui.admin.applications.tree.heading=Applications
ui.admin.applications.url.validation.not_blank=The URL of an application instance can is mandatory.
ui.admin.applications.url.valiation.minmaxlength=The length of an URL of an application instance must be between 1 and 100 characters.
ui.admin.applications.title.validation.not_blank=Title is mandatory for an application instance.
ui.admin.applications.title.valiation.minmaxlength=The minimum length of the title of an applicatio instance is one character, the maximum length are 200 characters
ui.admin.applications.desc.valiation.minmaxlength=The maximum length of a descrption of an application instance are 4000 characters.
ui.admin.applications.url.label=URL
ui.admin.applications.title.label=Title
ui.admin.applications.desc.label=Description
ui.admin.applications.url.validation.url_already_in_use=The provided URL is already in use
ui.admin.applications.url.validation.no_slash_allowed=The URL fragement may not contain slashes
ui.admin.applications.ApplicationInstancePane.title.label=Title of the instance
ui.admin.applications.ApplicationInstancePane.parent_app.label=Parent application
ui.admin.applications.ApplicationInstancePane.path.label=Path of the application
ui.admin.applications.ApplicationInstancePane.desc.label=Description
ui.admin.applications.ApplicationInstancePane.info.heading=Instance data
ui.admin.MultiInstanceApplicationPane.manage.heading=Edit instance specific settings
ui.admin.MultiInstancePane.manage.no_instance_admin_pane_found=No instance admin pane for instances of the application type '{0]' found. Maybe it is not implemented yet.
ui.admin.applications.ApplicationInfoSection.title.label=Title
ui.admin.applications.ApplicationInfoSection.app_class.label=Application Class
ui.admin.applications.ApplicationInfoSection.singleton.label=Singleton
ui.admin.applications.ApplicationInfoSection.singleton.yes=Yes
ui.admin.applications.ApplicationInfoSection.singleton.no=No
ui.admin.applications.ApplicationInfoSection.singleton_instance.path.label=Path of the singleton instance
ui.admin.applications.ApplicationInfoSection.singleton_instance.no_instance_found=No instance found
ui.admin.applications.ApplicationInfoSection.heading=Application information
ui.admin.applicationsMultiInstanceApplicationPane.instances.table.col_title.header=Title
ui.admin.applicationsMultiInstanceApplicationPane.instances.table.col_url.header=Path
ui.admin.applicationsMultiInstanceApplicationPane.instances.table.col_desc.header=Description
ui.admin.MultiInstanceApplicationPane.instances=Instances
ui.admin.MultiInstanceApplicationPane.manage_instances.heading=Manage instances
ui.admin.MultiInstancePane.manage.no_create_form_found=No form for manageing instances of type '{0}' found.
ui.admin.MultiInstanceApplicationPane.create_instance=Create new instance
ui.admin.SingletonApplicationPane.manage.heading=Edit settings
ui.admin.SingletonApplicationPane.manage.no_admin_pane_found=No admin pane for applications of type '{0}' found.
ui.admin.applications.ApplicationInfoSection.desc.label=Description

View File

@ -4,14 +4,14 @@ ui.admin.dispatcher.groupsLabel=Gruppen
ui.admin.dispatcher.title=Administration ui.admin.dispatcher.title=Administration
ui.admin.dispatcher.usersLabel=Benutzer ui.admin.dispatcher.usersLabel=Benutzer
ui.admin.groups.actioncontinue=Fortsetzen ui.admin.groups.actioncontinue=Fortsetzen
ui.admin.groups.groupdeletefailed=Gruppe nicht zu l\u00F6schbar ui.admin.groups.groupdeletefailed=Gruppe nicht zu l\u00f6schbar
ui.admin.groups.add=Neue Untergruppe erstellen ui.admin.groups.add=Neue Untergruppe erstellen
ui.admin.groups.addeditform.namelabel=Name: ui.admin.groups.addeditform.namelabel=Name:
ui.admin.groups.addeditform.primaryemaillabel=Prim\u00E4re E-Mail\: ui.admin.groups.addeditform.primaryemaillabel=Prim\u00e4re E-Mail\:
ui.admin.groups.addeditform.submit=Sichern ui.admin.groups.addeditform.submit=Sichern
ui.admin.groups.addgrouplabel=Neue Gruppe hinzuf\u00FCgen ui.admin.groups.addgrouplabel=Neue Gruppe hinzuf\u00fcgen
ui.admin.groups.addsubmemberlabel=Mitglied hinzuf\u00FCgen ui.admin.groups.addsubmemberlabel=Mitglied hinzuf\u00fcgen
ui.admin.groups.delete=Gruppe l\u00F6schen ui.admin.groups.delete=Gruppe l\u00f6schen
ui.admin.groups.deletefailed=Fehlermeldung ui.admin.groups.deletefailed=Fehlermeldung
ui.admin.groups.edit=Edit ui.admin.groups.edit=Edit
ui.admin.groups.groupedit=Edit Group ui.admin.groups.groupedit=Edit Group
@ -27,22 +27,22 @@ ui.admin.groups.removeExisting=Als Subgruppe entfernen
ui.admin.groups.search=Search for groups to add as subgroups ui.admin.groups.search=Search for groups to add as subgroups
ui.admin.groups.button.search=Suche ui.admin.groups.button.search=Suche
ui.admin.groups.searchForm.noResults=Your search matches no valid groups (groups that cause circular references are excluded). Search again ui.admin.groups.searchForm.noResults=Your search matches no valid groups (groups that cause circular references are excluded). Search again
ui.admin.groups.found.title=Gruppen ausw\u00E4hlen ui.admin.groups.found.title=Gruppen ausw\u00e4hlen
ui.admin.groups.select.explanation=Gruppen ausw\u00E4hlen\: ui.admin.groups.select.explanation=Gruppen ausw\u00e4hlen\:
ui.admin.save=Sichern ui.admin.save=Sichern
ui.admin.nav.logout=Abmelden ui.admin.nav.logout=Abmelden
ui.admin.nav.workspace=Workspace ui.admin.nav.workspace=Workspace
ui.admin.searchAndList.submit=Suchen ui.admin.searchAndList.submit=Suchen
ui.admin.searchAndList.submitAgain=Erneut suchen ui.admin.searchAndList.submitAgain=Erneut suchen
ui.admin.tab.group.title=Gruppen ui.admin.tab.group.title=Gruppen
ui.admin.tab.user.browse=Bl\u00E4ttern ui.admin.tab.user.browse=Bl\u00e4ttern
ui.admin.tab.user.createuser=Neuen Benutzer erstellen ui.admin.tab.user.createuser=Neuen Benutzer erstellen
ui.admin.tab.user.navbartitle=Benutzerverwaltung ui.admin.tab.user.navbartitle=Benutzerverwaltung
ui.admin.tab.user.search=Suche ui.admin.tab.user.search=Suche
ui.admin.tab.user.summary=Zusammenfassung ui.admin.tab.user.summary=Zusammenfassung
ui.admin.tab.user.title=Benutzer ui.admin.tab.user.title=Benutzer
ui.admin.user.action.continue=Fortfahren ui.admin.user.action.continue=Fortfahren
ui.admin.user.action.delete.failed.header=Benutzer kann nicht gel\u00F6scht werden ui.admin.user.action.delete.failed.header=Benutzer kann nicht gel\u00f6scht werden
ui.admin.user.action.header=Aktionen ui.admin.user.action.header=Aktionen
ui.admin.user.addeditform.additionalemail=Weitere E-Mail Adresse\: ui.admin.user.addeditform.additionalemail=Weitere E-Mail Adresse\:
ui.admin.user.addeditform.additionalemaillist=Weitere E-Mail ui.admin.user.addeditform.additionalemaillist=Weitere E-Mail
@ -51,7 +51,7 @@ ui.admin.user.addeditform.confirmation=Password Confirmation:
ui.admin.user.addeditform.deleteemail=Entfernen ui.admin.user.addeditform.deleteemail=Entfernen
ui.admin.user.addeditform.error.answer.null=This parameter is required. ui.admin.user.addeditform.error.answer.null=This parameter is required.
ui.admin.user.addeditform.error.answer.whitespace=Answer must be empty or contain non-whitespace characters ui.admin.user.addeditform.error.answer.whitespace=Answer must be empty or contain non-whitespace characters
ui.admin.user.addeditform.error.password.notmatch=Passworte stimmen nicht \u00FCberein ui.admin.user.addeditform.error.password.notmatch=Passworte stimmen nicht \u00fcberein
ui.admin.user.addeditform.error.primaryemail.notunique=Primary email is not unique ui.admin.user.addeditform.error.primaryemail.notunique=Primary email is not unique
ui.admin.user.addeditform.error.screenname.notunique=Benutzername ist nicht eindeutig ui.admin.user.addeditform.error.screenname.notunique=Benutzername ist nicht eindeutig
ui.admin.user.addeditform.firstname=Vorname\: ui.admin.user.addeditform.firstname=Vorname\:
@ -74,8 +74,8 @@ ui.admin.user.ban.confirm=Are you sure you want to ban this user?
ui.admin.user.unban.confirm=Are you sure you want to unban this user? ui.admin.user.unban.confirm=Are you sure you want to unban this user?
ui.admin.user.ban.label=Ban user ui.admin.user.ban.label=Ban user
ui.admin.user.unban.label=Unban user ui.admin.user.unban.label=Unban user
ui.admin.user.delete.failed.label=L\u00F6schen des Benutzers fehlgeschlagen ui.admin.user.delete.failed.label=L\u00f6schen des Benutzers fehlgeschlagen
ui.admin.user.delete.label=Benutzer l\u00F6schen ui.admin.user.delete.label=Benutzer l\u00f6schen
ui.admin.user.editlink=Editieren ui.admin.user.editlink=Editieren
ui.admin.user.groupmembership.header=Group Membership ui.admin.user.groupmembership.header=Group Membership
ui.admin.user.password.header=Update Security Information ui.admin.user.password.header=Update Security Information
@ -86,7 +86,44 @@ ui.admin.user.summarypanel.totalusers=Total users:
ui.admin.user.useredit.header=Edit User Information ui.admin.user.useredit.header=Edit User Information
ui.admin.user.userinfo.header=Benutzerinformation ui.admin.user.userinfo.header=Benutzerinformation
ui.admin.user.userpasswordform.answer=Antwort\:<br>(<font size\="-1">Leerlassen um aktuelle Antwort beizubehalten</font>) ui.admin.user.userpasswordform.answer=Antwort\:<br>(<font size\="-1">Leerlassen um aktuelle Antwort beizubehalten</font>)
ui.admin.user.userpasswordform.confirmpasswordlabel=Passwort best\u00E4tigen\: ui.admin.user.userpasswordform.confirmpasswordlabel=Passwort best\u00e4tigen\:
ui.admin.user.userpasswordform.passwordlabel=Passwort\: ui.admin.user.userpasswordform.passwordlabel=Passwort\:
ui.admin.user.userpasswordform.question=Frage\: ui.admin.user.userpasswordform.question=Frage\:
ui.admin.user.userpasswordform.submit=\u00C4ndern ui.admin.user.userpasswordform.submit=\u00c4ndern
ui.admin.tab.applications.title=Applikationen
ui.admin.applications.tree.heading=Applikationen
ui.admin.applications.url.validation.not_blank=Die Angabe einer URL ist erforderlich
ui.admin.applications.url.valiation.minmaxlength=Die URL einer Applikations-Instanz muss zwischen einem und 100 Zeichen lang sein
ui.admin.applications.title.validation.not_blank=Der Titel ist f\u00fcr das Anlegen einer Applikations-Instanz erforderlich
ui.admin.applications.title.valiation.minmaxlength=Der Titel einer Applikations-Instanz muss zwischen einem und 200 Zeichen lang sein.
ui.admin.applications.desc.valiation.minmaxlength=Die Beschreibung einer Applikations-Instanz darf max. 4000 Zeichen lang sein
ui.admin.applications.url.label=URL
ui.admin.applications.title.label=Bezeichnung
ui.admin.applications.desc.label=Beschreibung
ui.admin.applications.url.validation.url_already_in_use=Der angegebene URL wird bereits verwendet
ui.admin.applications.url.validation.no_slash_allowed=Das URL-Fragment darf keine Schr\u00e4gstriche enthalten
ui.admin.applications.ApplicationInstancePane.title.label=Titel der Instanz
ui.admin.applications.ApplicationInstancePane.parent_app.label=\u00dcbergeordnete Applikation
ui.admin.applications.ApplicationInstancePane.path.label=Pfad der Applikation
ui.admin.applications.ApplicationInstancePane.desc.label=Beschreibung
ui.admin.applications.ApplicationInstancePane.info.heading=Daten der Instanz
ui.admin.MultiInstanceApplicationPane.manage.heading=Einstellungen der Instanz bearbeiten
ui.admin.MultiInstancePane.manage.no_instance_admin_pane_found=Kein Administrationsformular f\u00fcr Instanzen des Applikationstyps '{0}' gefunden. M\u00f6glicherweise noch nicht implementiert.
ui.admin.applications.ApplicationInfoSection.title.label=Titel
ui.admin.applications.ApplicationInfoSection.app_class.label=Applikationsklasse
ui.admin.applications.ApplicationInfoSection.singleton.label=Singleton
ui.admin.applications.ApplicationInfoSection.singleton.yes=Ja
ui.admin.applications.ApplicationInfoSection.singleton.no=Nein
ui.admin.applications.ApplicationInfoSection.singleton_instance.path.label=Pfad der Singleton Instanz
ui.admin.applications.ApplicationInfoSection.singleton_instance.no_instance_found=Keine Instanz gefunden
ui.admin.applications.ApplicationInfoSection.heading=Applikationsinformationen
ui.admin.applicationsMultiInstanceApplicationPane.instances.table.col_title.header=Titel
ui.admin.applicationsMultiInstanceApplicationPane.instances.table.col_url.header=Pfad
ui.admin.applicationsMultiInstanceApplicationPane.instances.table.col_desc.header=Beschreibung
ui.admin.MultiInstanceApplicationPane.instances=Instanzen
ui.admin.MultiInstanceApplicationPane.manage_instances.heading=Instanzen verwalten
ui.admin.MultiInstancePane.manage.no_create_form_found=Keine Formular zum verwalten von Applikationen des Types '{0}' gefunden.
ui.admin.MultiInstanceApplicationPane.create_instance=Neue instanz anlegen
ui.admin.SingletonApplicationPane.manage.heading=Eigenschaften bearbeiten
ui.admin.SingletonApplicationPane.manage.no_admin_pane_found=Keine Admin-Formular f\u00fcr Applikationen des Types '{0}' gefunden
ui.admin.applications.ApplicationInfoSection.desc.label=Beschreibung

View File

@ -90,3 +90,40 @@ ui.admin.user.userpasswordform.confirmpasswordlabel=Confirm password:
ui.admin.user.userpasswordform.passwordlabel=Password: ui.admin.user.userpasswordform.passwordlabel=Password:
ui.admin.user.userpasswordform.question=Question: ui.admin.user.userpasswordform.question=Question:
ui.admin.user.userpasswordform.submit=Change ui.admin.user.userpasswordform.submit=Change
ui.admin.tab.applications.title=Applications
ui.admin.applications.tree.heading=Applications
ui.admin.applications.url.validation.not_blank=
ui.admin.applications.url.valiation.minmaxlength=
ui.admin.applications.title.validation.not_blank=
ui.admin.applications.title.valiation.minmaxlength=
ui.admin.applications.desc.valiation.minmaxlength=
ui.admin.applications.url.label=
ui.admin.applications.title.label=
ui.admin.applications.desc.label=
ui.admin.applications.url.validation.url_already_in_use=
ui.admin.applications.url.validation.no_slash_allowed=
ui.admin.applications.ApplicationInstancePane.title.label=
ui.admin.applications.ApplicationInstancePane.parent_app.label=
ui.admin.applications.ApplicationInstancePane.path.label=
ui.admin.applications.ApplicationInstancePane.desc.label=
ui.admin.applications.ApplicationInstancePane.info.heading=
ui.admin.MultiInstanceApplicationPane.manage.heading=
ui.admin.MultiInstancePane.manage.no_instance_admin_pane_found=
ui.admin.applications.ApplicationInfoSection.title.label=
ui.admin.applications.ApplicationInfoSection.app_class.label=
ui.admin.applications.ApplicationInfoSection.singleton.label=
ui.admin.applications.ApplicationInfoSection.singleton.yes=
ui.admin.applications.ApplicationInfoSection.singleton.no=
ui.admin.applications.ApplicationInfoSection.singleton_instance.path.label=
ui.admin.applications.ApplicationInfoSection.singleton_instance.no_instance_found=
ui.admin.applications.ApplicationInfoSection.heading=
ui.admin.applicationsMultiInstanceApplicationPane.instances.table.col_title.header=
ui.admin.applicationsMultiInstanceApplicationPane.instances.table.col_url.header=
ui.admin.applicationsMultiInstanceApplicationPane.instances.table.col_desc.header=
ui.admin.MultiInstanceApplicationPane.instances=
ui.admin.MultiInstanceApplicationPane.manage_instances.heading=
ui.admin.MultiInstancePane.manage.no_create_form_found=
ui.admin.MultiInstanceApplicationPane.create_instance=
ui.admin.SingletonApplicationPane.manage.heading=
ui.admin.SingletonApplicationPane.manage.no_admin_pane_found=
ui.admin.applications.ApplicationInfoSection.desc.label=

View File

@ -1,4 +1,4 @@
ui.admin.dispatcher.accessDenied=Accès refusé ui.admin.dispatcher.accessDenied=Acc\u00e8s refus\u00e9
ui.admin.dispatcher.contextTitle=Index ui.admin.dispatcher.contextTitle=Index
ui.admin.dispatcher.groupsLabel=Groupes ui.admin.dispatcher.groupsLabel=Groupes
ui.admin.dispatcher.title=Administration ui.admin.dispatcher.title=Administration
@ -21,31 +21,31 @@ ui.admin.groups.removesubmemberlabel=Retirer
ui.admin.groups.subgroupcountlabel=Sous-groupes: ui.admin.groups.subgroupcountlabel=Sous-groupes:
ui.admin.groups.subgroups=Information sur le sous-groupe ui.admin.groups.subgroups=Information sur le sous-groupe
ui.admin.groups.submembers=Information sur le membre ui.admin.groups.submembers=Information sur le membre
ui.admin.nav.logout=Déconnexion ui.admin.nav.logout=D\u00e9connexion
ui.admin.nav.workspace=Espace de travail ui.admin.nav.workspace=Espace de travail
ui.admin.searchAndList.submit=Rechercher ui.admin.searchAndList.submit=Rechercher
ui.admin.searchAndList.submitAgain=Rechercher suivant ui.admin.searchAndList.submitAgain=Rechercher suivant
ui.admin.tab.group.title=Groupe ui.admin.tab.group.title=Groupe
ui.admin.tab.user.browse=Parcourir ui.admin.tab.user.browse=Parcourir
ui.admin.tab.user.createuser=Créer un nouvel utilisateur ui.admin.tab.user.createuser=Cr\u00e9er un nouvel utilisateur
ui.admin.tab.user.navbartitle=Gestion de l'utilisateur ui.admin.tab.user.navbartitle=Gestion de l'utilisateur
ui.admin.tab.user.search=Rechercher ui.admin.tab.user.search=Rechercher
ui.admin.tab.user.summary=Table des matières ui.admin.tab.user.summary=Table des mati\u00e8res
ui.admin.tab.user.title=Utilisateurs ui.admin.tab.user.title=Utilisateurs
ui.admin.user.action.continue=Continuer ui.admin.user.action.continue=Continuer
ui.admin.user.action.delete.failed.header=Impossible de supprimer l'utiisateur ui.admin.user.action.delete.failed.header=Impossible de supprimer l'utiisateur
ui.admin.user.action.header=Actions ui.admin.user.action.header=Actions
ui.admin.user.addeditform.additionalemail=Adresse e-mail secondaire: ui.admin.user.addeditform.additionalemail=Adresse e-mail secondaire:
ui.admin.user.addeditform.additionalemaillist=Autre e-mail ui.admin.user.addeditform.additionalemaillist=Autre e-mail
ui.admin.user.addeditform.answer=Réponse: ui.admin.user.addeditform.answer=R\u00e9ponse:
ui.admin.user.addeditform.confirmation=Confirmation du mot de passe: ui.admin.user.addeditform.confirmation=Confirmation du mot de passe:
ui.admin.user.addeditform.deleteemail=Supprimer ui.admin.user.addeditform.deleteemail=Supprimer
ui.admin.user.addeditform.error.answer.null=Ce paramètre est obligatoire. ui.admin.user.addeditform.error.answer.null=Ce param\u00e8tre est obligatoire.
ui.admin.user.addeditform.error.answer.whitespace=La réponse doit être vide ou ne pas contenir d'espace ui.admin.user.addeditform.error.answer.whitespace=La r\u00e9ponse doit \u00eatre vide ou ne pas contenir d'espace
ui.admin.user.addeditform.error.password.notmatch=Les mots de passe sont différents ui.admin.user.addeditform.error.password.notmatch=Les mots de passe sont diff\u00e9rents
ui.admin.user.addeditform.error.primaryemail.notunique=L'e-mail principal n'est pas unique ui.admin.user.addeditform.error.primaryemail.notunique=L'e-mail principal n'est pas unique
ui.admin.user.addeditform.error.screenname.notunique=Screen name n'est pas unique ui.admin.user.addeditform.error.screenname.notunique=Screen name n'est pas unique
ui.admin.user.addeditform.firstname=Prénom: ui.admin.user.addeditform.firstname=Pr\u00e9nom:
ui.admin.user.addeditform.lastname=Nom: ui.admin.user.addeditform.lastname=Nom:
ui.admin.user.addeditform.password=Mot de passe: ui.admin.user.addeditform.password=Mot de passe:
ui.admin.user.addeditform.primaryemail=e-mail principal: ui.admin.user.addeditform.primaryemail=e-mail principal:
@ -56,23 +56,60 @@ ui.admin.user.addeditform.url=URL:
ui.admin.user.browselink=Montrer tout ui.admin.user.browselink=Montrer tout
ui.admin.user.browsepanel.becomeUser=Devenir cet utilisateur ui.admin.user.browsepanel.becomeUser=Devenir cet utilisateur
ui.admin.user.browsepanel.extremeaction=Action dangereuse ui.admin.user.browsepanel.extremeaction=Action dangereuse
ui.admin.user.browsepanel.header=Tous les utilisateurs enregistrés ui.admin.user.browsepanel.header=Tous les utilisateurs enregistr\u00e9s
ui.admin.user.browsepanel.updatePassword=Mettre à jour le mot de passe ui.admin.user.browsepanel.updatePassword=Mettre \u00e0 jour le mot de passe
ui.admin.user.createpanel.header=Créer un nouvel utilisateur ui.admin.user.createpanel.header=Cr\u00e9er un nouvel utilisateur
ui.admin.user.delete.confirm=Etes vous sûr de vouloir supprimer cet utilisateur? ui.admin.user.delete.confirm=Etes vous s\u00fbr de vouloir supprimer cet utilisateur?
ui.admin.user.delete.failed.label=La suppression de l'utilisateur a échoué ui.admin.user.delete.failed.label=La suppression de l'utilisateur a \u00e9chou\u00e9
ui.admin.user.delete.label=Supprimer cet utilisateur ui.admin.user.delete.label=Supprimer cet utilisateur
ui.admin.user.editlink=Modifier ui.admin.user.editlink=Modifier
ui.admin.user.groupmembership.header=Groupe(s) d'appartenance ui.admin.user.groupmembership.header=Groupe(s) d'appartenance
ui.admin.user.password.header=Mise à jour des informations de sécurité ui.admin.user.password.header=Mise \u00e0 jour des informations de s\u00e9curit\u00e9
ui.admin.user.search.header=Rechercher ui.admin.user.search.header=Rechercher
ui.admin.user.summarypanel.createUser=Créer un nouvel utilisateur ui.admin.user.summarypanel.createUser=Cr\u00e9er un nouvel utilisateur
ui.admin.user.summarypanel.header=Table des matières ui.admin.user.summarypanel.header=Table des mati\u00e8res
ui.admin.user.summarypanel.totalusers=Total des utilisateurs: ui.admin.user.summarypanel.totalusers=Total des utilisateurs:
ui.admin.user.useredit.header=Modifier les informations de l'utilisateur ui.admin.user.useredit.header=Modifier les informations de l'utilisateur
ui.admin.user.userinfo.header=Informations de l'utilisateur ui.admin.user.userinfo.header=Informations de l'utilisateur
ui.admin.user.userpasswordform.answer=Réponse:<br>(<font size "-1">Ne pas remplir pour conserver la réponse actuelle</font>) ui.admin.user.userpasswordform.answer=R\u00e9ponse:<br>(<font size "-1">Ne pas remplir pour conserver la r\u00e9ponse actuelle</font>)
ui.admin.user.userpasswordform.confirmpasswordlabel=Confirmer le mot de passe: ui.admin.user.userpasswordform.confirmpasswordlabel=Confirmer le mot de passe:
ui.admin.user.userpasswordform.passwordlabel=Mot de passe: ui.admin.user.userpasswordform.passwordlabel=Mot de passe:
ui.admin.user.userpasswordform.question=Question: ui.admin.user.userpasswordform.question=Question:
ui.admin.user.userpasswordform.submit=Changer ui.admin.user.userpasswordform.submit=Changer
ui.admin.tab.applications.title=
ui.admin.applications.tree.heading=
ui.admin.applications.url.validation.not_blank=
ui.admin.applications.url.valiation.minmaxlength=
ui.admin.applications.title.validation.not_blank=
ui.admin.applications.title.valiation.minmaxlength=
ui.admin.applications.desc.valiation.minmaxlength=
ui.admin.applications.url.label=
ui.admin.applications.title.label=
ui.admin.applications.desc.label=
ui.admin.applications.url.validation.url_already_in_use=
ui.admin.applications.url.validation.no_slash_allowed=
ui.admin.applications.ApplicationInstancePane.title.label=
ui.admin.applications.ApplicationInstancePane.parent_app.label=
ui.admin.applications.ApplicationInstancePane.path.label=
ui.admin.applications.ApplicationInstancePane.desc.label=
ui.admin.applications.ApplicationInstancePane.info.heading=
ui.admin.MultiInstanceApplicationPane.manage.heading=
ui.admin.MultiInstancePane.manage.no_instance_admin_pane_found=
ui.admin.applications.ApplicationInfoSection.title.label=
ui.admin.applications.ApplicationInfoSection.app_class.label=
ui.admin.applications.ApplicationInfoSection.singleton.label=
ui.admin.applications.ApplicationInfoSection.singleton.yes=
ui.admin.applications.ApplicationInfoSection.singleton.no=
ui.admin.applications.ApplicationInfoSection.singleton_instance.path.label=
ui.admin.applications.ApplicationInfoSection.singleton_instance.no_instance_found=
ui.admin.applications.ApplicationInfoSection.heading=
ui.admin.applicationsMultiInstanceApplicationPane.instances.table.col_title.header=
ui.admin.applicationsMultiInstanceApplicationPane.instances.table.col_url.header=
ui.admin.applicationsMultiInstanceApplicationPane.instances.table.col_desc.header=
ui.admin.MultiInstanceApplicationPane.instances=
ui.admin.MultiInstanceApplicationPane.manage_instances.heading=
ui.admin.MultiInstancePane.manage.no_create_form_found=
ui.admin.MultiInstanceApplicationPane.create_instance=
ui.admin.SingletonApplicationPane.manage.heading=
ui.admin.SingletonApplicationPane.manage.no_admin_pane_found=
ui.admin.applications.ApplicationInfoSection.desc.label=

View File

@ -18,6 +18,7 @@
*/ */
package com.arsdigita.ui.admin; package com.arsdigita.ui.admin;
import com.arsdigita.ui.admin.ApplicationsAdministrationTab;
import com.arsdigita.bebop.Page; import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageFactory; import com.arsdigita.bebop.PageFactory;
import com.arsdigita.bebop.TabbedPane; import com.arsdigita.bebop.TabbedPane;
@ -194,8 +195,8 @@ public class AdminServlet extends BaseApplicationServlet
/* /*
* Create application administration panel * Create application administration panel
*/ */
ApplicationsAdministrationTab appsAdministrationTab = ApplicationsAdministrationTab appsAdministrationTab =
new ApplicationsAdministrationTab(); new ApplicationsAdministrationTab();
SettingsTab settingsTab = new SettingsTab(); SettingsTab settingsTab = new SettingsTab();
@ -218,4 +219,5 @@ public class AdminServlet extends BaseApplicationServlet
return p; return p;
} }
} }

View File

@ -1,6 +1,20 @@
/* /*
* To change this template, choose Tools | Templates * Copyright (c) 2013 Jens Pelzetter
* and open the template in the editor. *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/ */
package com.arsdigita.ui.admin; package com.arsdigita.ui.admin;
@ -8,9 +22,11 @@ import com.arsdigita.bebop.BoxPanel;
import com.arsdigita.bebop.Component; import com.arsdigita.bebop.Component;
import com.arsdigita.bebop.Label; import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.Link; import com.arsdigita.bebop.Link;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.SplitPanel; import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.Table; import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.Tree;
import com.arsdigita.bebop.event.ChangeEvent; import com.arsdigita.bebop.event.ChangeEvent;
import com.arsdigita.bebop.event.ChangeListener; import com.arsdigita.bebop.event.ChangeListener;
import com.arsdigita.bebop.event.TableActionEvent; import com.arsdigita.bebop.event.TableActionEvent;
@ -20,53 +36,251 @@ import com.arsdigita.bebop.table.TableColumn;
import com.arsdigita.bebop.table.TableColumnModel; import com.arsdigita.bebop.table.TableColumnModel;
import com.arsdigita.bebop.table.TableModel; import com.arsdigita.bebop.table.TableModel;
import com.arsdigita.bebop.table.TableModelBuilder; import com.arsdigita.bebop.table.TableModelBuilder;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.toolbox.ui.LayoutPanel;
import com.arsdigita.toolbox.ui.Section;
import com.arsdigita.ui.admin.applications.ApplicationCreateForm;
import com.arsdigita.ui.admin.applications.ApplicationInstancePane;
import com.arsdigita.ui.admin.applications.ApplicationManager;
import com.arsdigita.ui.admin.applications.BaseApplicationPane;
import com.arsdigita.ui.admin.applications.MultiInstanceApplicationPane;
import com.arsdigita.ui.admin.applications.SingletonApplicationPane;
import com.arsdigita.ui.admin.applications.tree.ApplicationTreeModelBuilder;
import com.arsdigita.ui.admin.GlobalizationUtil;
import com.arsdigita.util.LockableImpl; import com.arsdigita.util.LockableImpl;
import com.arsdigita.web.Application; import com.arsdigita.web.Application;
import com.arsdigita.web.ApplicationCollection; import com.arsdigita.web.ApplicationCollection;
import com.arsdigita.web.ApplicationType;
import com.arsdigita.web.ApplicationTypeCollection;
import java.util.HashMap;
import java.util.Map;
import java.util.ServiceLoader;
/** /**
* A tab for managing Application and application instances.
* *
* @author pb * @author pb
* @author Jens Pelzetter * @author Jens Pelzetter
*/ */
public class ApplicationsAdministrationTab extends BoxPanel public class ApplicationsAdministrationTab extends BoxPanel implements AdminConstants, ChangeListener {
implements AdminConstants, ChangeListener {
private GlobalizedMessage m_title; //private GlobalizedMessage m_title;
private final Tree applicationTree;
private final Map<String, SingletonApplicationPane> singletonAppPanes =
new HashMap<String, SingletonApplicationPane>();
private final Map<String, MultiInstanceApplicationPane<?>> multiInstAppPanes =
new HashMap<String, MultiInstanceApplicationPane<?>>();
private final Map<String, BaseApplicationPane> appPanes = new HashMap<String, BaseApplicationPane>();
private final Map<String, ApplicationInstancePane> instancePanes = new HashMap<String, ApplicationInstancePane>();
private SimpleContainer visiblePane;
//private final Label label1;
//private final Label label2;
/** /**
* Constructor * Constructor
*/ */
public ApplicationsAdministrationTab() { public ApplicationsAdministrationTab() {
super();
// m_title = "TEST für ein neues Pannel"; // m_title = "TEST für ein neues Pannel";
setClassAttr("sidebarNavPanel"); setClassAttr("sidebarNavPanel");
setAttribute("navbar-title", "Sitemap"); setAttribute("navbar-title", "Sitemap");
// m_componentList = new ArrayList(); // m_componentList = new ArrayList();
// m_keys = new ArrayList(); // m_keys = new ArrayList();
applicationTree = new Tree(new ApplicationTreeModelBuilder());
applicationTree.addChangeListener(this);
final BoxPanel box = new BoxPanel(); final Section treeSection = new Section();
box.setClassAttr("main"); treeSection.setHeading(GlobalizationUtil.globalize("ui.admin.applications.tree.heading"));
treeSection.setBody(applicationTree);
final SplitPanel panel = new SplitPanel(); //final BoxPanel panel1 = new BoxPanel();
panel.setClassAttr("sidebarNavPanel"); // label1 = new Label("login");
panel.setRightComponent(box); // label2 = new Label("ppp");
// panel1.add(label1);
// panel1.add(label2);
box.add(new ApplicationsTable());
final LayoutPanel panel = new LayoutPanel();
//panel.setLeft(applicationTree);
panel.setLeft(treeSection);
//panel.setRight(new Label("<<<Placeholder>>>"));
//panel.setRight(panel1);
final ApplicationTypeCollection applicationTypes = ApplicationType.retrieveAllApplicationTypes();
final Map<String, ApplicationCreateForm<?>> createForms = retrieveAppCreateForms();
final Map<String, ApplicationManager<?>> managementForms = retrieveAppManagers();
while (applicationTypes.next()) {
if (applicationTypes.getApplicationType().isSingleton()) {
createSingletonAppPane(applicationTypes.getApplicationType(), managementForms);
} else {
createAppPane(applicationTypes.getApplicationType(), createForms, managementForms);
}
}
final BoxPanel appPanel = new BoxPanel();
for (Map.Entry<String, BaseApplicationPane> entry : appPanes.entrySet()) {
appPanel.add(entry.getValue());
}
for (Map.Entry<String, ApplicationInstancePane> entry : instancePanes.entrySet()) {
appPanel.add(entry.getValue());
}
panel.setRight(appPanel);
// final BoxPanel box = new BoxPanel();
// box.setClassAttr("main");
//
// final SplitPanel panel = new SplitPanel();
// panel.setClassAttr("sidebarNavPanel");
// panel.setLeftComponent(applicationTree);
// panel.setRightComponent(box);
//
// //box.add(new ApplicationsTable());
// box.add(new Label("<<<Placeholder>>>"));
//
add(panel); add(panel);
} }
@SuppressWarnings("rawtypes")
private Map<String, ApplicationCreateForm<?>> retrieveAppCreateForms() {
final Map<String, ApplicationCreateForm<?>> appCreateForms = new HashMap<String, ApplicationCreateForm<?>>();
final ServiceLoader<ApplicationCreateForm> loader = ServiceLoader.load(ApplicationCreateForm.class);
for (ApplicationCreateForm<?> appCreateForm : loader) {
appCreateForms.put(appCreateForm.getAppClassName(), appCreateForm);
}
return appCreateForms;
}
@SuppressWarnings("rawtypes")
private Map<String, ApplicationManager<?>> retrieveAppManagers() {
final Map<String, ApplicationManager<?>> appManagers = new HashMap<String, ApplicationManager<?>>();
final ServiceLoader<ApplicationManager> loader = ServiceLoader.load(ApplicationManager.class);
for (ApplicationManager<?> appManager : loader) {
appManagers.put(appManager.getApplication().getName(), appManager);
}
return appManagers;
}
private void createSingletonAppPane(final ApplicationType applicationType,
final Map<String, ApplicationManager<?>> managementForms) {
final String appObjectType = applicationType.getApplicationObjectType();
final ApplicationManager<?> manager = managementForms.get(appObjectType);
final SingletonApplicationPane pane;
if (manager == null) {
pane = new SingletonApplicationPane(applicationType, null);
} else {
pane = new SingletonApplicationPane(
applicationType, managementForms.get(appObjectType).getApplicationAdminForm());
}
//singletonAppPanes.put(appObjectType, pane);
appPanes.put(appObjectType, pane);
}
@SuppressWarnings({"rawtypes", "unchecked"})
private void createAppPane(final ApplicationType applicationType,
final Map<String, ApplicationCreateForm<?>> createForms,
final Map<String, ApplicationManager<?>> managementForms) {
final MultiInstanceApplicationPane<?> appPane = new MultiInstanceApplicationPane(
applicationType,
createForms.get(applicationType.getApplicationObjectType()));
//multiInstAppPanes.put(applicationType.getApplicationObjectType(), appPane);
appPanes.put(applicationType.getApplicationObjectType(), appPane);
final ApplicationCollection instances = Application.retrieveAllApplications(
applicationType.getApplicationObjectType());
while (instances.next()) {
createInstancePane(instances.getApplication(), managementForms);
}
}
private void createInstancePane(final Application application,
final Map<String, ApplicationManager<?>> managementForms) {
final ApplicationManager<?> manager = managementForms.get(application.getClass().getName());
final ApplicationInstancePane instPane;
if (manager == null) {
instPane = new ApplicationInstancePane(application, null);
} else {
instPane = new ApplicationInstancePane(
application,
managementForms.get(application.getClass().getName()).getApplicationAdminForm());
}
instancePanes.put(application.getClass().getName(), instPane);
}
@Override
public void register(final Page page) {
super.register(page);
for (Map.Entry<String, BaseApplicationPane> entry : appPanes.entrySet()) {
page.setVisibleDefault(entry.getValue(), false);
}
for (Map.Entry<String, ApplicationInstancePane> entry : instancePanes.entrySet()) {
page.setVisibleDefault(entry.getValue(), false);
}
//page.setVisibleDefault(label1, false);
//page.setVisibleDefault(label2, false);
}
/** /**
* *
* @param e * @param event
*/ */
@Override @Override
public void stateChanged(ChangeEvent e) { public void stateChanged(final ChangeEvent event) {
final PageState state = event.getPageState();
System.out.println("State changed.");
final String selectedKey = (String) applicationTree.getSelectedKey(state);
if (selectedKey != null) {
if (selectedKey.contains(".")) {
// Selected key is a classname and therefore the key of an ApplicationPane
final BaseApplicationPane pane = appPanes.get(selectedKey);
if (pane != null) {
setPaneVisible(pane, state);
}
} else {
// Selected key is the name of a instance pane
final ApplicationInstancePane pane = instancePanes.get(selectedKey);
if (pane != null) {
setPaneVisible(pane, state);
}
}
}
//ToDo Find out if the key is the key of a application type (contains dots) or the key of an instance (may
//contains Slashes
// if ("ui.login.Login".equals(applicationTree.getSelectedKey(state))) {
// label1.setVisible(state, true);
// label2.setVisible(state, false);
// } else if ("com.arsdigita.cms.publicpersonalprofile.PublicPersonalProfile".equals(applicationTree.
// getSelectedKey(state))) {
// label1.setVisible(state, false);
// label2.setVisible(state, true);
// } else {
// label1.setVisible(state, false);
// label2.setVisible(state, false);
// }
PageState ps = e.getPageState();
// String key = (String) m_tree.getSelectedKey(ps); // String key = (String) m_tree.getSelectedKey(ps);
// added cg - reset existing group add panel to the search screen // added cg - reset existing group add panel to the search screen
// when a new group is selected from the tree // when a new group is selected from the tree
@ -75,6 +289,15 @@ public class ApplicationsAdministrationTab extends BoxPanel
// setTab(selectedIndex, ps); // setTab(selectedIndex, ps);
} }
private void setPaneVisible(final SimpleContainer pane, final PageState state) {
if (visiblePane != null) {
visiblePane.setVisible(state, false);
}
pane.setVisible(state, true);
visiblePane = pane;
}
private class ApplicationsTable extends Table implements TableActionListener { private class ApplicationsTable extends Table implements TableActionListener {
private static final String COL_APP_CLASS = "col_app_class"; private static final String COL_APP_CLASS = "col_app_class";

View File

@ -0,0 +1,41 @@
/*
* Copyright (c) 2013 Jens Pelzetter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.ui.admin;
import com.arsdigita.globalization.GlobalizedMessage;
/**
* Globalization Util for admin classes
*
* @author Jens Pelzetter <jens@jp-digital.de>
* @version $Id$
*/
public class GlobalizationUtil {
private static final String BUNDLE_NAME = "com.arsdigita.ui.admin.AdminResources";
public static GlobalizedMessage globalize(final String key) {
return new GlobalizedMessage(key, BUNDLE_NAME);
}
public static GlobalizedMessage globalize(final String key, final Object[] args) {
return new GlobalizedMessage(key, BUNDLE_NAME, args);
}
}

View File

@ -156,7 +156,8 @@ class GroupAdministrationTab extends BoxPanel
BoxPanel c = new BoxPanel(); BoxPanel c = new BoxPanel();
c.setClassAttr("navbar"); c.setClassAttr("navbar");
m_tree = new Tree(new GroupTreeModel()); //m_tree = new Tree(new GroupTreeModel());
m_tree = new Tree(new GroupTreeModelBuilder());
m_tree.addChangeListener(this); m_tree.addChangeListener(this);
c.add(m_tree); c.add(m_tree);

View File

@ -66,6 +66,7 @@ public class GroupTreeModel implements TreeModel {
public void remove() { public void remove() {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
} }
/** /**
@ -114,21 +115,21 @@ public class GroupTreeModel implements TreeModel {
coll.addInSubqueryFilter("id", "com.arsdigita.ui.admin.AllNoParentGroups"); coll.addInSubqueryFilter("id", "com.arsdigita.ui.admin.AllNoParentGroups");
coll.addOrder("lower("+ Group.DISPLAY_NAME + ") asc"); coll.addOrder("lower(" + Group.DISPLAY_NAME + ") asc");
return new GroupIterator(new ACSObjectCollection(coll)); return new GroupIterator(new ACSObjectCollection(coll));
} else { } else {
Group group = null; Group group = null;
try { try {
group = new Group(new BigDecimal((String)n.getKey())); group = new Group(new BigDecimal((String) n.getKey()));
} catch (DataObjectNotFoundException ed) { } catch (DataObjectNotFoundException ed) {
// Group is not found just return null. // Group is not found just return null.
return null; return null;
} }
GroupCollection coll = group.getSubgroups(); GroupCollection coll = group.getSubgroups();
coll.addOrder("lower("+ Group.DISPLAY_NAME + ") asc"); coll.addOrder("lower(" + Group.DISPLAY_NAME + ") asc");
return new GroupIterator(coll); return new GroupIterator(coll);
@ -147,6 +148,7 @@ class RootTreeNode implements TreeNode {
public Object getElement() { public Object getElement() {
return "/"; return "/";
} }
} }
class GroupTreeNode implements TreeNode { class GroupTreeNode implements TreeNode {
@ -166,4 +168,5 @@ class GroupTreeNode implements TreeNode {
public Object getElement() { public Object getElement() {
return m_name; return m_name;
} }
} }

View File

@ -0,0 +1,39 @@
/*
* Copyright (c) 2013 Jens Pelzetter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.ui.admin;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.Tree;
import com.arsdigita.bebop.tree.TreeModel;
import com.arsdigita.bebop.tree.TreeModelBuilder;
import com.arsdigita.util.LockableImpl;
/**
*
* @author Jens Pelzetter <jens@jp-digital.de>
* @version $Id$
*/
public class GroupTreeModelBuilder extends LockableImpl implements TreeModelBuilder {
public TreeModel makeModel(final Tree tree, final PageState state) {
tree.expand("-1", state);
return new GroupTreeModel();
}
}

View File

@ -1,130 +0,0 @@
package com.arsdigita.ui.admin;
import com.arsdigita.bebop.BoxPanel;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.event.TableActionEvent;
import com.arsdigita.bebop.event.TableActionListener;
import com.arsdigita.bebop.table.TableModel;
import com.arsdigita.bebop.table.TableModelBuilder;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.packaging.Config;
import com.arsdigita.runtime.ConfigRegistry;
import com.arsdigita.util.LockableImpl;
import com.arsdigita.util.parameter.ErrorList;
import com.arsdigita.util.parameter.Parameter;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.List;
/**
* Tab for viewing and changing the settings in the registry.
*
* @author Jens Pelzetter
*/
public class SettingsTab extends BoxPanel implements AdminConstants {
private GlobalizedMessage title;
public SettingsTab() {
setClassAttr("sidebarNavPanel");
setAttribute("navbar-title", "Settings");
final BoxPanel box = new BoxPanel(BoxPanel.VERTICAL);
box.setClassAttr("main");
final ConfigRegistry registry = new ConfigRegistry();
final Config config = new Config(registry);
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
final PrintStream printStream = new PrintStream(outputStream);
config.load(printStream);
final String errors = outputStream.toString();
box.add(new Label(errors));
final List contexts = registry.getContexts();
for (Object context : contexts) {
final String storage = registry.getStorage((Class) context);
add(new Label(String.format("<strong>%s</strong>", ((Class) context).getName()), false));
}
final List parameters = config.getParameters();
for(int i = 0; i < parameters.size(); i++) {
final Parameter parameter = (Parameter) parameters.get(i);
add(new Label(parameter.getName()));
}
add(box);
}
private class SettingsTable extends Table implements TableActionListener {
public SettingsTable() {
super();
setEmptyView(new Label("No settings found"));
//Add columns here
setModelBuilder(new SettingsTableModelBuilder());
}
public void cellSelected(TableActionEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
public void headSelected(TableActionEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
private class SettingsTableModelBuilder extends LockableImpl implements TableModelBuilder {
@Override
public TableModel makeModel(final Table table, final PageState state) {
return new SettingsTableModel(table);
}
}
private class SettingsTableModel implements TableModel {
private final Table table;
private final String errors;
private final ConfigRegistry registry;
private final Config config;
public SettingsTableModel(final Table table) {
this.table = table;
registry = new ConfigRegistry();
config = new Config(registry);
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
final PrintStream printStream = new PrintStream(outputStream);
config.load(printStream);
errors = outputStream.toString();
}
@Override
public int getColumnCount() {
return table.getColumnModel().size();
}
public boolean nextRow() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
public Object getElementAt(int columnIndex) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
public Object getKeyAt(int columnIndex) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
}

View File

@ -20,6 +20,7 @@ package com.arsdigita.ui.admin;
import com.arsdigita.ui.admin.ApplicationsAdministrationTab;
import com.arsdigita.bebop.ActionLink; import com.arsdigita.bebop.ActionLink;
import com.arsdigita.bebop.BoxPanel; import com.arsdigita.bebop.BoxPanel;
import com.arsdigita.bebop.Component; import com.arsdigita.bebop.Component;

View File

@ -0,0 +1,45 @@
/*
* Copyright (c) 2013 Jens Pelzetter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.ui.admin.applications;
import com.arsdigita.bebop.Form;
import com.arsdigita.web.Application;
/**
* Provides a basic implementation of {@link ApplicationManager} for multi-instance applications.
*
* @param <T> Type of the application for which this ApplicationManager provides the administration forms.
*
* @author Jens Pelzetter <jens@jp-digital.de>
* @version $Id$
*/
public abstract class AbstractApplicationManager<T extends Application> implements ApplicationManager<T>{
/**
* Provides a standard form for creating new instances of an application.
* Suitable for most application types.
*
* @param appClass
* @return The standard form for creating new instances of an application.
*/
public Form getApplicationCreateForm(final Class<T> appClass) {
return new ApplicationCreateForm<T>(appClass);
}
}

View File

@ -0,0 +1,45 @@
/*
* Copyright (c) 2013 Jens Pelzetter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.ui.admin.applications;
import com.arsdigita.bebop.Form;
import com.arsdigita.web.Application;
/**
* An abstract class providing a default implementation of {@link ApplicationManager#getApplicationCreateForm()}.
*
* @param <T> Type of the application for which this ApplicationManager provides the administration forms.
*
* @author Jens Pelzetter <jens@jp-digital.de>
* @version $Id$
*/
public abstract class AbstractSingletonApplicationManager<T extends Application> implements ApplicationManager<T>{
/**
* Implementation of {@link ApplicationManager#getApplicationCreateForm()}
* for singleton applications.
*
* @return {@code} null because it is not possible to create instances
* of singleton applications.
*/
@SuppressWarnings("PMD.EmptyMethodInAbstractClassShouldBeAbstract")
public final Form getApplicationCreateForm() {
return null;
}
}

View File

@ -0,0 +1,153 @@
/*
* Copyright (c) 2013 Jens Pelzetter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.ui.admin.applications;
import com.arsdigita.bebop.Form;
import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.event.FormValidationListener;
import com.arsdigita.bebop.form.TextArea;
import com.arsdigita.bebop.form.TextField;
import com.arsdigita.bebop.parameters.NotNullValidationListener;
import com.arsdigita.bebop.parameters.StringInRangeValidationListener;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.persistence.DataCollection;
import com.arsdigita.persistence.Session;
import com.arsdigita.persistence.SessionManager;
import com.arsdigita.ui.admin.GlobalizationUtil;
import com.arsdigita.web.Application;
import com.arsdigita.web.ApplicationType;
/**
* Basic form for creating new Application instances. Should be suitable for
* most applications types. If you have special needs... $todo
*
* This form does not support parent/child application structures. If
* your app needs this, add a widget for selecting the parent application
* and extend the process method.
*
* @param <T> Type of application
*
* @author Jens Pelzetter <jens@jp-digital.de>
* @version $Id$
*/
public class ApplicationCreateForm<T extends Application>
extends Form
implements FormProcessListener, FormValidationListener {
public static final String FORM_NAME = "ApplicationCreateForm";
private static final String APPLICATION_URL = "applicationUrl";
private static final String APPLICATION_TITLE = "applicationTitle";
private static final String APPLICATION_DESC = "applicationDesc";
private final String appClassName;
private final ApplicationType applicationType;
private final TextField applicationUrl;
private final TextField applicationTitle;
private final TextArea applicationDesc;
public ApplicationCreateForm(final Class<T> appClass) {
super(FORM_NAME);
appClassName = appClass.getName();
final Session session = SessionManager.getSession();
final DataCollection appTypes = session.retrieve(ApplicationType.BASE_DATA_OBJECT_TYPE);
appTypes.addEqualsFilter("objectType", appClass.getName());
if (appTypes.isEmpty()) {
throw new IllegalArgumentException(String.format("Not application found for object type '%s'.",
appClass.getName()));
}
appTypes.next();
applicationType = (ApplicationType) DomainObjectFactory.newInstance(appTypes.getDataObject());
applicationUrl = new TextField(new StringParameter(APPLICATION_URL));
applicationUrl.setSize(42);
applicationUrl.addValidationListener(new NotNullValidationListener(
GlobalizationUtil.globalize("ui.admin.applications.url.validation.not_blank")));
applicationUrl.addValidationListener(new StringInRangeValidationListener(1, 100, GlobalizationUtil.globalize(
"ui.admin.applications.url.valiation.minmaxlength")));
applicationTitle = new TextField(new StringParameter(APPLICATION_TITLE));
applicationTitle.setSize(42);
applicationTitle.addValidationListener(new NotNullValidationListener(
GlobalizationUtil.globalize("ui.admin.applications.title.validation.not_blank")));
applicationTitle.addValidationListener(new StringInRangeValidationListener(1, 200, GlobalizationUtil.globalize(
"ui.admin.applications.title.valiation.minmaxlength")));
applicationDesc = new TextArea(new StringParameter(APPLICATION_DESC));
applicationDesc.setRows(5);
applicationDesc.setCols(42);
applicationDesc.addValidationListener(new StringInRangeValidationListener(0, 4000, GlobalizationUtil.globalize(
"ui.admin.applications.desc.valiation.minmaxlength")));
add(new Label(GlobalizationUtil.globalize("ui.admin.applications.url.label")));
add(applicationUrl);
add(new Label(GlobalizationUtil.globalize("ui.admin.applications.title.label")));
add(applicationTitle);
add(new Label(GlobalizationUtil.globalize("ui.admin.applications.desc.label")));
add(applicationDesc);
}
/**
* Creates a new application instance using the provided data.
*
* @param event
* @throws FormProcessException
*/
public void process(final FormSectionEvent event) throws FormProcessException {
final PageState state = event.getPageState();
final Application application = Application.createApplication(applicationType,
(String)applicationUrl.getValue(state),
(String)applicationTitle.getValue(state),
null,
false);
application.setDescription((String) applicationDesc.getValue(state));
}
public void validate(final FormSectionEvent event) throws FormProcessException {
final PageState state = event.getPageState();
final String url = (String) applicationUrl.getValue(state);
if (url.contains("/")) {
throw new FormProcessException((String) GlobalizationUtil.globalize(
"ui.admin.applications.url.validation.no_slash_allowed").localize());
}
if (Application.isInstalled(Application.BASE_DATA_OBJECT_TYPE, url)) {
throw new FormProcessException((String) GlobalizationUtil.globalize(
"ui.admin.applications.url.validation.url_already_in_use").localize());
}
}
public String getAppClassName() {
return appClassName;
}
}

View File

@ -0,0 +1,70 @@
/*
* Copyright (c) 2013 Jens Pelzetter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.ui.admin.applications;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.SegmentedPanel;
import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.ui.admin.GlobalizationUtil;
import com.arsdigita.web.Application;
/**
* This pane shows informations about a specific instance of a multi instance application, like title, parent
* application (if any) and the path. Also it contains a form for editing settings specific to the instance.
*
* @author Jens Pelzetter <jens@jp-digital.de>
* @version $Id$
*/
public class ApplicationInstancePane extends SegmentedPanel {
public ApplicationInstancePane(final Application appInstance, final SimpleContainer appAdminPane) {
super();
final InfoPanel appInstInfoPanel = new InfoPanel();
appInstInfoPanel.addLine("ui.admin.applications.ApplicationInstancePane.title.label",
appInstance.getTitle());
if (appInstance.getParentApplication() != null) {
appInstInfoPanel.addLine("ui.admin.applications.ApplicationInstancePane.parent_app.label",
appInstance.getParentApplication().getPath());
}
appInstInfoPanel.addLine("ui.admin.applications.ApplicationInstancePane.path.label",
appInstance.getPath());
appInstInfoPanel.addLine("ui.admin.applications.ApplicationInstancePane.desc.label",
appInstance.getDescription());
addSegment(new Label(GlobalizationUtil.globalize(
"ui.admin.applications.ApplicationInstancePane.info.heading")),
appInstInfoPanel);
if (appAdminPane == null) {
addSegment(new Label(com.arsdigita.ui.util.GlobalizationUtil.globalize(
"ui.admin.MultiInstanceApplicationPane.manage.heading")),
new Label(com.arsdigita.ui.util.GlobalizationUtil.globalize(
"ui.admin.MultiInstancePane.manage.no_instance_admin_pane_found",
new String[]{appInstance.getApplicationType().getApplicationObjectType()})));
} else {
addSegment(new Label(GlobalizationUtil.globalize(
"ui.admin.applications.ApplicationInstancePane.manage.heading")),
appAdminPane);
}
}
}

View File

@ -0,0 +1,81 @@
/*
* Copyright (c) 2013 Jens Pelzetter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.ui.admin.applications;
import com.arsdigita.bebop.Form;
import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.web.Application;
import java.util.ServiceLoader;
/**
* Implementations of this class are used by the new
* {@link ApplicationsAdministrationTab} to get the forms for editing the
* configuration of an application and for creating new instances of an
* application.
*
* The {@link ApplicationsAdministrationTab} uses the {@link ServiceLoader}
* from the Java Standard Library to find all implementations of this interface.
* To make implementations of this interface known add an file named
* {@code com.arsdigita.ui.admin.applications.ApplicationManager} to the
* {@code META-INF/services} directory of the module which provides the
* application. In this file add a line with the full qualified class name
* of each implementations of this interface provided by the module.
*
* There a two abstract classes to help you with implementing this class.
* {@link AbstractSingletonApplicationManager} is suitable for singleton
* applications. {@link AbstractApplicationManager} is for multi-instance
* applications.
*
* @param <T> Type of the application for which this ApplicationManager
* provides the administration forms.
*
* @author Jens Pelzetter <jens@jp-digital.de>
* @version $Id$
*/
public interface ApplicationManager<T extends Application> {
/**
* Used to determine the Applications class for which this
* manager provides the administration forms.
*
* @return The class of the application for which this
* manager provides the administration forms.
*/
Class<T> getApplication();
/**
* Provides a pane with administration forms for the application or for an
* instance of the application if the application is not a singleton.
*
* @return A container containing one or more forms for managing instances
* of an application.
*/
SimpleContainer getApplicationAdminForm();
/**
* Provides a form for creating new instances of applications. For
* singleton applications an implementation of this method will return
* {@code null}.
*
* @return A form for creating new instances of applications or
* {@code null} if the is a singleton.
*/
Form getApplicationCreateForm();
}

View File

@ -0,0 +1,80 @@
/*
* Copyright (c) 2013 Jens Pelzetter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.ui.admin.applications;
import com.arsdigita.bebop.ColumnPanel;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.SegmentedPanel;
import com.arsdigita.ui.admin.GlobalizationUtil;
import com.arsdigita.web.Application;
import com.arsdigita.web.ApplicationCollection;
import com.arsdigita.web.ApplicationType;
/**
* Basic application pane containing the parts common for singleton and multi instance applications types. Shows
* informations about a specific application type.
*
* @author Jens Pelzetter <jens@jp-digital.de>
* @version $Id$
*/
public class BaseApplicationPane extends SegmentedPanel {
//private final ApplicationType applicationType;
public BaseApplicationPane(final ApplicationType applicationType) {
super();
//this.applicationType = applicationType;
final InfoPanel appInfoPanel = new InfoPanel();
appInfoPanel.addLine("ui.admin.applications.ApplicationInfoSection.title.label",
applicationType.getTitle());
appInfoPanel.addLine("ui.admin.applications.ApplicationInfoSection.app_class.label",
applicationType.getApplicationObjectType());
if (applicationType.isSingleton()) {
appInfoPanel.addLine("ui.admin.applications.ApplicationInfoSection.singleton.label",
"ui.admin.applications.ApplicationInfoSection.singleton.yes",
true);
} else {
appInfoPanel.addLine("ui.admin.applications.ApplicationInfoSection.singleton.label",
"ui.admin.applications.ApplicationInfoSection.singleton.no",
true);
}
appInfoPanel.addLine("ui.admin.applications.ApplicationInfoSection.desc.label",
applicationType.getDescription());
if (applicationType.isSingleton()) {
final ApplicationCollection applications = Application.retrieveAllApplications(applicationType.
getApplicationObjectType());
if (applications.next()) {
appInfoPanel.addLine(
"ui.admin.applications.ApplicationInfoSection.singleton_instance.path.label",
applications.getApplication().getPath());
} else {
appInfoPanel.addLine(
"ui.admin.applications.ApplicationInfoSection.singleton_instance.path.label",
"ui.admin.applications.ApplicationInfoSection.singleton_instance.no_instance_found");
}
applications.close();
}
addSegment(new Label(GlobalizationUtil.globalize(
"ui.admin.applications.ApplicationInfoSection.heading")),
appInfoPanel);
}
}

View File

@ -0,0 +1,50 @@
/*
* Copyright (c) 2013 Jens Pelzetter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.ui.admin.applications;
import com.arsdigita.bebop.ColumnPanel;
import com.arsdigita.bebop.Label;
import com.arsdigita.ui.admin.GlobalizationUtil;
/**
* A helper class for creating a column panel with two labels in each row.
*
* @author Jens Pelzetter <jens@jp-digital.de>
* @version $Id$
*/
public class InfoPanel extends ColumnPanel {
public InfoPanel() {
super(2);
}
public void addLine(final String labelKey, final String data) {
addLine(labelKey, data, false);
}
public void addLine(final String labelKey, final String data, final boolean globalizeData) {
add(new Label(GlobalizationUtil.globalize(labelKey)));
if (globalizeData) {
add(new Label(GlobalizationUtil.globalize(data)));
} else {
add(new Label(data));
}
}
}

View File

@ -0,0 +1,133 @@
/*
* Copyright (c) 2013 Jens Pelzetter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.ui.admin.applications;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.table.TableColumn;
import com.arsdigita.bebop.table.TableModel;
import com.arsdigita.bebop.table.TableModelBuilder;
import com.arsdigita.ui.admin.GlobalizationUtil;
import com.arsdigita.util.LockableImpl;
import com.arsdigita.web.Application;
import com.arsdigita.web.ApplicationCollection;
import com.arsdigita.web.ApplicationType;
/**
* Pane for multi instance applications. Additional to the data provided by {@link BaseApplicationPane} it shows a
* table of all instances of the application type and a form for creating new instances of the application type.
*
* @param <T>
* @author Jens Pelzetter <jens@jp-digital.de>
* @version $Id$
*/
public class MultiInstanceApplicationPane<T extends Application> extends BaseApplicationPane {
private final static int COL_TITLE = 0;
private final static int COL_URL = 1;
private final static int COL_DESC = 2;
public MultiInstanceApplicationPane(final ApplicationType applicationType,
final ApplicationCreateForm<T> createForm) {
super(applicationType);
final ApplicationCollection applications = Application.retrieveAllApplications(applicationType.
getApplicationObjectType());
final Table table = new Table();
table.getColumnModel().add(new TableColumn(COL_TITLE, GlobalizationUtil.globalize(
"ui.admin.applicationsMultiInstanceApplicationPane.instances.table.col_title.header")));
table.getColumnModel().add(new TableColumn(COL_URL, GlobalizationUtil.globalize(
"ui.admin.applicationsMultiInstanceApplicationPane.instances.table.col_url.header")));
table.getColumnModel().add(new TableColumn(COL_DESC, GlobalizationUtil.globalize(
"ui.admin.applicationsMultiInstanceApplicationPane.instances.table.col_desc.header")));
table.setModelBuilder(new ApplicationInstancesTableModelBuilder(applications));
addSegment(new Label(GlobalizationUtil.globalize(
"ui.admin.MultiInstanceApplicationPane.instances")),
table);
if (createForm == null) {
addSegment(new Label(com.arsdigita.ui.util.GlobalizationUtil.globalize(
"ui.admin.MultiInstanceApplicationPane.manage_instances.heading")),
new Label(com.arsdigita.ui.util.GlobalizationUtil.globalize(
"ui.admin.MultiInstancePane.manage.no_create_form_found",
new String[]{applicationType.getApplicationObjectType()})));
} else {
addSegment(new Label(GlobalizationUtil.globalize(
"ui.admin.MultiInstanceApplicationPane.create_instance")),
createForm);
}
}
private class ApplicationInstancesTableModelBuilder extends LockableImpl implements TableModelBuilder {
private final ApplicationCollection applications;
public ApplicationInstancesTableModelBuilder(final ApplicationCollection applications) {
super();
this.applications = applications;
}
public TableModel makeModel(final Table table, final PageState state) {
return new ApplicationInstancesTableModel(table, applications);
}
}
private class ApplicationInstancesTableModel implements TableModel {
private final Table table;
private final ApplicationCollection applications;
public ApplicationInstancesTableModel(final Table table, final ApplicationCollection applications) {
this.table = table;
this.applications = applications;
}
public int getColumnCount() {
return table.getColumnModel().size();
}
public boolean nextRow() {
return applications.next();
}
public Object getElementAt(final int columnIndex) {
switch (columnIndex) {
case COL_TITLE:
return applications.getApplication().getTitle();
case COL_DESC:
return applications.getApplication().getDescription();
case COL_URL:
return applications.getApplication().getPath();
default:
return null;
}
}
public Object getKeyAt(final int columnIndex) {
return applications.getApplication().getPath();
}
}
}

View File

@ -0,0 +1,50 @@
/*
* Copyright (c) 2013 Jens Pelzetter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.ui.admin.applications;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.ui.admin.GlobalizationUtil;
import com.arsdigita.web.ApplicationType;
/**
* Pane for managing singleton applications. Shows a form to edit application specific settings.
*
* @author Jens Pelzetter <jens@jp-digital.de>
* @version $Id$
*/
public class SingletonApplicationPane extends BaseApplicationPane {
public SingletonApplicationPane(final ApplicationType applicationType, final SimpleContainer appAdminPane) {
super(applicationType);
if (appAdminPane == null) {
addSegment(new Label(GlobalizationUtil.globalize(
"ui.admin.SingletonApplicationPane.manage.heading")),
new Label(GlobalizationUtil.globalize(
"ui.admin.SingletonApplicationPane.manage.no_admin_pane_found",
new String[]{applicationType.getApplicationObjectType()})));
} else {
addSegment(new Label(GlobalizationUtil.globalize(
"ui.admin.SingletonApplicationPane.manage.heading")),
appAdminPane);
}
}
}

View File

@ -0,0 +1,73 @@
/*
* Copyright (c) 2013 Jens Pelzetter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.ui.admin.applications.tree;
import com.arsdigita.bebop.tree.TreeNode;
import com.arsdigita.ui.admin.ApplicationsAdministrationTab;
import com.arsdigita.web.Application;
/**
* Tree Node for the application tree representing an instance of a application.
*
* @author Jens Pelzetter <jens@jp-digital.de>
* @version $Id$
*
* @see ApplicationTreeModel
* @see ApplicationTreeModelBuilder
* @see ApplicationTypeTreeNode
* @see ApplicationsAdministrationTab
* @see TreeNode
*/
public class ApplicationInstanceTreeNode implements TreeNode {
/**
* The application instance represented by this {@code TreeNode}
*/
private final Application application;
/**
* Constructor
*
* @param application The application instance to represent by this {@code TreeNode}
*/
public ApplicationInstanceTreeNode(final Application application) {
this.application = application;
}
/**
* Returns the key for this {@link TreeNode}.
*
* @return The path of the application instance.
* @see TreeNode#getKey()
*/
public Object getKey() {
return application.getPath();
}
/**
* Data to show in the tree for this node.
*
* @return The title of the application instance
* @see TreeNode#getElement()
*/
public Object getElement() {
return application.getTitle();
}
}

View File

@ -0,0 +1,156 @@
/*
* Copyright (c) 2013 Jens Pelzetter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.ui.admin.applications.tree;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.tree.TreeModel;
import com.arsdigita.bebop.tree.TreeNode;
import com.arsdigita.ui.admin.ApplicationsAdministrationTab;
import com.arsdigita.web.Application;
import com.arsdigita.web.ApplicationCollection;
import com.arsdigita.web.ApplicationType;
import com.arsdigita.web.ApplicationTypeCollection;
import java.util.Iterator;
/**
* A {@link TreeModel} for the tree of applications in {@link ApplicationsAdministrationTab}. The tree consists of two
* different types of nodes: Nodes for {@link ApplicationTypes} and nodes for {@link Application} instances.
*
* @author Jens Pelzetter <jens@jp-digital.de>
* @version $Id$
*/
public class ApplicationTreeModel implements TreeModel {
public ApplicationTreeModel() {
//Nothing
}
public TreeNode getRoot(final PageState state) {
return new RootTreeNode();
}
public boolean hasChildren(final TreeNode node, final PageState state) {
if (node instanceof RootTreeNode) {
return true;
} else if (node instanceof ApplicationTypeTreeNode) {
final ApplicationTypeTreeNode typeTreeNode = (ApplicationTypeTreeNode) node;
if (typeTreeNode.getApplicationType().isSingleton()) {
return false;
} else {
return !retrieveApplicationInstances(typeTreeNode.getApplicationType()).isEmpty();
}
} else if (node instanceof ApplicationInstanceTreeNode) {
return false;
} else {
throw new IllegalArgumentException(
"The ApplicationTreeModel can only work with ApplicationTypeTreeNodes and"
+ "ApplicationInstanceTreeNodes.");
}
}
public Iterator getChildren(final TreeNode node, final PageState state) {
if (node instanceof RootTreeNode) {
final ApplicationTypeCollection appTypes = ApplicationType.retrieveAllApplicationTypes();
appTypes.addOrder("title");
return new AppTypesIterator(appTypes);
} else if (node instanceof ApplicationTypeTreeNode) {
final ApplicationTypeTreeNode typeTreeNode = (ApplicationTypeTreeNode) node;
final ApplicationType appType = typeTreeNode.getApplicationType();
final ApplicationCollection applications = Application.retrieveAllApplications(
appType.getApplicationObjectType());
applications.addOrder("title");
return new AppIterator(applications);
} else if (node instanceof ApplicationInstanceTreeNode) {
return null;
} else {
throw new IllegalArgumentException(
"The ApplicationTreeModel can only work with ApplicationTypeTreeNodes and"
+ "ApplicationInstanceTreeNodes.");
}
}
private ApplicationCollection retrieveApplicationInstances(final ApplicationType applicationType) {
final ApplicationCollection applications = Application.retrieveAllApplications();
applications.addEqualsFilter("objectType", applicationType.getApplicationObjectType());
return applications;
}
private class RootTreeNode implements TreeNode {
public RootTreeNode() {
//Nothing
}
public Object getKey() {
return "-1";
}
public Object getElement() {
return "/";
}
}
private class AppTypesIterator implements Iterator<ApplicationTypeTreeNode> {
private final ApplicationTypeCollection appTypes;
public AppTypesIterator(final ApplicationTypeCollection appTypes) {
this.appTypes = appTypes;
}
public boolean hasNext() {
return appTypes.next();
}
public ApplicationTypeTreeNode next() {
return new ApplicationTypeTreeNode(appTypes.getApplicationType());
}
public void remove() {
throw new UnsupportedOperationException("Not supported.");
}
}
private class AppIterator implements Iterator<ApplicationInstanceTreeNode> {
private final ApplicationCollection applications;
public AppIterator(final ApplicationCollection applications) {
this.applications = applications;
}
public boolean hasNext() {
return applications.next();
}
public ApplicationInstanceTreeNode next() {
return new ApplicationInstanceTreeNode(applications.getApplication());
}
public void remove() {
throw new UnsupportedOperationException("Not supported.");
}
}
}

View File

@ -0,0 +1,41 @@
/*
* Copyright (c) 2013 Jens Pelzetter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.ui.admin.applications.tree;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.Tree;
import com.arsdigita.bebop.tree.TreeModel;
import com.arsdigita.bebop.tree.TreeModelBuilder;
import com.arsdigita.ui.admin.ApplicationsAdministrationTab;
import com.arsdigita.util.LockableImpl;
/**
* The {@link TreeModelBuilder} creating the {@link TreeModel} for the applications tree used in
* {@link ApplicationsAdministrationTab}.
*
* @author Jens Pelzetter <jens@jp-digital.de>
* @version $Id$
*/
public class ApplicationTreeModelBuilder extends LockableImpl implements TreeModelBuilder {
public TreeModel makeModel(final Tree tree, final PageState state) {
tree.expand("-1", state);
return new ApplicationTreeModel();
}
}

View File

@ -0,0 +1,51 @@
/*
* Copyright (c) 2013 Jens Pelzetter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.ui.admin.applications.tree;
import com.arsdigita.bebop.tree.TreeNode;
import com.arsdigita.web.ApplicationType;
/**
* Tree Node implementation for the Application Tree in the Application
* admin tab.
*
* @author Jens Pelzetter <jens@jp-digital.de>
* @version $Id$
*/
public class ApplicationTypeTreeNode implements TreeNode {
private final ApplicationType applicationType;
public ApplicationTypeTreeNode(final ApplicationType applicationType) {
this.applicationType = applicationType;
}
public ApplicationType getApplicationType() {
return applicationType;
}
public Object getKey() {
return applicationType.getApplicationObjectType();
}
public Object getElement() {
return applicationType.getTitle();
}
}