LivraisonParSecteurs : partie back-office terminée !!!

This commit is contained in:
2021-02-16 17:09:17 +01:00
parent 54a4b98b7d
commit c3af0a66ba
22 changed files with 603 additions and 162 deletions

View File

@@ -9,6 +9,7 @@
<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-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"/> <form name="lps-area-schedule-create" class="LivraisonParSecteurs\Form\ScheduleCreateForm"/>
<form name="lps-area-cities-add" class="LivraisonParSecteurs\Form\CitiesAddForm"/>
</forms> </forms>
<loops> <loops>

View File

@@ -5,30 +5,40 @@
xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd"> xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
<route id="livraisonparsecteurs.area.list" path="/admin/module/LivraisonParSecteurs"> <route id="livraisonparsecteurs.area.list" path="/admin/module/LivraisonParSecteurs">
<default key="_controller">LivraisonParSecteurs\Controller\BackOfficeController::viewAction</default> <default key="_controller">LivraisonParSecteurs\Controller\backOffice\ListController::viewAction</default>
</route> </route>
<route id="livraisonparsecteurs.toggle.active" path="/admin/module/LivraisonParSecteurs/toggle-online/{id}" methods="post"> <route id="livraisonparsecteurs.toggle.active" path="/admin/module/LivraisonParSecteurs/toggle-online/{id}" methods="post">
<default key="_controller">LivraisonParSecteurs\Controller\BackOfficeController::toggleActive</default> <default key="_controller">LivraisonParSecteurs\Controller\backOffice\ListController::toggleActive</default>
<requirement key="id">\d+</requirement> <requirement key="id">\d+</requirement>
</route> </route>
<route id="livraisonparsecteurs.area.view" path="/admin/module/LivraisonParSecteurs/edit" methods="get"> <route id="livraisonparsecteurs.area.view" path="/admin/module/LivraisonParSecteurs/edit" methods="get">
<default key="_controller">LivraisonParSecteurs\Controller\BackOfficeController::viewArea</default> <default key="_controller">LivraisonParSecteurs\Controller\backOffice\GeneralController::viewArea</default>
</route> </route>
<route id="livraisonparsecteurs.area.edit" path="/admin/module/LivraisonParSecteurs/edit" methods="post"> <route id="livraisonparsecteurs.area.edit" path="/admin/module/LivraisonParSecteurs/edit" methods="post">
<default key="_controller">LivraisonParSecteurs\Controller\BackOfficeController::editArea</default> <default key="_controller">LivraisonParSecteurs\Controller\backOffice\GeneralController::editArea</default>
</route> </route>
<route id="livraisonparsecteurs.area.schedule.delete" path="/admin/module/LivraisonParSecteurs/schedule/delete" methods="post"> <route id="livraisonparsecteurs.area.schedule.delete" path="/admin/module/LivraisonParSecteurs/schedule/delete" methods="post">
<default key="_controller">LivraisonParSecteurs\Controller\BackOfficeController::deleteSchedule</default> <default key="_controller">LivraisonParSecteurs\Controller\backOffice\ScheduleController::deleteSchedule</default>
</route> </route>
<route id="livraisonparsecteurs.area.schedule.update" path="admin/module/LivraisonParSecteurs/schedule/update" methods="post"> <route id="livraisonparsecteurs.area.schedule.update" path="admin/module/LivraisonParSecteurs/schedule/update" methods="post">
<default key="_controller">LivraisonParSecteurs\Controller\BackOfficeController::updateSchedule</default> <default key="_controller">LivraisonParSecteurs\Controller\backOffice\ScheduleController::updateSchedule</default>
</route> </route>
<route id="livraisonparsecteurs.area.schedule.create" path="admin/module/LivraisonParSecteurs/schedule/create" methods="post"> <route id="livraisonparsecteurs.area.schedule.create" path="admin/module/LivraisonParSecteurs/schedule/create" methods="post">
<default key="_controller">LivraisonParSecteurs\Controller\BackOfficeController::createSchedule</default> <default key="_controller">LivraisonParSecteurs\Controller\backOffice\ScheduleController::createSchedule</default>
</route> </route>
<route id="livraisonparsecteurs.area.cities.remove" path="/admin/module/LivraisonParSecteurs/city/remove" methods="post">
<default key="_controller">LivraisonParSecteurs\Controller\backOffice\CitiesController::removeCity</default>
</route>
<route id="livraisonparsecteurs.area.cities.add" path="/admin/module/LivraisonParSecteurs/city/add" methods="post">
<default key="_controller">LivraisonParSecteurs\Controller\backOffice\CitiesController::addCity</default>
</route>
</routes> </routes>

View File

@@ -0,0 +1,101 @@
<?php
namespace LivraisonParSecteurs\Controller\backOffice;
use LivraisonParSecteurs\LivraisonParSecteurs;
use LivraisonParSecteurs\Model\LpsAreaCity;
use LivraisonParSecteurs\Model\LpsAreaCityQuery;
use LivraisonParSecteurs\Model\LpsAreaSchedule;
use Propel\Runtime\Map\TableMap;
use Propel\Runtime\Propel;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Thelia\Controller\Admin\BaseAdminController;
use Thelia\Core\Security\AccessManager;
use Thelia\Core\Security\Resource\AdminResources;
use Thelia\Form\Exception\FormValidationException;
use Thelia\Tools\URL;
/**
* Class CitiesController
* @package LivraisonParSecteurs\Controller
*/
class CitiesController extends BaseAdminController
{
/*
* Remove a city from an area delivery tour
*/
public function removeCity()
{
// Check current user authorization
if (null !== $response = $this->checkAuth(AdminResources::MODULE, LivraisonParSecteurs::getModuleCode(), AccessManager::UPDATE))
return $response;
$areaCity_id = $this->getRequest()->get('area-cities_id');
$query = LpsAreaCityQuery::create()->findById($areaCity_id);
if ($query === null)
$error_msg = "City not found by Id in this area";
else
{
$con = Propel::getConnection();
$con->beginTransaction();
$query->delete($con);
$con->commit();
}
if ($this->getRequest()->request->get("success_url") == null) {
return new RedirectResponse(URL::getInstance()->absoluteUrl("/admin/module/LivraisonParSecteurs"));
} else {
return new RedirectResponse(URL::getInstance()->absoluteUrl($this->getRequest()->request->get("success_url")));
}
}
/*
* Add a new delivered city in an area
*/
public function addCity()
{
// Check current user authorization
if (null !== $response = $this->checkAuth(AdminResources::MODULE, LivraisonParSecteurs::getModuleCode(), AccessManager::UPDATE))
return $response;
$con = Propel::getConnection();
$con->beginTransaction();
$error_msg = "";
$addForm = $this->createForm("lps-area-cities-add", "form");
try {
$form = $this->validateForm($addForm, "POST");
$data = $form->getData();
$query = new LpsAreaCity();
$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("City add"),
$error_msg,
$addForm,
$ex
);
return $this->generateErrorRedirect($addForm);
}
}
if ($data['success_url'] == null) {
return new RedirectResponse(URL::getInstance()->absoluteUrl("/admin/module/LivraisonParSecteurs"));
} else {
return $this->generateSuccessRedirect($addForm);
}
}
}

View File

@@ -0,0 +1,71 @@
<?php
namespace LivraisonParSecteurs\Controller\backOffice;
use LivraisonParSecteurs\LivraisonParSecteurs;
use LivraisonParSecteurs\Model\LpsAreaQuery;
use Propel\Runtime\Map\TableMap;
use Propel\Runtime\Propel;
use Thelia\Controller\Admin\BaseAdminController;
use Thelia\Core\Security\AccessManager;
use Thelia\Core\Security\Resource\AdminResources;
use Thelia\Form\Exception\FormValidationException;
/**
* Class GeneralController
* @package LivraisonParSecteurs\Controller
*/
class GeneralController extends BaseAdminController
{
public function updatePrice($params = [])
{
return $this->render("deliveryarea-list");
}
public function viewArea()
{
$selectedArea = LpsAreaQuery::create()->findOneById($this->getRequest()->query->get("area_id"));
return $this->render("deliveryarea-edit", array('module_code' => LivraisonParSecteurs::getModuleCode(),
'area_id' => $selectedArea));
}
public function editArea()
{
// Check current user authorization
if (null !== $response = $this->checkAuth(AdminResources::MODULE, LivraisonParSecteurs::getModuleCode(), AccessManager::VIEW))
return $response;
$con = Propel::getConnection();
$con->beginTransaction();
$error_msg = "";
$changeForm = $this->createForm("lps-area-general-update", "form");
try {
$form = $this->validateForm($changeForm, "POST");
$data = $form->getData();
$area = LpsAreaQuery::create()->findOneById($data['area_id']);
if ($area === null) {
$error_msg = "Delivery area not found by Id";
}
else {
$area->fromArray($data, TableMap::TYPE_FIELDNAME);
$area->save();
$con->commit();
}
} catch (FormValidationException $ex) {
$error_msg = $this->createStandardFormValidationErrorMessage($ex);
}
if ($this->getRequest()->get('save_mode') == 'stay')
return $this->render("deliveryarea-edit");
return $this->render("deliveryarea-list");
}
}

View File

@@ -0,0 +1,34 @@
<?php
namespace LivraisonParSecteurs\Controller\backOffice;
use LivraisonParSecteurs\LivraisonParSecteurs;
use LivraisonParSecteurs\Model\LpsAreaQuery;
use Thelia\Controller\Admin\BaseAdminController;
use Thelia\Core\Security\AccessManager;
use Thelia\Core\Security\Resource\AdminResources;
/**
* Class ListController
* @package LivraisonParSecteurs\Controller
*/
class ListController extends BaseAdminController
{
public function viewAction($params = [])
{
return $this->render("deliveryarea-list");
}
public function toggleActive($id)
{
// Check current user authorization
if (null !== $response = $this->checkAuth(AdminResources::MODULE, LivraisonParSecteurs::getModuleCode(), AccessManager::UPDATE))
return $response;
$deliveryarea = LpsAreaQuery::create()->findOneById($id);
$deliveryarea->setActive($deliveryarea->getActive() ? 0 : 1)->save();
return $this->render("deliveryarea-list");
}
}

View File

@@ -1,9 +1,8 @@
<?php <?php
namespace LivraisonParSecteurs\Controller; namespace LivraisonParSecteurs\Controller\backOffice;
use LivraisonParSecteurs\LivraisonParSecteurs; use LivraisonParSecteurs\LivraisonParSecteurs;
use LivraisonParSecteurs\Model\LpsAreaQuery;
use LivraisonParSecteurs\Model\LpsAreaSchedule; use LivraisonParSecteurs\Model\LpsAreaSchedule;
use LivraisonParSecteurs\Model\LpsAreaScheduleQuery; use LivraisonParSecteurs\Model\LpsAreaScheduleQuery;
use Propel\Runtime\Map\TableMap; use Propel\Runtime\Map\TableMap;
@@ -16,75 +15,11 @@ use Thelia\Form\Exception\FormValidationException;
use Thelia\Tools\URL; use Thelia\Tools\URL;
/** /**
* Class BackOfficeController * Class ScheduleController
* @package LivraisonParSecteurs\Controller * @package LivraisonParSecteurs\Controller
*/ */
class BackOfficeController extends BaseAdminController class ScheduleController extends BaseAdminController
{ {
public function viewAction($params = [])
{
return $this->render("deliveryarea-list");
}
public function toggleActive($id)
{
// Check current user authorization
if (null !== $response = $this->checkAuth(AdminResources::MODULE, LivraisonParSecteurs::getModuleCode(), AccessManager::UPDATE))
return $response;
$deliveryarea = LpsAreaQuery::create()->findOneById($id);
$deliveryarea->setActive($deliveryarea->getActive() ? 0 : 1)->save();
return $this->render("deliveryarea-list");
}
public function updatePrice($params = [])
{
return $this->render("deliveryarea-list");
}
public function viewArea()
{
$selectedArea = LpsAreaQuery::create()->findOneById($this->getRequest()->query->get("area_id"));
return $this->render("deliveryarea-edit", array('module_code' => LivraisonParSecteurs::getModuleCode(),
'area_id' => $selectedArea));
}
public function editArea()
{
// Check current user authorization
if (null !== $response = $this->checkAuth(AdminResources::MODULE, LivraisonParSecteurs::getModuleCode(), AccessManager::VIEW))
return $response;
$con = Propel::getConnection();
$con->beginTransaction();
$error_msg = "";
$changeForm = $this->createForm("lps-area-general-update", "form");
try {
$form = $this->validateForm($changeForm, "POST");
$data = $form->getData();
$area = LpsAreaQuery::create()->findOneById($data['area_id']);
if ($area === null) {
$error_msg = "Delivery area not found by Id";
}
else {
$area->fromArray($data, TableMap::TYPE_FIELDNAME);
$area->save();
$con->commit();
}
} catch (FormValidationException $ex) {
$error_msg = $this->createStandardFormValidationErrorMessage($ex);
}
if ($this->getRequest()->get('save_mode') == 'stay')
return $this->render("deliveryarea-edit");
return $this->render("deliveryarea-list");
}
/* /*
* Delete a day in an area's delivery schedule * Delete a day in an area's delivery schedule
@@ -167,8 +102,8 @@ class BackOfficeController extends BaseAdminController
/* /*
* Update a day in an area's delivery schedule * Add a new delivery day in an area
*/ */
public function createSchedule() public function createSchedule()
{ {
// Check current user authorization // Check current user authorization
@@ -210,7 +145,6 @@ class BackOfficeController extends BaseAdminController
} else { } else {
return $this->generateSuccessRedirect($changeForm); return $this->generateSuccessRedirect($changeForm);
} }
} }
} }

View File

@@ -0,0 +1,58 @@
<?php
namespace LivraisonParSecteurs\Form;
use LivraisonParSecteurs\LivraisonParSecteurs;
use Thelia\Form\BaseForm;
use Symfony\Component\Validator\Constraints;
/**
* Class CitiesAddForm
* @package LivraisonParSecteurs\Form
*/
class CitiesAddForm extends BaseForm
{
/**
* @inheritDoc
*/
protected function buildForm()
{
$this->formBuilder
->add("area_id","integer", [
"label_attr" => ["for" => "attr-area-id"],
"required" => true,
"constraints" => [new Constraints\NotBlank()]
])
->add("zipcode", "integer", [
"label" => $this->translator->trans("Zipcode", [], LivraisonParSecteurs::MESSAGE_DOMAIN),
"label_attr" => ["for" => "attr-city-zipcode"],
"required" => true,
"constraints" => [new Constraints\NotBlank(), new Constraints\NotNull()],
])
->add("title", "text", [
"label" => $this->translator->trans("City", [], LivraisonParSecteurs::MESSAGE_DOMAIN),
"label_attr" => ["for" => "attr-city-title"],
"required" => true,
"constraints" => [new Constraints\NotBlank(), new Constraints\NotNull()],
"attr" => array()
])
->add("latitude", "number", [
"label" => $this->translator->trans("Latitude", [], LivraisonParSecteurs::MESSAGE_DOMAIN),
"label_attr" => ["for" => "attr-city-latitude"],
"required" => false
])
->add("longitude", "number", [
"label" => $this->translator->trans("Longitude", [], LivraisonParSecteurs::MESSAGE_DOMAIN),
"label_attr" => ["for" => "attr-city-longitude"],
"required" => false
]);
}
/**
* @inheritDoc
*/
public function getName()
{
return "lps-area-cities-add";
}
}

View File

@@ -23,14 +23,15 @@ class CitiesForm extends BaseForm
"integer", "integer",
[ [
"required" => true, "required" => true,
"constraints" => [new Constraints\NotBlank()] "constraints" => [new Constraints\NotBlank()],
'label' => $this->translator->trans('Area Id', [], LivraisonParSecteurs::DOMAIN_NAME)
]) ])
->add( ->add(
'zipcode', 'zipcode',
'integer', 'integer',
[ [
'constraints' => [new Constraints\NotBlank()], 'constraints' => [new Constraints\NotBlank()],
'label' => $this->translator->trans('Delivery price', [], LivraisonParSecteurs::DOMAIN_NAME) 'label' => $this->translator->trans('Zipcode', [], LivraisonParSecteurs::DOMAIN_NAME)
]); ]);
} }

View File

@@ -35,11 +35,10 @@ class ScheduleCreateForm extends BaseForm
]) ])
->add("begin_time", "time", [ ->add("begin_time", "time", [
"label" => $this->translator->trans("Delivery beginning time", [], 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-start"],
"input" => "string", "input" => "string",
"widget" => "single_text", "widget" => "single_text",
"required" => true, "required" => true,"constraints" => [new Constraints\NotBlank(), new Constraints\NotNull()],
"constraints" => [new Constraints\NotBlank(), new Constraints\NotNull()],
"attr" => array() "attr" => array()
]) ])
->add("end_time", "time", [ ->add("end_time", "time", [

View File

@@ -2,11 +2,13 @@
return array( return array(
'Active' => 'Actif', 'Active' => 'Actif',
'Actions' => 'Actions', 'Actions' => 'Actions',
'Add a new city' => 'Rajouter une commune',
'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',
'City' => 'Commune', 'City' => 'Commune',
'Create a delivery day' => 'Créer un nouveau jour de livraison', 'Create a delivery day' => 'Créer un nouveau jour de livraison',
'Delete a city from this area' => 'Supprimer une commune de livraison',
'Delete an entry of schedule' => 'Supprimer un jour de livraison', 'Delete an entry of schedule' => 'Supprimer un jour de livraison',
'Delivered cities count' => 'Nb de communes desservies', 'Delivered cities count' => 'Nb de communes desservies',
'Delivery beginning time' => 'Début de la tournée', 'Delivery beginning time' => 'Début de la tournée',
@@ -14,14 +16,18 @@ return array(
'Delivery days' => 'Jours de livraison', 'Delivery days' => 'Jours de livraison',
'Delivery ending time' => 'Fin de la tournée', 'Delivery ending time' => 'Fin de la tournée',
'Delivery price' => 'Frais de livraison', 'Delivery price' => 'Frais de livraison',
'Do you really want to remove this city ?' => 'Voulez-vous réellement retirer cette commune de ce secteur de livraison ?',
'Do you really want to delete this delivery day ?' => 'Voulez-vous réellement supprimer ce jour de livraison ?', 'Do you really want to delete this delivery day ?' => 'Voulez-vous réellement supprimer ce jour de livraison ?',
'Edit an area' => 'Modifier le secteur', 'Edit an area' => 'Modifier le secteur',
'Format to respect' => 'Merci de respecter le format 50.255612 ou -3.121146 (le séparateur est un point et le nombre peut être négatif)',
'General' => 'Général', 'General' => 'Général',
'Home delivery cost' => 'Frais de livraison à domicile', 'Home delivery cost' => 'Frais de livraison à domicile',
'Modify a delivery day' => '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',
'Remove this city' => 'Retirer cette commune',
'Save' => 'Sauvegarder', 'Save' => 'Sauvegarder',
'Schedule' => 'Horaires de livraison', 'Schedule' => 'Horaires de livraison',
'There is no city delivered in this area' => 'Aucune commune desservie dans ce secteur',
'There is no schedule for this area' => 'Aucune livraison actuellement sur ce secteur', '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',
'Zipcode' => 'Code postal', 'Zipcode' => 'Code postal',

View File

@@ -3,12 +3,15 @@
namespace LivraisonParSecteurs\Loop; namespace LivraisonParSecteurs\Loop;
use LivraisonParSecteurs\Model\LpsAreaCityQuery; use LivraisonParSecteurs\Model\LpsAreaCityQuery;
use Propel\Runtime\ActiveQuery\Criteria;
use Thelia\Core\Template\Element\BaseLoop; use Thelia\Core\Template\Element\BaseLoop;
use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResult;
use Thelia\Core\Template\Element\LoopResultRow; use Thelia\Core\Template\Element\LoopResultRow;
use Thelia\Core\Template\Element\PropelSearchLoopInterface; use Thelia\Core\Template\Element\PropelSearchLoopInterface;
use Thelia\Core\Template\Loop\Argument\Argument; use Thelia\Core\Template\Loop\Argument\Argument;
use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\ArgumentCollection;
use Thelia\Type\EnumListType;
use Thelia\Type\TypeCollection;
/** /**
* Class AreaCitiesLoop * Class AreaCitiesLoop
@@ -48,7 +51,9 @@ class AreaCitiesLoop extends BaseLoop implements PropelSearchLoopInterface
protected function getArgDefinitions() protected function getArgDefinitions()
{ {
return new ArgumentCollection( return new ArgumentCollection(
Argument::createIntListTypeArgument('area_id') Argument::createIntListTypeArgument('area_id'),
Argument::createEnumListTypeArgument('order',
['title', 'zipcode'], 'title')
); );
} }
@@ -58,11 +63,23 @@ class AreaCitiesLoop extends BaseLoop implements PropelSearchLoopInterface
public function buildModelCriteria() public function buildModelCriteria()
{ {
$query = LpsAreaCityQuery::create(); $query = LpsAreaCityQuery::create();
if (null != $id = $this->getAreaId()) { if (null != $id = $this->getAreaId()) {
$query->filterByIdArea($id); $query->filterByIdArea($id);
} }
return $query->orderByZipcode(); foreach ($this->getOrder() as $order) {
switch ($order) {
case 'title':
$query->orderByTitle();
break;
case 'zipcode':
$query->orderByZipcode()->orderByTitle();
break;
}
}
return $query;
} }
} }

View File

@@ -64,6 +64,6 @@ class AreaScheduleLoop extends BaseLoop implements PropelSearchLoopInterface
$query->filterByIdArea($id); $query->filterByIdArea($id);
} }
return $query->orderByDay(); return $query->orderByDay()->orderByBeginTime();
} }
} }

View File

@@ -52,6 +52,7 @@
</div> </div>
{include file="modal/area-schedule-modal.html"} {include file="modal/area-schedule-modal.html"}
{include file="modal/area-cities-modal.html"}
{/block} {/block}

View File

@@ -49,7 +49,7 @@
</div> </div>
</td> </td>
<td>{$PRICE} €</td> <td>{$PRICE} €</td>
<td>{$DELIVERY_DAYS}</td> <td>{$DELIVERY_DAYS}{if $DELIVERY_DAYS eq ''}<i>{intl l="There is no schedule for this area" d="livraisonparsecteurs"}</i>{/if}</td>
<td>{$COVERED_CITIES_NUMBER}</td> <td>{$COVERED_CITIES_NUMBER}</td>
<td class="actions"> <td class="actions">
<div class="btn-group" role="group"> <div class="btn-group" role="group">

View File

@@ -0,0 +1,73 @@
{form name=$form_name}
{form_hidden_fields form=$form}
{render_form_field form=$form field="success_url" value={url path="/admin/module/LivraisonParSecteurs/edit?area_id={$area_id}#cities"}}
{render_form_field form=$form field="error_url" value={url path="/admin/module/LivraisonParSecteurs/edit?area_id={$area_id}#cities"}}
{form_field form=$form field="area_id"}
<div class="form-group hidden">
<input type="hidden" class="form-control" name="{$name}" id="{$label_attr.for}"
value="{$area_id}"/>
</div>
{/form_field}
<div class="row">
<div class="col-sm-12">
{form_field form=$form field="zipcode"}
<div class="form-group">
<label class="control-label" for="{$label_attr.for}">
{intl l=$label d='livraisonparsecteurs'}
{if $required}<span class="required">*</span>{/if}
</label>
<input type="text" id="{$label_attr.for}" class="form-control" name="{$name}" value="" {if $required}required{/if} />
</div>
{form_error form=$form field="zipcode"}{$message}{/form_error}
{/form_field}
{form_field form=$form field="title"}
<div class="form-group">
<label class="control-label" for="{$label_attr.for}">
{intl l=$label d='livraisonparsecteurs'}
{if $required}<span class="required">*</span>{/if}
</label>
<input type="text" id="{$label_attr.for}" class="form-control" name="{$name}" value="" {if $required}required{/if} />
</div>
{form_error form=$form field="title"}{$message}{/form_error}
{/form_field}
<div class="row">
<div class="col-sm-6">
{form_field form=$form field="latitude"}
<div class="form-group form-inline">
<label class="control-label" for="{$label_attr.for}">
{intl l=$label d='livraisonparsecteurs'}
{if $required}<span class="required">*</span>{/if}
</label>
<input type="text" id="{$label_attr.for}" class="form-control" name="{$name}" value="" {if $required}required{/if} />
</div>
{form_error form=$form field="latitude"}{$message}{/form_error}
{/form_field}
</div>
<div class="col-sm-6">
{form_field form=$form field="longitude"}
<div class="form-group form-inline">
<label class="control-label" for="{$label_attr.for}">
{intl l=$label d='livraisonparsecteurs'}
{if $required}<span class="required">*</span>{/if}
</label>
<input type="text" id="{$label_attr.for}" class="form-control" name="{$name}" value="" {if $required}required{/if} />
</div>
{form_error form=$form field="longitude"}{$message}{/form_error}
{/form_field}
</div>
</div>
<div class="row">
<div class="col-sm-12">
<span class="help-block" style="text-align: center">{intl l="Format to respect" d="livraisonparsecteurs"}</span>
</div>
</div>
</div>
</div>
{/form}

View File

@@ -23,91 +23,121 @@
} }
.city-remove { .city-remove {
height: 30x !important; height: 30px !important;
}
.pin {
height: 25px;
margin-left: 12px;
}
.legende {
margin-top: 25px;
text-align: center;
font-style: italic;
} }
</style> </style>
{form name='lps-area-cities-update'} {form name='lps-area-cities-update'}
<div class="form-container"> <div class="form-container">
{if $form_error} {if $form_error}
<div class="alert alert-danger">{$form_error_message}</div> <div class="alert alert-danger">{$form_error_message}</div>
{/if} {/if}
<div class="row"> <div class="row">
<div class="col-md-4"> <div class="col-md-4">
{loop name="area" type="lps_area" id="$area_id"} {loop name="area" type="lps_area" id="$area_id"}
<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}
{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}
<div class="general-block-decorator"> <div class="general-block-decorator">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped table-condensed" id="areas-table"> <table class="table table-striped table-condensed" id="areas-table">
<thead> <thead>
<tr> <tr>
<th>{intl l="Zipcode" d="livraisonparsecteurs"}</th> <th>{intl l="Zipcode" d="livraisonparsecteurs"}</th>
<th>{intl l="City" d="livraisonparsecteurs"}</th> <th>{intl l="City" d="livraisonparsecteurs"}</th>
<th class="pull-right"> <th class="pull-right">
<div> <div>
<a class="btn btn-default btn-primary city-add" {loop name="auth-delete" type="auth" role="ADMIN" resource="admin.lps.cities" access="CREATE" module="LivraisonParSecteurs"}
title="{intl l='Add a new city' d='livraisonparsecteurs'}" <a class="btn btn-default btn-primary city-add"
data-target="#city-add" data-toggle="modal"> title="{intl l='Add a new city' d='livraisonparsecteurs'}"
<i class="glyphicon glyphicon-plus-sign"></i> data-target="#area-cities-add" data-toggle="modal">
</a> <i class="glyphicon glyphicon-plus-sign"></i>
</div> </a>
</th> {/loop}
</tr> </div>
</thead> </th>
<tbody> </tr>
{loop name="cities" type="lps_area_cities" area_id="$area_id"} </thead>
<tr> <tbody>
<td>{$ZIPCODE}</td> {loop name="cities" type="lps_area_cities" area_id="$area_id" order="title"}
<td>{$TITLE}</td> <tr>
<td class="actions"> <td>{$ZIPCODE}</td>
<div class="btn-group" role="group"> <td>{$TITLE}{if $LATITUDE eq '' or $LONGITUDE eq ''}<img src="{image file='assets/img/pin.svg'}" title="Pas de coordonnées pour cette commune" alt="Pas de coordonnées" class="pin" />{/if}</td>
<a class="btn btn-danger btn-responsive city-remove" title="{intl l='Remove this city'}" data-target="#city-remove" data-toggle="modal" data-id="{$ID}"> <td class="actions">
<i class="glyphicon glyphicon-trash"></i> <div class="btn-group" role="group">
</a> {loop name="auth-delete" type="auth" role="ADMIN" resource="admin.lps.cities" access="DELETE" module="LivraisonParSecteurs"}
</div> <a class="btn btn-danger btn-responsive cities-remove" title="{intl l='Remove this city'}" data-target="#area-cities-remove" data-toggle="modal" data-id="{$ID}">
</td> <i class="glyphicon glyphicon-trash"></i>
</tr> </a>
{/loop} {/loop}
</tbody> </div>
</table> </td>
</div> </tr>
{/loop}
{elseloop rel="cities"}
<tr>
<td colspan="1000">
<div class="alert alert-info">
{intl l="There is no city delivered in this area" d="livraisonparsecteurs"}
</div>
</td>
</tr>
{/elseloop}
</tbody>
</table>
</div> </div>
</div>
<table id="coordinates" class="hidden"> <table id="coordinates" class="hidden">
<thead></thead> <thead></thead>
<tbody> <tbody>
{loop name="cities-coordinates" type="lps_area_cities" area_id="$area_id"} {loop name="cities-coordinates" type="lps_area_cities" area_id="$area_id"}
<tr> <tr>
<td>{$LATITUDE}</td> <td>{$LATITUDE}</td>
<td>{$LONGITUDE}</td> <td>{$LONGITUDE}</td>
<td>{$TITLE}</td> <td>{$TITLE}</td>
</tr> </tr>
{/loop} {/loop}
</tbody> </tbody>
</table> </table>
</form> <input id="attr-city-id-remove" type="hidden" value=""/>
{/loop}
</div>
<div class="col-md-8"> </form>
<input type="hidden" id="map-center-lon" value="2.2667287624488397" /> {/loop}
<input type="hidden" id="map-center-lat" value="50.749980292425974" /> </div>
<div id="map" class="locationMap"></div> <div class="col-md-8">
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyBb07YA_unrh5w821I1xHxbeYb5KCF_WaM&libraries=&v=weekly" async></script> <input type="hidden" id="map-center-lon" value="2.2667287624488397" />
</div> <input type="hidden" id="map-center-lat" value="50.749980292425974" />
<div id="map" class="locationMap"></div>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyBb07YA_unrh5w821I1xHxbeYb5KCF_WaM&libraries=&v=weekly" async></script>
<caption class="clearfix">
<div class="legende">NB : Les communes sans coordonnées GPS n'apparaitront pas sur la carte ci-dessus.</div>
</caption>
</div> </div>
</div> </div>
</div>
{/form} {/form}

View File

@@ -6,7 +6,7 @@
{/if} {/if}
{loop name="area" type="lps_area" id="$area_id"} {loop name="area" type="lps_area" id="$area_id"}
<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 {include
@@ -57,7 +57,7 @@
<td> <td>
<div class="btn-group"> <div class="btn-group">
{loop name="auth-edit" type="auth" role="ADMIN" resource="admin.lps.schedule" access="UPDATE" module="LivraisonParSecteurs"} {loop name="auth-edit" type="auth" role="ADMIN" resource="admin.lps.schedule" access="UPDATE" module="LivraisonParSecteurs"}
<a class="btn btn-default btn-xs area-schedule-update-default" <a class="btn btn-info btn-responsive area-schedule-update-default"
title="{intl l='Modify this delivery day' d='livraisonparsecteurs'}" title="{intl l='Modify this delivery day' d='livraisonparsecteurs'}"
data-target="#area-schedule-update" data-toggle="modal" data-id="{$ID}" data-target="#area-schedule-update" data-toggle="modal" data-id="{$ID}"
data-day="{$DAY}" data-begin="{format_date date=$BEGIN format="H:i"}" data-day="{$DAY}" data-begin="{format_date date=$BEGIN format="H:i"}"
@@ -66,7 +66,7 @@
</a> </a>
{/loop} {/loop}
{loop name="auth-delete" type="auth" role="ADMIN" resource="admin.lps.schedule" access="DELETE" module="LivraisonParSecteurs"} {loop name="auth-delete" type="auth" role="ADMIN" resource="admin.lps.schedule" access="DELETE" module="LivraisonParSecteurs"}
<a class="btn btn-default btn-xs area-schedule-delete" <a class="btn btn-danger btn-responsive area-schedule-delete"
title="{intl l='Delete this delivery day' d='livraisonparsecteurs'}" title="{intl l='Delete this delivery day' d='livraisonparsecteurs'}"
data-target="#area-schedule-delete" data-toggle="modal" data-id="{$ID}"> data-target="#area-schedule-delete" data-toggle="modal" data-id="{$ID}">
<i class="glyphicon glyphicon-trash"></i> <i class="glyphicon glyphicon-trash"></i>

View File

@@ -5,7 +5,6 @@
(function($){ (function($){
$('a[href="#cities"]').on("shown.bs.tab",function(){ $('a[href="#cities"]').on("shown.bs.tab",function(){
var opt = { var opt = {
center: new google.maps.LatLng($("#map-center-lat").val(), $("#map-center-lon").val()), center: new google.maps.LatLng($("#map-center-lat").val(), $("#map-center-lon").val()),
zoom: 12, zoom: 12,
@@ -24,7 +23,6 @@
}); });
function displayPins() { function displayPins() {
var arrays = []; var arrays = [];
$('#coordinates').eq(0).find('tr').each((r,row) => arrays.push($(row).find('td,th').map((c,cell) => $(cell).text()).toArray())) $('#coordinates').eq(0).find('tr').each((r,row) => arrays.push($(row).find('td,th').map((c,cell) => $(cell).text()).toArray()))
@@ -37,6 +35,18 @@
}); });
} }
// On sélectionne une commune à supprimer
$('a.cities-remove').click(function (ev) {
$('#attr-cities-id-remove').val($(this).data('id'));
});
// On ajoute une commune au secteur
$('a.city-add').click(function (ev) {
$("#attr-city-zipcode input, #attr-city-title input").prop('required', true);
$("#attr-city-latitude input, #attr-city-longitude input").prop('required', false);
});
})(jQuery); })(jQuery);
</script> </script>

View File

@@ -17,10 +17,11 @@
}); });
$('a.area-schedule-add').click(function (ev) { $('a.area-schedule-add').click(function (ev) {
$("#attr-area-schedule-begin input, #attr-area-schedule-end input").prop('required', false); $("#attr-area-schedule-begin input, #attr-area-schedule-end input").prop('required', true);
$("#attr-area-schedule-day").prop('required', true); $("#attr-area-schedule-day").prop('required', true);
}); });
{$langcode = {lang attr="code"}|substr:0:2} {$langcode = {lang attr="code"}|substr:0:2}
$(document).ready(function () { $(document).ready(function () {
$('.input-group.time').datetimepicker({ $('.input-group.time').datetimepicker({

View File

@@ -0,0 +1,34 @@
{* DELETE modal *}
{capture "cities_delete"}
{intl l="Do you really want to remove this city ?" d="livraisonparsecteurs"}
<input type="hidden" name="area-cities_id" id="attr-cities-id-remove" value=""/>
<input type="hidden" name="area_id" value="{$smarty.get.area_id}"/>
<input type="hidden" name="success_url" value="{url path="/admin/module/LivraisonParSecteurs/edit?area_id={$area_id}#cities"}"/>
{/capture}
{include file="includes/generic-confirm-dialog.html"
dialog_id = "area-cities-remove"
dialog_title = {intl l="Delete a city from this area" d="livraisonparsecteurs"}
dialog_message = {$smarty.capture.cities_delete nofilter}
dialog_ok_label = {intl l="Delete"}
dialog_cancel_label = {intl l="Cancel"}
form_action = {token_url path='/admin/module/LivraisonParSecteurs/city/remove'}
}
{* CREATE Modal *}
{form name="lps-area-cities-add"}
{capture "cities_add"}
{include file="form/area-cities-add.html" form_name="lps-area-cities-add" area_id=$smarty.get.area_id}
{/capture}
{include file="includes/generic-create-dialog.html"
dialog_id = "area-cities-add"
dialog_title = {intl l="Add a new city" d="livraisonparsecteurs"}
dialog_body = {$smarty.capture.cities_add nofilter}
dialog_ok_label = {intl l="Create"}
dialog_cancel_label = {intl l="Cancel"}
form_action = {url path="admin/module/LivraisonParSecteurs/city/add"}
form_enctype = {form_enctype form=$form}
}
{/form}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 117 KiB

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<template xmlns="http://thelia.net/schema/dic/template"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://thelia.net/schema/dic/template http://thelia.net/schema/dic/template/template-1_0.xsd">
<descriptive locale="fr">
<title>Template back office par défaut</title>
</descriptive>
<descriptive locale="en">
<title>Default back-office template</title>
</descriptive>
<parent>default</parent>
<languages>
<language>ar_SA</language>
<language>cs_CZ</language>
<language>de_DE</language>
<language>el_GR</language>
<language>en_US</language>
<language>es_ES</language>
<language>fa_IR</language>
<language>fr_FR</language>
<language>hu_HU</language>
<language>id_ID</language>
<language>it_IT</language>
<language>nl_NL</language>
<language>pl_PL</language>
<language>pt_BR</language>
<language>pt_PT</language>
<language>ru_RU</language>
<language>sk_SK</language>
<language>tr_TR</language>
<language>uk_UA</language>
</languages>
<version>1.0.0</version>
<authors>
<author>
<name>Thelia team</name>
<company>thelia.net</company>
<email>contact@thelia.net</email>
<website>thelia.net</website>
</author>
</authors>
<thelia>2.4.3</thelia>
<stability>prod</stability>
</template>