WIP - Prepare template loop (#1689)

This commit is contained in:
Christophe Maudoux 2019-04-26 22:58:53 +02:00
parent 239bb4634f
commit 441df6e7ea
6 changed files with 154 additions and 50 deletions

View File

@ -5,6 +5,7 @@ package Lemonldap::NG::Portal::Main::Menu;
use strict;
use Mouse;
use Clone 'clone';
use JSON qw(from_json to_json);
our $VERSION = '2.1.0';
@ -59,11 +60,9 @@ sub params {
my ( $self, $req ) = @_;
$self->{conf}->{imgPath} ||= $self->{staticPrefix};
my %res;
my @defaultTabs = (qw/appslist password logout loginHistory oidcConsents/);
my @defaultTabs = (qw/favApps appslist password logout loginHistory oidcConsents/);
my @customTabs = split( /,\s*/, $self->{conf}->{customMenuTabs} || '' );
push @defaultTabs, 'favApps' if $self->{conf}->{favApps};
# Tab to display
# Get the tab URL parameter
@ -103,7 +102,7 @@ sub params {
$res{DISPLAY_TAB} = $req->param("tab");
}
else {
$res{DISPLAY_TAB} = $self->{conf}->{favApps} ? "favApps" : "appslist";
$res{DISPLAY_TAB} = "appslist";
}
}
@ -131,24 +130,27 @@ sub displayModules {
foreach my $module ( @{ $self->menuModules } ) {
$self->logger->debug("Check if $module->[0] has to be displayed");
if ( $module->[1]->( $req, $req->sessionInfo ) ) {
if ( $module->[1]->( $req, $req->userData ) ) {
my $moduleHash = { $module->[0] => 1 };
if ( $module->[0] eq 'Appslist' ) {
$moduleHash->{'APPSLIST_LOOP'} = $self->appslist($req);
}
elsif ( $module->[0] eq 'FavApps' ) {
$moduleHash->{'FAVAPPS_LOOP'} = $self->favAppslist($req);
}
elsif ( $module->[0] eq 'LoginHistory' ) {
$moduleHash->{'SUCCESS_LOGIN'} =
$self->p->mkSessionArray(
$req->{sessionInfo}->{_loginHistory}->{successLogin},
$req->{userData}->{_loginHistory}->{successLogin},
"", 0, 0 );
$moduleHash->{'FAILED_LOGIN'} =
$self->p->mkSessionArray(
$req->{sessionInfo}->{_loginHistory}->{failedLogin},
$req->{userData}->{_loginHistory}->{failedLogin},
"", 0, 1 );
}
elsif ( $module->[0] eq 'OidcConsents' ) {
$moduleHash->{'OIDC_CONSENTS'} =
$self->p->mkOidcConsent( $req->sessionInfo );
$self->p->mkOidcConsent( $req->userData );
}
push @$displayModules, $moduleHash;
}
@ -157,6 +159,34 @@ sub displayModules {
return $displayModules;
}
## @method arrayref favAppslist()
# Returns favorite applications list as HTML::Template loop
# @return applications list
sub favAppslist {
my ( $self, $req ) = @_;
my $user = $req->userData->{ $self->conf->{whatToTrace} };
# Read existing favorite Apps
$self->logger->debug("Looking for favorite Apps...");
my $_favApps;
if ( $req->userData->{_favApps} ) {
$_favApps = eval {
from_json( $req->userData->{_favApps}, { allow_nonref => 1 } );
};
if ($@) {
$self->logger->error("Corrupted session (_favApps): $@");
return $self->p->sendError( $req, "Corrupted session", 500 );
}
}
else {
$self->logger->debug("No favorite Apps found");
$_favApps = [];
}
$self->logger->debug( scalar @$_favApps . " favorite Apps found for $user" );
return $_favApps;
}
## @method arrayref appslist()
# Returns categories and applications list as HTML::Template loop
# @return categories and applications list
@ -350,7 +380,7 @@ sub _filterHash {
if ( my $sub = $self->p->spRules->{$p} ) {
eval {
delete $apphash->{$key}
unless ( $sub->( $req, $req->sessionInfo ) );
unless ( $sub->( $req, $req->userData ) );
};
if ($@) {
$self->logger->error("Partner rule $p returns: $@");
@ -375,7 +405,7 @@ sub _filterHash {
delete $apphash->{$key}
unless (
$self->p->HANDLER->grant(
$req, $req->sessionInfo, $appuri, $cond, $vhost
$req, $req->userData, $appuri, $cond, $vhost
)
);
next;

View File

@ -55,14 +55,15 @@ sub register {
];
}
my ( $app, $result );
unless ( $app = $req->param('app') ) {
my ( $uri, $result );
unless ( $uri = $req->param('uri') ) {
return $self->p->sendError( $req, 'Missing App. URI', 400 );
}
$self->logger->debug("Favorite application received : $app");
my $logo = $req->param('logo') || '';
my $desc = $req->param('desc') || '';
my $title = $req->param('title') || '';
$self->logger->debug("Favorite application URI received : $uri");
my $id = $req->param('id') || '';
my $logo = $req->param('logo') || '';
my $desc = $req->param('desc') || '';
my $name = $req->param('name') || '';
# Read existing favorite Apps
$self->logger->debug("Looking for $user favorite Apps...");
@ -84,23 +85,23 @@ sub register {
# Append or remove favorite application
my $nbrApps = @$_favApps;
$self->logger->debug("$nbrApps favorite Apps found");
if ( $nbrApps && $self->_isFavApp( $_favApps, $app ) ) {
$_favApps = $self->_removeFavApp( $_favApps, $app );
if ( $nbrApps && $self->_isFavApp( $_favApps, $uri ) ) {
$_favApps = $self->_removeFavApp( $_favApps, $uri );
$self->p->updatePersistentSession( $req,
{ _favApps => to_json($_favApps) } );
$result = '{"result":0}';
$self->userLogger->notice(
"Favorite apps deletion of $app succeeds for $user");
"Favorite apps deletion of $uri succeeds for $user");
}
else {
if ( $nbrApps < $self->conf->{favAppsMaxNumber} ) {
$_favApps =
$self->_appendFavApp( $_favApps, $app, $logo, $desc, $title );
$self->_appendFavApp( $_favApps, $uri, $id, $logo, $desc, $name );
$self->p->updatePersistentSession( $req,
{ _favApps => to_json($_favApps) } );
$result = '{"result":1}';
$self->userLogger->notice(
"Favorite apps registration of $app succeeds for $user");
"Favorite apps registration of $uri succeeds for $user");
}
else {
$result = '{"error":1}';
@ -120,14 +121,14 @@ sub register {
sub read {
my ( $self, $req ) = @_;
my $user = $req->sessionInfo->{ $self->conf->{whatToTrace} };
my $user = $req->userData->{ $self->conf->{whatToTrace} };
# Read existing favorite Apps
$self->logger->debug("Looking for favorite Apps...");
my $_favapps;
if ( $req->sessionInfo->{_favApps} ) {
$_favapps = eval {
from_json( $req->sessionInfo->{_favapps}, { allow_nonref => 1 } );
my $_favApps;
if ( $req->userData->{_favApps} ) {
$_favApps = eval {
from_json( $req->userData->{_favApps}, { allow_nonref => 1 } );
};
if ($@) {
$self->logger->error("Corrupted session (_favApps): $@");
@ -136,16 +137,16 @@ sub read {
}
else {
$self->logger->debug("No favorite Apps found");
$_favapps = [];
$_favApps = [];
}
# Serialize data
my $data = to_json( {
result => 1,
apps => $_favapps
apps => $_favApps
}
);
$self->logger->debug( scalar @$_favapps . " Apps found for $user" );
$self->logger->debug( scalar @$_favApps . " favorite Apps found for $user" );
return [
200,
@ -158,10 +159,10 @@ sub read {
}
sub _isFavApp {
my ( $self, $_favApps, $app ) = @_;
my ( $self, $_favApps, $uri ) = @_;
my $test = 0;
foreach (@$_favApps) {
if ( $_->{app} eq $app ) {
if ( $_->{appuri} eq $uri ) {
$test = 1;
last;
}
@ -171,23 +172,18 @@ sub _isFavApp {
}
sub _appendFavApp {
my ( $self, $_favApps, $app, $logo, $desc, $title ) = @_;
my ( $self, $_favApps, $uri, $id, $logo, $desc, $name ) = @_;
push @$_favApps,
{ app => $app, logo => $logo, desc => $desc, title => $title };
$self->logger->debug("App. $app appended");
{ appuri => $uri, appid => $id, applogo => $logo, appdesc => $desc, appname => $name };
$self->logger->debug("App. $uri appended");
return $_favApps;
}
sub _removeFavApp {
my ( $self, $_favApps, $app ) = @_;
my $keep = [];
while (@$_favApps) {
my $element = shift @$_favApps;
$self->logger->debug("Looking for favorite App to remove...");
push @$keep, $element unless ( $element->{app} eq $app );
}
$self->logger->debug("App. $app removed");
return $keep;
my ( $self, $_favApps, $uri ) = @_;
@$_favApps = grep { $_->{appuri} ne $uri } @$_favApps;
$self->logger->debug("App. $uri removed");
return $_favApps;
}
1;

View File

@ -8,10 +8,11 @@ FavApps = (star) ->
type: "POST"
url: "#{portal}favapps"
data:
app: star.attr 'appuri'
id: star.attr 'aid'
uri: star.attr 'uri'
name: star.attr 'name'
logo: star.attr 'logo'
desc: star.attr 'desc'
title: star.attr 'title'
dataType: 'json'
success: (resp) ->
if resp.error

View File

@ -12,10 +12,11 @@ LemonLDAP::NG Favorite Applications script
type: "POST",
url: portal + "favapps",
data: {
app: star.attr('appuri'),
id: star.attr('aid'),
uri: star.attr('uri'),
name: star.attr('name'),
logo: star.attr('logo'),
desc: star.attr('desc'),
title: star.attr('title')
desc: star.attr('desc')
},
dataType: 'json',
success: function(resp) {

View File

@ -1 +1 @@
(function(){var FavApps,switchStar;FavApps=function(star){return $.ajax({type:"POST",url:portal+"favapps",data:{app:star.attr("appuri"),logo:star.attr("logo"),desc:star.attr("desc"),title:star.attr("title")},dataType:"json",success:function(resp){if(resp.error){console.log("Max number reached");return switchStar(star,0)}else if(resp.error===0){console.log("Not authorized");return switchStar(star,0)}else if(resp.result){console.log("App. registered");return switchStar(star,1)}else{console.log("App. unregistered");return switchStar(star,0)}},error:switchStar(star,"0")})};switchStar=function(star,status){return star.attr("src",window.staticPrefix+"common/icons/star"+status+".png")};$(document).ready(function(){return $("body").on("click",".star",function(){return FavApps($(this))})})}).call(this);
(function(){var FavApps,switchStar;FavApps=function(star){return $.ajax({type:"POST",url:portal+"favapps",data:{id:star.attr("aid"),uri:star.attr("uri"),name:star.attr("name"),logo:star.attr("logo"),desc:star.attr("desc")},dataType:"json",success:function(resp){if(resp.error){console.log("Max number reached");return switchStar(star,0)}else if(resp.error===0){console.log("Not authorized");return switchStar(star,0)}else if(resp.result){console.log("App. registered");return switchStar(star,1)}else{console.log("App. unregistered");return switchStar(star,0)}},error:switchStar(star,"0")})};switchStar=function(star,status){return star.attr("src",window.staticPrefix+"common/icons/star"+status+".png")};$(document).ready(function(){return $("body").on("click",".star",function(){return FavApps($(this))})})}).call(this);

View File

@ -109,7 +109,13 @@
<div class="col-md-4">
<TMPL_IF NAME="FAVAPPS">
<div>
<img class="star" appuri="<TMPL_VAR NAME="appuri">" title="<TMPL_VAR NAME="appname">" logo="<TMPL_VAR NAME="STATIC_PREFIX">common/apps/<TMPL_VAR NAME="applogo">" desc="<TMPL_VAR NAME="appdesc">" src="<TMPL_VAR NAME="STATIC_PREFIX">common/icons/star0.png"/>
<img class="star"
aid="<TMPL_VAR NAME="appid">"
uri="<TMPL_VAR NAME="appuri">"
name="<TMPL_VAR NAME="appname">"
logo="<TMPL_VAR NAME="applogo">"
desc="<TMPL_VAR NAME="appdesc">"
src="<TMPL_VAR NAME="STATIC_PREFIX">common/icons/star0.png"/>
</div>
</TMPL_IF>
<div class="application <TMPL_VAR NAME="appid"> card">
@ -172,6 +178,76 @@
<TMPL_IF NAME="FavApps">
<div id="favApps">
<div class="card-body">
<!-- Applications -->
<div class="row">
<TMPL_LOOP NAME="FAVAPPS_LOOP">
<!-- Application -->
<div class="col-md-4">
<div class="application <TMPL_VAR NAME="appid"> card">
<a href="<TMPL_VAR NAME="appuri">" title="<TMPL_VAR NAME="appname">" >
<div class="card-body">
<div class="row">
<!-- Logo (optional) -->
<TMPL_IF NAME="applogo">
<div class="col-3">
<img src="<TMPL_VAR NAME="STATIC_PREFIX">common/apps/<TMPL_VAR NAME="applogo">"
class="applogo <TMPL_VAR NAME="appid"> img-fluid"
alt="<TMPL_VAR NAME="appname">" />
</div>
<div class="col-9">
<TMPL_ELSE>
<div class="col-12">
</TMPL_IF>
<!-- Name and link (mandatory) -->
<h5 class="appname <TMPL_VAR NAME="appid"> card-title">
<TMPL_VAR NAME="appname">
</h5>
<!-- Description (optional) -->
<TMPL_IF NAME="appdesc">
<p class="appdesc <TMPL_VAR NAME="appid"> card-subtitle mb-2 text-muted">
<TMPL_VAR NAME="appdesc">
</p>
</TMPL_IF>
</div>
</div>
</div>
</a>
</div>
</div>
<!-- End of applications loop -->
</TMPL_LOOP>
</div>
</div>
</div>
</TMPL_IF>