src/pyams_content/component/paragraph/zmi/pictogram.py
changeset 527 5dd1aa8bedd9
parent 516 a3f26cfd3094
child 550 9658debb49a3
--- a/src/pyams_content/component/paragraph/zmi/pictogram.py	Wed Apr 11 16:44:46 2018 +0200
+++ b/src/pyams_content/component/paragraph/zmi/pictogram.py	Wed Apr 11 16:46:31 2018 +0200
@@ -29,7 +29,6 @@
 from pyams_i18n.interfaces import II18n
 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu, IWidgetTitleViewletManager
 from pyams_skin.layer import IPyAMSLayer
-from pyams_utils.interfaces import MANAGE_PERMISSION
 from pyams_zmi.interfaces import IPropertiesEditForm
 from z3c.form.interfaces import INPUT_MODE
 from z3c.table.interfaces import IValues, IColumn
@@ -41,23 +40,23 @@
     BaseParagraphPropertiesEditForm, BaseParagraphAJAXEditForm
 from pyams_content.features.renderer.zmi import BaseRenderedContentRenderer
 from pyams_content.features.renderer.zmi.widget import RendererFieldWidget
-from pyams_content.skin import pyams_content
 from pyams_form.form import AJAXAddForm, AJAXEditForm
 from pyams_form.security import ProtectedFormObjectMixin
 from pyams_i18n.column import I18nAttrColumn
 from pyams_pagelet.pagelet import pagelet_config
-from pyams_skin.table import BaseTable, SorterColumn, JsActionColumn, I18nColumn, TrashColumn
+from pyams_skin.container import switch_element_visibility
+from pyams_skin.event import get_json_widget_refresh_event, get_json_switched_table_refresh_event, \
+    get_json_table_row_refresh_event
+from pyams_skin.table import BaseTable, SorterColumn, I18nColumn, TrashColumn, VisibilitySwitcherColumn
 from pyams_skin.viewlet.toolbar import ToolbarAction
-from pyams_template.template import template_config
 from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter
-from pyams_utils.fanstatic import get_resource_path
 from pyams_utils.text import get_text_start
 from pyams_utils.traversing import get_parent
 from pyams_utils.url import absolute_url
 from pyams_viewlet.viewlet import viewlet_config
-from pyams_zmi.form import AdminDialogAddForm, InnerAdminDisplayForm, AdminDialogEditForm
+from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
+from pyams_zmi.zmi.table import InnerTableView
 from pyramid.decorator import reify
-from pyramid.exceptions import NotFound
 from pyramid.view import view_config
 from z3c.form import field, button
 from z3c.table.column import GetAttrColumn
@@ -115,6 +114,8 @@
 class PictogramParagraphPropertiesEditForm(BaseParagraphPropertiesEditForm):
     """Pictogram paragraph properties edit form"""
 
+    prefix = 'pictograms_properties.'
+
     @property
     def title(self):
         content = get_parent(self.context, IWfSharedContent)
@@ -161,20 +162,8 @@
         output = super(PictogramParagraphInnerAJAXEditForm, self).get_ajax_output(changes)
         updated = changes.get(IPictogramParagraph, ())
         if 'renderer' in updated:
-            form = PictogramParagraphInnerEditForm(self.context, self.request)
-            form.update()
-            output.setdefault('events', []).append({
-                'event': 'myams.refresh',
-                'options': {
-                    'handler': 'MyAMS.skin.refreshWidget',
-                    'parent_id': '{0}_{1}_{2}'.format(
-                        self.context.__class__.__name__,
-                        getattr(form.getContent(), '__name__', 'noname').replace('++', ''),
-                        form.id),
-                    'widget_name': form.widgets['renderer'].name,
-                    'content': form.widgets['renderer'].render()
-                }
-            })
+            output.setdefault('events', []).append(
+                get_json_widget_refresh_event(self.context, self.request, PictogramParagraphInnerEditForm, 'renderer'))
         return output
 
 
@@ -194,9 +183,7 @@
 class PictogramsTable(ProtectedFormObjectMixin, BaseTable):
     """Pictograms view inner table"""
 
-    @property
-    def id(self):
-        return 'pictograms_{0}_list'.format(self.context.__name__)
+    prefix = 'pictograms'
 
     hide_header = True
     sortOn = None
@@ -214,17 +201,11 @@
         attributes = super(PictogramsTable, self).data_attributes
         attributes['table'] = {
             'id': self.id,
-            'data-ams-plugins': 'pyams_content',
-            'data-ams-plugin-pyams_content-src': get_resource_path(pyams_content),
             'data-ams-location': absolute_url(IPictogramContainer(self.context), self.request),
             'data-ams-tablednd-drag-handle': 'td.sorter',
-            'data-ams-tablednd-drop-target': 'set-pictograms-order.json'
+            'data-ams-tablednd-drop-target': 'set-pictograms-order.json',
+            'data-ams-visibility-switcher': 'switch-pictogram-visibility.json'
         }
-        attributes.setdefault('tr', {}).update({
-            'id': lambda x, col: 'pictogram_{0}::{1}'.format(get_parent(x, IPictogramContainerTarget).__name__,
-                                                             x.__name__),
-            'data-ams-delete-target': 'delete-pictogram.json'
-        })
         return attributes
 
     @reify
@@ -276,43 +257,15 @@
 
 @adapter_config(name='show-hide', context=(IPictogramContainerTarget, IPyAMSLayer, PictogramsTable),
                 provides=IColumn)
-class PictogramsTableShowHideColumn(ProtectedFormObjectMixin, JsActionColumn):
+class PictogramsTableShowHideColumn(ProtectedFormObjectMixin, VisibilitySwitcherColumn):
     """Pictograms container visibility switcher column"""
 
-    cssClasses = {'th': 'action',
-                  'td': 'action switcher'}
 
-    icon_class = 'fa fa-fw fa-eye'
-    icon_hint = _("Switch pictogram visibility")
-
-    url = 'PyAMS_content.pictograms.switchVisibility'
-
-    weight = 5
-
-    def get_icon(self, item):
-        if item.visible:
-            icon_class = 'fa fa-fw fa-eye'
-        else:
-            icon_class = 'fa fa-fw fa-eye-slash text-danger'
-        return '<i class="{icon_class}"></i>'.format(icon_class=icon_class)
-
-    def renderCell(self, item):
-        if self.permission and not self.request.has_permission(self.permission, context=item):
-            return self.get_icon(item)
-        else:
-            return super(PictogramsTableShowHideColumn, self).renderCell(item)
-
-
-@view_config(name='set-pictogram-visibility.json', context=IPictogramContainer, request_type=IPyAMSLayer,
+@view_config(name='switch-pictogram-visibility.json', context=IPictogramContainer, request_type=IPyAMSLayer,
              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
-def set_pictogram_visibility(request):
+def switch_pictogram_visibility(request):
     """Set pictogram visibility"""
-    container = IPictogramContainer(request.context)
-    pictogram = container.get(str(request.params.get('object_name')))
-    if pictogram is None:
-        raise NotFound()
-    pictogram.visible = not pictogram.visible
-    return {'visible': pictogram.visible}
+    return switch_element_visibility(request, IPictogramContainer)
 
 
 @adapter_config(name='name', context=(IPictogramContainerTarget, IPyAMSLayer, PictogramsTable), provides=IColumn)
@@ -350,50 +303,16 @@
     """Pictograms table trash column"""
 
 
-@view_config(name='delete-pictogram.json', context=IPictogramContainer, request_type=IPyAMSLayer,
-             permission=MANAGE_PERMISSION, renderer='json', xhr=True)
-def delete_pictogram(request):
-    """Delete pictogram"""
-    translate = request.localizer.translate
-    name = request.params.get('object_name')
-    if not name:
-        return {
-            'status': 'message',
-            'messagebox': {
-                'status': 'error',
-                'content': translate(_("No provided object_name argument!"))
-            }
-        }
-    if name not in request.context:
-        return {
-            'status': 'message',
-            'messagebox': {
-                'status': 'error',
-                'content': translate(_("Given pictogram name doesn't exist!"))
-            }
-        }
-    del request.context[name]
-    return {'status': 'success'}
-
-
 @adapter_config(name='pictograms', context=(IPictogramContainerTarget, IPyAMSLayer, IPictogramsParentForm),
                 provides=IInnerSubForm)
-@template_config(template='templates/pictograms.pt', layer=IPyAMSLayer)
 @implementer(IPictogramsView)
-class PictogramsView(InnerAdminDisplayForm):
+class PictogramsView(InnerTableView):
     """Pictograms view"""
 
-    fields = field.Fields(Interface)
-    weight = 100
+    title = _("Pictograms")
 
-    def __init__(self, context, request, view):
-        super(PictogramsView, self).__init__(context, request, view)
-        self.table = PictogramsTable(context, request)
-        self.table.view = self
-
-    def update(self):
-        super(PictogramsView, self).update()
-        self.table.update()
+    table_class = PictogramsTable
+    weight = 100
 
 
 #
@@ -441,19 +360,10 @@
     """Pictogram add form, JSON renderer"""
 
     def get_ajax_output(self, changes):
-        table = PictogramsTable(self.context, self.request)
-        table.update()
         return {
             'status': 'success',
             'message': self.request.localizer.translate(_("Pictogram was correctly added")),
-            'events': [{
-                'event': 'myams.refresh',
-                'options': {
-                    'handler': 'PyAMS_content.pictograms.refreshPictograms',
-                    'object_id': table.id,
-                    'table': table.render()
-                }
-            }]
+            'events': [get_json_switched_table_refresh_event(self.context, self.request, PictogramsTable), ]
         }
 
 
@@ -461,6 +371,8 @@
 class PictogramPropertiesEditForm(AdminDialogEditForm):
     """Pictogram properties edit form"""
 
+    prefix = 'pictogram_properties.'
+
     legend = _("Edit pictogram properties")
     icon_css_class = 'fa fa-fw fa-linode'
 
@@ -484,16 +396,6 @@
         updated = changes.get(IPictogramItem, ())
         if updated:
             target = get_parent(self.context, IPictogramContainerTarget)
-            table = PictogramsTable(target, self.request)
-            table.update()
-            row = table.setUpRow(self.context)
-            output.setdefault('events', []).append({
-                'event': 'myams.refresh',
-                'options': {
-                    'handler': 'MyAMS.skin.refreshRow',
-                    'object_id': 'pictogram_{0}::{1}'.format(target.__name__,
-                                                             self.context.__name__),
-                    'row': table.renderRow(row)
-                }
-            })
+            output.setdefault('events', []).append(
+                get_json_table_row_refresh_event(target, self.request, PictogramsTable, self.context))
         return output