Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何防止没有管理员权限的用户在faces中保存具有特定状态的表单_Javascript_Jsf_Richfaces_Facelets - Fatal编程技术网

Javascript 如何防止没有管理员权限的用户在faces中保存具有特定状态的表单

Javascript 如何防止没有管理员权限的用户在faces中保存具有特定状态的表单,javascript,jsf,richfaces,facelets,Javascript,Jsf,Richfaces,Facelets,我试图阻止没有管理权限的用户在尚未选择“完成”状态的情况下保存表单(例如,允许用户打开表单并编辑其数据,即使状态设置为“完成”,他们也无法首先将其文档标记为“完成”) 允许用户对“已完成”的文档进行更改的原因是,电子记录只是落后于现场工作流程的反映。为了将项目标记为完成,必须完成其他几个过程。这些信息可以在事后编辑,以解释抄写或逐字的错误 我认为只要利用onChange事件,在用户试图将状态更改为完成时重新选择上一个选择就足够了。我正在寻找一种优雅的方法来实现它,希望不会将以前的选择存储在页面上

我试图阻止没有管理权限的用户在尚未选择“完成”状态的情况下保存表单(例如,允许用户打开表单并编辑其数据,即使状态设置为“完成”,他们也无法首先将其文档标记为“完成”)

允许用户对“已完成”的文档进行更改的原因是,电子记录只是落后于现场工作流程的反映。为了将项目标记为完成,必须完成其他几个过程。这些信息可以在事后编辑,以解释抄写或逐字的错误

我认为只要利用
onChange
事件,在用户试图将状态更改为完成时重新选择上一个选择就足够了。我正在寻找一种优雅的方法来实现它,希望不会将以前的选择存储在页面上的单独字段中,因为它已经存储在其他位置。
grantBacking.editGrant.statusCode
是表单的已保存/当前状态代码。此外,至少有三种不同的角色类型,包括“只读访问”、“添加”和“管理员”。阅读-自解释,添加-可以对表单进行更改,但不能完成表单,管理员-可以进行更改并将表单状态标记为“完成”

这就是我到目前为止所做的:

<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>


函数检查GrantStatusPermissions(字段,原始值){
if(原始值等信号情况(“完成”)){
返回
}
否则{
document.getElementByID(field).value=originalValue.value;
}
}

在项目标记为完成之前,您可以通过如下方式构建selectItems来禁用该选项:

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

如果您的EL版本不包括传递参数的功能,那么您可以通过使用一个内部类来实现同样的功能,该类保存您的值、标签,并具有shouldDisable的无参数方法

在提交已完成表单时,如果用户无法将表单从完成状态更改为其他状态,则只需将selectMenu设置为只读即可。如果可以,那么在这种情况下,您的shouldDisable逻辑应该返回false


这样做可以防止用户选择已知的错误值,并避免您编写用户预期不会导致潜在错误报告的行为。

如果不满足这些条件,您能否从选项列表中删除“完成”?如果你不喜欢这种方法,你也可以使用selectItems标签的var&itemsdisabled属性来禁用complete。这意味着,如果用户单击“保存”时状态不再显示“完成”,则状态将更改。您能更好地描述允许用户执行的操作吗?如果状态已经“完成”,那么为什么一个普通用户可以编辑它?我在问题的中间加了一个段落来解决这个问题。我想我没有说只有具有“添加”权限的用户才能进行添加,因此具有“读取”权限的普通用户不能进行更改。使用“ajax”可以阻止提交所有字段
<f:selectItems value="#{grantBacking.grantSelectStatusForNonAdmin}" var="v"
    itemDisabled="#{grantBacking.shouldDisableOption(v)}"/>