Haut de page

Comment cacher ou montrer certains contenus d’une page Confluence à des utilisateurs


Publié par
Cyrille MARTIN

9 mai 2019

Visibility est une app développée par ServiceRocket disponible sur la Marketplace Atlassian. Elle permet d’afficher, ou non, une partie du contenu d’une page Confluence à un utilisateur en fonction de différents critères comme ses droits, son appartenance à un groupe, l’appartenance de la page à une hiérarchie spécifique, voire même son mode d’affichage et les propriétés du navigateur web.

Le plugin Visibility a beaucoup évolué depuis sa première version. De nombreuses macros ont disparu pour se recentrer sur l’essentiel avec « show-if » et « hide-if ». Comme leur nom l’indique, ces macros permettent soit de montrer, soit de cacher le contenu d’une page si la/les condition(s) sont satisfaites.

Sa gratuité ainsi que les nombreux cas d’utilisation ont rendu cette app populaire et largement utilisée lors des implémentations. Vous pouvez décider d’afficher des parties d’une page en fonction de l’appartenance d’une équipe à un groupe ou tout simplement laisser des consignes non visibles en mode lecture. Les informations cachées restent accessibles via l’action « view source », donc ce n’est pas une solution sûre pour cacher des informations sensibles.

Mais depuis le mois de janvier 2019, et la version 5.0, Visibility est devenue une app payante. Donc si vous êtes utilisateur, sachez que lorsque vous arriverez à la date de fin de validité de la licence (ou date de renouvellement), votre app ne fonctionnera plus sauf si vous l’achetez. Heureusement elle reste abordable : $150 pour 250 utilisateurs, $1,000 pour 10,000 et $1,500 en illimité.

Si vous préférez une alternative à cette app, sachez qu’une grande partie des fonctionnalités apportées par Visibility peut être nativement couverte avec des user macros.

L’implémentation faite dans ces user macros ne couvre pas entièrement le périmètre proposé par l’app Visibility.

Voici les fonctionnalités reprises :

  • les utilisateurs nommés
  • l’appartenance à un groupe
  • les droits sur une page ou espace
  • le type d’affichage, attention, seul l’export PDF sera disponible avec l’option « printable »
  • toutes les conditions / une condition parmi elles

Une user macro est une macro, déclarée et définie par l’administrateur de Confluence, pouvant faire un traitement sur du contenu ou afficher du contenu additionnel. La création d’une user macro demande quelques compétences en développement et de savoir lire l’API Java.

Nous vous dévoilons ici comment procéder au remplacement par une solution native.

  1. Tout d’abord vous devrez désactiver l’app Visibility puisqu’elle sera remplacée par les user macros
  2. Il vous faudra modifier le CSS pour pouvoir choisir de cacher ou non certaines parties de la page Confluence lors de l’export PDF
  3. Enfin, il faudra créer les 2 users Macros

Entrons à présent dans le vif de l’action.

Création de la user macro « Hide-if »

Modification du CSS

Ajouter du CSS dans le Style PDF de votre instance

.NoDisplay {  
  display:none !important;  
}

Création de la user macro

Suivez les instructions de création d’une nouvelle user macro en utilisant le paramétrage ci-dessous:

Nom de la macro : hide-if

Visibilité : 

Titre de la macro : Hide-If

Description : Cache le contenu lorsque les conditions sont remplies

Catégories : Contenu de Confluence

Traitement du corps de la macro : Affiché

Modèle

## Macro title: hide-if
## Macro has a body: Y 
## Body processing: render
##
## Developed by: Cyrille Martin [VALIANTYS]
## Date created: dd/mm/yyyy
## Installed by: My Name

## @param match:title=Match Using|type=enum|enumValues=all,any|required=false|desc=If set to any, only one of the specified restrictions needs to match.|default=any
## @param user:title=Users|type=username|required=false|desc=The list of users to match.|multiple=true
## @param group:title=User groups|type=string|required=false|desc=The list of user groups to match.
## @param spacePermission:title=Space Permissions|type=string|required=false|desc=This property allows you to define whether the content inside this macro is hidden to a certain user based on his space permissions. This can be done by either of the following:</br>
Using @self to specify current space, followed by ":", then followed by permission type e.g. @self:view
These are the permission types:</br>
<ul>
<li><strong>view</strong> - (default) The user can view the space.</li>
<li><strong>edit</strong> - The user can edit pages.</li>
<li><strong>admin</strong> - The user can administer the space.</li>
<li><strong>news</strong> - The user can post a blog entry</li></ul>
## @param display:title=Display Types|type=string|required=false|desc=This property allows the user to hide content only in a document that has been exported to PDF and not on the Confluence page. </br>The (list of) display modes:</br><strong>default</strong> - content is hidden in both Confluence and the exported PDF document</br><strong>printable</strong> - content is hidden only in the exported PDF document

#set( $hidecontentuser = false)
#set( $hidecontentgroup = false)
#set( $getPermission = false)
#set( $username = "$req.getRemoteUser()" )

## Check User
#if( $!paramuser)
  #foreach( $userlisted in $paramuser.split(",") )
    #if( $userlisted == $username)
      #set( $hidecontentuser = true)
    #end 
  #end
#end

## Check Groups
#if( $!paramgroup)
  #foreach( $grouplist in $userAccessor.getGroupNamesForUserName($username))
    #foreach( $grouplisted in $paramgroup.split(","))
      #if( $grouplist == $grouplisted)
        #set( $hidecontentgroup = true)
      #end 
    #end
  #end
#end

## Check Permission
#if( $!paramspacePermission)
  #set ($colonIndex = $paramspacePermission.indexOf(":"))
  #if ($colonIndex == -1)
    #set ($pagePermission = $paramspacePermission)
  #else
    #set ($spaceKey = $paramspacePermission.substring(0, $colonIndex))
    #set ($pageActionIndex = $colonIndex + 1 )
    #set ($pagePermission = $paramspacePermission.substring($pageActionIndex))
  #end
  #if( $pagePermission == "edit")
    #set( $getPermission = $permissionHelper.canEdit($userAccessor.getUserByName($username),$content) )
  #elseif( $pagePermission ==  "view")
    #set( $getPermission = $permissionHelper.canViewPage($userAccessor.getUserByName($username),$content))
  #elseif( $pagePermission ==  "news")
    #set( $getPermission = $permissionHelper.canCreateBlogPost($userAccessor.getUserByName($username),$space))
  #elseif( $pagePermission ==  "admin")
    #set( $getPermission = $permissionHelper.canAdminister($userAccessor.getUserByName($username),$space))
  #end
#end


## Display AREA
#if( $parammatch == "any")
  #if($hidecontentuser || $hidecontentgroup || $getPermission) 
    #if ($!paramdisplay != "printable")
    #else
      
<div class="NoDisplay">
        $body
      </div>
    #end
  #else  
    $body
  #end
#else
  #if( (($!paramuser && $hidecontentuser) || !($!paramuser || $hidecontentuser)) && (( $!paramgroup && $hidecontentgroup) || !( $!paramgroup || $hidecontentgroup)) && (($!paramspacePermission && $getPermission) || !($!paramspacePermission || $getPermission)) )
    #if ($!paramdisplay != "printable")
    #else
      
<div class="NoDisplay">
        $body
      </div>  
    #end
  #else  
    $body
  #end
#end

Voilà le tour est joué, vos utilisateurs peuvent à présent cacher certaines parties d’une page Confluence selon les conditions qui seront définies.

Création de la user macro « Show-if »

Modification du CSS

Ajouter du CSS dans le Style PDF de votre instance

.Display {  
  display:none !important;  
}

Création de la user macro

Suivez les instruction de création d’une nouvelle user macro en utilisant le paramétrage ci-dessous:

Nom de la macro : show-if

Visibilité : 

Titre de la macro : Show-if

Description : Montre le contenu lorsque les conditions sont remplies

Catégories : Contenu de Confluence

Traitement du corps de la macro : Affiché

Modèle

## Macro title: show-if
## Macro has a body: Y 
## Body processing: render
##
## Developed by: Cyrille Martin [VALIANTYS]
## Date created: dd/mm/yyyy
## Installed by: My Name

## @param match:title=Match Using|type=enum|enumValues=all,any|required=false|desc=If set to any, only one of the specified restrictions needs to match.|default=any
## @param user:title=Users|type=username|required=false|desc=The list of users to match.|multiple=true
## @param group:title=User groups|type=string|required=false|desc=The list of user groups to match.
## @param spacePermission:title=Space Permissions|type=string|required=false|desc=This property allows you to define whether the content inside this macro is shown to a certain user based on his space permissions. This can be done by either of the following:</br>
Using @self to specify current space, followed by ":", then followed by permission type e.g. @self:view
These are the permission types:</br>
<ul>
<li><strong>view</strong> - (default) The user can view the space.</li>
<li><strong>edit</strong> - The user can edit pages.</li>
<li><strong>admin</strong> - The user can administer the space.</li>
<li><strong>news</strong> - The user can post a blog entry</li></ul>
## @param display:title=Display Types|type=string|required=false|desc=This property allows the user to show content only in a document that has been exported to PDF and not on the Confluence page. </br>The (list of) display modes:</br><strong>default</strong> - content is displayed in both Confluence and the exported PDF document</br><strong>printable</strong> - content is displayed only in the exported PDF document

#set( $showcontentuser = false)
#set( $showcontentgroup = false)
#set( $getPermission = false)
#set( $username = "$req.getRemoteUser()" )

## Check User
#if( $!paramuser)
  #foreach( $userlisted in $paramuser.split(",") )
    #if( $userlisted == $username)
      #set( $showcontentuser = true)
    #end 
  #end
#end

## Check Groups
#if( $!paramgroup)
  #foreach( $grouplist in $userAccessor.getGroupNamesForUserName($username))
    #foreach( $grouplisted in $paramgroup.split(","))
      #if( $grouplist == $grouplisted)
        #set( $showcontentgroup = true)
      #end 
    #end
  #end
#end

## Check Permission
#if( $!paramspacePermission)
  #set ($colonIndex = $paramspacePermission.indexOf(":"))
  #if ($colonIndex == -1)
    #set ($pagePermission = $paramspacePermission)
  #else
    #set ($spaceKey = $paramspacePermission.substring(0, $colonIndex))
    #set ($pageActionIndex = $colonIndex + 1 )
    #set ($pagePermission = $paramspacePermission.substring($pageActionIndex))
  #end
  #if( $pagePermission == "edit")
    #set( $getPermission = $permissionHelper.canEdit($userAccessor.getUserByName($username),$content) )
  #elseif( $pagePermission ==  "view")
    #set( $getPermission = $permissionHelper.canViewPage($userAccessor.getUserByName($username),$content))
  #elseif( $pagePermission ==  "news")
    #set( $getPermission = $permissionHelper.canCreateBlogPost($userAccessor.getUserByName($username),$space))
  #elseif( $pagePermission ==  "admin")
    #set( $getPermission = $permissionHelper.canAdminister($userAccessor.getUserByName($username),$space))
  #end
#end

## Set the style for the show-if
<style>
 #if( $!paramdisplay == "printable")
  .Display {
   display:none;
  }
 #else
  .Display {
   display:block;
  }
 #end
</style>
## Display AREA

<div class="Display">
#if( $parammatch == "any")
  #if( $showcontentuser || $showcontentgroup || $getPermission )
    $body
  #end
#else
  #if((($!paramuser && $showcontentuser) || !($!paramuser || $showcontentuser)) && (( $!paramgroup && $showcontentgroup) || !($!paramgroup || $showcontentgroup)) && (($!paramspacePermission && $getPermission) || !($!paramspacePermission || $getPermission)))
    $body
  #end
#end
</div>

Vous pourrez maintenant montrer du contenu uniquement si certaines conditions sont respectées.

Vous avez le choix

Vous l’aurez donc compris, selon votre situation et vos ressources en interne, vous pouvez soit acheter l’app Visibility, soit contourner l’app en créant deux user macros qui vous procureront sensiblement les mêmes fonctionnalités.

Pour toute question, n’hésitez pas à contacter nos consultants certifiés Atlassian.