fields: add option for simple rich text on text field (#76013) #398

Merged
fpeters merged 1 commits from wip/76013-simple-rich-option into main 2023-06-23 08:10:06 +02:00
3 changed files with 29 additions and 7 deletions

View File

@ -2140,7 +2140,8 @@ def test_form_edit_text_field(pub):
pub.site_options.write(fd)
resp = app.get('/backoffice/forms/1/fields/1/')
assert resp.form['display_mode'].options == [
('Rich Text', False, None),
('Rich Text (simple: bold, italic..)', False, None),
('Rich Text (full: titles, lists...)', False, None),
('Plain Text (with automatic paragraphs on blank lines)', True, None),
('Plain Text (with linebreaks as typed)', False, None),
]

View File

@ -114,7 +114,14 @@ def test_text(pub):
fields.TextField(display_mode='rich').get_view_short_value('<p>foo</p>' * 15)
== ('foo' * 10)[:27] + '(…)'
)
assert fields.TextField(display_mode='rich').get_view_value('<script></script><p>foo</p>') == '<p>foo</p>'
assert (
fields.TextField(display_mode='rich').get_view_value('<script></script><h1>bar</h1><p>foo</p>')
== '<h1>bar</h1><p>foo</p>'
)
assert (
fields.TextField(display_mode='basic-rich').get_view_value('<script></script><h1>bar</h1><p>foo</p>')
== 'bar<p>foo</p>'
)
form = Form(use_tokens=False)
fields.TextField().add_to_form(form)
@ -128,6 +135,14 @@ def test_text(pub):
assert 'cols="12"' in str(form.render())
assert 'rows="12"' in str(form.render())
form = Form(use_tokens=False)
fields.TextField(display_mode='rich').add_to_form(form)
assert 'data-godo-schema="full"' in str(form.render())
form = Form(use_tokens=False)
fields.TextField(display_mode='basic-rich').add_to_form(form)
assert 'data-godo-schema="basic"' in str(form.render())
def test_text_anonymise(pub):
formdef = FormDef()

View File

@ -57,6 +57,7 @@ from .qommon.form import (
JsonpSingleSelectWidget,
MapMarkerSelectionWidget,
MapWidget,
MiniRichTextWidget,
MultiSelectWidget,
PasswordEntryWidget,
RadiobuttonsWidget,
@ -1432,7 +1433,9 @@ class TextField(WidgetField):
return changed
def perform_more_widget_changes(self, *args, **kwargs):
if self.display_mode == 'rich':
if self.display_mode == 'basic-rich':
self.widget_class = MiniRichTextWidget
elif self.display_mode == 'rich':
self.widget_class = RichTextWidget
def fill_admin_form(self, form):
@ -1455,7 +1458,8 @@ class TextField(WidgetField):
display_options = []
if get_publisher().get_site_option('enable-richtext-field'):
display_options += [
('rich', _('Rich Text')),
('basic-rich', _('Rich Text (simple: bold, italic..)')),
('rich', _('Rich Text (full: titles, lists...)')),
]
display_options += [
('plain', _('Plain Text (with automatic paragraphs on blank lines)')),
@ -1486,6 +1490,8 @@ class TextField(WidgetField):
def get_view_value(self, value, **kwargs):
if self.display_mode == 'pre':
return htmltext('<p class="plain-text-pre">') + value + htmltext('</p>')
elif self.display_mode == 'basic-rich':
return htmltext(strip_some_tags(value, MiniRichTextWidget.ALL_TAGS))
elif self.display_mode == 'rich':
return htmltext(strip_some_tags(value, RichTextWidget.ALL_TAGS))
else:
@ -1499,7 +1505,7 @@ class TextField(WidgetField):
return ''
def get_opendocument_node_value(self, value, formdata=None, **kwargs):
if self.display_mode == 'rich':
if self.display_mode in ('rich', 'basic-rich'):
return
paragraphs = []
for paragraph in value.splitlines():
@ -1510,12 +1516,12 @@ class TextField(WidgetField):
return paragraphs
def get_view_short_value(self, value, max_len=30, **kwargs):
if self.display_mode == 'rich':
if self.display_mode in ('rich', 'basic-rich'):
return ellipsize(str(strip_tags(value)), max_len)
return ellipsize(str(value), max_len)
def get_json_value(self, value, **kwargs):
if self.display_mode == 'rich':
if self.display_mode in ('rich', 'basic-rich'):
return str(self.get_view_value(value))
return value