Added shared content title portlet
authorThierry Florac <thierry.florac@onf.fr>
Tue, 25 Sep 2018 11:23:25 +0200
changeset 978 7a95fe7d51b0
parent 977 4f1a82f040c4
child 979 5e51b05a38fa
Added shared content title portlet
src/pyams_content/component/paragraph/portlet/__init__.py
src/pyams_content/component/paragraph/portlet/interfaces/__init__.py
src/pyams_content/component/paragraph/portlet/zmi/__init__.py
src/pyams_content/component/paragraph/portlet/zmi/templates/navigation-preview.pt
src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.mo
src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.po
src/pyams_content/locales/pyams_content.pot
src/pyams_content/shared/common/portlet/interfaces/__init__.py
src/pyams_content/shared/common/portlet/title.py
src/pyams_content/shared/common/portlet/zmi/templates/title-preview.pt
src/pyams_content/shared/common/portlet/zmi/title.py
--- a/src/pyams_content/component/paragraph/portlet/__init__.py	Mon Sep 24 16:17:34 2018 +0200
+++ b/src/pyams_content/component/paragraph/portlet/__init__.py	Tue Sep 25 11:23:25 2018 +0200
@@ -22,18 +22,19 @@
 # import packages
 from pyams_content.component.paragraph import BaseParagraph
 # import interfaces
-from pyams_content.component.paragraph.interfaces import IParagraphFactory, IParagraphContainerTarget, \
-    IParagraphContainer
+from pyams_content.component.paragraph.interfaces import IParagraphContainer, IParagraphContainerTarget, \
+    IParagraphFactory
 from pyams_content.component.paragraph.portlet.interfaces import IParagraphContainerPortletSettings, \
     IParagraphNavigationPortletSettings
 from pyams_i18n.interfaces import II18n
-from pyams_portal.portlet import PortletSettings, portlet_config, Portlet
+from pyams_portal.portlet import Portlet, PortletSettings, portlet_config
 from pyams_utils.factory import factory_config
 from pyams_utils.interfaces import VIEW_PERMISSION
 from pyams_utils.registry import get_global_registry
 from pyams_utils.request import check_request
 from pyams_utils.traversing import get_parent
 
+
 #
 # Paragraphs container portlet
 #
@@ -98,7 +99,6 @@
 class ParagraphNavigationPortletSettings(PortletSettings):
     """Paragraph navigation portlet settings"""
 
-    display_title = FieldProperty(IParagraphNavigationPortletSettings['display_title'])
     paragraphs = FieldProperty(IParagraphNavigationPortletSettings['paragraphs'])
     factories = FieldProperty(IParagraphNavigationPortletSettings['factories'])
     anchors_only = FieldProperty(IParagraphNavigationPortletSettings['anchors_only'])
--- a/src/pyams_content/component/paragraph/portlet/interfaces/__init__.py	Mon Sep 24 16:17:34 2018 +0200
+++ b/src/pyams_content/component/paragraph/portlet/interfaces/__init__.py	Tue Sep 25 11:23:25 2018 +0200
@@ -16,7 +16,7 @@
 # import standard library
 
 # import packages
-from zope.schema import Bool, Set, Choice, List
+from zope.schema import Bool, Choice, List, Set
 
 from pyams_content import _
 # import interfaces
@@ -49,11 +49,6 @@
 class IParagraphNavigationPortletSettings(IPortletSettings):
     """Paragraphs container navigation settings interface"""
 
-    display_title = Bool(title=_("Display content title?"),
-                         description=_("If 'no', content's title will not be repeated into navigation portlet"),
-                         required=True,
-                         default=True)
-
     paragraphs = List(title=_("Selected paragraphs"),
                       description=_("List of paragraphs selected for navigation; an empty selection means that "
                                     "all paragraphs will be selectable by following filters; otherwise, "
--- a/src/pyams_content/component/paragraph/portlet/zmi/__init__.py	Mon Sep 24 16:17:34 2018 +0200
+++ b/src/pyams_content/component/paragraph/portlet/zmi/__init__.py	Tue Sep 25 11:23:25 2018 +0200
@@ -9,34 +9,28 @@
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE.
 #
-from pyams_content.component.paragraph.portlet import IParagraphNavigationPortletSettings
 
 __docformat__ = 'restructuredtext'
 
-
-# import standard library
-
-# import interfaces
-from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget
-from pyams_content.component.paragraph.portlet.interfaces import IParagraphContainerPortletSettings
-from pyams_form.interfaces.form import IInnerTabForm
-from pyams_pagelet.interfaces import IPagelet
-from pyams_portal.interfaces import IPortletPreviewer
-from pyams_skin.layer import IPyAMSLayer
-from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
-from pyams_utils.interfaces.data import IObjectData
-
-# import packages
-from pyams_form.form import AJAXEditForm
-from pyams_pagelet.pagelet import pagelet_config
-from pyams_portal.portlet import PortletPreviewer
-from pyams_portal.zmi.portlet import PortletSettingsEditor, PortletSettingsPropertiesEditor
-from pyams_template.template import template_config
-from pyams_utils.adapter import adapter_config
-from pyams_utils.traversing import get_parent
 from zope.interface import Interface, alsoProvides
 
 from pyams_content import _
+from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget
+from pyams_content.component.paragraph.portlet import IParagraphNavigationPortletSettings
+from pyams_content.component.paragraph.portlet.interfaces import IParagraphContainerPortletSettings
+from pyams_form.form import AJAXEditForm
+from pyams_form.interfaces.form import IInnerTabForm
+from pyams_pagelet.interfaces import IPagelet
+from pyams_pagelet.pagelet import pagelet_config
+from pyams_portal.interfaces import IPortletPreviewer
+from pyams_portal.portlet import PortletPreviewer
+from pyams_portal.zmi.portlet import PortletSettingsEditor, PortletSettingsPropertiesEditor
+from pyams_skin.layer import IPyAMSLayer
+from pyams_template.template import template_config
+from pyams_utils.adapter import adapter_config
+from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
+from pyams_utils.interfaces.data import IObjectData
+from pyams_utils.traversing import get_parent
 
 
 #
--- a/src/pyams_content/component/paragraph/portlet/zmi/templates/navigation-preview.pt	Mon Sep 24 16:17:34 2018 +0200
+++ b/src/pyams_content/component/paragraph/portlet/zmi/templates/navigation-preview.pt	Tue Sep 25 11:23:25 2018 +0200
@@ -1,8 +1,4 @@
 <tal:var define="settings view.settings" i18n:domain="pyams_content">
-	<div class="padding-5">
-		<i class="fa fa-fw fa-${'check-' if settings.display_title else ''}square-o"></i>
-		<span i18n:translate="">Display content title</span>
-	</div>
 	<div class="padding-5" tal:condition="settings.paragraphs">
 		<i class="fa fa-fw fa-${'check-' if settings.paragraphs else ''}square-o"></i>
 		<span i18n:translate="">Selected paragraphs: </span>
Binary file src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.mo has changed
--- a/src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.po	Mon Sep 24 16:17:34 2018 +0200
+++ b/src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.po	Tue Sep 25 11:23:25 2018 +0200
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE 1.0\n"
-"POT-Creation-Date: 2018-09-24 16:10+0200\n"
+"POT-Creation-Date: 2018-09-25 11:21+0200\n"
 "PO-Revision-Date: 2015-09-10 10:42+0200\n"
 "Last-Translator: Thierry Florac <tflorac@ulthar.net>\n"
 "Language-Team: French\n"
@@ -1008,46 +1008,42 @@
 msgid "Content paragraphs"
 msgstr "Blocs de contenu"
 
-#: src/pyams_content/component/paragraph/portlet/__init__.py:135
+#: src/pyams_content/component/paragraph/portlet/__init__.py:134
 msgid "Paragraphs navigation anchors"
 msgstr "Navigation au sein des blocs"
 
-#: src/pyams_content/component/paragraph/portlet/zmi/__init__.py:73
-#: src/pyams_content/component/paragraph/portlet/zmi/__init__.py:128
+#: src/pyams_content/component/paragraph/portlet/zmi/__init__.py:68
+#: src/pyams_content/component/paragraph/portlet/zmi/__init__.py:123
 msgid "No filter, all paragraphs selected"
 msgstr "Pas de filtre, tous les blocs sont acceptés"
 
-#: src/pyams_content/component/paragraph/portlet/zmi/__init__.py:80
-#: src/pyams_content/component/paragraph/portlet/zmi/__init__.py:135
+#: src/pyams_content/component/paragraph/portlet/zmi/__init__.py:75
+#: src/pyams_content/component/paragraph/portlet/zmi/__init__.py:130
 msgid "No filter, all paragraph types selected"
 msgstr "Pas de filtre, tous les types de blocs sont acceptés"
 
 #: src/pyams_content/component/paragraph/portlet/zmi/templates/navigation-preview.pt:4
-msgid "Display content title"
-msgstr "Afficher le titre"
-
-#: src/pyams_content/component/paragraph/portlet/zmi/templates/navigation-preview.pt:8
 #: src/pyams_content/component/paragraph/portlet/zmi/templates/container-preview.pt:4
 msgid "Selected paragraphs:"
 msgstr "Blocs sélectionnés :"
 
-#: src/pyams_content/component/paragraph/portlet/zmi/templates/navigation-preview.pt:14
+#: src/pyams_content/component/paragraph/portlet/zmi/templates/navigation-preview.pt:10
 #: src/pyams_content/component/paragraph/portlet/zmi/templates/container-preview.pt:10
 msgid "Paragraphs filters:"
 msgstr "Filtrage des blocs :"
 
-#: src/pyams_content/component/paragraph/portlet/zmi/templates/navigation-preview.pt:17
+#: src/pyams_content/component/paragraph/portlet/zmi/templates/navigation-preview.pt:13
 #: src/pyams_content/component/paragraph/portlet/zmi/templates/container-preview.pt:13
 msgid "Selected paragraph types:"
 msgstr "Types de blocs :"
 
-#: src/pyams_content/component/paragraph/portlet/zmi/templates/navigation-preview.pt:22
+#: src/pyams_content/component/paragraph/portlet/zmi/templates/navigation-preview.pt:18
 #: src/pyams_content/component/paragraph/portlet/zmi/templates/container-preview.pt:18
 msgid "Only display anchors"
 msgstr "Ne sélectionner que les ancres"
 
 #: src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:30
-#: src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:57
+#: src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:52
 msgid "Selected paragraphs"
 msgstr "Blocs sélectionnés"
 
@@ -1063,7 +1059,7 @@
 "pas appliqués"
 
 #: src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:37
-#: src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:64
+#: src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:59
 msgid "Paragraph types"
 msgstr "Types de blocs"
 
@@ -1076,7 +1072,7 @@
 "est vide, tous les types de blocs seront pris en compte"
 
 #: src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:43
-#: src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:70
+#: src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:65
 msgid "Anchors only?"
 msgstr "Ancres seulement ?"
 
@@ -1086,17 +1082,7 @@
 "Si 'oui', seuls les blocs définis comme ancres de navigation seront "
 "sélectionnés"
 
-#: src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:52
-msgid "Display content title?"
-msgstr "Afficher le titre ?"
-
 #: src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:53
-msgid "If 'no', content's title will not be repeated into navigation portlet"
-msgstr ""
-"Si 'non', le titre du gabarit ne sera pas répété dans le composant de "
-"navigation"
-
-#: src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:58
 msgid ""
 "List of paragraphs selected for navigation; an empty selection means that "
 "all paragraphs will be selectable by following filters; otherwise, this "
@@ -1107,7 +1093,7 @@
 "dessous ; dans le cas contraire, cette sélection devient prioritaire et les "
 "autres filtres ne sont pas appliqués"
 
-#: src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:65
+#: src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:60
 msgid ""
 "Select list of paragraph types you want to use for navigation; an empty "
 "selection means that all paragraphs types will be selected"
@@ -1116,7 +1102,7 @@
 "navigation ; si la sélection est vide, tous les types de blocs seront pris "
 "en compte"
 
-#: src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:71
+#: src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:66
 msgid "If 'no', all paragraphs will be used as navigation anchors"
 msgstr ""
 "Si 'non', tous les blocs seront utilisés comme liens de navigation même si "
@@ -3162,6 +3148,10 @@
 msgid "This content is already retired and not visible."
 msgstr "Ce contenu est déjà retiré et n'est plus visible des internautes."
 
+#: src/pyams_content/shared/common/portlet/title.py:39
+msgid "Content title"
+msgstr "Titre du gabarit"
+
 #: src/pyams_content/shared/common/portlet/head.py:46
 msgid "Content header"
 msgstr "En-tête de gabarit"
@@ -5961,6 +5951,18 @@
 msgid "Hidden header"
 msgstr "Ne pas afficher d'en-tête de pages"
 
+#~ msgid "Display content title"
+#~ msgstr "Afficher le titre"
+
+#~ msgid "Display content title?"
+#~ msgstr "Afficher le titre ?"
+
+#~ msgid ""
+#~ "If 'no', content's title will not be repeated into navigation portlet"
+#~ msgstr ""
+#~ "Si 'non', le titre du gabarit ne sera pas répété dans le composant de "
+#~ "navigation"
+
 #~ msgid "({0} medias)"
 #~ msgstr "({0} médias dans la galerie)"
 
@@ -6235,9 +6237,6 @@
 #~ msgid "Images data"
 #~ msgstr "Image(s) à ajouter"
 
-#~ msgid "Content type"
-#~ msgstr "Type de contenu"
-
 #~ msgid "A publication request has been submitted for content « {0} »"
 #~ msgstr "Une demande de publication a été soumise pour le contenu « {0} »"
 
--- a/src/pyams_content/locales/pyams_content.pot	Mon Sep 24 16:17:34 2018 +0200
+++ b/src/pyams_content/locales/pyams_content.pot	Tue Sep 25 11:23:25 2018 +0200
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE 1.0\n"
-"POT-Creation-Date: 2018-09-24 16:10+0200\n"
+"POT-Creation-Date: 2018-09-25 11:21+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -966,46 +966,42 @@
 msgid "Content paragraphs"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/portlet/__init__.py:135
+#: ./src/pyams_content/component/paragraph/portlet/__init__.py:134
 msgid "Paragraphs navigation anchors"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/portlet/zmi/__init__.py:73
-#: ./src/pyams_content/component/paragraph/portlet/zmi/__init__.py:128
+#: ./src/pyams_content/component/paragraph/portlet/zmi/__init__.py:68
+#: ./src/pyams_content/component/paragraph/portlet/zmi/__init__.py:123
 msgid "No filter, all paragraphs selected"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/portlet/zmi/__init__.py:80
-#: ./src/pyams_content/component/paragraph/portlet/zmi/__init__.py:135
+#: ./src/pyams_content/component/paragraph/portlet/zmi/__init__.py:75
+#: ./src/pyams_content/component/paragraph/portlet/zmi/__init__.py:130
 msgid "No filter, all paragraph types selected"
 msgstr ""
 
 #: ./src/pyams_content/component/paragraph/portlet/zmi/templates/navigation-preview.pt:4
-msgid "Display content title"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/portlet/zmi/templates/navigation-preview.pt:8
 #: ./src/pyams_content/component/paragraph/portlet/zmi/templates/container-preview.pt:4
 msgid "Selected paragraphs:"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/portlet/zmi/templates/navigation-preview.pt:14
+#: ./src/pyams_content/component/paragraph/portlet/zmi/templates/navigation-preview.pt:10
 #: ./src/pyams_content/component/paragraph/portlet/zmi/templates/container-preview.pt:10
 msgid "Paragraphs filters:"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/portlet/zmi/templates/navigation-preview.pt:17
+#: ./src/pyams_content/component/paragraph/portlet/zmi/templates/navigation-preview.pt:13
 #: ./src/pyams_content/component/paragraph/portlet/zmi/templates/container-preview.pt:13
 msgid "Selected paragraph types:"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/portlet/zmi/templates/navigation-preview.pt:22
+#: ./src/pyams_content/component/paragraph/portlet/zmi/templates/navigation-preview.pt:18
 #: ./src/pyams_content/component/paragraph/portlet/zmi/templates/container-preview.pt:18
 msgid "Only display anchors"
 msgstr ""
 
 #: ./src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:30
-#: ./src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:57
+#: ./src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:52
 msgid "Selected paragraphs"
 msgstr ""
 
@@ -1017,7 +1013,7 @@
 msgstr ""
 
 #: ./src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:37
-#: ./src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:64
+#: ./src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:59
 msgid "Paragraph types"
 msgstr ""
 
@@ -1028,7 +1024,7 @@
 msgstr ""
 
 #: ./src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:43
-#: ./src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:70
+#: ./src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:65
 msgid "Anchors only?"
 msgstr ""
 
@@ -1036,28 +1032,20 @@
 msgid "If 'yes', only paragraphs set as 'anchors' will be selected"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:52
-msgid "Display content title?"
-msgstr ""
-
 #: ./src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:53
-msgid "If 'no', content's title will not be repeated into navigation portlet"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:58
 msgid ""
 "List of paragraphs selected for navigation; an empty selection means that all"
 " paragraphs will be selectable by following filters; otherwise, this "
 "selection will have priority"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:65
+#: ./src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:60
 msgid ""
 "Select list of paragraph types you want to use for navigation; an empty "
 "selection means that all paragraphs types will be selected"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:71
+#: ./src/pyams_content/component/paragraph/portlet/interfaces/__init__.py:66
 msgid "If 'no', all paragraphs will be used as navigation anchors"
 msgstr ""
 
@@ -2977,6 +2965,10 @@
 msgid "This content is already retired and not visible."
 msgstr ""
 
+#: ./src/pyams_content/shared/common/portlet/title.py:39
+msgid "Content title"
+msgstr ""
+
 #: ./src/pyams_content/shared/common/portlet/head.py:46
 msgid "Content header"
 msgstr ""
--- a/src/pyams_content/shared/common/portlet/interfaces/__init__.py	Mon Sep 24 16:17:34 2018 +0200
+++ b/src/pyams_content/shared/common/portlet/interfaces/__init__.py	Tue Sep 25 11:23:25 2018 +0200
@@ -15,10 +15,9 @@
 from zope.interface import Interface
 from zope.schema import Bool
 
+from pyams_content import _
 from pyams_portal.interfaces import IPortletSettings
 
-from pyams_content import _
-
 
 class ISharedContentHeaderPortletSettings(IPortletSettings):
     """Shared content header portlet settings"""
@@ -47,3 +46,7 @@
 
 class ISharedContentHeadViewletManager(Interface):
     """Shared content head viewlet manager marker interface"""
+
+
+class ISharedContentTitlePortletSettings(IPortletSettings):
+    """Shared content title portlet settings"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_content/shared/common/portlet/title.py	Tue Sep 25 11:23:25 2018 +0200
@@ -0,0 +1,42 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+from zope.interface import implementer
+
+from pyams_content import _
+from pyams_content.shared.common.portlet.interfaces import ISharedContentTitlePortletSettings
+from pyams_portal.portlet import Portlet, PortletSettings, portlet_config
+from pyams_utils.factory import factory_config
+from pyams_utils.interfaces import VIEW_PERMISSION
+
+
+SHARED_CONTENT_TITLE_PORTLET_NAME = 'pyams_content.portlet.shared.title'
+
+
+@implementer(ISharedContentTitlePortletSettings)
+@factory_config(provided=ISharedContentTitlePortletSettings)
+class SharedContentTitlePortletSettings(PortletSettings):
+    """Shared content title portlet settings"""
+
+
+@portlet_config(permission=VIEW_PERMISSION)
+class SharedContentTitlePortlet(Portlet):
+    """Shared content title portlet"""
+
+    name = SHARED_CONTENT_TITLE_PORTLET_NAME
+    label = _("Content title")
+
+    toolbar_css_class = 'fa fa-fw fa-2x fa-bold'
+
+    settings_factory = ISharedContentTitlePortletSettings
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_content/shared/common/portlet/zmi/title.py	Tue Sep 25 11:23:25 2018 +0200
@@ -0,0 +1,55 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+from zope.interface import Interface
+
+from pyams_content.shared.common.portlet.interfaces import ISharedContentTitlePortletSettings
+from pyams_form.form import AJAXEditForm
+from pyams_form.interfaces.form import IInnerTabForm
+from pyams_pagelet.interfaces import IPagelet
+from pyams_pagelet.pagelet import pagelet_config
+from pyams_portal.interfaces import IPortletPreviewer
+from pyams_portal.portlet import PortletPreviewer
+from pyams_portal.zmi.portlet import PortletSettingsEditor, PortletSettingsPropertiesEditor
+from pyams_skin.layer import IPyAMSLayer
+from pyams_template.template import template_config
+from pyams_utils.adapter import adapter_config
+from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
+
+
+@pagelet_config(name='properties.html', context=ISharedContentTitlePortletSettings, layer=IPyAMSLayer,
+                permission=VIEW_SYSTEM_PERMISSION)
+class SharedContentTitlePortletSettingsEditor(PortletSettingsEditor):
+    """Shared content title portlet settings editor"""
+
+    settings = ISharedContentTitlePortletSettings
+
+
+@adapter_config(name='properties', context=(Interface, IPyAMSLayer, SharedContentTitlePortletSettingsEditor),
+                provides=IInnerTabForm)
+class SharedContentTitlePortletSettingsPropertiesEditor(PortletSettingsPropertiesEditor):
+    """Shared content title portlet settings properties editor"""
+
+
+@adapter_config(name='properties.json', context=(ISharedContentTitlePortletSettings, IPyAMSLayer),
+                provides=IPagelet)
+class SharedContentTitlePortletAJAXEditor(AJAXEditForm, SharedContentTitlePortletSettingsEditor):
+    """Shared content title portlet settings editor, JSON renderer"""
+
+
+@adapter_config(context=(Interface, IPyAMSLayer, Interface, ISharedContentTitlePortletSettings),
+                provides=IPortletPreviewer)
+@template_config(template='templates/title-preview.pt', layer=IPyAMSLayer)
+class SharedContentTitlePortletPreviewer(PortletPreviewer):
+    """Shared content title portlet previewer"""