src/pyams_content/shared/form/zmi/field.py
changeset 527 5dd1aa8bedd9
parent 501 3407e6940f6a
child 591 b694d5667d17
equal deleted inserted replaced
526:b15153f45957 527:5dd1aa8bedd9
    36 from pyams_content.shared.common.zmi import WfModifiedContentColumnMixin
    36 from pyams_content.shared.common.zmi import WfModifiedContentColumnMixin
    37 from pyams_content.shared.form.field import FormField
    37 from pyams_content.shared.form.field import FormField
    38 from pyams_form.form import AJAXAddForm, AJAXEditForm
    38 from pyams_form.form import AJAXAddForm, AJAXEditForm
    39 from pyams_form.security import ProtectedFormObjectMixin
    39 from pyams_form.security import ProtectedFormObjectMixin
    40 from pyams_pagelet.pagelet import pagelet_config
    40 from pyams_pagelet.pagelet import pagelet_config
    41 from pyams_skin.table import BaseTable, SorterColumn, JsActionColumn, I18nColumn, TrashColumn, I18nValueColumn
    41 from pyams_skin.container import switch_element_visibility
       
    42 from pyams_skin.table import BaseTable, SorterColumn, I18nColumn, TrashColumn, I18nValueColumn, \
       
    43     VisibilitySwitcherColumn
    42 from pyams_skin.viewlet.menu import MenuItem
    44 from pyams_skin.viewlet.menu import MenuItem
    43 from pyams_skin.viewlet.toolbar import ToolbarAction
    45 from pyams_skin.viewlet.toolbar import ToolbarAction
    44 from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter
    46 from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter
    45 from pyams_utils.fanstatic import get_resource_path
    47 from pyams_utils.fanstatic import get_resource_path
    46 from pyams_utils.traversing import get_parent
    48 from pyams_utils.traversing import get_parent
    48 from pyams_viewlet.viewlet import viewlet_config
    50 from pyams_viewlet.viewlet import viewlet_config
    49 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
    51 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
    50 from pyams_zmi.view import ContainerAdminView
    52 from pyams_zmi.view import ContainerAdminView
    51 from pyramid.decorator import reify
    53 from pyramid.decorator import reify
    52 from pyramid.events import subscriber
    54 from pyramid.events import subscriber
    53 from pyramid.exceptions import NotFound
       
    54 from pyramid.view import view_config
    55 from pyramid.view import view_config
    55 from z3c.form import field
    56 from z3c.form import field
    56 from z3c.table.column import GetAttrColumn
    57 from z3c.table.column import GetAttrColumn
    57 from zope.interface import Invalid
    58 from zope.interface import Invalid
    58 
    59 
    74 #
    75 #
    75 
    76 
    76 class FormFieldsContainerTable(ProtectedFormObjectMixin, BaseTable):
    77 class FormFieldsContainerTable(ProtectedFormObjectMixin, BaseTable):
    77     """Form fields table"""
    78     """Form fields table"""
    78 
    79 
    79     id = 'form_fields_list'
    80     prefix = 'form_fields'
       
    81 
    80     hide_header = True
    82     hide_header = True
    81     sortOn = None
    83     sortOn = None
    82 
    84 
    83     @property
    85     @property
    84     def cssClasses(self):
    86     def cssClasses(self):
    89         return {'table': ' '.join(classes)}
    91         return {'table': ' '.join(classes)}
    90 
    92 
    91     @property
    93     @property
    92     def data_attributes(self):
    94     def data_attributes(self):
    93         attributes = super(FormFieldsContainerTable, self).data_attributes
    95         attributes = super(FormFieldsContainerTable, self).data_attributes
    94         attributes['table'] = {'id': self.id,
    96         attributes['table'] = {
    95                                'data-ams-plugins': 'pyams_content',
    97             'id': self.id,
    96                                'data-ams-plugin-pyams_content-src':
    98             'data-ams-plugins': 'pyams_content',
    97                                    get_resource_path(pyams_content),
    99             'data-ams-plugin-pyams_content-src': get_resource_path(pyams_content),
    98                                'data-ams-location': absolute_url(IFormFieldContainer(self.context), self.request),
   100             'data-ams-location': absolute_url(IFormFieldContainer(self.context), self.request),
    99                                'data-ams-tablednd-drag-handle': 'td.sorter',
   101             'data-ams-tablednd-drag-handle': 'td.sorter',
   100                                'data-ams-tablednd-drop-target': 'set-form-fields-order.json'}
   102             'data-ams-tablednd-drop-target': 'set-form-fields-order.json',
       
   103             'data-ams-visibility-switcher': 'switch-form-field-visibility.json'
       
   104         }
   101         return attributes
   105         return attributes
   102 
   106 
   103     @reify
   107     @reify
   104     def values(self):
   108     def values(self):
   105         return list(super(FormFieldsContainerTable, self).values)
   109         return list(super(FormFieldsContainerTable, self).values)
   117     """Form fields container sorter column"""
   121     """Form fields container sorter column"""
   118 
   122 
   119 
   123 
   120 @adapter_config(name='show-hide', context=(IFormFieldContainerTarget, IPyAMSLayer, FormFieldsContainerTable),
   124 @adapter_config(name='show-hide', context=(IFormFieldContainerTarget, IPyAMSLayer, FormFieldsContainerTable),
   121                 provides=IColumn)
   125                 provides=IColumn)
   122 class FormFieldsContainerShowHideColumn(ProtectedFormObjectMixin, JsActionColumn):
   126 class FormFieldsContainerShowHideColumn(ProtectedFormObjectMixin, VisibilitySwitcherColumn):
   123     """Form fields container visibility switcher column"""
   127     """Form fields container visibility switcher column"""
   124 
   128 
   125     cssClasses = {'th': 'action',
   129 
   126                   'td': 'action switcher'}
   130 @view_config(name='switch-form-field-visibility.json', context=IFormFieldContainer, request_type=IPyAMSLayer,
   127 
   131              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
   128     icon_class = 'fa fa-fw fa-eye'
   132 def switch_form_field_visibility(request):
   129     icon_hint = _("Switch field visibility")
   133     """Set form field visibility"""
   130 
   134     return switch_element_visibility(request, IFormFieldContainer)
   131     url = 'PyAMS_content.fields.switchVisibility'
       
   132 
       
   133     weight = 5
       
   134 
       
   135     def get_icon(self, item):
       
   136         if item.visible:
       
   137             icon_class = 'fa fa-fw fa-eye'
       
   138         else:
       
   139             icon_class = 'fa fa-fw fa-eye-slash text-danger'
       
   140         return '<i class="{icon_class}"></i>'.format(icon_class=icon_class)
       
   141 
       
   142     def renderCell(self, item):
       
   143         if self.permission and not self.request.has_permission(self.permission, context=item):
       
   144             return self.get_icon(item)
       
   145         else:
       
   146             return super(FormFieldsContainerShowHideColumn, self).renderCell(item)
       
   147 
   135 
   148 
   136 
   149 @adapter_config(context=FormFieldsContainerShowHideColumn, provides=IFormSecurityContext)
   137 @adapter_config(context=FormFieldsContainerShowHideColumn, provides=IFormSecurityContext)
   150 def show_hide_column_security_context_factory(column):
   138 def show_hide_column_security_context_factory(column):
   151     """Show/hide column security context factory"""
   139     """Show/hide column security context factory"""
   223     order = list(map(str, json.loads(request.params.get('names'))))
   211     order = list(map(str, json.loads(request.params.get('names'))))
   224     request.context.updateOrder(order)
   212     request.context.updateOrder(order)
   225     return {'status': 'success'}
   213     return {'status': 'success'}
   226 
   214 
   227 
   215 
   228 @view_config(name='set-form-field-visibility.json', context=IFormFieldContainer, request_type=IPyAMSLayer,
       
   229              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   230 def set_form_field_visibility(request):
       
   231     """Set form field visibility"""
       
   232     container = IFormFieldContainer(request.context)
       
   233     paragraph = container.get(str(request.params.get('object_name')))
       
   234     if paragraph is None:
       
   235         raise NotFound()
       
   236     field = IFormField(paragraph)
       
   237     field.visible = not field.visible
       
   238     return {'visible': field.visible}
       
   239 
       
   240 
       
   241 #
   216 #
   242 # Form field views
   217 # Form field views
   243 #
   218 #
   244 
   219 
   245 @viewlet_config(name='add-form-field.action', context=IFormFieldContainerTarget, layer=IAdminLayer,
   220 @viewlet_config(name='add-form-field.action', context=IFormFieldContainerTarget, layer=IAdminLayer,
   297 
   272 
   298 
   273 
   299 @pagelet_config(name='properties.html', context=IFormField, layer=IPyAMSLayer, permission=MANAGE_CONTENT_PERMISSION)
   274 @pagelet_config(name='properties.html', context=IFormField, layer=IPyAMSLayer, permission=MANAGE_CONTENT_PERMISSION)
   300 class FormFieldPropertiesEditForm(AdminDialogEditForm):
   275 class FormFieldPropertiesEditForm(AdminDialogEditForm):
   301     """Form field properties edit form"""
   276     """Form field properties edit form"""
       
   277 
       
   278     prefix = 'field_properties.'
   302 
   279 
   303     @property
   280     @property
   304     def title(self):
   281     def title(self):
   305         content = get_parent(self.context, IWfSharedContent)
   282         content = get_parent(self.context, IWfSharedContent)
   306         return II18n(content).query_attribute('title', request=self.request)
   283         return II18n(content).query_attribute('title', request=self.request)