2,6 → 2,8 |
* Constructeur WidgetSaisie par défaut |
*/ |
function WidgetSaisie() { |
this.urlBaseAuth = window.location.origin + '/service:annuaire:auth'; |
this.mode = 'prod'; |
this.langue = 'fr'; |
this.obsNbre = 0; |
this.nbObsEnCours = 1; |
30,9 → 32,7 |
this.serviceAnnuaireIdUrl = null; |
this.serviceNomCommuneUrl = null; |
this.serviceNomCommuneUrlAlt = null; |
this.chargementIconeUrl = null; |
this.chargementImageIconeUrl = null; |
this.calendrierIconeUrl = null; |
this.pasDePhotoIconeUrl = null; |
this.observer = null; |
|
89,10 → 89,6 |
WidgetSaisie.prototype.init = function() { |
this.initForm(); |
this.initEvts(); |
// Auth.js s'en occuppe |
if ( '' === $( '#nom-complet').text() && valeurOk ( $( '#courriel' ).val() ) ) { |
this.requeterIdentite(); |
} |
}; |
|
/** |
101,6 → 97,9 |
WidgetSaisie.prototype.initForm = function() { |
|
var lthis = this; |
|
this.chargerStatutSSO(); |
|
if ( valeurOk( this.obsId ) ) { |
this.chargerInfoObs(); |
} |
126,29 → 125,29 |
this.definirReglesFormValidator(); |
|
if( this.especeImposee ) { |
$( '#taxon' ).attr( 'disabled', 'disabled' ); |
$( '#taxon-input-groupe' ).attr( 'title', '' ); |
// Bricolage cracra pour avoir le nom retenu avec auteur (nom_retenu.libelle ne le mentionne pas) |
var infosEspeceImposee = $.parseJSON( this.infosEspeceImposee ); |
var nomRetenuComplet = infosEspeceImposee.nom_retenu_complet, |
debutAnneRefBiblio = nomRetenuComplet.indexOf( ' [' ); |
if ( -1 !== debutAnneRefBiblio ) { |
nomRetenuComplet = nomRetenuComplet.substr( 0, debutAnneRefBiblio ); |
} |
// fin bricolage cracra |
var infosAssociee = { |
label : infosEspeceImposee.nom_sci_complet, |
value : infosEspeceImposee.nom_sci_complet, |
nt : infosEspeceImposee.num_taxonomique, |
nomSel : infosEspeceImposee.nom_sci, |
nomSelComplet : infosEspeceImposee.nom_sci_complet, |
numNomSel : infosEspeceImposee.id, |
nomRet : nomRetenuComplet, |
numNomRet : infosEspeceImposee['nom_retenu.id'], |
famille : infosEspeceImposee.famille, |
retenu : ( 'false' === infosEspeceImposee.retenu ) ? false : true |
}; |
$( '#taxon' ).data( infosAssociee ); |
$( '#taxon' ).attr( 'disabled', 'disabled' ); |
$( '#taxon-input-groupe' ).attr( 'title', '' ); |
// Bricolage cracra pour avoir le nom retenu avec auteur (nom_retenu.libelle ne le mentionne pas) |
var infosEspeceImposee = $.parseJSON( this.infosEspeceImposee ); |
nomRetenuComplet = infosEspeceImposee.nom_retenu_complet, |
debutAnneRefBiblio = nomRetenuComplet.indexOf( ' [' ); |
if ( -1 !== debutAnneRefBiblio ) { |
nomRetenuComplet = nomRetenuComplet.substr( 0, debutAnneRefBiblio ); |
} |
// fin bricolage cracra |
var infosAssociee = { |
label : infosEspeceImposee.nom_sci_complet, |
value : infosEspeceImposee.nom_sci_complet, |
nt : infosEspeceImposee.num_taxonomique, |
nomSel : infosEspeceImposee.nom_sci, |
nomSelComplet : infosEspeceImposee.nom_sci_complet, |
numNomSel : infosEspeceImposee.id, |
nomRet : nomRetenuComplet, |
numNomRet : infosEspeceImposee['nom_retenu.id'], |
famille : infosEspeceImposee.famille, |
retenu : ( 'false' === infosEspeceImposee.retenu ) ? false : true |
}; |
$( '#taxon' ).data( infosAssociee ); |
} |
}; |
|
157,12 → 156,18 |
*/ |
WidgetSaisie.prototype.initEvts = function() { |
var lthis = this; |
|
// Empêcher que le module carto ne bind ses events partout |
$( '#tb-geolocation' ).on( 'submit blur click focus mousedown mouseleave mouseup touchend touchstart change', '.mat-icon-button', function( event ) { |
event.preventDefault(); |
return false; |
}); |
|
|
// identité |
$( '#deconnexion a' ).click( function( event ) { |
event.preventDefault(); |
lthis.deconnecterUtilisateur(); |
}); |
$( '#bouton-anonyme' ).on( 'click', function( event ) { |
arreter( event ); |
$( this ).css({ |
173,7 → 178,7 |
$( '#courriel' ).focus(); |
}); |
if ( '' === $( '#nom-complet').text() ) { |
$( '#courriel' ).on( 'blur', this.requeterIdentite.bind( this ) ); |
$( '#courriel' ).on( 'blur', this.requeterIdentiteCourriel.bind( this ) ); |
$( '#courriel' ).on( 'keypress', this.testerLancementRequeteIdentite.bind( this ) ); |
} |
$( '#prenom' ).on( 'change', this.formaterPrenom ); |
232,8 → 237,144 |
}; |
|
// Identité Observateur *******************************************************/ |
WidgetSaisie.prototype.requeterIdentite = function() { |
/** |
* Interroge le SSO pour connaître le statut de l'utilisateur, et change le menu |
* à droite de la barre en fonction |
*/ |
WidgetSaisie.prototype.chargerStatutSSO = function() { |
$( '#form-observateur' )[0].reset(); |
var lthis = this; |
|
var urlAuth = this.urlBaseAuth + '/identite'; |
|
if( 'local' !== this.mode ) { |
this.connexion( urlAuth, true ); |
} else { |
urlAuth = window.location.origin + '/widget:cel:modules/saisie2/test-token.json'; |
$( '#connexion' ).click( function( event ) { |
event.preventDefault(); |
lthis.connexion( urlAuth, true ); |
}); |
} |
}; |
|
/** |
* Déconnecte l'utilisateur du SSO |
*/ |
WidgetSaisie.prototype.deconnecterUtilisateur = function() { |
if( 'local' === this.mode ) { |
this.definirUtilisateur(); |
window.location.reload(); |
return; |
} |
|
var urlAuth = this.urlBaseAuth + '/deconnexion'; |
|
this.connexion( urlAuth, false ); |
}; |
|
WidgetSaisie.prototype.connexion = function( urlAuth, connexionOnOff ) { |
var lthis = this; |
console.log(urlAuth); |
$.ajax({ |
url: urlAuth, |
type: "GET", |
dataType: 'json', |
xhrFields: { |
withCredentials: true |
} |
}) |
.done( function( data ) { |
if( connexionOnOff ) { |
// connecté |
lthis.definirUtilisateur( data.token ); |
} else { |
lthis.definirUtilisateur(); |
window.location.reload(); |
} |
}) |
.fail( function( error ) { |
// @TODO gérer l'affichage de l'erreur, mais pas facile à placer |
// dans l'interface actuelle sans que ce soit moche |
//afficherErreurServeur(); |
}); |
} |
|
WidgetSaisie.prototype.definirUtilisateur = function( jeton ) { |
var idUtilisateur = '', |
nomComplet = '', |
courriel = '', |
pseudo = '', |
prenom = '', |
nom = ''; |
|
// affichage |
if ( undefined !== jeton ) { |
// décodage jeton |
var jetonDecode = this.decoderJeton( jeton ); |
// console.log(jetonDecode); |
|
idUtilisateur = jetonDecode.id; |
nomComplet = jetonDecode.intitule; |
courriel = jetonDecode.sub; |
pseudo = jetonDecode.pseudo; |
prenom = jetonDecode.prenom; |
nom = jetonDecode.nom; |
$( '#courriel, #courriel_confirmation' ).attr( 'disabled', 'disabled' ); |
$( '#prenom' ).attr( 'disabled', 'disabled' ); |
$( '#nom' ).attr( 'disabled', 'disabled' ); |
$( '#bouton-connexion, #creation-compte' ).addClass( 'hidden' ); |
$( '#utilisateur-connecte, #anonyme, #zone-courriel-confirmation, #zone-prenom-nom' ).removeClass( 'hidden' ); |
$( '#date-releve' ).focus(); |
} |
$( '.warning' ).remove(); |
$( '#nom-complet' ).html( nomComplet ); |
$( '#courriel, #courriel_confirmation' ).val( courriel ); |
$( '#profil-utilisateur a' ).attr( 'href', this.urlProfilUtilisateur( pseudo ) ); |
$( '#id_utilisateur' ).val( idUtilisateur ); |
$( '#prenom' ).val( prenom ); |
$( '#nom' ).val( nom ); |
}; |
|
/** |
* Décodage à l'arrache d'un jeton JWT, ATTENTION CONSIDERE QUE LE |
* JETON EST VALIDE, ne pas décoder n'importe quoi - pas trouvé de lib simple |
*/ |
WidgetSaisie.prototype.decoderJeton = function( jeton ) { |
parts = jeton.split( '.' ); |
payload = parts[1]; |
payload = this.b64d( payload ); |
payload = JSON.parse( payload, true ); |
return payload; |
}; |
|
/** |
* Décodage "url-safe" des chaînes base64 retournées par le SSO (lib jwt) |
*/ |
WidgetSaisie.prototype.b64d = function( input ) { |
var remainder = input.length % 4; |
|
if ( 0 !== remainder ) { |
var padlen = 4 - remainder; |
|
for ( var i = 0; i < padlen; i++ ) { |
input += '='; |
} |
} |
input = input.replace( '-', '+' ); |
input = input.replace( '_', '/' ); |
return atob( input ); |
}; |
|
WidgetSaisie.prototype.urlProfilUtilisateur = function( pseudo ) { |
var urlPart = ( 'prod' === this.mode ) ? 'www.tela-botanica.org/' : 'beta.tela-botanica.org/test/'; |
|
return 'https://' + urlPart + 'membres/' + pseudo.toLowerCase().replace( ' ', '-' ); |
}; |
|
// Identité Observateur par courriel |
WidgetSaisie.prototype.requeterIdentiteCourriel = function() { |
var lthis = this; |
var courriel = $( '#courriel' ).val(); |
var urlAnnuaire = this.serviceAnnuaireIdUrl + courriel; |
if ( valeurOk( courriel ) ) { |
290,7 → 431,7 |
|
WidgetSaisie.prototype.testerLancementRequeteIdentite = function( event ) { |
if ( valeurOk( event.which, true, 13 ) ) { |
this.requeterIdentite(); |
this.requeterIdentiteCourriel(); |
event.preventDefault(); |
event.stopPropagation(); |
} |
461,7 → 602,7 |
add( suggestions ); |
}) |
.fail( function() { |
$( '#certitude' ).find( 'option' ).each( function() { |
$( '#certitude' ).find( 'option' ).each( function() { |
if ( $( this ).hasClass( 'aDeterminer' ) ) { |
$( this ).attr( 'selected', true ); |
} else { |
868,11 → 1009,11 |
var targetNode = document.getElementById( 'miniatures' ); |
// Fonction callback à éxécuter quand une mutation est observée |
var callback = function( mutationsList ) { |
for( var mutation of mutationsList ) { |
var taxon = valeurOk( $( '#taxon' ).val() ); |
images = ( 0 < mutation.target.childElementCount ); |
lthis.validerTaxonImage( taxon, images ); |
} |
for( var mutation of mutationsList ) { |
var taxon = valeurOk( $( '#taxon' ).val() ); |
images = ( 0 < mutation.target.childElementCount ); |
lthis.validerTaxonImage( taxon, images ); |
} |
}; |
// Créé une instance de l'observateur lié à la fonction de callback |
this.observer = new MutationObserver( callback ); |
887,8 → 1028,8 |
var images = valeurOk( $( '#miniatures .miniature' ) ); |
var taxon = valeurOk( $( '#taxon' ).val() ); |
// validation et panneau taxon/images |
var taxonOuImage = this.validerTaxonImage( taxon, images ); |
// console.log(taxonOuImage); |
var taxonOuImage = this.validerTaxonImage( taxon, images ); |
// console.log(taxonOuImage); |
var chpsSupp = new Boolean(); |
if ( valeurOk( $( '#form-supp' ) ) ) { |
chpsSupp = ( function () { |
1658,35 → 1799,35 |
* |
* Adaptation par Aurélien Peronnet pour la mise en gras des noms de taxons valides |
*/ |
( function( $ ) { |
var proto = $.ui.autocomplete.prototype, |
initSource = proto._initSource; |
( function( $ ) { |
var proto = $.ui.autocomplete.prototype, |
initSource = proto._initSource; |
|
WidgetSaisie.prototype.filter = function( array, term ) { |
var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), 'i' ); |
return $.grep( array, function( value ) { |
return matcher.test( $( '<div>' ).html( value.label || value.value || value ).text() ); |
}); |
WidgetSaisie.prototype.filter = function( array, term ) { |
var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), 'i' ); |
return $.grep( array, function( value ) { |
return matcher.test( $( '<div>' ).html( value.label || value.value || value ).text() ); |
}); |
} |
$.extend( proto, { |
_initSource: function() { |
if ( this.options.html && $.isArray( this.options.source ) ) { |
this.source = function( request, response ) { |
response( filter( this.options.source, request.term ) ); |
}; |
} else { |
initSource.call( this ); |
} |
}, |
_renderItem: function( ul, item) { |
if ( item.retenu ) { |
item.label = '<strong>' + item.label + '</strong>'; |
} |
|
return $( '<li></li>' ) |
.data( 'item.autocomplete', item ) |
.append( $( '<a></a>' )[ ( this.options.html ) ? 'html' : 'text' ]( item.label ) ) |
.appendTo( ul ); |
} |
$.extend( proto, { |
_initSource: function() { |
if ( this.options.html && $.isArray( this.options.source ) ) { |
this.source = function( request, response ) { |
response( filter( this.options.source, request.term ) ); |
}; |
} else { |
initSource.call( this ); |
} |
}, |
_renderItem: function( ul, item) { |
if ( item.retenu ) { |
item.label = '<strong>' + item.label + '</strong>'; |
} |
|
return $( '<li></li>' ) |
.data( 'item.autocomplete', item ) |
.append( $( '<a></a>' )[ ( this.options.html ) ? 'html' : 'text' ]( item.label ) ) |
.appendTo( ul ); |
} |
}); |
})( jQuery ); |
}); |
})( jQuery ); |