Introduction
Bienvenue dans la documentation de Backbone-Goomeo, la library tout en un pour Backbone comprenant entre autre :
- des extensions Backbone
- des validateurs Parsley
- des composants RiotJS
Vous trouverez dans cette documentation toutes les infos pour utiliser ce projet au sein du votre.
Prérequis
Attention : Cette library a été conçue pour être utilisée au sein d’un projet pour du Front et compilé avec Browserify.
Vous devez impérativement avoir NodeJS >= 0.12 pour pouvoir utiliser cette library.
Compatibilité
Normalement tous les composants Riot et le code Javascript sont compatible sous ie9+. Toutefois, plusieurs animations CSS et la police d’icône ne fonctionneront pas dessus.
Installation
npm install --save backbone-goomeo
Browserify
Pour la compilation du projet, nous utilisons le package Browserify qui permet de coder son projet en utilisant la norme CommonJS en lieu et place de la norme AMD.
CommonJS
La norme CommonJS permet de structurer son code en fichiers et d’appeler les dépendances comme nous le ferions sous NodeJS :
;
// appel des dépendances et les stocker dans des var
var $ = require('jquery');
// appel de dépendances sans les stocker dans des variables (ex: pour étendre jquery)
require('jquery.form2js');
// objet/fonction/variable retourné par l'appel de ce fichier par la commande require()
module.exports = function () {
console.log('a');
};
Limitations
La seule limitation avec Browserify, c’est que votre code ainsi structuré n’est pas utilisable directement dans le navigateur. Vous devrez impérativement builder votre code afin de générer un fichier javascript valide.
Configuration
Il est possible de dire certaines choses à Browserify pour simplifier l’utilisation des ressources externes, mettre certaines variables en global sur notre code, …
Librairies externes
Il est possible que dans les librairies installées par NPM, il y en aie plusieurs qui ne soient pas prévues pour fonctionner sous CommonJS. Heureusement, il est possible de palier à ceci dans le fichier package.json afin d’indiquer à Browserify de convertir les fichiers suivants :
Browser files
{
"browser": {
"jQuery": "./node_modules/jquery/dist/jquery.min.js",
"jquery.form2js": "./node_modules/form2js/src/jquery.toObject.js"
}
}
Ici nous indiquons aux fichiers jquery.min,js et jquery.toObject.js d’être convertis en fichiers CommonJS valide et d’être appelé avec la fonction require() via le mot clé jQuery et jQuery.form2js.
Variables globales
Dans le projet nous utilisons qu’une variable globale : jquery. Effectivement, si l’on veut require('jQuery'), on va tout le temps récupérer l’objet jQuery de base et non l’objet étendu par tous les modules. Pour palier à ça, nous plaçons jQuery en variable globale afin d’avoir toujours le jQuery étendu au lieu de celui de base.
Pour cela, nous passons par un shim de browserify configuré comme ceci :
Shims :
{
"browserify-shim": {
"jquery": "global:jQuery"
}
}
Ici on dit que la variable globale jQuery sera chargée automatiquement dans nos script avec l’appel require('jquery').
Bien entendu, il faut que dans votre code vous ayez ceci :
variables globales :
// définition de la variable globale jQuery
global.jQuery = require('jQuery');
Alias
Les alias servent à simplifier l’accès à différents répertoires du projet. Par exemple, si vous êtes dans un sous répertoire au cinquième niveau et que vous voulez récupérer un template, vous devrez préfixer votre require de plusieurs ../ ce qui peut vite devenir embêtant.
Voici la liste des alias disponibles :
| Alias | Correspond à |
|---|---|
| collections | /js/collections |
| components | /js/components |
| libs | /js/libs |
| models | /js/models |
| modules | /js/modules |
| tpl | /js/tpl |
Si vous voulez ajouter un template facilement, vous le pouvez grâce au package.json de la façon suivante :
{
"aliasify": {
"aliases": {
"tpl": "./js/tpl",
"models": "./js/models",
"components": "./js/components",
"libs": "./js/libs",
"modules": "./js/modules",
"collections": "./js/collections"
}
}
}
Jquery
Le projet utilise toujours une couche de jQuery pour simplifier la manipulation du DOM ou pour le bon fonctionnement de Backbone.
Appel
Si vous avez besoin d’utiliser jQuery, vous avez plusieurs façons de le faire selon l’endroit où vous êtes :
- Vue Backbone :
- via
this.$. Les vues backbone ont effectivement un accès interne à jQuery. Il faut aussi savoir qu’il est limité au DOM de la vue courante ainsi qu’à ses sous vues. - via
var $ = require('jquery'). Ici, on charge jQuery via le composant require. Là le sélecteur jQuery a accès au DOM complet.
- via
- Scripts JS :
- via
var $ = require('jquery'). Ici, on charge jQuery via le composant require. Là le sélecteur jQuery a accès au DOM complet.
- via
- Vues HTML :
- via
jQuery. Là le sélecteur jQuery a accès au DOM complet.
- via
Extensions
Il est parfois utile et nécéssaire d’étendre jQuery avec de nouvelles fonctions/modules. Pour cela, plusieurs solutions sont possibles.
Si vous voulez éttendre jQuery à tout le projet, peu importe l’application lancée derrière, vous devrez injecter les dépendances dans le fichier js/init.js. Là vous trouverez une fonction qui s’appelle extendjQuery et vous aurez juste à ajouter votre module par un simple appel à require('monmodule') :
{
extendjQuery : function extendjQuery() {
$.support.cors = true;
// form2js pour $('form').toObject();
require('form2js');
require('jquery.form2js');
}
}
Exceptions
Attention : Il est fortement probable que certains modules jQuery ne soient pas pensés pour fonctionner avec CommonJS.
Si c’est le cas, vous devrez renseigner certaines choses dans le fichier package.json à la rubrique browser :
{
"browser" : {
"jQuery" : "./node_modules/jquery/dist/jquery.min.js",
"jquery.form2js" : "./node_modules/form2js/src/jquery.toObject.js"
}
}
Ceci va permettre à browserify de convertir le code du fichier en code compatible CommonJS et de créer un alias pour le récupérer via la commande require().
Logger
Le logger sert à réaliser du log de différents levels au sein de l’application.
Ces logs sont disponibles en 5 niveaux :
| level | code | fonction | description |
|---|---|---|---|
| 0 | TRACE | trace() | Permet d’afficher toute sorte d’informations |
| 1 | DEBUG | debug() | Permet de logger des informations dites de debug |
| 2 | INFO | info() | Permet d’afficher des messages d’information |
| 3 | WARN | warn() | Permet d’afficher des messages d’erreurs non bloquantes |
| 4 | ERROR | error() | Permet d’afficher des messages d’erreurs critiques ou bloquantes |
Pour utiliser facilement ces noiveaux de log et savoir lesquels afficher en fonction de notre environnement, nous utilisons la library loglevel ainsi que son extension loglevel-message-prefix pour avoir un préfixe d’erreur propre.
Initialisation
Si vous voulez créer votre propre logger, voici la marche à suivre :
var log = require('loglevel'),
loglevelMessagePrefix = require('loglevel-message-prefix');
var logger = log.getLogger('unnompourlerendreunique');
loglevelMessagePrefix(this._logger, {
staticPrefixes : [ 'unnompourlerendreunique' ]
});
// ensuite vous pouvez utiliser logger comme vous voulez
logger.info('test info');
Vues Backbone
Les vues Backbone du projet ne devront pas étendre Backbone.View. En effet, nous avons créer une classe de base afin d’ajouter un nombre de fonctions utiles permettant d’améliorer le développement.
La classe de base se trouve dans /js/libs/backbone/views/base.js. Si vous voulez éttendre cette vue pour avoir d’autres vues de base réutilisables, vous devrez les créer dans le répertoire /js/libs/backbone/views
Organisation
Toute la partie javascript sera rangée dans le répertoire js et toute la partie HTML sera rangée dans le répertoire tpl.
Chaque groupe fonctionnel de vues doit se retrouver dans un répertoire désignant ce même groupe. Par exemple, toutes les vues composant le module LNS se retrouvent dans un sous répertoire lns. De même, la vue maîtresse de ce groupe devra s’appeler index.
Les parties vues et templates doivent suivre la même règle et les mêmes nommages. Par exemple, le template de la vue /modules/events/lns/index.js se retrouvera comme ceci : /tpl/events/lns/index.html
js
├── collections # Répertoire de toutes les collections
│ └── todo # collections propres au module todo
│ └── tasks.js # Collection tasks
├── models # Répertoire de tous les models
│ └── todo # models propres au module todo
│ └── task.js # model task
├── modules # Partie vues Javascript
│ └── todo # vues propres au module todo
│ ├── forms # répertoire des formulaires
│ │ └── form.js # vue du formulaire
| ├── item.js # vue pour une tâche
│ └── index.js # page d'accueuil du module todo
└── tpl # templates
└── todo # vues propres au module todo
├── forms # répertoire des formulaires
│ └── form.html # template du formulaire
└── index.html # template de la page d'accueuil
Création d’une sous vue
Dans les anciens projets, nous avions pour habitude de créer toutes les sous vues par le viewManager. Mais la tâche était redondante sur le fait qu’il fallait ajouter manuellement la vue au tableau subviews afin que toutes les vues soient détruites quand la principale l’était.
Dorénavant, vous devrez passer par la méthode this.createSubView(). La fonction s’utilise de la même façon à la différence que vous n’avez plus besoin de rajouter la sous-vue au tableau de subviews. Elle le fait pour vous.
// avant
var subView = vm.create('nomdevotrevue', votreView, {
key : 'foo'
});
this.subviews.push(subView);
// après
var subView = this.createSubView('nomdevotrevue', votreView, {
key : 'foo'
});
Le nom de votre vue sera composée comme ceci :
fichier : /js/modules/events/maps/index.js
vue : events:maps:index
Ouverture/fermeture d’un slidePanel.
ouverture :
this.panels.open({
view : this.createSubView('todo:form', formView, {
model : this.model
}),
options : {
title : 'Test'
}
});
fermeture :
this.panels.close();
Un slidePanel est un panneau latéral souvent utilisé pour afficher des formulaires ou des donnés complémentaires. Vous avez la possibilité d’en ouvrir et d’en fermet facilement au sein de votre vue backbone gràce à this.panels.
Cet objet vous donne accès aux fonction open() et close du panelManager.
Si vous voulez plus d’informations. rendez-vous sur la documentation du panelManager.
Montage de tags Riot
Pour de plus amples informations concernant les tags, comment les créer, rangement, …, Veuillez vous rendre sur la documentation dédiée.
De base, riot regarde le DOM de toute la page web pour créer nos tags et ne garde donc pas la notion de DOM limitée à notre vue courante Backbone. Afin de palier au problème, si vous voulez monter des tags dans votre vue Backbone, vous le pouvez grâce à la fonction mountTags(params).
this.mountTags({
tag : 'jumbotron'
});
Attention : Vu que Riot fait la recherche sur le
elde votre vue, pensez à ajouter le contenu au DOM avant l’appel de cette fonction. De même, pensez à précharger votre tag dans votre vue comme ceci :
var _ = require('underscore'),
View = require('libs/backbone/views/base'),
tpl = require('tpl/index.html');
// préchargement des tags ici
require('components/examples/jumbotron.tag');
module.exports = View.extend({
});
Événements
De Vue
Les événements de vue sont renseignés dans les vues via l’attribut events. Ces événements sont des événements jQuery sur le $el de la vue uniquement (et de ses sous vues).
L’objet events se sépare en deux parties :
- Les Fields : Ce sont les événements jQuery
- Les valeurs : Ce sont les noms des fonctions appelées et qui douvent impérativement être renseigner et exister dans votre vue.
Le contexte des fonctions appelées par events (la variable this), correspond à votre vue.
Events de vue
{
events : {
'submit form' : 'validAction',
'click a#toto' : 'redirectAction'
},
validAction : function (evt) {
// action du formulaire
},
redirectAction : function (evt) {
// action de redirection
}
}
Globaux
Les événements globaux permettent d’effectuer des actions entre vos différentes vues. Par exemple, si une de vos vue finit l’envoie d’un formulaire, elle peut déclencher l’événement d’envoie avec la réponse en paramètre.
Toutes les vues qui écoutent sur ce même événement vont exécuter en même temps la fonction rattachée.
La liste des événements globaux sur lequel une vue écoute est renseignée dans l’attribut globalEvents et se présente comme les événements de vue :
- Les Fields : Ce sont les noms des événements globaux.
- Les valeurs : Ce sont les noms des fonctions appelées et qui douvent impérativement être renseigner et exister dans votre vue.
Le contexte des fonctions appelées par events (la variable this), correspond à votre vue.
Events globaux :
{
globalEvents : {
'submitForm' : 'submitAction',
'addElement' : 'addElementAction'
},
submitAction : function submitAction() {
console.log('submitAction');
},
addElementAction : function addElementAction(element) {
console.log(element);
}
}
Pour envoyer un événement global, vous devrez faire comme ceci :
this.global.trigger('submitForm');
this.global.trigger('addElement' {
name : 'foo'
});
Tag -> View
Nos vues Backbone peuvent directement capturer des événements Riot (si bien entendu ils en déclenchent) simplement de la même façon que les événements de vue et les événements globaux. Bien entendu, vous ne pouvez écouter sur une vue que les événements des tags qu’elle contient.
La liste des événements de Tags de vue est renseignée dans l’attribut tagEvents et elle est séparée en deux niveaux. Au premier niveau on trouve un objet avec pour chaque field le nom du tag et, pour chaque tag, les événements correspondant à evenement + selecteur CSS :
Events de tags :
{
tagEvents : {
jumbotron : {
'click #testId' : 'clickAction'
}
},
clickAction : function clickAction(tag) {
tag.unmount();
console.log(this);
},
}
Dans l’exemple ci dessus, lorsque l’on reçois l’événement click d’un tag jumbotron ayant l’ID testId, alors on effectue l’action clickAction.
Les callback de ces événements ont au moins un paramètre qui correspond à l’objet du Tag concerné par l’événement. Le contexte des fonctions (la variable this), correspond à votre vue.
Sockets
Nos vues Backbone peuvent aussi directement capturer les événements des sockets qui lui sont rattachés, et ce, de la même façon que les autres événements. Bien entendu, vous ne pouvez écouter que sur les sockets qui sont rattachés à votre vue.
La liste des événements sockets est renseignée das l’attribut socketEvents et elle est séparée en deux niveaux. Au premier niveau on trouve un objet avec, pour chaque field le nom du socket et, por chaque socket, les événements correspondants et leur action rattachée.
Attention : pour le socket par défaut (celui sans non si vous avez qu’un seul socket), ses événements sont à renseigner dans le field default.
{
socketEvents : {
default : {
'test-result' : 'socketCallbackAction',
}
},
socketCallbackAction : function socketCallbackAction(params) {
this.getLogger().debug(params);
}
}
Les callback de ces événements ont au moins un paramètre qui correspond à ce que socket.io vous retourne (s’il vous retourne quelque-chose). Le contexte des fonctions (la variable this), correspond à votre vue.
Stickit
Nos vues backbone étendent toutes la bibliothèque Stickit développé par le New York Times. Sa documentation complète afin de rentrer plus en détail dans son fonctionnement se trouve ici
Instanciation
Pour utiliser Stickit, vous avez plusieurs choix possibles entre : Le renseignement directement dans les propriétés de la vue ou en appel direct dans le code comme expliqué dans leur documentation.
À savoir : Dans nos vues, vous n’aurrez pas besoin de faire l’appel à la fonction this.stickit() à la fin de votre render. Il est fait automatiquement par nos vues juste après l’instanciation des tags Riot. De plus, vous n’êtes pas limités, dans les propriétés de la vue, au binding du model principal.
Modèle Principal
Pour le modèle principal (renseigné par
this.model), les Bindings sont renseignés dans le fieldbindingscomme ceci :
{
bindings : {
'#author': 'author'
}
}
Ici, si le field authors de mon modèle est modifié, alors l’élément de ma vue avec l’identifiant #authors est mis à jour avec la nouvelle valeur.
Modèles complémentaires
Pour les modèles complémentaires (renseignés dans
this.models), les Bindings sont renseignés dans le field<nomdumodel>Bindings. Ce qui nous donne :
{
userBindings : {
'#name' : 'name'
},
moduleBindings : {
'#lock' : 'islocked'
}
initialize : function (options) {
this.models.user = options.user;
this.models.module = options.module;
}
}
Ici, les bindins du modèle user sont renseignés dans le field userBindings et les bindings du modèle module sont renseignés dans le field moduleBindings.
Render
appel pour l’affichage
$('body').html(view.render().$el);
déclaration de la fonction
render : function (done) {
this.$el.html(this.template(tpl, {
model : this.model
}));
done();
}
La fonction render renseignée dans la vue est maintenant asynchrone. En effet, au lieu de faire un return this, vous devrez exécuter le callback passé en paramètre.
Par contre, quand vous appellerez la méthode render dans un router ou pour l’affichage d’une sous vue, rien ne change. En effet lors de l’appel, plusieurs fonctions sont automatiquement appelées :
- waitingRender : utilisée pour afficher le contenu de la vue pendant le chargement des données requises
- beforeRender : utilisée pour faire des traitements avant le véritable render (chargement de données externes, …)
- render : exécute la fonction render que vous avez défini dans votre vue
- afterRender : utilisé pour faire des traitements après le render de la vue (chargement de scripts javascript, …)
Et pour finir, chargement de backbone.stickit sur tous les models de la vue, montage des tags de base Riot et lancement de l’événement DOMContentLoaded
Sockets
Il est possible de rattacher des connexions sockets aux vues Backbone comme ceci :
{
socket : '0.0.0.0:8080', // default socket
sockets : {
importer : 'importer.socketexample.io'
}
}
Si la connexion existe déjà, on récupère l’existante sinon on la créée. Vous pourrez directement communiquer en socket des façons suivantes :
this.socket.emit('test', {
name : 'Laurent'
}, (result) => {
this.getLogger().debug(result);
});
this.sockets.importer.emit('test', {
name : 'Laurent'
});
Le rattachement d’événements se fait comme vu plus haut sur la gestion des événements Socket.
Riot
Riot.JS est un petit framework permettantde crér des tags à la manière de Reat.JS afin de réutiliser très facilement des composants complexes.
La documentation complète (et en français) se trouve ici
Organisation
Les tags de Riot sont rangés dans le répertoire js/components et sont rangés par rapport aux modules les utilisant (ou common pour les composants communs).
Structuration
<tag-name>
<!-- contenu HTML du tag -->
<script>
// script rattaché aux tags
</script>
</tag-name>
Les tags sont définis dans le noeud tag-name qui sera à remplacer par le nom de votre tag (par exemble : colorpicker, datepicker, …) et il est divisé à l’intérieur en deux grandes parties :
- Le HTML : C’est en réalité le template* du contenu de votre tag. Vouis pouvez très bien appeler un sous tag à cet endroit là comme vous le feriez ailleurs.
- Le Javascript : C’est toute la partie traitement de votre tag. C’est aussi ici que vous pourrez faire les appels à
require()pour charger les dépendances.
Attention : Les alias de Browserify pour le require ne marchent pas du tout ici.
Composants de base
Vous trouverez ici la liste complète ainsi que le fonctionnement de tous les composants de base RiotJS.
Chips
Génère un composant chips définit par materialize. Est aussi utilisé si vous voulez créer des tags.
<chips content="Chip d'exemple"></chips>
this.mountTags({
tag : 'chips'
});
| option | description | default |
|---|---|---|
| content | Contenu de la chip. Si le libellé est un code de traduction, il sera automatiquement traduit | - |
| img | url d’image de la chip affiché en cerclé à gauche | - |
| close | Si présent, affiche une croix à droite pour pouvoir supprimer la chip | - |
Voici la liste des événements que vous pouvez capturer dans votre vue :
| événement | description |
|---|---|
| close | Appelé lors du clic sur le bouton close de la chip |
Empty
Génère une empty view avec icône + texte. Utilisé pour les vues liste si aucun élément disponible
<empty material="true" data-icon="list" data-message="tasksEmpty"></empty>
this.mountTags({
tag : 'empty'
});
| option | description | default |
|---|---|---|
| material | Si renseigné, on passe par les icônes material | - |
| dataIcon | nom de l’icône (ou sa classe si non material) | - |
| dataMessage | Message affiché. Si le libellé est un code de traduction, il sera automatiquement traduit | - |
Raw
Génère une vue contenant du code HTML. Ce composant est surtout utilisé pour gérer le rendu html d’une variable dans un autre composant RiotJS personnalisé.
<raw content="contenuHtmlouPas" />
this.mountTags({
tag : 'raw'
});
| option | description | default |
|---|---|---|
| content | Contenu de l’objet Raw. Si il contient de l’HTML, sera affiché avec le bon formattage. | - |
I18n
Permet de traduire un texte, mot, phrase dans la langue courante à partir d’un mot clé. Le système de traduction passe par la classe i18n du projet utilisant en arrière plan la library globalize.
À noter que le tag se trouve moins personnalisable que la fonction de traduction fournie par la classe i18n. Si vous voulez plus de choix, veuillez ne pas utiliser le tag.
<i18n word="welcome" />
this.mountTags({
tag : 'i18n'
});
| option | description | default |
|---|---|---|
| word | mot clé à traduire par rapport à vos fichiers json de globalize | - |
| locale | Permet de traduire dans une autre locale que la locale courante | - |
| var- |
Variables à insérer dans la traduction comme par exemple une quantité, un nom, une heure, … | - |
Pour les variables, vous devrez les passer comme ceci si par exemple votre phrase à traduire a besoin de la variable quantity :
<i18n word="cartItem" var-quantity="2" />
Composants loaders
Les composants loaders permettent d’afficher un loader à l’écran. Barre de progression, spinner, barre de loading indéterminé, …
Spinner
<spinner
size="button"
color="spinner-grey-only"
></spinner>
this.mountTags({
tag : 'spinner'
});
| option | description | default |
|---|---|---|
| size | Taille du spinner parmi button, small et big |
small |
| color | Couleur du spinner parmi spinner-green-only, spinner-red-only, spinner-blue-only, spinner-yellow-only et spinner-grey-only |
spinner-green-only |
Progress
Génère une progressBar faisant, selon les cas, soit une progression standard, soit une progression indéterminée.
<material-progress></material-progress>
this.mountTags({
tag : 'material-progress'
});
| option | description | default |
|---|---|---|
| isdeterminate | Si présent, alors la progressBar est de type déterminé | - |
| progress | Permet de dire à combien de % se situe la progressBar. Ne marche que si isdeterminate est renseigné | 0 |
Voici les événements que vous pouvez lancer depuis le javascript gràce à la fonction trigger :
| événement | description |
|---|---|
progress |
Permet de changer le pourcentage de la progressBar |
Composants formulaire
Tous les composants de formulaires utilisent l’apparence Material UI définie par materialize-css.
De base, si vous utilisez ces composants Riot dans une vue Backbone étendant backbone-goomeo/js/libs/backbone/views/base.form, alors vous aurez automatiquement de chargés les composants material-input et material-textarea
Input
<material-input
col="s6"
data-id="name"
data-name="name"
parsley-required="true"
></material-input>
this.mountTags({
tag : 'material-input'
});
Input de base généré avec le label associé.
| option | description | default |
|---|---|---|
| col | Si renseigné, permet de définir la colonne associée au grid système | - |
| data-id | Identifiant de l’input | - |
| data-name | Nom de l’input | - |
| type | Type de l’input | text |
| disabled | Si renseigné, disable l’input | - |
| icon | nom de l’icon du material design afin de le rajouté en préfixe | - |
| value | valeur de l’input | - |
| is-active | ajoute la classe active au label associé |
- |
| label | libellé du label. Si le libellé est un code de traduction, il sera automatiquement traduit | name |
| no-label | Si renseigné, l’input n’aura pas de label | - |
Textarea
<material-textarea
col="s6"
data-id="name"
data-name="name"
parsley-required="true"
></material-textarea>
this.mountTags({
tag : 'material-textarea'
});
Textarea de base généré avec le label associé.
| option | description | default |
|---|---|---|
| col | Si renseigné, permet de définir la colonne associée au grid système | - |
| data-id | Identifiant de l’input | - |
| data-name | Nom de l’input | - |
| disabled | Si renseigné, disable l’input | - |
| icon | nom de l’icon du material design afin de le rajouté en préfixe | - |
| value | valeur de l’input | - |
| is-active | ajoute la classe active au label associé |
- |
| label | libellé du label. Si le libellé est un code de traduction, il sera automatiquement traduit | name |
| no-label | Si renseigné, l’input n’aura pas de label | - |
Checkbox
<material-checkbox
data-id="name"
data-name="name"
parsley-required="true"
label="Choix 1"
></material-checkbox>
this.mountTags({
tag : 'material-checkbox'
});
Checkbox de base généré avec le label associé.
| option | description | default |
|---|---|---|
| data-id | Identifiant de l’input | - |
| data-name | Nom de l’input | - |
| disabled | Si renseigné, disable l’input | - |
| value | valeur de l’input | - |
| label | libellé du label. Si le libellé est un code de traduction, il sera automatiquement traduit | - |
| isfilled | Si présent rajoute la classe filled-in à la checkbox |
- |
| checked | Si présent, rajoute l’attribut checked à la checkbox |
- |
Radio
<material-radio
data-id="name"
data-name="name"
parsley-required="true"
label="Choix 1"
></material-radio>
this.mountTags({
tag : 'material-radio'
});
Radio de base généré avec le label associé.
| option | description | default |
|---|---|---|
| data-id | Identifiant de l’input | - |
| data-name | Nom de l’input | - |
| disabled | Si renseigné, disable l’input | - |
| value | valeur de l’input | - |
| label | libellé du label. Si le libellé est un code de traduction, il sera automatiquement traduit | - |
| isgap | Si présent rajoute la classe with-gap à la radio |
- |
| checked | Si présent, rajoute l’attribut checked à la radio |
- |
Select
<material-select
col="s6"
data-id="name"
data-name="name"
parsley-required="true"
default="Choose item please"
></material-select>
this.mountTags({
tag : 'material-select',
options : {
items : [
{ value : 1, name : "Choice One" },
{ value : 2, name : "Choice Two" }
]
}
});
Select de base avec les éléments passés en Javascript
| option | description | default |
|---|---|---|
| col | Si renseigné, permet de définir la colonne associée au grid système | - |
| data-id | Identifiant de l’input | - |
| data-name | Nom de l’input | - |
| disabled | Si renseigné, disable l’input | - |
| multiple | Si présent, le select est un multiselect | - |
| label | libellé du label. Si le libellé est un code de traduction, il sera automatiquement traduit | choice |
| default | Option par défaut des selects affichée en première position sans aucune valeur associée | - |
| no-label | Si renseigné, l’input n’aura pas de label | - |
| items | Tableau d’éléments | [ ] |
| items[ ].name | libellé d’un élément | - |
| items[ ].value | valeur d’un élément | - |
| items[ ].selected | Si présent, alors lélément est sélectionné | - |
Switch
<material-switch
data-id="name"
data-name="name"
on="Label de droite"
off="Label de gauche"
></material-checkbox>
this.mountTags({
tag : 'material-switch'
});
Switch de base.
| option | description | default |
|---|---|---|
| data-id | Identifiant de l’input | - |
| data-name | Nom de l’input | - |
| disabled | Si renseigné, disable l’input | - |
| value | valeur de l’input | - |
| checked | Si présent, rajoute l’attribut checked à l’input |
- |
| on | libellé du label positionné à droite (switch checked). Si le libellé est un code de traduction, il sera automatiquement traduit | on |
| off | libellé du label positionné à gauche (switch non checked). Si le libellé est un code de traduction, il sera automatiquement traduit | off |
Colorpicker
Génère un colorpicker avec le label de base. Pour le colorpicker, on utilise la library jquery Spectrum qui permet d’avoir un colorpicker complet et léger.
<colorpicker
col="s6"
data-id="color"
data-name="color"
parsley-required="true"
></colorpicker>
this.mountTags({
tag : 'colorpicker'
});
| option | description | default |
|---|---|---|
| col | Si renseigné, permet de définir la colonne associée au grid système | - |
| data-id | Identifiant de l’input | - |
| data-name | Nom de l’input | - |
| color | couleur renseignée de base | - |
| label | libellé du label. Si le libellé est un code de traduction, il sera automatiquement traduit | color |
| no-label | Si renseigné, l’input n’aura pas de label | - |
| spectrum | Configuration spectrum. Merci de voir la documentation de Spectrum | - |
Voici la configuration de base de spectrum :
| option | description | valeur |
|---|---|---|
| showInitial | Permet d’afficher la couleur de base en entrant dans le colorpicker et la nouvelle couleur | true |
| showInput | Affiche l’input de couleur afin de rentrer le code rgba, hex, hex8, … | true |
| preferredFormat | Format d’affichage de la réponse dans l’input | hex |
Voici la liste des événements que vous pouvez capturer dans votre vue :
| événement | description |
|---|---|
change.spectrum |
appelé quand la couleur de spectrum a été validée |
show.spectrum |
appelé lors de l’affichage du composant spectrum |
hide.spectrum |
appelé lors du masquage du composant spectrum |
beforeShow.spectrum |
appelé après l’affichage de spectrum |
dragstart.spectrum |
appelé quand on bouge le curseur de couleur dans spectrum |
dragstop.spectrum |
appelé quand on relache le curseur de couleur dans spectrum |
Datepicker
Génère un datepicker avec le label de base. Pour le datepicker, on utilise la library jquery pickadate modifiée par l’équire de materialize-css.
Cette library permet d’avoir un datepicker entièrement configurable.
<material-datepicker
col="s6"
data-id="date"
data-name="date"
parsley-required="true"
icon="event"
></material-datepicker>
this.mountTags({
tag : 'material-datepicker'
});
| option | description | default |
|---|---|---|
| col | Si renseigné, permet de définir la colonne associée au grid système | - |
| data-id | Identifiant de l’input | - |
| data-name | Nom de l’input | - |
| value | date renseignée de base | - |
| label | libellé du label. Si le libellé est un code de traduction, il sera automatiquement traduit | date |
| no-label | Si renseigné, l’input n’aura pas de label | - |
| icon | nom de l’icon du material design afin de le rajouté en préfixe | - |
| disabled | Si renseigné, disable l’input | - |
| datepicker | Configuration du datepicker. Merci de voir la documentation de pickadate | - |
Voici la configuration de base de datepicker :
| option | description | valeur |
|---|---|---|
| container | Emplacement de la fenêtre du datepicker dans le DOM html. Doit être un sélecteur CSS valide. | body |
Voici la liste des événements que vous pouvez capturer dans votre vue :
| événement | description |
|---|---|
datepicker:open |
Appelé lors de l’ouverture du datepicker |
datepicker:close |
Appelé lors de la fermeture du datepicker |
datepicker:render |
Appelé lors de l’affichage du datepicker |
datepicker:start |
Appelé lors de l’initialisation du datepicker |
datepicker:stop |
Appelé lors de la destruction du datepicker |
datepicker:set |
Appelé lors du passage d’une valeur |
Slider
Génère un slider basé sur l’input HTML5 range.
<material-slider
data-id="date"
data-name="date"
parsley-required="true"
></material-slider>
this.mountTags({
tag : 'material-slider'
});
| option | description | default |
|---|---|---|
| data-id | Identifiant de l’input | - |
| data-name | Nom de l’input | - |
| value | date renseignée de base | - |
| disabled | Si renseigné, disable l’input | - |
| min | Valeur minimale du slider | 0 |
| max | Valeur maximale du slider | 100 |
NoUiSlider
Génère un slider plus complet en utilisant la library noUiSlider.
<material-nouislider></material-nouislider>
this.mountTags({
tag : 'material-nouislider',
options : {
slider : {
start: [0, 100],
connect: true,
step: 1,
range: {
'min': 0,
'max': 100
}
}
}
});
| option | description | default |
|---|---|---|
| slider | Options de noUiSlider. Merci de voir la documentation de nouislider | - |
Voici la configuration de base de nouislider :
| option | description | default |
|---|---|---|
| start | Valeurs de départ du slider | [0, 100] |
| step | De combien en combien bouge la valeur du slide | 1 |
| range | Valeur min/max du slider | { min : 0, max : 100 } |
| format | Transformation de la valeur du slider. Par défaut, on supprime les décipales des valeurs du slider | { to : function, from : function } |
Voici la liste des événements que vous pouvez capturer dans votre vue :
| événement | description |
|---|---|
nouislider:update |
Appelée quand la valeur du slider change. Retourne un tableau des valeurs (left et right) ainsi que le curseur qui bouge (si c’est celui de gauche ou droite). |
nouislider:slide |
Appelée quand on fait bouger le slider |
nouislider:set |
Appelée quand on modifie une valeur manuellement du slider via la méthode set() |
nouislider:change |
Appelé quand la valeur du slide a changée |
nouislider:start |
Appelée lors de la construction du slider |
nouislider:end |
Appelée lors de la destruction du slider |
nouislider:hover |
Appelé lors du survol de la souris. Passe en paramètre la valeur du slider à cet endroit. |
Voici les fonctions accéssibles depuis le tag côté javascript :
| fonction | description |
|---|---|
get |
Permet de récupérer la valeur du slider. Merci de voir la documentation de nouislider |
set |
Permet de modifier la valeur du slider. Merci de voir la documentation de nouislider |
Pending
Génère un bouton gérant un état de loading dans le style de Ladda-Button. Ce composant est utilisé pour mettre en attente l’utilisateur lors de la validation du formulaire, …
<btn-pending data-id="validate"></btn-pending>
this.mountTags({
tag : 'btn-pending'
});
| option | description | default |
|---|---|---|
| color | Couleur du bouton d’après celles de materialoze-css | green |
| type | Type de bouton | submit |
| data-id | ID du bouton | submit |
| label | libellé du label. Si le libellé est un code de traduction, il sera automatiquement traduit | validate |
Voici les événements que vous pouvez lancer depuis le javascript gràce à la fonction trigger :
| événement | description |
|---|---|
start |
Met le bouton dans l’état de loading. Dans ce cas le bouton est disabled et n’est plus clickable |
stop |
Met le bouton dans son fonctionnement normal. Le bouton est clickable. |
Rating
Génère un élément rating permettant de donner son avis entre une et x étoiles.
<rating></rating>
this.mountTags({
tag : 'rating'
});
| option | description | default |
|---|---|---|
| col | Si renseigné, permet de définir la colonne associée au grid système | - |
| data-id | Identifiant de l’input | - |
| data-name | Nom de l’input | - |
| value | valeur renseignée de base | - |
| num | Nombre d’étoiles voulues | 5 |
| label | libellé du label. Si le libellé est un code de traduction, il sera automatiquement traduit | rating |
| no-label | Si renseigné, l’input n’aura pas de label | - |
| no-star-label | Si renseigné, n’affiche pas le numéro des étoiles | - |
Voici la liste des événements que vous pouvez capturer dans votre vue :
| événement | description |
|---|---|
change |
Appelée lorsque vous changez la valeur du rating. Retourne la nouvelle valeur |
Survey
Génère un élément survey permettant de donner sune note de 1 à 10. 1 étant la pire note et 10 la mieux .
<survey></survey>
this.mountTags({
tag : 'survey'
});
| option | description | default |
|---|---|---|
| col | Si renseigné, permet de définir la colonne associée au grid système | - |
| data-id | Identifiant de l’input | - |
| data-name | Nom de l’input | - |
| value | valeur renseignée de base | - |
| label | libellé du label. Si le libellé est un code de traduction, il sera automatiquement traduit | rating |
| no-label | Si renseigné, l’input n’aura pas de label | - |
Voici la liste des événements que vous pouvez capturer dans votre vue :
| événement | description |
|---|---|
change |
Appelée lorsque vous changez la valeur du rating. Retourne la nouvelle valeur |
Lang Input
Génère plusieurs input en fonction des langues passées en paramètre. Ces input permettent de remplir un champ traduit au sein de votre projet.
Format du champ traduit
{
"fr" : "Titre francais",
"en" : "titre en"
}
<material-input-lang
id="name"
name="name"
col="m6"
></material-input-lang>
this.mountTags({
tag : 'material-input-lang',
options : {
langs : [ 'fr', 'en' ]
}
});
| option | description | default |
|---|---|---|
| col | Si renseigné, permet de définir la colonne associée au grid système | - |
| data-id | Identifiant de l’input | - |
| data-name | Nom de l’input | - |
| value | valeur renseignée de base | - |
| label | libellé du label. Si le libellé est un code de traduction, il sera automatiquement traduit | name |
| disabled | Si renseigné alors tous les input du composant sont désactivés. | - |
| is-active | Si renseigné, les label ont la classe active de renseigné. |
- |
Lang Textarea
Génère plusieurs textarea en fonction des langues passées en paramètre. Ces textarea permettent de remplir un champ traduit au sein de votre projet.
Format du champ traduit
{
"fr" : "Titre francais",
"en" : "titre en"
}
<material-textarea-lang
id="name"
name="name"
col="m6"
></material-textarea-lang>
this.mountTags({
tag : 'material-textarea-lang',
options : {
langs : [ 'fr', 'en' ]
}
});
| option | description | default |
|---|---|---|
| col | Si renseigné, permet de définir la colonne associée au grid système | - |
| data-id | Identifiant de l’input | - |
| data-name | Nom de l’input | - |
| value | valeur renseignée de base | - |
| label | libellé du label. Si le libellé est un code de traduction, il sera automatiquement traduit | name |
| disabled | Si renseigné alors tous les input du composant sont désactivés. | - |
| is-active | Si renseigné, les label ont la classe active de renseigné. |
- |
Modals
Voici la collection de toutes les modals disponibles au sein de la library.
La plupart des modals sont des vues Backbone afin de simplifier la gestion des événements et la personnalisation de chacune d’elles.
Delete
Modale utilisée pour la suppression d’éléments. Vous pouvez choisir entre une suppression 1 et 2 facteurs. La suppression à 2 facteurs demandant de remplir un input avant suppression.
var deleteModal = require('backbone-goomeo/js/modules/common/modals/delete');
// ...
this.modal.open({
view : this.createSubView('modal:delete', deleteModal, {
hasDoubleVerif : true,
validateCallback : function () {
this.model.destroy();
this.toasts.success({ message : 'Tâche supprimée avec succès.' });
this.dispose();
}.bind(this)
})
});
// ...
| parametre | type | description | default |
|---|---|---|---|
| message | String | Message du dialog. Si le libellé est un code de traduction, il sera automatiquement traduit | deleteMessage |
| title | String | Titre du dialog. Si le libellé est un code de traduction, il sera automatiquement traduit | deleteTitle |
| accept | String | Texte du bouton de validation. Si le libellé est un code de traduction, il sera automatiquement traduit | delete |
| cancel | String | Texte du bouton d’annulation. Si le libellé est un code de traduction, il sera automatiquement traduit | cancel |
| icon | String | Classe d’îcone pour l’afficher à gauche du texte de la modal | delete |
| labelDoubleVerif | String | Label utilisé sir la bouble vérification est activée | deleteDoubleVerif |
| hasDoubleVerif | Boolean | True : Double vérification activée. Il y a un input avec KO. Pour que la modale soit confirmée il faut le remplacer par OK. | false |
| validateCallback | Function | Fonction appelée lors de la confirmation de la modale | - |
| cancelCallback | Function | Fonction appelée lors de l’annulation de la modale | - |
API - EventManager
L’eventManager est l’objet de centralisation de tous les événements globaux. Cette classe étend uniquement Backbone.Events.
API - ViewManager
Le view Manager est la classe utilisée pour gérer la création de nouvelles vues et la suppression des vues existantes.
create(name, view, [options])
Créer une nouvelle vue Backbone et l’ajoute à la collection des vues.
| parametre | description | default |
|---|---|---|
| name | Nom de la vue. Fait office d’ID et doit être unique | - |
| view | Vue Backbone non instanciée | - |
| options | Options à passer à la vue lors de l’instanciation. Ce sont ceux que vous retrouverez dans la fonction initialize |
- |
get(name)
Récupère une vue à partir de son nom. Si la vue n’existe pas, retourne false
| parametre | description | default |
|---|---|---|
| name | le nom de la vue | - |
disposeAll([without])
Supprime toutes les vues sauf celles passées en paramètre
| parametre | description | default |
|---|---|---|
| without | Tableau de noms de vues à ne pas supprimer | - |
dispose(name)
upprime la vue passée en paramètre, ses événements ainsi que toutes ses sous-vues et leurs événements
| parametre | description | default |
|---|---|---|
| name | le nom de la vue | - |
exist(name)
Test si la vue passé en paramètre existe.
| parametre | description | default |
|---|---|---|
| name | le nom de la vue | - |
API - PanelManager
Le panel manager gère la gestion du panneau latéral servant à contenir un formulaire ou des informations complémentaires.
Ce pannel se situe du côté droite de l’écran et, selon la résulution de lécran et la taille désirée, vous pouvez avoir un panneau couvrant entre 30 et 100% de l’écran.
Tailles disponibles
Voici les classes disponibles ainsi que la taille qu’elles représentent :
| classe | taille |
|---|---|
| low | 30% |
| medium | 50% |
| low-high | 70% |
| medium-high | 80% |
| high | 90% |
| max | 100% |
open(params)
Fonction appelée pour ouvrir un slidePannel
| parametre | description | default |
|---|---|---|
| params | Function params | - |
| params.sizeClass | Taille du panneau. Utilisez les classes notée au dessus | medium |
| params.view | Vue Backbone instanciée. N’est pas obligatoire | - |
| params.html | Contenu HTML à mettre dans le slidePanel. Se met à la place du param view |
- |
| params.closeOnClickOutside | true : Le panel se ferme quand on clic en dehors. | false |
close
Ferme le slidePanel
API - ModalManager
le modalManager gère la création et la fermeture de toutes les modales crées au sein du projet.
open(params)
Permet de crér une modale à partir d’HTML ou d’une vue backbone.
Atention : Popur marcher en html vous devez avoir la structure totale d’une modal.
Pour les vue, la classe de votre vue doit être celle de base de la modal.
| parametre | description | default |
|---|---|---|
| params.html | code html de votre modal | - |
| params.view | Vue backbone instanciée | - |
| params.options | Options de la fonction modal fournie par materialize-css | - |
close(params)
| parametre | description | default |
|---|---|---|
| params.name | Nom de la vue backbone associée pour qu’elle soit détruite | - |
| params.options | Options de la fonction modal fournie par materialize-css | - |
API - TemplatesManager
Classe servant à compiler les templates et à récupérer directement ceux qui l’ont été.
compile(template)
Compile le template passé en paramètre et retourne la fonction généré par _.template().
Si le template passé a déjà été compilé, retourne directement le résultat de _.template stocké en mémoire.
| parametre | description | default |
|---|---|---|
| template | Contenu du template à compiler | - |
remove(template)
Supprime le template passé en paramètre de la mémoire du templateManager pour permettre une nouvelle compilation de zéro au prochain appel de compile()
| parametre | description | default |
|---|---|---|
| template | Contenu du template à supprimer | - |
API - View : Base
La vue Base permet de rajouter plusieurs fonctions à Backbone.JS parmis :
- renseignement dans votre vue des events globaux à la manière des events de DOM
- renseignement des modification du dom à partir de tous les models de votre vue (via baxkbone.stickit)
- renseignement des events des composants riot à la manière des events de DOM
- montage de tags riot à partir du DOM de votre vue
- utilisation des toasts de materialize-css plus facilement
- création des sous vues permettant automatiquement leur suppression si la vue parente est supprimée
createSubView(name, view, options)
Permet de créer une sous vue et de la rattacher directement à cette vue-ci.
| params | type | description | default |
|---|---|---|---|
| name | string | Nom de la vue. Attention si le nom existe déjà, l’ancienne vue est supprimée | - |
| view | Backbone.View | Vue Backbone non initialisée | - |
| [options] | object | Options passées à la vue Backbone et que vous pouvez retrouver dans la fonction initialize |
- |
template(template, params)
Permet de compiler un template en fonction des paramètres passés et retourne un string du template compilé.
| params | type | description | default |
|---|---|---|---|
| template | string | Template à compiler. | - |
| params | object | Paramètres du template | - |
De base, les templates faits à partir d’ici ont les paramètres suivants :
- moment : Objet moment afin de facilement manipuler les dates
dispose()
Supprime la vue et tout ce qui s’y rapporte en événements et en tags
mountTags(params)
Permet de monter des tags RIOT dans notre vue et de rattacher tous les événements renseignés
| params | type | description | default |
|---|---|---|---|
| params | object | Function params | - |
| params.tag | string | nom du tag à monter | - |
| [params.selector] | string | Selecteur CSS valide (ex : ‘div#monid > span’) | - |
| [params.domNode] | domNode | Node DOM qui sera remplacée par le tag à charger | - |
| [params.options] | object | Options du tag | - |
Retourne un tableau de tags Riot.
unmountAllTags()
Supprime tous les tags Riot de notre Vue
waitingRender(callback)
Fonction appelée avant beforeRender pour afficher du contenu pendant l’exécution de cette fonction (chargement, une emptyView, …). Fonction asynchrone. Pensez à appeler le callback à la fin de votre fonction
beforeRender(callback)
Fonction appelée juste avant l’appel de Render. Fonction asynchrone. Pensez à appeler le callback à la fin de votre fonction
render(callback)
Fonction appelée pour afficher le rendu final de votre vue. Fonction asynchrone. Pensez à appeler le callback à la fin de votre fonction
afterRender(callback)
Fonction appelée juste après l’appel de Render. Fonction asynchrone. Pensez à appeler le callback à la fin de votre fonction
prerequireAction()
Fonction appelée juste après Initialize et servant à charger des données externes (données de models, collections, …)
global
Objet permettant de gérer tous les événements globaux de votre vue. Cet objet est composé des mêmes fonctions que Backbone.Events.
panels
Objet permettant de manipuler le slidePanel au travers du PanelManager. Utilise les fonctions open et close.
modal
Objet permettant de manipuler les modals au travers du ModalManager. Utilise les fonctions open et close.
toasts.show(params)
Permet d’afficher un élément Toast à partir des paramètres d’entrée.
| params | type | description | default |
|---|---|---|---|
| params | object | Function params | - |
| params.message | string ou jqueryObject | Message du toast, l’HTML est accepté mais devra impérativement être un objet jQuery | - |
| [params.duration] | number | Temps d’affichage du toast en milliseconde | 3000 |
| [params.style] | string | Classe de personnalisation pour le toast. De base seul la classe rounded est disponible mais vous pouvez créer les votres. |
- |
| [params.callback] | function | Fonction appelée après l’affichage du toast | - |
toasts.success(params)
Permet d’afficher un élément Toast à partir des paramètres d’entrée pour les messages de succès (avec l’icône à gauche)
| params | type | description | default |
|---|---|---|---|
| params | object | Function params | - |
| params.message | string | Message du toast, l’HTML est accepté mais devra impérativement être un objet jQuery | - |
| [params.duration] | number | Temps d’affichage du toast en milliseconde | 3000 |
| [params.style] | string | Classe de personnalisation pour le toast. De base seul la classe rounded est disponible mais vous pouvez créer les votres. |
- |
| [params.callback] | function | Fonction appelée après l’affichage du toast | - |
toasts.error(params)
Permet d’afficher un élément Toast à partir des paramètres d’entrée pour les messages d’erreur (avec l’icône à gauche)
| params | type | description | default |
|---|---|---|---|
| params | object | Function params | - |
| params.message | string | Message du toast, l’HTML est accepté mais devra impérativement être un objet jQuery | - |
| [params.duration] | number | Temps d’affichage du toast en milliseconde | 3000 |
| [params.style] | string | Classe de personnalisation pour le toast. De base seul la classe rounded est disponible mais vous pouvez créer les votres. |
- |
| [params.callback] | function | Fonction appelée après l’affichage du toast | - |
toasts.info(params)
Permet d’afficher un élément Toast à partir des paramètres d’entrée pour les messages d’information (avec l’icône à gauche)
| params | type | description | default |
|---|---|---|---|
| params | object | Function params | - |
| params.message | string | Message du toast, l’HTML est accepté mais devra impérativement être un objet jQuery | - |
| [params.duration] | number | Temps d’affichage du toast en milliseconde | 3000 |
| [params.style] | string | Classe de personnalisation pour le toast. De base seul la classe rounded est disponible mais vous pouvez créer les votres. |
- |
| [params.callback] | function | Fonction appelée après l’affichage du toast | - |
toasts.warn(params)
Permet d’afficher un élément Toast à partir des paramètres d’entrée pour les messages de warning (avec l’icône à gauche)
| params | type | description | default |
|---|---|---|---|
| params | object | Function params | - |
| params.message | string | Message du toast, l’HTML est accepté mais devra impérativement être un objet jQuery | - |
| [params.duration] | number | Temps d’affichage du toast en milliseconde | 3000 |
| [params.style] | string | Classe de personnalisation pour le toast. De base seul la classe rounded est disponible mais vous pouvez créer les votres. |
- |
| [params.callback] | function | Fonction appelée après l’affichage du toast | - |
getLogger()
Permet de récupérer le logger rattaché à la vue courante. à utiliser à la place et comme l’objet console.
API - Router
getLogger()
Permet de récupérer le logger rattaché au routeur courant. à utiliser à la place et comme l’objet console.