rss
Affichage des articles dont le libellé est JavaScript. Afficher tous les articles
Affichage des articles dont le libellé est JavaScript. Afficher tous les articles

Swagger UI + Auth0 Bearer

When you would like to integrate Swagger UI with a token based authentication (like Auth0), this is the way you need to update Swagger index.html :


      function addApiKeyAuthorization(){
        var key = encodeURIComponent($('#input_apiKey')[0].value);
        if(key && key.trim() != "") {
            var apiKeyAuth = new SwaggerClient.ApiKeyAuthorization("Authorization", "Bearer " + key, "header");
            window.swaggerUi.api.clientAuthorizations.add("key", apiKeyAuth);
            log("added key " + key);
        }
      }

Instead of adding api_key as part of the query, this code is adding your token in an "Authorization" header and with "Bearer " as prefix.

enjoy

GMail: gestion de vos emails aux petits oignons

Lorsque vous vous abonnez à une liste de diffusion / mailing-liste (exemple: archive des ML Apache ) ou alors lorsque vous recevez des mails automatisés (exemple: résultats de build Jenkins);

ce que vous aimez c'est :

  • recevoir les mails en temps réel ou selon vos préférences sur vos différents supports clients mails,
  • (ML) pouvoir y répondre de suite.
ce que vous détestez c'est :
  • avoir à classer/archiver ces emails,
  • avoir à supprimer les anciens mails inutiles (redondants avec les archives des ML ou avec votre dashboard Jenkins).

L'idéal serait de souscrire aux ML sans en avoir les inconvénients. Peut être des services en lignes ou d'autres méthodes existent (ex. souscription à un RSS) ; certains même me diront mais pourquoi classer ses mails :), .. mais personnellement j'ai décidé d'opter pour l'automatisation de la gestion de ce type de mails


Première étape : appliquer un label aux emails reçus : je ne vais pas faire l'affront de décrire cette étape car je pense que l'aide GMail est auto suffisante.

Seconde étape : utiliser un script google script pour automatiser la gestion de ces mails. Pour cette étape, rendez vous sur cette page de code. Vous y trouverez le code à copier-coller sur votre google script. Le reste n'est que paramétrage. Ce script utilise notamment les filtres avancés pour déterminer les fils de discussion (thread;groupe de mails) utiles.
Le code est assez lisible en l'état. 

Dernière étape : planifier l'exécution du script selon vos besoins.  L'aide en ligne de google script est très bien structurée.



Personnellement avec un filtre de réception, je positionne mes mails automatisés sous un label fils du label "ML". 
Puis avec ce code google script, je peux archiver automatiquement les mails de ML vieux de 2 jours et supprimer automatiquement les mails archivés de ML vieux de 60 jours minimum et n'ayant pas de label "keep".



Et vous comment faites vous ? des remarques positives/négatives sur ce type de gestion ..?


npm et bower: fiche pratique

Cet article est une fiche pratique (commandes de base) pour npm et Bower package managers.
  • Commandes utiles pour configurer NPM:
npm config set proxy http://proxy:8080
npm config set https-proxy http://proxy:8080
npm config set strict-ssl false
  • Installation
npm install -g bower
  • Bower derrière un proxy : utiliser les variables d'environnement http_proxy et https_proxy ou le fichier .bowerrc
  • Installation d'une dépendance
bower install jquery
  • Mise à jour d'une dépendance
bower update jquery
  • Info et version d'une dépendance
bower info jquery
bower search angular%bootstrap%
  • Bower repose sur un fichier de configuration bower.json dont voici un exemple:
{
  "name": "myproject-webgui",
  "version": "0.0.0",
  "dependencies": {
    "angular": "1.3.1",
    "json3": "~3.2.6",
    "es5-shim": "~2.1.0",
    "jquery": "~1.11.0",
    "bootstrap": "~3.0.3",
    "angular-resource": "1.3.1",
    "angular-cookies": "1.3.1",
    "angular-sanitize": "1.3.1",
    "angular-route": "1.3.1",
    "ng-table": "0.3.3"
  },
  "devDependencies": {
    "angular-mocks": "1.3.1",
    "angular-scenario": "1.3.1"
  }
}

ExtJs Grid Cell : récupérer les classes de style d'une cellule de tableau

En ExtJs, il peut être utile de récupérer le style d'une cellule d'Ext.grid.EditorGridPanel par exemple.

voici comment procéder:

Dans un premier temps, il vous faut une référence vers votre grille (qui possède un attribut id unique bien sûr, ici égal à "myGridId"):

var myGrid = Ext.getCmp("myGridId");


Ensuite, par l'intermédiaire de la vue correspondant à la grille,
il est possible de récupérer l'élément HTML TD correspondant à une cellule (ici ligne 0, colonne 3)

var row = 0;
var col = 3;
var myCellHtmlTd = myGrid.getView().getCell(row,col);


Le résultat obtenu (myCellHtmlTd) est un élémént DOM Html : cf. référence w3schools

Il ne vous reste plus qu'a accéder à l'attribut "class" de votre élément pour obtenir les classes de style appliquées à la cellule.

var cellClass = myCellHtmlTd.getAttribute("class");
// pour IE HtmlElement possède les classes dans l'attribut "classname" !
cellClass = (cellClass ? cellClass : myCellHtmlTd.getAttribute("classname"));

Récupérer le style appliqué à une cellule permet par exemple de distinguer sur une ligne de tableau une cellule modifiée d'une cellule non modifiée par exemple (MyGridView::isDirty(r,c) n'ayant pas été implémenté ?)

enjoy ! ^^

ExtJS - la gestion des évènements : les bases

Mini sommaire :



-Préambule : les pré-requis


J'installe ExtJS (Sencha); Un serveur Web (au hasard : WampServer);

Je crée un fichier : une page html simple comportant les pré-requis ExtJS :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Essai ExtJS</title>
<!-- ** Javascript ** -->
<link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css" />
<script type="text/javascript" src="ext/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="ext/ext-all.js"></script>
</head>
<body>
Coucou
<div id="test-div"> </div>
</body>
</html>


Les pré-requis sont satisfaits si j'arrive à voir Coucou lorsque je vais sur l'adresse locale de ma page (ie. http://localhost/test.html)

-Exemple n°1 : gestion d'un évènement très simple


Je déclare un bouton, et sur le clic du bouton, j'affiche une alerte :

<script type="text/javascript">
Ext.onReady(function(){
var buttonObject = new Ext.Button({
id: 'monBeauButton'
,text:'Cliquez moi'
,handler:function() {
alert(' you do it !');
}
,applyTo:'test-div'
});
});
</script>
<div id="test-div"/>

Dans cet exemple, l'attribut handler comporte une fonction (ou une référence vers une fonction) qui est invoquée lors de l'action sur le bouton.

-Exemple n°2 : gestion d'un évènement de composant


Chaque composant ExtJS est décrit dans la documentation en ligne. En dépliant le noeud "Ext" on retrouve bien "Button".
Sur chaque composants, la documentation décrit les évènements que génère ce dernier.
en se rendant sur le paragraphe "events" on constate donc qu'un bouton génère les évènements suivants : added, afterrender, beforedestroy, beforehide, ...

Dans l'exemple 2 nous allons déclencher un affichage sur réception de l'évènement "mouseover" et "mouseout". Les lignes de documentation relatives à ces évènements précisent les paramètres reçus lors du déclenchement de l'évènement. Ici dans les deux cas nous aurons 2 arguments : le bouton et un event (évènement levé par le navigateur avec notamment la position de la souris).


<script type="text/javascript">
Ext.onReady(function(){
var buttonObject = new Ext.Button({
id: 'monBeauButton'
,text:'Cliquez moi'
,handler:function() {
alert(' you do it !');
}
,applyTo:'test-div'
});
buttonObject.on('mouseover', function(btn, evt) {
btn.setText("Cliquez-moi :o)");
});
buttonObject.on('mouseout', function(btn, evt) {
btn.setText("Nooon ici ! :o(");
});
});
</script>
<div id="test-div"/>


-Exemple n°3 : création d'un évènement spécifique


Une fois le pas pris de coder en mode "évènementiel", de nombreux cas de figure ou applications viennent à l'esprit (si si), et se pose la question alors de gérer ses propres évènements fait maison.

Voici un petit exemple simple (on ne demande que çà) qui va créer un évènement maison "troisclics" lorsque l'utilisateur en sera à son troisième clic sur le bouton.

Dans un premier temps il faut déclarer l'évènement du composant : on utilise "addEvents"
Dans un second temps on déclenche l'évènement : on utilise "fireEvent"


<script type="text/javascript">
Ext.onReady(function(){
var buttonObject = new Ext.Button({
id: 'monBeauButton'
,nbclic: 0
,text:'Cliquez moi'
,handler:function() {
this.nbclic++;
if (this.nbclic == 3) {
this.fireEvent("troisclics", this);
}
}
,applyTo:'test-div'
});
buttonObject.on('mouseover', function(btn, evt) {
btn.setText("Cliquez-moi :o)");
});
buttonObject.on('mouseout', function(btn, evt) {
btn.setText("Nooon ici ! :o(");
});
buttonObject.addEvents("troisclics");
//
// (...)
//
buttonObject.on('troisclics', function(btn) {
alert(' you do it 3 times !');
});
});
</script>

ExtJS - Ext.data.Store - traitement d'exception pour un service JSON

Aujourd'hui, voici un mini tutoriel permettant de comprendre comment gérer un retour en erreur pour un appel de service JSON depuis un client JavaScript utilisant ExtJS API doc..

Personnellement, je trouve qu'ExtJS est assez bien documenté pour les cas nominaux, mais manque cruellement d'exemples dans le cas des traitements d'exception. C'est dommage car on le sait bien, les cas nominaux ne sont pas toujours au rendez-vous ;)

Dans ce mini tutoriel, un service "getUsers" permet de retourner une liste d'utilisateurs (il peut être implémenté en PHP par exemple, mais ce n'est pas l'objet de ce tutorial).

Voici un exemple de retour fait par ce service lorsqu'aucune erreur ne survient :
{
"results":4,
"rows":
[{"id":"1",
"login":"brice",
"date_inscription":"2009-02-10 14:20:00",
"fullname":"Brice"},
{"id":"10",
"login":"toto",
"date_inscription":"2009-10-28 08:10:00",
"fullname":"toto"},
{"id":"11",
"login":"toto2",
"date_inscription":"2009-10-28 08:10:00",
"fullname":"toto2"},
{"id":"13",
"login":"toto4",
"date_inscription":"2009-10-28 09:10:00",
"fullname":"toto4"}],
"success":true
}
A noter : dans cet exemple, 4 utilisateurs sont retournés sous le noeud "rows", et la propriété "success" vaut "true".

Voici le retour du même service lorsqu'une erreur survient (ie. Base de donnée injoignable) :
{
"results":1,
"success":false,
"errors":[
{"id":"500",
"msg":"Erreur de connexion à la base de donnée."
}]
}
A noter : dans cet exemple, 1 exception a été levée et traduite sous la forme d'un message d'erreur (id="500", msg="Erreur de connexion à la base de donnée."), et la propriété "success" vaut "false".

Voici maintenant comment gérer ces 2 types de retour côté client à l'aide d'ExtJS :
var dateFormat = 'Y-m-d G:i:s';
// ancienne valeur par defaut : 'm/d/Y'
// dateFormat correspond a une date
// de la forme : "2009-10-28 10:10:00"

var myStore = new Ext.data.Store({
url: 'http://localhost/getUsers.php5', // URL du service JSON
title: 'TOTO',
reader: new Ext.data.JsonReader({ // Reader JSON
idProperty: 'id',
root: 'rows',
totalProperty: 'results',
successProperty:'success',
fields: [
{name: 'id'},
{name: 'login'},
{name: 'date_inscription',
type: 'date',
dateFormat: dateFormat},
{name: 'fullname'}
]
})
});
A noter : dans cet exemple, on déclare l'Ext.data.Storedoc "myStore" qui va faire appel au service ('getUsers.php5'), et va lire le résultat grâce à un analyseur JSON (JSONReaderdoc). La lecture sera considérée comme un succès si la propriété "success" vaut "true". La manière d'interpréter les différents champs est également décrite.

On va également implémenter un analyseur JSON (JSONReader) capable d'interpréter un retour en erreur :
var errorReader = new Ext.data.JsonReader({
idProperty: 'id',
root: 'errors',
totalProperty: 'results',
fields: [
{name: 'id'},
{name: 'msg'}
]
});
A noter : dans cet exemple, la structure JSON lue doit posséder le nombre d'erreur sous "results" et les différentes erreurs sous la racine "errors". Ici une erreur comporte 2 champs : un "id" et un "msg".


Il convient ensuite de déclarer une méthode de traitement d'erreur de la manière suivante :
myStore.on('exception', usrException);
A noter : dans cet exemple, on indique pour myStore que sur réception de l'évènement "exception", un appel à la méthode "usrException(...)" doit être fait. Dans la version 3 d'ExtJSdoc, l'évènement "loadexception" est indiqué comme obsolète (deprecated) et ne doit donc plus être utilisé.

Voici maintenant comment interpréter le retour en erreur lors de l'appel au service :
function usrException(dataProxy, type, action, options, response) {
// alert('usrException type=' + type
// + ' action=' + action
// + ' response.status=' + response.status);
if (type == 'response' && action == 'read' && response.status == 200) {
var rs = errorReader.read(response);
if(rs.records) {
for(var i = 0, len = rs.records.length; i < len; i++) {
var r = rs.records[i];
alert("Erreur de chargement ERR"
+ r.data.id + ":" + r.data.msg);
}
}
} else if (type == 'response' && action == 'read') {
alert("Connexion impossible au serveur ("
+ response.status +")");
}
}
A noter : dans cet exemple, on traite un cas d'erreur sur lecture du résultat. On utilise l'analyseur d'erreur précédemment évoqué pour interpréter le retour d'erreur de service en JSON et afficher une alerte sur chaque erreur lue.

Enfin, il ne manque plus que l'appel à "myStore" permettant de lancer le service :
myStore.load();


Si l'appel au service "getUsers" se passe correctement, alors le store pourra afficher le resultat au sein d'un Ext.grid.GridPanel par exemple, sinon la méthode "usrException" sera invoquée.

Ce mini tutoriel peut sûrement être complété, ou bien si vous avez une autre solution, je suis preneur !

En attendant, à vous de jouer!

HTML, IE : window.onload et menu fixe

Bonjour,
alors aujourd'hui, je vais faire un petit peu de publicité pour 2 sites qui permettent de répondre encore une fois à la problématique de compatibilité entre navigateurs.


window.onload
Ce premier point concerne l'appel à une méthode JavaScript lorsqu'une page HTML a été complètement chargée par le navigateur. Je pensais (trop naïvement) que "window.onload" était assez standard pour passer sur tous les navigateurs... ! Et bien il semble que non !

Alors pour résoudre ce problème, rendez-vous sur ce post de septembre 2005 qui m'a été fort utile..

Vous y trouverez le code à copier dans le HEAD :

<script type="text/javascript">
/* for Mozilla */
if (document.addEventListener) {
document.addEventListener("DOMContentLoaded", init, false);
}

/* for Internet Explorer */
/*@cc_on @*/
/*@if (@_win32)
document.write("<script defer src=js/ie_onload.js><"+"/script>");
/*@end @*/

/* for other browsers */
window.onload = init;

function init() {
alert('ok');
}
</script>


Dans cet exemple, il vous faut également mettre la ligne suivante dans le fichier "js/ie_onload.js" :

init();



menu fixe

Aujourd'hui, j'ai également découvert une page relatant le problème souvent évoqué que de faire pour une page Web, une portion de page fixe (ie. un menu) quelquesoit le contenu et la position de l'ascenseur.

Rendez-vous sur cette page composante du site de batra3.

Ses exemples fonctionnent également sous IE. A priori la parade trouvée ne devait pas être simple ! merci à lui!

Copier du XML dans un textarea (sous IE6)

Voici un petit bout de code JavaScript :
- il permet de copier un contenu XML (présent sous une balise <pre>) dans un textarea
- (surtout) il est compatible IE6 !

// Teste sur Firefox et IE6 //






// FIX de getElementById(...) pour MSIE
// src
if (/msie/i.test (navigator.userAgent)) {
document.nativeGetElementById = document.getElementById;
document.getElementById = function(id) {
// Get element using native method
var elem = document.nativeGetElementById(id);
if (elem) {
// If id match, return element
if (elem.attributes['id'].value == id) {
return elem;
}
// Otherwise look for the right one
else {
for (var i = 1; i < document.all[id].length; i++)
{
if (document.all[id][i].attributes['id'].value == id)
{
return document.all[id][i];
}
}
}
}
return null;
}
}

// Mise a jour d'un textarea avec le contenu d'un <pre>

var scPRE = document.getElementById('idBalisePreComportantDuXML');
var editTA = document.getElementById('idTextArea');
if (/msie/i.test (navigator.userAgent)) {
// FIX IE6 Textarea CR bug
editTA.value = "";
editTA.setAttribute("value" , scPRE.innerText ) ;
} else {
editTA.innerHTML = scPRE.innerHTML;
}

JavaScript RegEx Check an Id string


Voici une petite fonction en JavaScript permettant de contrôler une chaîne de caractère par rapport à une expression régulière.
Dans cet exemple, on n'autorise que les chaînes débutant par un caractère alpha (a-zA-Z) et ne comportant que des alphanumériques (l'underscore est également autorisé).
Si la chaîne 'str' passée en argument ne correspond pas aux critères évoqués, alors une boîte de dialogue informe que celle-ci est refusée.
PS: en commentaire des traces peuvent être ajoutées pour comprendre ce qu'il se passe.

function checkIdText(str) {
// alert('checkIdText(' + str + ')');
var myFilter=/^(([a-z])([a-z0-9_]*))$/i;
if (!myFilter.test(str)) {
alert("IdText : please start with and alpha and then use alphanumerics or underscore only.");
return false;
}
// alert(str + ' is OK');
return true;
}
Comment interpréter le filtre de l'expression régulière RegEx : /^(([a-z])([a-z0-9_]*))$/i







expressionsignification
^début de la chaîne de caractères
[a-z]un caractère alpha
[a-z0-9_]*0, 1, ou plusieurs alphanumériques (underscore est également autorisé)
$fin de la chaîne
iindépendance vis-à-vis de la casse (majuscule/minuscule)


Mots clés du blog

10.1 4G acceptancetest adb androï Android androïd Android7 api appender appengine application applications archive array assistantematernelle astuce auth0 authentication authority automation Axis bash bearer blog boot bootloader bower build bundle c calendrier camille combal cdi certificate cf client cloudfoundry collaboratif command commandes connexion console css cyanogen decrypt démasquées démasquer développement dll dump easter eggs écologie écrit employeur EMUI EMUI5.0 encrypt enfant évènement export-package ExtJS fab fastboot fiche find firefox gadget galaxytab gelf gem git gmail gnupg gooelappengine google gparted gpg gpg2 gps graylog grenoble Grid gui harddrive heroku hover howto HTML http https IE ihm immobilier imprimante innovation insolite instance integration Java JavaScript jenkins jeu jobs json json-schema-validator key keystore labs linux livre log log4j logger logs lombok masquées masquer maven maven-gae-plugin Mémoire microsoft mobile mockito mondialisation monitor MUSE musique en ligne myopera nodejs npm NT NTEventLogger onglet openstack osgi paas package parameters parent php politique prosyst prototype proxies proxy quartz radio rappel recherche regex repository resize RIA ridge rock ROM route ruby rubygems s8500 samsung scheduler scm secret secure sel selenium Serializer server shared shell sign signature slf4j smartphone so société song spy ssh ssl struct swagger swig tâches téléphone téléréalité test thunderbird timeout token Tomcat tooltip tooltips truststore TWRP ubuntu unit test validator verify virgin virtualbox wave waze web WebApp wiki wikimedia wikipédia wikipen wiko windows windows10 yahoo youtube yum