27 from pyams_content.shared.common import IWfSharedContent |
27 from pyams_content.shared.common import IWfSharedContent |
28 from pyams_form.interfaces.form import IInnerForm, IEditFormButtons, IInnerSubForm |
28 from pyams_form.interfaces.form import IInnerForm, IEditFormButtons, IInnerSubForm |
29 from pyams_i18n.interfaces import II18n |
29 from pyams_i18n.interfaces import II18n |
30 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu, IWidgetTitleViewletManager |
30 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu, IWidgetTitleViewletManager |
31 from pyams_skin.layer import IPyAMSLayer |
31 from pyams_skin.layer import IPyAMSLayer |
32 from pyams_utils.interfaces import MANAGE_PERMISSION |
|
33 from pyams_zmi.interfaces import IPropertiesEditForm |
32 from pyams_zmi.interfaces import IPropertiesEditForm |
34 from z3c.form.interfaces import INPUT_MODE |
33 from z3c.form.interfaces import INPUT_MODE |
35 from z3c.table.interfaces import IValues, IColumn |
34 from z3c.table.interfaces import IValues, IColumn |
36 |
35 |
37 # import packages |
36 # import packages |
39 from pyams_content.component.paragraph.pictogram import PictogramParagraph, PictogramItem |
38 from pyams_content.component.paragraph.pictogram import PictogramParagraph, PictogramItem |
40 from pyams_content.component.paragraph.zmi import BaseParagraphAddMenu, BaseParagraphAJAXAddForm, \ |
39 from pyams_content.component.paragraph.zmi import BaseParagraphAddMenu, BaseParagraphAJAXAddForm, \ |
41 BaseParagraphPropertiesEditForm, BaseParagraphAJAXEditForm |
40 BaseParagraphPropertiesEditForm, BaseParagraphAJAXEditForm |
42 from pyams_content.features.renderer.zmi import BaseRenderedContentRenderer |
41 from pyams_content.features.renderer.zmi import BaseRenderedContentRenderer |
43 from pyams_content.features.renderer.zmi.widget import RendererFieldWidget |
42 from pyams_content.features.renderer.zmi.widget import RendererFieldWidget |
44 from pyams_content.skin import pyams_content |
|
45 from pyams_form.form import AJAXAddForm, AJAXEditForm |
43 from pyams_form.form import AJAXAddForm, AJAXEditForm |
46 from pyams_form.security import ProtectedFormObjectMixin |
44 from pyams_form.security import ProtectedFormObjectMixin |
47 from pyams_i18n.column import I18nAttrColumn |
45 from pyams_i18n.column import I18nAttrColumn |
48 from pyams_pagelet.pagelet import pagelet_config |
46 from pyams_pagelet.pagelet import pagelet_config |
49 from pyams_skin.table import BaseTable, SorterColumn, JsActionColumn, I18nColumn, TrashColumn |
47 from pyams_skin.container import switch_element_visibility |
|
48 from pyams_skin.event import get_json_widget_refresh_event, get_json_switched_table_refresh_event, \ |
|
49 get_json_table_row_refresh_event |
|
50 from pyams_skin.table import BaseTable, SorterColumn, I18nColumn, TrashColumn, VisibilitySwitcherColumn |
50 from pyams_skin.viewlet.toolbar import ToolbarAction |
51 from pyams_skin.viewlet.toolbar import ToolbarAction |
51 from pyams_template.template import template_config |
|
52 from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter |
52 from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter |
53 from pyams_utils.fanstatic import get_resource_path |
|
54 from pyams_utils.text import get_text_start |
53 from pyams_utils.text import get_text_start |
55 from pyams_utils.traversing import get_parent |
54 from pyams_utils.traversing import get_parent |
56 from pyams_utils.url import absolute_url |
55 from pyams_utils.url import absolute_url |
57 from pyams_viewlet.viewlet import viewlet_config |
56 from pyams_viewlet.viewlet import viewlet_config |
58 from pyams_zmi.form import AdminDialogAddForm, InnerAdminDisplayForm, AdminDialogEditForm |
57 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm |
|
58 from pyams_zmi.zmi.table import InnerTableView |
59 from pyramid.decorator import reify |
59 from pyramid.decorator import reify |
60 from pyramid.exceptions import NotFound |
|
61 from pyramid.view import view_config |
60 from pyramid.view import view_config |
62 from z3c.form import field, button |
61 from z3c.form import field, button |
63 from z3c.table.column import GetAttrColumn |
62 from z3c.table.column import GetAttrColumn |
64 from zope.interface import implementer, Interface |
63 from zope.interface import implementer, Interface |
65 |
64 |
112 |
111 |
113 @pagelet_config(name='properties.html', context=IPictogramParagraph, layer=IPyAMSLayer, |
112 @pagelet_config(name='properties.html', context=IPictogramParagraph, layer=IPyAMSLayer, |
114 permission=MANAGE_CONTENT_PERMISSION) |
113 permission=MANAGE_CONTENT_PERMISSION) |
115 class PictogramParagraphPropertiesEditForm(BaseParagraphPropertiesEditForm): |
114 class PictogramParagraphPropertiesEditForm(BaseParagraphPropertiesEditForm): |
116 """Pictogram paragraph properties edit form""" |
115 """Pictogram paragraph properties edit form""" |
|
116 |
|
117 prefix = 'pictograms_properties.' |
117 |
118 |
118 @property |
119 @property |
119 def title(self): |
120 def title(self): |
120 content = get_parent(self.context, IWfSharedContent) |
121 content = get_parent(self.context, IWfSharedContent) |
121 return II18n(content).query_attribute('title', request=self.request) |
122 return II18n(content).query_attribute('title', request=self.request) |
159 |
160 |
160 def get_ajax_output(self, changes): |
161 def get_ajax_output(self, changes): |
161 output = super(PictogramParagraphInnerAJAXEditForm, self).get_ajax_output(changes) |
162 output = super(PictogramParagraphInnerAJAXEditForm, self).get_ajax_output(changes) |
162 updated = changes.get(IPictogramParagraph, ()) |
163 updated = changes.get(IPictogramParagraph, ()) |
163 if 'renderer' in updated: |
164 if 'renderer' in updated: |
164 form = PictogramParagraphInnerEditForm(self.context, self.request) |
165 output.setdefault('events', []).append( |
165 form.update() |
166 get_json_widget_refresh_event(self.context, self.request, PictogramParagraphInnerEditForm, 'renderer')) |
166 output.setdefault('events', []).append({ |
|
167 'event': 'myams.refresh', |
|
168 'options': { |
|
169 'handler': 'MyAMS.skin.refreshWidget', |
|
170 'parent_id': '{0}_{1}_{2}'.format( |
|
171 self.context.__class__.__name__, |
|
172 getattr(form.getContent(), '__name__', 'noname').replace('++', ''), |
|
173 form.id), |
|
174 'widget_name': form.widgets['renderer'].name, |
|
175 'content': form.widgets['renderer'].render() |
|
176 } |
|
177 }) |
|
178 return output |
167 return output |
179 |
168 |
180 |
169 |
181 # |
170 # |
182 # Pictogram paragraph renderer |
171 # Pictogram paragraph renderer |
212 @property |
199 @property |
213 def data_attributes(self): |
200 def data_attributes(self): |
214 attributes = super(PictogramsTable, self).data_attributes |
201 attributes = super(PictogramsTable, self).data_attributes |
215 attributes['table'] = { |
202 attributes['table'] = { |
216 'id': self.id, |
203 'id': self.id, |
217 'data-ams-plugins': 'pyams_content', |
|
218 'data-ams-plugin-pyams_content-src': get_resource_path(pyams_content), |
|
219 'data-ams-location': absolute_url(IPictogramContainer(self.context), self.request), |
204 'data-ams-location': absolute_url(IPictogramContainer(self.context), self.request), |
220 'data-ams-tablednd-drag-handle': 'td.sorter', |
205 'data-ams-tablednd-drag-handle': 'td.sorter', |
221 'data-ams-tablednd-drop-target': 'set-pictograms-order.json' |
206 'data-ams-tablednd-drop-target': 'set-pictograms-order.json', |
|
207 'data-ams-visibility-switcher': 'switch-pictogram-visibility.json' |
222 } |
208 } |
223 attributes.setdefault('tr', {}).update({ |
|
224 'id': lambda x, col: 'pictogram_{0}::{1}'.format(get_parent(x, IPictogramContainerTarget).__name__, |
|
225 x.__name__), |
|
226 'data-ams-delete-target': 'delete-pictogram.json' |
|
227 }) |
|
228 return attributes |
209 return attributes |
229 |
210 |
230 @reify |
211 @reify |
231 def values(self): |
212 def values(self): |
232 return list(super(PictogramsTable, self).values) |
213 return list(super(PictogramsTable, self).values) |
274 return '--' |
255 return '--' |
275 |
256 |
276 |
257 |
277 @adapter_config(name='show-hide', context=(IPictogramContainerTarget, IPyAMSLayer, PictogramsTable), |
258 @adapter_config(name='show-hide', context=(IPictogramContainerTarget, IPyAMSLayer, PictogramsTable), |
278 provides=IColumn) |
259 provides=IColumn) |
279 class PictogramsTableShowHideColumn(ProtectedFormObjectMixin, JsActionColumn): |
260 class PictogramsTableShowHideColumn(ProtectedFormObjectMixin, VisibilitySwitcherColumn): |
280 """Pictograms container visibility switcher column""" |
261 """Pictograms container visibility switcher column""" |
281 |
262 |
282 cssClasses = {'th': 'action', |
263 |
283 'td': 'action switcher'} |
264 @view_config(name='switch-pictogram-visibility.json', context=IPictogramContainer, request_type=IPyAMSLayer, |
284 |
265 permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True) |
285 icon_class = 'fa fa-fw fa-eye' |
266 def switch_pictogram_visibility(request): |
286 icon_hint = _("Switch pictogram visibility") |
|
287 |
|
288 url = 'PyAMS_content.pictograms.switchVisibility' |
|
289 |
|
290 weight = 5 |
|
291 |
|
292 def get_icon(self, item): |
|
293 if item.visible: |
|
294 icon_class = 'fa fa-fw fa-eye' |
|
295 else: |
|
296 icon_class = 'fa fa-fw fa-eye-slash text-danger' |
|
297 return '<i class="{icon_class}"></i>'.format(icon_class=icon_class) |
|
298 |
|
299 def renderCell(self, item): |
|
300 if self.permission and not self.request.has_permission(self.permission, context=item): |
|
301 return self.get_icon(item) |
|
302 else: |
|
303 return super(PictogramsTableShowHideColumn, self).renderCell(item) |
|
304 |
|
305 |
|
306 @view_config(name='set-pictogram-visibility.json', context=IPictogramContainer, request_type=IPyAMSLayer, |
|
307 permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True) |
|
308 def set_pictogram_visibility(request): |
|
309 """Set pictogram visibility""" |
267 """Set pictogram visibility""" |
310 container = IPictogramContainer(request.context) |
268 return switch_element_visibility(request, IPictogramContainer) |
311 pictogram = container.get(str(request.params.get('object_name'))) |
|
312 if pictogram is None: |
|
313 raise NotFound() |
|
314 pictogram.visible = not pictogram.visible |
|
315 return {'visible': pictogram.visible} |
|
316 |
269 |
317 |
270 |
318 @adapter_config(name='name', context=(IPictogramContainerTarget, IPyAMSLayer, PictogramsTable), provides=IColumn) |
271 @adapter_config(name='name', context=(IPictogramContainerTarget, IPyAMSLayer, PictogramsTable), provides=IColumn) |
319 class PictogramsTableNameColumn(I18nColumn, I18nAttrColumn): |
272 class PictogramsTableNameColumn(I18nColumn, I18nAttrColumn): |
320 """Pictograms table name column""" |
273 """Pictograms table name column""" |
348 @adapter_config(name='trash', context=(IPictogramContainerTarget, IPyAMSLayer, PictogramsTable), provides=IColumn) |
301 @adapter_config(name='trash', context=(IPictogramContainerTarget, IPyAMSLayer, PictogramsTable), provides=IColumn) |
349 class PictogramsTableTrashColumn(ProtectedFormObjectMixin, TrashColumn): |
302 class PictogramsTableTrashColumn(ProtectedFormObjectMixin, TrashColumn): |
350 """Pictograms table trash column""" |
303 """Pictograms table trash column""" |
351 |
304 |
352 |
305 |
353 @view_config(name='delete-pictogram.json', context=IPictogramContainer, request_type=IPyAMSLayer, |
|
354 permission=MANAGE_PERMISSION, renderer='json', xhr=True) |
|
355 def delete_pictogram(request): |
|
356 """Delete pictogram""" |
|
357 translate = request.localizer.translate |
|
358 name = request.params.get('object_name') |
|
359 if not name: |
|
360 return { |
|
361 'status': 'message', |
|
362 'messagebox': { |
|
363 'status': 'error', |
|
364 'content': translate(_("No provided object_name argument!")) |
|
365 } |
|
366 } |
|
367 if name not in request.context: |
|
368 return { |
|
369 'status': 'message', |
|
370 'messagebox': { |
|
371 'status': 'error', |
|
372 'content': translate(_("Given pictogram name doesn't exist!")) |
|
373 } |
|
374 } |
|
375 del request.context[name] |
|
376 return {'status': 'success'} |
|
377 |
|
378 |
|
379 @adapter_config(name='pictograms', context=(IPictogramContainerTarget, IPyAMSLayer, IPictogramsParentForm), |
306 @adapter_config(name='pictograms', context=(IPictogramContainerTarget, IPyAMSLayer, IPictogramsParentForm), |
380 provides=IInnerSubForm) |
307 provides=IInnerSubForm) |
381 @template_config(template='templates/pictograms.pt', layer=IPyAMSLayer) |
|
382 @implementer(IPictogramsView) |
308 @implementer(IPictogramsView) |
383 class PictogramsView(InnerAdminDisplayForm): |
309 class PictogramsView(InnerTableView): |
384 """Pictograms view""" |
310 """Pictograms view""" |
385 |
311 |
386 fields = field.Fields(Interface) |
312 title = _("Pictograms") |
|
313 |
|
314 table_class = PictogramsTable |
387 weight = 100 |
315 weight = 100 |
388 |
|
389 def __init__(self, context, request, view): |
|
390 super(PictogramsView, self).__init__(context, request, view) |
|
391 self.table = PictogramsTable(context, request) |
|
392 self.table.view = self |
|
393 |
|
394 def update(self): |
|
395 super(PictogramsView, self).update() |
|
396 self.table.update() |
|
397 |
316 |
398 |
317 |
399 # |
318 # |
400 # Pictograms forms |
319 # Pictograms forms |
401 # |
320 # |
439 permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True) |
358 permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True) |
440 class PictogramAJAXAddForm(AJAXAddForm, PictogramAddForm): |
359 class PictogramAJAXAddForm(AJAXAddForm, PictogramAddForm): |
441 """Pictogram add form, JSON renderer""" |
360 """Pictogram add form, JSON renderer""" |
442 |
361 |
443 def get_ajax_output(self, changes): |
362 def get_ajax_output(self, changes): |
444 table = PictogramsTable(self.context, self.request) |
|
445 table.update() |
|
446 return { |
363 return { |
447 'status': 'success', |
364 'status': 'success', |
448 'message': self.request.localizer.translate(_("Pictogram was correctly added")), |
365 'message': self.request.localizer.translate(_("Pictogram was correctly added")), |
449 'events': [{ |
366 'events': [get_json_switched_table_refresh_event(self.context, self.request, PictogramsTable), ] |
450 'event': 'myams.refresh', |
|
451 'options': { |
|
452 'handler': 'PyAMS_content.pictograms.refreshPictograms', |
|
453 'object_id': table.id, |
|
454 'table': table.render() |
|
455 } |
|
456 }] |
|
457 } |
367 } |
458 |
368 |
459 |
369 |
460 @pagelet_config(name='properties.html', context=IPictogramItem, layer=IPyAMSLayer, permission=MANAGE_CONTENT_PERMISSION) |
370 @pagelet_config(name='properties.html', context=IPictogramItem, layer=IPyAMSLayer, permission=MANAGE_CONTENT_PERMISSION) |
461 class PictogramPropertiesEditForm(AdminDialogEditForm): |
371 class PictogramPropertiesEditForm(AdminDialogEditForm): |
462 """Pictogram properties edit form""" |
372 """Pictogram properties edit form""" |
|
373 |
|
374 prefix = 'pictogram_properties.' |
463 |
375 |
464 legend = _("Edit pictogram properties") |
376 legend = _("Edit pictogram properties") |
465 icon_css_class = 'fa fa-fw fa-linode' |
377 icon_css_class = 'fa fa-fw fa-linode' |
466 |
378 |
467 fields = field.Fields(IPictogramItem).omit('__parent__', '__name__', 'visible') |
379 fields = field.Fields(IPictogramItem).omit('__parent__', '__name__', 'visible') |
482 def get_ajax_output(self, changes): |
394 def get_ajax_output(self, changes): |
483 output = super(PictogramPropertiesAJAXEditForm, self).get_ajax_output(changes) |
395 output = super(PictogramPropertiesAJAXEditForm, self).get_ajax_output(changes) |
484 updated = changes.get(IPictogramItem, ()) |
396 updated = changes.get(IPictogramItem, ()) |
485 if updated: |
397 if updated: |
486 target = get_parent(self.context, IPictogramContainerTarget) |
398 target = get_parent(self.context, IPictogramContainerTarget) |
487 table = PictogramsTable(target, self.request) |
399 output.setdefault('events', []).append( |
488 table.update() |
400 get_json_table_row_refresh_event(target, self.request, PictogramsTable, self.context)) |
489 row = table.setUpRow(self.context) |
|
490 output.setdefault('events', []).append({ |
|
491 'event': 'myams.refresh', |
|
492 'options': { |
|
493 'handler': 'MyAMS.skin.refreshRow', |
|
494 'object_id': 'pictogram_{0}::{1}'.format(target.__name__, |
|
495 self.context.__name__), |
|
496 'row': table.renderRow(row) |
|
497 } |
|
498 }) |
|
499 return output |
401 return output |