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 |
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) |