2017-04-05 12 views
0

J'essaie d'empêcher les utilisateurs sans accès administratif d'enregistrer un formulaire avec l'état «complet» sélectionné, s'il n'était pas déjà sélectionné (par exemple, les utilisateurs sont autorisés à ouvrir des formulaires et à apporter des modifications à leurs données, même si le statut est prêt à être rempli, ils ne peuvent tout simplement pas marquer leurs documents comme complets).Comment empêcher les utilisateurs sans accès administrateur d'enregistrer un formulaire avec un certain statut dans les visages

La raison pour laquelle les utilisateurs sont autorisés à apporter des modifications aux documents «terminés» est que l'enregistrement électronique est juste le reflet d'un processus de travail en coulisses. Pour qu'un article soit marqué comme complet, plusieurs autres processus doivent avoir été complétés. L'information peut être éditée après coup pour tenir compte des erreurs de transcription ou de verbiage.

Je pense qu'il serait suffisant d'utiliser un simple événement onChange qui re-sélectionne la sélection précédente si un utilisateur tente de changement l'état de remplir. Je cherche une manière élégante de le faire, heureusement sans stocker la sélection précédente dans un champ séparé sur la page, car il est déjà stocké ailleurs. le grantBacking.editGrant.statusCode est le code d'état enregistré/en cours pour le formulaire. En outre, il existe au moins trois types de rôles différents, y compris l'accès en lecture, «Ajouter» et «Administrateur». Lire - auto-explicatif, Ajouter - Peut apporter des modifications au formulaire, mais ne devrait pas être en mesure de remplir un formulaire, et Administrateur - peut apporter des modifications et peut marquer un état de formulaire comme "complet".

C'est ce que j'ai jusqu'à présent:

<t:panelGroup> 
<sec:authorize ifNotGranted="ADMINISTRATOR"> 

    <h:selectOneMenu id="grantStatus" onchange="#checkGrantStatusPermissions(this,grantBacking.editGrant.statusCode)" onmouseover="Tip('#{msg_bundle.grant_status_help}')" value="#{grantBacking.editGrant.statusCode}"> 
     <f:selectItems value="#{grantBacking.grantSelectStatusForNonAdmin}" /> 
    </h:selectOneMenu> 
</sec:authorize> 

<sec:authorize ifAnyGranted="ADMINISTRATOR"> 

    <h:selectOneMenu id="grantStatusForAdmin" onmouseover="Tip('#{msg_bundle.grant_status_help}')" value="#{grantBacking.editGrant.statusCode}"> 
     <f:selectItems value="#{grantBacking.grantSelectStatus}" /> 
    </h:selectOneMenu> 
</sec:authorize> 

<sec:authorize ifAnyGranted="ADD"> 
<a4j:commandLink id="qsave2" render="@all" onmouseover="Tip('Click to quick save')" action="#{grantBacking.saveGrant}"> 
    <h:graphicImage title="Click this to quick save the grant/contract" style="border-style:none;" height="20px" width="15px" library="default" name="img/icons/disk.png" /> 
</a4j:commandLink> 
</sec:authorize> 

<script type="text/javascript"> 
    function checkGrantStatusPermissions(field, originalValue){ 
     if(originalValue.equalsIgnoreCase("complete")){ 
      return 
     } 
     else{ 
      document.getElementByID(field).value = originalValue.value; 
     } 
    } 
</script> 
+0

Ne pouvez-vous pas simplement supprimer "complete" de la liste d'options si ces conditions ne sont pas remplies? Si vous n'aimez pas cette approche, vous pouvez également la désactiver en utilisant les attributs var & itemDisabled de la balise selectItems. – axemoi

+0

J'ai d'abord pensé à cela, mais le formulaire enregistre tous les champs si l'utilisateur clique sur 'enregistrer'. Cela signifie que si le statut ne s'affiche plus "complet" lorsque l'utilisateur clique sur Enregistrer, le statut sera modifié. – Jolley71717

+0

Pouvez-vous mieux décrire ce que l'utilisateur est autorisé à faire? Si le statut est déjà "complet" alors pourquoi un utilisateur normal est-il autorisé à le modifier? – Makhiel

Répondre

1

Avant l'élément marqué comme complet, vous pouvez désactiver l'option en construisant votre selectItems comme ceci:

<f:selectItems value="#{grantBacking.grantSelectStatusForNonAdmin}" var="v" 
    itemDisabled="#{grantBacking.shouldDisableOption(v)}"/> 

Si votre version de EL ne comprend pas la possibilité de transmettre des paramètres, vous pouvez accomplir la même chose par en utilisant une classe interne qui contient votre valeur, label, et a une méthode sans paramètre pour shouldDisable.

Lorsqu'il s'agit de soumettre un formulaire complété si l'utilisateur ne peut pas le modifier de Complet à un autre statut, il suffit de rendre le selectMon en lecture seule. S'ils le peuvent, alors votre logique shouldDisable devrait renvoyer false dans ce cas. En procédant ainsi, vous empêchez les utilisateurs de sélectionner les mauvaises valeurs connues et vous évitez le comportement de codage auquel les utilisateurs ne s'attendraient pas, conduisant à des rapports de bogue potentiels.