src/pyams_skin/viewlet/toolbar/__init__.py
changeset 557 bca7a7e058a3
equal deleted inserted replaced
-1:000000000000 557:bca7a7e058a3
       
     1 #
       
     2 # Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
       
     3 # All Rights Reserved.
       
     4 #
       
     5 # This software is subject to the provisions of the Zope Public License,
       
     6 # Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
       
     7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
       
     8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
       
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
       
    10 # FOR A PARTICULAR PURPOSE.
       
    11 #
       
    12 
       
    13 __docformat__ = 'restructuredtext'
       
    14 
       
    15 
       
    16 # import standard library
       
    17 
       
    18 # import interfaces
       
    19 from pyams_skin.interfaces.container import ITableWithActions
       
    20 from pyams_skin.interfaces.viewlet import IToolbarViewletManager, IToolbarAction, IToolbarMenu, IToolbarMenuItem, \
       
    21     IContextActions, IToolbarAddingMenu, ITableItemColumnActionsMenu, IWidgetTitleViewletManager, IToolbarActionItem
       
    22 from pyams_skin.layer import IPyAMSLayer
       
    23 from pyams_utils.interfaces.tales import ITALESExtension
       
    24 from zope.contentprovider.interfaces import IContentProvider
       
    25 
       
    26 # import packages
       
    27 from pyams_template.template import template_config
       
    28 from pyams_utils.adapter import ContextRequestViewAdapter, adapter_config
       
    29 from pyams_utils.url import absolute_url
       
    30 from pyams_viewlet.manager import TemplateBasedViewletManager, WeightOrderedViewletManager, viewletmanager_config
       
    31 from pyams_viewlet.viewlet import Viewlet, viewlet_config
       
    32 from zope.interface import implementer, Interface
       
    33 from zope.schema.fieldproperty import FieldProperty
       
    34 
       
    35 from pyams_skin import _
       
    36 
       
    37 
       
    38 @viewletmanager_config(name='pyams.widget_title', view=Interface, layer=IPyAMSLayer, provides=IWidgetTitleViewletManager)
       
    39 class WidgetTitleViewletManager(WeightOrderedViewletManager):
       
    40     """Widget title extensions viewlet manager"""
       
    41 
       
    42 
       
    43 @viewletmanager_config(name='pyams.toolbar', view=Interface, layer=IPyAMSLayer, provides=IToolbarViewletManager)
       
    44 @template_config(template='manager.pt', layer=IPyAMSLayer)
       
    45 class TableToolbarViewletManager(TemplateBasedViewletManager, WeightOrderedViewletManager):
       
    46     """Table toolbar viewlet manager"""
       
    47 
       
    48 
       
    49 @template_config(template='action.pt', layer=IPyAMSLayer)
       
    50 @implementer(IToolbarAction)
       
    51 class ToolbarAction(Viewlet):
       
    52     """Base toolbar action class"""
       
    53 
       
    54     label = FieldProperty(IToolbarAction['label'])
       
    55     label_css_class = FieldProperty(IToolbarAction['label_css_class'])
       
    56     css_class = FieldProperty(IToolbarAction['css_class'])
       
    57     click_handler = FieldProperty(IToolbarAction['click_handler'])
       
    58     url = FieldProperty(IToolbarAction['url'])
       
    59     modal_target = FieldProperty(IToolbarAction['modal_target'])
       
    60 
       
    61     def get_url(self):
       
    62         context = getattr(self.__parent__, 'actions_context', self.context)
       
    63         return absolute_url(context, self.request, self.url)
       
    64 
       
    65 
       
    66 class JsToolbarAction(ToolbarAction):
       
    67     """Javascript toolbar action"""
       
    68 
       
    69     def get_url(self):
       
    70         return self.url
       
    71 
       
    72 
       
    73 @template_config(template='menu.pt', layer=IPyAMSLayer)
       
    74 @implementer(IToolbarMenu)
       
    75 class ToolbarMenu(TemplateBasedViewletManager, WeightOrderedViewletManager, Viewlet):
       
    76     """Base toolbar menu class"""
       
    77 
       
    78     label = FieldProperty(IToolbarMenu['label'])
       
    79     label_css_class = FieldProperty(IToolbarMenu['label_css_class'])
       
    80     css_class = FieldProperty(IToolbarMenu['css_class'])
       
    81     menu_css_class = FieldProperty(IToolbarMenu['menu_css_class'])
       
    82     click_handler = FieldProperty(IToolbarMenu['click_handler'])
       
    83     url = FieldProperty(IToolbarMenu['url'])
       
    84     modal_target = FieldProperty(IToolbarMenu['modal_target'])
       
    85 
       
    86     def __init__(self, context, request, view, manager=None):
       
    87         WeightOrderedViewletManager.__init__(self, context, request, view)
       
    88         Viewlet.__init__(self, context, request, view, manager)
       
    89 
       
    90     def update(self):
       
    91         WeightOrderedViewletManager.update(self)
       
    92 
       
    93     def get_url(self):
       
    94         return absolute_url(self.context, self.request, self.url)
       
    95 
       
    96     def render(self):
       
    97         return Viewlet.render(self)
       
    98 
       
    99 
       
   100 @viewlet_config(name='pyams.addings', view=Interface, layer=IPyAMSLayer, manager=IWidgetTitleViewletManager, weight=50)
       
   101 @viewletmanager_config(name='pyams.addings', view=Interface, layer=IPyAMSLayer, provides=IToolbarAddingMenu)
       
   102 @implementer(IToolbarAddingMenu)
       
   103 class ToolbarAddingMenu(ToolbarMenu):
       
   104     """Toolbar adding menu"""
       
   105 
       
   106     label = _("Add...")
       
   107     css_class = 'btn btn-xs btn-success dropdown-toggle'
       
   108     menu_css_class = 'dropdown-menu'
       
   109 
       
   110 
       
   111 @viewletmanager_config(name='pyams.table-item.actions', view=ITableWithActions, layer=IPyAMSLayer,
       
   112                        provides=ITableItemColumnActionsMenu)
       
   113 @implementer(ITableItemColumnActionsMenu)
       
   114 class TableItemColumnActionsMenu(ToolbarMenu):
       
   115     """Table item actions menu"""
       
   116 
       
   117     label = _("Actions...")
       
   118     label_css_class = ''
       
   119     css_class = 'btn btn-xs btn-info dropdown-toggle'
       
   120 
       
   121 
       
   122 @template_config(template='toolbar-item.pt', layer=IPyAMSLayer)
       
   123 @implementer(IToolbarActionItem)
       
   124 class ToolbarActionItem(Viewlet):
       
   125     """Toolbar action item class"""
       
   126 
       
   127     label = FieldProperty(IToolbarMenuItem['label'])
       
   128     label_css_class = FieldProperty(IToolbarMenuItem['label_css_class'])
       
   129     hint_gravity = FieldProperty(IToolbarActionItem['hint_gravity'])
       
   130     css_class = FieldProperty(IToolbarMenuItem['css_class'])
       
   131     click_handler = FieldProperty(IToolbarMenuItem['click_handler'])
       
   132     url = FieldProperty(IToolbarMenuItem['url'])
       
   133     modal_target = FieldProperty(IToolbarMenuItem['modal_target'])
       
   134     stop_propagation = FieldProperty(IToolbarMenuItem['stop_propagation'])
       
   135 
       
   136     def get_url(self):
       
   137         context = getattr(self.__parent__, 'actions_context', self.context)
       
   138         return absolute_url(context, self.request, self.url)
       
   139 
       
   140 
       
   141 class JsToolbarActionItem(ToolbarActionItem):
       
   142     """Javascript call toolbar action item"""
       
   143 
       
   144     def get_url(self):
       
   145         return self.url
       
   146 
       
   147 
       
   148 @template_config(template='menu-item.pt', layer=IPyAMSLayer)
       
   149 @implementer(IToolbarMenuItem)
       
   150 class ToolbarMenuItem(ToolbarActionItem):
       
   151     """Toolbar menu item class"""
       
   152 
       
   153 
       
   154 class JsToolbarMenuItem(ToolbarMenuItem):
       
   155     """Javascript call toolbar menu item"""
       
   156 
       
   157     def get_url(self):
       
   158         return self.url
       
   159 
       
   160 
       
   161 @template_config(template='menu-divider.pt', layer=IPyAMSLayer)
       
   162 @implementer(IToolbarMenuItem)
       
   163 class ToolbarMenuDivider(Viewlet):
       
   164     """Toolbar menu divider"""
       
   165 
       
   166     lebel = None
       
   167     css_class = 'divider'
       
   168 
       
   169 
       
   170 @viewlet_config(name='pyams.actions', view=Interface, layer=IPyAMSLayer, manager=IToolbarViewletManager, weight=999)
       
   171 @viewletmanager_config(name='pyams.actions', view=Interface, layer=IPyAMSLayer, provides=IContextActions)
       
   172 @template_config(template='menu.pt', layer=IPyAMSLayer)
       
   173 @implementer(IContextActions)
       
   174 class ContextActionsViewletManager(ToolbarMenu):
       
   175     """Context actions viewlet manager"""
       
   176 
       
   177     label = _("Other actions...")
       
   178     label_css_class = ''
       
   179     css_class = FieldProperty(IContextActions['css_class'])
       
   180 
       
   181 
       
   182 @adapter_config(name='context_actions', context=(Interface, Interface, Interface), provides=ITALESExtension)
       
   183 class ContextActionsExtension(ContextRequestViewAdapter):
       
   184     """extension:context_actions(context) TALES extension"""
       
   185 
       
   186     def render(self, context=None):
       
   187         if context is None:
       
   188             context = self.context
       
   189         registry = self.request.registry
       
   190         provider = registry.queryMultiAdapter((context, self.request, self.view), IContentProvider,
       
   191                                               name='pyams.actions')
       
   192         if provider is not None:
       
   193             provider.update()
       
   194             return provider