Le module Document UI se substitue aux interfaces Document de Dynacase, qui étaient des pages HTML entièrement générées côté serveur.
Il propose une interface graphique en HTML5 compatible avec les navigateurs modernes permettant une conception réactive (s'ajustant aux tailles des écrans), adaptée aux supports tactiles (tablettes) et facilement modifiable.
Les concepts mis en œuvre sont :
Le module inclut toutes les interfaces constituant le document, ce qui comprend :
Chacun des éléments d'interface est disponible sous la forme d'un widget autonome qui peut être utilisé pour concevoir une interface globale uniforme.
De plus, un widget de contrôleur est mis à disposition pour mettre en place un document et interagir facilement avec lui.
Les navigateurs compatibles sont :
Figure 1. Document : largeur d'écran élevée
Figure 2. Document : largeur d'écran faible
Ce chapitre évoque les différents choix de conception et l'organisation de la stack technique
Figure 3. Schéma de principe
Le schéma ci-dessus présente l'architecture de Document UI.
Le serveur s'appuie sur Dynacase Platform et notamment les mécanismes suivants :
La couche REST inclut un ensemble de mécanismes permettant de modifier les informations transmises au moteur de rendu client.
Lors de l'initialisation d'une nouvelle page contenant un document, le serveur fournit une trame minimaliste (liste des assets JS, CSS) et le code de démarrage JS. C'est ensuite le JavaScript qui se charge de faire la requête auprès du REST pour obtenir :
Le client est composé des éléments suivants :
Ces éléments sont organisés en widgets qui sont mis en place par Bacbkone.js. Lors de l'initialisation d'une page, les éléments suivants sont mis en place :
Une fois l'ensemble initialisé, au cours de la vie du document, les widgets communiquent à la vue les modifications effectuées par l'utilisateur. La vue communique ces modifications au modèle. Le pattern inverse est appliqué lorsque le modèle est modifié : le modèle transmet à la vue la modification, et la vue l'applique au travers du widget sur la représentation visible pour l'utilisateur.
Il est à noter que lorsqu'un utilisateur change de document la page entière n'est pas rechargée. Dans ce cas, seul le modèle est mis à jour avec les données du nouveau document, ce qui permet un chargement rapide.
Ce chapitre détaille les différents moyens permettant d'accéder au document.
L'url d'accès à une représentation HTML d'un document est la suivante :
api/v1/documents/<identifiant du document>.html
Cette url permet de voir un document en consultation.
Le paramètre identifiant du document
contient soit l'identifiant numérique du
document, soit son nom logique.
Note : C'est la dernière révision du document qui est présentée.
L'url d'accès au formulaire du document est la suivante :
api/v1/documents/<identifiant du document>/views/!defaultEdition.html
Cette url permet de voir le formulaire de modification du document.
Le paramètre identifiant du document
contient soit l'identifiant numérique du
document, soit son nom logique.
Si le document à un contrôle de vue qui lui est associé, la vue souhaitée peut être indiquée dans l'url de rendu.
api/v1/documents/<identifiant du document>/views/<identifiant de la vue>.html
L'url d'affichage du formulaire de création est :
api/v1/documents/<identifiant de la famille>/views/!defaultCreation.html
Le paramètre identifiant de la famille
contient l'identifiant de la
famille du document à créer.
Un widget est mis à disposition pour pouvoir créer directement des objets documents dans une page web.
Ce widget crée automatiquement une iframe, dans laquelle il charge le document demandé. De plus, ce widget permet de piloter le document depuis la page courante, sans se préoccuper de l'iframe.
Lors de l'initialisation d'un document dans une iframe l'historique du navigateur n'est pas impacté par la navigation au sein du document (changement d'état, de documents, etc.).
Le widget nécessite les assets suivants dans la page :
lib/jquery/ddui/jquery.min.js
,lib/underscore/underscore-min.js
,DOCUMENT/IHM/widgets/widget.js
,DOCUMENT/IHM/document.js
Le widget peut être initialisé avec le code suivant :
$(document).ready(function() { //initialise le widget de document //dans l'élément avec l'id myDocument //et avec le document ayant l'initid 1432 $("#myDocument").document({ "initid": 1432 }); });
Une fois les dépendances mises en place,
le code exécute le callback et initialise le widget sur la div #myDocument
.
Attention : le widget peut aussi être initialisé vide (sans initid), pour
charger en asynchrone les dépendances par exemple. Dans ce cas il faut attendre
l'évènement documentloaded
ensuite effectuer un
fetchDocument
.
//Chargement du widget et de ses dépendances $(document).ready(function() { //initialisation du widget de document "vide" $("#myDocument").document() //ajout d'un listener qui se déclenche au documentloaded .on("documentloaded", function() { //fetch du document ayant l'initid 1432 $("#myDocument").document("fetchDocument", { "initid": 1432 }); }); });
initid
: identifiant du document à charger, soit sous la forme d'un entier, soit sous la forme d'un nom logique,viewId
: rendu du document. Par défaut plusieurs rendu sont à disposition :
!defaultConsultation
: rendu de consultation par défaut de l'utilisateur en cours (c'est la valeur
utilisée lorsque viewId
n'est pas précisé,!defaultEdition
: rendu d'édition par défaut de l'utilisateur en cours,!coreCreation
: rendu de création (dans ce cas l'initid doit être un identifiant de famille).revision
: révision du document (défaut : -1
, soit la dernière révision applicable),customClientData
: customClientData données additionnelles à envoyer au serveur,noRouter
: booléen, désactive l'historique de navigation dans l'iframe (default: true
),withoutResize
: désactive le calcul automatique de la taille du widget (défault : false
),resizeMarginHeight
: applique une marge au calcul automatique de la hauteur (défaut : 3
),resizeMarginWidth
: applique une marge au calcul automatique de la largeur (défaut : 0
),resizeDebounceTime
: applique un debounce sur le calcul automatique de la taille en millisecondes
(défaut : 50
).Ces méthodes sont appelées méthodes du contrôleur externe par opposition au contrôleur interne qui agit depuis l'intérieur du widget. L'ensemble des méthodes décrites dans le chapitre contrôleur interne sont accessibles.
Passage du document en édition :
$("#myDocument").document("fetchDocument" , { "initid": 42, "viewId": "!defaultEdition" });
Récupération des propriétés du document.
var properties = $("#myDocument").document("getProperties");
Attention : Les méthodes ne peuvent être utilisées que lorsque le widget est
loaded
, c'est à dire qu'il représente un document et que celui-ci est chargé,
excepté pour les méthodes suivantes :
isLoaded
Cette méthode permet de savoir si le widget est chargé et associé à une représentant un document.
Pas d'argument
Booléen : true
si le widget est prêt, false
sinon.
Pas d'exception
if ($("#myDocument").document("isLoaded")) { alert("document is loaded"); }
fetchDocument
Voir la méthode fetchDocument du contrôleur interne.
Affichage d'un document affichage d'un avertissement en cas d'échec et d'un message en cas de succès.
$(".myDocumentDiv").document("fetchDocument", { initid: 1234 }, { force: false } ).then(function (data) { data.element.documentController("showMessage", { type: "info", message: "Document "+ data.nextDocument.title+ " has been loaded" }); }).catch(function (data) { data.element.documentController("showMessage", { type: "warning", message: data.errorMessage.contentText }); });
saveDocument
Voir la méthode saveDocument du contrôleur interne.
Sauvegarde déclenchée sur le bouton ".saveNow". Affichage de l'erreur en cas d'échec et d'un message indiquant la réussite de la sauvegarde en cas de succès.
$("button.saveNow").on("click", function () { $(".myDocumentDiv").document("saveDocument").then(function (data) { data.element.documentController("showMessage", { type: "success", message: "Document " + data.nextDocument.title + " has been saved" }); }).catch(function (data) { data.element.documentController("showMessage", { type: "error", message: data.errorMessage.contentText }); }); });
addEventListener
Voir la méthode addEventListener du contrôleur interne.
Les événements enregistrés dans le widget de document sont automatiquement ré-associés au widget interne chaque fois que celui-ci est chargé ou rechargé.
listEventListeners
Voir la méthode listEvents du contrôleur interne.
removeEventListener
Voir la méthode removeEventListener du contrôleur interne.
Les événements enregistrés dans le widget de document sont automatiquement ré-associés au widget interne chaque fois que celui-ci est chargé ou rechargé.
addConstraint
Voir la méthode addConstraint du contrôleur interne.
Les contraintes enregistrées dans le widget de document sont automatiquement ré-associées au widget interne chaque fois que celui-ci est chargé ou rechargé.
listConstraints
Voir la méthode listConstraints du contrôleur interne.
removeConstraint
Voir la méthode removeConstraint du contrôleur interne.
Les contraintes enregistrées dans le widget de document sont automatiquement réassociées au widget interne chaque fois que celui-ci est chargé ou rechargé.
tryToDestroy
Cette méthode essaie de détruire le widget.
Deux cas sont possibles :
Pas d'argument
Une promise.
En cas de réussite, l'argument de la fonction est undefined.
En cas d'échec, la structure de l'argument de la fonction d'échec est une chaine de caractère "Unable to destroy because user refuses it".
Pas d'exception
if ($("#myDocument").document("tryToDestroy"))then( function onSuccess() { console.log("OK", arguments);}, function onError() { console.log("KO", arguments);} );
Les événements suivants sont mis à disposition par le widget.
les événements sont des événements DOM, déclenchés sur l'élément DOM sur lequel a été instancié le widget. De plus, les noms des événements sont tous en minuscules.
documentloaded
Cet événement est déclenché dès que le widget de document est associé à un document et que les méthodes internes peuvent être utilisées.
$("#myDocument").on("documentloaded", function(event) { console.log("Ready to be used"); });
documentunloaded
Cet événement est déclenché dès que le widget de document n'est plus associé à un document :
documentunloaded
est déclenché, suivi d'un documentloaded
)$("#myDocument").on("documentunloaded", function(event) { console.log("Document disabled"); });
documentautoresize
Cet événement est déclenché dès que le widget de document recalcule sa taille.
Par défaut, le widget prend la taille de l'élément le contenant. Il est
toutefois possible d'intercepter le resize
du widget et de modifier la méthode
de calcul.
$("#myDocument").on("documentautoresize", function myResize(event) { //récupération de l'iframe contenant le document var $iframe = this.find("iframe"); //arrête le calcul automatique event.preventDefault(); //redimensionne l'iframe $iframe.height(100).width(100); });
L'exemple ci-dessus force la taille du widget à une carré de 100px de côté.
Le code serveur de DDUI manipule plusieurs classes php afin de gérer la représentation et le comportement des documents.
La configuration de rendu de document permet de gérer la représentation du document et de ses attributs.
Il est en particulier possible
Les méthodes de la classe de configuration de rendu de document sont documentées dans le chapitre correspondant.
Les menus sont manipulables au travers de classes et méthodes dédiées.
Il est notamment possible
Le contrôle de vue ui dispose d'un élément supplémentaire par rapport au contrôle de vue d'origine : la configuration de rendu.
Cet élément est associé à une vue et est identifié par le nom de sa classe.
Si un contrôle de vue est associé au document, sa configuration de rendu est issue de la vue utilisée. Le masque est au préalable affecté avant de demander la configuration de rendu.
Si la vue n'a pas de configuration de rendu c'est la configuration de rendu par défaut qui sera utilisée.
La configuration de rendu de transition permet de gérer la représentation d'une demande de transition.
Lorsqu'un cycle de vie est attaché à un document, le passage de certaines transitions nécessite des paramètres. Le passage de ces transitions affiche un formulaire permettant de saisir les paramètres. L'affichage de ce formulaire est configurable avec un rendu de transition.
Les méthodes de la classe de configuration de rendu de transition sont documentées dans le chapitre correspondant.
Le moteur de templates utilisé est mustache, avec les implémentations suivantes :
Les CSS peuvent être parsées au moyen de Less.
La configuration de rendu de document peut être associée à un document de trois façons différentes :
L'interface de rendu va rechercher la configuration dans l'ordre suivant (l apremière vue trouvée sera applicable) :
L'interface PHP Dcp\Ui\IRenderConfigAccess
permet de choisir un rendu en
fonction du document et du mode.
La seule méthode à implémenter est la méthode getRenderConfig
Dcp\Ui\IRenderConfig getRenderConfig(string $mode, \Doc $document)
Les paramètres sont :
mode
Le mode de rendu, parmi
Dcp\Ui\RenderConfigManager::EditMode
(édition),Dcp\Ui\RenderConfigManager::CreateMode
(création)Dcp\Ui\RenderConfigManager::ViewMode
(consultation)document
\Doc
en cours.Cette méthode doit retourner une instance d'une classe implémentant l'interface
Dcp\Ui\IRenderConfig
compatible avec le mode demandé.
L'objet de configuration retourné peut être fonction des données du document ou en fonction de l'utilisateur. Cela donne toute liberté quant-au choix de la configuration.
Si la méthode retourne null
, c'est le rendu par défaut qui sera appliqué.
Exemple :
namespace My; class MyAccess implements \Dcp\Ui\IRenderConfigAccess { /** * @param string $mode * @return \Dcp\Ui\IRenderConfig */ public function getRenderConfig($mode, \Doc $document) { switch ($mode) { case \Dcp\Ui\RenderConfigManager::CreateMode: case \Dcp\Ui\RenderConfigManager::EditMode: return new MyRenderConfigEdit($this); case \Dcp\Ui\RenderConfigManager::ViewMode: return new MyRenderConfigView($this); } return null; } }
La définition du rendu par défaut se fait en implémentant l'interface
Dcp\Ui\IRenderConfigAccess
sur la classe de la famille.
Cette interface demande une seule méthode :
\Dcp\Ui\IRenderConfig getRenderConfig(string $mode, \Doc $document)
Voir la définition de la classe d'accès à un rendu de document.
Dans ce cas, l'objet $document
reçu par la méthode est l'objet lui-même (this
).
Exemple :
namespace My; class MyFamily extends \Dcp\Family\Document implements \Dcp\Ui\IRenderConfigAccess { /** * @param string $mode * @return \Dcp\Ui\IRenderConfig */ public function getRenderConfig($mode, \Doc $document) { switch ($mode) { case \Dcp\Ui\RenderConfigManager::CreateMode: case \Dcp\Ui\RenderConfigManager::EditMode: return new MyRenderConfigEdit($this); case \Dcp\Ui\RenderConfigManager::ViewMode: return new MyRenderConfigView($this); } return null; } }
L'installation du module Dynacase Document Ui, a pour effet de surcharger le contrôle de vue d'origine.
Deux attributs pour la configuration du contrôle de vue sont ajoutés :
cv_renderclass
classe de configuration de rendu de document
Multiple, défini pour chaque vue.
cv_renderaccessclass
L'attribut cv_renderclass
indique la classe de rendu à utiliser
pour la vue donnée.
L'action de rendu n'utilise pas la zone du contrôle de vue (attribut cv_zview
).
Par contre, le masque s'il est indiqué est appliqué. Le document fourni en
argument aux différentes méthodes de la configuration de rendu,
et en particulier lors de l'attribution des visibilités a
déjà le masque du contrôle de vue appliqué.
Si une vue indique une zone non standard (différent de FDL:VIEWBODYCARD
et
FDL:EDITBODYCARD
) et n'indique pas de classe de rendu alors la vue ne sera pas
applicable pour l'affichage du document avec les interfaces HTML5 fournies par
ce module.
Si une vue indique une classe de rendu non standard (différent de
Dcp\Ui\DefaultView
et Dcp\Ui\DefaultEdit
) et n'indique pas de zone, alors
cette vue sera ignorée par les interfaces traditionnelles fournies par la module
Dynacase Core.
Zone | Configuration de rendu | HTML classique | HTML 5 |
---|---|---|---|
<vide> |
<vide> |
OK | OK |
FDL:VIEWBODYCARD | <vide> |
OK | OK |
FDL:EDITBODYCARD | <vide> |
OK | OK |
<vide> |
Dcp\Ui\DefaultView | OK | OK |
<vide> |
Dcp\Ui\DefaultEdit | OK | OK |
FDL:VIEWBODYCARD | Dcp\Ui\DefaultView | OK | OK |
FDL:EDITBODYCARD | Dcp\Ui\DefaultEdit | OK | OK |
<custom> |
<vide> |
OK | KO |
<custom> |
Dcp\Ui\DefaultView | OK | OK |
<custom> |
Dcp\Ui\DefaultEdit | OK | OK |
<custom> |
<custom> |
OK | OK |
<vide> |
<custom> |
KO | OK |
Le contrôle de vue peut aussi indiquer une
classe d'accès à un rendu dans l'attribut Classe d'accès au rendu
(cv_renderaccessclass
). Cette classe est utilisée lorsqu'aucune vue spécifique
n'est demandée explicitement. Elle permet de choisir un rendu en fonction du
mode et du document.
Si la méthode ::getRenderConfig()
de cette classe retourne null
, alors le
choix du rendu est celui désigné par le contrôle de vue en fonction du mode,
des droits et des priorité de chacune des vues.
La configuration de rendu de document peut être associée à un document de deux façons différentes :
L'interface PHP Dcp\Ui\IrenderTransitionAccess
permet de choisir un rendu en
fonction du workflow et de la transition.
La seule méthode à implémenter est la méthode getTransitionRender
\Dcp\Ui\TransitionRender getTransitionRender( string $transitionId, \WDoc $workflow)
Les paramètres sont :
transitionId
l'id de la transition demandée
Il peut être vide dans le cas où l'utilisateur "admin" demande le passage d'une transition invalide (seul cet utilisateur a le privilège pour ce type de transition).
workflow
\WDoc
en cours.Cette méthode doit retourner une instance d'une classe implémentant l'interface
Dcp\Ui\IRenderTransition
.
Si la méthode retourne null
, c'est le rendu par défaut qui est appliqué.
Cette méthode est appelée par l'api lors de la demande des caractéristiques d'affichage de la transition.
Exemple :
namespace My; class MyTransitionRenderConfig extends \Dcp\Ui\TransitionRender { /** * @param string $transitionId * * @return \Dcp\Ui\RenderOptions * @throws \Dcp\Ui\Exception */ public function getRenderOptions($transitionId) { $options = parent::getRenderOptions($transitionId); // Change label of parameter frame $options->frame(self::parameterFrameAttribute)->setAttributeLabel("My parameters"); return $options; } } class MyAccess implements \Dcp\Ui\IRenderTransitionAccess { /** * @param string $transitionId * @return \Dcp\Ui\IRenderTransition */ public function getTransitionRender($transitionId, \WDoc $workflow) { if($transitionId) { return new MyTransitionRenderConfig(); } return null; } }
La définition du rendu par défaut se fait en implémentant l'interface
Dcp\Ui\IrenderTransitionAccess
sur la classe du workflow.
Cette interface demande une seule méthode :
Dcp\Ui\TransitionRender getTransitionRender(string $transitionId, \WDoc $workflow)
Voir la définition de la classe d'accès à un rendu de transition.
Dans ce cas, l'objet $workflow
reçu par la méthode est l'objet lui-même (this
).
Exemple :
namespace My; class My_wfl extends \Dcp\Family\WDoc implements \Dcp\Ui\IrenderTransitionAccess const myFirstTransition="my_trans_one"; const mySecondTransition="my_trans_two"; public $transitions = array(...); public $cycle = array(...); /** * Get Transition Render object to configure transition render * @param string $transitionId transition identifier * @param \WDoc $workflow workflow document * @return \Dcp\Ui\TransitionRender */ public function getTransitionRender($transitionId, \WDoc $workflow) { return new CustomRender(); } }
Il est possible de paramétrer le rendu sans modifier le code existant.
Les fichiers de configurationau sont au format format JSON,
et doivent être placés dans le répertoire DOCUMENT/customRender.d
du serveur.
Seuls les fichiers
dont l'extension est .json
sont pris en compte.
Chaque surcharge s'applique explicitement à une famille désignée, et n'est pas propagée à ses sous-familles.
le fichiers est la représentation json d'un tableau à 3 dimensions :
"families"
Exemple :
{ "families": { "MY_FAMILY": { "renderAccessClass": "My\\MyRenderAccess", "disableTag" : true }, "MY_WORKFLOWFAMILY": { "renderAccessTransition": "My\\MyTransitionAccess" } } }
Pour que les fichiers soient pris en compte, il est nécessaire de lancer la commande suivante après leur déploiement :
./wsh.php --app=DOCUMENT --action=LOAD_RENDERPARAMETERS
Cette commande peut aussi être lancée depuis le navigateur en tant qu'administrateur.
http://<yourDomain>/?app=DOCUMENT&action=LOAD_RENDERPARAMETERS
Cette commande applique les différents fichiers de configuration. Les paramètres sont fusionnés dans l'ordre croissant des noms de fichiers. Il est d'usage de préfixer le nom du fichier par 2 chiffres afin de rendre l'ordre plus explicite.
Pour une même famille, les différents paramètres sont cumulés.
Exemple :
DOCUMENT/customRender.d/10_myRender.json
{ "families": { "YOUR_FIRSTFAMILY": { "renderAccessClass": "My\\MySecondRenderAccess", "disableTag" : true }, "MY_FIRSTFAMILY": { "renderAccessClass": "My\\MyFirstRenderAccess" } } }
DOCUMENT/customRender.d/20_myRender.json
{ "families": { "YOUR_FIRSTFAMILY": { "renderAccessClass": "My\\MyOtherRenderAccess", "applyRefresh" : true }, "MY_SECONDFAMILY": { "renderAccessClass": "My\\MySecondRenderAccess" } } }
Les fichiers sont pris dans l'ordre alphabétique, soit :
Le paramétrage résultant est le suivant :
{ "families": { "YOUR_FIRSTFAMILY": { "renderAccessClass": "My\\MyOtherRenderAccess", "disableTag": true, "applyRefresh": true }, "MY_FIRSTFAMILY": { "renderAccessClass": "My\\MyFirstRenderAccess" }, "MY_SECONDFAMILY": { "renderAccessClass": "My\\MySecondRenderAccess" } } }
Doc::refresh()
Par défaut l'appel à la méthode Doc::refresh()
n'est pas effectué lors de la
récupération d'un rendu. cela est nécessaire pour s'assurer que 2 Get
successifs
au même doucment retournet la même réponse (aspect REST de l'API).
Par contre, elle est effectuée lors de l'enregistrement
(POST
, PUT
) via la méthode Doc::store()
.
Si l'option applyRefresh
vaut true
, alors la méthode Doc::refresh()
est appelée à chaque récupération (GET
) de rendu.
Dans ce cas, l'etag est calculé après l'appel à la méthode
Doc::refresh()
. Si le document n'a pas été modifié et si cette méthode ne
modifie pas non plus le document, l'etag n'est pas modifié.
Exemple :
{ "families": { "MY_FAMILY": { "applyRefresh": true } } }
Par défaut, l'api HTTP calcule des etag.
Lorsque ce n'est pas nécessaire, ou que ce calcul ets trop couteux,
il est posible de désactiver ce calcul au moyen du paramètre disableETag
.
lorsque disableETag
vaut true
, l'etag n'est ni calculé, ni transmis ni vérifié.
Exemple :
{ "families": { "MY_FAMILY": { "disableEtag": true } } }
Le paramètre renderAccessClass
indique la
classe d'accès à un rendu de document.
Exemple :
{ "families": { "MY_FAMILY": { "renderAccessClass": "My\\MyRenderAccess" } } }
Le paramètre renderTransitionClass
indique la
classe d'accès à un rendu de transition.
Exemple :
{ "families": { "MY_WORKFLOWFAMILY": { "renderTransitionClass": "My\\MyTransitionAccess" } } }
Une configuration de rendu de document est définie par une classe PHP
qui doit implémenter l'interface Dcp\Ui\IRenderConfig
.
Dynacase fournit des classes de rendu de document par défaut, qui implémentent cette interface.
Dans les méthodes d'une configuration
de rendu de transition, les utilisations de get
et de set
peuvent sembler inversées.
Ce n'est pas le cas : ces méthodes sont utilisées par la plateforme pour générer le rendu.
Par exemple, la méthode getVisibilities
est appelée par Dynacase pour obtenir
les visibilités à utiliser lors du rendu du document
La méthode implémentée ne positionne (set
) pas ces visibilités, mais les retourne (get
).
Deux classes de configuration sont fournies par le système :
Dcp\Ui\DefaultView
pour la consultation.Dcp\Ui\DefaultEdit
pour l'éditionCes classes fournissent les différentes options par défaut pour représenter le document. Elles fournissent notamment la définition des menus, les visibilités, les templates et les options de rendu d'attribut données par défaut.
Pour créer sa propre classe de rendu, il est recommandé d'hériter de l'une de
ces classes afin d'éviter de coder l'ensemble des méthodes de l'interface
Dcp\Ui\IRenderConfig
.
Pour des besoins plus spécifiques, il est possible de ne pas hériter de ces classes et d'implémenter directement l'interface. Il est alors nécessaire d'implémenter toutes les méthodes à coder.
La méthode getCssReferences()
permet d'injecter
des feuilles de style personnalisées dans le widget de document.
Elle doit retourner un tableau qui contient le chemin des fichiers css à insérer dans la page HTML. Ces chemins sont relatifs au répertoire d'installation.
Par défaut, les classes Dcp\Ui\DefaultView
et Dcp\Ui\DefaultEdit
retournent
les css suivantes :
[ "bootstrap" => "css/dcp/document/bootstrap.css", "kendo" => "css/dcp/document/kendo.css", "document" => "css/dcp/document/document.css", "datatable" => "lib/jquery-dataTables/1.10/bootstrap/3/dataTables.bootstrap.css" ]
Pour ajouter une feuille de style, il faut reprendre le tableau de la classe
parente puis ajouter le chemin vers le nouveau fichier css
.
Ce chemin doit être relatif par rapport au répertoire d'installation de Dynacase.
namespace My; class MyRenderConfigView extends \Dcp\Ui\DefaultView { public function getCssReferences(\Doc $document=null) { $css = parent::getCssReferences($document); $css["myCustom"] = "MY/Layout/custom.css"; return $css; } }
L'index dans la table permet d'identifier un fichier dans la perspective de le remplacer.
Cet index doit être unique sur l'ensemble des css des rendus.
Note : Dans un soucis de performance, lorsqu'un rendu de document est modifié sur le navigateur, les css déjà enregistrées avec le même identifiant ne sont pas rechargées. Lors du rendu d'un document, les css spécifiques sont supprimées si elles ne sont plus demandées par le nouveau rendu.
Afin de cibler des parties spécifiques du document ou des attributs, la DOM des éléments générs par Dynacase Document UIS est normalisée.
La méthode getCssReferences()
permet d'injecter
des fichiers JS personnalisés dans le widget de document.
Elle doit retourner un tableau qui contient le chemin des fichiers js à insérer dans la page HTML. Ces chemins sont relatifs au répertoire d'installation.
Par défaut, les classes Dcp\Ui\DefaultView
et Dcp\Ui\DefaultEdit
ne retournent
aucun fichier js spécifique :
[]
Pour ajouter un fichier javascript, il faut reprendre le tableau de la classe
parente puis ajouter un nouveau chemin vers le fichier js
.
Ce chemin doit être relatif par rapport au répertoire d'installation de Dynacase.
namespace My; class MyRenderConfigView extends \Dcp\Ui\DefaultView { public function getJsReferences(\Doc $document=null) { $js=parent::getJsReferences($document); $js["myContact"]="MY/Layout/customContact.js"; return $js; } }
L'index dans la table permet d'identifier un fichier dans la perspective de le remplacer.
La méthode getTemplates
permet de modifier les templates utilisés
lors de la génération du document et des attributs.
Cette méthode retourne un tableau de templates mustache.
La méthode getTemplates
retourne un array
à plusieurs niveaux.
Le premier niveau est
body
pour définir le template du corps du document.
Le template est alors défini par une des clés suivantes :
file
Le template utilisé est identifié par un fichier le contenant.
Le chemin de ce fichier est relatif au répertoire d'installation de Dynacase.
content
Lorsque les clés file
et content
sont toutes deux non vides,
la clé content
ets utilisée et la clé file
est ignorée.
sections
pour définir le template d'une section du document.
Dans ce cas, sections
est un tableau à 2 niveaux.
Le premier niveau est le nom de la section
Le second niveau est une des clés suivantes :
file
Le template utilisé est identifié par un fichier le contenant.
Le chemin de ce fichier est relatif au répertoire d'installation de Dynacase.
content
Lorsque les clés file
et content
sont toutes deux non vides,
la clé content
ets utilisée et la clé file
est ignorée.
Les modèles sont parsés côté client et côté serveur, et plusieurs clés sont utilisables.
Le corps du document est constitué de 4 sections :
Son template par défaut est le suivant :
{{> header}} {{> menu}} {{> content}} {{> footer}}
Cette définition peut être modifiée au moyen de la clé body
du tableau de templates pour ajouter des éléments HTML entre les
sections ou tout simplement pour supprimer une ou plusieurs sections.
Exemple : Insérer un titre entre chaque section.
class MyRenderConfigCustom extends \Dcp\Ui\DefaultView { public function getTemplates(\Doc $document = null) { $templates=parent::getTemplates($document); $templates["body"]["file"]="MY/customDocument.mustache"; return $templates; } }
Fichier MY/customDocument.mustache
:
<h1>Pre Header</h1> {{> header}} <h1>Post Header</h1> {{> menu}} <h1>Post Menu</h1> {{> content}} <h1>Post Content</h1> {{> footer}} <h1>Post Footer</h1>
Le pied de page, de par sa css, est
toujours affiché en bas du document. Pour afficher des éléments
plus bas que le pied de page, il faut modifier la css
(classe dcpDocument__footer
).
Chacune des sections peut être personnalisée au moyen d'un modèle de section.
Les sections peuvent être modifiées au moyen de la clé sections
du tableau de templates.
header
L'entête du document est la section header
de la catégorie sections
.
Le template par défaut de la section header
est le suivant (version simplifiée) :
<header class="dcpDocument__header"> <img class="dcpDocument__header__icon" src="{{document.properties.icon}}" alt="Document icon"/> <a class="dcpDocument__header__title" href="api/v1/documents/{{document.properties.id}}.html">{{document.properties.title}}</a> <div class="dcpDocument__header__family">{{document.properties.family.title}}</div> </header>
Le template complet comporte des éléments plus spécifiques qui sont fonction du mode de rendu et aussi du fait d'afficher une révision passée ou non. Dans tous les cas, les trois éléments indiqués sont présent.
Exemple : Afficher uniquement le titre.
class MyRenderConfigCustom extends \Dcp\Ui\DefaultView { public function getTemplates(\Doc $document = null) { $templates=parent::getTemplates($document); $templates["sections"]["header"]["file"]="MY/customHead.mustache"; return $templates; } }
Fichier MY/customHead.mustache
:
<h1>{{document.properties.title}}</h1>
Cela donnera la structure suivante :
<html> <head>...</head> <body> <div class="document"> <div class="dcpDocument"> <h1>Mon document</h1> <nav class="dcpDocument__menu">...</nav> <section class="dcpDocument__body">...</section> <footer class="dcpDocument__footer"/> </div> </div> </body> </html>
menu
La barre de menu du document est la section menu
de la catégorie sections
.
Par défaut :
<nav class="dcpDocument__menu"></nav>
Le menu, défini par ::getMenu()
, est construit dans l'objet de la
classe css dcpDocument__menu
.
La barre de menu peut être déplacée dans n'importe quelle autre section.
Exemple : mettre le menu dans le footer du document
class MyRenderConfigCustom extends \Dcp\Ui\DefaultView { public function getTemplates(\Doc $document = null) { $templates=parent::getTemplates($document); $templates["sections"]["footer"]["content"]= '<footer class="dcpDocument__footer"><div class="dcpDocument__menu"/></footer>'; $templates["sections"]["menu"]["content"]=''; return $templates; } }
Cela donnera la structure suivante :
<html> <head>...</head> <body> <div class="document"> <div class="dcpDocument"> <header class="dcpDocument__header">...</header> <!-- plus de menu ici --> <section class="dcpDocument__body">...</section> <footer class="dcpDocument__footer"><div class="dcpDocument__menu">...</div></footer> </div> </div> </body> </html>
La barre de menu a un comportement
spécifique lorsqu'elle est contenue dans un élément de type nav
. Ce comportement
implique que le menu passe en position fixed
en haut du document lorsque le
header n'est plus visible.
content
Le contenu du document est la section content
de la catégorie sections
.
Par défaut :
<section class="dcpDocument__body"/>
Le contenu par défaut du document est construit par le widget dans la section
identifiée par la classe css dcpDocument__body
. Si celle-ci n'est pas
présente, il est nécessaire alors d'indiquer les attributs à afficher
explicitement en utilisant les variables mustache.
Exemple : Affichage uniquement du contenu de l'onglet my_tabinformation
.
class MyRenderConfigCustom extends \Dcp\Ui\DefaultView { public function getTemplates(\Doc $document = null) { $templates=parent::getTemplates($document); $templates["sections"]["content"]["file"]="MY/customContent.mustache"; return $templates; } }
Fichier "MY/customContent.mustache"
<div class="container-fluid"> <h1>Voici : {{document.properties.title}}</h1> {{{document.attributes.my_tabinformation.htmlContent}}} </div>
Cela donnera la structure suivante :
<html> <head>...</head> <body> <div class="document"> <div class="dcpDocument"> <header class="dcpDocument__header">...</header> <nav class="dcpDocument__menu">...</nav> <div class="container-fluid"> <h1>Voici : Mon document</h1> <div class="dcpCustomTemplate--content" data-attrid="my_tabinformation"> <div class="dcpTab__content" data-attrid="my_tabinformation" "> ... </div> </div> </div> <footer class="dcpDocument__footer"/> </div> </div> </body> </html>
footer
Le bas du document est la section footer
de la catégorie sections
.
Par défaut :
<footer class="dcpDocument__footer"/>
La classe dcpDocument__footer
fixe le pied de document en bas de la page pour
être toujours visible.
Les règles pour le footer par défaut sont :
.dcpDocument__footer { background-color: #f2f2f2; text-align: center; position: fixed; bottom: 0; width: 100%; z-index: 2; }
Exemple : Afficher un copyright.
class MyRenderConfigCustom extends \Dcp\Ui\DefaultView { public function getTemplates(\Doc $document = null) { $templates=parent::getTemplates($document); $templates["sections"]["footer"]["content"]=' <footer class="dcpDocument__footer"> <strong>All right reserved ©</strong> </footer> '; return $templates; } }
Cela donnera la structure suivante :
<html> <head>...</head> <body> <div class="document"> <div class="dcpDocument"> <header class="dcpDocument__header">...</header> <nav class="dcpDocument__menu">...</nav> <section class="dcpDocument__body">...</section> <footer class="dcpDocument__footer"> <strong>All right reserved ©</strong> </footer> </div> </div> </body> </html>
Il est possible d'utiliser des variables liées au document dans les templates.
Les variables sur les propriétés et les attributs du document sont utilisables dans les templates :
Clef | Définition |
---|---|
{{document.properties.id}} | Identifiant du document |
{{document.properties.name}} | Nom logique du document |
{{document.properties.initid}} | Identifiant de la lignée du document |
{{document.properties.icon}} | Url de l'icône du document |
{{document.properties.title}} | Titre du document |
{{document.properties.family.title}} | Titre de la famille du document |
{{document.properties.family.id}} | Identifiant de la famille du document |
{{document.properties.family.icon}} | Icône de la famille du document |
{{document.properties.isReadMode}} | (booléen) Indique si le rendu de document est en mode consultation |
{{document.properties.isWriteMode}} | (booléen) Indique si le rendu de document est en mode modification |
Clef | Définition |
---|---|
{{document.attributes.attrid .label}} |
Libellé de l'attribut "attrid" |
{{document.attributes.attrid .attributeValue.value}} |
Valeur brute |
{{document.attributes.attrid .attributeValue.displayValue}} |
valeur affichable |
{{document.attributes.attrid .attributeValue.specialProperty }} |
Autres propriétés (Voir formatCollection) |
{{{document.attributes.attrid .htmlContent}}} |
Contenu (HTML) formaté de la valeur (Attention aux triple accolades : {{{…}}} ) |
{{{document.attributes.attrid .htmlView}}} |
Contenu (HTML) formaté de la valeur avec le libellé (non applicable au type tab ni aux attributs contenu dans un tableau) (Attention aux triple accolades : {{{…}}} ) |
Exemple : Remplacement de l'entête
<h1>Voici le document : "{{document.properties.title}}"</h1> {{> menu}} {{> content}} {{> footer}}
Exemple : Affichage du cadre my_firstframe
{{>header}} {{> menu}} <h1>Voici un cadre</h1> {{{document.attributes.my_firstframe.htmlView}}} {{> footer}}
Ces variables sont remplacées sur le client lors du rendu du document.
Le template est aussi analysé par le serveur. Les variables notées entre double crochets sont des variables qui sont remplacées par le contrôleur avant d'être envoyé sur le client.
Les clefs disponibles côté serveur sont celles gérées par le contrôleur.
L'ensemble des clefs ne sont pas les mêmes que celle côté client. En particulier,
les clefs de rendu HTML (htmlContent
, htmlView
) ne sont pas disponibles.
Exemple : Remplacement de l'entête côté serveur
<h1>[[#i18n]]my::This my document[[/i18n]] : "[[document.properties.title]]"</h1> {{> menu}} {{> content}} {{> footer}}
La méthode getContextController
permet d'ajouter des variables personnalisées
au contrôleur de modèles. Le contrôleur de modèles parse les templates côté serveur
avant de les envoyer au client.
Elle doit retourner une classe Dcp\Ui\DocumentTemplateContext
qui implémente ArrayAccess
.
L'ajout de nouvelles variables se fait donc en précisant la clef comme index du tableau :
$templateContext[$key] = $value
La valeur peut revêtir trois formes :
Une fonction qui retourne soit une valeur scalaire soit un tableau de valeur
Cette fonction n'est exécutée que si la clé correspondante est présente dans le modèle, au moment du remplacement.
Les variables définies sont disponibles pour tous les modèles du document.
Exemple :
class RenderConfigCustom extends \Dcp\Ui\DefaultView { public function getContextController(\Doc $document) { $controller = parent::getContextController($document); $controller["myController"] = $document->getFamilyParameterValue("myController"); $controller["myValues"] = [ ["myList"=>"Un"], ["myList"=>"Deux"] ]; $controller["myDefinition"] = function () use ($document) { return $document->getMyComplexDefinition(); }; return $controller; } public function getTemplates(\Doc $document = null) { $templates=parent::getTemplates($document); $templates["sections"]["footer"]["file"]="MY/customFoot.mustache"; return $templates; } }
Fichier : MY/customFoot.mustache
:
<footer class="dcpDocument__footer"> <strong>[[myController]]</strong> <ol> [[#myValues]] <li>[[myList]]</li> [[/myValues]] </ol> <p>[[myDefinition]]</p> </footer>
les classes de configuration de rendu par défaut
utilisent le contrôleur Dcp\Ui\DocumentTemplateContext
.
Ce contrôleur donne accès aux variables suivantes :
Clef | Définition |
---|---|
[[document.properties.id]] |
Identifiant du document |
[[document.properties.initid]] |
Identifiant de la lignée documentaire |
[[document.properties.title]] |
Titre du document |
[[document.properties.icon]] |
Url de l'icône du document |
[[document.properties.revision]] |
Numéro de révision |
[[document.properties.revdate]] |
Date de révision (YYYY-MM-DD HH:MM) |
[[document.properties.status]] |
Status du document : alive , deleted , fixed
|
[[document.properties.family.id]] |
Identifiant de la famille |
[[document.properties.family.title]] |
Titre de la famille |
[[document.properties.family.name]] |
Nom logique de la famille |
[[document.properties.family.icon]] |
Url de l'icône de la famille |
Clef | Définition |
---|---|
[[document.attribute.<attrid>.label]] |
Libellé de l'attribut |
[[document.attribute.<attrid>.attributeValue.value]] |
Valeur brute |
[[document.attribute.<attrid>.attributeValue.displayValue]] |
valeur affichable |
[[document.attribute.<attrid>.attributeValue.<specialProperty>]] |
Autres propriétés (Voir formatCollection) |
Clef | Définition |
---|---|
[[i18n]] |
Fonction de traduction |
Le contrôleur traduit les textes indiqués entre les balises i18n
. Le texte traduit doit être
fourni par le catalogue de langue du module.
Exemple :
<h1>[[#i18n]]my::Hello world[[/i18n]]</h1>
La clef my::Hello world
doit être une entrée traduite du catalogue.
Il est recommandé d'utiliser un préfixe pour chaque traduction afin de ne pas être en conflit avec d'autres traductions.
L'extraction des clefs de traduction
peut être réalisée avec le programme
xgettextMustache
disponible dans les outils de build.
Modification du pied de page pour afficher une valeur.
class MyRenderConfigCustom extends \Dcp\Ui\DefaultView { public function getTemplates(\Doc $document = null) { $templates=parent::getTemplates($document); $templates["sections"]["footer"]["file"]="MY/customFoot.mustache"; return $templates; } }
Fichier MY/customFoot.mustache
:
<footer class="dcpDocument__footer"> <strong>[[document.attributes.my_information.attributeValue.displayValue]]</strong> </footer>
La méthode getVisibilities
permet de redéfinir la
visibilité des attributs.
/** * @param \Doc $document * @return RenderAttributeVisibilities new attribute visibilities */ public function getVisibilities(\Doc $document);
Les classes Dcp\Ui\DefaultView
et Dcp\Ui\DefaultEdit
retournent les
visibilités par défaut, en fonction du contrôle de vue.
Cette méthode doit retourner un objet de la classe Dcp\Ui\RenderAttributeVisibilities
qui contient les visibilités à appliquer pour chacun des attributs.
La classe RenderAttributeVisibilities
expose la méthode setVisibility
qui
permet de modifier la visibilité d'un attribut en particulier. Cette visibilité
outrepasse la visibilité par défaut et la visibilité indiquée par un masque provenant
du contrôle de vue.
/** * Affect new visibility to an attribute * This visibility is more prioritary than mask * @param string $attributeId attribute identifier * @param string $visibility one of I,H,O,R,W,S * @return $this * @throws Exception */ public function setVisibility($attributeId, $visibility);
Les visibilités utilisables sont définies comme constantes de la classe
\Dcp\Ui\RenderAttributeVisibilities
.
Si une visibilité est appliquée à un attribut structurant, une propagation de cette visibilité sera effectuée.
Modification des visibilités de 2 attributs en surchargeant la classe de vue par défaut.
use Dcp\Ui\RenderAttributeVisibilities; use Dcp\AttributeIdentifiers\My_family; class RenderConfigCustom extends \Dcp\Ui\DefaultView { /** * @param \Doc $document * @return \Dcp\Ui\RenderAttributeVisibilities new attribute visibilities */ public function getVisibilities(\Doc $document) { $visibilities = parent::getVisibilities($document); $visibilities->setVisibility( My_family::my_tab_info, \Dcp\Ui\RenderAttributeVisibilities::ReadOnlyVisibility ); $visibilities->setVisibility( My_family::my_tab_annexe, \Dcp\Ui\RenderAttributeVisibilities::WriteOnlyVisibility ); return $visibilities; } }
La méthode getNeeded
permet de redéfinir
le caractère obligatoire des attributs.
/** * @param \Doc $document * @return RenderAttributeNeeded needed attribute list property */ public function getNeeded(\Doc $document);
Les classes Dcp\Ui\DefaultView
et Dcp\Ui\DefaultEdit
retournent les
obligations par défaut, en fonction du contrôle de vue.
Cette méthode doit retourner un objet de la classe Dcp\Ui\RenderAttributeNeeded
qui contient les obligations à appliquer pour chacun des attributs.
La classe RenderAttributeNeeded
expose la méthode setNeeded
qui permet de
modifier l'obligation d'un attribut en particulier. Cette obligation outrepasse
l'obligation par défaut ainsi que l'obligation indiquée par un masque issu du
contrôle de vue.
/** * Affect new needed property to an attribute * This property is more prioritary than mask * @param string $attributeId attribute identifier * @param bool $isNeeded attribut is needed or not * @return $this * @throws Exception */ public function setNeeded($attributeId, $isNeeded);
Cette obligation ne peut pas être appliquée à un attribut structurant, ni à un attribut contenu dans un tableau.
Modification de l'obligation de 2 attributs en surchargeant la classe de vue par défaut.
use Dcp\Ui\RenderAttributeNeeded; use Dcp\AttributeIdentifiers\My_family; class RenderConfigCustom extends \Dcp\Ui\DefaultView { /** * @param \Doc $document * @return \Dcp\Ui\RenderAttributeNeeded new mandatory attribute */ public function getNeeded(\Doc $document) { $needed = parent::getNeeded($document); $needed->setNeeded(My_family::my_phone, true); $needed->setNeeded(My_family::my_level, false); return $needed; } }
La méthode getCustomServerData
définit des données supplémentaires
transmises au client web.
Ces données peuvent ensuite être utilisées sans contrainte par le client
au moyen de la méthode getServerCustomData
du widget javascript.
/** * Defined some data to be used by client * @param \Doc $document current document to render * @return mixed */ public function getCustomServerData(\Doc $document);
Les données retournées sont converties en json lors de l'envoi.
Si la donnée est un objet PHP, il est préférable d'implémenter l'interface JsonSerializable pour maîtriser son encodage.
Le document a un paramètre de type color
. Le rendu utilise la valeur pour
changer le fond de la de la page.
La classe de rendu, définit les données à envoyer et le traitement javascript à utiliser pour traiter ces données complémentaires.
class RepaintRenderConfigView extends \Dcp\Ui\DefaultView { public function getCustomServerData(\Doc $document) { return array( "repaintColor", $document->getFamilyParameterValue("my_color"), "textColor" => $document->getFamilyParameterValue("my_textColor") ); } public function getJsReferences(\Doc $document=null) { $js=parent::getJsReferences($document); $js["customRepaint"]="MY/Layout/customRepaint.js"; return $js; } }
Sur le client, les données sont récupérées sur le "ready".
MY/Layout/customRepaint.js
window.dcp.document.documentController( "addEventListener", "ready", { "name": "my.custom", "documentCheck": function (documentObject) { return documentObject.family.name === "MY_FAMILY" } }, function (event, documentObject, data) { var myData=this.documentController("getCustomServerData"); if (myData && myData.repaintColor) { $("body").css("background-color", myData.repaintColor); } } );
Lors de la demande du rendu, des données complémentaires peuvent être fournies
par le client au moyen de la méthode addCustomClientData
.
Ces données sont récupérables via la méthode `setCustomClientData.
/** * Retrieve some custom data * * @param mixed $data data provided by client * * @return mixed */ public function setCustomClientData(\Doc $document, $data)
Dans les rendus par défaut (Dcp\Ui\DefaultView
et Dcp\Ui\DefaultEdit
), ces
données sont stockées et accessibles dans la variable protégée customClientData
.
Le programme de rendu de rendu appelle cette méthode après la construction de l'objet. Ces variables sont alors accessibles pour les autres méthodes.
Cette méthode est appelée après l'enregistrement du document lorsqu'il s'agit
d'une demande de création (POST
) , de mise à jour (PUT
) ou de suppression
(DELETE
).
Une méthode statique est disponible pour récupérer les données complémentaires
depuis d'autres méthodes comme par exemple depuis le hook preStore
de l'objet document.
\Dcp\Ui\Utils::getCustomClientData()
Cette méthode retourne la donnée complémentaire décodée qui est fournie dans la requête courante.
Ajouter un message dans l'historique lors de la sauvegarde.
Sur le client, le code suivant est exécuté :
window.dcp.document.documentController("addEventListener", "beforeSave", { "name": "my.custom", "documentCheck": function (document) { return document.family.name === "MY_FAMILY" } }, function (event, document, data) { this.documentController("setCustomClientData", {"History": "Hello World!"}); } );
Le serveur récupère la donnée History
pour l'enregistrer dans l'historique
lors de la demande de sauvegarde.
class MyConfig extends \Dcp\Ui\DefaultEdit { public function setCustomClientData(\Doc $document, $data) { if (! empty($data["History"])) { $document->addHistoryEntry($data["History"]); } } }
La méthode getLabel
permet de définir le libellé de la vue.
Ce libellé est accessible dans la structure retournée par l'api REST
de récupération du rendu au moyen de la clé data.view.renderLabel
.
/** * Get the label of this view * @return string the text label */ public function getLabel(\Doc $document=null);
class ExampleRenderConfigView extends \Dcp\Ui\DefaultView { public function getLabel(\Doc $document) { return "Example view"; } }
Retour du rendu suite à la requête de demande du rendu
http://www.example.net/api/v1/documents/1211/views/!defaultConsultation
data: { uri: "http://localhost/tmp32/api/v1/documents/1211/views/!defaultConsultation", properties: { requestIdentifier: "!defaultConsultation", identifier: "!coreConsultation", label: "Core View Consultation", uri: "http://localhost/tmp32/api/v1/documents/1211/views/!coreConsultation", ... }, uri: "http://localhost/tmp32/api/v1/documents/1211/views/!defaultConsultation", view: { renderLabel: "Example view", documentData: {...} locale: {...} menu: [...] ... } ... }
La variable data.properties.label
contient le label système du rendu.
Ce label est celui du contrôle de vue s'il est utilisé.
La méthode getOptions
permet de spécifier des options de représentations
/** * @param \Doc $document current document to render * @return RenderOptions default render configuration options */ public function getOptions(\Doc $document);
Les options d'attributs sont différentes en fonction du type de l'attribut. certaines options sont communes à tous les types d'attributs, alors que les autes dépendent du type d'attribut.
Les classes Dcp\Ui\DefaultView
et Dcp\Ui\DefaultEdit
retournent les
options par défaut des attributs.
Cette méthode doit retourner un objet de la classe Dcp\Ui\RenderOptions
qui
contient les options choisies pour les attributs du document à visualiser.
Les options sont des objets héritant de la classe
\Dcp\Ui\BaseRenderOptions
. Cette classe permet d'associer chaque option
à un ou plusieurs attributs au moyen de la méthode setScope
.
En particulier, il existe
\Dcp\Ui\DocumentRenderOptions
)\Dcp\Ui\CommonRenderOptions
)\Dcp\Ui\<type>RenderOptions
)Exemple :
$options=new Dcp\Ui\RenderOptions(); $enumOption = new Dcp\Ui\EnumRenderOptions(); $enumOption->setScope(\Dcp\AttributeIdentifiers\My_family::my_continent); $enumOption->useFirstChoice(false); $options->setOption($enumOption);
Afin de simplifier la définition des options, des alias sont définis
sur la classe Dcp\Ui\RenderOptions
:
Type | Méthode | Classe associée |
---|---|---|
document | document() |
Dcp\Ui\DocumentRenderOptions |
commune | common() |
Dcp\Ui\CommonRenderOptions |
account |
account() |
Dcp\Ui\AccountRenderOptions |
array |
arrayAttribute() |
Dcp\Ui\ArrayRenderOptions |
color |
color() |
Dcp\Ui\ColorRenderOptions |
date |
date() |
Dcp\Ui\DateRenderOptions |
docid |
docid() |
Dcp\Ui\DocidRenderOptions |
double |
double() |
Dcp\Ui\DoubleRenderOptions |
enum |
enum() |
Dcp\Ui\EnumRenderOptions |
file |
file() |
Dcp\Ui\FileRenderOptions |
frame |
frame() |
Dcp\Ui\FrameRenderOptions |
htmltext |
htmltext() |
Dcp\Ui\HtmltextRenderOptions |
int |
int() |
Dcp\Ui\IntRenderOptions |
image |
color() |
Dcp\Ui\ImageRenderOptions |
longtext |
longtext() |
Dcp\Ui\LongtextRenderOptions |
password |
password() |
Dcp\Ui\PasswordRenderOptions |
money |
money() |
Dcp\Ui\MoneyRenderOptions |
tab |
tab() |
Dcp\Ui\TabRenderOptions |
text |
text() |
Dcp\Ui\TextRenderOptions |
time |
time() |
Dcp\Ui\TimeRenderOptions |
timestamp |
timestamp() |
Dcp\Ui\TimestampRenderOptions |
Exemple :
use Dcp\Ui\RenderAttributeNeeded; use Dcp\AttributeIdentifiers\My_family; class RenderConfigCustom extends \Dcp\Ui\DefaultView { /** - @param \Doc $document current document to render - @return RenderOptions default render configuration options */ public function getOptions(\Doc $document) { $options = parent::getOptions($document); $options->enum(My_family::my_continent)->display(\Dcp\Ui\EnumRenderOptions::horizontalDisplay); $options->money()->setCurrency('EUR'); return $options; } }
Une option posée pour un attribut identifié est prioritaire sur l'option posée pour un type.
Une option posée pour un type est prioritaire à une option commune posée pour tous les attributs.
Exemple :
use Dcp\Ui\RenderAttributeNeeded; use Dcp\AttributeIdentifiers\My_family; class RenderConfigCustom extends \Dcp\Ui\DefaultView { /** - @param \Doc $document current document to render - @return RenderOptions default render configuration options */ public function getOptions(\Doc $document) { $options = parent::getOptions($document); $options->commonOption()->showEmptyContent("Non communiqué"); $options->commonOption("my_phone")->showEmptyContent("Pas de téléphone"); return $options; } }
Des options personnalisées peuvent aussi être propagée à la vue du client. Ces options non utilisées sur le rendu standard peuvent être exploitées par un code javascript spécifique.
La méthode setOption
permet d'ajouter des options supplémentaires.
Les identifiants de ces options ne doivent pas être en conflit avec les noms des options existantes. Si l'identifiant est un identifiant déjà reconnu, cela revient à modifier ce paramètre de représentation
Les valeurs de l'option peuvent être des nombres, des chaînes de caractères, des tableaux ou tout autre type qui peut être converti en JSON. C'est la donnée convertie en JSON qui sera exploitée.
$options=new Dcp\Ui\RenderOptions(); $options->commonOptions(My_contact::zct_photo) ->setOption("MyFirstCustomOption", "MyOptionValue"); ->setOption("MySecondCustomOption", [ "One"=>"MyFirstValue", "Two"=>"MySecondValue" ]);
Exemple récupération en JS :
$.ready(function() { //Ajouter un event au ready window.dcp.document.documentController( "addEventListener", "change", "my_attr" { "documentCheck" : function(document) { return document.family.name === "MY_FAMILY"}, "name": "myEvent.myFamily" }, function(document, attribute) { // Si l'attribut my_attr égal "GO" alors les attributs ayant l'option MyFirstCustomOption sont cachés if (attribute.attributeValue.value === "GO") { var attributes = this.documentController("getAttributes"); _.each(attributes, function (attr) { if (attr.getOption("MyFirstCustomOption") === "MyOptionValue") { this.documentController("hideAttribute", attr.id); } }) } } ); });
Une configuration de rendu de transition est définie par une classe PHP
qui doit implémenter l'interface Dcp\Ui\IRendertransition
.
Dans les méthodes d'une configuration
de rendu de transition, les utilisations de get
et de set
peuvent sembler inversées.
Ce n'est pas le cas : ces méthodes sont utilisées par la plateforme pour générer le rendu.
Par exemple, la méthode getTransitionParameters
est appelée par Dynacase pour obtenir
les paramètres à utiliser lors du rendu du document
La méthode implémentée ne positionne (set
) pas ces visibilités, mais les retourne (get
).
La méthode getCssReferences()
retourne une liste de fichiers css à inclure.
string[] getCssReferences(string $transitionId)
Le tableau retourné doit être indexé. L'index identifie le fichier. Le fichier css est ajouté lors de l'affichage de la transition. Il est supprimé lorsque le formulaire est effacé.
L'élément DOM de plus haut niveau est de la classe dcpTransition
.
Chaque section a sa propre classe comme indiqué dans la méthode
\Dcp\Ui\TransitionRender::getTemplates
.
De plus, l'élément de haut niveau possède les attributs data-transition
et
data-state
qui contiennent respectivement l'identifiant de la transition et
l'identifiant de l'étape suivante. Ces éléments permettent de cibler précisément
la transition voulue avec une feuille de style générale.
Le fichier css inséré étant applicable sur l'ensemble du document, il est
recommandé de cibler les éléments fils de la classe dcpTransition
.
Mettre un fond orange sur le formulaire.
ZOO/Layout/customTransition.css
.dcpTransition { background-color: orange; }
namespace My; class CustomRender extends \Dcp\Ui\TransitionRender { public function getCssReferences($transitionId) { return array( "customTransition" => "ZOO/Layout/customTransition.css" ); } }
Les fichier css ajoutés ne sont pas enlevés lorsque la fenêtre de transition se ferme. Il sont par contre enlevés lorsqu'on charge un autre document ou un autre rendu.
La méthode getJsReferences()
retourne une liste de fichiers javascript à inclure.
string[] getJsReferences(string $transitionId)
Le tableau retourné doit être indexé. L'index identifie le fichier. Le fichier js est inséré lors de l'affichage de la transition.
Une fois injecté dans la page, le fichier js est ensuite conservé même après la fermeture de la transition.
La méthode getRenderOptions()
permet de modifier les
options de rendu des paramètres de transition.
Dcp\Ui\RenderOptions getRenderOptions(string $transitionId)
Les options de rendu des paramètres de transition se gèrent comme des options de rendu d'attribut.
Modifier le rendu des relations de la transition myFirstTransition
namespace My; class CustomRender extends \Dcp\Ui\TransitionRender { /** @return \Dcp\Ui\RenderOptions @throws \Dcp\Ui\Exception */ public function getRenderOptions($transitionId) { $options = parent::getRenderOptions($transitionId); if (transitionId === My_wfl::myFirstTransition) $parameters = $this->getTransitionParameters($transitionId); foreach ($parameters as & $ask) { $attribute = $this->workflow->getAttribute($ask->getId()); if ($attribute && $attribute->type === "docid") { $options->docid($attribute->id) ->setPlaceHolder($attribute->getLabel()) ->setLabelPosition("none"); } } } return $options; } }
Déplacer le label de l'attribut sur celui du cadre si le cadre contient un seul paramètre.
namespace My; class CustomRender extends \Dcp\Ui\TransitionRender { /** @return \Dcp\Ui\RenderOptions @throws \Dcp\Ui\Exception */ public function getRenderOptions($transitionId) $options = parent::getRenderOptions($transitionId); $parameters = $this->getTransitionParameters($transitionId); if (count($parameters) === 2) { // frame included foreach ($parameters as & $ask) { $attribute = $this->workflow->getAttribute($ask->getId()); if ($attribute && ($attribute->id !== self::parameterFrameAttribute) { //hide attribute label $options->commonOption($attribute->id)->setLabelPosition( \Dcp\Ui\CommonRenderOptions::nonePosition ); // set frame label to attribute label $options->frame(self::parameterFrameAttribute) ->setAttributeLabel($attribute->getLabel()); } } } return $options; } }
La méthode getTransitionParameters()
permet de modifier les caractéristiques
des paramètres de transitions.
Dcp\Ui\AttributeInfo[] getTransitionParameters(string $transitionId)
Elle doit retourner un array
d'objets de la classe \Dcp\Ui\AttributeInfo
.
L'attribut cadre dans lequel les attributs sont insérés est identifié par la
constante TransitionRender::parameterFrameAttribute
;
Si la caractéristique nr
de la transition n'est pas true
, un attribut
TransitionRender::commentAttribute
est ajouté à la liste des paramètres.
Il inséré dans un cadre propre : TransitionRender::commentFrameAttribute
.
Les attributs de types tab
ou frame
ne peuvent pas être utilisés dans la déclaration des paramètres de la transition.
modifier la visibilité du paramètre wad_file
.
namespace My; class CustomRender extends \Dcp\Ui\TransitionRender { public function getTransitionParameters($transitionId) { $parameters = parent::getTransitionParameters($transitionId); foreach ($parameters as &$ask) { $attribute = $this->workflow->getAttribute($ask->getId()); if ($attribute && $attribute->id === \Dcp\AttributeIdentifiers\My_workflow::wad_file ) { $ask->setVisibility("S"); } } return $parameters; } }
La méthode getTemplates permet de modifier les templates utilisés pour générer le formulaire de demande de transition.
String[] getTemplates(string $transitionId)
Le formulaire de demande de transitions est composé d'un corps, lui même calculé à partir des 4 sections suivantes :
transitionHeader
: contient le graphe indiquant l'étape de départ et d'arrivéetransitionAsk
: contient les champs des paramètrestransitionMessages
: contient les messages suite à la demande de transitiontransitionButtons
: contient les boutons de confirmation et d'annulationLes modèles par défaut de ces sections sont les suivants :
"sections" => array( "transitionHeader" => '<div class="dcpTransition--header"/>', "transitionAsk" => '<section class="dcpTransition--ask dcpDocument__body"/>', "transitionMessages" => '<div class="dcpTransition--messages"/>', "transitionButtons" => '<div class="dcpTransition--buttons"/>' )
Le corps est une concaténation des 4 sections décrites ci-dessus.
"body" => "{{>transitionHeader}}{{>transitionAsk}}{{>transitionMessages}}{{>transitionButtons}}",
Il est possible d'ajouter des fragments HTML avant ou après chaque sections
Ajouter une note en dessous des messages.
namespace My; class CustomRender extends \Dcp\Ui\TransitionRender { public function getTemplates($transitionId) { $templates = parent::getTemplates($transitionId); $templates["sections"]["transitionMessages"] .= '<h1>Cette transition va envoyer un mail à votre chef !</h1>'; return $templates; } }
Le définition du menu du document est indiqué dans la classe de configuration de rendu.
Elle est fournie par la méthode IRenderConfig::getMenu()
.
/** * @param \Doc $document Document object instance * @return BarMenu Menu configuration */ public function getMenu(\Doc $document);
Cette méthode retourne un objet Dcp\Ui\Barmenu
qui contient la définition de
chacun des éléments constituant le menu.
Un élément de menu est défini par un objet de la classe Dcp\Ui\ItemMenu
.
Dcp\Ui\ItemMenu __construct(string $identifier, string $label = '', string $url = '')
Arguments :
id
label
(optionnel)url
(optionnel)Exemple :
public function getMenu(\Doc $document) { $myMenu = new \Dcp\ui\BarMenu(); $myItem = new \Dcp\Ui\ItemMenu( "myTest5", ___("My label", "my") ); $myItem->setUrl("http://www.example.net"); $myMenu->appendElement($myItem); return $myMenu; }
L'url est indiquée sur le constructeur ou par la méthode setUrl()
.
Dcp\Ui\ItemMenu setUrl(string $url)
Cette url peut être relative ou absolue.
L'url est un template Mustache, et accepte les variables suivantes :
Variable | Description |
---|---|
document.properties.id |
Identifiant du document |
document.properties.initid |
Identifiant de la lignée documentaire |
document.properties.icon |
Url de l'icône du document |
document.properties.revision |
Numéro de révision |
document.properties.status |
Statut du document : alive , deleted , fixed
|
document.properties.title |
Titre du document |
document.properties.renderMode |
Mode de rendu : view , edit
|
document.properties.viewId |
Identifiant de lu rendu |
document.properties.family.id |
Identifiant de la famille |
document.properties.family.title |
Titre de la famille |
document.properties.family.name |
Nom logique de la famille |
document.properties.family.icon |
Url de l'icône de la famille |
Exemple :
$myItem->setUrl("http://www.example.net/?id={{document.properties.id}}");
Par défaut, la cible du menu est _self
. Elle peut être modifiée par la méthode setTarget()
.
Dcp\Ui\ItemMenu setTarget(string $target, Dcp\Ui\MenuTargetOptions $dialogOptions=null)
Arguments :
$target
la cible du menu
Si $target
vaut _dialog
, le résultat de la requête sera affiché dans une
fenêtre de dialogue interne.
$dialogOptions
Lorsque la cible est _dialog
, la fenêtre de dialogue peut être paramétrée
au moyen d'un objet \Dcp\Ui\MenuTargetOptions
.
Cet objet a les propriétés suivantes :
title
windowHeight
windowWidth
Cette option n'est pas applicable si l'url est celle d'un événement.
Si la cible est _self
, les options windowHeight
et windowWidth
peuvent
être utilisée. Par contre l'unité doit obligatoirement être un nombre (exprimé
en "px"). Dans ce cas, la fenêtre ouverte ne possède ni menus ni
barre d'adresse.
Exemple :
$item = new \Dcp\Ui\ItemMenu( "myMessage", ___("My message", "My") ); $targetOption = new \Dcp\Ui\MenuTargetOptions(); $targetOption->title = ___("This is my message", "My"); $targetOption->windowHeight = "300px"; $targetOption->windowWidth = "400px"; $item->setTarget("_dialog", $targetOption);
L'url peut aussi être définie pour être capturée par le client avec du code javascript.
Si l'url est de la forme #action/<eventType>:<option1>:<option2>:...
,
l'événement peut être capturé par l'écoute de
actionClick
.
Exemple :
class MyRenderConfigView extends \Dcp\Ui\DefaultView { public function getJsReferences() { $js=parent::getJsReferences(); $js["myContact"]="MY/Layout/myCustom.js"; return $js; } public function getMenu(\Doc $document) { $menu = parent::getMenu($document); $myItem = new \Dcp\Ui\ItemMenu( "myAlert", ___("My alert", "my") ); $myItem->setUrl("#action/my:myOptions"); $menu->appendElement($myItem); return $menu; } }
Fichier MY/Layout/myCustom.js
:
window.dcp.document.documentController( "addEventListener", "actionClick", { "name": "my.alert", "documentCheck": function (documentObject) { return (documentObject.family.name === "MY_FAMILY"); } }, function(event, documentObject, data) { if (data.eventId === "my") { if (data.options.length > 0 && data.options[0] === "myOptions" ) { alert("I catched my event"); } } } );
Le contenu du menu est la partie affichée.
Le libellé du menu est indiqué sur le constructeur ou par l'une des méthodes suivantes :
setTextLabel()
La méthode setTextLabel()
indique un libellé texte brut. Les caractères
spéciaux seront échappées en entités HTML.
Dcp\Ui\ItemMenu setTextLabel(string $label)
setHtmlLabel()
La méthode setHtmlLabel()
indique un fragment html qui sera affiché.
Dcp\Ui\ItemMenu setHtmlLabel(string $label)
Dans le cas où les 2 méthodes sont utilisées, le label brut est précédé du label HTML.
Il est possible d'ajouter un préfixe de menu (ce préfixe sera aligné verticalement sur le menu) au moyen des méthodes suivantes :
setBeforeContent
La méthode setBeforeContent()
permet d'ajout un fragment HTML avant le texte
(par exemple, un caractère font-awesome).
Dcp\Ui\ItemMenu setBeforeContent(string $htmtText)
setIcon
La méthode setIcon()
permet d'ajouter une icône avant le texte.
Dcp\Ui\ItemMenu setIcon(string $imagePath, int $imageWidth = 12)
Dcp\Ui\ItemMenu setTooltipLabel(string $tooltipLabel, bool $html=true)
La méthode setTooltipLabel()
permet d'ajouter un texte (brut ou html) comme
tooltip qui sera affiché au survol de l'élément.
Dcp\Ui\ItemMenu setHtmlAttribute(string $attrid, string $value)
La méthode setHtmlAttribute()
permet d'ajouter des attributs html quelconque
comme par exemple une classe ou des données spécifiques.
Exemple :
public function getMenu_(\Doc $document) { $myMenu=new \Dcp\ui\BarMenu(); $myItem = new \Dcp\Ui\ItemMenu( "myFirstMenu", ___("My label", "my") ); $myItem->setUrl("http://www.example.net/?a={{document.properties.id}}"); // Utilisation de caractère fontawesome $myItem->setBeforeContent('<div class="fa fa-cog" />'); $myMenu->appendElement($myItem); $myItem = new \Dcp\Ui\ItemMenu( "myHelpMenu" ); $myItem->setUrl("?app=MY&action=HELP"); // Utilisation d'un label gras et rouge $myItem->setHtmlLabel('<strong style="color:red">HELP</strong> : '); // Utilisation d'une icône $myItem->setIcon("MY/Images/myHelp.png"); // ajout d'une classe personnalisée $myItem->setHtmlAttribute("class","my--menu-help"); $myMenu->appendElement($myItem); return $myMenu; }
Un élément de menu peut demander une confirmation avant d'être envoyé.
La confirmation est indiquée par la méthode useConfirm()
.
Dcp\Ui\ItemMenu useConfirm(string $question, Dcp\Ui\MenuConfirmOptions $dialogOptions=null)
Une fenêtre de dialogue modale est affichée avec la question et deux boutons : un bouton de confirmation et un bouton d'annulation.
Arguments :
$question
$dialogOptions
un objet Dcp\Ui\MenuConfirmOptions
.
Cet objet a les propriétés de configuration suivantes :
title
windowWidth
windowHeight
confirmButton
cancelButton
Exemple extrait de menu de suppression de document :
$item = new ItemMenu("delete", ___("Delete", "UiMenu") , "#action/document:delete"); $item->setTooltipLabel(___("Put document to the trash", "UiMenu")); $confirmOption = new MenuConfirmOptions(); $confirmOption->title = ___("Confirm deletion of {{{document.properties.title}}}"); $confirmOption->confirmButton = ___("Confirm deletion", "UiMenu"); $confirmOption->windowWidth = "350px"; $confirmOption->windowHeight = "150px"; $item->useConfirm(sprintf(___("Sure delete %s ?", "UiMenu") , $document->getHtmlTitle()) , $confirmOption); $item->setBeforeContent('<div class="fa fa-trash-o" />'); $menu->appendElement($item);
Un menu peut contenir des éléments simples ou des listes d'éléments (sous-menus).
Une liste d'éléments de menu est définie par un objet de la classe Dcp\Ui\ListMenu
.
Dcp\Ui\ListMenu __construct(string $identifier, string $label = '')
Arguments :
identifier
label
La liste dynamique est une liste d'éléments qui est constituée sur le serveur à chaque ouverture de la liste.
Une liste dynamique d'éléments de menu est définie par un objet de la classe Dcp\Ui\DynamicMenu
.
Dcp\Ui\DynamicMenu __construct(string $identifier, string $label = '')
Arguments :
identifier
label
La méthode setContent()
permet d'indiquer la méthode qui sera appelée à chaque
ouverture de la liste.
Dcp\Ui\DynamicMenu setContent(\Closure $definition)
L'argument $definition
est une méthode qui a comme argument l'objet
Dcp\Ui\ListMenu
en cours. Les éléments de la liste dynamique doivent être
ajoutés dans cette liste.
Exemple : Affichage des 10 dernières notes modifiées.
class AllRenderConfigView extends \Dcp\Ui\DefaultView { public function getMenu(\Doc $document) { $menu = parent::getMenu($document); $lastNoteList = new \Dcp\Ui\DynamicMenu("lastNotes", "Dernières notes"); $lastNoteList->setContent(function (\Dcp\Ui\ListMenu & $menu) use ($document) { $s=new \SearchDoc("", "MY_NOTES"); $s->setSlice(10); $s->setOrder("revdate desc"); $s->setObjectReturn(true); $dl=$s->search()->getDocumentList(); foreach ($dl as $doc) { $myNote = new \Dcp\Ui\ItemMenu("doc".$doc->id, $doc->getHtmlTitle()); $myNote->setUrl(sprintf("#action/document:load:%d",$doc->initid)); $myNote->setIcon($doc->getIcon()); $menu->appendElement($myNote); } }); $menu->appendElement($lastNoteList); return $menu; } }
Un élément texte peut être ajouté pour séparer les autres éléments d'une liste ou de la barre de menu.
Un séparateur est défini par un objet de la classe Dcp\Ui\SeparatorMenu
.
Dcp\Ui\SeparatorMenu __construct(string $identifier, string $label = '')
Arguments :
identifier
label
Les méthodes applicables sont les mêmes que celle du formatage d'un élément simple.
Exemple :
$myItem = new \Dcp\Ui\SeparatorMenu( "mySeparator", ___("Séparateur", "my") ); $myItem->setBeforeContent('<div class="fa fa-cog" />'); $menu->appendElement($myItem);
Les classes Dcp\Ui\Barmenu
et Dcp\Ui\ListMenu
sont des listes d'éléments.
À ce titre, elles permettent de gérer les éléments les composant.
L'ajout d'un élément en fin de liste est réalisé par la méthode appendElement()
.
Dcp\Ui\Barmenu|ListMenu|DynamicMenu appendElement(Dcp\Ui\ElementMenu $elMenu)
Cette méthode ajoute un élément simple ou une autre liste afin de créer des sous-listes.
La méthode insertBefore()
insère le nouvel élément avant l'élément indiqué.
Dcp\Ui\Barmenu|ListMenu|DynamicMenu insertBefore(string $menuId, Dcp\Ui\ElementMenu $elMenu)
L'argument $menuId
est l'identifiant de l'élément avant lequel le nouvel
élément sera est inséré.
La méthode insertAfter()
insère le nouvel élément après l'élément indiqué.
Dcp\Ui\Barmenu|ListMenu|DynamicMenu insertAfter(string $menuId, Dcp\Ui\ElementMenu $elMenu)
L'argument $menuId
est l'identifiant de l'élément après lequel le nouvel
élément sera est inséré.
Exemple :
Trois menus affichés dans une liste affichée en dernier dans la barre de menu.
public function getMenu(\Doc $document) { $menu = parent::getMenu($document); $myList = new \Dcp\Ui\ListMenu("myCustomList", ___("Custom Menu", "my")); $myList->setIcon("Images/app_switcher.png"); $myItem = new \Dcp\Ui\ItemMenu("myTest", ___("My label", "my")); $myItem->setUrl("?app=TEST&ction=X&id={{document.properties.id}}"); $myList->appendElement($myItem); $myItem = new \Dcp\Ui\ItemMenu("myAlert", ___("My alert", "my")); $myItem->setUrl("#action/my:myOptions"); $myList->appendElement($myItem); $myItem = new \Dcp\Ui\ItemMenu("myHelp", ___("My help", "my")); $myItem->setUrl("#action/my:myHelp"); $myList->insertBefore("myAlert", $myItem); $menu->appendElement($myList); return $menu; }
La méthode removeElement()` retire un élément de la liste.
Dcp\Ui\BarMenu|ListMenu removeElement(string $menuId)
L'argument $menuId
est l'identifiant de l'élément à retirer.
Les éléments de menu contenus dans un objet Dcp\UiBarMenu
ou Dcp\Ui\ListMenu
sont accessibles au moyen de la méthode getElements()
, qui retourne un tableau
d'éléments.
Array getElements()
Pour accéder à un élément de menu par son id, on peut utiliser la méthode
getElement()
. L'élément est alors recherché récursivement à partir de la liste
depuis laquelle la méthode est appelée.
Dcp\Ui\BarMenu|ListMenu getElement(string $menuId)
Exemple :
Modifier le menu standard de consultation :
public function getMenu(\Doc $document) { $myMenu=parent::getMenu($document); $modifyItem=$myMenu->getElement("modify"); if ($modifyItem) { $myMenu->removeElement("modify"); $modifyItem->setTextLabel("Afficher le formulaire"); $myMenu->appendElement($modifyItem); } $myMenu->removeElement("historic"); $deleteItem=$myMenu->getElement("delete"); if ($deletItem) { $deleteItem->setHtmlAttribute("style","background-color:red"); } return $myMenu; }
Les menus déclarés sont affichés et actifs par défaut. Leur visibilités et leur activation peuvent être modifiées.
Ces états de menu peuvent être ensuite manipulés par le client afin d'inhiber ou désinhiber les menus en fonction des actions sur l'interface.
Dcp\Ui\ElementMenu setVisibility(string $visibility)
Les visibilités possibles sont :
Dcp\Ui\ElementMenu::VisibilityVisible
: Visible et actif (par défaut)Dcp\Ui\ElementMenu::VisibilityHidden
: Non visibleDcp\Ui\ElementMenu::VisibilityDisabled
: Visible mais non actifLa visibilité est applicable aux éléments simples ou aux listes.
Exemple : Inhibition de la liste myCustomList
si l'attribut my_level
du
document vaut 44.
public function getMenu(\Doc $document) { $menu = parent::getMenu($document); $myList = new \Dcp\Ui\ListMenu("myCustomList", ___("Custom Menu", "my")); if ($document->getValue("my_level") === "44") { $myList->setVisibility(\Dcp\Ui\ListMenu::VisibilityDisabled); } $menu->appendElement($myList); return $menu; }
La classe Dcp\Ui\DefaultView
retourne un menu avec les éléments suivants :
Identifiant menu | Description | Note |
---|---|---|
modify |
Modifier (Affichage du formulaire) | |
delete |
Suppression du document | |
restore |
Restauration du document | |
historic |
Affichage de l'historique | |
advanced.properties |
Affichage des propriétés | |
advanced.security.lock |
Verrouillage du document | pas implémenté |
advanced.security.unlock |
Déverrouillage du document | pas implémenté |
workflow |
Liste des transitions possibles |
La classe Dcp\Ui\DefaultEdit
retourne un menu avec les éléments suivants :
Identifiant menu | Description | note |
---|---|---|
save |
Enregistrement du document | |
save! |
Enregistrement forcé | pas implémenté |
create |
Création et enregistrement | |
create! |
Création forcée | pas implémenté |
close |
Fermeture (Affichage en mode consultation) | |
workflow |
Nom de l'activité (pas de boutons) |
Les événements suivants sont écoutés par défaut pour les menus
url | Description |
---|---|
#action/document.close:<viewId> |
Ouverture avec la rendu "viewId" (optionnel : consultation par défaut) |
#action/document.create |
Enregistrement nouveau document |
#action/document.delete |
Suppression du document |
#action/document.edit |
Ouverture en mode modification |
#action/document.history |
Affichage de l'historique |
#action/document.load:<documentId>:<viewId> |
Ouverture d'un autre document "documentId" |
#action/document.properties |
Affichage des propriétés |
#action/document.save |
Enregistrement du document |
#action/document.restore |
Restauration du document |
#action/document.selectTab:<tabId> |
Sélection d'un onglet de document |
Ces options permettent de modifier la façont dont le document est rendu dans son ensemble.
Cette option indique le positionnement des onglets.
Dcp\Ui\DocumentRenderOptions setTabPlacement(string $tabPlacement)
Le widget de gestion des onglets est basé sur un widget [Kendo tab Strip
][kendotab].
Aucune
L'argument tabPlacement
peut valoir :
Dcp\Ui\DocumentRenderOptions::tabTopFixPlacement
affichage horizontal en haut "taille des onglets fixe" (par défaut)
Si la largeur de l'ensemble des d'onglets dépasse la largeur de la page, le dernier onglet visible devient un sélecteur permettant d'accéder aux onglets suivants qui ne sont pas affichés.
Pour modifier la largeur d'un onglet dans ce mode, la règle css suivante peut être surchargée :
.dcpDocument__tabs--fixed .dcpTab__label { width: 10em; }
Dcp\Ui\DocumentRenderOptions::tabTopProportionalPlacement
affichage horizontal en haut "taille des onglets variable"
Tous les onglets ont la même largeur qui est proportionnelle à la largeur du document. Tous les onglets sont affichés quelque soit la largeur. Si le texte complet n'a pas la place de s'afficher, il est tronqué (ellipsis).
Dcp\Ui\DocumentRenderOptions::tabLeftPlacement
affichage vertical à gauche
Pour modifier la largeur d'un onglet dans ce mode, la règle css suivante peut être surchargée :
.dcpDocument__tabs--left .dcpDocument__tabs__list { width: 10em; }
Aucun
Positionnement à gauche :
$options->document() ->setTabPlacement(\Dcp\Ui\DocumentRenderOptions::tabLeftPlacement);
Cette option permet d'indiquer que l'onglet concerné est le premier affiché lors de la consultation du document.
Dcp\Ui\DocumentRenderOptions setOpenFirstTab(string $tabId)
Aucune
L'argument tabId
indique l'identifiant de l'onglet à ouvrir lors de
l'affichage du document.
Si l'onglet à ouvrir n'est pas visible, c'est le premier onglet visible qui est affiché.
Si cette option n'est pas utilisée alors :
Lors de la création ou lors de la première consultation, l'onglet affiché est le premier des onglets visibles.
À chaque sélection d'onglet, la sélection est mémorisée sur le serveur (pour chacun des utilisateurs) pour être ensuite utilisée lors de la prochaine ouverture du document.
Ouverture de l'onglet my_informations
.
$options->document()->setOpenFirstTab(My_family::my_informations);
Cette option laisse la barre d'onglet visible lors d'un défilement vertical.
Dcp\Ui\DocumentRenderOptions setStickyTabs(string $height)
Aucune
$height
indique la hauteur à partir de laquelle l'onglet est collé.Ce paramètre doit indiquer une valeur absolue avec son unité : "100px", "10rem" La valeur "auto" peut être utilisé. Dans ce cas, la valeur sera celle de la barre de menu.
Aucun
$options->document()->setStickyTabs('100px');
Descriptions des différentes méthodes de configuration de la représentation des attributs.
Les options de représentation indiquées dans la structure de la famille ne sont pas prises en compte dans les interfaces HTML5.
Les restrictions indiquées dans les différents sous-chapitres ne sont pas contrôlés par le client. Toute option qui ne respecte pas ces restrictions est ignorée.
Sur tous les arguments de type "texte" (texte brut ou html) des différentes méthodes d'option de rendu, sauf indication contraire, les textes sont des textes bruts qui ne seront pas parsés par l'analyseur "mustache" pour affecter des parties variables.
Les arguments de type fragment HTML, sauf indication contraire, sont des
fragments qui sont insérés dans des div
et peuvent contenir un contenu de
flux.
Les options de représentation indiquées dans la structure de la famille ne sont pas prises en compte dans les interfaces HTML5.
Cette option indique le texte à afficher dans le cas où la valeur de l'attribut est vide.
Dcp\Ui\CommonRenderOptions showEmptyContent(string $htmlText)
L'argument en entrée est un fragment html affiché à la place de la valeur de l'attribut lorsque sa valeur est vide.
Aucun
use Dcp\AttributeIdentifiers\My_contact; class MyCustomRender extends \Dcp\Ui\DefaultView { public function getOptions(\Doc $document) { $options = parent::getOptions($document); $options->commonOption()->showEmptyContent("Non communiqué"); $options->commonOption(My_contact::zct_civility) ->showEmptyContent("Non communiquée"); $options->commonOption(My_contact::zct_phone) ->showEmptyContent('<b class="my-nophone">Pas de téléphone</b>'); $options->image(My_contact::zct_photo) ->showEmptyContent('<img src="MY/Images/my_nophoto.png"/>'); return $options; }
Cette option ajoute un hyperlien sur la valeur de l'attribut si celui-ci est affiché.
Dcp\Ui\CommonRenderOptions setLink(Dcp\ui\htmlLinkOptions $linkOption)
array
, frame
, htmltext
et tab
L'argument en entrée est un objet de type Dcp\Ui\htmlLinkOptions
qui configure
les différents paramètres du lien :
target
_self
(valeur par défaut), la fenêtre courante est utilisée.
* Si la valeur est _dialog
, une fenêtre de dialogue interne sera utilisée.title
{{value}}
et {{displayValue}}
)
peuvent être utilisées.url
{{value}}
et {{displayValue}}
)
peuvent être utilisées.
Ces valeurs sont encodées (au moyen de la fonction
encodeUriComponent
).urls
Si target
est différente de _self
les options suivantes sont prises en compte :
windowHeight
_dialog
, la dimension doit être une
dimension css valable
(c'est à dire un nombre suivi immédiatement de son unité).
Sinon la dimension est un nombre entier exprimé en pixels.windowWidth
_dialog
, la dimension doit être une
dimension css valable
(c'est à dire un nombre suivi immédiatement de son unité).
Sinon la dimension est un nombre entier exprimé en pixels.windowTitle
(seulement si target
est égal à _dialog
){{value}}
et {{displayValue}}
pour tous les types d'attribut).De plus, lorsque windowHeight
ou windowWidth
est défini et que target
est
différent de _self
et _dialog
, la fenêtre ouverte ne possède ni menus ni
barre d'adresse.
Dans le rendus de consultation par défaut (
Dcp\Ui\DefaultView
), les liens sont affectés en fonction de la colonne
link
défini dans la définition de l'attribut.
Pour les attributs "multiple" (type docid
, account
et enum
), les variables
de valeurs d'attribut sont des tableaux. Ils doivent être adressés en Mustache
par des répétables.
Exemple :
`<b>Voici les valeurs : <ul>{{#.}}<li>{{displayValue}}</li>{{/.}}</ul></b>`
Pour les attributs dans les tableaux, les variables {{value}}
et
{{displayValue}}
sont remplacés par la valeur de l'attribut à la rangée
(index) donnée.
Il possible d'utiliser des url différentes par index. Dans ce cas, il faut renseigner la variable "urls" afin de donner des urls spécifiques par rangée.
Sur l'attribut "my_text", ajout d'un lien vers "http://www.example.net".
$linkOption = new \Dcp\ui\htmlLinkOptions(); $linkOption->target = "_dialog"; $linkOption->title = "Go to My page"; $linkOption->windowHeight = "300px"; $linkOption->windowWidth = "500px"; $linkOption->windowTitle = "Mon test {{value}} {{displayValue}}"; $linkOption->url = "http://www.example.net"; $options->text("my_text")->setLink($linkOption);
Sur les images affichage d'une plus grande miniature et affichage de l'image en taille "200px" dans une boite de "200px".
$linkOption = new \Dcp\ui\htmlLinkOptions(); $linkOption->target = "_dialog"; $linkOption->title = ' <h3><img src="{{thumbnail}}&size=100"/>{{displayValue}}</h3>'; $linkOption->url = "{{{url}}}&size=200"; $linkOption->windowHeight = "200px"; $linkOption->windowWidth = "200px"; $options->image()->setLink($linkOption);
Modifier le titre (tooltip) du lien de la relation "myRelation" :
/** * @var $link \Dcp\Ui\HtmlLinkOptions */ $link = $options->docid(myAttributes::myRelation)->getOption(\Dcp\Ui\CommonRenderOptions::htmlLinkOption); if ($link) { $link->title = "Voir le document de <br/><b>\"{{displayValue}}\"<b>"; }
La couleur du tooltip généré par l'argument title
est surchargeable à l'aide
des règles css suivantes :
Exemple : tooltip écrit en noir sur fond vert pour tous les attributs du cadre "my_frame"
.dcpFrame__content[data-attrid=my_frame] .tooltip.dcpAttribute__linkvalue .tooltip-inner { background-color: #f7f942; /* Green */ color: #000000; } .dcpFrame__content[data-attrid=my_frame] .tooltip.dcpAttribute__linkvalue.tooltip.top .tooltip-arrow { border-top-color: #f7f942; } .dcpFrame__content[data-attrid=my_frame] .tooltip.dcpAttribute__linkvalue.tooltip.bottom .tooltip-arrow { border-bottom-color: #f7f942; }
Exemple : tooltip écrit en noir sur fond rose pour l'attribut' "my_mail"
.dcpAttribute[data-attrid=my_mail] .tooltip.dcpAttribute__linkvalue .tooltip-inner { background-color: #f99adf; /* Pink */ color: #000000; } .dcpAttribute[data-attrid=my_mail] .tooltip.dcpAttribute__linkvalue.tooltip.top .tooltip-arrow { border-top-color: #f99adf; } .dcpAttribute[data-attrid=my_mail] .tooltip.dcpAttribute__linkvalue.tooltip.bottom .tooltip-arrow { border-bottom-color: #f99adf; }
Cette option indique le placement du label par rapport à la valeur de l'attribut.
Dcp\Ui\CommonRenderOptions setLabelPosition(string $position)
tab
.frame
.L'argument en entrée peut prendre les valeurs suivantes :
Dcp\Ui\CommonRenderOptions::autoPosition
(valeur par défaut)@grid-float-breakpoint
)Dcp\Ui\CommonRenderOptions::leftPosition
Dcp\Ui\CommonRenderOptions::upPosition
Dcp\Ui\CommonRenderOptions::nonePosition
Ces différentes positions sont définies comme des constantes de la classe Dcp\Ui\CommonRenderOptions
.
Pour les cadres (type frame
) :
la valeur Dcp\Ui\CommonRenderOptions::autoPosition
est équivalente à la
valeur Dcp\Ui\CommonRenderOptions::upPosition
.
la valeur Dcp\Ui\CommonRenderOptions::leftPosition
, n'est pas applicable.
la valeur Dcp\Ui\CommonRenderOptions::nonePosition
efface le libellé
(header du cadre).
Pour les tableaux (type array
) :
Dcp\Ui\CommonRenderOptions::autoPosition
", la limite de
largeur de page n'est pas la même que pour les attributs "normaux".1280px
afin de représenter le tableau dans
des conditions optimales. Elle peut être modifiée avec la méthode
setResponsiveBreakpoints
.$options->text("my_attribute")->labelPosition(Dcp\Ui\CommonRenderOptions::leftPosition);
Cette option permet de modifier le texte d'un libellé d'attribut.
Dcp\Ui\CommonRenderOptions setAttributeLabel(string $label)
Aucune
L'argument $label
est un texte brut (et non un fragment HTML) qui sera utilisé
comme label de l'attribut.
Aucun
$options->text("my_attribute")->setAttributeLabel("Mon nouveau texte");
Cette option permet d'afficher une description détaillée pour un attribut.
Dcp\Ui\CommonRenderOptions setDescription( string $htmlTitle, string $position = Dcp\Ui\CommonRenderOptions::topPosition, string $htmlContent = "", bool $collapsed = false)
Aucune
$htmlTitle
$position
$htmlContent
$collapsed
true
alors la description est
escamotée. L'utilisateur doit alors cliquer sur le bouton présent sur le titre
pour l'afficher.Attribut contenant une valeur : type "text", "int", "date", etc. Ne concerne pas ces attributs s'ils sont définis dans un tableau.
Dcp\Ui\CommonRenderOptions::topPosition
: Texte affiché au dessus du contenu de l'attribut (libellé et valeur)
Figure 4. Placement "top"
Dcp\Ui\CommonRenderOptions::bottomPosition
:Texte affiché au dessous du contenu de l'attribut (libellé et valeur)
Figure 5. Placement "top"
Dcp\Ui\CommonRenderOptions::leftPosition
: Texte affiché à gauche du contenu de l'attribut
Figure 6. Placement "left"
Dcp\Ui\CommonRenderOptions::rightPosition
: Texte affiché à droite du contenu de l'attribut
Figure 7. Placement "right"
Dcp\Ui\CommonRenderOptions::topLabelPosition
: Texte affiché au dessus du libellé de l'attribut
Figure 8. Placement "topLabel"
Dcp\Ui\CommonRenderOptions::topValuePosition
: Texte affiché au dessus de la valeur de l'attribut
Figure 9. Placement "topValue"
Dcp\Ui\CommonRenderOptions::bottomLabelPosition
: Texte affiché au dessous du libellé de l'attribut
Figure 10. Placement "bottomLabel"
Dcp\Ui\CommonRenderOptions::bottomValuePosition
: Texte affiché au dessous de la valeur de l'attribut
Figure 11. Placement "bottomValue"
Dcp\Ui\CommonRenderOptions::clickPosition
: Affiche une ancre
à gauche du libellé. Cette ancre
affiche la description lorsque l'utilisateur clique dessus.
Figure 12. Placement "click"
Le positionnement dans les tableaux est propre à ce type. Voir la position dans les tableaux.
Le positionnement dans les cadres est propre à ce type. Voir la position dans les cadres.
Le positionnement dans les onglets est propre à ce type. Voir la position dans les onglets.
Les variables suivantes sont utilisables comme variable "Mustache" dans la description courte ou la description longue.
id
: identifiant de l'attributlabel
: label de l'attribut (localisé)needed
: (bool) Indique si l'attribut est obligatoirevisibility
: visibilité de l'attribut(W,R,H, ...)type
: type de l'attribut (text, date, int, ...)attributeValue.value
: valeur brute de l'attribut au moment du rendu
(la description n'est pas mise à jour lors de la modification de l'attribut)attributeValue.displayValue
: valeur affichée de l'attribut au moment du rendurenderOptions.description
: définition de la description
collapsed
: (bool) Valeur du paramètre $collapsedhtmlContent
: Valeur du paramètre $htmlContenthtmlTitle
: Valeur du paramètre $htmlTitleposition
: Valeur du paramètre $positionLes descriptions sont identifiables grâce à la classe dcpAttribute__description
.
La description d'un attribut donné peut être repéré en indiquant l'attribut HTML
data-attrid
sur la règle.
.dcpAttribute__description[data-attrid="tst_ban_etablissement"] { ... }
Modifier la couleur de fond pour toutes les descriptions :
.dcpAttribute__description { background-color:#F4FFBA; } /* Flèche vers la droite */ .dcpAttribute__description--left::after { border-left-color:#F4FFBA; } /* Flèche vers la gauche */ .dcpAttribute__description--right::after { border-right-color:#F4FFBA; } /* Flèche vers le bas */ .dcpAttribute__description--topLabel::after, .dcpAttribute__description--topValue::after, .dcpAttribute__description--top::after { border-top-color:#F4FFBA; } /* Flèche vers le haut */ .dcpAttribute__description--bottomLabel::after, .dcpAttribute__description--bottomValue::after, .dcpAttribute__description--bottom::after { border-bottom-color:#F4FFBA; }
Modifier la couleur de la bordure pour toutes les descriptions :
.dcpAttribute__description { border-color:#BFAF00; } /* Flèche vers la droite */ .dcpAttribute__description--left::before { border-left-color:#BFAF00; } /* Flèche vers la gauche */ .dcpAttribute__description--right::before { border-right-color:#BFAF00; } /* Flèche vers le bas */ .dcpAttribute__description--topLabel::before, .dcpAttribute__description--topValue::before, .dcpAttribute__description--top::before { border-top-color:#BFAF00; } /* Flèche vers le haut */ .dcpAttribute__description--bottomLabel::before, .dcpAttribute__description--bottomValue::before, .dcpAttribute__description--bottom::before { border-bottom-color:#BFAF00; }
Supprimer la flèche pour la description de l'attribut "tst_ban_etablissement" :
.dcpAttribute__description[data-attrid="tst_ban_etablissement"]::after, .dcpAttribute__description[data-attrid="tst_ban_etablissement"]::before { display:none; }
Modifier la hauteur maximale de la description longue :
.dcpAttribute__description__content { max-height: 10em; /* hauteur maximale à indiquer */ }
Affichage de descriptions dans diverses positions :
$displayPosition='<b style="float:right;color:orange;border:solid 1px orange;margin-left:2px">{{renderOptions.description.position}}</b>'; $options->text(myAttribute::tst_ban_agence)->setDescription( $displayPosition."<p>Nom et localisation de l'agence bancaire</p>", \Dcp\Ui\CommonRenderOptions::leftPosition); $options->text(myAttribute::tst_ban_etablissement)->setDescription( $displayPosition."<p>L'identifiant domestique du compte : code banque<p><b> (5 chiffres)</b>", \Dcp\Ui\CommonRenderOptions::topValuePosition); $options->text(myAttribute::tst_ban_guichet)->setDescription( $displayPosition."<p>Le code guichet de la banque<p><b> (5 chiffres)</b>", \Dcp\Ui\CommonRenderOptions::topLabelPosition); $options->text(myAttribute::tst_ban_numcompte)->setDescription( $displayPosition."<p>Numéro du compte bancaire<p><b> (11 chiffres ou lettres)</b>", \Dcp\Ui\CommonRenderOptions::bottomValuePosition); $options->text(myAttribute::tst_ban_clecompte)->setDescription( $displayPosition."<p>Clé du relevé d'identité bancaire<p><b> (2 chiffres)</b>", \Dcp\Ui\CommonRenderOptions::rightPosition); $options->text(myAttribute::tst_ban_iban)->setDescription( $displayPosition."<p>Le code IBAN <i>(International Bank Account Number)</i> représenté par une série de <b>27</b> chiffres et de lettres</p>", \Dcp\Ui\CommonRenderOptions::topPosition, "<p>Reprenant notamment (mais regroupés différemment) le code banque, le code guichet et le numéro de compte</p>", true); $options->text(myAttribute::tst_ban_bic)->setDescription( $displayPosition."<p>Le code BIC <i>(Business Identifier Code)</i> représenté par une série de <b>11 ou 8</b> lettres .</p>", \Dcp\Ui\CommonRenderOptions::bottomPosition);
Figure 13. Différentes options de placement de la description
Ajout d'information complémentaire au libellé. Dans cet exemple, le libellé n'est pas affiché (utilisation de setLabelPosition - nonePosition) mais il est utilisé dans la description qui est affiché au dessus de chaque attribut.
$originalLabel='<p><b>{{label}}</b></p>'; $options->text(myAttribute::tst_ban_agence)->setDescription( $originalLabel."<p>Nom et localisation de l'agence bancaire</p>", \Dcp\Ui\CommonRenderOptions::topPosition) ->setLabelPosition(\Dcp\Ui\CommonRenderOptions::nonePosition); $options->text(myAttribute::tst_ban_etablissement)->setDescription( $originalLabel."<p>L'identifiant domestique du compte : code banque <b> (5 chiffres)</b><p>", \Dcp\Ui\CommonRenderOptions::topPosition) ->setLabelPosition(\Dcp\Ui\CommonRenderOptions::nonePosition); $options->text(myAttribute::tst_ban_guichet)->setDescription( $originalLabel."<p>Le code guichet de la banque<b> (5 chiffres)</b><p>", \Dcp\Ui\CommonRenderOptions::topPosition) ->setLabelPosition(\Dcp\Ui\CommonRenderOptions::nonePosition); $options->text(myAttribute::tst_ban_numcompte)->setDescription( $originalLabel."<p>Numéro du compte bancaire<b> (11 chiffres ou lettres)</b><p>", \Dcp\Ui\CommonRenderOptions::topPosition) ->setLabelPosition(\Dcp\Ui\CommonRenderOptions::nonePosition); $options->text(myAttribute::tst_ban_clecompte)->setDescription( $originalLabel."<p>Clé du relevé d'identité bancaire <b> (2 chiffres)</b></p>", \Dcp\Ui\CommonRenderOptions::topPosition) ->setLabelPosition(\Dcp\Ui\CommonRenderOptions::nonePosition); $options->text(myAttribute::tst_ban_iban)->setDescription( $originalLabel."<p>Le code IBAN <i>(International Bank Account Number)</i> représenté par une série de <b>27</b> chiffres et de lettres</p>", \Dcp\Ui\CommonRenderOptions::topPosition, "<p>Reprenant notamment (mais regroupés différemment) le code banque, le code guichet et le numéro de compte</p>", true)->setLabelPosition(\Dcp\Ui\CommonRenderOptions::nonePosition); $options->text(myAttribute::tst_ban_bic)->setDescription( $originalLabel."<p>Le code BIC <i>(Business Identifier Code)</i> représenté par une série de <b>11 ou 8</b> lettres .</p>", \Dcp\Ui\CommonRenderOptions::topPosition) ->setLabelPosition(\Dcp\Ui\CommonRenderOptions::nonePosition);
Figure 14. Libellé enrichi avec la description
Le même exemple avec de la css pour personnaliser l'aspect :
/* Positionnement 2 colonnes pour les attributs du cadre tst_f_dombancaire */ .dcpFrame__content[data-attrid="tst_f_dombancaire"] .dcpAttribute { float: left; display: inline-block; min-height: 34px; width: calc(50% - 1em); margin-left: 0.5em; margin-right: 0.5em; } /* Colorisation des descriptions d'attributs */ .dcpAttribute__description[data-attrid="tst_ban_agence"] { background-color: rgba(0, 128, 50, 0.2); border-color: #02bf54; background: linear-gradient(to right, #c9de96 0%,#8ab66b 44%, #47bc43 100%); } .dcpAttribute__description[data-attrid="tst_ban_etablissement"], .dcpAttribute__description[data-attrid="tst_ban_guichet"], .dcpAttribute__description[data-attrid="tst_ban_numcompte"], .dcpAttribute__description[data-attrid="tst_ban_clecompte"] { background-color: rgba(15, 61, 128, 0.2); border-color: #0062bf; background: linear-gradient(to right, #e4f5fc 0%,#bfe8f9 34%,#2ab0ed 71%,#9fd8ef 100%); } .dcpAttribute__description[data-attrid="tst_ban_iban"], .dcpAttribute__description[data-attrid="tst_ban_bic"] { background-color: rgba(128, 63, 13, 0.2); border-color: #bf7410; background: linear-gradient(to right, #fceabb 0%,#fccd4d 37%,#f8b500 70%,#fbdf93 100%); } /* Alignement des descriptions pour le mode 2 colonnes */ .dcpFrame[data-attrid="tst_f_dombancaire"] .dcpAttribute__description { min-height:6em; } /* Suppression de la flêche pour les description du cadre tst_f_dombancaire */ .dcpFrame[data-attrid="tst_f_dombancaire"] .dcpAttribute__description::after, .dcpFrame[data-attrid="tst_f_dombancaire"] .dcpAttribute__description::before { display:none; }
Figure 15. Libellé enrichi avec css
Cette option permet d'associer un document d'aide avec un attribut.
Dcp\Ui\CommonRenderOptions setLinkHelp(string|int $documentIdentifier)
Un document d'aide est un document de la famille HELPPAGE
. Ce document permet de
fournir des descriptions statiques sur les attributs. À la différence de l'option
setDescription
, cette option va afficher un lien
(indiqué par l'icone ) vers un
document d'aide complet lié à la famille et non une description contextuelle.
Ce lien va afficher le document d'aide dans une fenêtre de dialogue en pointant vers le paragraphe lié à l'attribut.
Dans le rendu d'édition par défaut (classe
Dcp\Ui\DefaultEdit
), tous les attributs définis dans le document d'aide
associé à la famille ont cette option.
Dans les rendus de consultation (classe Dcp\Ui\DefaultView
) et d'édition par
défaut un menu " Aide"
est ajouté. Ce menu ouvre le document d'aide dans une fenêtre de dialogue.
Dans ces 2 classes de rendu, le document d'aide est fourni par la méthode :
protected function getDefaultHelpPageDocument(\Doc $document)
Cette méthode retourne le document de la famille HELPPAGE
qui est associé avec
la famille du document. Elle ne recherche pas une aide parmi les familles
parentes si le document d'aide liés exactement à la famille n'existe pas. S'il y
a plusieurs documents d'aide c'est le premier, ordonné par titre, qui est
retourné.
Cette méthode peut être surchargée, dans la classe de rendu, pour utiliser un autre document d'aide ou pour simplement ne pas afficher l'aide par défaut.
Aucunes.
L'argument $documentIdentifier
indique l'identifiant du document d'aide à
ouvrir. Cet identifiant doit indiquer un document de la famille "HELP".
La méthode retourne une exception si l'identifiant ne correspond pas à un
document de la famille HELPPAGE
.
Aucun
Lier l'attribut "my_attribute" avec le document d'aide qui a le nom logique "MY_SPECIAL_HELP".
$options->text("my_attribute")->setLinkHelp("MY_SPECIAL_HELP");
Utilisation du dernier document d'aide créé.
namespace My; class MyViewRender extends \Dcp\Ui\DefaultView { protected function getDefaultHelpPageDocument(\Doc $document) { $s = new \SearchDoc("", "HELPPAGE"); // Filtre sur les aides liés à la famille du document $s->addFilter("help_family='%d'", $document->fromid); $s->setOrder("id desc"); // L'id indique l'ordre de création $s->setSlice(1); $s->setObjectReturn(); $helps = $s->search(); if (count($helps) > 0) { return $helps->getNextDoc(); } return null; } }
Cette option indique si le bouton de suppression doit être affiché ou non.
Dcp\Ui\CommonRenderOptions displayDeleteButton(bool $display)
array
, frame
et tab
.L'argument $display
indique si le bouton de suppression doit être affiché.
Le bouton de suppression est affiché par défaut.
Aucun
$options->text("my_attribute")->displayDeleteButton(false);
Cette option indique un texte à afficher lorsque le champ de l'attribut à saisir
a le focus. Le tooltip n'est pas affiché au survol (hover
), mais lorsque le
champ de saisie obtient le focus.
Dcp\Ui\CommonRenderOptions setInputTooltip(string $htmlText)
array
, frame
et tab
.L'argument htmlText
est un fragment HTML qui sera utilisé
pour le texte du tooltip.
Aucun
La couleur de ce tooltip est surchargeable à l'aide des règles css suivantes :
Exemple tooltip écrit en noir sur fond jaune pour le cadre "my_frame"
.dcpFrame__content[data-attrid=my_frame] .tooltip.dcpAttribute__editlabel .tooltip-inner { background-color: #f7f942; /* Yellow */ color: #000000; } .dcpFrame__content[data-attrid=my_frame] .tooltip.dcpAttribute__editlabel.tooltip.top .tooltip-arrow { border-top-color: #f7f942; } .dcpFrame__content[data-attrid=my_frame] .tooltip.dcpAttribute__editlabel.tooltip.bottom .tooltip-arrow { border-bottom-color: #f7f942; }
Cette option permet d'afficher un tooltip lorsque la souris passe au dessus du bouton de déclenchement de l'aide à la saisie. Par défaut aucun tooltip n'est affiché.
Dcp\Ui\CommonRenderOptions setAutoCompleteHtmlLabel(string $htmlText)
L'argument htmlText
est un fragment HTML qui sera utilisé pour le texte du
tooltip.
Aucun
$options->text(My_family::my_workpostalcode) {{Hello>setAutoCompleteHtmlLabel("Choisissez un code postal du <b>Gers</b>");
La couleur de ce tooltip est surchargeable à l'aide des règles css suivantes :
Exemple tooltip écrit en noir sur fond jaune pour le cadre "my_frame"
.dcpFrame__content[data-attrid=my_frame] .tooltip.dcpAttribute__autocomplete .tooltip-inner { background-color: #f7f942; /* Yellow */ color: #000000; } .dcpFrame__content[data-attrid=my_frame] .tooltip.dcpAttribute__autocomplete.tooltip.top .tooltip-arrow { border-top-color: #f7f942; } .dcpFrame__content[data-attrid=my_frame] .tooltip.dcpAttribute__autocomplete.tooltip.bottom .tooltip-arrow { border-bottom-color: #f7f942; }
Cette option ajoute un bouton à droite de la valeur.
En mode édition il est placé à gauche du bouton de suppression.
En mode consultation, il est placé à l'extrémité droite de la valeur.
Dcp\Ui\CommonRenderOptions addButton(Dcp\Ui\ButtonOptions $buttonOptions)
array
, frame
et tab
.L'argument en entrée est un objet de type Dcp\Ui\ButtonOptions
qui configure
les différents paramètres du bouton.
target
_dialog
, une fenêtre de dialogue interne sera utilisée.
Dans ce cas, les options suivantes sont prises en compte :
windowHeight
: Hauteur de la fenêtre de dialogue
La dimension doit être une dimension css valable
(c'est à dire un nombre suivi immédiatement de son unité).
windowWidth
: Largeur de la fenêtre de dialogue
La dimension doit être une dimension css valable
(c'est à dire un nombre suivi immédiatement de son unité).
windowTitle
: Titre de la fenêtre de dialogue. Si cet argument est vide alors le titre de la page ciblée est utilisé si son
accès est autorisé (même domaine).
Le titre est composé dynamiquement et les variables {{value}}
et {{displayValue}}
peuvent être utilisées.title
{{value}}
et {{displayValue}}
)
peuvent être utilisées.url
{{value}}
et {{displayValue}}
)
peuvent être utilisées.
Ces valeurs sont encodées (au moyen de la fonction
encodeUriComponent
).htmlContent
{{value}}
et {{displayValue}}
)
peuvent être utilisées.class
Pour les attributs "multiple" (type docid
, account
et enum
), les variables
de valeurs d'attribut sont des tableaux. Ils doivent être adressés en Mustache
par des répétables.
Exemple :
`<b>Voici les valeurs : <ul>{{#.}}<li>{{displayValue}}</li>{{/.}}</ul></b>`
$buttonConfig = new ButtonOptions(); $buttonConfig->url = "?app=MYAPP&action=MY_SENDRESPONSE&myto={{value}}"; $buttonConfig->title = "Send a mail to response"; $buttonConfig->class = "myClass"; $buttonConfig->target = "_dialog"; $buttonConfig->htmlContent = "<b>Send it</b>"; $options->text("my_mail")->addButton($buttonConfig);
Afficher un bouton sur une relation pour avoir un aperçu du document.
$viewDoc=new \Dcp\Ui\ButtonOptions(); $viewDoc->htmlContent='<i class="fa fa-eye"></i>'; $viewDoc->url=sprintf("api/v1/documents/{{value}}.html" ); $viewDoc->target="_dialog"; $viewDoc->windowWidth="400px"; $options->docid("my_relation")->addButton($viewDoc);
Permet de définir le template à utiliser pour afficher la valeur de l'attribut.
Ce template ne s'applique qu'à la valeur et pas au label.
Le label peut être effacé si nécessaire avec l'option de rendu setLabelPosition
.
Dcp\Ui\CommonRenderOptions setTemplate(string $htmlText array $extraKeys = array()) )
En consultation, le template n'est pas appliqué si la valeur est vide. Dans ce cas, c'est l'option showEmptyContent qui est appliquée.
Si un des templates ajoutés n'existe pas alors l'exception suivante est déclenchée à l'exécution :
UI0004 = 'Render template file not found : %s'
L'argument $htmlText
est un template Mustache.
L'argument $extraKeys
est un tableau de clés additionnelles.
Exemple :
$options->frame("my_frame")->setTemplate('<div class="my">{{{attributes.my_firstattr.htmlContent}}}</div>'); $options->text("my_text")->setLabelPosition("none"); $options->text("my_text")->setTemplate( '<div class="my">{{attributes.my_text.label}}/{{attributes.my_text.id}}'. ' {{attributes.my_text.attributeValue.value}}</div>'); // récupération du modèle dans un fichier (chemin relatif au répertoire d'installation) $options->text("my_info")->setTemplate(file_get_contents("MYAPP/Templates/myInfo.mustache"));
Applicable à tous les types, y compris "array", même si ce dernier offre d'autres possibilités dans la déclaration d'un template spécifique comme cela est décrit dans les chapitres suivants.
La visibilité est applicable au contenu donc à l'ensemble du template d'attribut.
Le template est un template Mustache.
Clef | Signification |
---|---|
{{properties.id}} | Identifiant du document |
{{properties.name}} | Nom logique du document |
{{properties.initid}} | Identifiant de la lignée du document |
{{properties.icon}} | Url de l'icône du document |
{{properties.title}} | Titre du document |
{{properties.family.title}} | Titre de la famille du document |
{{properties.family.id}} | Identifiant de la famille du document |
{{properties.family.icon}} | Icône de la famille du document |
{{properties.isReadMode}} | (booléen) Indique si le rendu de document est en mode consultation |
{{properties.isWriteMode}} | (booléen) Indique si le rendu de document est en mode modification |
{{attributes.attrid .label}} |
Libellé de l'attribut attrid
|
{{attributes.attrid .attributeValue.value}} |
Valeur brute de l'attribut attrid
|
{{attributes.attrid .attributeValue.displayValue}} |
Valeur affichable de l'attribut attrid
|
{{attributes.attrid .attributeValue.[y]}} |
Information de content supplémentaire suivant le type d'attribut |
{{attributes.attrid .label}} |
Libellé de l'attribut attrid
|
{{attributes.attrid .isReadMode}} |
Valeur booléenne indiquant que le mode d'affichage de l'attribut est la consultation |
{{attributes.attrid .isWriteMode}} |
Valeur booléenne indiquant que le mode d'affichage de l'attribut est la modification |
{{attributes.attrid .isEmpty}} |
Valeur booléenne indiquant que l'attribut a une valeur vide (chaîne vide ou "null", tableau vide pour les multiples). 0 n'est pas considéré comme vide. Pour les structures, isEmpty est vrai si tous ses éléments sont vides aussi. |
{{attributes.attrid .renderOptions}} |
Paramètres de rendu comme par exemple "labelPosition" ou "showEmptyContent" |
{{{attributes.attrid .htmlContent}}} |
Fragment html interne correspondant à l'attribut x (fonction de la visibilité et du mode de rendu) |
{{{attributes.attrid .htmlView}}} |
Fragment html interne correspondant label + content (non applicable au type tab ni aux attributs contenu dans un tableau) |
{{{attributes.attrid .htmlDefaultContent}}} |
Idem htmlContent sauf que dans ce cas, si l'attribut a lui-même un template spécifique alors il ne sera pas pris en compte |
{{{attributes.attrid .htmlDefaultView}}} |
Idem htmlView sauf que dans ce cas, si l'attribut a lui-même un template spécifique alors il ne sera pas pris en compte |
{{attribute.label}} | Label de l'attribut courant |
{{attribute.attributeValue.value}} | Valeur brute de l'attribut courant (uniquement pour les attributs non structurant) |
{{attribute.attributeValue.displayValue}} | Valeur affichable de l'attribut courant |
{{attribute.attributeValue.[y]}} | Information de content supplémentaire: suivant le type d'attribut |
{{attribute.renderOptions}} | Paramètres de rendu de l'attribut comme par exemple "labelPosition" ou "showEmptyContent" |
{{{attribute.htmlContent}}} | Fragment html interne de l'attribut courant (contenu seulement sans le label) |
{{{attribute.htmlView}}} | Fragment html interne de l'attribut courant (label + content) (non applicable au type tab ) |
{{{attribute.htmlDefaultContent}}} | Idem htmlContent sauf que dans ce cas, si l'attribut a lui-même un template spécifique alors il ne sera pas pris en compte |
{{{attribute.htmlDefaultView}}} | Idem htmlView sauf que dans ce cas, si l'attribut a lui-même un template spécifique alors il ne sera pas pris en compte |
{{attribute.id}} | Identifiant de l'attribut courant |
{{attribute.isReadMode}} | Valeur booléenne indiquant que le mode est la consultation (Utilisable pour avoir un template conditionnel en fonction du mode) |
{{attribute.isWriteMode}} | Valeur booléenne indiquant que le mode d'affichage de l'attribut est la modification |
{{attribute.isEmpty}} | Valeur booléenne indiquant que l'attribut a une valeur vide. Ne peux pas être utilisé en consultation car si la valeur est vide, l'attribut n'est pas affiché (Voir showEmptyContent) |
Pour les attributs multiples, la valeur de attribute.attributeValue
ou
attributes.<attrid>.attributeValue
est un tableau de valeur.
Exemple pour ajouter une <div>
autour d'un attribut :
$options->account(MyFamily::my_text)->setTemplate( '<div style="outline:solid 1px red;padding:5px;"> {{{attribute.htmlDefaultView}}} </div>');
On notera dans cet exemple, l'utilisation de htmlDefaultView
et non htmlView
afin d'indiquer explicitement qu'on utilise pas
notre propre template personnalisé.
Exemple de modèle pour un attribut de type account
multiple
$options->account(MyFamily::my_account_multiple)->setTemplate( '<div style="border:solid 1px grey;padding:5px;"> <ol> {{#attribute.attributeValue}} <li><img src="{{icon}}"> {{displayValue}}</li> {{/attribute.attributeValue}} </ol> </div>');
Si l'attribut a modifier est dans un tableau alors
les clefs en attributes.<attrid>.*
sont restreintes au seul attrid de l'attribut courant.
Il n'est donc pas possible dans ce cas de représenter un autre attribut que l'attribut courant.
Les clefs supplémentaires suivantes sont disponibles pour les tableaux.
Clef | Signification |
---|---|
{{attributes.<arrayAttrid> .rows}} |
Liste des lignes de tableaux ("arrayAttrid" est un attribut de type tableau) |
{{content.<attrid> .label}} |
Label de l'attribut "attrid" (élément de rows) |
{{{content.<attrid> .htmlContent}}} |
Fragment html interne de la cellule y (élément de "rows") . |
{{content.<attrid> .attributeValue.value}} |
Valeur brute (élément de "rows") |
{{content.<attrid> .attributeValue.displayValue}} |
Valeur affichable (élément de "rows") |
{{content.<attrid> .attributeValue.[z ]}} |
Information de content supplémentaire suivant le type d'attribut (élément de "rows") |
... | |
{{attribute.rows}} | Liste des lignes du tableau courant |
{{index}} | Numéro de la rangée (élément de "rows") |
Le template de tableau doit contenir une balise table
avec la classe
dcpArray__table
pour indiquer le container qui sera utilisé pour représenter l'attribut.
Les classes de styles et les attributs nécessaires au fonctionnement du widget de tableau seront ajoutés au modèle pour disposer d'un comportement et d'un aspect similaire au tableau original.
Exemple de modèle de tableau :
<table class="dcpArray__table"> <thead> <tr> <th class="special">Identification</th> <th>Deuxième et troisième cellules</th> </tr> </thead> <tbody> {{#attribute.rows}} <tr> <td> <b>{{content.my_firstcell.label}}</b> <br/> {{{content.my_firstcell.htmlContent}}} </td> <td> {{{content.my_secondcell.htmlContent}}} <br/> {{{content.my_thirdcell.htmlContent}}} </td> </tr> {{/attribute.rows}} </tbody> </table>
Si le modèle de tableau n'est pas une balise table
, il est nécessaire de
préciser la classe dcpArray__content__line
dans l'élement qui sera considéré
comme la rangée (tr
).
Exemple de modèle de tableau contenant un attribut image (my_photo
) et un
attribut relation (my_species
) avec des balises div
:
<div class="dcpArray__table"> {{#attribute.rows}} <div class="dcpArray__content__line"> {{#content.my_photo.attributeValue.value}} <img class="my__photo" src="api/v1/documents/{{properties.id}}/images/my_photo/{{index}}/sizes/60x60c.png" /> {{/content.my_photo.attributeValue.value}} {{^content.my_photo.attributeValue.value}} <img class="my__nophoto" src="api/v1/images/assets/sizes/60x60c/zoo_nophoto.png" /> {{/content.my_photo.attributeValue.value}} <div>{{{content.my_species.htmlContent}}} </div> </div> {{/attribute.rows}} </div>
En mode "modification", le modèle général de tableau n'affiche pas les boutons pour supprimer, sélectionner et ajouter des lignes.
Pour placer ces éléments d'interface il faut les insérer explicitement dans le modèle.
<table class="dcpArray__table"> <thead> <tr> {{#attribute.toolsEnabled}}<th>Outils</th>{{/attribute.toolsEnabled}} <th class="special"> Identification </th> <th> Deuxième et troisième cellules </th> </tr> </thead> <tbody> {{#attribute.rows}} <tr> {{#attribute.toolsEnabled}}<td>{{{rowTools}}}</td>{{/attribute.toolsEnabled}} <td> <b>{{content.my_firstcell.label}}</b> <br/> {{content.my_firstcell.htmlContent}} </td> <td> {{content.my_secondcell.htmlContent}} <br/> {{content.my_thirdcell.htmlContent}} </td> </tr> {{/attribute.rows}} </tbody> </table> <div> {{{attribute.tableTools}}} </div>
Clef | Signification |
---|---|
{{rowTools}} | Boutons de gestion de la rangée de tableau (élément de rows) |
{{attributes.attrid .tableTools}} |
Boutons de gestion du tableau attrid (contient le boutons d'ajout et de duplication) |
{{attributes.attrid .toolsEnabled}} |
Booléen indiquant que le tableau peut être modifié (ajout, suppression, déplacement de lignes) |
: Pour avoir un même modèle de
tableau en consultation et en modification,
il est possible d'afficher les boutons suivant la variable
{{attribute.toolsEnabled}}
.
Les modèles de tableau pour les
formulaires doivent être basés sur des tableaux (balise table
) HTML.
Les attributs qui sont dans un tableau disposent des mêmes possibilités que les
modèles classiques. La différence se situe au niveau de la clef
{{attribute.attributeValue}}
. Cette clef retourne la valeur de l'attribut en
fonction de la rangée du tableau et non un tableau de valeurs.
Note : Pour les attributs "multiple" dans un tableau, la valeur est un tableau qui contient la liste de valeurs de l'attribut pour la rangée.
En plus des clefs prédéfinies des clefs supplémentaires peuvent être fournies pour le modèle.
$options->docid(MyFamily::my_relation)->setTemplate( "<div style=\"border:inset 3px orange\">{{{Hello}}}<h1>{{attribute.id}}</h1> {{{attribute.htmlContent}}}</div>", array("Hello"=>"<h1>World</h1>") );
Ces clefs sont des variables Mustache, elles peuvent aussi être utilisées dans
un itérateur (valeur de type array
) ou pour une condition.
$options->docid()->setTemplate("<div>{{{Hello}}}<ol>{{#NumberList}}<li>{{Number}}</li>{{/NumberList}}</ol> <h1>{{attribute.id}} / {{attribute.label}}</h1> {{{attribute.htmlContent}}}</div>", array("Hello"=>"<h1>World</h1>", "NumberList"=>array(array("Number"=>"One"), array("Number"=>"Two"), array("Number"=>"Three"))) );
Pour ajouter des clefs dans les rangées d'un tableau, il faut utiliser "attributes.rows".
Exemple d'utilisation des clefs pour renseigner la composition de la dernière colonne d'un tableau.
$options->arrayAttribute("zoo_array_dates")->setTemplate(' <table class="dcpArray__table"" rules="all" style="border:solid 3px orange; "> <thead> <tr> <th class="special dcpArray__head__cell"> Identification : {{attributes.zoo_date_array.label}} </th> {{#attribute.isWriteMode}} <th class="dcpArray__head__cell"> Tools </th> {{/attribute.isWriteMode}} <th class="dcpArray__head__cell"> Deuxième et troisième cellules </th> <th class="dcpArray__head__cell"> Extra custom {{customTitle}} </th> </tr> </thead> <tbody> {{#attribute.rows}} <tr> <td> <b>{{content.zoo_date_array.label}}</b> <br/> {{{content.zoo_date_array.htmlContent}}} </td> {{#attribute.isWriteMode}} <td> {{{rowTools}}} <br/> THE TOOLS IN THE MIDDLE </td> {{/attribute.isWriteMode}} <td> {{{content.zoo_time_array.htmlContent}}} <br/> {{{content.zoo_timestamp_array.htmlContent}}} </td> <td> {{custom.foo}}/{{custom.bar}}/{{customTitle}} </td> </tr> {{/attribute.rows}} </tbody> </table> <div style="border:solid 2px green; font-size:200%"> The table tools {{#attribute.isWriteMode}} {{{attribute.tableTools}}} {{/attribute.isWriteMode}} </div> ', array( "customTitle" => "Titre personnalisé", "attribute" => array( "rows" => array( "custom" => array( array( "foo" => "One", "bar" => "Uno" ) , array( "foo" => "Two", "bar" => "Duo" ) , array( "foo" => "Three", "bar" => "Trio" ) , ) ) ) ));
Configuration des différents textes utilisés dans les interfaces des attributs. Ces textes sont par défaut configurés et sont modifiés suivant la locale de l'utilisateur connecté.
Dcp\Ui\CommonRenderOptions setTranslations(array $labels)
Les textes à traduire sont fonction des types d'attributs.
Les labels suivants sont communs à tous les types :
Suivant les types d'autres textes peuvent être traduits :
L'argument $labels
est un tableau php contenant chacun des labels défini par sa clé.
$options->commonOption("my_attribute")->setTranslations( array( "closeErrorMessage"=>___("Close error message","my"), "deleteLabel"=>___("Remove attribute value","my") ) );
Modification du widget utilisé pour rendre l'attribut
Dcp\Ui\CommonRenderOptions setCustomWidgetAttributeFunction(string $widgetFunctionName)
Le nom du widget doit être le nom d'un widget héritant de $.dcp.dcpAttribut
qui est
ajouté dans le contexte d'exécution du document avant le rendu du widget.
L'argument $widgetFunctionName
est un nom de widget jquery ui héritant de $.dcp.dcpAttribut
.
Aucun.
Cet exemple associe le widget myCustomAttribute
à l'attribut my_attribute
.
Déclaration de l'option dans le options de rendu :
/** * L'attribut `my_attribute` utilisera le widget `myCustomAttribute`. */ public function getOptions(\Doc $document) { $options = parent::getOptions($document); $options->text("my_attribute")->setCustomWidgetAttributeFunction("myCustomAttribute"); return $options; } /** * Ajout du fichier JS contenant le code du nouveau widget */ public function getJsReferences(\Doc $document = null) { $js = parent::getJsReferences(); $js["myWidget"] = "MY/Layout/myWidget.js"; return $js; }
Fichier "myWidget.js" de définition d'un nouveau widget d'attribut.
$.widget("myproject.myCustomAttribute",$.dcp.dcpAttribute, { /** * Init the dom of the attribute * @private */ _initDom: function () { this._super(); if(this.getMode() === "write"){ //Add code for write representation of the attribute } else{ //Add code for consult representation of the attribute } }, /** * Init the event of the attribute * @private */ _initEvent: function () { //Add the custom event of the attribute this._super(); }, /** * Modify value to widget and send notification to the view * @param value */ setValue: function wDcpViewTreeSetValue(objValue) { this._super(objValue); //Add code for the modification of the value of the attribute }, /** * Return the value stored in the wiget * * @returns {*|number|.options.attributeValue} */ getValue: function wDcpViewTreeGetValue() { let value = this._super(); //Add code for the consultation of the value of the attribute return value; }, getType: function wDcpViewTreegetType() { //return the type of the attribute return "myAttribute"; } });
Autre exemple :
$options->htmltext()->setCustomWidgetAttributeFunction("dcpText");
Dans ce cas, tous les attributs de type htmltext
sont rendus comme des attributs de type text
.
Le résultat est que la valeur brute (texte avec les balises html) apparaitra à la place du texte formaté.
Le type account
bénéficie des options de représentation de l'attribut de type docid
.
Aucune méthode spécifique n'est disponible pour l'attribut account
.
Les options de représentation indiquées dans la structure de la famille ne sont pas prises en compte dans les interfaces HTML5.
Cette option indique que le nombre de rangées d'un tableau doit être affiché lorsqu'il est supérieur à un certain seuil.
Par défaut, le nombre de rangée n'est pas affiché.
Dcp\Ui\ArrayRenderOptions setRowCountThreshold(int $number)
Aucune
Si L'argument number
est :
0
, alors le nombre de rangées est affiché systématiquement.Aucun
Affichage du nombre à partir de 10 rangées.
$options->arrayAttribute(My_family::my_definition)->setRowCountThreshold(10);
Cette option permet d'inhiber la possibilité d'ajouter une rangée dans un tableau.
À proprement parler, cette options supprime le bouton d'ajout de ligne, mais n'empêche pas l'ajout de rangées par programmation.
Dcp\Ui\ArrayRenderOptions disableRowAdd(bool $disable)
l'argument $disable
indique si le bouton d'ajout de ligne doit être masqué.
Aucun
Inhiber l'ajout dans le tableau "my_definition".
$options->arrayAttribute(My_family::my_definition)->disableRowAdd(true);
Cette option permet d'inhiber la possibilité de supprimer une rangée dans un tableau.
À proprement parler, cette options supprime le bouton de suppression de ligne, mais n'empêche pas la suppression de rangées par programmation.
Dcp\Ui\ArrayRenderOptions disableRowDel(bool $disable)
l'argument $disable
indique si le bouton de suppression de ligne doit être masqué.
Aucun
Inhiber la suppression de rangée dans le tableau "my_definition".
$options->arrayAttribute(My_family::my_definition)->disableRowDel(true);
Cette option permet d'inhiber la possibilité de déplacer une rangée dans un tableau.
À proprement parler, cette options supprime le bouton permettant de déplacer une ligne, mais n'empêche pas le déplacement d'une rangée par programmation. [php] Dcp\Ui\ArrayRenderOptions disableRowMove(bool $disable)
l'argument $disable
indique si le bouton de déplacement de ligne doit être masqué.
Aucun
Inhiber le déplacement de rangée dans le tableau "my_definition".
$options->arrayAttribute(My_family::my_definition)->disableRowMove(true);
Cette option permet d'indiquer le nombre minimum de rangées pour un tableau.
Si le tableau a moins de rangées que le minimum indiqué, des rangées sont ajoutées jusqu'à cette limite lors du rendu du tableau. Les rangées ajoutées contiennent les valeurs par défaut des colonnes du tableau.
Le bouton de suppression de rangée est inhibé si la limite est atteinte.
Dcp\Ui\ArrayRenderOptions setRowMinLimit(int $limit)
l'argument $limit
indique le nombre en dessous duquel le tableau sera
automatiquement complété et le bouton de suppression de ligne désactivé.
Si la limite est négative ou zéro aucune limite n'est définie.
Cette option n'empêche pas supprimer des rangées par programmation. Elle empêche simplement les interactions utilisateur afin de ne pas supprimer des rangées si le seuil est atteint.
Le tableau "my_definition" doit avoir 5 rangées minimum.
$options->arrayAttribute(My_family::my_definition)->setRowMinLimit(5);
Cette option permet d'indiquer le nombre maximum de rangées pour un tableau.
Le bouton d'ajout de rangée est inhibé si la limite est atteinte.
Dcp\Ui\ArrayRenderOptions setRowMaxLimit(int $limit)
l'argument $limit
indique le nombre au-dessus duquel le bouton d'ajout de
rangée sera désactivé.
Cette option n'empêche pas d'ajouter des lignes au dela du seuil par programmation. Elle contrôle juste l'interaction de bouton qui permets d'ajouter les rangées.
Si le tableau initial a plus de rangées que le seuil indiqué, les lignes au delà du seuil ne sont pas supprimées. Le bouton "ajouter" est juste désactivé.
Le tableau peut avoir 10 rangées maximum dans le tableau "my_definition".
$options->arrayAttribute(My_family::my_definition)->setRowMaxLimit(10);
Cette option permet d'indiquer le nombre minimum de rangées à afficher lors de l'édition d'un tableau.
Si le tableau a moins de rangées que le minimum indiqué, des rangées sont ajoutées jusqu'à cette limite lors du rendu du tableau. Les rangées ajoutées contiennent les valeurs par défaut des colonnes du tableau.
Dcp\Ui\ArrayRenderOptions setRowMinDefault(int $default)
l'argument $default
indique le nombre en dessous duquel le tableau sera
automatiquement complété.
Si la limite est négative ou zéro aucune limite n'est définie.
Cette option n'empêche pas la suppression des rangées par l'interface.
Le tableau "my_definition" affiche toujours au moins la première rangée.
$options->arrayAttribute(My_family::my_definition)->setRowMinDefault(1);
Cette option est une option commune qui permet d'afficher une description pour un tableau.
Son usage est le même mais le positionnement de la description est propre au type "tableau".
Dcp\Ui\CommonRenderOptions::topLabelPosition
:Dcp\Ui\CommonRenderOptions::topPosition
: Texte affiché dans l'entête de tableau. Affiché au dessus du libellé
Figure 16. Placement "top" ou "topLabel"
Dcp\Ui\CommonRenderOptions::bottomLabelPosition
:
Dcp\Ui\CommonRenderOptions::bottomPosition
:Texte affiché dans l'entête de tableau. Affiché au dessous du libellé
Figure 17. Placement "bottom" ou "bottomLabel"
Dcp\Ui\CommonRenderOptions::rightPosition
:
Dcp\Ui\CommonRenderOptions::leftPosition
: Position non prise en compte.
Ce positionnement n'est pas possible pour les colonnes de tableaux.
Une erreur est affichée sur la console du navigateur dans ce cas. La description
n'est pas affichée.
Dcp\Ui\CommonRenderOptions::topValuePosition
: Texte affiché au dessus de la valeur de l'attribut
dans chaque rangée du tableau.
Figure 18. Placement "topValue"
Dcp\Ui\CommonRenderOptions::bottomValuePosition
: Texte affiché au dessous de la valeur de l'attribut
dans chaque rangée du tableau.
Figure 19. Placement "bottomValue"
Dcp\Ui\CommonRenderOptions::clickPosition
: Affiche une ancre
à gauche du libellé dans l'entête du tableau. Cette ancre
affiche la description lorsque l'utilisateur clique dessus.
Figure 20. Placement "click"
Dcp\Ui\CommonRenderOptions::topPosition
: Texte affiché dans l'entête de tableau. Affiché au dessus du libellé
Figure 21. Placement "top"
Dcp\Ui\CommonRenderOptions::bottomPosition
:Texte affiché dans l'entête de tableau. Affiché au dessous du libellé
Figure 22. Placement "bottom"
Dcp\Ui\CommonRenderOptions::rightPosition
:
Dcp\Ui\CommonRenderOptions::leftPosition
: Position non prise en compte.
Ces positionnements ne sont pas possibles pour les tableaux.
Une erreur est affichée sur la console du navigateur dans ce cas. La description
n'est pas affichée.
Dcp\Ui\CommonRenderOptions::topLabelPosition
: Texte affiché dans l'entête de tableau.
Affiché au dessus du libellé.
Figure 23. Placement "bottom"
Dcp\Ui\CommonRenderOptions::topValuePosition
: Texte affiché au dessus de la valeur de l'attribut
dans chaque rangée du tableau.
Figure 24. Placement "topValue"
Dcp\Ui\CommonRenderOptions::bottomLabelPosition
: Texte affiché au dessous de la valeur de l'attribut
dans chaque rangée du tableau.
Figure 25. Placement "bottomValue"
Dcp\Ui\CommonRenderOptions::bottomValuePosition
: Texte affiché au dessous de la valeur de l'attribut
dans chaque rangée du tableau.
Figure 26. Placement "bottomValue"
Dcp\Ui\CommonRenderOptions::clickPosition
: Affiche une ancre
à gauche du libellé dans l'entête du tableau. Cette ancre
affiche la description lorsque l'utilisateur clique dessus.
Figure 27. Placement "click"
Cette option permet d'indiquer les règles d'affichage des tableaux en fonction de la taille de la fenêtre.
Dcp\Ui\ArrayRenderOptions setResponsiveBreakpoints( string $transposition=self::transpositionRule, string $labelUp=self::upRule );
$labelUp
n'est interprété que si l'option labelPosition est à auto
.L'argument $transposition
indique au moyen d'une media query dans quelles conditions le
tableau doit être transposé : le tableau est transposé si la query est vraie.
Par défaut, $transposition
a la valeur :
@media only screen and (max-width: 768px), (min-device-width : 768px) and (max-device-width : 1024px) and (orientation : portrait)
Ce qui veut dire que le tableau est transposé si :
Figure 28. Tableau transposé
L'argument $labelUp
indique au moyen d'une media query dans quelles conditions le libellé
doit être en position up
: le libellé est up
si la query est vraie.
Par défaut, $labelUp
a la valeur @media (max-width: 1280px)
, ce qui signifie que le label est au-dessus si la
largeur est inférieure à 1280px.
Figure 29. Libellé à gauche
Figure 30. Libellé au dessus
Aucun
Le tableau "my_definition" est transposé si la taille de la fenêtre est inférieur ou égal à 600px
$options->arrayAttribute(My_family::my_definition) ->setResponsiveBreakpoints("@media (max-width: 600px)");
Le tableau "my_definition" n'est jamais transposé
$options->arrayAttribute(My_family::my_definition) ->setResponsiveBreakpoints("@media (max-width: 0px)");
Le label du tableau est toujours en haut.
$options->arrayAttribute(My_family::my_definition) ->setLabelPosition(\Dcp\Ui\CommonRenderOptions::upPosition);
Dans ce cas, il est inutile de modifier les breakPoints.
Le label du tableau est à gauche lorsque la largeur de la fenêtre est supérieur à 600px.
$options->arrayAttribute(My_family::my_definition)->setResponsiveBreakpoints( //Utilisation de la valeur par défaut pour la règle de transposition \Dcp\Ui\ArrayRenderOptions::transpositionRule, "@media (max-width: 600px)" );
Les options de représentation indiquées dans la structure de la famille ne sont pas prises en compte dans les interfaces HTML5.
Le widget de sélection de couleur est basé sur un widget Kendo Ui Color Picker
.
Cette option permet de configurer l'aspect du widget de couleur.
Dcp\Ui\ColorRenderOptions setKendoColorConfiguration(array $config)
L'argument config
est un tableau de valeurs indexées qui servent à modifier la configuration du widget.
Les valeurs possibles sont les propriétés de configuration du widget kendo ui
.
Aucun
Choix d'une palette de deux couleurs.
$options->color(myFamily::my_choice)->setKendoColorConfiguration([ "palette" => ["#457fe2", "#e50054"], "tileSize" => [ "width"=>100, "height"=>50 ] ]);
Les options de représentation indiquées dans la structure de la famille ne sont pas prises en compte dans les interfaces HTML5.
Le widget d'édition des date est basé sur un widget kendo UI Date Picker
.
Attention : Les options propres à Kendo ne sont pas maintenues par Anakeen et leur bon fonctionnement n'est pas garanti par Anakeen.
L'argument config
est un tableau de valeurs indexées qui servent à modifier la configuration du widget.
En modification, les valeurs possibles sont les propriétés de configuration du widget kendo ui
.
format
est prise en compte.Affichage de la date avec le jour de la semaine suivant la locale. Imposer une date inférieure à la date du jour
$options->date("MyFamily::my_birthday")->setKendoDateConfiguration( array( "format"=>"D", "footer"=>"La date de naissance" "max" => date("Y-m-d") ) );
Cette option permet de modifier l'aspect de la valeur de l'attribut.
Dcp\Ui\DateRenderOptions setFormat(string $format)
L'argument format
est un template Mustache.
Les variables qu'il peut utiliser sont :
value
: Valeur brute,displayValue
: Valeur formatée par le serveur.Ce format doit être un fragment HTML valide.
Par défaut, le format est {{displayValue}}
.
Ce format est différent de celui
indiqué par le widget kendo ui
. La valeur de la variable {{displayValue}}
contient la valeur formatée par le widget si un format widget est précisé.
Aucun
Cette option indique un texte qui est placé dans le champ de saisie lorsque la valeur est vide pour préciser le rôle de ce champ.
Dcp\Ui\DateRenderOptions setPlaceHolder(string $text)
L'argument $text
est un texte simple (pas de html) qui sera utilisé comme
placeholder du champ.
Aucun
$options->date(My_family::my_date) ->setPlaceHolder("Select a future date");
Les options de représentation indiquées dans la structure de la famille ne sont pas prises en compte dans les interfaces HTML5.
N> Le widget d'édition des relation est basé sur un widget kendo MultiSelect
.
Cette option permet de configurer le widget d'édition des relations.
Dcp\Ui\DocidRenderOptions setKendoMultiSelectConfiguration(array $config )
L'argument config
est un tableau de valeurs indexées qui servent à modifier la configuration du widget.
En modification, les valeurs possibles sont les propriétés de configuration du widget kendo ui
.
filter
,autoBind
,select
,dataTextField
,dataValueField
,value
,dataSource
,select
,change
.maxSelectedItems
n'est prise en compte que si l'attribut est déclaré multiple.Leur éventuelle modification est ignorée par le widget.
Modification des paramètres :
$options->docid()->setKendoMultiSelectConfiguration([ // Attendre 3 caractères avant de lancer l'aide à la saisie "minLength" => 3, // text de substitution lorsque le champ est vide "placeholder" => "Search a document", // Entête de la recherche "headerTemplate" => '<div><h2>Résultat de la recherche</h2></div>' ]);
Cette option indique un texte qui est placé dans le champ de saisie lorsque la valeur est vide pour préciser le rôle de ce champ.
Dcp\Ui\DocidRenderOptions setPlaceHolder(string $text)
L'argument $text
est un texte simple (pas de html) qui sera utilisé comme
placeholder du champ.
Aucun
$options->docid(My_family::my_document) ->setPlaceHolder("Select the good document");
Cette option permet de modifier l'aspect de la valeur de l'attribut.
Dcp\Ui\TextRenderOptions setFormat(string $format)
L'argument format
est un format Mustache qui a comme variables les
informations sur la valeur de l'attribut.
Ces informations pour le type docid
sont :
value
: Identifiant du document,displayValue
: Titre du document.icon
: Url de l'icone du documentfamilyRelation
: Nom logique de la familleinitid
: Identifiant du documentrevision
: Revision du document (-1 si dernière révision)Ce format doit être un fragment HTML valide.
Par défaut, le format est
<img class="dcpAttribute__value--icon" src="{{icon}}" /> <span class="dcpAttribute__content__value">{{displayValue}}</span>`.
Aucun
Enlever l'icône de la famille pour les relations :
$options->docid(My_family::my_relation) ->setFormat('<span class="dcpAttribute__content__value">{{displayValue}}</span>');
Cette option indique la dimension de l'icône de la relation'.
Dcp\Ui\DocidRenderOptions setDocumentIconSize(string $size)
L'argument size
indique la dimension de l'image à afficher.
Par défaut, la dimension est 14x14c
. Cela affiche une icône carrée de 14px.
Le redimensionnement ne peut excéder la taille de l'icône originale.
Cette option ne modifie pas la taille css mais affiche une icône à la dimension désirée. Le poids du fichier icône est proportionnel à la taille demandée.
Pour rétablir la taille par défaut, il faut indiquer null
.
Une dimension de 0
ou de 0x0
, n'affichera pas l'icône.
Dimension de 32x32 rognée.
$options->docid(My_family::my_relation)->setDocumentIconSize("32x32c");
Cette option permet d'ajouter un bouton permettant de créer un document et de l'insérer dans l'attribut. Si l'attribut a déjà une valeur, le bouton affiche le formulaire de modification du document cible. Si l'attribut n'a pas de valeur, le bouton affiche le formulaire de création.
Dans le cas d'un attribut multiple, le bouton ajouté affiche toujours un formulaire en création afin d'ajouter le nouveau document à la liste.
Dcp\Ui\DocidRenderOptions addCreateDocumentButton(\Dcp\Ui\CreateDocumentOptions $options)
L'argument $options
permet de configurer le document à insérer. Il reprend les
options de addbutton pour configurer la taille de la fenêtre et les
caractéristiques du bouton.
Par contre, l'option target
ne peux être que _dialog
. Le formulaire pour le
document à insérer ne s'ouvre que dans une fenêtre de dialogue et ne peut être
ouverte dans une autre fenêtre du navigateur.
L'option url
n'est pas prise en compte. L'url utilisée pour l'affichage du
formulaire est calculée en fonction des paramètres de cette option.
L'option windowTitle
est vide par défaut et le titre de la fenêtre de dialogue
est calculé. Il reprend les informations d'identification du document
(icone et le nom du document). Dans ce cas l'entête du document n'est
pas affichée. Si cette option est indiquée, l'entête du document est
affiché.
Les autres paramètres sont :
familyName
htmlCreateContent
htmlContent
(vide par défaut) précède ce texte.<i class="fa fa-plus-circle" />
htmlEditContent
htmlContent
(vide par défaut) précède ce texte.
Par défaut : <i class="fa fa-plus-pencil" />
createLabel
:
Fragment HTML du label qui sera affiché sur le bouton du menu du formulaire
permettant la sauvegarde et la fermeture de la fenêtre de dialogue.
Par défaut : Create and insert to "{{label}}"
updateLabel
:
Fragment HTML du label qui sera affiché sur le bouton du menu du formulaire
permettant la création, l'insertion de la valeur et la fermeture de la
fenêtre de dialogue.
Par défaut : Save and update "{{label}}"
formValues
:
Tableau indiquant les champs du formulaire qui doivent être modifiés lors de
l'affichage du formulaire de création.
Ces valeurs ne sont pas utilisées pour le formulaire de modification.
Les valeurs par défaut sont déjà prérenseignées dans le formulaire.
Les valeurs peuvent avoir 2 formes.
Si c'est une chaîne de caractères, elle sera considérée comme la valeur
brute (value
) et la valeur affichable (displayValue
) de l'attribut.
Dans ce cas, la chaîne de caractères peut contenir des parties
variables qui permettent d'indiquer des informations du document
principal.
Si cette chaîne est un tableau, il sera utilisé comme valeur complète
de l'attribut. Dans ce cas, il doit contenir au moins "value" dans ses index.
Les valeurs complètes n'ont pas de parties variables.
Exemples :
"Récupération de {{attributes.my_attr.attributeValue.displayValue}}"
"{{attributes.my_attr.attributeValue}}"
["value"=> "M"]
["value" => 1234, "displayValue" => "Mon document"]
["value" => "application/word|2892|Mon fichier.doc", "displayValue" => "Mon fichier.doc", "size" => 4567` "icon" => "resizeimg.php?img=CORE%2FImages%2Fmime-doc.png&size=14" ]
Aucun
Affichage d'un formulaire d'un document de la famille "espèce" pour être inséré dans l'attribut "an_species" de la famille "animal".
use Dcp\AttributeIdentifiers\Zoo_animal as AnimalAttributes; use Dcp\AttributeIdentifiers\Zoo_espece as EspeceAttributes; class AnimalRenderConfigEdit extends \Dcp\Ui\DefaultEdit { public function getOptions(\Doc $document) { $options = parent::getOptions($document); $viewDoc=new \Dcp\Ui\CreateDocumentOptions(); $viewDoc->formValues=[ EspeceAttributes::es_name => "Nouvelle espèce", EspeceAttributes::es_description => "Provient de l'animal {{attributes.an_nom.attributeValue.displayValue}}", EspeceAttributes::es_classe => sprintf("{{attributes.%s.attributeValue}}", AnimalAttributes::an_classe), EspeceAttributes::es_isprotected => ["value" => "1"], EspeceAttributes::es_gardian => [ "value" => getIdFromName("", "ZOO_BIGGARDE"), "displayValue"=>$document->getTitle("ZOO_BIGGARDE")], ]; $options->docid(AnimalAttributes::an_species)->addCreateDocumentButton($viewDoc); return $options; }
Cette option déclenche les événements suivants sur la page web. Ils peuvent être interceptés par le contrôleur de document.
attributeCreateDialogDocumentReady
: lorsque le formulaire est affichéattributeCreateDialogDocumentBeforeSetFormValues
: avant l'affectation des valeurs dans le formulaireattributeCreateDialogDocumentBeforeSetTargetValue
: avant l'affectation de l'attribut dans le document principalattributeCreateDialogBeforeClose
: avant la fermeture de la fenêtre de dialogueattributeCreateDialogBeforeDestroy
: avant la destruction de la fenêtre de dialogueLes options de représentation indiquées dans la structure de la famille ne sont pas prises en compte dans les interfaces HTML5.
Le type double
bénéficie des options de représentation des attributs de type int
.
Les méthodes suivantes sont spécifiques à l'attribut double
.
Cette option indique le nombre de décimales du nombre.
En modification, la valeur est arrondie lors de la perte de focus (limitant ainsi la précision qui sera enregistrée en base).
En consultation, le nombre est affiché avec la précision indiquée. il ets complété par des 0 s'il ne possède pas assez de décimales, et est arrondi si sa précision est supérieure.
Dcp\Ui\DoubleRenderOptions setDecimalPrecision(int $number)
Aucune
L'argument number
est un nombre positif ou nul. Si ce nombre est égal à 0
, aucune limite n'est appliquée.
Attention, lors de l'affichage du formulaire, les valeurs du serveurs sont tronquées si le nombre de décimales est
atteint. Par défaut, le nombre maximum de décimales n'est pas fixé.
Par contre, la précision de la valeur est contrainte par le type double
de javascript.
Affichage de 4 décimales maximum.
$options->double()->setDecimalPrecision(4);
Ne pas montrer les zéros non significatifs avec 10 décimales :
$options->double() ->setDecimalPrecision(10) ->setKendoNumericConfiguration([ "spinner" => false, // pas d'incrément prédéfini "format" => "#,#.##########" // 10 décimales ]);
Les options de représentation indiquées dans la structure de la famille ne sont pas prises en compte dans les interfaces HTML5.
Cette option indique l'aspect du widget de choix d'énuméré.
Dcp\Ui\EnumRenderOptions setDisplay(string $display)
Les valeurs possible pour l'argument $display
sont :
list
(valeur par défaut)L'affichage de la sélection se présente sous forme d'une liste déroulante.
Cette liste n'est pas actualisée dynamiquement.
Si l'énuméré est déclaré multiple (option multiple=yes
),
cet affichage est similaire à celui de autoCompletion
.
Dans ce mode d'affichage, la liste des énumérés est récupérée une seule fois lors de l'initialisation de l'affichage de l'attribute. Le filtre est réalisé sur le client avec les données initiales.
Figure 31. Énuméré simple - mode list
Figure 32. Énuméré multiple - mode list
autoCompletion
Une liste de suggestions est présentée lorsqu'on saisit des caractères.
Si useSourceUri
est true
, le serveur est interrogé à chaque caractère
tapé pour retourner le résultat filtré. Si les données de l'énuméré sont
déjà présentes sur le client, le résultat est filtré par le client sur le
titre des libellés. L'opérateur utilisé est "commence par".
Dans ce mode d'affichage, le filtre est réalisé sur le serveur après chaque modification du texte recherché.
Figure 33. Énuméré simple - mode autocomplétion
Figure 34. Énuméré multiple - mode autocomplétion
vertical
L'affichage présente des boutons à cocher alignés verticalement, chaque choix s'affichant sur sa propre ligne.
Si l'énuméré est déclaré multiple (option multiple=yes
), les boutons
seront des checkbox ; dans le cas contraire,
ce seront des boutons radio.
Cet affichage ne convient que si le nombre de choix est limité.
Figure 35. Énuméré simple - mode vertical
Figure 36. Énuméré multiple - mode vertical
horizontal
L'affichage présente des boutons à cocher alignés horizontalement.
Si l'énuméré est déclaré multiple (option multiple=yes
),
les boutons seront des checkbox ; dans le cas contraire,
ce seront des boutons radio.
Figure 37. Énuméré simple - mode horizontal
Figure 38. Énuméré multiple - mode horizontal
bool
Cet affichage présente un seul bouton à bascule (coché ou pas coché).
Cet affichage ne fonctionne que si le nombre d'éléments est de deux et
seulement si l'énuméré n'est pas déclaré
multiple (option multiple=yes
).
Lors de l'affichage du formulaire, si la valeur initiale est vide, alors elle est affectée à la première valeur des deux valeurs possibles de l'énuméré.
Figure 39. Énuméré premier choix - mode bool
Figure 40. Énuméré second choix - mode bool
Aucun
Affichage vertical :
$options->enum(My_family::my_choice)->setDisplay(\Dcp\Ui\EnumRenderOptions::verticalDisplay);
Cette option indique que le widget interroge le serveur pour avoir les données de l'énumeré.
Il n'utilise pas les données de l'énuméré fournie par l'api REST de la structure de la famille.
Dcp\Ui\EnumRenderOptions useSourceUri(bool $useIt)
Important : Les données de l'énuméré sont fournis par l'api
"structure" sauf si l'option eformat=auto
est indiqué
comme option de l'attribut.
Le widget demande les informations de l'énuméré (via une requête au serveur) si
ces données ne sont par fournies par la structure de la famille au moment de
l'initialisation du widget même si useSourceUri
vaut false
.
Par contre, si useSourceUri
vaut true
, les données sont demandées
systématiquement au serveur.
En résumé, la requête serveur est envoyée dans les cas suivants :
Requête serveur | useSourceUri=false | useSourceUri=true |
---|---|---|
eformat != auto | Non | Oui |
eformat == auto | Oui | Oui |
Par défaut useSourceUri
est égal à false
et eformat
est égal à list
,
donc le serveur n'est pas interrogé par défaut pour connaître la liste des
élements de l'énuméré.
Le paramètre $useIt
indique si le serveur doit être interrogé.
Cette option indique que le premier élément de la liste est sélectionné si la valeur est vide.
Dcp\Ui\EnumRenderOptions useFirstChoice(bool $useFirst)
multiple=yes
).Si une valeur par défaut est définie, cette option est sans effet.
Cette option permet de rajouter un champ "Autre", permettant à l'utilisateur de saisir une valeur différente de celles proposées.
Dcp\Ui\EnumRenderOptions useOtherChoice(bool $useIt)
Le paramètre $useIt
indique si le champ de saisi est visible.
Cette option indique un texte qui est placé dans le champ de saisie lorsque la valeur est vide pour préciser le rôle de ce champ.
Dcp\Ui\EnumRenderOptions setPlaceHolder(string $text)
list
ou autocompletion
L'argument $text
est un texte simple (pas de html) qui sera utilisé comme
placeholder du champ.
Aucun
$options->enum(My_family::my_enum) ->setPlaceHolder("Select the good one");
En plus des labels communs à tous les types d'attributs, les labels sur le widget de choix de fichier peuvent être configurés.
Dcp\Ui\FileRenderOptions setTranslations(array $labels)
Aucune.
Les labels suivants sont utilisés en modification :
chooseMessage
: "Choisissez",invalidEntry
: "Entrée invalide",invertSelection
: "Cliquer pour répondre "{{displayValue}}"",bool
de l'option setDisplay.selectMessage
: 'Sélectioner {{displayValue}}',horizontal
ou vertical
de l'option setDisplayunselectMessage
: 'Désélectioner {{displayValue}}',horizontal
ou vertical
de l'option
setDisplay si l'énuméré est multiple.chooseAnotherChoice
: "Choisissez un autre choix",selectAnotherChoice
: "Valider cet autre choix",autocompletion
et
list
de l'option setDisplay.Le label suivant est utilisé en consultation :
displayOtherChoice
: "{{value}} (autre choix)"
: Format d'affichage de autre choix en consultation (option useOtherChoice).setOrderBy
Cette option indique l'ordre de tri des entrées de l'énuméré.
Dcp\Ui\EnumRenderOptions setOrderBy(string $orderBy)
Lors de la consultation, les éléments des énumérés multiples sont affichés dans l'ordre dans lequel ils ont été sélectionnés.
Les valeurs possible pour l'argument $orderBy
sont :
Dcp\Ui\EnumRenderOptions::orderByOrderOption
(default)Dcp\Ui\EnumRenderOptions::orderByKeyOption
ce tri ne tient pas compte de la locale de l'utilisateur. C'est un tri alphabétique non naturel.
Dcp\Ui\EnumRenderOptions::orderByLabelOption
ce tri tient compte de la locale de l'utilisateur.
Aucun
$options->enum(My_family::my_enum) ->setOrderBy(Dcp\Ui\EnumRenderOptions::orderByLabelOption);
Les options de représentation indiquées dans la structure de la famille ne sont pas prises en compte dans les interfaces HTML5.
Cette option indique si le fichier à télécharger peut être consulté directement depuis le navigateur.
Dcp\Ui\FileRenderOptions setContentDispositionInline(bool $inline)
Si l'argument inline
est false
(par défaut), le fichier est proposé au
téléchargement lorsqu'on clique sur le lien. Si la valeur est true
, le fichier
sera affiché sur le navigateur si celui-ci prend en compte son format.
Note : Les options de liens sont applicables sur le l'hyperlien généré.
Aucun
Affichage direct sur une page différente
$fileLink=new \Dcp\Ui\HtmlLinkOptions(); $fileLink->target="_blank"; $options->file(My_family::my_abstract) ->setLink($fileLink) ->setContentDispositionInline(true);
En plus des labels communs à tous les types d'attributs, les labels sur le widget de choix de fichier peuvent être configurés.
Dcp\Ui\FileRenderOptions setTranslations(array $labels)
Les labels suivants utilisés en modification peuvent être changés :
dropFileHere
: "Déposer le fichier ici"tooltipLabel
: "Choisissez un fichier"downloadLabel
: "Télécharger le fichier"recording
: "Enregistrement"transferring
: "Téléversement de"Les textes de ces labels sont différents pour le type image
.
Les labels suivants sont utilisés en consultation pour afficher la taille du fichier dans le tooltip :
kiloByte
: "Ko"byte
: "octets"Modification des traductions.
$options->file("my_file") ->setTranslations([ "tooltipLabel"=>"Choisissez un plan", ]);
Cette option indique un texte qui est placé dans le champ de saisie lorsque la valeur est vide pour préciser le rôle de ce champ.
Dcp\Ui\FileRenderOptions setPlaceHolder(string $text)
L'argument $text
est un texte simple (pas de html) qui sera utilisé comme
placeholder du champ lorsque le champ est vide.
Aucun
$options->file(My_family::my_file)->setPlaceHolder("Select a pdf file, please.");
Cette option indique la dimension de l'icône du type mime du fichier.
Dcp\Ui\FileRenderOptions setMimeIconSize(string $size)
L'argument size
indique la dimension de l'image à afficher.
Par défaut, la dimension est 20x20c
. Cela affiche une icône carrée de 20px.
Le redimensionnement ne peut excéder la taille de l'icône originale qui est de 80x80px.
Cette option ne modifie pas la taille css mais affiche une icône à la dimension désirée. Le poids du fichier icône est proportionnel à la taille demandée.
Pour rétablir la taille par défaut, il faut indiquer null
.
Une dimension de 0
ou de 0x0
, n'affiche par l'icône.
Sur le formulaire, l'icône est utilisée en image de fond (background-image) du champ de saisie (input). Elle ne peut dépasser la dimension du champ de saisie.
Les attributs de type "image" n'utilisent pas cette icône dans leur représentation par défaut.
Dimension de 32x32 rognée.
$options->file(My_family::my_file)->setMimeIconSize("32x32c");
Les options de représentation indiquées dans la structure de la famille ne sont pas prises en compte dans les interfaces HTML5.
Le contenu d'un cadre est visible par défaut et son contenu peut être replié.
Cette option indique si la cadre peut être plié ou s'il doit être plié ou déplié par défaut.
Dcp\Ui\TabRenderOptions setCollapse(bool|null $collapse)
Aucune
L'argument $collapse
indique si le contenu du cadre doit être rendu replié.
Dcp\Ui\FrameRenderOptions::collapseExpanded
: Contenu déplié (valeur par défaut)Dcp\Ui\FrameRenderOptions::collapseCollapsed
: Contenu replié Dcp\Ui\FrameRenderOptions::collapseNone
: Déplié et repliage non possibleNe pas autoriser le repliage des cadres :
class MyNoCollapseRender extends \Dcp\Ui\DefaultView { public function getOptions(\Doc $document) { $options = parent::getOptions($document); $options->frame()->setCollapse(\Dcp\Ui\FrameRenderOptions::collapseNone); return $options; } }
Cette option est une option commune qui permet d'afficher une description pour un tableau.
Son usage est le même mais le positionnement de la description est propre au type "cadre".
Dcp\Ui\CommonRenderOptions::topLabelPosition
: Dcp\Ui\CommonRenderOptions::topPosition
: Texte affiché au dessus du cadre
Figure 41. Placement "top" ou "topLabel"
Dcp\Ui\CommonRenderOptions::bottomPosition
:
Texte affiché au dessous du cadre
Figure 42. Placement "bottom"
Dcp\Ui\CommonRenderOptions::leftPosition
:
Texte affiché à gauche des attributs du cadre
Figure 43. Placement "left"
Dcp\Ui\CommonRenderOptions::rightPosition
:
Texte affiché à droite des attributs du cadre
Figure 44. Placement "right"
Dcp\Ui\CommonRenderOptions::topValuePosition
:
Texte affiché au dessus du premier attribut du cadre
dans chaque rangée du tableau.
Figure 45. Placement "topValue"
Dcp\Ui\CommonRenderOptions::bottomLabelPosition
:
Texte affiché au dessous du libellé du cadre.
Figure 46. Placement "bottomlabel"
Dcp\Ui\CommonRenderOptions::bottomValuePosition
:
Texte affiché au dessous du dernier attribut du cadre.
Figure 47. Placement "bottomValue"
Dcp\Ui\CommonRenderOptions::clickPosition
: Affiche une ancre
à gauche du libellé du cadre. Cette ancre
affiche la description lorsque l'utilisateur clique dessus.
Figure 48. Placement "click"
Les options de représentation indiquées dans la structure de la famille ne sont pas prises en compte dans les interfaces HTML5.
Le widget d'édition des textes formaté est basé sur un widget CKEditor
.
Cette option indique la hauteur de la zone d'écriture du widget d'édition.
Dcp\Ui\HtmltextRenderOptions setHeight(string $heigth)
L'argument height
est une valeur avec unité (120px
par défaut). Les unités possibles sont les
unités css.
Le pourcentage n'est pas une unité valide pour cette option.
Si l'unité n'est pas précisé, c'est l'unité px
qui est utilisée.
Cette option est priroritaire à l'option setCkEditorConfiguration
.
Affichage d'une hauteur de 150px (Barre de menu non comprise).
$options->htmltext(My_family::my_article)->setHeight("150px");
Cette option indique si la barre de menu doit être dépliée ou non lors de l'affichage du document.
Dcp\Ui\HtmltextRenderOptions setToolbarStartupExpanded(bool $expanded)
Si l'argument expanded
est true
(valeur par défaut), la barre de menu est visible.
Si cette argument est false
, la barre de menu est minimisée.
Un bouton sur cette barre de menu permet de la déplier ou de la replier.
Cette option correspond à l'option toolbarStartupExpanded
de CKEditor.
Cette option est priroritaire à l'option setCkEditorConfiguration
.
Cette option indique la barre de menu qui doit être disponible sur cet éditeur.
Dcp\Ui\HtmltextRenderOptions setToolbar(string $toolbar)
L'argument toolbar
indique l'identifiant de la barre de menu à utiliser.
La valeur par défaut est Simple
.
Les valeurs prédéfinies sont :
Dcp\Ui\HtmltextRenderOptions::basicToolbar
Figure 49. Barre de menu *Basic*
Dcp\Ui\HtmltextRenderOptions::defaultToolbar
Figure 50. Barre de menu *Default*
Dcp\Ui\HtmltextRenderOptions::simpleToolbar
Figure 51. Barre de menu *Simple*
Dcp\Ui\HtmltextRenderOptions::fullToolbar
Figure 52. Barre de menu *Full*
Cette option correspond à l'option
toolbar
de CKEditor.
Attention : La barre de menu influence le contenu du texte saisi. Par exemple, si la barre de menu ne contient pas le bouton de coloriage des textes, les attributs de couleurs sont effacés.
Il est possible d'inhiber ce filtrage en configurant l'option ckEditor
allowedContent
pour indiquer les tags autorisés
ou l'option setCkEditorAllowAllTags pour tout autoriser.
Dans ce cas, il est nécessaire de nettoyer le code de manière explicite pour
éviter les balises non désirées.
Cette option est priroritaire à l'option setCkEditorConfiguration
.
Affichage du menu "Basic".
$options->htmltext(My_family::my_article)->setToolbar(\Dcp\Ui\HtmltextRenderOptions::basicToolbar);
Cette option permet de configurer le widget CKeditor.
Dcp\Ui\HtmltextRenderOptions setCkEditorConfiguration(array $config)
Attention : Les options propres à CKEditor ne sont pas maintenues par Anakeen et leur bon fonctionnement n'est pas garanti par Anakeen.
L'argument config
permet de modifier les valeurs de configuration du widget CKeditor.
Les valeurs possibles sont celles du widget CKEditor.
Aucun
Configurer sa propre barre de menu avec seulement "Gras" et "Italique".
$options->htmltext(My_family::my_article) ->setToolbar("mySample") ->setCkEditorConfiguration([ "toolbarCanCollapse" => false, "toolbar_mySample" => [ "name" => "Basics", "items" => ["Bold", "Italic"] ] ]);
Cette option permet d'autoriser tous les tags HTML dans l'éditeur ckEditor. Par défaut, les tags autorisés sont fonctions de la barre de menu affichée.
Dcp\Ui\HtmltextRenderOptions setCkEditorConfiguration(bool $allow)
L'argument allow
s'il faut true
permet d'autoriser toute balise HTML supportée.
Les attributs de ces balises peuvent aussi être utilisées à
l'exception des attributs commençant par on
tel que onclick
ou
onmouseover
.
Les balises supportées sont : a
, abbr
, acronym
, address
, applet
,
area
, article
, aside
, audio
, b
, base
, basefont
, bdi
, bdo
,
big
, blockquote
, body
, br
, button
, canvas
, caption
, center
,
cite
, code
, col
, colgroup
, command
, datalist
, dd
, del
,
details
, dfn
, dialog
, dir
, div
, dl
, dt
, em
, embed
,
fieldset
, figcaption
, figure
, font
, footer
, form
, h1
, h2
,
h3
, h4
, h5
, h6
, head
, header
, hgroup
, hr
, html
, i
,
iframe
, img
, input
, ins
, isindex
, kbd
, keygen
, label
,
legend
, li
, link
, main
, map
, mark
, menu
, meta
, meter
,
nav
, noframes
, noscript
, object
, ol
, optgroup
, option
,
output
, p
, param
, pre
, progress
, q
, rp
, rt
, ruby
, s
,
samp
, section
, select
, small
, source
, span
, strike
,
strong
, style
, sub
, summary
, sup
, table
, tbody
, td
,
textarea
, tfoot
, th
, thead
, time
, title
, tr
, track
, tt
,
u
, ul
, var
, video
, wbr
.
Aucun
Affichage de la barre de menu complète et autorisation de tous les tags.
$options->htmltext(My_family::my_article) ->setToolbar(\Dcp\Ui\HtmltextRenderOptions::fullToolbar) ->setCkEditorAllowAllTags(true);
Cette option permet de définir les modalités d'ouverture des liens contenus dans cet attribut.
\Dcp\Ui\HtmltextRenderOptions::setAnchorsOptions(\Dcp\Ui\anchorOptions $anchorOptions)
Uniquement pris en compte lorsque l'attribut n'est pas en modification.
L'argument en entrée est un objet de type Dcp\Ui\anchorOptions
qui configure
les différents paramètres du lien :
target
Nom de la fenêtre du navigateur vers laquelle le lien sera envoyé.
_blank
(valeur par défaut), une nouvelle fenêtre est utilisée._self
, la fenêtre courante est utilisée._dialog
, une fenêtre de dialogue interne sera utilisée.Si target
est différente de _self
les options suivantes sont prises en compte :
windowHeight
Hauteur de la fenêtre de dialogue.
Si target est égal à _dialog
, la dimension doit être une
[dimension css valable][css_dimension]
(c'est à dire un nombre suivi immédiatement de son unité).
Sinon la dimension est un nombre entier exprimé en pixels.
La valeur par défaut est 300px
.
windowWidth
Largeur de la fenêtre de dialogue.
Si target est égal à _dialog
, la dimension doit être une
[dimension css valable][css_dimension]
(c'est à dire un nombre suivi immédiatement de son unité).
Sinon la dimension est un nombre entier exprimé en pixels.
La valeur par défaut est 200px
.
Si target
est _dialog
, les options suivantes sont prises en compte :
modal
false
par défaut).Aucun
Ouverture de tous les liens dans une modale de 400 x 300px.
$options->htmltext(My_family::my_article) ->setAnchorOptions(new \Dcp\Ui\anchorOptions('_dialog', '400px', '300px', true))
Les options de représentation indiquées dans la structure de la famille ne sont pas prises en compte dans les interfaces HTML5.
Le type image
bénéficie des options de représentation des attributs de type file
.
Les méthodes suivantes sont spécifiques à l'attribut image
.
Cette option indique la dimension de la miniature affichée.
Dcp\Ui\ImageRenderOptions setThumbnailSize(string $size)
L'argument size
indique la dimension de l'image à afficher.
Par défaut 48
indique une image de 48px de large.
Le redimensionnement ne peux excéder la taille de l'image originale.
Cette option ne modifie pas la taille css mais affiche une image à la largeur désirée. Le poids du fichier image est proportionnel à la taille demandée.
Par défaut, l'image est un lien qui affiche l'image originale dans une
"target" _dialog
de dimension 300x400.
Pour afficher l'image dans sa taille originale, il faut indiquer null
.
Largeur de 100px.
$options->image(My_family::my_photo)->setThumbnailSize("100");
Hauteur de 100px.
$options->image(My_family::my_photo)->setThumbnailSize("x100");
Largeur et hauteur de 100px rognée.
$options->image(My_family::my_photo)->setThumbnailSize("100x100c");
1.1.0
Utiliser setThumbnailSize
.
Cette option indique la largeur de la miniature affichée.
Dcp\Ui\ImageRenderOptions setThumbnailWidth(int $width)
L'argument size
est un nombre positif qui indique la largeur (en pixels) de
l'image affichée (48
par défaut).
Le redimensionnement ne peux excéder la taille de l'image originale.
Pour afficher l'image dans sa taille originale, il faut mettre 0
.
Cette option ne modifie pas la taille css mais affiche une image à la largeur désirée. Le poids du fichier image est proportionnel à la taille demandée.
Par défaut, l'image est un lien qui affiche l'image originale dans une
"target" _dialog
de dimension 300x400.
Aucun
Largeur de 100px.
$options->image(My_family::my_photo)->setThumbnailWidth(100);
Les options de représentation indiquées dans la structure de la famille ne sont pas prises en compte dans les interfaces HTML5.
Le widget d'édition des entiers est basé sur un widget Kendo Numeric textbox
.
Cette option permet de configurer le widget d'édition des nombres entiers.
Dcp\Ui\IntRenderOptions setKendoNumericConfiguration(array $config )
L'argument config
est un tableau de valeurs indexées qui servent à modifier la configuration du widget.
En modification, les valeurs possibles sont les propriétés de configuration du widget kendo ui
Pour le mode consultation, seul le format
est pris en compte.
Ajouter des limites sur le nombre à saisir.
$options->int(My_family::my_number) ->setPlaceHolder("Give a number between 10 and 20") ->setKendoNumericConfiguration( ["min"=>10, "max"=>20] );
Cette option permet de modifier l'aspect de la valeur de l'attribut.
Dcp\Ui\IntRenderOptions setFormat(string $format)
L'argument format
est un format Mustache qui a comme variables les
informations sur la valeur de l'attribut.
Ces informations pour le type int
sont :
value
: Valeur brute,displayValue
: Valeur formatée par le serveur.Ce format doit être un fragment HTML valide.
Par défaut, le format est {{displayValue}}
.
Note : Ce format est différent de celui indiqué par le widget kendo ui
. La
valeur de la variable {{displayValue}}
contient la valeur formatée par le
widget si un format widget est précisé.
En plus des labels communs à tous les types d'attributs, les labels sur les flèches d'incrémentation et de décrémentation peuvent être configurés.
Dcp\Ui\CommonRenderOptions setTranslations(array $labels)
Les labels decreaseLabel
et increaseLabel
indiquent les textes surgissant sur
les flèches d'incrémentation et de décrémentation.
Incrément de 5 et pose de l'unité "kg". Modification des traductions.
$options->int(My_Family::my_mass) ->setKendoNumericConfiguration([ "step" => 5, "format" => "#,# kg" ]) ->setTranslations([ "decreaseLabel"=>"5 kilos de moins", "increaseLabel"=>"5 kilos de plus" ]);
Cette option indique un texte qui est placé dans le champ de saisie lorsque la valeur est vide pour préciser le rôle de ce champ.
Dcp\Ui\IntRenderOptions setPlaceHolder(string $text)
L'argument $text
est un texte simple (pas de html) qui sera utilisé comme
placeholder du champ.
$options->int(My_family::my_number)->setPlaceHolder("Number less than 10");
Les options de représentation indiquées dans la structure de la famille ne sont pas prises en compte dans les interfaces HTML5.
Le type longtext
bénéficie des options de représentation des attributs de type
text
.
Les méthodes suivantes sont spécifiques à l'attribut longtext
.
Cette option permet de limiter le nombre de lignes visibles sur le champs de saisie du texte.
Si le nombre de ligne de la valeur dépasse la limite un ascenseur vertical apparaît.
Dcp\Ui\LongtextRenderOptions setMaxDisplayedLineNumber(int $number)
Par défaut, le champ est agrandi pour voir l'intégralité du texte. À chaque nouvelle ligne saisie la hauteur du champ s'agrandit. Par contre, la hauteur n'est pas diminuée si le nombre de ligne diminue.
Si le nombre est positif, le champ de saisie n'est pas redimensionnable manuellement pour les navigateurs qui le supportent.
L'argument number
est un nombre positif ou nul. Si ce nombre est égal à 0
aucune limite n'est appliquée et le champ de saisie s'agrandit en fonction du
nombre de lignes saisies.
Aucun
Affichage de 10 lignes maximum. Au delà un ascenseur vertical apparaît.
$options->longtext(My_family::my_definition)->setMaxDisplayedLineNumber(10);
Les options de représentation indiquées dans la structure de la famille ne sont pas prises en compte dans les interfaces HTML5.
Le type money
bénéficie des options de représentation de l'attribut de type double
.
Les méthodes suivantes sont spécifiques à l'attribut money
.
Cette option indique la devise de la somme d'argent.
Dcp\Ui\MoneyRenderOptions setCurrency(string $currency)
Aucune
L'argument currency
est une chaîne de caractère qui représente la devise.
Par défaut, la valeur est €
.
money
ne peut avoir plus de 2 décimales (contrainte serveur).
La méthode setDecimalPrecision
ne peut pas dans ce cas avoir un argument supérieur à 2.la position de la devise est fonction de la locale de l'utilisateur.
Pour l'anglais, la position est à gauche et collé à la somme.
Pour le français, la position est à droite et séparée de la somme par un espace
Exemple :
Utiliser la livre comme devise.
$options->money(My_family::my_benefit)->setCurrency('£');
Les options de représentation indiquées dans la structure de la famille ne sont pas prises en compte dans les interfaces HTML5.
Les options d'affichage générales des onglets sont fournies par les options de document.
Le widget de gestion des onglets est basé sur un widget Kendo tab Strip
.
Cette option d'afficher un tooltip au dessus de l'onglet lors du survol.
Si le label est particulièrement long et qu'il ne peut être affiché intégralement dans l'onglet, le tooltip permet de voir le libellé en entier.
Dcp\Ui\TabRenderOptions setTooltipLabel(string $label, bool $html=false)
Aucune
L'argument $label
indique le texte du tooltip.
Il peut comporter les parties variables suivantes :
{{label}}
: Le libellé de l'onglet{{id}}
: L'identifiant de l'ongletSi $html
est à true
, $label ne sera pas échappé.
Si $html
est à false
, $label sera échappé.
Aucun
$options->tab(My_family::my_informations) ->setTooltipLabel('Onglet informatif');
Cette option est une option commune qui permet d'afficher une description pour un tableau.
Son usage est le même mais le positionnement de la description est propre au type "onglet".
Dcp\Ui\CommonRenderOptions::topValuePosition
Dcp\Ui\CommonRenderOptions::topPosition
:
Texte affiché au dessus du premier cadre contenu dans l'onglet
Figure 53. Placement "top"
Dcp\Ui\CommonRenderOptions::bottomValuePosition
:
Dcp\Ui\CommonRenderOptions::bottomPosition
:
Texte affiché au dessous du dernier cadre contenu dans l'onglet
Figure 54. Placement "bottom"
Dcp\Ui\CommonRenderOptions::topLabelPosition
:
Dcp\Ui\CommonRenderOptions::bottomLabelPosition
:Dcp\Ui\CommonRenderOptions::rightPosition
:Dcp\Ui\CommonRenderOptions::leftPosition
: Position non prise en compte.
Ces positionnements ne sont pas possibles pour les onglets.
Une erreur est affichée sur la console du navigateur dans ce cas. La description
n'est pas affichée.
Dcp\Ui\CommonRenderOptions::clickPosition
: Affiche une ancre
à gauche du libellé de l'onglet. Cette ancre
affiche la description lorsque l'utilisateur clique dessus.
Figure 55. Placement "click"
Les options de représentation indiquées dans la structure de la famille ne sont pas prises en compte dans les interfaces HTML5.
Cette option permet de limiter le nombre de caractères saisis par l'utilisateur. Cela n'est pas une contrainte et le champ saisie peut excéder cette limite par programmation.
Dcp\Ui\TextRenderOptions setMaxLength(int $max)
L'argument $max
est un nombre positif. Si ce nombre est égal à 0
, aucune
limite n'est appliquée.
Aucun
Limiter la saisie d'un numéro de téléphone à 10 caractères.
$options->text(My_family::my_phone)->setMaxLength(10);
Cette option permet de configurer le widget d'édition des relations.
Dcp\Ui\DocidRenderOptions setKendoMultiSelectConfiguration(array $config )
L'argument config
est un tableau de valeurs indexées qui servent à modifier la
configuration du widget.
En modification, les valeurs possibles sont les
propriétés de configuration du widget kendo ui
.
filtering
,dataTextField
,dataSource
,select
.Leur modification est ignorée par le widget.
Modification des paramètres :
$options->docid()->setKendoAutoCompleteConfiguration([ // Attendre 3 caractères avant de lancer l'aide à la saisie "minLength" => 3, // Entête de la recherche "headerTemplate" => '<div><h2>Résultat de la recherche</h2></div>' ]);
Cette option indique un texte qui est placé dans le champ de saisie lorsque la valeur est vide pour préciser le rôle de ce champ.
Dcp\Ui\DocidRenderOptions setPlaceHolder(string $text)
L'argument $text
est un texte simple (pas de html) qui sera utilisé comme
placeholder du champ.
Aucun
$options->text(My_family::my_phone)->setPlaceHolder("Write work phone number");
Cette option permet de modifier l'aspect de la valeur de l'attribut.
Dcp\Ui\TextRenderOptions setFormat(string $format)
L'argument format
est un format Mustache qui a comme variables les
informations sur la valeur de l'attribut.
Ces informations pour le type text
sont :
value
: Valeur brute,displayValue
: Valeur formatée par le serveur.Ce format doit être un fragment HTML valide.
Par défaut, le format est {{displayValue}}
.
Aucun
$options->text(My_family::my_title) ->setFormat('<h1 class="my-red">{{displayValue}}</h1>');
Le widget d'édition des temps (heure / minute) est basé sur un widget kendo Time Picker
.
Cette option permet de configurer l'aspect du widget de temps.
Dcp\Ui\TimeRenderOptions setKendoTimeConfiguration(array $config)
Attention : Les options propres à Kendo ne sont pas maintenues par Anakeen et leur bon fonctionnement n'est pas garanti par Anakeen.
L'argument config
est un tableau de valeurs indexées qui servent à modifier la configuration du widget.
En modification, les valeurs possibles sont les propriétés de configuration du widget kendo ui
.
Pour le mode consultation, seul le format
est pris en compte.
Intervalle de choix de 5 minutes
$options->time("MyFamily::my_time") ->setKendoTimeConfiguration([ "interval" => 5 ]);
Cette option permet de modifier l'aspect de la valeur de l'attribut.
Dcp\Ui\TimeRenderOptions setFormat(string $format)
L'argument $format
est un format Mustache qui a comme variables les informations sur la valeur de l'attribut.
Ces informations pour le type text
sont :
value
: Valeur brute,displayValue
: Valeur formatée par le serveur.Ce format doit être un fragment HTML valide.
Par défaut, le format est {{displayValue}}
.
Ce format est différent de celui indiqué par le widget kendo ui
. La
valeur de la variable {{displayValue}}
contient la valeur formatée par le
widget si un format widget est précisé.
Cette option indique un texte qui est placé dans le champ de saisie lorsque la valeur est vide pour préciser le rôle de ce champ.
Dcp\Ui\TimeRenderOptions setPlaceHolder(string $text)
L'argument $text
est un texte simple (pas de html) qui sera utilisé comme
placeholder du champ.
Aucun
$options->enum(My_family::my_time) ->setPlaceHolder("Select the hour");
Les options de représentation indiquées dans la structure de la famille ne sont pas prises en compte dans les interfaces HTML5.
Le type timestamp
bénéficie des options de représentation de l'attribut de type date
.
Les méthodes suivantes sont spécifiques à l'attribut timestamp
.
Le widget d'édition des date est basé sur un widget kendo Date Time Picker
.
Cette option permet de configurer l'aspect du widget de date.
Dcp\Ui\DateRenderTimestamp setKendoDateConfiguration(array $config)
Attention : Les options propres à Kendo ne sont pas maintenues par Anakeen et leur bon fonctionnement n'est pas garanti par Anakeen.
L'argument config
est un tableau de valeurs indexées qui servent à modifier la configuration du widget.
En modification, les valeurs possibles sont les propriétés de configuration du widget kendo ui
.
Pour le mode consultation, seul le format
est pris en compte.
Affichage de la date avec le jour de la semaine suivant la locale ainsi que des heures, minutes et secondes.
$options->date("MyFamily::my_wakeup")->setKendoDateConfiguration( array("format"=>"F") ));
Les options de représentation indiquées dans la structure de la famille ne sont pas prises en compte dans les interfaces HTML5.
Les méthodes suivantes sont spécifiques à l'attribut password
.
Cette option indique un texte qui sera utilisé pour l'affichage du mot de passe lorsque celui-ci n'est pas vide.
Dcp\Ui\PasswordRenderOptions hideValue(string $text)
La valeur du mot de passe enregistré dans le document n'est pas crypté. Elle est accessible comme n'importe quelle autre valeur du document. Il est de la responsabilité du développeur de crypter et de protéger cette valeur si nécessaire.
L'argument $text
est un texte simple (pas de html) pour la valuer d'affichage.
Par défaut la valeur est *****
.
Aucun
$options->enum(My_family::my_password) ->setPlaceHolder("Select a secret password");
Cette option indique un texte qui est placé dans le champ de saisie lorsque la valeur est vide pour préciser le rôle de ce champ.
Dcp\Ui\PasswordRenderOptions setPlaceHolder(string $text)
L'argument $text
est un texte simple (pas de html) qui sera utilisé comme
placeholder du champ.
Aucun
$options->enum(My_family::my_password) ->setPlaceHolder("Select a secret password");
La configuration des rendus utilisée par ce module n'est pas applicable aux interfaces "historique" de document de "Dynacase Core" ("FDL_CARD").
Les options d'affichage indiquées dans les attributs des familles (fichiers "csv/ods") ne sont pas prises en compte dans les configurations de rendus. Elles restent valides uniquement avec les interfaces fournies par Dynacase Core.
Les options d'affichage "Dynacase Core" ont une équivalence qui peut être faite avec les options de rendu de "Dynacase Document UI".
Les options sont définies dans le manuel de référence
Option | Description de l'option d'affichage "Dynacase Core" | Équivalence "Dynacase Document UI" |
---|---|---|
showempty |
Indique que l'attribut doit être présenté en consultation, même si sa valeur est vide. | showempty() |
vlabel |
Indique la position du libellé de l'attribut. | setlabelposition() |
elabel |
Texte du tooltip du label de l'attribut pour le document en mode modification. | setDescription() |
ititle |
Texte du tooltip du bouton '...' de l'aide à la saisie. | setAutoCompleteHtmlLabel() |
ltitle |
Texte affichable en tooltip sur l'hyperlien lorsque la souris passe dessus. | setlink() |
ltarget |
Nom de la fenêtre destinataire de l'hyperlien. | setlink() |
lconfirm |
Indique si on veut un message de confirmation avant l'activation du lien. |
useConfirm() pour les menus uniquement |
tconfirm |
Texte de la confirmation. |
useConfirm() pour les menus uniquement |
autosuggest |
En édition, sur une aide à la saisie, indique que la recherche est lancée à chaque modification du texte saisi. | setKendoAutoCompleteConfiguration() |
eltitle |
Options pour pour les extra liens (elink). | addButton() |
elsymbol |
Caractère affiché sur le bouton généré par l'extra lien. | addButton() |
eltarget |
Nom de la fenêtre destinataire sur le bouton généré par l'extra lien. | addButton() |
viewtemplate |
Référence de la vue d'attribut à utiliser lors de la consultation du document. | setTemplate() |
edittemplate |
Référence de la vue d'attribut à utiliser lors de la modification du document. | setTemplate() |
array
Les options sont définies dans le manuel de référence
Option | Description de l'option d'affichage "Dynacase Core" | Équivalence "Dynacase Document UI" |
---|---|---|
cellbodystyle |
Indique le style css appliqué sur les cellules du corps de tableau. | Règles css |
cellheadstyle |
Indique le style css appliqué sur les cellules de l'entête de tableau. | Règles css |
classname |
Indique une classe css à appliquer aux cellules du corps tableau en consultation. | Pas d'équivalence directe - à réaliser sur le ready du tableau ou avec un template |
displayrowcount |
Indique si le nombre de lignes du tableau est affiché dans l'entête de la première colonne. | setRowCountThreshold() |
empty |
Indique que le tableau, s'il est vide ne doit pas afficher la première rangée en modification. | setRowMinDefault() |
height |
Indique la hauteur du corps du tableau. | Règles css |
sorttable |
Indique que le tableau est triable. | Pas d'équivalence directe - peut être réalisé sur le ready avec jquery-dataTable |
twidth |
Indique la largeur du tableau. | Règles css |
userowadd |
Indique si l'utilisateur est autorisé à ajouter des rangées au tableau. | disableRowAdd() |
rowviewzone |
Indique une vue spécifique de tableau pour la consultation. | setTemplate() |
roweditzone |
Indique une vue spécifique de tableau pour la modification. | setTemplate() |
align |
Indique l'alignement horizontal pour les cellules de la colonne. | Règles css |
bgcolor |
Indique la couleur de fond des cellules de la colonne. | Règles css |
color |
Indique la couleur du texte pour les cellules de la colonne. | Règles css |
cwidth |
Indique la largeur de la colonne. | Règles css |
docid
Les options sont définies dans le manuel de référence
Option | Description de l'option d'affichage "Dynacase Core" | Équivalence "Dynacase Document UI" |
---|---|---|
create |
Indique qu'un document de la famille cible de la relation pourra être créé depuis le formulaire. | addCreateDocumentButton() |
docrev |
Indique quelle est la révision pointée par la relation. | Cette option n'est pas une option de rendu mais elle est utilisée pour définir le lien vers le document cible à la révision voulue |
enum
Les options sont définies dans le manuel de référence
Option | Description de l'option d'affichage "Dynacase Core" | Équivalence "Dynacase Document UI" |
---|---|---|
boolcolor |
Indique que l'énuméré sera représenté (en consultation) par un carré de couleur. | Pas d'équivalence directe. Peut être implémenté par du code spécifique au moyen des événements. |
eformat |
Indique le mode d'affichage de l'énuméré. | setDisplay() |
esort |
Indique l'ordre dans lequel les entrées seront listées. | Pas d'équivalence |
etype |
Indique si la valeur est restreinte aux valeurs de la liste. | Pas d'équivalence |
eunset |
Indiquer que l'énuméré sera vide par défaut. | useFirstChoice() |
mselectsize |
Indique le nombre d'items présentés pour les énumérés multiples lorsque l'option eformat est list . |
Non applicable |
file
Les options sont définies dans le manuel de référence
Option | Description de l'option d'affichage "Dynacase Core" | Équivalence "Dynacase Document UI" |
---|---|---|
inline |
Indique si le fichier doit être consulté directement dans le navigateur. | setContentDispositionInline() |
pdffile |
Utilisé conjointement avec l'option viewfiletype, indique l'attribut contenant le fichier pdf à afficher. | Pas d'équivalence |
preventfilechange |
Ajoute une contrainte pour que le fichier à remplacer provienne de la dernière version du serveur. | Pas d'équivalence |
viewfileheigth |
Utilisé conjointement avec l'option viewfiletype, indique la hauteur du rendu affiché sur le navigateur. | Pas d'équivalence |
viewfiletype |
Indique qu'une prévisualisation du fichier sera disponible dans le navigateur, ne nécessitant donc pas de logiciel tiers. | Pas d'équivalence |
frame
Les options sont définies dans le manuel de référence
Option | Description de l'option d'affichage "Dynacase Core" | Équivalence "Dynacase Document UI" |
---|---|---|
bgcolor |
Indique la couleur de fond du cadre. | Règle css |
viewonfly |
Indique que le contenu du tab est chargé dynamiquement lorsque l'utilisateur clique sur l'onglet. | Non applicable |
firstopen |
Indique que cet onglet doit être sélectionné à l'ouverture du document. | setOpenFirstTab() |
htmltext
Les options sont définies dans le manuel de référence
Option | Description de l'option d'affichage "Dynacase Core" | Équivalence "Dynacase Document UI" |
---|---|---|
doclink |
Active l'option doclink du HTMLEditor. | Pas d'équivalence |
editheight |
Indique la hauteur de la zone d'édition. | setHeight() |
jsonconf |
Cette option permet de configurer finement l'éditeur de texte WYSIWYG. | setCkEditorConfiguration() |
toolbar |
Indique le template à utiliser pour la barre de menu. | setToolbar( ) |
toolbarexpand |
Indique si la barre de menu doit être dépliée lors de l'affichage de l'éditeur. | setToolbarStartupExpanded() |
allowedcontent |
Indique que la liste des balises autorisées n'est pas liée au menu. | setCkEditorAllowAllTags() |
image
Les options sont définies dans le manuel de référence
Option | Description de l'option d'affichage "Dynacase Core" | Équivalence "Dynacase Document UI" |
---|---|---|
iwidth |
Indique la largeur de l'image dans l'interface web de consultation. | setThumbnailWidth() |
longtext
Les options sont définies dans le manuel de référence
Option | Description de l'option d'affichage "Dynacase Core" | Équivalence "Dynacase Document UI" |
---|---|---|
editheight |
Indique la hauteur du textarea correspondant. | setMaxDisplayedLineNumber() |
menu
Les options sont définies dans le manuel de référence
Option | Description de l'option d'affichage "Dynacase Core" | Équivalence "Dynacase Document UI" |
---|---|---|
barmenu |
Indique que la popup doit s'ouvrir avec la barre de menus du navigateur. | setTarget() |
global |
Indique que l'action effectuée par le menu n'est pas liée à un document en particulier. | Pas d'équivalence |
lconfirm |
Indique qu'une confirmation doit être demandée avant activation du lien. | confirmMenu() |
lcontrol |
Indique que le menu est disponible uniquement dans le menu contextuel du document, lorsque la touche control est appuyée. | Non applicable |
mheight |
Indique la hauteur de la fenêtre popup. | setTarget() |
mtarget |
Indique le name de la fenêtre cible de l'hyperlien. | setTarget() |
mwidth |
Indique la largeur de la fenêtre popup. | setTarget() |
onlyglobal |
Utilisé conjointement avec l'option global, indique que le menu ne doit pas apparaître sur le document. | Non applicable |
submenu |
Indique que le menu doit avoir un menu parent. | appendElement() |
tconfirm |
Indique la question apparaissant pour la confirmation (ce doit être une question fermée). | confirmMenu() |
text
Les options sont définies dans le manuel de référence
Option | Description de l'option d'affichage "Dynacase Core" | Équivalence "Dynacase Document UI" |
---|---|---|
esize |
Valeur de l'attribut @size de l'input correspondant. | setMaxLength() |
Ce chapitre décrit les différentes méthodes mises à disposition par le contrôleur interne pour manipuler le document.
Ce chapitre détaille le fonctionnement du widget de document. Il explicite les différents éléments le composant et les relations entre ces éléments.
Le client document est composé des éléments suivants :
documentController
: cet élément permet d'interagir avec le document,document
: l'objet document est un objet interne qui contient les informations sur le document en cours,attribut
: l'objet attribut est un objet interne qui contient les informations sur un attribut,widget
: l'objet widget est un objet interne, indépendant du document, qui permet de représenter une partie de
celui-ci (type d'attribut, élément d'interface (menu, propriétés, etc.). Chaque widget est autonome et peut-être utilisé
en dehors du cadre du document pour construire des interfaces.Ce chapitre présente la cinématique des éléments fondamentaux du widget de document.
La légende des schémas suivants est :
Ce schéma montre le comportement du document lors du chargement d'un nouveau widget document.
Figure 56. Initialisation
Le point de départ (Initialisation du widget) est soit déclenché automatiquement (chargement d'une nouvelle page), soit à la demande du widget document.
Le controller
se charge d'effectuer toutes les opérations nécessaires au rendu du document
(initialisation des objets internes, récupération des données et représentation des données).
En cas d'erreur, un message est affiché à l'utilisateur.
Les événements déclenchés sont les suivants :
1
: attributeReady
2
: ready
(document)Figure 57. Sauvegarde
La sauvegarde du document est déclenchée soit via une action utilisateur (clic sur un menu) ou via le controller
(dans ce cas le schéma commence à l'émission de l'événement 2
).
La sauvegarde serveur peut échouer pour plusieurs raisons :
Les événements déclenchés sont les suivants :
1
: actionClick
2
: beforeSave
3
: constraint
4
: validate
5
: afterSave/close
6
: attributeReady
7
: ready
Figure 58. Changement de document
Le changement de document peut-être déclenché soit via le menu, via des liens internes ou via le controller
(dans
ce cas le schéma commence à l'émission de l'événement 1).
Le changement de document peut échouer pour :
Les événements déclenchés sont les suivants :
1
: beforeClose
2
: attributeReady
3
: ready
(document ready)attributeReady
des attributs de l'onglet arrivent après le
ready
du document.La suppression d'un document est une suppression logique : mise à la corbeille. Un document supprimé reste visible mais n'est plus modifiable.
Figure 59. Suppression de document
La suppression d'un document peut-être déclenchée soit via le menu soit via le controller
(dans
ce cas le schéma commence à l'émission de l'événement 2
).
Cette opération est la seule conduisant à la suppression de l'objet interne document. Celui-ci est automatiquement réinstancié une fois la suppression terminée et le document supprimé est ensuite affiché.
Les événements déclenchés sont les suivants :
1
: actionClick
2
: beforeDelete
3
: afterDelete/close
4
: attributeReady
5
: ready
(document)Figure 60. Changement d'une valeur via l'interface
l'appel à la contrainte se fait après le changement de la valeur de l'attribut, la contrainte ne permet donc que d'afficher un message (et ne peut en aucun cas empêcher la saisis de la valeur. Néanmoins, l'enregistrement sur le serveur pourra être interdit en cas de contrainte non respectée.
Les événements déclenchés sont les suivants :
1
: change
2
: constraint
Figure 61. Changement d'une valeur via le controller
l'appel à la contrainte se fait après le changement de la valeur de l'attribut, la contrainte ne permet donc que d'afficher un message (et ne peut en aucun cas empêcher la saisis de la valeur. Néanmoins, l'enregistrement sur le serveur pourra être interdit en cas de contrainte non respectée.
Les événements déclenchés sont les suivants :
1
: change
2
: constraint
Le contrôleur de document possède quelques objets internes pour pouvoir identifier le document en cours et interagir avec le document. Ces objets se retrouvent notamment dans les événements et via l'api du widget.
L'objet document décrit le document en cours. C'est un objet javascript contenant les propriétés suivantes :
id
initid
title
family
objet décrivant la famille en cours, et contenant les propriétés suivantes :
title
name
id
icon
icon
revision
status
viewId
renderMode
mode de rendu en cours, parmi :
edit
view
isModified
(booléen)hasUploadingFiles
(booléen)L'objet attribut décrit un attribut du document en cours. Il contient les propriétés et méthodes suivantes :
id
getProperties()
: {}
getOptions()
: {}
getOption(optionId)
: string|{}
optionId
,
retourne null
, si l'option n'existe pas.setOption(optiondId, value)
: $
optionId
,getValue(type)
: {value:, displayValue:}
retourne la valeur (typée) de l'attribut en cours.
L'option facultative type
permet d'avoir les valeurs suivantes :
current
value
: valeur brute, displayValue
: valeur formatée,previous
value
: valeur brute, displayValue
: valeur formatée,initial
value
: valeur brute, displayValue
: valeur formatée,all
(valeur par défaut)setValue(newValue)
: $
value
.
La donnée displayValue
est aussi nécessaire si celle-ci est différente de value
.
Pour les attributs à valeurs multiple, le valeur doit être un tableau de valeur.getLabel()
: text
setLabel(newLabel)
: $
isModified()
: bool
true
si la valeur a été modifiée.Cet objet permet de piloter la fenêtre de transition. Il contient les propriétés et méthodes suivantes :
$el
nextState
transition
getValues()
hide()
show()
close()
L'objet menu décrit un menu du document en cours. Il permet de piloter le menu. Il contient les propriétés et méthodes suivantes :
id
(string)identifiant du menu
Si l' id
est undefined
, alors le menu demandé n'existe pas.
type
(string)type de menu, parmi :
itemMenu
listMenu
dynamicMenu
separatorMenu
label
(string)htmlLabel
(string)tooltipLabel
tooltipHtml
(boolean)htmlAttributes
(object)visibility
(string)Visibilité du menu, parmi :
visible
hidden
disabled
beforeContent
(string)important
(boolean)iconUrl
(string)url
(string)target
(string)targetOptions
(object)confirmationText
(string)confirmationOptions
(object)Plus d'informations sur les propriétés peuvent être trouvées dans la configuration des menus.
getProperties
Cette méthode retourne la liste des propriétés du menu.
Pas d'arguments
Un objet contenant les propriétés du menu.
Pas d'exception
disable
Cette méthode désactive le menu. Le menu reste visible mais il n'est plus actif.
Si le menu a été masqué via hide
,
il sera réaffiché, mais désactivé.
options
Un objet contenant les propriétés suivantes :
strict
(boolean, false
par défaut)true
une erreur est déclenchée si le menu est non présentsilent
(boolean, false
par défaut)si true
la modification est enregistrée mais pas rendue.
L'appel à la méthode redraw
permet de rendre le menu ensuite.
Utile pour faire un unique rendu après plusieurs modifications.
Pas de retour.
Une erreur si jamais le menu n'existe pas et si le mode strict est à true
.
enable
Cette méthode active le menu.
Si le menu a été masqué via hide
, il sera réaffiché.
options
Un objet contenant les propriétés suivantes :
strict
(boolean, false
par défaut)true
une erreur est déclenchée si le menu est non présentsilent
(boolean, false
par défaut)si true
la modification est enregistrée mais pas rendue.
L'appel à la méthode redraw
permet de rendre le menu ensuite.
Utile pour faire un unique rendu après plusieurs modifications.
Pas de retour.
Une erreur si jamais le menu n'existe pas et si le mode strict est à true
.
hide
Cette méthode cache le menu.
Pour réafficher le menu, il faut utiliser une des méthodes
disable
ou enable
options
Un objet contenant les propriétés suivantes :
strict
(boolean, false
par défaut)true
une erreur est déclenchée si le menu est non présentsilent
(boolean, false
par défaut)si true
la modification est enregistrée mais pas rendue.
L'appel à la méthode redraw
permet de rendre le menu ensuite.
Utile pour faire un unique rendu après plusieurs modifications.
Pas de retour.
Une erreur si jamais le menu n'existe pas et si le mode strict est à true
.
setLabel
Cette méthode modifie le label du menu.
label
options
Un objet contenant les propriétés suivantes :
strict
(boolean, false
par défaut)true
une erreur est déclenchée si le menu est non présentsilent
(boolean, false
par défaut)si true
la modification est enregistrée mais pas rendue.
L'appel à la méthode redraw
permet de rendre le menu ensuite.
Utile pour faire un unique rendu après plusieurs modifications.
Pas de retour.
Une erreur si jamais le menu n'existe pas et si le mode strict est à true
.
setHtmlLabel
Cette méthode modifie le label du menu.
label
options
Un objet contenant les propriétés suivantes :
strict
(boolean, false
par défaut)true
une erreur est déclenchée si le menu est non présentsilent
(boolean, false
par défaut)si true
la modification est enregistrée mais pas rendue.
L'appel à la méthode redraw
permet de rendre le menu ensuite.
Utile pour faire un unique rendu après plusieurs modifications.
Pas de retour.
Une erreur si jamais le menu n'existe pas et le mode strict est à true
.
setUrl
Cette méthode modifie l'url menu.
url
options
Un objet contenant les propriétés suivantes :
strict
(boolean, false
par défaut)true
une erreur est déclenchée si le menu est non présentsilent
(boolean, false
par défaut)si true
la modification est enregistrée mais pas rendue.
L'appel à la méthode redraw
permet de rendre le menu ensuite.
Utile pour faire un unique rendu après plusieurs modifications.
Pas de retour.
Une erreur si jamais le menu n'existe pas et si le mode strict est à true
.
setCssClass
Cette méthode définit les classes css de l'élément de menu.
Il ne faut jamais attribuer de classe directement sur le menu,
car au redraw
, seules les classes définies par setCssClass
seront utilisées.
cssClass
options
`strict` (boolean, `false` par défaut) : si `true` une erreur est déclenchée si le menu est non présent
`silent` (boolean, `false` par défaut) : si `true` la modification est enregistrée mais pas rendue. L'appel à la méthode [`redraw`][redraw] permet de rendre le menu ensuite.
Utile pour faire un unique rendu après plusieurs modifications.
Pas de retour.
Une erreur si jamais le menu n'existe pas et si le mode strict est à true
.
Ajout d'une classe à un menu
var menuId = 'mon-menu', menu = window.dcp.documentController("getMenu", menuId), currentClasses = menu.getProperties().cssClass.split(/\s+/), newClass = 'menu-highlight';
if(-1 === currentClasses.indexOf(newClass)) { curentClasses.push(newClass); menu.setCssClass(currentClasses.join(' ')); }
setIconUrl
Cette méthode définit une icône qui sera présentée avant le texte du menu.
C'est le pendant de la méthode php Dcp\Ui\ItemMenu::setIcon
.
Attention, contrairement à Dcp\Ui\ItemMenu::setIcon
,
la taille de l'image ne peut pas être précisée (l'image peut être retaillée par css,
mais le client devra auparavant charger l'image complète).
iconUrl
options
`strict` (boolean, `false` par défaut) : si `true` une erreur est déclenchée si le menu est non présent
`silent` (boolean, `false` par défaut) : si `true` la modification est enregistrée mais pas rendue. L'appel à la méthode [`redraw`][redraw] permet de rendre le menu ensuite.
Utile pour faire un unique rendu après plusieurs modifications.
Pas de retour.
Une erreur si jamais le menu n'existe pas et si le mode strict est à true
.
redraw
Calcule et affiche le menu.
Dans le cas ou plusieurs des méthodes ci-dessus sont appelées avec l'option silent
,
cette méthode permet de redessiner le menu une unique fois en appliquant tous les changements.
Pas d'argument.
Pas de retour.
Une erreur si jamais le menu n'existe pas et si le mode strict est à true
.
Ces méthodes permettent de manipuler le document en cours d'affichage.
saveDocument
Cette méthode permet de sauver le document en cours. La bannière de chargement est affichée et le document est ensuite re-présenté en édition avec ses nouvelles valeurs.
Les contraintes (cliente et serveur) sont vérifiées. La sauvegarde est
équivalente au clic sur le menu Enregistrer
.
La requête d'enregistrement du document ne débute que lorsque l'ensemble des
téléversements en cours de fichiers ont abouti. La propriété du document hasUploadingFiles
indique s'il y a des téléversement en cours.
options
success
: déprécié
: fonction : cette fonction est appelée après une sauvegarde réussie,
error
: déprécié
: fonction : cette fonction est appelée après une sauvegarde échouée,
customClientData
(valeur par défaut ``)
: objet : cette objet de configuration est transféré au serveur à la place des données par défaut
(voir customClientData).Retourne un objet Promise. Cet objet permet de contrôler la réussite ou l'échec de la sauvegarde du document.
En cas de réussite la structure de l'argument de la fonction de réussite est :
element
: Élément DOM (jquery) du widget de documentcurrentDocument
: un objet document décrivant le document précédent la sauvegarde.nextDocument
: un objet document décrivant le document sauvegardé.En cas d'échec, la structure de l'argument de la fonction d'échec est :
element
: Élément DOM (jquery) du widget de documentcurrentDocument
: un objet document décrivant le document courant.nextDocument
: null
(pas de document sauvegardé).errorMessage
: Message d'erreur composé de 2 parties :
code
: code erreurcontentText
: message d'erreurSi la sauvegarde est annulée par lors de l'événement beforeSave alors la promise passe en échec.
Pas d'exception
window.dcp.document.documentController("saveDocument");
deleteDocument
Cette méthode permet de supprimer le document. Cette suppression est une suppression logique, le document est marqué comme étant supprimé.
Aucun message de demande de confirmation n'est présenté à l'utilisateur.
options
success
déprécié
: fonction : cette fonction est appelée après une suppression réussie,
error
déprécié
: fonction : cette fonction est appelée après une suppression échouée,
customClientData
(valeur par défaut ``)
: objet : cette objet de configuration est transféré au serveur à la place des données par défaut
(voir customClientData).Retourne un objet Promise. Cet objet permet de contrôler la réussite ou l'échec de la suppression du document.
En cas de réussite la structure de l'argument de la fonction de réussite est :
element
: Élément DOM (jquery) du widget de documentcurrentDocument
: un objet document décrivant le document précédent.nextDocument
: un objet document décrivant le document supprimé.En cas d'échec, la structure de l'argument de la fonction d'échec est :
element
: Élément DOM (jquery) du widget de documentcurrentDocument
: un objet document décrivant le document courant.nextDocument
: null
(pas de document suivant).errorMessage
: Message d'erreur composé de 2 parties :
code
: code erreurcontentText
: message d'erreurSi la sauvegarde est annulée par lors de l'événement beforeDelete alors la promise passe en échec.
Pas d'exception
window.dcp.document.documentController("deleteDocument");
restoreDocument
Cette méthode permet de restaurer un document supprimé.
options
success
déprécié
: fonction : cette fonction est appelée après une suppression réussie,
error
déprécié
: fonction : cette fonction est appelée après une suppression échouée,
customClientData
(valeur par défaut)
: objet : cette objet de configuration est transféré au serveur à la place des données par défaut
(voir customClientData).Retourne un objet Promise. Cet objet permet de contrôler la réussite ou l'échec de la restauration du document.
En cas de réussite la structure de l'argument de la fonction de réussite est :
element
: Élément DOM (jquery) du widget de documentcurrentDocument
: un objet document décrivant le document précédent.nextDocument
: un objet document décrivant le document restauré.En cas d'échec, la structure de l'argument de la fonction d'échec est :
element
: Élément DOM (jquery) du widget de documentcurrentDocument
: un objet document décrivant le document courant.nextDocument
: null
(pas de document suivant).errorMessage
: Message d'erreur composé de 2 parties :
code
: code erreurcontentText
: message d'erreurPas d'exception
window.dcp.document.documentController("restoreDocument");
fetchDocument
Cette méthode permet de charger un autre document, en édition ou en consultation.
Si des modifications sont non enregistrées, un message est présenté à l'utilisateur pour lui demander s'il valide le rechargement de la page et la perte de ses données.
documentOptions
initid
obligatoire
: identifiant du document à charger
revision
(optionnel)
: numéro de révision (-1 par défaut pour indiquer la dernière révision applicable),
viewId
(optionnel)
: indique le rendu demandé.
Les rendus par défaut sont disponibles par les mots-clés suivants :
!defaultConsultation
(par défaut)
: indique le rendu par défaut de consultation,
!defaultEdition
: indique le rendu par défaut de modification.
customClientData
(valeur par défaut ``)
: objet : cet objet de configuration est transféré au serveur à la place des customClientData
fetchOptions
force
:
: booléen : Si l'option est à true
, aucune confirmation n'est demandée
à l'utilisateur dans le cas où le document à remplacer est modifié et non
enregistré. Par défaut, la valeur est false
.
success
Deprecié
: fonction : cette fonction est appelée après une sauvegarde réussie,
error
Deprecié
: fonction : cette fonction est appelée après une sauvegarde échouée,Retourne un objet Promise. Cet objet permet de contrôler la réussite ou l'échec de l'affichage du document.
En cas de réussite la structure de l'argument de la fonction de réussite est :
element
: Élément DOM (jquery) du widget de documentcurrentDocument
: un objet document décrivant le document courant.nextDocument
: un objet document décrivant le document suivant.En cas d'échec, la structure de l'argument de la fonction d'échec est :
element
: Élément DOM (jquery) du widget de documentcurrentDocument
: un objet document décrivant le document courant.nextDocument
: null
(pas de document suivant).errorMessage
: Message d'erreur composé de 2 parties :
code
: code erreurcontentText
: message d'erreurSi l'utilisateur à choisi de rester sur le formulaire dans le cas d'un document
non enregistré, le code erreur sera : USERCANCEL
.
Si la sauvegarde est annulée par lors de l'événement beforeClose alors la promise passe en échec.
Si l'argument n'est pas un objet ou si l'initid n'est pas renseigné.
Affichage d'un document depuis le contrôleur interne du document :
window.dcp.document.documentController("fetchDocument", {"initid" : 1232});
Log du chargement du document sur la console du navigateur
window.dcp.document.documentController("fetchDocument", { initid: 1234 }, { force: false } ).then(function (data) { console.log("Document "+ data.nextDocument.title+ " has been loaded"); }).catch(function (data) { console.warn(data.errorMessage.contentText); });
reinitDocument
Cette méthode permet de recharger le document.
Le comportement est identique à la méthode fetchDocument
.
La seule différence est que l'argument initid
n'est pas obligatoire. Les
arguments initid
, revision
, viewId
, s'ils n'ont pas été définis,
reprennent les valeurs du document courant.
documentOptions
: Un objet contenant les propriétés suivantes :
initid
: (facultatif) identifiant du document à chargerrevision
: (optionnel) numéro de révision (-1 par défaut pour indiquer la dernière révision applicable)viewId
: (optionnel) indique le rendu demandé.Les rendus par défaut sont disponibles par les mots-clés suivants :
!defaultConsultation
: (par défaut) indique le rendu par défaut de consultation
!defaultEdition
: indique le rendu par défaut de modification.Retourne la donnée , null
si pas de donnée.
Aucune.
window.dcp.document.documentController("reinitDocument") .then(function (data) { data.element.documentController("showMessage", { type: "success", message: "Document " + data.nextDocument.title + " has been reinisialized" }); }).catch(function (data) { data.element.documentController("showMessage", { type: "error", message: data.errorMessage.contentText }); });
changeStateDocument
Cette méthode permet de demander le passage d'une transition pour effectuer un changement d'état pour le document en cours.
La demande de transition se déroule en trois temps :
ask
ou demande un commentaire ou affiche juste
le processus de transition si il n'y a ni ask
, ni commentaire demande, la fenêtre n'est pas affichée si le
changement est unattented
,parameters
: Paramètres de la transitionnextState
obligatoire
: nouvel état du document
transition
obligatoire
: identifiant de la transition à effectuer
unattended
booléen
: la fenêtre de changement d'état n'est pas affichée et les ask
ne sont pas affichés, si jamais des ask
sont
obligatoires et non valués le changement d'état échoue
values
(objet)
: ensemble des valeurs du askdocumentOptions
: Paramétrage de l'affichage du widget document après la transition,initid
(par défaut : initid en cours)
: identifiant du document
revision
(par défaut : révision en cours)
: numéro de révision (-1 pour indiquer la dernière révision applicable)
viewId
(par défaut : vue en cours)
: indique le rendu demandé.
Les rendus par défaut sont disponibles par les mots-clés suivants :
!defaultConsultation
: indique le rendu par défaut de consultation,
!defaultEdition
: indique le rendu par défaut de modification.
customClientData
(valeur par défaut ``)
: objet : cet objet de configuration est transféré au serveur à la place des customClientData
(voir customClientData).transitionOption
: fonction appelée en cas de transition réussie après la réinitialisation du documentsuccess
déprécié
: fonction : cette fonction est appelée après une transaction réussie,
error
déprécié
: fonction : cette fonction est appelée après une transaction échouéeRetourne un objet Promise. Cet objet permet de contrôler la réussite ou l'échec du passage de la transition.
En cas de réussite la structure de l'argument de la fonction de réussite est :
element
: Élément DOM (jquery) du widget de documentcurrentDocument
: un objet document décrivant le document courant.nextDocument
: un objet document décrivant le document suivant.En cas d'échec, la structure de l'argument de la fonction d'échec est :
element
: Élément DOM (jquery) du widget de documentcurrentDocument
: un objet document décrivant le document courant.nextDocument
: null
(pas de document suivant).errorMessage
: Message d'erreur composé de 2 parties :
code
: code erreurcontentText
: message d'erreurSi l'argument n'est pas un objet ou si le nextState et la transition ne sont pas valués.
Demande de changement d'état simple (avec fenêtre de ask)
window.dcp.document.documentController("changeStateDocument", { "nextState": "zoo_transmited", "transition" : "zoo_Ttransmited"} );
Demande de changement d'état sans ask
window.dcp.document.documentController("changeStateDocument", { "nextState": "zoo_transmited", "transition" : "zoo_Ttransmited", "unattended" : true});
Demande de changement d'état sans ask et en passant en mode édition
window.dcp.document.documentController("changeStateDocument", { "nextState": "zoo_transmited", "transition" : "zoo_Ttransmited", "unattended" : true }, { "viewId" : "!defaultEdition" });
getCustomServerData
Cette méthode permet de récupérer les données complémentaires émises par la vue.
Aucun.
Retourne la donnée ; null
si pas de donnée.
Aucune.
Récupération de la donnée complémentaire
window.dcp.document.documentController("getServerCustomData");
addCustomClientData
Cette méthode permet d'enregistrer des données complémentaires transmises lors de la sauvegarde, suppression, rechargement du document.
La donnée complémentaire est effacée lorsque la commande réussit (avant que les callback soit appelés).
Ces données sont transmises au rendu de document via la méthode
setCustomClientData
.
Pour les enregistrements (POST
et PUT
), la donnée est envoyée dans le
contenu en json dans l'index "customClientData".
Pour les consultations (GET
) et suppressions (DELETE
), la donnée est envoyée
encodée en json dans l'url avec la variable "customClientData".
Trois types de passage d'arguments sont possibles :
data
(objet)contrainte
(fonction)true
lors du prochain échange réseau. Cette contrainte reçoit en entrée les mêmes paramètres que les
documentCheck.data
(objet)object
(objet)documentCheck
: (optionnel) fonction :
les données ne sont envoyées que si cette function retourne true
lors du prochain échange réseau. Cette contrainte reçoit en entrée les mêmes paramètres que les
documentCheck.
once
(booléen) true
par défaut
:false
alors le customClientData
est persistent (il n'est pas effacé après une transaction réseau).
Il n'est effacé qu'au moyen de la méthode removeCustomClientData.data
(objet)Aucun.
Aucune.
Enregistrement de la donnée complémentaire sur le "ready" du document.
window.dcp.document.documentController( "addEventListener", "ready", { "name": "my.clientCustom", "documentCheck": function (ddui) { return ddui.family.name === "MY_FAMILY" } }, function (event, ddui, data) { $(this).documentController("addCustomClientData", {"hello":"world"}); } );
Enregistrement d'une fonction persistante uniquement pour les documents de type MY_FAMILY
window.dcp.document.documentController("addEventListener", "ready", { "name": "my.clientCustom", "documentCheck": function (ddui) { return ddui.family.name === "MY_FAMILY"; } }, function (event, ddui, data) { $(this).documentController("addCustomClientData", {"once" : false, "documentCheck" : function (ddui) { return ddui.family.name === "MY_FAMILY"; }, {"hello":"world"}); } );
Dans cet exemple, les données complémentaires sont envoyées pour la requête suivante et non la requête courante.
setCustomClientData
Cette méthode est dépréciée au profit de addCustomClientData
getCustomClientData
Cette méthode permet de récupérer les données précédemment enregistrées par la
méthode addCustomClientData
.
Aucun.
Les valeurs enregistrées. null
si pas de valeur.
Aucune.
Récupération de la donnée complémentaire :
window.dcp.document.documentController("addCustomClientData", {"hello":"world"}); var myData=window.dcp.document.documentController("getCustomClientData"); console.log(myData.hello); // => see "world"
removeCustomClientData
Cette méthode permet de supprimer des données précédemment enregistrées par la
méthode addCustomClientData
.
key
: clef à supprimerAucune.
Aucune.
hideAttribute
Cette méthode permet de cacher un attribut affiché.
Les attributs invisibles (en consultation : I, H, et O ; en modification : I, H et R) ne peuvent ni être cachés, ni montrés.
attributeId
(string)Pas de retour
Si le nom de l'attribut n'existe pas
window.dcp.document.documentController("hideAttribute", "animal_title");
showAttribute
Cette méthode permet de montrer un attribut caché.
Les attributs invisibles (en consultation : I, H, et O ; en modification : I, H et R) ne peuvent ni être cachés, ni montrés.
attributeId
(string)Pas de retour
Si le nom de l'attribut n'existe pas
window.dcp.document.documentController("showAttribute", "animal_title");
showMessage
Cette méthode permet d'afficher un message à l'utilisateur.
Il se présente dans une notification en haut à droite de l'écran.
message
(string|object)type
: l'importance du message parmi
* info
(valeur par défaut),
* error
,
* warning
* success
* notice
message
(plein texte)
: le contenu du message.Pas de retour
Pas d'exception
window.dcp.document.documentController("showMessage", "Bonjour utilisateur");
setAttributeErrorMessage
Cette méthode permet d'afficher un message d'erreur à l'utilisateur sous la même forme qu'une contrainte (c'est à dire faisant référence à un attribut).
Pas de retour
Si le nom de l'attribut n'existe pas
window.dcp.document.documentController("setAttributeErrorMessage", "ba_title", "Le titre est obligatoire");
cleanAttributeErrorMessage
Cette méthode permet de supprimer tous les messages d'erreur affichés sur un attribut.
Pas de retour.
Si le nom de l'attribut n'existe pas.
Supprime tous les messages d'erreur sur l'attribut ba_title
.
window.dcp.document.documentController("cleanAttributeErrorMessage", "ba_title");
selectTab
Cette méthode permet de sélectionner un onglet du document.
Note : les événements attributeBeforeTabSelect
et
attributeAfterTabSelect
sont déclenchés à la fin de la génération.
L'objet jQuery.
Si le nom de l'attribut n'existe pas. Si l'attribut n'est pas un onglet.
Affiche l'onglet my_tab
.
window.dcp.document.documentController("selectTag", "my_tab");
drawTab
Cette méthode permet de forcer la génération du contenu d'un onglet. Par défaut seul un des onglets est produit et affiché. Les autres onglets sont générés que lorsqu'ils sont sélectionnés.
Note : l'événement attributeReady
est déclenché à la fin de la génération.
Si l'onglet est déjà généré ou en cours de génération, rien ne se passe.
L'objet jQuery.
Si le nom de l'attribut n'existe pas. Si l'attribut n'est pas un onglet.
Prépare la génération de tous les onglets.
window.dcp.document.documentController("addEventListener", "ready", function (event, documentObject, message) { var _this=this; var attrs=_this.documentController("getAttributes"); attrs.forEach(function (attr) { if (attr.getProperties().type === "tab") { _this.documentController("drawTab", attr.id); } }); } );
Ces méthodes permettent de récupérer et de modifier les valeurs du document en cours.
getProperties
Cette méthode retourne les propriétés du document en cours sous la forme d'un objet.
Pas d'arguments
Objet
Pas d'exception
window.dcp.document.documentController("getProperties");
retourne
{ "id": 1435, "title": "12/05/1985", "family": { "title": "Test tout type", "name": "TST_ALLTYPE", "id": 1430, "icon": "resizeimg.php?img=Images%2Fdoc.png&size=24" }, "icon": "resizeimg.php?img=Images%2Fdoc.png&size=24", "revision": 0, "status": "alive", "initid": 1435, "viewId": "!defaultEdition", "renderMode": "edit", "isModified": false }
getProperty
Cette méthode retourne une propriété du document en cours.
property
(string)Suivant la propriété demandée.
Si la propriété n'existe pas, le retour est undefined
.
Pas d'exception
window.dcp.document.documentController("getProperty", "title")
retourne
"COLLET Noah"
hasAttribute
Cette méthode retourne true si l'attribut est présent dans le document en cours.
attributeId
(string): nom de l'attribut
Un Booléen.
Pas d'exception
Ajout d'une méthode hasAttribute
function (attributeId) { var hasAttribute = window.dcp.document.documentController("hasAttribute",attributeId) console.log("l'attribut ", attributeId, "est présent dans le document ?", hasAttribute) }
getAttributes
Cette méthode retourne la liste des attributs du document en cours.
Pas d'arguments
Un tableau d'objet attributs.
Pas d'exception
Ajout d'une méthode getAttributes
function () { var getAttributes = window.dcp.document.documentController("getAttributes") console.log("les attribut du document sont :", getAttributes) }
getAttribute
Cette méthode retourne un attribut du document en cours.
attributeId
(string)Un objet attribut.
Retourne null
, si l'attribut n'existe pas.
Pas d'exception
Ajout d'une méthode getAttribute
function (attributeId:string) { var getAttribute = window.dcp.document.documentController("getAttribute",attributeId) console.log("voici l'attribut ", attributeId, " : ", getAttribute) }
getValues
Cette méthode retourne les valeurs des attributs du document en cours.
pas d'argument
Un objet indexé par les noms des attributs, et pour chaque attribut les clés suivantes :
value
displayValue
Pas d'exception
window.dcp.document.documentController("getValues")
retourne
{ "zct_civility": { "value": null, "displayValue": null }, "zct_lname": { "value": "COLLET", "displayValue": "COLLET" }, "zct_fname": { "value": "Noah", "displayValue": "Noah" }, "zct_mail": { "value": "noah142@zoo.net", "displayValue": "noah142@zoo.net" }, "zct_photo": { "value": null, "displayValue": null }, "zct_phone": { "value": null, "displayValue": null }, "zct_mobile": { "value": null, "displayValue": null }, "zct_workaddr": { "value": null, "displayValue": null }, "zct_workpostalcode": { "value": null, "displayValue": null }, "zct_worktown": { "value": "Châteauroux", "displayValue": "Châteauroux" } }
getValue
Cette méthode retourne la valeur d'un attribut du document en cours.
attributeId
(string)Un objet
Si l'attribut n'existe pas
window.dcp.document.documentController("getValue", "zct_civility")
retourne
{ "value":null, "displayValue":null }
setValue
Cette méthode met à jour la valeur d'un attribut du document en cours.
attributeId
(string)value
(object)value
: valeur brute de l'attribut, (obligatoire)
displayValue
: valeur de l'attribut présentée aux utilisateurs.Suivant les types d'attribut, la valeur peut nécessiter d'autres informations.
Si displayValue
n'est pas renseignée, elle sera affectée à la valeur de value
.
Pour les attributs multivalués (attributs dans les tableaux ou avec l'option multiple=yes
),
la valeur doit renseigner un "index" pour indiqué le rang de l'élément à modifier.
Pas de retour
value
Dans le cas d'un multiple, la valeur doit contenir aussi l'index ou être un tableau.
Dans le cas de nombres multiple dans un tableau, la propriété display value
doit être renseignée (cette valeur ne peut pas utiliser de point comme séparateur de décimal dans un nombre)
Cas d'un attribut texte simple :
window.dcp.document.documentController("setValue", "zct_title", {value: "Bonjour à tous"});
Cas d'un attribut énuméré simple : value
est la clef
window.dcp.document.documentController("setValue", "zct_civility", { value: "M", displayValue: "Monsieur" } );
Cas d'une relation (docid) multiple : affectation du troisième élément
window.dcp.document.documentController("setValue", "zct_annexes", { value : "9876", displayValue:"Conjecture de Hodge", index: 2 } );
Cas d'une date dans un tableau : affectation du premier élément
window.dcp.document.documentController("setValue", "zct_dates", { value : "1999-12-25", index: 0 } );
Si l'index est égal au nombre d'élément déjà présent dans le tableau, une rangée est ajoutée avec la nouvelle valeur. Si l'index dépasse le nombre d'élément, des rangées supplémentaires sont ajoutées. Ces rangées supplémentaires contiennent les valeurs par défaut.
Cas d'une relation (docid) multiple : affectation de 3 éléments
window.dcp.document.documentController("setValue","zct_mathematical_problems", [ {value:"1978", displayValue:"Équations de Navier-Stokes"}, {value:"2032", displayValue:"Conjecture de Poincaré"}, {value:"2123", displayValue:"Hypothèse de Riemann"} ] );
Cas de nombres dans un tableau : affectation d'une colonne avec 3 éléments. Le résultat produit un tableau avec 3 rangées.
window.dcp.document.documentController("setValue","zct_widths", [ {value: 187.5}, {value: 209.56}, {value: -12.5} ] );
Dans ce cas, si le nombre d'éléments est inférieur au nombre de rangées, les rangées supérieures à ce nombre d'éléments sont supprimées. Si le nombre est supérieur aux nombres de rangée, des rangées supplémentaires sont ajoutées. Ces rangées supplémentaires contiennent les valeurs par défaut.
Cas de relation multiple dans un tableau : affectation de 3 liens dans la cellule "zct_annexes" de la rangée n°2. Dans ce cas, la valeur contient un tableau de valeurs. Il n'est pas possible de modifier directement un sous-index particulier des relations multiples dans les tableaux.
window.dcp.document.documentController("setValue","zct_annexes", { index : 1, value: [ {value:"4948", displayValue:"Conjecture de Birch et Swinnerton-Dyer"}, {value:"1032", displayValue:"Équations de Yang-Mills"}, {value:"2123", displayValue:"Hypothèse de Riemann"} ] } );
appendArrayRow
Cette méthode permet d'ajouter une ligne à la fin d'un attribut de type tableau.
Si une des colonnes du tableau n'est pas renseignée, la valeur par défaut sera utilisée.
attributeId
values
value
: valeur brute de l'attribut,
displayValue
: valeur de l'attribut présenté aux utilisateurs.Pas de retour
Insérer une ligne à la fin du tableau
window.dcp.document.documentController("appendArrayRow", "zct_array_numbers", { zct_integers:{value:12}, zct_doubles:{value:3.1415}, zct_moneys:{value:12.5} } );
insertBeforeArrayRow
Cette méthode permet d'ajouter une ligne avant une ligne d'un attribut de type tableau.
attributeId
values
value
: valeur brute de l'attribut,
displayValue
: valeur de l'attribut présenté aux utilisateurs.index
(int)Pas de retour
Insérer une ligne en première place d'un tableau :
window.dcp.document.documentController( "insertBeforeArrayRow", "tst_apibase_array", { "tst_dates" :{ value : "1985-05-13" } }, 0 );
removeArrayRow
Cette méthode permet de supprimer une ligne d'un tableau.
attributeId
(string)index
(int)Pas de retour
Supprimer la première ligne d'un tableau
window.dcp.document.documentController("removeArrayRow", "tst_apibase_array", 0)
Ces méthodes permettent de manipuler les menus du document.
Les menus dynamiques (dont la valeur provient du serveur) ne sont pas concernés par ces méthodes.
Cette méthode retourne true
si le menu est présent dans le document.
id
(string): identifiant du menu
Booléen.
Si jamais le modèle n'est pas déjà initialisé.
function (menuId) { var hasMenu = window.dcp.document.documentController("hasMenu",menuId) return console.log("le menu ", menuId , "est-il présent ? ", hasMenu) }
Cette méthode retourne la liste des menus.
Pas d'arguments
Tableau d'objets menu.
Si jamais le modèle n'est pas déjà initialisé
function () { var getMenus = window.dcp.document.documentController("getMenus") return console.log("les menus de mon document sont : ", getMenus) }
Cette méthode retourne un objet menu à partir de son identifiant.
id
(string): identifiant du menu
Objet menu.
Si jamais le modèle n'est pas déjà initialisé
function (menuId) { var getMenu = window.dcp.document.documentController("getMenu",menuId) return console.log("le menu ", menuId , "a pour id ", getMenu.id) }
Il est possible de traduire des chaînes de caractères côté client.
Ces traductions se font au moyen d'un translator, qui expose les méthodes
_
, ___
et getLocale
.
Un translator peut être obtenu au moyen de la fonction window.dcp.getTranslator
getTranslator
catalog
success
Elle reçoit le _translator_ en argument.
error
Elle reçoit le message d'erreur en argument.
Retourne une promise qui peut être utilisée à la place du callback.
Aucune
_
Cette méthode retourne la traduction d'un texte.
key
Retourne la chaîne traduite. Lorsque la traduction en figure pas dans le catalogue, la chaîne non traduite est retournée.
Aucune
___
Cette méthode retourne la traduction d'un texte dans un contexte donné.
key
contexte
Retourne la chaîne traduite. Lorsque la traduction en figure pas dans le catalogue pour le contexte demandé, la chaîne non traduite est retournée.
Aucune
getLocale
Cette méthode retourne un objet décrivant la locale de ce catalogue.
aucun
Retourne un objet conforme à la description de locale de dynacase
Aucune
Il est possible de générer un translator à partir d'un catalogue au moyen de la fonction
window.dcp.translatorFactory
.
translatorFactory
Retourne un nouvel objet translator à partir du catalogue passé en argument
catalog
Le format des ces objets est défini dans le manuel de référence.
Un translator, avec les méthodes _
,
___
et
getLocale
.
Si le catalogue n'est pas du JSON valide, le translator retourné ne contient que des traductions vides.
Aucune
La génération du catalogue est couverte par le chapitre correspondant du manuel de référence
Le format du catalogue est couvert par le chapitre correspondant du manuel de référence
Ces méthodes permettent de programmer des contraintes clientes. Ces contraintes sont appliquées localement et ne permettent pas une vérification de la cohérence des données sécurisée, elles sont toutefois utiles pour améliorer l'ergonomie du document.
Les contraintes sont appliquées sur une instance du widget document. Elles restent donc valables durant toute la vie de cette instance de widget et sont appliquées quelque soit le document représenté par cette instance.
Les contraintes sont appelées à deux moments lors de la vie du document :
Les contraintes enregistrées possèdent toutes un nom logique qui permet de les
identifier. Ce nom logique peut être composé avec un namespace, celui-ci est
séparé du nom logique par un .
.
Ce nom logique est unique : si deux événements sont enregistrés avec le même nom,
le plus récent écrase le plus ancien. Toutes les contraintes ayant le même
namespace peuvent être désinscrites via un appel à la méthode de désinscription
avec le namespace. Soit par exemple, checkAge.animal
, checkPoids.animal
peuvent être supprimées en appelant removeConstraint
avec .animal
.
Une contrainte possède deux pré-conditions :
documentCheck
true
, la contrainte est exécutée par le document en cours, sinon elle est mise en attente ;attributeCheck
true
, la contrainte est exécutée sur l'attribut en cours, sinon elle est mise en attente.Les pré-conditions permettent de n'appliquer les contraintes que dans leur cas d'utilisation et de réduire la charge d'exécution sur le client.
addConstraint
Cette méthode permet de charger une contrainte dans le widget de document. Une fois la contrainte chargée, elle est valide durant toute la vie du widget document.
Une contrainte n'est pas déchargée automatiquement lors du changement d'état du widget document ( changement de document, d'état, etc.).
options
(objet)L'argument décrit la contrainte il contient les champs suivants :
documentCheck
(function javascript, facultative)true
pour indiquer que la contrainte est applicable pour ce type de document.
Par défaut, la contrainte s'applique pour tous les documents.attributeCheck
(function javascript, facultative)true
pour indiquer que la contrainte est applicable pour cet attribut.
Par défaut, la contrainte s'applique à tous les attributs.name
(string, facultative)once
(booléen, facultatif)once
est à true
, la contrainte n'est appliquée qu'une seule fois et ensuite supprimée,constraintCheck
(function javascript)cet argument est une fonction qui est appelée lors de la modification d'un attribut du document. Si une chaine de caractère est renvoyée alors la contrainte est déclenchée, dans ce cas la sauvegarde est annulée. Il est aussi possible de retourner un tableau d'objet avec une clef "message" et une clef "index" Elle reçoit les paramètres suivants :
document
attribute
values
objet décrivant la valeur de l'attribut en cours. Il contient trois valeurs :
current
previous
initial
Le nom de la contrainte est retourné.
Pas d'exception
Ajout d'une contrainte s'appliquant uniquement
ANIMAL
,animal_date
.window.dcp.document.documentController( "addConstraint", { "name": "checkAge.animal", "documentCheck": function(documentObject) { return documentObject.family.name === "ANIMAL" }, "attributeCheck": function(attribute, documentObject) { return attribute.id === "animal_date"; } }, function(documentObject, attribute, value) { if (value.current.value < "1885-05-12") { return "La date doit être inférieure au 12/05/1885"; } } );
Cas d'un attribut inclus dans un tableau. Dans ce cas, la contrainte est indiquée pour une rangée particulière. Cet exemple vérifie si une des valeurs est vide ou non.
Si l'index n'est pas indiqué, alors la contrainte sera affichée pour toutes les rangées.
window.dcp.document.documentController( "addConstraint", { "name": "checkEmpty.child", "documentCheck": function(documentObject) { return documentObject.family.name === "ANIMAL" }, "attributeCheck": function(attribute, documentObject) { return attribute.id === "my_childs"; } }, function(documentObject, attribute, value) { var currentDocids=value.current; // The value is an array for a multiple value _.each(currentDocids, function (aDocid, k) { if (!aDocid.value) { // k is the row number : first row is zero return [{ message : "Ne doit pas être vide", index:k }]; } }); } );
listConstraints
Cette méthode permet de lister les contraintes en cours sur le widget. La liste retournée affiche toutes les contraintes actives ou pas sur le document en cours.
Pas d'argument
Tableau de contraintes
Pas d'exception
Liste les contraintes associées au widget.
window.dcp.document.documentController("listConstraints");
Retourne
[{ documentCheck: function (documentObject) { return documentObject.family.name === "ANIMAL"}, attributeCheck: function (attribute, documentObject) { return attribute.id = "animal_date"}, constraintCheck: function (documentObject, attribute) {…} }]
removeConstraint
Cette méthode permet de supprimer une contrainte ou un ensemble de contraintes sur le widget en cours.
nom
(string)La ou les contraintes supprimées.
Pas d'exception.
Suppression de la contrainte nommée animal ou des contraintes ayant le namespace animal.
window.dcp.document.documentController("removeConstraint", ".animal");
Retour :
[{ documentCheck: function (document) { return document.family.name === "ANIMAL"}, attributeCheck: function (attribute, documentObject) { return attribute.id = "animal_date"}, constraintCheck: function (document, attribute) {…} }]
Ces méthodes et ces événements permettent de réagir aux modifications et à l'évolution du document.
Les écouteurs sont appliqués sur une instance du widget document. Ils restent donc valables durant toute la vie de cette instance de widget et sont déclenchés quel que soit le document représenté par cette instance.
Les écouteurs enregistrés possèdent tous un nom logique qui permet de les identifier.
Ce nom logique est unique. Si deux écouteurs sont enregistrés avec le même nom, le plus récent écrase le plus ancien.
Ce nom logique peut être composé avec un namespace. Celui-ci est
séparé du nom logique par un .
. Tous les écouteurs ayant le même namespace
peuvent être désinscrits via un appel à la méthode de désinscription avec ce
namespace. Soit par exemple, validate.animal
, change.animal
peuvent être
supprimés en appelant removeEvent
avec .animal
.
Une écouteur possède une pré-condition :
documentCheck
true
, l'écouteur est exécuté par le document en cours,
sinon il est mis en attente.Les pré-conditions permettent de n'appliquer les écouteurs que dans leur cas d'utilisation et de réduire la charge d'exécution sur le client.
addEventListener
Cette méthode permet de charger un écouteur dans le widget de document. Une fois l'événement chargé, il est valide durant toute la vie du widget document.
Un évènement n'est pas déchargé automatiquement lors du changement d'état du widget document (changement de document, d'étape, etc.).
type
options
(object)il contient les champs suivants :
documentCheck
(function javascript, facultatif)true
pour indiquer que l'écouteur' est applicable pour ce type de document.
Par défaut l'écouteur s'applique pour tous les documents.name
(string, facultative)nom de l'écouteur. Ce nom est utilisé pour identifier l'écouteur et le supprimer. Le nom peut posséder un namespace. Par défaut un nom est calculé automatiquement.
lorsque le nom correspond à un écouteur déjà enregistré sur ce widget, le nouvel écouteur remplace l'ancien, qui ne seron donc plus déclenché.
once
(booléen, facultatif)true
,
l'écouteur n'est appliqué qu'une seule fois et ensuite supprimé.callback
(function javascript)cette fonction est appelée lorsque l'événement type est émis. Elle reçoit les paramètres suivants :
event
documentObject
attribute
(uniquement sur les événements concernant les attributs)values
(uniquement sur les événement concernant les attributs)objet décrivant la valeur de l'attribut en cours, il contient trois propriétés :
current
previous
initial
Le nom de l'événement est retourné.
Pas d'exception
Ajout d'un écouteur s'appliquant uniquement sur le changement des attributs de la famille ANIMAL
.
window.dcp.document.documentController("addEventListener", "change", { "name": "alertChange.animal", "documentCheck": function(documentObject) { return documentObject.family.name === "ANIMAL" } }, function(event, documentObject, attribute, value) { alert(value.currentValue); } );
Ajout d'un écouteur s'appliquant uniquement sur les messages de la famille ANIMAL
et annulant les événements reçus.
window.dcp.document.documentController("addEventListener", "displayMessage", { "name": "preventMessages.animal", "documentCheck": function(documentObject) { return documentObject.family.name === "ANIMAL" } }, function(event, documentObject, message) { event.preventDefault(); } );
listEventListeners
Cette méthode permet de lister les écouteurs attachés au widget. La liste retournée ne préjuge pas de si les événements sont actifs ou pas sur le document en cours.
Pas d'argument
Tableau d'écouteurs
Pas d'exception
window.dcp.document.documentController("listEventListeners");
retourne
[{ "documentCheck" : function(document) {...}, "eventCallback": function(event, document, data) {...}, "eventType" : "change", "name" : "alertChange.animal" },{ "documentCheck" : function(document) {...}, "eventCallback": function(event, document, data) {...}, "eventType" : "displayMessage", "name" : "preventMessages.animal" }]
removeEventListener
Cette méthode permet de supprimer un écouteur ou un ensemble d'écouteurs sur le widget en cours.
nom
(string)Le ou les écouteur(s) supprimé(s).
Pas d'exception.
Suppression des événements ayant le namespace animal
.
window.dcp.document.documentController("removeEventListener", ".animal");
Retourne
[{ documentCheck: function (document) { return document.family.name === "ANIMAL"}, attributeCheck: function (attribute, documentObject) { return attribute.id = "animal_date"}, constraintCheck: function (document, attribute, response) {... }]
Les événements déclenchés sur le document peuvent être écoutés au moyen de la méthode addEventListener.
Il est possible de ne déclencher le traitement que lorsque le document satisfait certaines conditions au moyen de la fonction définie dans l'option documentCheck
du listener.
Un lien interne de type événement est sélectionné. Ces liens sont de 2 formes :
un élément de type <a>
ou <button>
qui possède un attribut data-action
Dans ce cas, l'action est la valeur de l'attribut data-action
,
et doit être de la forme <type_event>:<option1>:<option2>:…
un élément de type <a>
dont l'attribut href
commence par #action/
Dans ce cas, l'action est la valeur de l'attribut href
,
et doit être de la forme #action/<type_event>:<option1>:<option2>:…
Ces éléments peuvent être présents partout dans la page (menu, template, atribut, lien sur un attribut, etc.)
Lorsqu'un élément de type <a>
contient à la fois
un attribut data-action=<type_event>…
et un attribut href=#action/<type_event>…
,
alors c'est le type d'événement et les options contenus dans l'attribut data-action
qui sont pris en compte.
event
documentObject
options
objet décrivant l'action. Il contient les propriétés suivantes :
target
eventId
<type_event>
du lien présenté ci-dessus),options
Oui. Dans ce cas l'événement associé n'est pas déclenché.
Les actions prédéfinies sur le widget document sont :
Identifiant | options | Description | Exemple |
---|---|---|---|
document.close |
[viewId] |
Demande d'affichage en mode consultation du document courant en utilisant la vue viewId (si viewId n'est pas renseigné, la vue !defaultConsultation est utilisée) |
#action/document.close |
document.create |
Demande de sauvegarde du document courant et de retour en mode modification | #action/document.create |
|
document.createAndClose |
[viewId] |
Demande de sauvegarde du document courant et de retour en mode consultation en utilisant la vue viewId (si viewId n'est pas renseigné, la vue !defaultConsultation est utilisée) |
#action/document.createAndClose |
document.delete |
Demande de suppression du document courant | #action/document.delete |
|
document.edit |
Demande d'affichage en mode modification du document courant | #action/document.edit |
|
document.help |
helpId[:rubriqueId] |
Demande daffichage de l'aide helpId avec un focus sur l'entrée rubriqueId (si rubriqueId n'est pas renseigné, le focus est en haut de l'aide |
#action/document.helpid:MY_FAMILY:my_attribute |
document.history |
[initid] |
Demande d'affichage de l'historique du document ayant la référence initid (si initid n'est pas renseigné, c'est l'historique de document courant qui est affiché) |
#action/document.history |
document.load |
initid[:viewId[:revision]] |
Demande d'affichage du document ayant la référence initid à la place du document courant |
#action/document.load:1234:!defaultConsultation:0 |
document.lock |
Demande de verrouillage du document courant | #action/document.lock |
|
document.properties |
[initid] |
Demande d'affichage des propriétés du document ayant la référence initid (si initid n'est pas renseigné, ce sont les propriétés du document courant qui sont affichées) |
#action/document.properties |
document.restore |
Demande de restauration du document courant | #action/document.restore |
|
document.save |
Demande de sauvegarde du document courant | #action/document.save |
|
document.saveAndClose |
[viewId] |
Demande de sauvegarde du document courant et de retour en mode consultation en utilisant la vue viewId (si viewId n'est pas renseigné, la vue !defaultConsultation est utilisée) |
#action/document.saveAndClose |
document.transition |
transitionId:nextStateId |
Demande de passage de la transition transitionId pour arriver à l'état nextStateId
|
#action/document.transition:my_transition:my_nextstate |
document.transitionGraph |
Demande d'affichage du graphe de transitions | #action/document.transitionGraph |
|
document.unlock |
Demande de déverrouillage du document courant | #action/document.unlock |
Cet exemple affiche un confirm
demandant de valider pour sauvegarder.
window.dcp.document.documentController("addEventListener", "actionClick", { "name": "doubleCheck" }, function changeDisplayError(event, documentObject, options) { //identify the good click if (options.eventId === "document.save") { if (!confirm("Voulez vous sauver ?")) { event.preventDefault(); } } } );
Le document va être remplacé par un autre document. Soit pour un changement de rendu (passage de édition à consultation) ou un changement de document (mais pas lors de la sauvegarde ni de la suppression).
L'événement n'est pas déclenchée si l'url de la page est changée ("unload" de la page).
L'événement est déclenché par l'historique du navigateur si des changements de document ont été réalisés.
event
currentDocumentObject
nextDocumentObject
customData
Oui. Dans ce cas, le document courant reste affiché et le document suivant n'est pas affiché.
Cet exemple
addAnimalEvents
) un écouteur sur l'événement beforeClose
,l'écouteur (fonction preventCloseAnimal
) empêche la fermeture du document si
zoo_title
est différent de fermer
edition
.Dans ce cas, il affiche un message pour avertir l'utilisateur qu'il doit changer la valeur.
window.dcp.document.documentController("addEventListener", "ready", { "name": "addAnimalEvent", "documentCheck": function(documentObject) { return documentObject.family.name === "ANIMAL"; } }, function addAnimalEvents() { this.documentController("addEventListener", "beforeClose", { "name": "preventClose.animal", "documentCheck": function(document) { return document.family.name === "ANIMAL"; } }, function preventCloseAnimal(event, currentDocumentObject) { if (currentDocumentObject.renderMode === "edit" && this.documentController("getValue", "zoo_title").value !== "fermer") { event.preventDefault(); this.documentController("showMessage", { "type" : "error", "message" : "If you want close the doc, change the title to fermer" }); } }); } );
Le document a été fermé (quelle que soit la cause : suppression, sauvegarde, changement de rendu, etc.).
cet événement est idéal pour supprimer les écouteurs qui ne sont plus nécessaires.
event
currentDocumentObject
previousDocumentObject
Non
Cet exemple supprime tous les événements de type animal
.
Il doit être utilisé conjointement à l'événement ready
pour gérer l'enregistrement des événements.
window.dcp.document.documentController("addEventListener", "close", { "name": "removeAnimalsEvent", "documentCheck": function(document) { return document.family.name === "ANIMAL"; } }, function(event, document) { this.documentController("removeEventListener", ".animal"); } );
Exemple complet : ajout d'événements au ready
des documents de type ANIMAL
et suppression de ceux-ci au close des documents de type ANIMAL
.
//Ajout de l'événement au ready window.dcp.document.documentController("addEventListener", "ready", { "name": "addAnimalEvent", "documentCheck": function(document) { return document.family.name === "ANIMAL"; } }, function addAnimalEvents() { this.documentController("addEventListener", "beforeClose", { "name": "preventClose.animal", "documentCheck": function(documentObject) { return true; } }, function preventCloseAnimal(event, documentObject) { if (documentObject.renderMode === "edit" && this.documentController("getValue", "zoo_title").value !== "fermer") { event.preventDefault(); this.documentController("showMessage", { "type" : "error", "message" : "If you want close the doc, change the title to fermer" }); } }); } ); //Suppression de l'événement au close window.dcp.document.documentController("addEventListener", "close", { "name": "removeAnimalsEvent", "documentCheck": function(documentObject) { return documentObject.family.name === "ANIMAL"; } }, function(event, documentObject) { // Désenregistrement de addAnimalEvents this.documentController("removeEventListener", ".animal"); } );
Cet événement est renommé attributeDownloadFile
Le document va être supprimé.
event
currentDocumentObject
nextDocumentObject
customData
Oui. Dans ce cas, la suppression est annulée et rien n'est fait.
Cet exemple :
addAnimalEvents
) un écouteur sur l'événement beforeSave
,l'écouteur (fonction preventSaveAnimal
) empêche la suppression du document
zoo_title
est différent de fermer
.Dans ce cas, il affiche un message pour avertir l'utilisateur qu'il doit changer la valeur.
window.dcp.document.documentController("addEventListener", "ready", { "name": "addAnimalEvent", "documentCheck": function(document) { return document.family.name === "ANIMAL"; } }, function addAnimalEvents() { this.documentController("addEventListener", "beforeDelete", { "name": "preventDelete.animal", "documentCheck": function(document) { return document.family.name === "ANIMAL"; } }, function preventDeleteAnimal(event, document) { if (this.documentController("getValue", "zoo_title").value !== "fermer") { event.preventDefault(); this.documentController("showMessage", { "type" : "error", "message" : "If you want to delete the doc, change the title to fermer" }); } }); } );
Le document a été supprimé.
event
currentDocumentObject
previousDocumentObject
Non
Cet exemple affiche le document 42 en consultation après la suppression.
window.dcp.document.documentController("addEventListener", "afterDelete", { "name": "display42" }, function open42(event, document) { this.documentController("fetchDocument", { "initid" : 42, "viewId" : "!defaultConsultation" }); } );
Un message d'erreur est présenté à l'utilisateur. Ce message peut avoir différente causes (plus de réseau, contrainte non respectée, etc.)
event
documentObject
message
objet décrivant le message. L'objet contient les propriétés suivantes :
title
errorCode
code d'erreur du message. Les plus courants sont :
offline
: requête impossible pour cause de réseau,CRUD0211
: un attribut n'est pas au bon format et n'a pas pu être sauvé,CRUD0212
: une contrainte n'est pas respectée.Les autres identifiants d'erreurs peuvent être trouvés dans la documentation de l'API HTTP.
message
htmlMessage
(optionnel)L'élément message peut-être modifié dans le callback de l'événement.
Oui. Dans ce cas le message n'est pas affiché.
Cet exemple modifie le message avant son affichage.
window.dcp.document.documentController("addEventListener", "displayError", { "name": "changeErrorMessage" }, function changeErrorMessage(event, documentObject, message) { if (message.errorCode === "offline") { message.message = "Pas de serveur"; } } );
Cet exemple annule le message d'erreur et le remplace par une alert.
window.dcp.document.documentController("addEventListener", "displayError", { "name": "changeDisplayError" }, function changeDisplayError(event, documentObject, message) { event.preventDefault(); alert(message.message); } );
Un message d'information est présenté à l'utilisateur.
event
documentObject
message
objet décrivant le message. L'objet contient les propriétés suivantes :
title
errorCode
code d'erreur du message. Les plus courants sont :
offline
: requête impossible pour cause de réseau,CRUD0211
: un attribut n'est pas au bon format et n'a pas pu être sauvé,CRUD0212
: une contrainte n'est pas respectée.Les autres identifiants d'erreurs peuvent être trouvés dans la documentation de l'API HTTP.
message
htmlMessage
(optionnel)L'élément message peut-être modifié dans le callback de l'événement.
Oui. Dans ce cas le message n'est pas affiché.
Cet exemple annule le message et le remplace par une alert.
window.dcp.document.documentController("addEventListener", "displayMessage", { "name": "changeDisplayError" }, function changeDisplayError(event, documentObject, message) { event.preventDefault(); alert(message.message); } );
Le document est chargé, l'interface calculée et présentée à l'utilisateur.
Lorsqu'un écouteur pour cet événement est ajouté alors que le document est déjà chargé, cet écouteur est déclenché immédiatement.
Note : Lorsqu'un document a des onglets, cet événement est propagé avant l'affichage du premier onglet.
En effet, l'affichage du contenu des onglets est réalisé lors de la sélection de ce dernier.
Lorsque l'événement ready
est capturé les widgets d'attributs présents dans les onglets ne sont pas encore
affichés que ce soit sur le premier onglet ou les suivants. L'événement attributeReady
d'un attribut onglet est propagé lorsque son contenu est affiché.
Les événements attributeReady
des onglets sont donc propagés après l'événement ready
du document.
event
documentObject
Non
Ajouter un message à chaque chargement de document.
window.dcp.document.documentController("addEventListener", "ready", function(event, documentObject, message) { this.documentController("showMessage", "I'm ready"); } );
Enregistrer un suivi de la modification de l'âge pour les documents de type animal.
window.dcp.document.documentController("addEventListener", "ready", { "name": "addAnimalEvent", "documentCheck": function(documentObject) { return documentObject.family.name === "ANIMAL"; } }, function(event, documentObject) { this.documentController("addEventListener", "change", { "name" : "changeAge.animal", "documentCheck": function(documentObject) { return documentObject.family.name === "ANIMAL"; }, "attributeCheck" : function(attributeObject) { return attributeObject.id === "animal_date" } }, function() { this.documentController("showMessage", "You have changed the age"); } ); } );
Présenté de cette manière, cet événement sera ajouté
à chaque chargement du document. Il faudra donc enlever l'événement changeAge.animal
à la fermeture du document (voir l'événement close).
Le document va être restauré.
event
currentDocumentObject
Oui. Dans ce cas, la restauration est annulée et rien n'est fait.
Dans cet exemple, l'écouteur (fonction preventRestoreAnimal
) demande une confirmation
avant la restauration du document.
window.dcp.document.documentController( "addEventListener", "beforeRestore", { "name": "preventRestore.animal", "documentCheck": function(document) { return document.family.name === "ANIMAL"; } }, function preventRestoreAnimal(event, currentDocumentObject) { if (!confirm("Voulez-vous restaurer ce document ?")) { event.preventDefault(); this.documentController("showMessage", { "type" : "info", "message" : "la restauration a été annulée" }); } } );
Le document a été restauré.
event
currentDocumentObject
previousDocumentObject
Non
Cet exemple
addAnimalEvents
) un écouteur sur l'événement beforeRestore
,confirmRestoreAnimal
) affiche un message de confirmation après la restauration.window.dcp.document.documentController("addEventListener", "ready", { "name": "addAnimalEvent", "documentCheck": function(documentObject) { return documentObject.family.name === "ANIMAL"; } }, function addAnimalEvents() { this.documentController( "addEventListener", "afterRestore", { "name": "confirmRestore.animal", "documentCheck": function(document) { return document.family.name === "ANIMAL"; } }, function confirmRestoreAnimal(event, currentDocumentObject) { this.documentController("showMessage", { "type" : "info", "message" : "Le document a été restauré avec succès" }); }); } );
Le document va être sauvegardé. Cet événement est déclenché après la phase de validation.
event
currentDocumentObject
requestOptions
getRequestData
et setRequestData
customData
customData
contient l'objet customClientData
,
cet objet peut-être modifié si besoin.
La fonction addCustomClientData
n'est pas prise en compte durant cet événement.
La modification n'est pas prise en compte si la fonction setRequestData
est appelée.La fonction getRequestData
retourne un objet json. Cet objet est la donnée envoyée au serveur
lors de la sauvegarde.
L'objet requestData
a trois principales données :
Seules les données document.attributes
et customClientData
peuvent être modifiée.
La modification de document.properties
n'a aucun effet.
Extrait de données requestData
(partielles):
{ "document": { "properties" : { "initid" : 1256 "title" : "My Awesome Document" } "attributes": { "my_title": { "value": "Hello world" "displayValue" : "Hello world" }, "my_level": { "value": 12 "displayValue" : "12" } } } "customClientData": { "myKey" => "Special Data" } }
La fonction setRequestData
prend en entrée, un objet JSON de la forme indiqué
ci-dessus.
Oui. Dans ce cas, la sauvegarde est annulée et rien n'est fait.
addAnimalEvents
) un écouteur sur l'événement beforeSave
,l'écouteur (fonction preventSaveAnimal
) empêche la sauvegarde du document si
zoo_title
est différent de fermer
.Dans ce cas, il affiche un message pour avertir l'utilisateur qu'il doit changer la valeur.
window.dcp.document.documentController("addEventListener", "ready", { "name": "addAnimalEvent", "documentCheck": function(documentObject) { return documentObject.family.name === "ANIMAL"; } }, function addAnimalEvents() { this.documentController("addEventListener", "beforeSave", { "name": "preventSave.animal", "documentCheck": function(document) { return document.family.name === "ANIMAL"; } }, function preventSaveAnimal(event, currentDocumentObject) { if (this.documentController("getValue", "zoo_title").value !== "fermer") { event.preventDefault(); this.documentController("showMessage", { "type" : "error", "message" : "If you want to save the doc, change the title to fermer" }); } }); } );
Cet exemple montre comment utiliser les fonctions getRequestData
et setRequestData
pour ne renvoyer que les données modifiées lors de la sauvegarde.
window.dcp.document.documentController("addEventListener", "beforeSave", { "name": "SaveOnlyModified.test", }, function saveOnlyModified(event, currentDocumentObject, requestOptions, customData) { var systemData= requestOptions.getRequestData(); this.documentController("getAttributes").forEach(function (attr) { if (!attr.isModified()) { delete systemData.document.attributes[attr.id]; } }); requestOptions.setRequestData( systemData ); });
Le document a été sauvegardé.
event
currentDocumentObject
previousDocumentObject
Non
Cet exemple passe directement le document en consultation
après sa sauvegarde.
window.dcp.document.documentController("addEventListener", "afterSave", { "name": "passToView" }, function reloadInConsultation(event, currentDocumentObject) { this.documentController("fetchDocument", { "viewId" : "!defaultConsultation" }); } );
Le document va être sauvegardé. Cet événement est déclenché avant la sauvegarde.
event
documentObject
Oui. Dans ce cas, la sauvegarde est annulée et rien n'est fait.
Cet exemple
addAnimalEvents
) un écouteur sur l'événement validate
,l'écouteur (fonction preventValidateAnimal
) déclare le document en erreur de validation si
zoo_title
est différent de fermer
.Dans ce cas, il affiche un message pour avertir l'utilisateur qu'il doit changer la valeur.
window.dcp.document.documentController("addEventListener", "ready", { "name": "addAnimalEvent", "documentCheck": function(documentObject) { return documentObject.family.name === "ANIMAL"; } }, function addAnimalEvents() { this.documentController("addEventListener", "validate", { "name": "preventValidate.animal", "documentCheck": function(documentObject) { return documentObject.family.name === "ANIMAL"; } }, function preventValidateAnimal(event, documentObject) { if (this.documentController("getValue", "zoo_title").value !== "fermer") { event.preventDefault(); this.documentController("showMessage", { "type" : "error", "message" : "If you want close the doc, change the title to fermer" }); } }); } );
Les événements ci-dessous concernent un attribut spécifique du document.
Bien que concernant un attribut précis, les écouteurs de ces événements doivent être ajoutés au widget document au moyen de la méthode addEventListener.
Il est possible de ne déclencher le traitement que lorsque le document satisfait certaines conditions au moyen de la fonction définie dans l'option documentCheck
du listener.
Il est possible de ne déclencher le traitement que lorsque l'attribut satisfait certaines conditions au moyen de la fonction définie dans l'option attributeCheck
du listener.
L'utilisateur a cliqué sur une balise <a>
dans un attribut de type htmltext.
Si le lien est un lien interne de type événement, alors l'événement attributeAnchorClick n'est pas déclenché.
event
documentObject
attributeObject
$el
index
-1
sinon.options
anchor
<a>
,
anchorsConfig
la configuration définie par setAnchorsOptions
pour l'attribut en cours, composée de :
target
target
dans laquelle ouvrir ce lien,modal
target
vaut _dialog
, indique si la fenêtre doit êre modale,windowWidth
target
vaut _dialog
, indique la largeur de la fenêtre à ouvrir,windowHeight
target
vaut _dialog
, indique la hauteur de la fenêtre à ouvrir.Il est possible de modifier directement la configuration dans anchorsConfig
pour obtenir un comportement différent (dans ce cas, il ne faut pas annuler l'événement).
Oui. dans ce cas, le lien n'est pas ouvert par dynacase.
Cet exemple ouvre les fenêtres wikipedia dans une nouvelle fenêtre, et les autres dans des dialog :
window.dcp.document.documentController("addEventListener", "attributeAnchorClick", { "name": "attributeAnchorClick", "documentCheck": function(documentObject) { return documentObject.family.name === "ZOO_ESPECE"; }, "attributeCheck" : function(attribute, documentObject) { if (attributeObject.id === "es_decription") { return true; } else { return false; } } }, function attributeAnchorClick(event, documentObject, attributeObject, $el, options, index) { if(/wikipedia\./.test(options.anchor.hostname)) { options.anchorsConfig.target = '_blank'; } else { options.anchorsConfig.target = '_dialog'; } } );
Cet exemple empêche l'ouverture des liens qui ne sont pas en https :
window.dcp.document.documentController("addEventListener", "attributeAnchorClick", { "name": "attributeAnchorClick", "documentCheck": function(documentObject) { return documentObject.family.name === "ZOO_ESPECE"; }, "attributeCheck" : function(attribute, documentObject) { if (attributeObject.id === "es_decription") { return true; } else { return false; } } }, function attributeAnchorClick(event, documentObject, attributeObject, $el, options, index) { if(options.anchor.scheme !== 'https:') { event.preventDefault(); alert('seuls les liens https peuvent être ouverts !'); } } );
L'attribut de type array a été modifié (ajout, suppression, drag & drop de lignes).
Cet événement ne concerne que les attributs de type tableau (array
).
event
documentObject
attributeObject
type
(string)type de modification, parmi
addLine
: ajout d'une ligne,moveLine
: déplacement d'une ligne,removeLine
: suppression d'une ligne.options
(int|objet)fromLine
, toLine
) en cas de déplacement.Non
Cet exemple affiche un message à l'utilisateur à chaque fois qu'un array est modifié.
window.dcp.document.documentController("addEventListener", "attributeArrayChange", { "name": "displayarrayModified" }, function displayArrayModified(event, documentObject, attribut) { this.documentController("showMessage", "Array "+attribut.id+" has changed"); } );
L'attribut va être rendu.
Cet événement est déclenché uniquement au rendu des attributs. Si ceux-ci sont déjà rendu lorsque l'écouteur est ajouté, l'événement n'est pas déclenché à nouveau.
event
documentObject
attributeObject
$el
index
-1
sinon.Oui. dans ce cas, l'attribut n'est pas rendu.
Cet exemple annule le rendu d'un attribut précis.
window.dcp.document.documentController("addEventListener", "attributeBeforeRender", { "name": "attributeBeforeRender", "documentCheck": function(documentObject) { return documentObject.family.name === "ANIMAL" }, "attributeCheck" : function isTitle(attribute, documentObject) { if (attributeObject.id === "zoo_title") { return true; } } }, function attributeBeforeRender(event, documentObject, attributeObject, $el) { event.preventDefault(); } );
Un téléchargement de fichier a été demandé (soit en cliquant sur le lien (hyperlien) en consultation ou sur le bouton de téléchargement en édition).
event
documentObject
attributeObject
$el
index
-1
sinon.Oui. Dans ce cas, le fichier n'est pas proposé à l'utilisateur.
Cet exemple n'autorise le téléchargement des fichiers que s'ils sont de type "image".
window.dcp.document.documentController("addEventListener", "attributeDownloadFile", { "name": "passToView" }, function controlDownload(event, documentObject, attributeObject, options) { var index = options.index; var value = attributeObject.getValue(); if (_.isArray(value)) { value = value[index]; } if (value.mime.indexOf("image") === -1) { event.preventDefault(); } } );
L'aide à la saisie associée à l'attribut a été déclenchée et le résultat de cette aide à la saisie est arrivé sur le client.
Cet événement est déclenché après la récupération de la liste des valeurs sur le serveur et permet de personnaliser la liste.
event
documentObject
attributeObject
options
(objet)Un objet contenant les propriétés suivantes :
data
(array)liste des valeurs à présenter à l'utilisateur. Le tableau a la forme suivante:
pour chaque ligne un objet avec les propriétés suivantes :
title
: élément affiché dans la liste déroulante,error
: message d'erreur (optionnel),values
: objet contenant les valeurs à attribuer au document en cas de sélection de cette ligne.
La clef représente l'identifiant logique de l'attribut auquel al valeur sera affectée,
et le contenu est similaire à un setValue
, soit un objet avec les propriétés
value
: valeur à stocker,displayValue
: valeur à présenter à l'utilisateur.Oui. Dans ce cas l'aide à la saisie est annulée.
Cet exemple inverse l'ordre de retour de toutes les aides à la saisie.
window.dcp.document.documentController("addEventListener", "attributeHelperResponse", { "name": "invertResult" }, function displayArrayModified(event, documentObject, attributeObject, options) { options.data.reverse(); } );
L'aide à la saisie associée à l'attribut a été déclenchée. Cet événement est déclenché avant la récupération de la liste des valeurs sur le serveur et permet de retourner une liste personnalisée.
event
documentObject
attributeObject
options
(objet)Object contenant les propriétés suivantes :
data
Object contenant les propriétés suivantes :
attributes
filter
setResult
(function)Pour ne pas utiliser les valeurs fournies par le serveur, mais une liste personnalisée, il faut appeler cette méthode avec un tableau de résultats en paramètres. Le tableau doit être de la forme suivante :
pour chaque ligne un objet avec les propriétés suivantes :
title
: élément affiché dans la liste déroulante,message
: message (optionnel),
contentText
: texte brut à afficher,contentHtml
: texte formaté à afficher.type
: type de message : message
(par défaut), warning
, error
.values
: objet contenant les valeurs à attribuer au document en cas de sélection de cette ligne.
La clef représente l'identifiant logique de l'attribut auquel al valeur sera affectée,
et le contenu doit être similaire à un setValue
, soit un objet avec les propriétés
value
: valeur à stocker,displayValue
: valeur à présenter à l'utilisateur.Oui. Dans ce cas la recherche des valeurs n'est pas effectuée sur le serveur et est à la charge du callback,
qui doit alors appeler setResult
.
Cet exemple intercepte l'aide à la saisie de l'attribut "de_proprietaire". Aucun appel au serveur n'est effectué. Un message est affiché avec un choix unique.
window.dcp.document.documentController("addEventListener", "attributeHelperSearch", { "name": "displayErrorMessage", "documentCheck": function (documentObject) { return documentObject.family.name === "DEMANDEADOPTION" }, "attributeCheck": function(attribute, documentObject) { return attribute.id === "de_proprietaire"; } }, function displayArrayModified(event, documentObject, attributObject, options) { event.preventDefault(); options.setResult( [{ "title" : "", "message" : { "contentText" : "Hello from my autocomplete" } }, { "title": "Pas le choix : c'est le propriétaire", "values": { "de_proprietaire" : { "value": 1124, "displayValue" : "Le propriétaire" } } } ] ); } );
L'aide à la saisie associée à l'attribut a été déclenchée, le résultat de cette aide à la saisie est arrivé sur le client et l'utilisateur a cliqué sur un résultat. Cet événement permet de personnaliser le comportement de la sélection d'une valeur de l'aide à la saisie.
event
documentObject
attributeObject
options
(objet)Un objet contenant la ligne sélectionnée. Il contient les propriétés suivantes :
title
: élément affiché dans la liste déroulante,error
: message d'erreur (optionnel),values
: objet contenant les valeurs à attribuer au document en cas de sélection de cette ligne.
La clef représente l'identifiant logique de l'attribut auquel al valeur sera affectée,
et le contenu est similaire à un setValue
, soit un objet avec les propriétés
value
: valeur à stocker,displayValue
: valeur à présenter à l'utilisateur.L'élément options peut-être modifié.
Oui. Dans ce cas l'aide à la saisie est annulée.
Cet exemple annule la sélection de toutes les aides à la saisie.
window.dcp.document.documentController("addEventListener", "attributeHelperSelect", { "name": "attributeHelperSelect" }, function displayArrayModified(event, documentObject, attributeObject, options) { event.preventDefault(); } );
L'attribut vient d'être rendu et est disponible pour les utilisateurs.
Lorsqu'un écouteur est ajouté pour cet événement alors que l'attribut est déjà rendu, l'écouteur est déclenché immédiatement.
event
documentObject
attributeObject
$el
index
-1
sinon.Non
Cet exemple passe en rouge le background d'un attribut précis.
window.dcp.document.documentController("addEventListener", "attributeReady", { "name": "doubleCheck", "documentCheck": function(documentObject) { return documentObject.family.name === "ANIMAL" }, "attributeCheck" : function isTitle(attribute, documentObject) { if (attribute.id === "zoo_title") { return true; } } }, function changeDisplayError(event, documentObject, attributeObject, $el) { $el.css("background-color", "red"); } );
Cet exemple ajoute un tooltip qui affiche au survol le nom logique de l'attribut sur tous les attributs.
window.dcp.document.documentController("addEventListener", "attributeReady", { "name": "displayId" }, function changeDisplayError(event, documentObject, attributeObjecte, $el) { $el.tooltip({ placement : "top", title : function vDocumentTooltipTitle() { return attribute.id } }); } );
L'attribut a été modifié (soit via l'interface, soit via du code).
event
documentObject
attributeObject
values
Un objet contenant les valeurs de l'attribut en cours. Il contient les propriétés suivantes :
current
previous
initial
index
0
).-1
si la valeur n'est pas dans un tableau ou si plusieurs valeurs
ont été modifiées.Non
Cet exemple affiche un message à l'utilisateur à chaque fois qu'un attribut est modifié.
window.dcp.document.documentController("addEventListener", "change", { "name": "displayChange" }, function displayChange(event, documentObject, attributeObject, values) { this.documentController("showMessage", "Attribut "+attributeObject.id+" has changed"); } );
La valeur (Structure des valeurs) d'un type fichier contient les propriétés suivantes :
creationDate
: "2015-07-08 14:59:10
"displayValue
: "14-2a_Alligator_3_4_Custom-Red46.jpg
"fileName
: "14-2a_Alligator_3_4_Custom-Red46.jpg
"icon
: "resizeimg.php?img=CORE%2FImages%2Fmime-image.png&size=20
"mime
: "image/jpeg
"size
: "282737
"url
: "file/74568/2892/rai_corps/-1/14-2a_Alligator_3_4_Custom-Red46.jpg?cache=no&inline=yes
"value
: "image/jpeg|2892|14-2a_Alligator_3_4_Custom-Red46.jpg
"Un téléversement de fichier a été demandé en cliquant sur un attribut de type
file
ou image
en édition.
event
documentObject
attributeObject
$el
index
-1
sinon.options
un objet contenant les propriétés suivantes :
file
file
qui sera téléverséhasUploadingFiles
true
si un autre fichier est en cours de téléversement.Oui. Dans ce cas, le fichier n'est pas téléversé, l'attribut n'est pas modifié.
Cet exemple n'autorise que le téléversement des fichiers de type image.
window.dcp.document.documentController("addEventListener", "attributeUploadFile", { "name": "restrictToImages" }, function controlUpload(event, documentObject, attributeObject, $el, index, options) { if(options.file.type.substr(0, 5) !== 'image') { event.preventDefault(); alert('seules les images sont autorisées !'); } } );
Un téléversement qui a été demandé vient d'aboutir.
event
documentObject
attributeObject
$el
index
-1
sinon.options
un objet contenant les propriétés suivantes :
file
Exemple :
{ creationDate:"2017-07-04 16:37:23" displayValue:"NfGTsK4.jpg" fileName:"NfGTsK4.jpg" icon:"api/v1/images/assets/sizes/20/mime-image.png" size:"50187" thumbnail:"api/v1/images/recorded/sizes/48/2673880702159532007.png" url:"api/v1/files/recorded/temporary/2673880702159532007.jpg" value:"image/jpeg|2673880702159532007|NfGTsK4.jpg" }
hasUploadingFiles
true
si un autre fichier est en cours de téléversement.Non.
Cet exemple affiche un message lorsqu'il n'y a plus de téléversement en cours.
window.dcp.document.documentController("addEventListener", "attributeUploadFileDone", { "name": "my.uploaddone", "documentCheck": function (document) { return document.family.name === "MY_FAMILY" } }, function (event, document, data) { if (!document.hasUploadingFiles) $(this).documentController("showMessage", { message: "All uploads are done", type: "success" }); } );
L'affichage d'un onglet est demandé.
event
documentObject
attributeObject
$el
Oui. Dans ce cas, L'onglet n'est pas sélectionné. Son contenu n'est pas généré si c'est la première fois qu'il est sélectionné. Son contenu n'est pas affiché
Cet exemple n'autorise pas la sélection de l'onglet my_t_tab_date
.
window.dcp.document.documentController("addEventListener", "attributeBeforeTabSelect", { "name": "NoSelectTabDate", "documentCheck": function (document) { return document.family.name === "MY_FAMILY"; }, "attributeCheck": function (attribute) { return (attribute.id === "my_t_tab_date"); } }, function selectIfNotDate(event, currentDocumentObject, Attribute, $el) { // Onglet affiché en rouge $el.css("background-color", "red"); // Message d'information this.documentController("showMessage", { type: "warning", htmlMessage: "Tab <b>"+Attribute.getLabel()+ "</b> cannot be selected" }); // Ordre d'annulation de la sélection event.preventDefault(); });
L'affichage d'un onglet a été effectué. Lorsque le contenu de l'onglet est affiché.
event
documentObject
attributeObject
$el
Non
Cet exemple affichage en jaune les onglets déjà sélectionnés.
window.dcp.document.documentController("addEventListener", "attributeAfterTabSelect", { "name": "SelectTabDate", "documentCheck": function (document) { return document.family.name === "MY_FAMILY"; }, "attributeCheck": function (attribute) { return true; } }, function selectIfNotData(event, currentDocumentObject, Attribute, $el) { // Onglet affiché en jaune $el.css("background-color", "yellow"); // Message d'information this.documentController("showMessage", { type: "info", htmlMessage: "Tab <b>"+Attribute.getLabel()+ "</b> is now selected" }); });
Lorsqu'une erreur sur un attribut a été déclenchée. Lorsque le libellé du label a été modifié.
Cette événement peut être déclenché plusieurs fois si plusieurs attributs contenu dans cet onglet sont en erreur.
event
documentObject
attributeObject
$el
info
:error
si une contrainte a été
déclenchée sur un des ses attributs.Non
Cet exemple affiche une notification en cas d'erreur se rapportant à un onglet.
window.dcp.document.documentController("addEventListener", "attributeTabChange", { "name": "ChangeTab.test", "documentCheck": function (document) { return document.family.name === "MY_FAMILY"; }, "attributeCheck": function (attribute) { return true; } }, function showTabError(event, currentDocumentObject, Attribute, $el, info) { if (info.error) { this.documentController("showMessage", { type: "error", htmlMessage: "Tab <b>" + Attribute.getLabel() + "</b> has an error", message: info.error }); } });
L'option addCreateDocumentButton pour les attributs de type docid déclenche les événements suivants.
attributeCreateDialogDocumentReady
: lorsque le formulaire est affichéattributeCreateDialogDocumentBeforeSetFormValues
: avant l'affectation des valeurs dans le formulaireattributeCreateDialogDocumentBeforeSetTargetValue
: avant l'affectation de l'attribut dans le document principalattributeCreateDialogBeforeClose
: avant la fermeture de la fenêtre de dialogueattributeCreateDialogBeforeDestroy
: avant la destruction de la fenêtre de dialogueDéclenché lorsque le formulaire est prêt pour être affiché. Il est déclenché sur le "ready" du formulaire.
event
documentObject
attributeObject
options
index
: Index de la relation en cas d'attribut multiple. Est égale à "-1" si
Cela ne concerne pas un attribut multiple
dialogWindow
: Widget de la fenêtre de dialogue (de type dcpWindow
)
dialogDocument
: Widget du document contenu dans la fenêtre de dialogueOui. L'annulation annule la modification des menus ainsi que le déclenchement des affectations de valeur dans le formulaire. L'événement "attributeCreateDialogDocumentBeforeSetFormValues" ne sera pas déclenché.
Déclenché lorsque le formulaire de création est prêt à recevoir les données à modifier. Il n'est pas déclenché pour le formulaire de modification.
event
documentObject
attributeObject
options
getFormValues()
: fonction qui retourne l'objet ,
setFormvalues(formValues)
: enregistre les valeurs dans le formulaire,
index
: Index de la relation en cas d'attribut multiple. Est égale à "-1" si
Cela ne concerne pas un attribut multiple
dialogWindow
: Widget de la fenêtre de dialogue (de type dcpWindow
)
dialogDocument
: Widget du document contenu dans la fenêtre de dialogueOui. L'annulation indique que les valeurs définies dans l'option formValue
ne
seront pas prises en compte. Le formulaire est affiché sans ces valeurs
spécifiques.
Ajout de 2 nouvelle valeurs dans le formulaire de création :
window.dcp.document.documentController("addEventListener", "attributeCreateDialogDocumentBeforeSetFormValues", { "name": "createChild.animal", "documentCheck": function(document) { return document.family.name === "ZOO_ANIMAL" }, "attributeCheck": function(attribute, documentObject) { return attribute.id === "an_enfant"; } }, function (event, document, attribut, options) { var formValues=options.getFormValues(); formValues.an_tatouage={value:"007"}; formValues.an_sexe={value:"F"}; options.setFormValues(formValues); // Affichage d'un message dans le formulaire de création options.dialogDocument.documentController("showMessage", "Création d'un nouvel animal"); } );
Déclenché lorsque la valeur de l'attribut a été affecté en cliquant sur le bouton d'enregistrement du document de la fenêtre de dialogue.
event
documentObject
attributeObject
options
Un objet contenant les valeurs de l'attribut en cours. Il contient les propriétés suivantes :
index
dialogWindow
dcpWindow
)dialogDocument
attributeValue
Valeur de la relation à insérer dans l'attribut Cette valeur est un objet contenant les champs suivants :
Oui. Le formulaire est enregistré, mais la mise de l'attribut n'est pas effectuée. La fenêtre de dialogue n'est pas fermée.
Afficher un message indiquant la sauvegarde.
window.dcp.document.documentController("addEventListener", "attributeCreateDialogDocumentBeforeSetTargetValue", { "name": "setChild.animal", "documentCheck": function(document) { return document.family.name === "ZOO_ANIMAL" }, "attributeCheck": function(attribute, documentObject) { return attribute.id === "an_espece"; } }, function (event, document, attribut, options) { options.dialogDocument.documentController("showMessage", "Valeur [" + options.attributeValue.displayValue+ "] en cours d'affectation"); } );
Déclenché avant la fermeture de la fenêtre. Soit lorsque l'utilisateur a demandé la mise à jour, soit lorsque l'utilisateur a demandé la fermeture sans enregistrer.
event
documentObject
attributeObject
options
index
dialogWindow
dcpWindow
)
dialogDocument
attributeValue
Valeur de la relation à insérer dans l'attribut. Cette valeur est vide (non définie) lorsque l'affectation n'a pas eu lieu. Cette valeur est un objet contenant les champs suivants en cas d'enregistrement :
Oui. L'annulation annule la fermeture de la fenêtre de dialogue. Cela annule aussi la demande de confirmation de fermeture lorsque le document n'a pas été enregistré.
Bloquer la fermeture automatique de la fenêtre après l'enregistrement.
window.dcp.document.documentController("addEventListener", "attributeCreateDialogDocumentBeforeClose", { "name": "closeEspece.animal", "attributeCheck": function(attribute, documentObject) { return attribute.id === "an_espece"; } }, function (event, document, attribut, options) { if (options.attributeValue) { // En cas d'enregistrement event.preventDefault(); options.dialogDocument.documentController("showMessage", "Valeur enregistrée"); } } );
Déclenché lorsque la fenêtre de dialogue est détruite (après la fermeture).
event
documentObject
attributeObject
options
index
: Index de la relation en cas d'attribut multiple. Est égale à "-1" si
Cela ne concerne pas un attribut multiple
dialogWindow
: Widget de la fenêtre de dialogue (de type dcpWindow
)
dialogDocument
: Widget du document contenu dans la fenêtre de dialogueOui. Cela empêche la destruction de la fenêtre et du formulaire.
Affichage d'un message après la fermeture de la fenêtre de dialogue.
window.dcp.document.documentController("addEventListener", "attributeCreateDialogDocumentBeforeDestroy", { "name": "acloseEspece.animal", "documentCheck": function(document) { return document.family.name === "ZOO_ANIMAL" }, "attributeCheck": function(attribute, documentObject) { return attribute.id === "an_espece"; } }, function displayArrayModified(event, document, attribut, options) { this.documentController("showMessage", "Fenêtre ["+ options.dialogDocument.documentController("getProperty","title")+ "] a été fermée"); } );
Les événements ci-dessous concernent le changement d'état du document. Ils permettent de piloter la fenêtre de changement d'état.
La fenêtre de changement d'état est représentée dans les événements par l'objet interne correspondant.
Les écouteurs de ces événements doivent être ajoutés au widget document.
beforeDisplayTransition
Cet événement est déclenché avant l'affichage de la fenêtre de changement d'état.
event
documentObject
changeStateObject
Oui. Dans ce cas, la demande de transition est annulée.
Cet exemple interdit les changement d'état administrateur (sans transition).
window.dcp.document.documentController("addEventListener", "beforeDisplayTransition", { "name": "preventTransition.changeState" }, function preventTransition(event, documentObject, changeStateObject) { if (!changeStateObject.transition) { event.preventDefault(); this.documentController("showMessage", { type : "error", "message" : "You cannot do change state without transition" }); } } );
afterDisplayTransition
Cet événement est déclenché après l'affichage de la fenêtre.
event
documentObject
changeStateObject
Non.
Cet exemple affiche un message de confirmation au clic sur le bouton de validation
et empêche l'action associée au bouton ok
de ce lancer si l'utilisateur ne confirme pas.
window.dcp.document.documentController("addEventListener", "afterDisplayTransition", { "name": "afterDisplayTransition.changeState" }, function afterDisplayTransition(event, documentObject, changeStateObject) { changeStateObject.$el.find(".dcpTransition-button-ok") .on("click", function displayConfirm(event) { if (!confirm("Are you sure ?")) { changeStateObject.close(); event.preventDefault(); return false; } }); } );
beforeTransitionClose
Cet événement est déclenché avant la fermeture de la fenêtre lorsque l'utilisateur a cliqué sur "fermer" ou s'il a confirmé la transition.
Dans le cas d'une transition confirmé, la requếte a déjà été exécutée.
event
documentObject
changeStateObject
Oui. La fenêtre reste ouverte.
Cet exemple affiche un message de confirmation au clic sur le bouton d'annulation et annule la fermeture si ce n'est pas confirmé.
window.dcp.document.documentController("addEventListener", "beforeTransitionClose", { "name": "beforeTransitionClose.changeState" }, function beforeTransitionClose(event, documentObject, changeStateObject) { if (!confirm("Are you sure ?")) { event.preventDefault(); } } );
beforeTransition
Cet événement est déclenché avant l'envoi de l'ordre de changement d'étape.
event
documentObject
changeStateObject
Oui. La fenêtre reste ouverte mais la requête n'est pas envoyée.
Cet exemple affiche un message de confirmation au clic sur le bouton de confirmation et laisse la fenêtre ouverte si ce n'est pas confirmé.
window.dcp.document.documentController("addEventListener", "beforeTransition", { "name": "beforeTransition.changeState" }, function beforeTransition(event, document, transition) { if (!confirm("Are you sure ?")) { event.preventDefault(); } } );
failTransition
Cet événement est déclenché après le retour de la demande de changement d'état si celle-ci échoue.
event
documentObject
changeStateObject
message
objet décrivant le message d'errer. L'objet contient les propriétés suivantes :
title
errorCode
code d'erreur du message. Les plus courants sont :
offline
: requête impossible pour cause de réseau,CRUD0211
: un attribut n'est pas au bon format et n'a pas pu être sauvé,CRUD0212
: une contrainte n'est pas respectée.Les autres identifiants d'erreurs peuvent être trouvés dans la documentation de l'API HTTP.
message
htmlMessage
(optionnel)Non.
Cet exemple ferme la fenêtre de changement d'état et ouvre le document en édition en affichant l'erreur à l'utilisateur si le changement d'état échoue (uniquement dans le cas d'une erreur autre que réseau).
window.dcp.document.documentController("addEventListener", "failTransition", { "name": "failTransition" }, function failTransition(event, documentObject, changeStateObject, error) { if (error.type !== "offline") { changeStateObject.close(); this.documentController("showMessage", { "type" : "error", "title" : error.title || "erreur", "message" : error.htmlMessage || error.message }); this).documentController("fetchDocument", { "initid": documentObject.initid, "viewId" : "!defaultEdition" }); } } );
successTransition
Cet événement est déclenché après le retour de la demande de changement d'état si celle-ci a réussi.
event
documentObject
changeStateObject
Non.
Cet exemple affiche un message à l'utilisateur en cas de transition effectuée avec succès.
window.dcp.document.documentController("addEventListener", "successTransition", { "name": "successTransition" }, function successTransition(event, documentObject, changeStateObject) { this.documentController("showMessage", { "type" : "info", "message" : "Well done !" }); } );
Il est possible de déclencher manuellement des événements.
triggerEvent
Cette méthode permet de déclencher un événement sur le widget en cours.
Le fait de déclencher un événement ne lance pas l'action associée.
Par exemple, le fait de déclencher un beforeSave
ne la,nce pas la sauvegarde du document.
nom
(string)Il est possible de déclencher les événements standards.
D'autres événements peuvent être déclenchés à condition que leur nom soit préfixé par custom:
.
autres arguments
(un ensemble d'arguments)Booléen :
true
l'événement doit s'exécuter (pas de preventDefault
),false
l'événement a été annulé par un des écouteurs.Le nom de l'événement n'est pas valide.
Les noms valides sont tous les noms d'événements standards et les noms préfixés par custom:
.
Déclenchement et écoute de l'événement custom:MyEvent
.
window.dcp.document.documentController("addEventListener", "custom:MyEvent", function(event, documentProperties, date) { console.log("MyEvent", event, documentProperties, date); } ); window.dcp.document.documentController( "triggerEvent", "custom:MyEvent", window.dcp.document.documentController("getProperties"), Date());
Ce module étend l'API HTTP de dynacase avec les routes suivantes :
Type | URL | Implémenté | Signification |
---|---|---|---|
GET | /api/v1/documents/<docid>/views/ | Oui | Liste des rendus de documents |
PUT | /api/v1/documents/<docid>/views/ | N/A | N/A |
POST | /api/v1/documents/<docid>/views/ | N/A | N/A |
DELETE | /api/v1/documents/<docid>/views/ | N/A | N/A |
GET | /api/v1/documents/<docid>/views/<viewId> | Oui | Récupération du rendu d'un document |
PUT | /api/v1/documents/<docid>/views/<viewId> | Oui | Mise à jour d'un document avec le rendu indiqué |
POST | /api/v1/documents/<docid>/views/<viewId> | N/A | N/A |
DELETE | /api/v1/documents/<docid>/views/<viewId> | N/A | N/A |
GET | /api/v1/families/<famid>/views/structure | Oui | Récupération de la structure d'une famlille (caractéristiques des attributs) |
PUT | /api/v1/families/<famid>/views/structure | Non | N/A |
POST | /api/v1/families/<famid>/views/structure | N/A | N/A |
DELETE | /api/v1/families/<famid>/views/structure | N/A | N/A |
GET | /api/v1/documents/<docid>/revision/<revision>/views/<viewId> | Oui | Récupération du rendu d'une révision de document |
PUT | /api/v1/documents/<docid>/revision/<revision>/views/<viewId> | N/A | N/A |
POST | /api/v1/documents/<docid>/revision/<revision>/views/<viewId> | N/A | N/A |
DELETE | /api/v1/documents/<docid>/revision/<revision>/views/<viewId> | N/A | N/A |
GET | /api/v1/families/<famid>/documentsViews/ | N/A | N/A |
PUT | /api/v1/families/<famid>/documentsViews/ | N/A | N/A |
POST | /api/v1/families/<famid>/documentsViews/ | Oui | Création d'un document de la famille en utilisant le rendu de création |
DELETE | /api/v1/families/<famid>/documentsViews/ | N/A | N/A |
GET | /api/v1/documents/<docid>/views/states/<states> | Oui | [Caractéristiques d'affichage de la transition vers l'état "state"] |
PUT | /api/v1/documents/<docid>/views/states/<states> | N/A | N/A |
POST | /api/v1/documents/<docid>/views/states/<states> | Oui | Passage de la transition vers l'état "state" |
DELETE | /api/v1/documents/<docid>/views/states/<states> | N/A | N/A |
GET | /api/i18n/<catalogName> | Oui | Récupération du catalogue catalogName
|
PUT | /api/i18n/<catalogName> | N/A | N/A |
POST | /api/i18n/<catalogName> | N/A | N/A |
DELETE | /api/i18n/<catalogName> | N/A | N/A |
Légende :
Type | URL | Implémenté | Signification |
---|---|---|---|
GET | /api/v1/documents/<docid>.html | Oui | Affichage du document n°docid |
GET | /api/v1/documents/<docid>/revision/<revision>.html | Oui | Affichage de la révision n°revision du document n°docid |
GET | /api/v1/documents/<docid>/views/<viewId>.html | Oui | Affichage de la vue viewId du document n°docid |
GET | /api/v1/documents/<docid>/views/<viewId>/revision/<revision>.html | Oui | Affichage de la vue viewId de la révision n°revision du document n°docid |
Si les extensions "html" sont remplacés par l'extension "json", l'url reste valide et retourne les données du documents ou de la vue.
La DOM des éléments générs par Dynacase Document UIS est normalisée selon les règles suivantes.
La page globale d'un document HTML standard contient la structure suivante :
<html> <head>...</head> <body> <div class="document"> <div class="dcpDocument"> <header class="dcpDocument__header">L'entête de document</header> <nav class="dcpDocument__menu">La barre de menu</nav> <section class="dcpDocument__body">Le corps du document</section> <footer class="dcpDocument__footer">Le pied de document</footer> </div> </div> </body> </html>
Exemple : mettre un fond noir sur la page
.dcpDocument { background-color: black; } .dcpDocument .dcpDocument__header, .dcpDocument .dcpDocument__menu, .dcpDocument .dcpDocument__body, .dcpDocument .dcpDocument__footer { background-color: inherit; }
En fonction du mode de rendu (consultation, modification, création), une classe de style
supplémentaire est ajoutée sur la div <div class="dcpDocument">
.
<div class="dcpDocument dcpDocument--view">
<div class="dcpDocument dcpDocument--edit">
,<div class="dcpDocument dcpDocument--edit dcpDocument--create">
.Cette balise contient aussi une classe dcpFamily--[familyName]
qui permet de
différencier les documents par famille. familyName
contient le nom logique de
la famille.
Exemple :
<div class="dcpDocument dcpDocument--view dcpFamily--MY_FAMILY"></div>
En outre, une classe est ajoutée si le navigateur supporte les événements tactiles :
<div class="dcpDocument dcpTouch">
Le contenu de rendu d'un document est inséré dans une section
.dcpDocument__body
.
L'exemple ci-dessous représente un document ayant la structure suivante :
f1
a2
a3
array1
t1
f2
f3
t2
f4
f5
<section class="dcpDocument__body"> <div class="dcpDocument__frames"> <div class="dcpFrame" data-attrid="f1"> <div class="dcpFrame__label dcpLabel" data-attrid="f1"> Label du cadre </div> <div class="dcpFrame__content" data-attrid="f1" > <div class="dcpAttribute dcpAttribute--type--text" data-attrid="a2" > <label class="dcpAttribute__label dcpLabel dcpAttribute__label--text " data-attrid="a2"> Label de l'attribut </label> <div class="dcpAttribute__content dcpAttribute__content--text" data-attrid="a2"> Valeur de l'attribut </div> </div> <div class="dcpAttribute dcpAttribute--type--int" data-attrid="a3"> <label class="dcpAttribute__label dcpLabel dcpAttribute__label--int" data-attrid="a3"> Label d'un autre attribut </label> <div class="dcpAttribute__content dcpAttribute__content--int" data-attrid="a3"> Valeur d'un autre attribut </div> </div> <div class="dcpArray" data-attrid="array1"> <div class="dcpArray__label dcpLabel" data-attrid="array1"> Label du tableau </div> <div class="dcpArray__content" data-attrid="array1"> <table> <thead class"dcpArray__head" data-attrid="array1"> <tr> <th class="dcpArray__head__cell dcpLabel dcpAttribute__label--text " data-attrid="a5"> Label d'un attribut </th> <th class="dcpArray__head__cell dcpLabel dcpAttribute__label--docid " data-attrid="a6"> Label d'un autre attribut </th> </tr> </thead> <tbody class="dcpArray__body" data-attrid="array1"> <tr class="dcpArray__content__line" data-attrid="array1" data-line="0"> <td class="dcpAttribute__content dcpAttribute__label--text" data-attrid="a5"> Valeur d'un attribut </td> <td class="dcpAttribute__content dcpAttribute__label--docid" data-attrid="a6"> Valeur d'un autre attribut </td> </tr> <tr class="dcpArray__content__line" data-attrid="array1" data-line="1"> <td class="dcpAttribute__content dcpAttribute__label--text" data-attrid="a5"> Valeur d'un attribut </td> <td class="dcpAttribute__content dcpAttribute__label--docid" data-attrid="a6"> Valeur d'un autre attribut </td> </tr> </tbody> </table> </div> </div> </div> </div> </div> <div class="dcpDocument__tabs"> <ul class="dcpDocument__tabs__list"> <li class="dcpTab__label dcpLabel dcpLabel--active" data-attrid="t1"> Label de l'onglet </li> <li class="dcpTab__label dcpLabel dcpLabel--default" data-attrid="t2"> Label de l'onglet </li> </ul> <div class="dcpTab__content" data-attrid="t1"> <div class="dcpFrame" data-attrid="f2"> Contenu d'un cadre… </div> <div class="dcpFrame" data-attrid="f3"> Contenu d'un autre cadre… </div> </div> <div class="dcpTab__content" data-attrid="t2"> <div class="dcpFrame" data-attrid="f4"> Contenu d'un cadre… </div> <div class="dcpFrame" data-attrid="f5"> Contenu d'un autre cadre… </div> </div> </div> </section>
Les attributs sont au sein de la section .dcpDocument__body
, dans une div de la forme<div class="dcpAttribute dcpAttribute--type--***" data-attrid="***"/>
Tous les labels d'attributs peuvent être adressée avec les mêmes règles :
Règle | Définition |
---|---|
.dcpDocument .dcpLabel | Tous les labels (hormis les onglets) |
.dcpDocument .dcpLabel[data-attrid="attributeId "] |
Label de l'attribut attributeId
|
Exemple :
.dcpDocument .dcpLabel { color: #ffff00; background-color: #262600; } .dcpDocument .dcpLabel[data-attrid="my_text"] { color:blue; } .dcpDocument .dcpLabel[data-attrid="my_number"] { color: #ff6d8c; }
Les onglets (attribut de type tab
) ont deux états :
active
pour l'onglet sélectionnédefault
pour les autres.De par ces états, des règles plus précises sont nécessaires pour modifier leur apparence :
Règle | Définition |
---|---|
.dcpDocument .dcpLabel.dcpLabel--active | Label de l'onglet actif |
.dcpDocument .dcpLabel.dcpLabel--default | Label des onglets inactifs |
.dcpDocument .dcpLabel.dcpLabel--active[data-attrid="attributeId "] |
Label de l'onglet attributeId lorsqu'il est actif |
.dcpDocument .dcpLabel.dcpLabel--default[data-attrid="attributeId "] |
Label de l'onglet attributeId lorsqu'il est inactif |
Les onglets ont un élément actif permettant de changer d'onglet. Cet élément est
une ancre HTML (a
) et sa couleur ne peut être modifiée que par des règles plus
précises portant sur l'ancre elle-même :
Règle | Définition |
---|---|
.dcpDocument .dcpLabel.dcpLabel--active[data-attrid="attributeId "] a |
Texte du label de l'onglet attributeId lorsqu'il est actif |
.dcpDocument .dcpLabel.dcpLabel--default[data-attrid="attributeId "] a |
Texte du label de l'onglet attributeId lorsqu'il est inactif |
Exemple :
.dcpDocument .dcpLabel--default[data-attrid="tst_myframe"] { color:violet; background: #fdffbb; } .dcpDocument .dcpLabel--active[data-attrid="tst_myframe"] { background:violet; color: #fdffbb; }
Le contenu des attributs peut être adressé avec les règles suivantes :
Règle | Définition |
---|---|
.dcpDocument .dcpAttribute__content | Tous les contenus d'attributs (hormis les attributs de structure) |
.dcpDocument .dcpArray__content | Les contenus des tableaux |
.dcpDocument .dcpFrame__content | Les contenus des cadres |
.dcpDocument .dcpTab__content | Le contenu des onglets |
.dcpDocument .dcpAttribute__content[data-attrid="attributeId "] |
Contenu de l'attribut attributeId
|
.dcpDocument .dcpArray__content[data-attrid="attributeId "] |
Contenu du tableau attributeId
|
.dcpDocument .dcpFrame__content[data-attrid="attributeId "] |
Contenu du cadre attributeId
|
.dcpDocument .dcpTab__content[data-attrid="attributeId "] |
Contenu de l'onglet attributeId
|
Exemple : Afficher les attributs du cadre "my_frame" sur deux colonnes, et changer ses couleurs :
.dcpFrame__content[data-attrid="my_frame"] { background: linear-gradient(45deg, rgba(206,219,233,1) 0%,rgba(97,153,199,1) 51%,rgba(65,154,214,1) 84%,rgba(38,85,139,1) 100%); color: white; } .dcpFrame__content[data-attrid="my_frame"] a{ color: yellow; } .dcpFrame__content[data-attrid="my_frame"] .dcpAttribute { float: left; display: inline-block; width: 50%; height: 3em; }
Figure 62. Rendu par défaut
Figure 63. Rendu avec css personnalisée
Afin de faciliter l'utilisation des formulaires générés au moyen de Dynacase DocumentUIs, seules les zones de saisie de texte sont accessibles au moyen de la touche tabulation (↹).
Ainsi, un utilisateur peut saisir l'ensemble des données d'un formulaire sans quitter le clavier.
Cela veut dire que les boutons qui accompagnent les input
ne sont pas accessibles au moyen du clavier.
Cela inclut notamment :
Cependant, la plupart des opérations correspondantes sont accessibles via le clavier.
file
ou image
Une fois que l'attribut a obtenu le focus, il faut utiliser la touche enter (⏎) pour que la fenêtre de sélection de fichier s'ouvre.
La navigation dans cette fenêtre dépend ensuite du système d'exploitation de l'utilisateur.
docid
ou enum
La liste déroulante est accessible au moyen de la touche flèche vers le bas (↓).
Il est ensuite possible de sélectionner un élément au moyen de la touche enter (⏎).
Lorsque l'attribut est multiple, il est possible de se déplacer entre les valeurs au moyen des flèches gauche et droite. Il est ensuite possible de supprimer la valeur à gauche du curseur au moyen de la touche retour (⌫)
color
Le colorpicker est accessible au moyen de la touche enter (⏎).
Il est ensuite possible de changer la couleur au moyen des flèches, puis de valider son choix au moyen de la touche enter (⏎).
Pour changer d'onglet, il faut se positionner sur la barre des onglets, et utiliser les flèches latérales pour passer d'un onglet à l'autre.
Lors du développements d'interfaces spécifiques (vues d'attributs notamment), il est important d'exclure certains éléments de la navigation par clavier afin de rester homogène avec l'approche des formulaires générés par Dynacase Document UIs.
Cela se fait au moyen de l'attribut tabindex
auquel on donne la valeur -1
.
Ce document est publié sous licence CC http://creativecommons.org/licenses/by-nc-sa/2.0/fr/
Vous êtes libres :
Selon les conditions suivantes :
Manuel de référence
© Anakeen, Labs <labs@anakeen.com>
Module Document User Interface, version 1.0
Édition 2
Publié le 03/08/2018
Ce livre a été produit avec easybook 4.8, logiciel libre et open source développé par Javier Eguiluz à l'aide de différents composants Symfony.