frontends, jp, templates: added XHTMLBox widget:
for jp, the XHTML is rendered for now using markdown.
This commit is contained in:
parent
87871fabca
commit
37ea73b19f
3 changed files with 44 additions and 0 deletions
|
|
@ -27,6 +27,12 @@ from sat.core.log import getLogger
|
||||||
log = getLogger(__name__)
|
log = getLogger(__name__)
|
||||||
from sat_frontends.tools import xmlui
|
from sat_frontends.tools import xmlui
|
||||||
from functools import partial
|
from functools import partial
|
||||||
|
try:
|
||||||
|
from jinja2 import Markup as safe
|
||||||
|
except ImportError:
|
||||||
|
# Safe marks XHTML values as usable as it.
|
||||||
|
# If jinja2 is not there, we can use a simple lamba
|
||||||
|
safe = lambda x: x
|
||||||
|
|
||||||
|
|
||||||
## Widgets ##
|
## Widgets ##
|
||||||
|
|
@ -136,6 +142,17 @@ class TextBoxWidget(xmlui.TextWidget, InputWidget):
|
||||||
type = u"textbox"
|
type = u"textbox"
|
||||||
|
|
||||||
|
|
||||||
|
class XHTMLBoxWidget(xmlui.XHTMLBoxWidget, InputWidget):
|
||||||
|
type = u"xhtmlbox"
|
||||||
|
|
||||||
|
def __init__(self, xmlui_parent, value, read_only=False):
|
||||||
|
# XXX: XHTMLBoxWidget value must be cleaned (harmful XHTML must be removed)
|
||||||
|
# This is normally done in the backend, the frontends should not need to
|
||||||
|
# worry about it.
|
||||||
|
super(XHTMLBoxWidget, self).__init__(
|
||||||
|
xmlui_parent=xmlui_parent, value=safe(value), read_only=read_only)
|
||||||
|
|
||||||
|
|
||||||
class ListWidget(xmlui.ListWidget, OptionsWidget):
|
class ListWidget(xmlui.ListWidget, OptionsWidget):
|
||||||
type = u"list"
|
type = u"list"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -238,6 +238,18 @@ class TextBoxWidget(xmlui_base.TextWidget, StringWidget):
|
||||||
type = u"textbox"
|
type = u"textbox"
|
||||||
|
|
||||||
|
|
||||||
|
class XHTMLBoxWidget(xmlui_base.XHTMLBoxWidget, StringWidget):
|
||||||
|
type = u"xhtmlbox"
|
||||||
|
|
||||||
|
def show(self):
|
||||||
|
# FIXME: we use bridge in a blocking way as permitted by python-dbus
|
||||||
|
# this only for now to make it simpler, it must be refactored
|
||||||
|
# to use async when jp will be fully async (expected for 0.8)
|
||||||
|
self.value = self.host.bridge.syntaxConvert(
|
||||||
|
self.value, C.SYNTAX_XHTML, "markdown", False, self.host.profile)
|
||||||
|
super(XHTMLBoxWidget, self).show()
|
||||||
|
|
||||||
|
|
||||||
class ListWidget(xmlui_base.ListWidget, OptionsWidget):
|
class ListWidget(xmlui_base.ListWidget, OptionsWidget):
|
||||||
type = u"list"
|
type = u"list"
|
||||||
# TODO: handle flags, notably multi
|
# TODO: handle flags, notably multi
|
||||||
|
|
|
||||||
|
|
@ -116,12 +116,22 @@ class PasswordWidget(Widget):
|
||||||
|
|
||||||
class TextBoxWidget(Widget):
|
class TextBoxWidget(Widget):
|
||||||
"""Input widget with require a long, possibly multilines string
|
"""Input widget with require a long, possibly multilines string
|
||||||
|
|
||||||
often called TextArea in toolkits
|
often called TextArea in toolkits
|
||||||
"""
|
"""
|
||||||
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class XHTMLBoxWidget(Widget):
|
||||||
|
"""Input widget specialised in XHTML editing,
|
||||||
|
|
||||||
|
a WYSIWYG or specialised editor is expected
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class BoolWidget(Widget):
|
class BoolWidget(Widget):
|
||||||
"""Input widget with require a boolean value
|
"""Input widget with require a boolean value
|
||||||
often called CheckBox in toolkits
|
often called CheckBox in toolkits
|
||||||
|
|
@ -582,6 +592,11 @@ class XMLUIPanel(XMLUIBase):
|
||||||
_xmlui_parent, value, self._isAttrSet("read_only", node)
|
_xmlui_parent, value, self._isAttrSet("read_only", node)
|
||||||
)
|
)
|
||||||
self.ctrl_list[name] = {"type": type_, "control": ctrl}
|
self.ctrl_list[name] = {"type": type_, "control": ctrl}
|
||||||
|
elif type_ == "xhtmlbox":
|
||||||
|
ctrl = self.widget_factory.createXHTMLBoxWidget(
|
||||||
|
_xmlui_parent, value, self._isAttrSet("read_only", node)
|
||||||
|
)
|
||||||
|
self.ctrl_list[name] = {"type": type_, "control": ctrl}
|
||||||
elif type_ == "bool":
|
elif type_ == "bool":
|
||||||
ctrl = self.widget_factory.createBoolWidget(
|
ctrl = self.widget_factory.createBoolWidget(
|
||||||
_xmlui_parent,
|
_xmlui_parent,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue