jxTMS提供了工具条定制能力,类似当前界面下可操作的功能菜单。而工具条本质就是一个事件触发点,要么是cmd命令来执行某种操作,要么是再显示一个界面【可以显示到主界面,如查看详情;也可以显示到辅助界面,如查看流程日志】,但jxTMS有一个限制:新显示的界面哪怕和当前界面是同一个名字的capa,也会加载新的擦怕。
这主要和capa的特性有关,即capa需要缓存内部数据来保证用户操作的连续性,如用户在查询界面,输入姓名、日期等进行条件查询,那就必须保存用户当前的搜索语句,然后添加相应的条件,最后生成用户期望的查询语句来执行,所有这些过程都需要capa进行缓存。
但如果用户打开的不同界面是同一个capa,那用户在不同界面中的操作就无法保证一致性,很大可能会破坏capa和用户交互的连续性,所以jxTMS就确定了一个原则:主界面中的不同界面就是单独的capa,辅助界面主要提供信息而不应有用户交互。
也就是说,主界面中的每个界面都是单独的capa。辅助界面都是提供当前用户正常工作所需的额外信息的,可以是当前的capa也可以是新的capa,但不应该在辅助界面中有用户交互。
那么,有些情况下,这个规定就导致工具条中的某些操作无法实现了,如,手动创建试卷,那就需要录入试卷名、考试时间等等,如果新打开一个主界面,那就需要在当前界面和新界面之间传递大量的参数【用户挑选的需要加入试卷的所有题目ID、各题目的待选状态等】,这就需要两个capa进行繁琐的数据准备工作,导致开发者工作量增大,bug率上升,显然与笔者开发jxTMS的核心思想相违背。而如果显示到辅助界面,首先就违反了前述的辅助界面应主要提供信息而不交互这一原则,其次辅助界面也太窄,不方便大信息量状态下的用户交互性操作。
注:辅助界面应主要提供信息而不交互这一原则是建议而非jxTMS的强制约束,即开发者当然可以在辅助界面进行交互【如流程日志界面中有各版本快照的显示,点击即可在主界面打开一个快照显示界面】,但由于jxTMS对主辅界面就是按这一原则进行设计的,开发者如果强行增加【点击->显示】之外的交互会给自己带来极大的麻烦
那么,当用户在某主界面需要较多的交互时该如何办呢?!
对于简单的交互,jxTMS提供了确认和收集两种简单的手段:
1、确认。点击某cmd型按钮或工具条后,弹出一个对话框提示用户,用户点击确认按钮后才执行,否则不执行
在op.py文件中相应的cmd类型的工具条入口,增加确认属性:
confirm(提示消息字符串)
例:
json.config('确实提交产品台账信息的修改吗?!'.decode('utf-8'))
或在web定义的a型控件中增加属性:
confirm=提示消息字符串
例:
web testConfirm type a width=100,confirm='实提交产品台账信息的修改吗?!',其它属性定义;
2、收集。点击某cmd型按钮或工具条后,弹出一个对话框提示用户输入信息,用户输入并点击确认按钮后才执行,否则不执行,如果执行,则将用户输入内容作为promptInput参数传递到后台
在op.py文件中相应的cmd类型的工具条入口,增加确认属性:
prompt(提示消息字符串)
例:
json.prompt('请输入购买数量:'.decode('utf-8'))
或在web定义的a型控件中增加属性:
prompt=提示消息字符串
例:
web testPrompt type a width=100,prompt='请输入购买数量:',其它属性定义;
那么,当交互的信息量超过一个之后,该如何办呢?!
jxTMS针对此种情况提供了对话框显示的界面,而这种界面只能依附与主界面,由于其是模态对话框,所以弹出后主界面被遮蔽而无法操作,所以这种方式就避免了一个capa两个界面同时交互而导致的不一致问题。其定义方式为:
1、先在web文件中定义该界面:
web remove2PB type div okBtn='remove2PBBtn';
web remove2PBt1 parent remove2PB type table title="移动到其它备课本",width=600,alone=true;
with remove2PBt1 row 0 col c0 web n type text text="备课本:",width=120;
with remove2PBt1 row 0 col c1 web otherPB bind otherPB type combobox text="选择备课本",width=250,useText=true;
web remove2PBBtn parent remove2PB type a width=80,text='移动',motion=cmd,demand=addPaperToPB,hide=true,confirm='确认移动到其它备课本吗?';
这是一个实际的移动当前试卷到其它备课本的对话框操作。笔者特意将其分为了三个部分,中间是正常的界面所保护的交互用web控件的定义,我们不必关心,特殊点在一头一尾这两行。
第一行和通常的主辅界面的组容器的定义不同点在于多了一个对话框按钮定义:
okBtn='按钮名'
这是由于,一般的对话框本身就自带一个确认按钮、一个取消按钮,如果再定义一个移动按钮,那么一方面显示出来不好看,另一方面,如果用户理解错误,没有点击移动按钮而是点击了确认按钮怎么办?!
所以,对于对话框界面,就需要用开发者自定义的功能按钮来取代确认按钮,即当用户点击确认按钮时,处理完原本的确认按钮功能【就是简单的关闭对话框】后,会模拟点击开发者在okBtn属性指定的该名字的功能按钮。
最后一行即是本对话框要执行的功能按钮的定义,需要注意的是和一般的按钮的定义不同的是需要指定其父容器就是对话框界面div,同时还需要设置hide属性:
hide=true
这是因为前述的如果再显示功能按钮不美观,还会给用户带来困扰,不知道点哪个按钮为好【当然在对话框界面定义了okBtn属性后,这两个按钮的功能以及基本一样了,除了功能按钮不会自动关闭对话框】,设置了hide属性为true,则功能按钮会被创建而不显示。
2、为该界面的显示入口增加显示到对话框的指示
如果是在op.py中定义的工具条,则:
set("dispInDialog", True)
例:
json.set('dispInDialog', True)
如果是在web中定义的工具条,则:
dispInDialog=true
例:
web testA type a width=100,dispInDialog=true,其它属性定义;
此外,数据列表中的某些操作,是可以在dispAffairInfo函数中指定的:
def dispAffairInfo(self,db,ctx,json, jo):
json.set("op3",self.getViewDialogA('remove2PB','移动'.decode('utf-8'),jo.ID))
self.setLoadBtnForDisp(ctx,'remove2PB')
即在数据列表的每一行的op3这一列添加一个显示为【移动】的工具条,用户点击即会弹出前面定义的remove2PB对话框。
setLoadBtnForDisp函数是由于显示remove2PB这个操作,没有用op.py中的入口形式进行定义,则remove2PB就会没有权限设置,导致用户一点击【移动】这个工具条,就会报没有权限执行。所以必须使用setLoadBtnForDisp通知jxTMS临时为当前用户增加disp.remove2PB的权限,来允许用户访问。
注:web中定义的工具条,都会追随界面的权限。即,如果用户有权限打开某界面,则该界面中通过web文件静态定义的所有按钮、工具条其都有权限操作。jxTMS会自动在加载web界面时为当前用户临时增加对这些按钮、工具条的访问权限
目前,jxTMS已经打包为云服务器镜像,开发者开箱即用:
jxTMS-腾讯云市场