LivraisonParSecteurs : onglet "Horaires de livraison" terminé

This commit is contained in:
2021-02-15 17:48:05 +01:00
parent 6c7b25e5a2
commit bdc040b7a4
14 changed files with 150 additions and 142 deletions

View File

@@ -7,8 +7,8 @@
<forms> <forms>
<form name="lps-area-general-update" class="LivraisonParSecteurs\Form\GeneralForm"/> <form name="lps-area-general-update" class="LivraisonParSecteurs\Form\GeneralForm"/>
<form name="lps-area-cities-update" class="LivraisonParSecteurs\Form\CitiesForm" /> <form name="lps-area-cities-update" class="LivraisonParSecteurs\Form\CitiesForm" />
<form name="lps-area-schedule-create" class="LivraisonParSecteurs\Form\ScheduleCreateForm"/>
<form name="lps-area-schedule-update" class="LivraisonParSecteurs\Form\ScheduleUpdateForm" /> <form name="lps-area-schedule-update" class="LivraisonParSecteurs\Form\ScheduleUpdateForm" />
<form name="lps-area-schedule-create" class="LivraisonParSecteurs\Form\ScheduleCreateForm"/>
</forms> </forms>
<loops> <loops>
@@ -17,12 +17,6 @@
<loop name="lps_area_cities" class="LivraisonParSecteurs\Loop\AreaCitiesLoop"/> <loop name="lps_area_cities" class="LivraisonParSecteurs\Loop\AreaCitiesLoop"/>
</loops> </loops>
<!--
<services>
</services>
-->
<hooks> <hooks>
<hook id="lps.admin.hook" class="LivraisonParSecteurs\Hook\AdminHook"> <hook id="lps.admin.hook" class="LivraisonParSecteurs\Hook\AdminHook">
<tag name="hook.event_listener" event="module.configuration" type="back" method="onModuleConfig" /> <tag name="hook.event_listener" event="module.configuration" type="back" method="onModuleConfig" />

View File

@@ -27,5 +27,8 @@
<default key="_controller">LivraisonParSecteurs\Controller\BackOfficeController::updateSchedule</default> <default key="_controller">LivraisonParSecteurs\Controller\BackOfficeController::updateSchedule</default>
</route> </route>
<route id="livraisonparsecteurs.area.schedule.create" path="admin/module/LivraisonParSecteurs/schedule/create" methods="post">
<default key="_controller">LivraisonParSecteurs\Controller\BackOfficeController::createSchedule</default>
</route>
</routes> </routes>

View File

@@ -4,6 +4,7 @@ namespace LivraisonParSecteurs\Controller;
use LivraisonParSecteurs\LivraisonParSecteurs; use LivraisonParSecteurs\LivraisonParSecteurs;
use LivraisonParSecteurs\Model\LpsAreaQuery; use LivraisonParSecteurs\Model\LpsAreaQuery;
use LivraisonParSecteurs\Model\LpsAreaSchedule;
use LivraisonParSecteurs\Model\LpsAreaScheduleQuery; use LivraisonParSecteurs\Model\LpsAreaScheduleQuery;
use Propel\Runtime\Map\TableMap; use Propel\Runtime\Map\TableMap;
use Propel\Runtime\Propel; use Propel\Runtime\Propel;
@@ -144,13 +145,72 @@ class BackOfficeController extends BaseAdminController
} }
} catch (FormValidationException $ex) { } catch (FormValidationException $ex) {
$error_msg = $this->createStandardFormValidationErrorMessage($ex); $error_msg = $this->createStandardFormValidationErrorMessage($ex);
if (false !== $error_msg) {
$this->setupFormErrorContext(
$this->getTranslator()->trans("Schedule update"),
$error_msg,
$changeForm,
$ex
);
return $this->generateErrorRedirect($changeForm);
}
} }
if ($data['success_url'] == null) { if ($data['success_url'] == null) {
return new RedirectResponse(URL::getInstance()->absoluteUrl("/admin/module/LivraisonParSecteurs")); return new RedirectResponse(URL::getInstance()->absoluteUrl("/admin/module/LivraisonParSecteurs"));
} else { } else {
return new RedirectResponse(URL::getInstance()->absoluteUrl($data['success_url'])); return $this->generateSuccessRedirect($changeForm);
} }
} }
/*
* Update a day in an area's delivery schedule
*/
public function createSchedule()
{
// Check current user authorization
if (null !== $response = $this->checkAuth(AdminResources::MODULE, LivraisonParSecteurs::getModuleCode(), AccessManager::UPDATE))
return $response;
$con = Propel::getConnection();
$con->beginTransaction();
$error_msg = "";
$changeForm = $this->createForm("lps-area-schedule-create", "form");
try {
$form = $this->validateForm($changeForm, "POST");
$data = $form->getData();
$query = new LpsAreaSchedule();
$query->fromArray($data, TableMap::TYPE_FIELDNAME);
$query->setIdArea($data['area_id']);
$query->save($con);
$con->commit();
} catch (FormValidationException $ex) {
$error_msg = $this->createStandardFormValidationErrorMessage($ex);
if (false !== $error_msg) {
$this->setupFormErrorContext(
$this->getTranslator()->trans("Schedule update"),
$error_msg,
$changeForm,
$ex
);
return $this->generateErrorRedirect($changeForm);
}
}
if ($data['success_url'] == null) {
return new RedirectResponse(URL::getInstance()->absoluteUrl("/admin/module/LivraisonParSecteurs"));
} else {
return $this->generateSuccessRedirect($changeForm);
}
}
} }

View File

@@ -19,41 +19,35 @@ class ScheduleCreateForm extends BaseForm
{ {
$this->formBuilder $this->formBuilder
->add( ->add(
"area_id", "area_id","integer", [
"integer", "label_attr" => ["for" => "attr-area-id"],
[
"required" => true,
"constraints" => [new Constraints\NotBlank()]
])
->add(
"area-schedule_id",
"integer",
[
"required" => true, "required" => true,
"constraints" => [new Constraints\NotBlank()] "constraints" => [new Constraints\NotBlank()]
]) ])
->add("day", "choice", [ ->add("day", "choice", [
"choices" => $this->getDay(), "choices" => LivraisonParSecteurs::getDayLabel(null),
"label" => $this->translator->trans("Day", [], LivraisonParSecteurs::MESSAGE_DOMAIN), "label" => $this->translator->trans("Delivery day", [], LivraisonParSecteurs::MESSAGE_DOMAIN),
"label_attr" => ["for" => "attr-area-schedule-day"], "label_attr" => ["for" => "attr-area-schedule-day"],
"required" => false, "required" => true,
"multiple" => true, "multiple" => false,
"constraints" => [new Constraints\NotBlank()],
"attr" => array() "attr" => array()
]) ])
->add("begin", "time", [ ->add("begin_time", "time", [
"label" => $this->translator->trans("Begin", [], LivraisonParSecteurs::MESSAGE_DOMAIN), "label" => $this->translator->trans("Delivery beginning time", [], LivraisonParSecteurs::MESSAGE_DOMAIN),
"label_attr" => ["for" => "attr-area-schedule-begin"], "label_attr" => ["for" => "attr-area-schedule-begin"],
"input" => "string", "input" => "string",
"widget" => "single_text", "widget" => "single_text",
"required" => false, "required" => true,
"constraints" => [new Constraints\NotBlank(), new Constraints\NotNull()],
"attr" => array() "attr" => array()
]) ])
->add("end", "time", [ ->add("end_time", "time", [
"label" => $this->translator->trans("End", [], LivraisonParSecteurs::MESSAGE_DOMAIN), "label" => $this->translator->trans("Delivery ending time", [], LivraisonParSecteurs::MESSAGE_DOMAIN),
"label_attr" => ["for" => "attr-area-schedule-end"], "label_attr" => ["for" => "attr-area-schedule-end"],
"input" => "string", "input" => "string",
"widget" => "single_text", "widget" => "single_text",
"required" => false, "required" => true,"constraints" => [new Constraints\NotBlank(), new Constraints\NotNull()],
"attr" => array() "attr" => array()
]); ]);
} }

View File

@@ -36,6 +36,7 @@ class ScheduleUpdateForm extends BaseForm
"label_attr" => ["for" => "attr-area-schedule-day"], "label_attr" => ["for" => "attr-area-schedule-day"],
"required" => true, "required" => true,
"multiple" => false, "multiple" => false,
"constraints" => [new Constraints\NotBlank()],
"attr" => array() "attr" => array()
]) ])
->add("begin_time", "time", [ ->add("begin_time", "time", [
@@ -44,6 +45,7 @@ class ScheduleUpdateForm extends BaseForm
"input" => "string", "input" => "string",
"widget" => "single_text", "widget" => "single_text",
"required" => true, "required" => true,
"constraints" => [new Constraints\NotBlank(), new Constraints\NotNull()],
"attr" => array() "attr" => array()
]) ])
->add("end_time", "time", [ ->add("end_time", "time", [
@@ -51,7 +53,7 @@ class ScheduleUpdateForm extends BaseForm
"label_attr" => ["for" => "attr-area-schedule-end"], "label_attr" => ["for" => "attr-area-schedule-end"],
"input" => "string", "input" => "string",
"widget" => "single_text", "widget" => "single_text",
"required" => true, "required" => true,"constraints" => [new Constraints\NotBlank(), new Constraints\NotNull()],
"attr" => array() "attr" => array()
]); ]);
} }

View File

@@ -5,6 +5,7 @@ return array(
'Add a new delivery day' => 'Ajouter un jour de livraison', 'Add a new delivery day' => 'Ajouter un jour de livraison',
'Area name' => 'Nom du secteur', 'Area name' => 'Nom du secteur',
'Cities' => 'Communes desservies', 'Cities' => 'Communes desservies',
'Create a delivery day' => 'Créer un nouveau jour de livraison',
'Delete an entry of schedule' => 'Supprimer un jour de livraison', 'Delete an entry of schedule' => 'Supprimer un jour de livraison',
'Delivery beginning time' => 'Début de la tournée', 'Delivery beginning time' => 'Début de la tournée',
'Delivery day' => 'Jour de livraison', 'Delivery day' => 'Jour de livraison',
@@ -15,10 +16,11 @@ return array(
'Edit an area' => 'Modifier le secteur', 'Edit an area' => 'Modifier le secteur',
'General' => 'Général', 'General' => 'Général',
'Home delivery cost' => 'Frais de livraison à domicile', 'Home delivery cost' => 'Frais de livraison à domicile',
'Modify a schedule' => 'Modifier un jour de livraison', 'Modify a delivery day' => 'Modifier un jour de livraison',
'My areas' => 'Mes secteurs de livraison', 'My areas' => 'Mes secteurs de livraison',
'Save' => 'Sauvegarder', 'Save' => 'Sauvegarder',
'Schedule' => 'Horaires de livraison', 'Schedule' => 'Horaires de livraison',
'There is no schedule for this area' => 'Aucune livraison actuellement sur ce secteur',
'Title of config view' => 'Module LivraisonParSecteurs - Configuration', 'Title of config view' => 'Module LivraisonParSecteurs - Configuration',
'Monday' => 'Lundi', 'Monday' => 'Lundi',
'Tuesday' => 'Mardi', 'Tuesday' => 'Mardi',

View File

@@ -83,8 +83,7 @@ class LivraisonParSecteurs extends AbstractDeliveryModule
{ {
$translator = Translator::getInstance(); $translator = Translator::getInstance();
if ($int === null) { $days = [
return [
$translator->trans("Monday", [], LivraisonParSecteurs::MESSAGE_DOMAIN), $translator->trans("Monday", [], LivraisonParSecteurs::MESSAGE_DOMAIN),
$translator->trans("Tuesday", [], LivraisonParSecteurs::MESSAGE_DOMAIN), $translator->trans("Tuesday", [], LivraisonParSecteurs::MESSAGE_DOMAIN),
$translator->trans("Wednesday", [], LivraisonParSecteurs::MESSAGE_DOMAIN), $translator->trans("Wednesday", [], LivraisonParSecteurs::MESSAGE_DOMAIN),
@@ -93,18 +92,10 @@ class LivraisonParSecteurs extends AbstractDeliveryModule
$translator->trans("Saturday", [], LivraisonParSecteurs::MESSAGE_DOMAIN), $translator->trans("Saturday", [], LivraisonParSecteurs::MESSAGE_DOMAIN),
$translator->trans("Sunday", [], LivraisonParSecteurs::MESSAGE_DOMAIN) $translator->trans("Sunday", [], LivraisonParSecteurs::MESSAGE_DOMAIN)
]; ];
}
if ($int === null)
return $days;
else else
{ return $days[$int];
return [
$translator->trans("Monday", [], LivraisonParSecteurs::MESSAGE_DOMAIN),
$translator->trans("Tuesday", [], LivraisonParSecteurs::MESSAGE_DOMAIN),
$translator->trans("Wednesday", [], LivraisonParSecteurs::MESSAGE_DOMAIN),
$translator->trans("Thursday", [], LivraisonParSecteurs::MESSAGE_DOMAIN),
$translator->trans("Friday", [], LivraisonParSecteurs::MESSAGE_DOMAIN),
$translator->trans("Saturday", [], LivraisonParSecteurs::MESSAGE_DOMAIN),
$translator->trans("Sunday", [], LivraisonParSecteurs::MESSAGE_DOMAIN)
][$int];
}
} }
} }

View File

@@ -71,10 +71,7 @@
}); });
var hash = location.hash.slice(1); var hash = location.hash.slice(1);
if (!hash) { if (!hash) hash = "general";
hash = "general";
}
$('#tabbed-menu a[href="#' + hash + '"]').tab('show'); $('#tabbed-menu a[href="#' + hash + '"]').tab('show');
}); });
</script> </script>

View File

@@ -4,18 +4,20 @@
{render_form_field form=$form field="success_url" value={url path="/admin/module/LivraisonParSecteurs/edit?area_id={$area_id}#schedule"}} {render_form_field form=$form field="success_url" value={url path="/admin/module/LivraisonParSecteurs/edit?area_id={$area_id}#schedule"}}
{render_form_field form=$form field="error_url" value={url path="/admin/module/LivraisonParSecteurs/edit?area_id={$area_id}#schedule"}} {render_form_field form=$form field="error_url" value={url path="/admin/module/LivraisonParSecteurs/edit?area_id={$area_id}#schedule"}}
{form_field form=$form field="area-schedule_id"}
<div class="form-group hidden">
<input type="hidden" class="form-control" name="{$name}" id="{$label_attr.for}"
value="{$area-schedule_id|default:$ID}"/>
</div>
{/form_field}
{form_field form=$form field="area_id"} {form_field form=$form field="area_id"}
<div class="form-group hidden"> <div class="form-group hidden">
<input type="hidden" class="form-control" name="{$name}" id="{$label_attr.for}" <input type="hidden" class="form-control" name="{$name}" id="{$label_attr.for}"
value="{$area_id}"/> value="{$area_id}"/>
</div> </div>
{/form_field} {/form_field}
{if {$update|default:false} == true}
{form_field form=$form field="area-schedule_id"}
<div class="form-group hidden">
<input type="hidden" class="form-control" name="{$name}" id="{$label_attr.for}"
value=""/>
</div>
{/form_field}
{/if}
{form_field form=$form field="day"} {form_field form=$form field="day"}
<div class="form-group {if $error}has-error{/if}"> <div class="form-group {if $error}has-error{/if}">
@@ -25,7 +27,7 @@
</label> </label>
{form_error form=$form field="day"}{$message}{/form_error} {form_error form=$form field="day"}{$message}{/form_error}
<select class="form-control" name="{$name}" id="{$label_attr.for}" {if {$update|default:false} == false}multiple{/if}> <select class="form-control" name="{$name}" id="{$label_attr.for}">
{if {$update|default:false} == true} {if {$update|default:false} == true}
<option value="" selected></option> <option value="" selected></option>
{/if} {/if}
@@ -36,10 +38,11 @@
</div> </div>
{/form_field} {/form_field}
{if {$update|default:false} == false} {if {$update|default:false} == false}
<!-- Mode Création d'un nouveau créneau /-->
<div class="row"> <div class="row">
<div class="col-sm-12"> <div class="col-sm-12">
<h3>{intl l="AM" d='livraisonparsecteurs'}</h3>
{form_field form=$form field="begin_time"} {form_field form=$form field="begin_time"}
<div class="form-group {if $error}has-error{/if}"> <div class="form-group {if $error}has-error{/if}">
<label class="control-label" for="{$label_attr.for}"> <label class="control-label" for="{$label_attr.for}">
@@ -75,6 +78,7 @@
</div> </div>
</div> </div>
{else} {else}
<!-- Mode Modification d'un créneau existant /-->
{form_field form=$form field="begin_time"} {form_field form=$form field="begin_time"}
<div class="form-group {if $error}has-error{/if}"> <div class="form-group {if $error}has-error{/if}">
<label class="control-label" for="{$label_attr.for}"> <label class="control-label" for="{$label_attr.for}">

View File

@@ -23,7 +23,8 @@
{/form_field} {/form_field}
<div class="row form-inline"> <div class="row form-inline">
<div class="col-md-6"> <div class="col-md-3">&nbsp;</div>
<div class="col-md-3">
{form_field form=$form field="active"} {form_field form=$form field="active"}
<div class="form-group"> <div class="form-group">
<label class="control-label" for="{$label_attr.for}"> <label class="control-label" for="{$label_attr.for}">
@@ -40,7 +41,7 @@
{/form_field} {/form_field}
</div> </div>
<div class="col-md-6"> <div class="col-md-3">
{form_field form=$form field="price"} {form_field form=$form field="price"}
<div class="form-group form-inline"> <div class="form-group form-inline">
<label class="control-label" for="{$label_attr.for}"> <label class="control-label" for="{$label_attr.for}">
@@ -53,6 +54,7 @@
{form_error form=$form field="price"}{$message}{/form_error} {form_error form=$form field="price"}{$message}{/form_error}
{/form_field} {/form_field}
</div> </div>
<div class="col-md-3">&nbsp;</div>
</div> </div>
</form> </form>
{/loop} {/loop}

View File

@@ -9,6 +9,14 @@
<form action="{url path='/admin/module/LivraisonParSecteurs/edit' area_id={$area_id}}" method="POST" class="clearfix" {form_enctype form=$form}> <form action="{url path='/admin/module/LivraisonParSecteurs/edit' area_id={$area_id}}" method="POST" class="clearfix" {form_enctype form=$form}>
{form_hidden_fields form=$form} {form_hidden_fields form=$form}
{include
file = "includes/inner-form-toolbar.html"
hide_flags = true
hide_submit_buttons = true
close_url = "{url path='/admin/module/LivraisonParSecteurs'}"
current_tab = "schedule"
}
{form_field form=$form field="area_id"} {form_field form=$form field="area_id"}
<input type="hidden" name="{$name}" value="{$area_id}"/> <input type="hidden" name="{$name}" value="{$area_id}"/>
{/form_field} {/form_field}
@@ -21,7 +29,7 @@
<caption class="clearfix"> <caption class="clearfix">
{loop name="auth-create" type="auth" role="ADMIN" resource="admin.lps.schedule" access="CREATE" module="LivraisonParSecteurs"} {loop name="auth-create" type="auth" role="ADMIN" resource="admin.lps.schedule" access="CREATE" module="LivraisonParSecteurs"}
<div class="pull-right"> <div class="pull-right">
<a class="btn btn-default btn-primary area-schedule-default" <a class="btn btn-default btn-primary area-schedule-add"
title="{intl l='Add a new delivery day' d='livraisonparsecteurs'}" title="{intl l='Add a new delivery day' d='livraisonparsecteurs'}"
data-target="#area-schedule-create" data-toggle="modal"> data-target="#area-schedule-create" data-toggle="modal">
<i class="glyphicon glyphicon-plus-sign"></i> <i class="glyphicon glyphicon-plus-sign"></i>

View File

@@ -16,15 +16,10 @@
$("#attr-area-schedule-day").prop('required', true); $("#attr-area-schedule-day").prop('required', true);
}); });
$('a.area-schedule-add').click(function (ev) {
$("#attr-area-schedule-begin input, #attr-area-schedule-end input").prop('required', false);
// $('a.dealer-schedules-default').click(function (ev) { $("#attr-area-schedule-day").prop('required', true);
// $(".period").addClass("hidden"); });
// $("#attr-dealer-schedules-closed", "#dealer-schedules-create").val("0");
// $("#attr-dealer-schedules-period-begin input, #attr-dealer-schedules-period-end input").prop('required', false);
// $("#attr-dealer-schedules-day").prop('required', true);
// $('#attr-dealer-schedules-day option').prop('selected', false);
// });
{$langcode = {lang attr="code"}|substr:0:2} {$langcode = {lang attr="code"}|substr:0:2}
$(document).ready(function () { $(document).ready(function () {

View File

@@ -1,62 +0,0 @@
{* CREATE Modal *}
{form name="lps-area-schedule-create"}
{capture "schedule_create"}
{include file="form/dealer-schedules-create.html" form_name="lps-area-schedule-create" area_id=$smarty.get.area_id}
{/capture}
{include file="includes/generic-create-dialog.html"
dialog_id = "dealer-schedules-create"
dialog_title = {intl l="Create a schedules" d="dealer.bo.default"}
dialog_body = {$smarty.capture.schedules_create nofilter}
dialog_ok_label = {intl l="Create"}
dialog_cancel_label = {intl l="Cancel"}
form_action = {url path="admin/module/Dealer/schedules"}
form_enctype = {form_enctype form=$form}
}
{/form}
{*Update Modal*}
{form name="dealer-schedules.update"}
{capture "schedules_update"}
{form_field form=$form field="id"}
<input type="hidden" id="{$label_attr.for}" name="{$name}" value=""/>
{/form_field}
{* {include file="form/dealer-schedules-create.html" form_name="dealer-schedules.update" dealer_id=$smarty.get.dealer_id update=true} *}
{/capture}
{include file="includes/generic-create-dialog.html"
dialog_id = "dealer-schedules-update"
dialog_title = {intl l="Modify a schedules" d="dealer.bo.default"}
dialog_body = {$smarty.capture.schedules_update nofilter}
dialog_ok_label = {intl l="Save"}
dialog_cancel_label = {intl l="Cancel"}
form_action = {url path="admin/module/Dealer/schedules/update"}
form_enctype = {form_enctype form=$form}
}
{/form}
{* DELETE modal *}
{capture "schedules_delete"}
{intl l="Do you really want to delete this schedules ?" d="dealer.bo.default"}
<input type="hidden" name="dealer-schedules_id" id="dealer_schedules_delete_id" value=""/>
<input type="hidden" name="dealer_id" value="{$smarty.get.dealer_id}"/>
<input type="hidden" name="success_url" value="{url path="/admin/module/Dealer/dealer/edit?dealer_id={$dealer_id}#schedules"}"/>
{/capture}
{include file="includes/generic-confirm-dialog.html"
dialog_id = "dealer-schedules-delete"
dialog_title = {intl l="Delete an entry of schedules" d="dealer.bo.default"}
dialog_message = {$smarty.capture.schedules_delete nofilter}
dialog_ok_label = {intl l="Delete"}
dialog_cancel_label = {intl l="Cancel"}
form_action = {token_url path='/admin/module/Dealer/schedules/delete'}
}

View File

@@ -31,7 +31,7 @@ form_action = {token_url path='/admin/module/LivraisonParSecteurs/schedu
{include file="includes/generic-create-dialog.html" {include file="includes/generic-create-dialog.html"
dialog_id = "area-schedule-update" dialog_id = "area-schedule-update"
dialog_title = {intl l="Modify a schedule" d="livraisonparsecteurs"} dialog_title = {intl l="Modify a delivery day" d="livraisonparsecteurs"}
dialog_body = {$smarty.capture.schedule_update nofilter} dialog_body = {$smarty.capture.schedule_update nofilter}
dialog_ok_label = {intl l="Save"} dialog_ok_label = {intl l="Save"}
dialog_cancel_label = {intl l="Cancel"} dialog_cancel_label = {intl l="Cancel"}
@@ -39,3 +39,21 @@ form_action = {token_url path='/admin/module/LivraisonParSecteurs/schedu
form_enctype = {form_enctype form=$form} form_enctype = {form_enctype form=$form}
} }
{/form} {/form}
{* CREATE Modal *}
{form name="lps-area-schedule-create"}
{capture "schedule_create"}
{include file="form/area-schedule-create.html" form_name="lps-area-schedule-create" area_id=$smarty.get.area_id}
{/capture}
{include file="includes/generic-create-dialog.html"
dialog_id = "area-schedule-create"
dialog_title = {intl l="Create a delivery day" d="livraisonparsecteurs"}
dialog_body = {$smarty.capture.schedule_create nofilter}
dialog_ok_label = {intl l="Create"}
dialog_cancel_label = {intl l="Cancel"}
form_action = {url path="admin/module/LivraisonParSecteurs/schedule/create"}
form_enctype = {form_enctype form=$form}
}
{/form}