WIP - Prepare template loop (#1689)
This commit is contained in:
parent
239bb4634f
commit
441df6e7ea
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue