Commit adcce185 authored by Jérome Perrin's avatar Jérome Perrin

ERP5Form/Formulator: Minimal support of Zope4's ZMI

Only the most used forms are updated
parent 81cb4c40
......@@ -93,6 +93,7 @@ class FormBoxWidget(Widget.Widget):
title='Form ID',
description=(
"ID of the form which must be rendered in this box."),
css_class="form-control",
default="",
required=0)
......@@ -101,6 +102,7 @@ class FormBoxWidget(Widget.Widget):
title='Context method ID',
description=(
"ID of the method that returns a context for this box."),
css_class="form-control",
default="",
required=0)
......@@ -109,6 +111,7 @@ class FormBoxWidget(Widget.Widget):
title='Default',
description=(
"A default value (not used)."),
css_class="form-control",
default="",
required=0)
......@@ -179,6 +182,7 @@ class FormBoxValidator(Validator.Validator):
'validator_form_field_prefix',
title='Validator Form Field Prefix',
description= "Field prefix value used when validating fields",
css_class="form-control",
default="my_",
display_width=40,
required=1
......
This diff is collapsed.
......@@ -80,6 +80,7 @@ class MultiRelationStringFieldWidget(Widget.LinesTextAreaWidget,
title='Update Method',
description=(
"The method to call to set the relation. Required."),
css_class="form-control",
default="Base_validateRelation",
required=1)
......@@ -87,6 +88,7 @@ class MultiRelationStringFieldWidget(Widget.LinesTextAreaWidget,
title='Jump Method',
description=(
"The method to call to jump to the relation. Required."),
css_class="form-control",
default="Base_jumpToRelatedDocument",
required=1)
......@@ -94,6 +96,7 @@ class MultiRelationStringFieldWidget(Widget.LinesTextAreaWidget,
title='Allow Jump',
description=(
"Do we allow to jump to the relation ?"),
css_class="form-check-input",
default=1,
required=0)
......@@ -101,6 +104,7 @@ class MultiRelationStringFieldWidget(Widget.LinesTextAreaWidget,
title='Base Category',
description=(
"The method to call to set the relation. Required."),
css_class="form-control",
default="",
required=1)
......@@ -108,6 +112,7 @@ class MultiRelationStringFieldWidget(Widget.LinesTextAreaWidget,
title='Portal Type',
description=(
"The method to call to set the relation. Required."),
css_class="form-control",
default="",
required=0)
......@@ -115,6 +120,7 @@ class MultiRelationStringFieldWidget(Widget.LinesTextAreaWidget,
title='Allow Creation',
description=(
"Do we allow to create new objects ?"),
css_class="form-check-input",
default=1,
required=0)
......@@ -122,6 +128,7 @@ class MultiRelationStringFieldWidget(Widget.LinesTextAreaWidget,
title='Container Getter Method',
description=(
"The method to call to get a container object."),
css_class="form-control",
default="",
required=0)
......@@ -129,6 +136,7 @@ class MultiRelationStringFieldWidget(Widget.LinesTextAreaWidget,
title='Context Getter Method',
description=(
"The method to call to get the context."),
css_class="form-control",
default="",
required=0)
......@@ -136,6 +144,7 @@ class MultiRelationStringFieldWidget(Widget.LinesTextAreaWidget,
title='Catalog Index',
description=(
"The method to call to set the relation. Required."),
css_class="form-control",
default="",
required=1)
......@@ -145,6 +154,7 @@ class MultiRelationStringFieldWidget(Widget.LinesTextAreaWidget,
title='Relation Update Method',
description=(
"The method to invoke in order to update the relation"),
css_class="form-control",
default="",
required=0)
......@@ -152,6 +162,7 @@ class MultiRelationStringFieldWidget(Widget.LinesTextAreaWidget,
title='Relation Form',
description=(
"Form to display relation choices"),
css_class="form-control",
default="",
required=0)
......@@ -161,6 +172,7 @@ class MultiRelationStringFieldWidget(Widget.LinesTextAreaWidget,
"The display size in rows of the field. If set to 1, the "
"widget will be displayed as a drop down box by many browsers, "
"if set to something higher, a list will be shown. Required."),
css_class="form-control",
default=1,
required=1)
......@@ -168,12 +180,14 @@ class MultiRelationStringFieldWidget(Widget.LinesTextAreaWidget,
title="Columns",
description=(
"A list of attributes names to display."),
css_class="form-control",
default=[],
required=0)
sort = fields.ListTextAreaField('sort',
title='Default Sort',
description=('The default sort keys and order'),
css_class="form-control",
default=[],
required=0)
......@@ -181,6 +195,7 @@ class MultiRelationStringFieldWidget(Widget.LinesTextAreaWidget,
title="Parameter List",
description=(
"A list of paramters used for the portal_catalog."),
css_class="form-control",
default=[],
required=0)
......@@ -188,12 +203,14 @@ class MultiRelationStringFieldWidget(Widget.LinesTextAreaWidget,
title='List Method',
description=('The method to use to list'
'objects'),
css_class="form-control",
default='',
required=0)
proxy_listbox_ids = fields.ListTextAreaField('proxy_listbox_ids',
title='Proxy Listbox IDs',
description=('A list of listbox that can be used as proxy'),
css_class="form-control",
default='',
required=0)
......
......@@ -90,6 +90,7 @@ class ProxyWidget(Widget.Widget):
title='Form ID',
description= \
"ID of the master form.",
css_class="form-control",
default="",
display_width=40,
required=1)
......@@ -99,6 +100,7 @@ class ProxyWidget(Widget.Widget):
title='Field ID',
description= \
"ID of the field in the master form.",
css_class="form-control",
default="",
display_width=40,
required=1)
......
<dtml-var manage_page_header>
<dtml-var manage_tabs>
<p class="form-help">
<main class="container-fluid">
<p class="form-help lead">
Change the display order and grouping of the fields in this form.
</p>
<table border="1" cellspacing="1" cellpadding="3">
<dtml-let all_groups="get_groups(include_empty=1)"
<table class="table table-bordered">
<dtml-let all_groups="get_groups(include_empty=1)"
group_length="get_largest_group_length()"
first_group="all_groups and all_groups[0] or None">
<dtml-in "get_group_rows()">
......@@ -14,119 +15,91 @@ Change the display order and grouping of the fields in this form.
<dtml-let groups=sequence-item>
<dtml-in groups>
<dtml-let group=sequence-item>
<td nowrap valign="top">
<table border="0" cellspacing="0" cellpadding="0">
<td>
<table class="table">
<form action="." method="POST">
<input type="hidden" name="group" value="&dtml-group;">
<tr><td align="center" class="list-header">
<div class="list-nav">
<dtml-var group html_quote>
<tr><td>
<div class="font-weight-bold">
<dtml-var group html_quote>
</div>
</td></tr>
<tr><td align="left">
<dtml-let fields="get_fields_in_group(group, include_disabled=1)" fields_amount="_.len(fields)">
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<dtml-let fields="get_fields_in_group(group)" fields_amount="_.len(fields)">
<table class="table table-borderless table-sm">
<dtml-in fields>
<dtml-let field=sequence-item field_id="field.id">
<tr><td height="25">
<div class="list-item">
<dtml-if expr="REQUEST.has_key(field_id)"><input type="checkbox" name="&dtml-field_id;" checked="checked">
<dtml-else><input type="checkbox" name="&dtml-field_id;">
</dtml-if>
&nbsp;<a href="&dtml-field_id;/manage_main"><img src="&dtml-BASEPATH1;/&dtml-icon;" alt="&dtml-meta_type;" title="&dtml-meta_type;" border="0"></a>&nbsp;<a href="&dtml-field_id;/manage_main"><dtml-var field_id></a>
</div>
<tr><td>
<input type="checkbox" name="&dtml-field_id;">&nbsp;<a href="&dtml-field_id;/manage_main"><img src="&dtml-BASEPATH1;/&dtml-icon;" alt="&dtml-meta_type;" title="&dtml-meta_type;" border="0"></a>&nbsp;<a href="&dtml-field_id;/manage_main"><dtml-var field_id></a>
</td></tr>
</dtml-let>
</dtml-in>
<dtml-in "_.range(group_length - fields_amount)">
<tr><td height="25"></td></tr>
<tr><td></td></tr>
</dtml-in>
</dtml-let>
</table>
</td></tr>
<tr><td align="center">
<input class="form-element" type="submit" name="manage_move_field_up:method"
<tr><td>
<input class="btn btn-secondary" type="submit" name="manage_move_field_up:method"
value="Move Up">
</td></tr>
<tr><td align="center">
<input class="form-element" type="submit" name="manage_move_field_down:method"
value="Move Dn"><br><br>
<input class="btn btn-secondary" type="submit" name="manage_move_field_down:method"
value="Move Dn">
</td></tr>
<tr><td align="center">
<div class="form-element">
<select class="form-element" name="to_group" size="1">
<option>Move to:</option>
<tr><td>
<div class="form-group">
<select class="form-control mb-2" name="to_group" size="1">
<option>Transfer Selected Fields to:</option>
<dtml-in all_groups>
<option><dtml-var sequence-item html_quote></option>
</dtml-in>
</select>
</div>
</td></tr>
<tr><td align="center">
<input class="form-element" type="submit" name="manage_move_group:method"
<input type="submit" class="btn btn-secondary mb-2" name="manage_move_group:method"
value="Transfer">
</div>
</td></tr>
<dtml-if "group != first_group">
<tr><td align="center" class="list-header">
<div class="list-item">
Group
<tr><td>
<div class="form-group">
<input class="btn btn-secondary" type="submit" name="manage_move_group_up:method"
value="Move Group Up">
<input class="btn btn-secondary" type="submit" name="manage_move_group_down:method"
value="Move Group Down">
</div>
</td></tr>
<tr><td align="center">
<input class="form-element" type="submit" name="manage_move_group_up:method"
value="Move Up">
</td></tr>
<tr><td align="center">
<input class="form-element" type="submit" name="manage_move_group_down:method"
value="Move Dn"><br><br>
</td></tr>
<tr><td align="center">
<input type="text" name="new_name" value="" size="10">
</td></tr>
<tr><td align="center">
<input class="form-element" type="submit" name="manage_rename_group:method"
value="Rename"><br>
<tr><td>
<div class="form-group">
<input type="text" class="form-control form-control-sm" name="new_name" value="" size="10">
<input class="btn btn-secondary" type="submit" name="manage_rename_group:method"
value="Rename Group">
</div>
</td></tr>
<tr><td align="center">
<input class="form-element" type="submit" name="manage_remove_group:method"
value="Remove"><br>
<tr><td>
<input class="btn btn-secondary" type="submit" name="manage_remove_group:method"
value="Remove Group">
</td></tr>
<dtml-else>
<tr><td align="center" class="list-header">
<div class="list-item">
Group
<tr><td>
<div class="form-group">
<input type="text" class="form-control form-control-sm" name="new_group" value="" size="10">
<input type="submit" class="btn btn-secondary" name="manage_add_group:method" value="Create Group">
</div>
</td></tr>
<tr><td align="center">
<input type="text" name="new_group" value="" size="10">
</td></tr>
<tr><td align="center">
<input type="submit" name="manage_add_group:method" value="Create"><br><br>
</td></tr>
<tr><td align="center">
<input type="text" name="new_name" value="" size="10">
</td></tr>
<tr><td align="center">
<input class="form-element" type="submit" name="manage_rename_group:method"
value="Rename"><br>
<tr><td>
<div class="form-group">
<input type="text" class="form-control form-control-sm" name="new_name" value="" size="10">
<input class="btn btn-secondary" type="submit" name="manage_rename_group:method"
value="Rename Group">
</div>
</td></tr>
</dtml-if>
......@@ -141,5 +114,5 @@ Change the display order and grouping of the fields in this form.
</dtml-in>
</dtml-let>
</table>
</main>
<dtml-var manage_page_footer>
<style>form td:not(:last-child) { padding-right: 1em; }</style>
<dtml-var manage_page_header>
<style>
textarea.form-control {
resize: both;
}
textarea.form-control, input[type=text].form-control {
font-family: monospace;
}
</style>
<dtml-let help_product="'Formulator'" help_topic=meta_type>
<dtml-var manage_tabs>
</dtml-let>
<p class="form-help">
<main class="container-fluid">
<p class="form-help lead">
Surcharge <dtml-var meta_type> properties here.
</p>
<form action="manage_edit" method="POST">
<table cellspacing="0" cellpadding="2" border="0">
<table class="table table-striped table-hover table-sm">
<dtml-let proxy_field="this()"
current_field="None if proxy_field.getTemplateField() is None else proxy_field.getRecursiveTemplateField()">
......@@ -20,7 +28,7 @@ Surcharge <dtml-var meta_type> properties here.
<dtml-if fields>
<tr>
<td colspan="3" class="form-title">
<td colspan="4" class="font-weight-bold">
Proxy Widget properties <dtml-if "current_field is not None">(<dtml-var expr="current_field.meta_type">)</dtml-if>
</td>
</tr>
......@@ -32,20 +40,20 @@ Surcharge <dtml-var meta_type> properties here.
override="current_field.get_override(field_id)"
tales="current_field.get_tales(field_id)">
<tr>
<td align="left" valign="top">
<div class="form-label">
<td>
<dtml-if "tales or override">[</dtml-if><dtml-var "field.title()"><dtml-if "field.has_value('required') and field.get_value('required')">*</dtml-if><dtml-if "tales or override">]</dtml-if>
</div>
</td>
<td align="left" valign="top">
<dtml-var "field.render(value)">
<td>
<dtml-var "field.render(value)">
</td>
<td>
<dtml-var "field.meta_type">
</td>
<td>
<p class="form-text">
<small><dtml-var "field.get_value('description')"></small>
</p>
</td>
<td><div class="form-element">
<dtml-var "field.meta_type">
</div></td>
<td><div class="form-element">
<dtml-var "field.get_value('description')">
</div></td>
</tr>
</dtml-let>
</dtml-in>
......@@ -55,19 +63,19 @@ Surcharge <dtml-var meta_type> properties here.
</dtml-in>
<tr>
<td align="left" valign="top">
<div class="form-label">Proxy Target</div>
<td>
<div>Proxy Target</div>
</td>
<td align="left" valign="top">
<a href="manage_edit_target">Click to edit the target</a>
<td>
<a href="manage_edit_target" class="btn btn-info">Click to edit the target</a>
</td>
<td></td><td></td>
</tr>
</table>
<table cellspacing="0" cellpadding="2" border="0">
<table class="table table-striped table-hover table-sm">
<!-- Then, display Template Field properties -->
<dtml-if "current_field is not None">
<dtml-let form="current_field.form">
......@@ -75,7 +83,7 @@ Surcharge <dtml-var meta_type> properties here.
<dtml-let group=sequence-item fields="form.get_fields_in_group(group)">
<dtml-if fields>
<tr>
<td colspan="3" class="form-title">
<td colspan="5" class="font-weight-bold">
<dtml-var group capitalize> properties
</td>
</tr>
......@@ -84,11 +92,12 @@ Surcharge <dtml-var meta_type> properties here.
<dtml-in fields>
<dtml-let field=sequence-item field_id="field.id"
is_datetime_field="field.meta_type == 'DateTimeField'"
value="proxy_field.get_recursive_orig_value(field_id)"
override="proxy_field.get_recursive_override(field_id)"
tales="proxy_field.get_recursive_tales(field_id)">
<tr>
<td align="left" valign="top">
<td>
<dtml-let checkbox_key="'surcharge_%s' % field_id" >
<dtml-if "proxy_field.is_delegated(field_id)">
<input type="checkbox"
......@@ -102,8 +111,7 @@ Surcharge <dtml-var meta_type> properties here.
</dtml-if >
</dtml-let >
</td>
<td align="left" valign="top">
<div class="form-label">
<td>
<dtml-if "tales or override">[
</dtml-if>
<dtml-var "field.title()">
......@@ -111,23 +119,24 @@ Surcharge <dtml-var meta_type> properties here.
</dtml-if>
<dtml-if "tales or override">]
</dtml-if>
</div>
</td>
<dtml-if "proxy_field.is_delegated(field_id)">
<td align="left" valign="top" class="to_disable delegated">
<td class="to_disable delegated <dtml-if is_datetime_field>form-inline</dtml-if>">
<dtml-var "field.render(value)">
</td>
<dtml-else >
<td align="left" valign="top" class="to_disable">
<td class="to_disable <dtml-if is_datetime_field>form-inline</dtml-if>">
<dtml-var "field.render(value)">
</td>
</dtml-if>
<td><div class="form-element">
<dtml-var "field.meta_type">
</div></td>
<td><div class="form-element">
<dtml-var "field.get_value('description')">
</div></td>
<td>
<dtml-var "field.meta_type">
</td>
<td>
<p class="form-text">
<small><dtml-var "field.get_value('description')"></small>
</p>
</td>
</tr>
</dtml-let>
</dtml-in>
......@@ -140,13 +149,13 @@ Surcharge <dtml-var meta_type> properties here.
</dtml-let>
</table>
<div class="form-element">
<input class="form-element" type="submit" name="submit"
value="Save Changes" />
</div>
<div class="zmi-controls">
<input class="btn btn-primary" type="submit" name="submit" value="Save Changes" />
</div>
</form>
</form>
</main>
<script type="text/javascript">
function isClass(object, className) {
if (object.className != undefined){
......
<tr class="list-header">
<td align="left" valign="top">
<div class="form-label">
<thead class="thead-light">
<tr>
<th>
Delegated
</div>
</td>
<td align="left" valign="top">
<div class="form-label">
</th>
<th>
Name
</div>
</td>
<td align="left" valign="top">
<div class="form-label">
</th>
<th class="w-50">
Value
</div>
</td>
<td align="left" valign="top">
<div class="form-label">
</th>
<th>
Field
</div>
</td>
</th>
<dtml-if "_['URL'].endswith(('/manage_main', '/manage_edit'))">
<td align="left" valign="top">
<div class="form-label">
<th>
Description
</div>
</td>
</th>
</dtml-if>
</tr>
</thead>
\ No newline at end of file
<style>form td:not(:last-child) { padding-right: 1em; }</style>
<dtml-var manage_page_header>
<dtml-var manage_tabs>
<p class="form-help">
<main class="container-fluid">
<p class="form-help lead">
Edit <dtml-var meta_type> method TALES expressions here.
<dtml-if "not isTALESAvailable()"><br>
<span style="color: #FF0000;">
......@@ -14,7 +14,7 @@ This tab can therefore not be used.
<form action="manage_tales" method="POST">
<table cellspacing="0" cellpadding="2" border="0">
<table class="table table-striped table-hover table-sm">
<dtml-in "override_form.get_groups()">
......@@ -22,7 +22,7 @@ This tab can therefore not be used.
<dtml-if fields>
<tr>
<td colspan="3" class="form-title">
<td colspan="3" class="font-weight-bold">
Proxy Widget properties
</td>
</tr>
......@@ -34,17 +34,15 @@ This tab can therefore not be used.
<dtml-let field=sequence-item field_id="field.id"
value="current_field.get_tales(field.id)">
<tr>
<td align="left" valign="top">
<div class="form-label">
<dtml-var "field.title()">
</div>
<td>
<dtml-var "field.title()">
</td>
<td align="left" valign="top">
<dtml-var "field.render(value)">
<td>
<dtml-var "field.render(value)">
</td>
<td>
<dtml-var "current_field.form.get_field(field.id).meta_type">
</td>
<td><div class="form-element">
<dtml-var "current_field.form.get_field(field.id).meta_type">
</div></td>
</tr>
</dtml-let>
</dtml-in>
......@@ -54,17 +52,17 @@ This tab can therefore not be used.
</dtml-in>
<tr>
<td align="left" valign="top">
<div class="form-label">Proxy Target</div>
<td>
<div>Proxy Target</div>
</td>
<td align="left" valign="top">
<a href="manage_tales_target">Click to edit the target</a>
<td>
<a href="manage_tales_target" class="btn btn-info">Click to edit the target</a>
</td>
<td></td>
</tr>
</table>
<table cellspacing="0" cellpadding="2" border="0">
<table class="table table-striped table-hover table-sm">
<!-- XXX Loop until find not a proxy field -->
<dtml-let proxy_field="this()"
......@@ -77,7 +75,7 @@ This tab can therefore not be used.
<dtml-let group=sequence-item fields="form.get_fields_in_group(group)">
<dtml-if fields>
<tr>
<td colspan="3" class="form-title">
<td colspan="4" class="font-weight-bold">
<dtml-var group capitalize> properties
</td>
</tr>
......@@ -86,11 +84,10 @@ This tab can therefore not be used.
<dtml-in fields>
<dtml-let field=sequence-item field_id="field.id"
value="proxy_field.get_recursive_tales(field_id)">
<tr>
<td align="left" valign="top">
<td>
<dtml-let checkbox_key="'surcharge_%s' % field_id" >
<dtml-if "proxy_field.is_delegated(field_id)">
<input type="checkbox"
......@@ -105,25 +102,21 @@ This tab can therefore not be used.
</dtml-let >
</td>
<td align="left" valign="top">
<div class="form-label">
<dtml-var "field.title()">
</div>
<td>
<dtml-var "field.title()">
</td>
<dtml-if "proxy_field.is_delegated(field_id)">
<td align="left" valign="top" class="to_disable delegated">
<td class="to_disable delegated">
<dtml-var "field.render(value)">
</td>
<dtml-else >
<td align="left" valign="top" class="to_disable">
<dtml-var "field.render(value)">
<td class="to_disable">
<dtml-var "field.render(value)">
</td>
</dtml-if>
<td><div class="form-element">
<dtml-var "current_field.form.get_field(field.id).meta_type">
</div></td>
<td>
<dtml-var "current_field.form.get_field(field.id).meta_type">
</td>
</tr>
</dtml-let>
......@@ -138,12 +131,14 @@ This tab can therefore not be used.
</dtml-let>
</table>
<div class="form-element">
<input class="form-element" type="submit" name="submit"
value="Save Changes" />
</div>
<div class="zmi-controls">
<input class="btn btn-primary" type="submit" name="submit" value="Save Changes" />
</div>
</form>
</main>
<script type="text/javascript">
function isClass(object, className) {
if (object.className != undefined){
......
......@@ -73,6 +73,8 @@ def initializeFieldForm(field_class):
tales_field = fields.TALESField(field.id,
title=field.get_value('title'),
description="",
css_class="form-control code",
extra='id="%s"' % field.id,
default="",
display_width=40,
required=0)
......@@ -81,6 +83,8 @@ def initializeFieldForm(field_class):
method_field = fields.MethodField(field.id,
title=field.get_value("title"),
description="",
css_class="form-control code",
extra='id="%s"' % field.id,
default="",
required=0)
override_form.add_field(method_field, "widget")
......@@ -89,6 +93,8 @@ def initializeFieldForm(field_class):
form.add_field(field, "validator")
tales_field = fields.TALESField(field.id,
title=field.get_value('title'),
css_class="form-control code",
extra='id="%s"' % field.id,
description="",
default="",
display_with=40,
......@@ -97,6 +103,8 @@ def initializeFieldForm(field_class):
method_field = fields.MethodField(field.id,
title=field.get_value("title"),
css_class="form-control code",
extra='id="%s"' % field.id,
description="",
default="",
required=0)
......
......@@ -878,9 +878,12 @@ class ZMIForm(ObjectManager, PropertyManager, RoleManager, Item, Form):
if (len(field_ids) == 1 and
self.move_field_up(field_ids[0], group)):
message = "Field %s moved up." % field_ids[0]
manage_tabs_type = "success"
else:
message = "Can't move field up."
manage_tabs_type = "danger"
return self.formOrder(self, REQUEST,
manage_tabs_type=manage_tabs_type,
manage_tabs_message=message)
security.declareProtected('Change Formulator Forms',
......@@ -892,9 +895,12 @@ class ZMIForm(ObjectManager, PropertyManager, RoleManager, Item, Form):
if (len(field_ids) == 1 and
self.move_field_down(field_ids[0], group)):
message = "Field %s moved down." % field_ids[0]
manage_tabs_type = "success"
else:
message = "Can't move field down."
manage_tabs_type = "danger"
return self.formOrder(self, REQUEST,
manage_tabs_type=manage_tabs_type,
manage_tabs_message=message)
security.declareProtected('Change Formulator Forms',
......@@ -909,9 +915,13 @@ class ZMIForm(ObjectManager, PropertyManager, RoleManager, Item, Form):
message = "Fields %s transferred from %s to %s." % (fields,
group,
to_group)
manage_tabs_type = "success"
else:
message = "Can't transfer fields."
manage_tabs_type = "danger"
return self.formOrder(self, REQUEST,
manage_tabs_type=manage_tabs_type,
manage_tabs_message=message)
security.declareProtected('Change Formulator Forms',
......@@ -923,9 +933,12 @@ class ZMIForm(ObjectManager, PropertyManager, RoleManager, Item, Form):
if (group and group != 'Select group' and
self.add_group(group)):
message = "Group %s created." % (group)
manage_tabs_type = "success"
else:
message = "Can't create group."
manage_tabs_type = "danger"
return self.formOrder(self, REQUEST,
manage_tabs_type=manage_tabs_type,
manage_tabs_message=message)
security.declareProtected('Change Formulator Forms',
......@@ -935,9 +948,12 @@ class ZMIForm(ObjectManager, PropertyManager, RoleManager, Item, Form):
"""
if self.remove_group(group):
message = "Group %s removed." % (group)
manage_tabs_type = "success"
else:
message = "Can't remove group."
manage_tabs_type = "danger"
return self.formOrder(self, REQUEST,
manage_tabs_type=manage_tabs_type,
manage_tabs_message=message)
security.declareProtected('Change Formulator Forms',
......@@ -949,12 +965,16 @@ class ZMIForm(ObjectManager, PropertyManager, RoleManager, Item, Form):
new_name = REQUEST['new_name'].strip()
if self.rename_group(group, new_name):
message = "Group %s renamed to %s." % (group, new_name)
manage_tabs_type = "success"
else:
message = "Can't rename group."
manage_tabs_type = "danger"
else:
message = "No new name supplied."
manage_tabs_type = "danger"
return self.formOrder(self, REQUEST,
manage_tabs_type=manage_tabs_type,
manage_tabs_message=message)
security.declareProtected('Change Formulator Forms',
......@@ -964,9 +984,12 @@ class ZMIForm(ObjectManager, PropertyManager, RoleManager, Item, Form):
"""
if self.move_group_up(group):
message = "Group %s moved up." % group
manage_tabs_type = "success"
else:
message = "Can't move group %s up" % group
manage_tabs_type = "danger"
return self.formOrder(self, REQUEST,
manage_tabs_type=manage_tabs_type,
manage_tabs_message=message)
security.declareProtected('Change Formulator Forms',
......@@ -976,9 +999,12 @@ class ZMIForm(ObjectManager, PropertyManager, RoleManager, Item, Form):
"""
if self.move_group_down(group):
message = "Group %s moved down." % group
manage_tabs_type = "success"
else:
message = "Can't move group %s down" % group
manage_tabs_type = "danger"
return self.formOrder(self, REQUEST,
manage_tabs_type=manage_tabs_type,
manage_tabs_message=message)
PythonForm = ZMIForm # NOTE: backwards compatibility
......
This diff is collapsed.
This diff is collapsed.
<style>form td:not(:last-child) { padding-right: 1em; }</style>
<dtml-var manage_page_header>
<style>
textarea.form-control {
resize: both;
}
textarea.form-control, input[type=text].form-control {
font-family: monospace;
}
</style>
<dtml-let help_product="'Formulator'" help_topic=meta_type>
<dtml-var manage_tabs>
</dtml-let>
<p class="form-help">
<main class="container-fluid">
<p class="form-help lead">
Edit <dtml-var meta_type> properties here.
</p>
<form action="manage_edit" method="POST">
<table cellspacing="0" cellpadding="2" border="0">
<table class="table table-striped table-hover table-sm">
<dtml-in "form.get_groups()">
<dtml-let group=sequence-item fields="form.get_fields_in_group(group)">
<dtml-if fields>
<tr>
<td colspan="4" class="form-title">
<td colspan="4" class="font-weight-bold">
<dtml-var group capitalize> properties
</td>
</tr>
......@@ -26,24 +35,25 @@ Edit <dtml-var meta_type> properties here.
<dtml-let current_field="this()">
<dtml-in fields>
<dtml-let field=sequence-item field_id="field.id"
is_datetime_field="field.meta_type == 'DateTimeField'"
value="current_field.get_orig_value(field_id)"
override="current_field.get_override(field_id)"
tales="current_field.get_tales(field_id)">
<tr>
<td align="left" valign="top">
<div class="form-label">
<dtml-if "tales or override">[</dtml-if><dtml-var "field.title()"><dtml-if "field.has_value('required') and field.get_value('required')">*</dtml-if><dtml-if "tales or override">]</dtml-if>
</div>
<td>
<dtml-if "tales or override">[</dtml-if><dtml-var "field.title()"><dtml-if "field.has_value('required') and field.get_value('required')">*</dtml-if><dtml-if "tales or override">]</dtml-if>
</td>
<td class="<dtml-if is_datetime_field>form-inline</dtml-if>">
<dtml-var "field.render(value)">
</td>
<td align="left" valign="top">
<dtml-var "field.render(value)">
<td>
<dtml-var "field.meta_type">
</td>
<td>
<p class="form-text">
<small><dtml-var "field.get_value('description')"></small>
</p>
</td>
<td valign="top" ><div class="form-element">
<dtml-var "field.meta_type">
</div></td>
<td align="left" valign="top"><div class="form-element">
<dtml-var "field.get_value('description')">
</div></td>
</tr>
</dtml-let>
</dtml-in>
......@@ -53,13 +63,12 @@ Edit <dtml-var meta_type> properties here.
</dtml-in>
</table>
<div class="form-element">
<input class="form-element" type="submit" name="submit"
value="Save Changes" />
</div>
<div class="zmi-controls">
<input class="btn btn-primary" type="submit" name="submit" value="Save Changes" />
</div>
</form>
</main>
<dtml-var manage_page_footer>
......
<tr class="list-header">
<td align="left" valign="top">
<div class="form-label">
<thead class="thead-light">
<tr>
<th>
Name
</div>
</td>
<td align="left" valign="top">
<div class="form-label">
</th>
<th class="w-50">
Value
</div>
</td>
<td align="left" valign="top">
<div class="form-label">
</th>
<th>
Field
</div>
</td>
</th>
<dtml-if "_['URL'].endswith(('/manage_main', '/manage_edit'))">
<td align="left" valign="top">
<div class="form-label">
<th>
Description
</div>
</td>
</th>
</dtml-if>
</tr>
\ No newline at end of file
</tr>
</thead>
\ No newline at end of file
<style>form td:not(:last-child) { padding-right: 1em; }</style>
<dtml-var manage_page_header>
<dtml-var manage_tabs>
<p class="form-help">
<main class="container-fluid">
<p class="form-help lead">
Edit <dtml-var meta_type> method TALES expressions here.
<dtml-if "not isTALESAvailable()"><br>
<span style="color: #FF0000;">
......@@ -13,50 +13,45 @@ This tab can therefore not be used.
</p>
<form action="manage_tales" method="POST">
<table cellspacing="0" cellpadding="2" border="0">
<dtml-in "override_form.get_groups()">
<dtml-let group=sequence-item fields="tales_form.get_fields_in_group(group)">
<dtml-if fields>
<tr>
<td colspan="3" class="form-title">
<h2>
<dtml-var group capitalize> properties
</td>
</tr>
</h2>
<dtml-var fieldListHeader>
<dtml-let current_field="this()">
<dtml-in fields>
<dtml-let field=sequence-item field_id="field.id"
value="current_field.get_tales(field.id)">
<tr>
<td align="left" valign="top">
<div class="form-label">
<dtml-var "field.title()">
</div>
</td>
<td align="left" valign="top">
<div class="form-group row">
<label
for='<dtml-var expr="field.id">'
class="form-label col-sm-3 col-md-2"><dtml-var "field.title()"></label>
<div class="col-sm-9 col-md-10">
<dtml-var "field.render(value)">
</td>
<td valign="top"><div class="form-element">
<dtml-var "current_field.form.get_field(field.id).meta_type">
</div></td>
</tr>
<small class="form-text text-muted">
<dtml-var "current_field.form.get_field(field.id).meta_type">
</small>
</div>
</div>
</dtml-let>
</dtml-in>
</dtml-let>
</dtml-if>
</dtml-let>
</dtml-in>
</table>
</div>
<div class="form-element">
<input class="form-element" type="submit" name="submit"
value="Save Changes" />
</div>
</form>
<div class="zmi-controls">
<input class="btn btn-primary" type="submit" name="submit" value="Save Changes" />
</div>
</form>
</main>
<dtml-var manage_page_footer>
  • cc @kazuhiko

    I am using Zope4 already for a new ERP5 development, the formulator ZMI was too ugly and I thought it was easy to make it better. It was not :) but I feel it's a bit better. The main improvements over the same on Zope2 is that it's using monospaced fonts and larger fields, this should help with TALES expressions.

    I tried two approaches, one with the same tables and another one with more "modern" html (without table for the layout) on normal field TALES. I'm thinking of changing the normal field TALES to use the same tables as others.

    The checkboxes are a bit ugly , but I feel it's good enough.

    What do you think ?

    normal field image

    normal field TALES

    image

    proxyfield

    image

    proxyfield TALES

    image

  • These changes will not break Zope2 compatibility, right ?

    I tried two approaches, one with the same tables and another one with more "modern" html (without table for the layout) on normal field TALES. I'm thinking of changing the normal field TALES to use the same tables as others.

    As Zope4's ZMI still uses table layout, we can follow it here as well, I think.

    https://github.com/infrae/Products.Formulator/commits/master

    The upstream does not have any change in ZMI forms. It would be good to contribute our changes...?

  • ah thanks I already forgot about Zope 2 :) it works on zope2 and it looks like this, I feel it's a bit better than before, because of the monospace fonts

    image

    I did not know formulator was on github, I thought it was completely abandoned. There have been a 10 years gap in the commit history image

    but it seems these days there have been some changes again and there might be python3 support coming ( https://github.com/infrae/Products.Formulator/issues/1 ). I think we have really a lot of patches on formulator (many custom fields, "render_view" API for non editable fields, open office support) it's like a different product so I don't think it's worth trying to use the upstream version. I'll see if I can send a patch, but this is not really a priority, just doing this for ERP5 has already taken much more time that what I was supposed to spend :)

Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment