Comment ajouter une vérification spécifique avant le passage de transition d’un cycle de vie
Prérequis
Afin de pouvoir suivre ce guide, il faut préalablement avoir personnalisé la fenêtre de transition d’un cycle de vie et avoir ajouté un menu permettant d’accéder à une url spécifique.
On souhaite empêcher la transition Valider
dans le cas où la date de validation d’un PLAT
est antérieure au jour
courant. Pour cela nous allons utiliser l’événement beforeDisplayTransition
.
Recommandations
Si vous n’êtes pas familier avec l’événement beforeDisplayTransition
, il est recommandé de lire la documentation
associée
disponible ici
Comment procéder ?
Créer le fichier src/public/platView.js
:
window.ank.smartElement.globalController.registerFunction("platView", (controller) => {
controller.addEventListener("ready", function addListeners(event, documentObject) {
controller.addEventListener("beforeDisplayTransition", function checkTransition(
event,
smartElement,
transitionObject
) {
if (transitionObject.transition === "t_plat_e1_e2") {
const validityDateValue = controller.getValue("plat_validity_date").value;
if (validityDateValue) {
const validityDate = new Date(validityDateValue);
const now = Date.now();
if (validityDate < now) {
event.preventDefault();
controller.showMessage({
type: "error",
message: `Validation impossible : la date de validité du plat (${validityDate.toLocaleString(
"fr-FR"
)}) est dépassée.`,
});
}
}
}
});
});
});
Ajouter le script JavaScript à la classe de rendu
src/vendor/Cogip/Restauratec/SmartStructures/Plat/Render/PlatViewRender.php
:
<?php
namespace Cogip\Restauratec\SmartStructures\Plat\Render;
use Anakeen\Core\Internal\SmartElement as InternalSmartElement;
use Anakeen\Routes\Core\Lib\ApiMessage;
use Anakeen\Ui\BarMenu;
use Anakeen\Ui\ItemMenu;
use Anakeen\Ui\MenuTargetOptions;
use Anakeen\Ui\RenderAttributeVisibilities;
use Cogip\Restauratec\SmartStructures\Consommable\Render\ConsommableViewRender;
use SmartStructure\Fields\Plat as PlatFields;
class PlatViewRender extends ConsommableViewRender
{
/**
* @param InternalSmartElement $document
* @return BarMenu
* @throws \Anakeen\Core\DocManager\Exception
* @throws \Anakeen\Exception
* @throws \Anakeen\Database\Exception
* @throws \Anakeen\Search\Exception
*/
public function getMenu(InternalSmartElement $document): BarMenu
{
$menu = parent::getMenu($document);
$imagePlat= $document ->getFileLink(PlatFields::plat_image);
if(!empty($imagePlat)){
$itemImage = new ItemMenu("platImage");
$url = sprintf("%s?inline=true&inline=yes",
$imagePlat
);
$itemImage->setUrl($url);
$option = new MenuTargetOptions();
$option->windowHeight = 400;
$option->windowWidth = 700;
$itemImage->setTarget("_dialog", $option);
$itemImage->setTextLabel("Afficher l’image");
$menu->appendElement($itemImage);
}
return $menu;
}
public function getMessages(\Anakeen\Core\Internal\SmartElement $document)
{
$messages = parent::getMessages($document);
$priceDiff = $document->getAttributeValue(PlatFields::plat_price_difference);
if ($priceDiff !== 0) {
$messages[] = new ApiMessage(sprintf("Le plat a changé de prix de %s euros", $priceDiff), ApiMessage::WARNING);
}
return $messages;
}
public function getVisibilities(InternalSmartElement $document, \SmartStructure\Mask $mask = null): RenderAttributeVisibilities
{
$vis = parent::getVisibilities($document, $mask);
$vis->setVisibility(PlatFields::plat_price_difference, RenderAttributeVisibilities::HiddenVisibility);
return $vis;
}
public function getJsReferences(\Anakeen\Core\Internal\SmartElement $document = null)
{
$jsRefs = parent::getJsReferences($document);
$jsRefs['platView'] = new \Anakeen\Ui\JsAssetReference("/platView.js");
return $jsRefs;
}
}
Vous pouvez maintenant déployer vos modifications :
npx @anakeen/anakeen-cli deploy -c http://localhost:8080/control -s . -u admin -p anakeen --reinstall
Et voir le résultat sur un PLAT
à l’état En test
en étant connecté avec un utilisateur de la direction :
login: pope
password: cogip
Et ensuite ?
Comment rendre obligatoire des paramètres lors de la transition d’un cycle de vie