- ToolParam / FormField 新增控件能力: radio(单选按钮组)、switch(勾选框+开关值映射)、quickPeriods(快捷时段)、 dailyExpand(按天展开)、autoPickFirst(默认选中第一项)、 hideIfSingleOption(单选项隐藏)、placeholder(照搬模块页原文案) - LeaveTools: * leave.submit / leave.register 的 leaveType 改单选按钮组并默认选中第一个 * 请假时间补齐快捷时段与「连续请假」勾选框(勾上展开连续天数 + 逐天时段) * 事由 / 附件对齐模块页文案;学生端 classId 单班隐藏、教师端恒显示 - ToolExecutor.expandDailyArgs 认前端显式发来的 continuousLeaveTime (用户在逐天时段里做过微调就以他改的为准,不再按基准覆盖) - 只读查询因下游 302 失败时也回传 landingPath,让「去业务系统查看」按钮有着落
This commit is contained in:
@@ -96,9 +96,9 @@ class FormFieldWidgetTest {
|
||||
assertFalse(f.isOptionsFallback());
|
||||
}
|
||||
|
||||
/** ⑥ 真实工具定义回归:请假类型必须是带中文选项的下拉框,不能退回数字框 */
|
||||
/** ⑥ 真实工具定义回归:请假类型必须是带中文选项的**单选按钮组**(对齐模块页 RadioGroup) */
|
||||
@Test
|
||||
void leaveSubmitTypeIsASelectInRealToolDefinition() {
|
||||
void leaveSubmitTypeIsARadioInRealToolDefinition() {
|
||||
ToolDef def = LeaveTools.defs().stream()
|
||||
.filter(d -> "leave.submit".equals(d.getName()))
|
||||
.findFirst()
|
||||
@@ -111,9 +111,76 @@ class FormFieldWidgetTest {
|
||||
|
||||
FormField f = leaveType.toFormField();
|
||||
|
||||
assertEquals("select", f.getWidget());
|
||||
// ★ 2026-10-13:从下拉改为单选按钮组 —— 模块页 LeaveApply.vue 用的就是 RadioGroup,
|
||||
// 且进页面即选中第一项,助手表单要一致。
|
||||
assertEquals("radio", f.getWidget());
|
||||
assertTrue(f.isAutoPickFirst(), "选项就绪后应自动选中第一项(模块页的默认行为)");
|
||||
assertEquals("leave.types", f.getOptionsFrom(), "选项仍走学校自定义的实时字典");
|
||||
assertEquals(2, f.getOptions().size());
|
||||
assertEquals("病假", f.getOptions().get(0).get("label"));
|
||||
assertEquals("事假及其他", f.getOptions().get(1).get("label"));
|
||||
}
|
||||
|
||||
/** ⑦ 单选控件的值与 label 必须同类型(前端 Radio 用严格比较判定选中态) */
|
||||
@Test
|
||||
void radioOptionValuesStayStringsForStrictComparison() {
|
||||
ToolParam p = ToolParam.required("leaveType", "integer", "请假类型")
|
||||
.radio().autoPickFirst()
|
||||
.fallbackOptions(new String[]{"1", "2"}, new String[]{"病假", "事假及其他"});
|
||||
|
||||
FormField f = p.toFormField();
|
||||
|
||||
assertEquals("radio", f.getWidget());
|
||||
assertEquals("1", f.getOptions().get(0).get("value"), "选项值必须是字符串,否则前端单选按钮选不上");
|
||||
assertTrue(f.isAutoPickFirst());
|
||||
}
|
||||
|
||||
/** ⑧ 勾选框:连续请假用 switch(模块页是 Checkbox,不是「是/否」下拉) */
|
||||
@Test
|
||||
void switchWidgetCarriesOnOffValues() {
|
||||
ToolParam p = ToolParam.optional("continuousLeave", "integer", "是否连续请假")
|
||||
.switchOf("1", "0");
|
||||
|
||||
FormField f = p.toFormField();
|
||||
|
||||
assertEquals("switch", f.getWidget());
|
||||
assertEquals("1", f.getSwitchOn());
|
||||
assertEquals("0", f.getSwitchOff());
|
||||
}
|
||||
|
||||
/** ⑨ 快捷时段:三元组按「标签, 开始, 结束」解析,个数不是 3 的倍数要当场报错 */
|
||||
@Test
|
||||
void quickPeriodsParsesTriplesAndRejectsBadArity() {
|
||||
ToolParam p = ToolParam.required("startDate", "string", "开始时间")
|
||||
.quickPeriods("startDate", "endDate",
|
||||
"全天", "08:00:00", "18:00:00",
|
||||
"上午", "08:00:00", "12:00:00",
|
||||
"下午", "12:00:00", "18:00:00");
|
||||
|
||||
FormField f = p.toFormField();
|
||||
|
||||
assertEquals("startDate", f.getQuickPeriods().get("start"));
|
||||
assertEquals("endDate", f.getQuickPeriods().get("end"));
|
||||
@SuppressWarnings("unchecked")
|
||||
java.util.List<java.util.Map<String, String>> items =
|
||||
(java.util.List<java.util.Map<String, String>>) f.getQuickPeriods().get("items");
|
||||
assertEquals(3, items.size());
|
||||
assertEquals("全天", items.get(0).get("label"));
|
||||
assertEquals("08:00:00", items.get(0).get("start"));
|
||||
assertEquals("18:00:00", items.get(0).get("end"));
|
||||
|
||||
org.junit.jupiter.api.Assertions.assertThrows(IllegalArgumentException.class,
|
||||
() -> ToolParam.required("s", "string", "").quickPeriods("s", "e", "仅一个标签"));
|
||||
}
|
||||
|
||||
/** ⑩ 多行文本框的行数与字数上限也要下发(对齐模块页「请假事由」的 4 行 / 1000 字) */
|
||||
@Test
|
||||
void textareaRowsAndMaxLengthArePassedThrough() {
|
||||
FormField f = ToolParam.required("remarks", "string", "请假事由")
|
||||
.as("textarea").rows(4).maxLength(1000).toFormField();
|
||||
|
||||
assertEquals("textarea", f.getWidget());
|
||||
assertEquals(4, f.getRows().intValue());
|
||||
assertEquals(1000, f.getMaxLength().intValue());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user