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)}"/>