Subversion Repositories eFlore/Applications.cel

Rev

Rev 3857 | Blame | Compare with Previous | Last modification | View Log | RSS feed

function WidgetApa() {
        this.utils = new UtilsApa();
        this.mode = null;
        this.urlRacine = window.location.origin;
        this.urlBaseAuth = null;
        this.idUtilisateur = null;
        this.infosUtilisateur = null;
}

WidgetApa.prototype.init = function() {
        const lthis = this;

        this.urlBaseAuth = this.urlRacine + '/service:annuaire:auth';
        $( '#mdp' ).val('');
        $( '#inscription' ).attr( 'href',  this.urlSiteTb() + 'inscription' );
        $( '#inscription' ).attr( 'href',  this.urlSiteTb() + 'wp-login.php?action=lostpassword' );

        this.chargerStatutSSO();
        this.connexionDprodownMenu()
        $( '#deconnexion a' ).click( function( event ) {
                event.preventDefault();
                lthis.deconnecterUtilisateur();
        });

        $( '#formulaire' ).on( 'click', '.saisir-plantes,.saisir-lichens', function() {
                var nomSquelette = $( this ).data( 'load' );
                $( '#charger-form' ).data( 'load', nomSquelette );
                lthis.utils.chargerForm( nomSquelette, lthis );
                $( '#bouton-list-releves' ).removeClass( 'hidden' );
                $( '#table-releves' ).addClass( 'hidden' );
        });
};


/**
 * Interroge le SSO pour connaître le statut de l'utilisateur, et change le menu
 * à droite de la barre en fonction
 */
WidgetApa.prototype.chargerStatutSSO = function() {
        const lthis = this;
        var urlAuth = this.urlBaseAuth + '/identite';

        if( 'local' !== this.mode ) {
                this.connexion( urlAuth, true );
                $( '#connexion' ).click( function( event ) {
                        event.preventDefault();
                        if( $( '#utilisateur-connecte' ).hasClass( 'hidden' ) || !lthis.utils.valOk( $( '#nom-complet' ).text() ) ) {
                                var login = $( '#courriel' ).val(),
                                        mdp   = $( '#mdp' ).val();
                                if ( lthis.utils.valOk( login ) && lthis.utils.valOk( mdp ) ) {
                                        urlAuth = lthis.urlBaseAuth + '/connexion?login=' + login + '&password=' + mdp;
                                        lthis.connexion( urlAuth, true );
                                } else {
                                        alert( lthis.utils.msgTraduction( 'non-connexion' ) );
                                }
                        }
                });
        } else {
                urlAuth = this.urlRacine + '/widget:cel:modules/apa/test-token.json';
                // $( '#connexion' ).click( function( event ) {
                //      event.preventDefault();
                        // lthis.connexion( urlAuth, true );
                        this.connexion( urlAuth, true );
                // });
        }
};

/**
 * Déconnecte l'utilisateur du SSO
 */
WidgetApa.prototype.deconnecterUtilisateur = function() {
        var urlAuth = this.urlBaseAuth + '/deconnexion';

        if( 'local' === this.mode ) {
                this.definirUtilisateur();
                window.location.reload();
                return;
        }
        this.connexion( urlAuth, false );
};

WidgetApa.prototype.connexion = function( urlAuth, connexionOnOff ) {
        const lthis = this;

        $.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();
        });
};


WidgetApa.prototype.definirUtilisateur = function( jeton ) {
        const thisObj = this;
        var nomComplet    = '',
                courriel      = '',
                pseudo        = '',
                prenom        = '',
                nom           = '';

        // affichage
        if ( undefined !== jeton ) {
                // décodage jeton
                this.infosUtilisateur = this.decoderJeton( jeton );
                // console.log(jetonDecode);

                idUtilisateur = this.infosUtilisateur.id;
                nomComplet    = this.infosUtilisateur.intitule;
                courriel      = this.infosUtilisateur.sub;
                pseudo        = this.infosUtilisateur.pseudo;
                prenom        = this.infosUtilisateur.prenom;
                nom           = this.infosUtilisateur.nom;
                $( '#courriel' ).attr( 'disabled', 'disabled' );
                $( '#bloc-connexion' ).addClass( 'hidden' );
                $( '#utilisateur-connecte, #anonyme' ).removeClass( 'hidden' );
        }
        $( '#id_utilisateur' ).val( idUtilisateur );
        $( '#prenom' ).val( prenom );
        $( '#nom' ).val( nom );
        $( '#nom-complet' ).html( nomComplet );
        $( '#courriel' ).val( courriel );
        $( '#profil-utilisateur a' ).attr( 'href', this.urlSiteTb() + 'membres/' + pseudo.toLowerCase().replace( ' ', '-' ) );
        if ( this.utils.valOk( idUtilisateur ) ) {
                var nomSquelette = $( '#charger-form' ).data( 'load' ) || 'arbres';
                this.utils.chargerForm( nomSquelette, thisObj );
        }
};

/**
 * 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
 */
WidgetApa.prototype.decoderJeton = function( jeton ) {
        var 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)
 */
WidgetApa.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 );
};

WidgetApa.prototype.urlSiteTb = function() {
        var urlPart = ( 'test' === this.mode ) ? '/test/' : '/';

        return this.urlRacine + urlPart;
};

// Volet de profil/déconnexion
WidgetApa.prototype.connexionDprodownMenu = function() {
  $( '#utilisateur-connecte .volet-toggle, #profil-utilisateur a, #deconnexion a' ).click( function( event ) {
    if( $( this ).hasClass( 'volet-toggle' ) ) {
      event.preventDefault();
    }
    $( '#utilisateur-connecte .volet-menu' ).toggleClass( 'hidden' );
  });
}

// Préchargement des infos-obs ************************************************/

/**
 * Callback dans le chargement du formulaire dans #charger-form
 */
WidgetApa.prototype.chargerSquelette = function( squelette , nomSquelette ) {
        //  à compléter plus tard si nécessaire, pour le moment on charge "arbres"
        switch( nomSquelette ) {
                case 'plantes' :
                case 'lichens' :
                        this.utils.chargerFormPlantesOuLichens( squelette, nomSquelette );
                        break;
                case 'arbres' :
                default :
                        this.chargerObsUtilisateur( squelette );
                break;
        }
};

/**
 * Infos des obs arbres de cet utilisateur
 */
WidgetApa.prototype.chargerObsUtilisateur = function( formReleve ) {
        const lthis = this;
        const urlObs = $( 'body' ).data( 'obs-list' ) + '/' + this.infosUtilisateur.id;
        $( '#bouton-nouveau-releve' ).removeClass( 'hidden' );

        $.ajax({
                url: urlObs,
                type: 'GET',
                success: function( dataObs, textStatus, jqXHR ) {
                        if ( !lthis.utils.valOk( dataObs ) ) {
                                dataObs = '';
                        }
                        lthis.preformaterDonneesObs( dataObs );
                },
                error: function( jqXHR, textStatus, errorThrown ) {
                        alert( lthis.utils.msgTraduction( 'erreur-chargement-obs-utilisateur' ) );
                }
        })
        .always( function() {
                $( '#charger-form' ).html( formReleve );
        });
};

/**
 * Préformater les données des obs d'un utilisateur
 */
WidgetApa.prototype.preformaterDonneesObs = function( dataObs ) {
        const lthis = this;
        if ( this.utils.valOk( dataObs ) ) {
                var apaObs     = [],
                        datRuComun = [],
                        obsArbres  = [],
                        apaObsE    = {},
                        count      = 0;

                $.each( dataObs, function( i, obs ) {
                        if(  /WidgetApa/.test( obs.mots_cles_texte ) && !/(:?plantes|lichens)/.test( obs.mots_cles_texte ) ) {
                                if ( lthis.utils.valOk( obs.obs_etendue ) ) {
                                        $.each( obs.obs_etendue, function( indice, obsE ) {
                                                apaObsE[obsE.cle] = obsE.valeur;
                                        });
                                }
                                obs.date_observation = $.trim( obs.date_observation.replace( /[0-9]{2}:[0-9]{2}:[0-9]{2}$/, '') );
                                if ( -1 === datRuComun.indexOf( obs.date_observation + apaObsE.rue + obs.zone_geo )  ) {
                                        datRuComun.push( obs.date_observation + apaObsE.rue + obs.zone_geo );
                                        apaObs[count] = lthis.utils.formaterReleveData( { 'obs':obs, 'obsE':apaObsE } );
                                        count++;
                                }
                                obsArbres.push( lthis.utils.formaterArbreData( { 'obs':obs, 'obsE':apaObsE } ) );
                                apaObsE = [];
                        }
                });
                // on insert les arbres dans les relevés en fonction de la date et la rue d'observation
                // car les arbres pour un relevé (date/rue) n'ont pas forcément été enregistrés dans l'ordre ni le même jour
                $.each( obsArbres, function( indexArbre, arbre ) {
                        for ( var indexReleve = 0; indexReleve < datRuComun.length; indexReleve++ ) {
                                if ( arbre.date_rue_commune  === datRuComun[indexReleve] ) {
                                        apaObs[indexReleve].push( arbre );
                                }
                        }
                });
                if ( this.utils.valOk( apaObs ) ) {
                        this.prechargerLesObs( apaObs );
                        $( '#apa-obs' ).val( JSON.stringify( apaObs ) );
                        $( '#bouton-list-releves' ).removeClass( 'hidden' );
                }
                $( '#dates-rues-communes' ).val( JSON.stringify( datRuComun ) );
        }
};

WidgetApa.prototype.prechargerLesObs = function( apaObs ) {
        const lthis = this;
        const $listReleve = $( '#list-releves' );
        const TEXT_ARBRE = ' ' + this.utils.msgTraduction( 'arbre' ).toLowerCase();

        var nbArbres   = '',
                texteArbre = '';

        var releveHtml = '';
        $( '#bouton-list-releves' )
                .removeClass( 'hidden' )
                .click( function() {
                        $( '#table-releves' ).removeClass( 'hidden' );
                        $( this ).addClass( 'hidden' );
        });

        $.each( apaObs, function( i, releve ) {
                nbArbres = releve.length - 1;
                texteArbre = ( 1 < nbArbres ) ? ( TEXT_ARBRE + 's' ) : TEXT_ARBRE;
                releveHtml +=
                        '<tr class="table-light text-center">'+
                                '<td>' +
                                        '<p>'+
                                                lthis.utils.fournirDate( releve[0].date ) +
                                        '</p><p>'+
                                                releve[0].rue + ', ' + releve[0]['commune-nom'] +
                                        '</p><p>'+
                                                '(' + nbArbres + texteArbre + ')' +
                                        '</p>'+
                                '</td>'+
                                '<td class="d-flex flex-column">' +
                                        '<div class="charger-releve btn btn-sm btn-info mb-1" data-releve="' + i + '" data-load="arbres">'+
                                                '<i class="fas fa-clone"></i> ' + lthis.utils.msgTraduction( 'dupliquer' )+
                                        '</div> '+
                                        '<div class="saisir-plantes btn btn-sm btn-info mb-1" data-releve="' + i + '" data-load="plantes">'+
                                                '<i class="fas fa-seedling"></i> ' + lthis.utils.msgTraduction( 'saisir-plantes' )+
                                        '</div> '+
                                        '<div class="saisir-lichens btn btn-sm btn-info" data-releve="' + i + '" data-load="lichens">'+
                                                // '<i class="fas fa-certificate"></i> ' + lthis.utils.msgTraduction( 'saisir-lichens' )+
                                                '<i class="far fa-snowflake"></i> ' + lthis.utils.msgTraduction( 'saisir-lichens' )+
                                        '</div> '+
                                '</td>'+
                        '</tr>';
        });
        $listReleve.append( releveHtml );
        $( '#nb-releves-bienvenue' )
                .removeClass( 'hidden' )
                .find( 'span.nb-releves' )
                        .text( apaObs.length );
};