diff --git a/maintenance-schedule.yml b/maintenance-schedule.yml
index 49e8a7b75c..aa420cf599 100644
--- a/maintenance-schedule.yml
+++ b/maintenance-schedule.yml
@@ -16,6 +16,7 @@ schedule:
- caicias
- caicinus
- caicus
+ - caerus
- carcinus
- date: Monday +7 days at 7:00
nodes:
diff --git a/src/onegov/form/validators.py b/src/onegov/form/validators.py
index 3d6371c643..5d927ea8a6 100644
--- a/src/onegov/form/validators.py
+++ b/src/onegov/form/validators.py
@@ -552,13 +552,13 @@ def __call__(self, form: Form, field: Field) -> Form | None:
# limit the definition to MultiCheckboxField, RadioField which can
# be used for filter definition
errors = None
- for field in parsed_form._fields.values():
- if not isinstance(field, (MultiCheckboxField, RadioField)):
- error = field.gettext(self.invalid_field_type.format(
- label=field.label.text))
- errors = form['definition'].errors
+ for parsed_field in parsed_form._fields.values():
+ if not isinstance(parsed_field, (MultiCheckboxField, RadioField)):
+ error = parsed_field.gettext(self.invalid_field_type.format(
+ label=parsed_field.label.text))
+ errors = field.errors
if not isinstance(errors, list):
- errors = form['definition'].process_errors
+ errors = field.process_errors
assert isinstance(errors, list)
errors.append(error)
diff --git a/src/onegov/org/assets/js/code_editor.js b/src/onegov/org/assets/js/code_editor.js
index 2a9aa5eadf..c86de17f0e 100644
--- a/src/onegov/org/assets/js/code_editor.js
+++ b/src/onegov/org/assets/js/code_editor.js
@@ -5,6 +5,10 @@ $(function() {
var readonly = textarea.is('[readonly]');
textarea.css('display', 'none');
+ // the editor replaces the textarea with its own widget, so make sure
+ // the field-dependency handling never re-shows the raw textarea
+ textarea.attr('data-always-hidden', '');
+
var outside = $('
');
var inside = $('
');
inside.position('absolute');
diff --git a/src/onegov/org/forms/event.py b/src/onegov/org/forms/event.py
index 47308e2ce0..853202fa4a 100644
--- a/src/onegov/org/forms/event.py
+++ b/src/onegov/org/forms/event.py
@@ -19,13 +19,11 @@
from onegov.form.fields import TimeField
from onegov.form.fields import UploadField
from onegov.form.fields import UploadFileWithORMSupport
-from onegov.form.utils import get_fields_from_class
from onegov.file.attachments import IMAGE_MAX_SIZE
from onegov.form.validators import (
FileSizeLimit,
ImageSizeLimit,
ValidPhoneNumber,
- ValidFilterFormDefinition,
MIME_TYPES_EXCEL,
MIME_TYPES_PDF,
)
@@ -684,35 +682,3 @@ def get(line: DefaultRow, column: str, attribute: str) -> Any:
transaction.abort()
return count, errors
-
-
-class EventConfigurationForm(Form):
- """ Form to configure filters for events view. """
-
- definition = TextAreaField(
- label=_('Definition'),
- fieldset=_('General'),
- validators=[
- InputRequired(),
- ValidFilterFormDefinition(
- require_email_field=False,
- require_title_fields=False,
- reserved_fields={name for name, _ in
- get_fields_from_class(EventForm)}
- | {'syndicate', 'highlight'}
- )
- ],
- render_kw={'rows': 32, 'data-editor': 'form'})
-
- keyword_fields = TextAreaField(
- label=_('Filters'),
- fieldset=_('Display'),
- render_kw={
- 'class_': 'formcode-select',
- 'data-fields-include': 'radio,checkbox'
- })
-
- force_remove = BooleanField(
- label=_('Remove these filters from all affected events'),
- fieldset=_('Confirmation'),
- )
diff --git a/src/onegov/org/forms/settings.py b/src/onegov/org/forms/settings.py
index ef66dd647a..2b7176c967 100644
--- a/src/onegov/org/forms/settings.py
+++ b/src/onegov/org/forms/settings.py
@@ -25,11 +25,14 @@
from onegov.form.fields import TagsField
from onegov.form.fields import TranslatedSelectField
from onegov.form.fields import URLField
+from onegov.form.utils import get_fields_from_class
from onegov.form.validators import If
from onegov.form.validators import StrictOptional
+from onegov.form.validators import ValidFilterFormDefinition
from onegov.form.validators import ValidHostname
from onegov.gis import CoordinatesField
from onegov.org import _, log
+from onegov.org.forms.event import EventForm
from onegov.org.forms.fields import (
HtmlField,
UploadOrSelectExistingMultipleFilesField,
@@ -2067,21 +2070,6 @@ class EventSettingsForm(Form):
default=False
)
- event_locations = TagsField(
- label=_('Values of the location filter'),
- )
-
- event_filter_type = RadioField(
- label=_("Choose the filter type for events (default is 'Tags')"),
- choices=(
- ('tags', _('A predefined set of tags')),
- ('filters', _('Manually configurable filters')),
- ('tags_and_filters', _('Both, predefined tags as well as '
- 'configurable filters')),
- ),
- default='tags'
- )
-
event_header_title = StringField(
label=_('Title of text above event list'),
description=_('General information about the event calendar'),
@@ -2104,6 +2092,56 @@ class EventSettingsForm(Form):
fieldset=_('Information below the event list')
)
+ event_locations = TagsField(
+ label=_('Values of the location filter'),
+ fieldset=_('Filters'),
+ )
+
+ event_filter_type = RadioField(
+ label=_("Choose the filter type for events (default is 'Tags')"),
+ fieldset=_('Filters'),
+ choices=(
+ ('tags', _('A predefined set of tags')),
+ ('filters', _('Manually configurable filters')),
+ ('tags_and_filters', _('Both, predefined tags as well as '
+ 'configurable filters')),
+ ),
+ default='tags'
+ )
+
+ event_filter_definition = TextAreaField(
+ label=_('Definition'),
+ fieldset=_('Filters'),
+ depends_on=('event_filter_type', '!tags'),
+ validators=[
+ ValidFilterFormDefinition(
+ require_email_field=False,
+ require_title_fields=False,
+ reserved_fields={name for name, _ in
+ get_fields_from_class(EventForm)}
+ | {'syndicate', 'highlight'}
+ )
+ ],
+ render_kw={'rows': 16, 'data-editor': 'form'}
+ )
+
+ keyword_fields = TextAreaField(
+ label=_('Filters'),
+ fieldset=_('Filters'),
+ depends_on=('event_filter_type', '!tags'),
+ render_kw={
+ 'class_': 'formcode-select',
+ 'data-fields-include': 'radio,checkbox'
+ }
+ )
+
+ force_remove = BooleanField(
+ label=_('Remove these filters from all affected events'),
+ fieldset=_('Filters'),
+ )
+
+ # FIXME: keep this last; its upload widget emits a split