# HG changeset patch # User tflorac@dagon.home # Date 1522960531 -7200 # Node ID a3d2ef66e7ea5f0c87f6f91cf5ed2cb63f014049 # Parent b2b043bf066a6d2a08f242ae8e1f810028fbaed9 Added generic functions to handle elements visibility diff -r b2b043bf066a -r a3d2ef66e7ea src/pyams_skin/container.py --- a/src/pyams_skin/container.py Tue Apr 03 15:47:05 2018 +0200 +++ b/src/pyams_skin/container.py Thu Apr 05 22:35:31 2018 +0200 @@ -24,6 +24,7 @@ # import packages from pyams_skin.table import BaseTable from pyams_template.template import template_config +from pyramid.exceptions import NotFound from pyramid.view import view_config from zope.interface import implementer @@ -53,12 +54,43 @@ 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!"))}} + 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 plug-in name doesn't exist!"))}} + return { + 'status': 'message', + 'messagebox': { + 'status': 'error', + 'content': translate(_("Given plug-in name doesn't exist!")) + } + } del request.context[name] return {'status': 'success'} + + +def set_element_visibility(request, interface): + """Set container element visibility + + :param request: original browser request; request should contain a parameter called + "object_name" which contains the name of the element which should be switched. + A NotFound exception is raised if argument is not provided or if given argument + doesn't match an existing element. + :param interface: container interface to which request's context should be adapted + :return: a JSON object containing a boolean "visible" property defining new element visibility. + """ + container = interface(request.context, None) + if container is None: + raise NotFound() + object_name = request.params.get('object_name') + if not object_name: + raise NotFound() + element = container.get(str(object_name)) + if element is None: + raise NotFound() + element.visible = not element.visible + return {'visible': element.visible} diff -r b2b043bf066a -r a3d2ef66e7ea src/pyams_skin/resources/js/myams.js --- a/src/pyams_skin/resources/js/myams.js Tue Apr 03 15:47:05 2018 +0200 +++ b/src/pyams_skin/resources/js/myams.js Thu Apr 05 22:35:31 2018 +0200 @@ -2,7 +2,7 @@ * MyAMS * « My Application Management Skin » * - * $Tag$ (rev. 1) + * $Tag: 0.1.14 $ (rev. 1) * A bootstrap based application/administration skin * * Custom administration and application skin tools @@ -4826,10 +4826,9 @@ /** * Delete an element from a container table * - * @param element * @returns {Function} */ - deleteElement: function(element) { + deleteElement: function() { return function() { var link = $(this); MyAMS.skin.bigBox({ @@ -4861,6 +4860,27 @@ } }); }; + }, + + /** + * Switch element visibility + */ + switchElementVisibility: function() { + return function() { + var source = $(this); + var element = source.parents('tr').first(); + var container = element.parents('table'); + ams.ajax.post(container.data('ams-location') + '/' + + container.data('ams-visibility-target'), + {object_name: element.data('ams-element-name')}, + function(result, status) { + if (result.visible) { + $('i', source).attr('class', 'fa fa-fw fa-eye'); + } else { + $('i', source).attr('class', 'fa fa-fw fa-eye-slash text-danger'); + } + }); + } } }; @@ -5197,6 +5217,21 @@ MyAMS.initContent(widget); return widget; }, + + /** + * Replace given table with new content + * If table is located inside a switched fieldset, fieldset is opened + * + * @param changes + */ + refreshSwitchedTable: function(changes) { + var widget = ams.skin.refreshTable(changes); + var legend = widget.siblings('legend'); + if (legend.parents('fieldset:first').hasClass('switched')) { + legend.click(); + } + }, + /** * Replace given row with new content */ diff -r b2b043bf066a -r a3d2ef66e7ea src/pyams_skin/table.py --- a/src/pyams_skin/table.py Tue Apr 03 15:47:05 2018 +0200 +++ b/src/pyams_skin/table.py Thu Apr 05 22:35:31 2018 +0200 @@ -304,6 +304,33 @@ return '#' +class VisibilitySwitcherColumn(JsActionColumn): + """Visibility switcher column""" + + cssClasses = {'th': 'action', + 'td': 'action switcher'} + + visible_icon_class = 'fa fa-fw fa-eye' + hidden_icon_class = 'fa fa-fw fa-eye-slash text-danger' + + url = 'MyAMS.container.switchElementVisibility' + weight = 5 + + def get_icon(self, item): + if item.visible: + icon_class = self.visible_icon_class + else: + icon_class = self.hidden_icon_class + return ''.format(icon_class) + + def renderCell(self, item): + permission = self.permission + if permission and self.request.has_permission(permission, context=item): + return self.get_icon(item) + else: + return super(VisibilitySwitcherColumn, self).renderCell(item) + + @adapter_config(name='actions', context=(Interface, IPyAMSLayer, ITableWithActions), provides=IColumn) class MenuActionsColumn(I18nColumn, Column): """Menu actions column"""