更新记录

FineUI 自 2008 年起持续迭代,每一次版本更新都源于真实项目的打磨与沉淀。

RECENT RELEASES

最近更新

v16.0.0 #218

新增

  • [Java] FineUI.Java 首次发布,将标签声明控件、后台处理事件、控件状态自动往返的开发方式带到 Spring Boot。
    • 支持表单、表格、树、布局、窗体、数据绑定与校验;页面类支持 Spring 依赖注入,业务代码可直接调用服务与数据仓库。
    • 回发使用纯 JSON 增量响应,框架不执行脚本文本;控件状态无需保存在服务端 Session,回发请求按顺序处理。
    • 支持 Java 17+;Spring Boot 最低要求 3.5.16,支持 4.1.x;一个 Maven 依赖包含类库、前端运行时、主题和语言资源。
    • 提供完整示例、空项目、电影管理快速入门与 AppBox 权限管理框架,配套开发指南和 API 文档。
  • [Core/Pro/Java] 社区版通过公共软件包仓库分发:NuGet 包 FineUI.Core、FineUI.Pro,Maven 坐标 com.fineui:fineui-java。企业版使用客户专属版本,从客户本地源或私有源安装。
  • [示例] 官方示例、空项目、QuickStart、AppBox 和 fineui-skills 在独立仓库公开。17 个应用项目的自有源码采用 MIT 许可;FineUI 框架、二进制包和内嵌运行时仍适用各自许可,不属于这些项目的 MIT 授权范围。
    • fineui-skills 提供面向 AI 编程工具的官方知识包,按技术栈与开发模式整理控件、事件、安全及升级写法,不作为应用运行时依赖。
  • [Core-RazorForms/Java] 新增页面隐藏状态:C# 属性标记 [HiddenProperty],Java 字段标记 @HiddenProperty,即可跨回发保持,无需额外声明 HiddenField。
    • 支持可序列化的对象和集合,保留长整型与高精度小数;在 Page_Load 和事件处理前恢复。
    • 值经客户端往返,不是可信业务数据;权限、金额等仍须从服务端数据源核实。
  • [Pro] 新增 EnableImplicitPostBack 与 EnableImplicitChangeEvents 两个全局配置项,分别控制动作控件的隐式回发和表单变化事件的连带触发。
    • 类库默认均为 true,保持旧项目行为;官方示例、空项目和 AppBox 均设为 false。
    • 设为 false 后,声明对应服务端事件即可自动回发;其他控件发起回发时,只同步字段值,不连带触发其变化事件。显式 EnablePostBack / AutoPostBack 设置始终优先。
  • [Pro] 表格新增 RenderField.Commands 声明式行命令,支持文字、图标、确认框、参数、按行隐藏或禁用,以及按行数据打开编辑窗体。
    • 用 OnRowCommand 接收服务端事件,或监听客户端 rowcommand;客户端返回 false 可取消后续回发。新增 Grid.FindCommand,并校验回发中的行、列与命令。
    • LinkButtonField / WindowField 继续兼容旧页面;新示例统一使用 RenderField.Commands。
  • [Pro/Core-RazorForms/Java] 新增表格 GetSelectedDataKeys() / getSelectedDataKeys(),按稳定行 ID 关联选中行的数据键,避免用行下标查找。需同时声明 DataIDField 与包含该字段的 DataKeyNames;数据库跨页选择仍应按行 ID 查询服务端数据。
  • [Core-RazorForms] 新增 Grid.GetModifiedData() 和 GetMergedData(),与 Pro、Java 的方法入口统一;旧 ModifiedData / MergedData 属性继续兼容。无数据时三端均返回空集合。
    • Core、Java 读取完整合并数据需开启 IncludeMergedData;MVC / RazorPages 继续通过模型绑定参数读取编辑数据。
  • [Core/Java] 新增中止页面的标准方式:Core 返回 UIHelper.AbortPage(...),Java 抛出 AbortPageException。参数无效等情况可直接显示标准提示框,不再输出无样式的纯文本页。
  • [JS] F.validateForm / F.validateForms 支持 options 参数,例如 F.validateForm('form1', { messageBoxPlain: true });支持 target、messageBox、messageBoxPlain,旧位置参数仍可用。
  • [JS] Window 新增 setSaveStateControlIds(ids),可在客户端设置窗体关闭时回写值的控件。
  • [JS] Button 新增 setColor(color),支持在客户端切换语义色;传入空字符串可恢复默认色。
  • **[安全][Core/Pro]**新增 AllowDangerousScriptTag,控制是否继续把消息、确认文字等文案中的 <script> 当作代码。默认 true 以兼容旧项目,推荐迁移后设为 false。
    • 动态提示改在页面具名函数中生成,需要回传数据时使用 F.customEvent;不要把用户输入拼入脚本文本。官方示例和空项目已关闭此兼容入口。
  • **[安全][Java]**支持严格脚本内容安全策略(CSP),为可信 Thymeleaf 模板中的普通 <script> 自动添加每次请求独立的 nonce,无需逐个手写。
    • 官方 Examples、QuickStart、EmptyProject、AppBox 的 FineUI 页面默认启用,不放行 unsafe-inline / unsafe-eval;类库本身不强制开启,静态 HTML 与普通 Spring MVC 页面不在此处理范围内。
  • [Java] 提供表格撤销或确认编辑、更新单元格、增删行、分页排序、重载远程数据,以及窗体显示、关闭和刷新等服务端方法;消息统一通过 Alert、Confirm、Notify、Prompt 类调用,支持具名客户端回调。
  • [Java] 新增 fineui.grid-convert-long-to-string(默认 true),表格长整型数据以字符串传输,避免大整数在浏览器中丢失精度;提供 Thymeleaf 标签元数据,便于开发工具识别标签与属性。

变更

  • [Core/Pro] 产品名称、程序集和公共命名空间统一为 FineUI.Core、FineUI.Pro(不兼容提醒)。
    • 升级时替换旧包或程序集引用,更新 using、类型全名和配置;Core 同时更新 Razor Tag Helper 的程序集引用。新旧程序集不可混用。
  • [Core] 最低运行环境提高到 .NET 8(不兼容提醒)。NuGet 对 Microsoft.AspNetCore.Mvc.NewtonsoftJson 只要求 8.0.31 或更高版本、不设上限;旧项目须先升级目标框架,较高版本的宿主还应显式引用与自身 ASP.NET Core 主版本一致的适配包。
  • [Core] AddFineUI 自动登记 JArray/JObject 模型绑定器,并在启用 RazorForms 时登记页面过滤器;不再需要手工添加,保留旧登记也不会重复执行。宿主仍需配置 MVC / RazorPages、AddNewtonsoftJson、UseFineUI 和路由。
  • [Core/Pro/Java] 客户端点击统一推荐 ClickHandler(Java:click-handler):属性只写函数名,函数首参为 event;OnClick / on-click 仍表示服务端事件。
    • 普通控件可在回发中更换或清空处理函数;TreeNode 回调为 (event, nodeId),随节点数据更新,不支持单独的增量 setter。同一控件不要同时声明 ClickHandler 与 click Listener。
    • 点击顺序为「表单验证 → beforeclick → click → 确认框与回发」;Core / Pro 的兼容 OnClientClick 在 beforeclick 后、click 前执行。验证失败时不执行点击回调,只有显式 return false 才取消后续动作(不兼容提醒)。
    • Core / Pro 的 OnClientClick 从 click 之后提前到之前,迁移时须核对取消逻辑和父菜单 ItemClick。Java 首发不提供 OnClientClick、隐式 <raw> 或全局 __doPostBack 兼容入口。
    • 六套示例和五个空项目模板均改用具名函数;按钮型链接使用 href="#" 并由点击处理器阻止默认导航,避免改变页面 hash。
  • [Pro/Core-RazorForms/Java] 页面级自定义回发统一使用 F.customEvent(name, payload),由 Page_CustomEvent 接收;支持基本值、对象和数组,Pro 补齐相同入口。
    • Core RazorForms 的客户端临时数据推荐由此传入;需要绑定到命名表单字段时使用 F.doPostBack({ eventName, params })。Java 不提供 params 通道;MVC / RazorPages 继续使用各自的 OnClickParameter。
  • [Pro/Core-RazorForms/Java] 普通控件回发参数以 click、change 等客户端事件名开头,Grid、Tree、Window 的参数格式统一。
    • 不兼容提醒:Pro 不再接收空默认参数及 Command、Page、ClearIcon 等旧标识;自行拼接底层回发参数的代码须迁移。Java 按服务端页面声明派发事件,不向浏览器暴露后台处理方法名。
  • [四栈] 回车聚焦属性指向按钮时只聚焦,不再自动点击(不兼容提醒)。需要回车点击按钮时使用 NextClickControl,Java 为 next-click-control,JS 为 enterClickControl。
  • [Pro] 表格列未设置 ColumnID 时优先使用 DataField,与 Core 保持一致;依赖旧自动列名的客户端代码应显式设置 ColumnID。
  • [四栈] 表格检查分组列、叶子列和隐藏列的 ColumnID 是否唯一。F / Core / Pro 默认警告,可用 gridStrictColumnIdValidation / GridStrictColumnIDValidation 开启严格检查;Java 始终严格检查。自动列名会避让已有名称。
  • [Core/Pro/Java] 内嵌资源地址改为按文件内容生成缓存摘要,内容未变时可跨页面与 iframe 复用缓存,内容改变时自动更新地址。
    • 不兼容提醒:Core / Pro 的 res.axd 不再接收旧 t 参数,Java 内嵌资源从 /F/ 迁至 /FineUI/;请使用框架生成的地址,并在部署后刷新旧页面。业务自己的 /res/ 文件不受此规则管理。
  • [Core/Pro/Java] 新授权文件名前缀统一为带点产品名,如 FineUI.Core.lic.dev.config;旧前缀仍可读取,新旧文件并存时优先使用新文件。
  • [Pro] 本地调试模式下 __FSTATE 以明文 JSON 传输,便于检查;发布态保持混淆编码。混淆不等于加密或防篡改。
  • [示例] 图片与文件下载统一为公共 Download 入口:图片白名单内的文件可内联显示,其他文件强制下载;上传文件存放在不可直接访问的目录,WebUploader 增加上传归属校验。
  • [JS] 回发请求改用原生 fetch;统一手风琴、面板、表格和树的展开折叠动画,减少快速连续操作造成的状态与显示异常。

废弃

  • [Core/Pro] 表格 SelectedRowIndex / SelectedRowIndexArray 标记为过时;改用 SelectedRowID / SelectedRowIDArray,读取数据键用 GetSelectedDataKeys()。行事件参数中的 RowIndex 仍可用于定位事件发生的行。
  • [Pro] GetModifiedDict()、GetDeletedList()、GetNewAddedList() 标记为过时;改用 GetModifiedData(),按 status(modified / newadded / deleted)处理,每条记录直接携带 id。
    • 新方法返回原始 JSON,清空数字单元格时得到空字符串;写入数据库或 DataTable 前须转换为适当的空值。读取编辑数据应在重新绑定表格之前完成。
  • [Core/Pro] TreeNode.OnClientClick 及可替代的 OnClientBlur、OnClientTriggerClick 等属性标记为过时;分别改用 ClickHandler 或对应事件的具名 Listener。其他控件的 OnClientClick 本版继续兼容。
  • [Pro] PageManager.CustomEvent(标签 OnCustomEvent)与 GetCustomEventReference 废弃;改用 F.customEvent 和 Page_CustomEvent,旧入口仍可运行。
  • [Core] ExcludedURLs 废弃但继续兼容;中间件仅缓冲需要加工的 HTML,图片、文件和其他响应直接输出,降低大文件下载时的内存占用。

移除

  • 移除对所有 IE 浏览器的支持,以及 F.isIE8()、F.isIE89()、F.isIE9()、F.isIE();请使用 Chrome、Edge、Firefox、Safari 等现代浏览器(不兼容提醒)。

修复

  • **[安全][Pro]**修复 EnableFStateValidation 状态签名校验。启用后必须显式配置 <machineKey> 的 validationKey,不可使用 AutoGenerate;多节点部署须保持密钥一致(不兼容提醒)。默认未开启此项的项目不受影响。
  • **[安全][Core-RazorForms]**页面过滤器中止请求后,不再执行控件事件,避免权限检查已拒绝请求而业务写入仍然发生。
  • **[安全][Core/Pro]**补齐可信 HTML 标记的回发处理和脚本字符串转义边界,修复部分提示、文本在回发后显示或编码不正确的问题。
  • [JS] 修复大量列、多级分组表头在混合列宽下与表体错位的问题,横向滚动与锁定列下也保持对齐(STARK11号 - https://t.zsxq.com/sJSCQ)。v15.2.0 的修复只覆盖了部分等宽场景,本次补齐。
  • [JS] 修复表格日期列解析时丢失时分秒、被显示为 00:00 的问题,兼容带时间的斜杠日期字符串。
  • [JS] 修复 HiddenField 未加入表单字段集合、导致表单重置时未被清空的问题。
  • [Core] 修复表格跨页保持选中时回发报错,以及 iframe 属性修改未完整同步到客户端的问题。
  • [Core] 修复回发修改 Accordion 的 ActivePaneIndex 后,客户端未激活对应面板的问题。
  • [Pro] 修复 DropDownList 空值选项的选中状态,以及表格列提示被重复 HTML 编码的问题。
  • [Core/Pro/JS] 统一 HyperLink / LinkButton 的禁用行为:禁用后不可点击或通过 Tab 聚焦,启用后恢复;清空超链接地址时移除旧链接。
  • [Java] 修复动态控件属性跨回发丢失、列表选择更新遗漏、通知关闭按钮配置未生效,以及网址数据源首次自动加载不一致的问题。
  • [示例] 修复清空数字单元格后保存报错、两个触发器输入框的延迟搜索失效,以及子目录部署时查看源代码或文件回显地址错误的问题。
v15.2.0 #217
  • [安全] 修复 <raw> 标签的 XSS 隐患,换用更安全的方式输出"可信的 HTML"。
    • 老问题:以前想让一段文本按 HTML 显示(不转义),要写成 <raw>...</raw>。但如果这段文本来自用户输入或数据库,就能塞进 <script> 等脚本代码,存在 XSS 风险。
    • 新思路:把"这段 HTML 可信"的判断交给开发者在代码里明确声明,用户填的普通文本永远不会被当成可信 HTML,从根上堵住了这个漏洞。
    • 新增声明"可信 HTML"的写法,用来替代 <raw>。
      • 后台 C#:用 new RawHtml("<b>...</b>") 包裹一下;给控件赋值如 Label1.TextRawHtml = new RawHtml(...);弹出消息框如 Alert.Show(new RawHtml(...))。
      • 页面标签:Pro 版用单属性 TextRawHtml="<b>加粗</b>",Core 版用 _TextRawHtml="<b>加粗</b>",或者 TextRawHtml="@(new RawHtml("<b>加粗</b>"))"。
      • 前端 JS:用 F.rawHtml('<b>...</b>') 传给文本、标题、提示等属性。
    • 新增全局开关,可彻底关闭 <raw> 老写法。
      • 新增配置项 AllowDangerousRawTag,默认开启(兼容老代码);推荐设为 false 把 <raw> 彻底关掉,更安全。
      • 关闭后页面里若还残留 <raw>,浏览器控制台会提醒一次,引导你改用新的写法。
    • 示例项目已全部从 <raw> 改为新写法,并默认关闭了 <raw>,作为安全配置的范例。
    • 新增文档:FineUICore开发指南/安全策略(HTML 编码);安全策略(用 RawHtml / F.rawHtml 安全输出 HTML)。
  • [安全] 修复可信 HTML(F.rawHtml / RawHtml)在跨窗口(iframe)弹层中显示为 [object Object] 的问题(腊八 - https://t.zsxq.com/onDJF)。
    • 现象:iframe 子页里用 F.alert / F.confirm 等弹到父/顶层窗口(target 为 _parent、_top),且标题或内容用 F.rawHtml(...) 声明可信 HTML 时,显示成了 [object Object]。
    • 根源:框架靠 instanceof 判断是不是可信 HTML,而 instanceof 按窗口隔离——子窗口创建的对象拿到父窗口判断会失败,于是被当普通对象输出。同窗口(不带 target)不受影响。
    • 修复:改用不受窗口隔离的判断方式,跨窗口也能正确识别;用户输入仍无法伪造,安全性不降级。
  • [安全] 菜单项文本改为默认 HTML 编码,之前把 HTML 写进菜单项文本的用法需要显式声明为“可信 HTML”(不兼容提醒!)。
    • 涉及控件:菜单项(MenuItem)、菜单按钮(MenuButton)、菜单超链接(MenuHyperLink)、菜单文本(MenuText)、菜单复选框(MenuCheckBox)。
    • 现象:升级后,菜单项文本里写的 HTML(如 <div>、<span>、<i>、<img> 等)不再按 HTML 渲染,而是被当成普通文字原样显示出来。
    • 原因:本次安全加固把菜单项文本纳入“默认 HTML 编码、开发者确信可信时才原样输出”的统一机制;而菜单项文本此前是“首次渲染时原样输出、不编码”的历史特例,故受影响。
    • 升级办法(仅对开发者确信可信的 HTML 这样声明;来自用户输入/数据库的内容不要声明,让其保持 HTML 编码):
      • [JS] 把 text: '<i>...</i>' 改为 text: F.rawHtml('<i>...</i>')。
      • [Pro] 标签写法把 Text="<i>...</i>" 改为 TextRawHtml="<i>...</i>";后置代码把 xxx.Text = "..." 改为 xxx.TextRawHtml = new RawHtml("...")。
      • [Core] 把 .Text("<i>...</i>") 改为 .TextRawHtml(new RawHtml("<i>...</i>"));标签写法(RazorForms/RazorPages)把 Text="<i>...</i>" 改为 _TextRawHtml="<i>...</i>"(或 TextRawHtml="@(new RawHtml("..."))")。
  • [安全] 单选框列表、复选框列表的列表项支持声明“可信 HTML”(谭晓 - https://t.zsxq.com/uDDcT)。
    • 列表项 RadioItem / CheckItem 新增 TextRaw、TextRawHtml 属性;列表控件新增 DataTextRaw 属性——数据绑定(DataBind)时把整列文本按可信 HTML 输出。
    • 三种数据绑定方式在功能和安全性方面等价(DataSource + DataBind + DataTextRaw、OnItemDataBound、手工构建 Items),模版内的数据字段需要自行 HtmlEncode 转义。
    • 新增示例:表单控件/选择框/单选框列表(图标选项,可信 HTML)。
  • 表格分页工具栏新增窄屏自动简洁分页模式(251081362)。
    • [JS] 为表格新增pagerAutoSimpleMode属性
    • [JS] 新增全局配置项gridPagerAutoSimpleMode;分页栏宽度不足时,完整分页器自动降级为“上一页 + 当前/总页 + 下一页”的简洁形态,拉宽后自动还原(默认关闭)。
    • [Core/Pro] 为Grid新增PagerAutoSimpleMode属性,为PageManager和配置文件新增全局配置项GridPagerAutoSimpleMode。
    • 新增示例:表格/分页工具栏/窄屏自动简洁分页。
  • 表格新增客户端事件displaytypechange,显示模式(表格/卡片)切换时触发(木南 - https://t.zsxq.com/iDJb3)。
    • [JS] 签名(event, newDisplayType, oldDisplayType);窄屏自动切换(responsiveCardSize)与手动 setDisplayType 均会触发。
    • [Core/Pro] 该客户端事件通过Listeners集合挂接,无需新增控件属性。
  • 修复可编辑日期列在 storeDateAsString=false 时,用鼠标重选“同一天”(未做任何修改)也被误标记为已修改(左上角小红标)的问题(wmdyj - https://t.zsxq.com/0y50E)。
    • [JS] 根源是时区换算:日期列(FieldType=Date)的值,服务端按 UTC 时间下发(形如 2026-06-19T00:00:00+00:00,即 UTC 的零点),浏览器换算成本地时间后,在东八区就变成了当天的 08:00;
    • [JS] ...而用户点日历重新选一次,选出来的是当天的本地 00:00。同样是 6 月 19 日,一个带 08:00、一个是 00:00,框架按“时间戳”判断两者是否相等时就认为变了,于是误判为已修改。
    • [JS] 修复:日期列“是否被修改”的判定,改为按“列显示的日期格式”比较(本例只显示到“天”,08:00 与 00:00 都算同一天,故不再误判);对含时分秒的日期时间列仍按完整时间比较,能正确识别真正的修改。
    • 新增示例:表格控件/单元格编辑/杂项/日期列编辑(重选同一天不标记为已修改)。
  • 日期范围选择支持左右面板独立切换(放牛娃 - https://t.zsxq.com/OcLDq)。
    • [JS] 为Calendar和DatePicker新增independentRangePanels属性,默认关闭。
    • [JS] 开启后,日期范围(DayRange)、月份范围(MonthRange)、年份范围(YearRange)的左右两个面板可以分别切换,不再强制相邻;左右非法交叉时相关导航按钮自动禁用。
    • [Core/Pro] 为Calendar和DatePicker新增IndependentRangePanels属性。
    • [JS] 统一浮层的落点位置:点击左右任一面板标题栏的年份/月份,浮层在该面板就地展开(独立与联动两种模式行为一致)。
    • 新增示例:日期控件/日期范围控件/日期范围(范围面板独立切换)。
  • 修复点击日期控件标题栏的年份/月份时,弹出浮层里高亮的年月不正确的问题。
    • 浮层里的年/月网格本质是“跳转导航”,应该高亮正在显示的年/月,而不是当前Calendar选中的日期。
    • 高亮改用独立的浅描边样式(弱于选中项的焦点样式),避免与“选中的日期”混淆。
  • 增强示例项目的文件上传校验,作为安全上传的范例。
    • 在示例基类中新增 ValidateUploadFile 方法,统一做“扩展名白名单 + 文件大小上限(默认 2MB)”校验,并返回具体的失败原因(类型不符 / 文件过大 / 文件为空)。
    • 所有上传示例调用基类的公共方法;多文件上传示例改为逐个校验、跳过非法文件并汇总提示。
    • 上传图片回显改为“三步安全上传”范例。
      • 扩展名白名单校验;
      • 用时间戳重命名,避免覆盖与文件名注入;
      • 文件保存到不可直接访问的目录,再通过公共下载处理器带正确的 Content-Type 输出(即使上传了 .html 等文件,浏览器也永远不会把它当页面/脚本执行)。
        • [Core] 保存到 wwwroot 之外的 App_Data/upload
        • [Pro] 保存到 App_Data/upload
    • 新增公共图片下载入口(图片扩展名白名单 + 防路径穿越 + 正确 Content-Type),基类新增 SaveUploadFile / GetImageUrl 辅助方法。
      • [Core] MVC 为 HomeController.ImageDownload
      • [Core] RazorForms/RazorPages 为 Home/ImageDownload
      • [Pro] common/ImageDownload.ashx
  • [Pro] 修复 DropDownList 空值项(Value="")导致的任意回发都会误触发 SelectedIndexChanged 的问题(曹** - https://t.zsxq.com/NUdIK)。
  • 表格新增列属性 showTooltipWhenTruncated:单元格提示仅在文本被列宽截断(出现省略号)时才显示,未截断的短内容鼠标悬停不弹提示(默认 false,向后兼容)(笑疯 - https://t.zsxq.com/pMPsE)。
    • 需配合 showTooltip=true,仅 tooltipType=qtip 时有效(title 类型走浏览器原生、无法根据单元格文本是否被截断动态显示)。
    • [JS] 提示属性仍放在内层 <span> 上并追加 data-qtip-truncated 标记,鼠标悬停时检测省略号容器(.f-grid-cell-text)的宽度以决定是否弹出提示;
    • [Core/Pro] 新增全局配置项 GridShowTooltipWhenTruncated 与列属性 ShowTooltipWhenTruncated,支持 PageManager 全局设置、表格级别和列级别的覆盖。
    • 新增示例:表格/杂项/提示信息(仅截断时显示)。
  • 修复下拉列表多选标签模式的输入框在紧凑/小字体/大字体/大间距等显示模式下高度不正确的问题(Hui - https://t.zsxq.com/FInyc)。
  • 修复日期/时间控件在 Firefox 浏览器下(Chrome 正常)时间选择列(时/分/秒)显示为空白的问题(herry)。
  • 修复 Firefox 浏览器下下拉列表、菜单、日历等区域的自定义细滚动条未生效(显示为浏览器默认滚动条)的问题。
  • 修复表格(例如右侧锁定列)数据由多变少、纵向滚动条消失后,表头仍残留滚动条补偿宽度(margin-right),导致表头与数据列错位的问题(stone磊 - https://t.zsxq.com/DeTXZ)。
v15.0.3 #216
  • [JS] 修正 esbuild 编译目标为 es2022,导致打包后的产物保留 ES2020 新语法(空值合并 ??),在旧版 WebView 解析阶段出错(Alan - https://t.zsxq.com/mG100) 。
    • 修复:编译目标(bundle 与 minify)统一降为 es2015。
  • [JS] 修正老版本Chrome浏览器可能报错 e.columnId.replaceAll is not a function。
    • esbuild 编译目标只降级新语法,不会自动补齐运行时新增的方法/静态函数;老旧 WebView 调用 String.prototype.replaceAll 等方法时报错。
    • 修复:新增运行时 polyfill,补齐 replaceAll、Array.includes、Object.values/entries、padStart/padEnd 等 ES2015+ 运行时 API,兼容旧内核。
v15.0.1 #215
  • 表格数据为空时的空状态改为可选(STARK11号 - https://t.zsxq.com/KKGn0)。
    • 新增全局配置项GridShowEmptyIconText(默认false,兼容之前的空白行为)。
    • 表格数据源为空时,显示效果:优先显示用户自定义的EmptyText文本,其次显示预定义图标+文案(ShowEmptyIconText=true),都不满足时显示空白。
    • [Core/Pro] PageManager与Web.config新增全局配置项GridShowEmptyIconText(默认false),一处开启即可让所有表格默认显示内置空状态。
    • 新增示例:表格/杂项/表格为空的提示(内置图标和文案)。
  • 修正表格锁定列在特定情况下出现的JS问题(一鸣 - https://t.zsxq.com/PA6dg)。
v15.0.0 #214
  • [Core/Pro] 新增泛域名服务器授权,兼容之前的IP+MAC授权方式(企业版)。
    • 生成的授权文件名类似:FineUICore.lic.dep.domain.fineui_com.config
  • 修复表格拖拽改变列宽度后,mouseup触发的click事件误触发列排序的问题(6976935)。
  • Button新增语义颜色:Success(绿色)、Danger(红色)、Warning(橙色)、Info(蓝色),不随主题变化。
  • 主题系统从SCSS预编译重构为CSS自定义属性(CSS Variables)。
    • 消除Sass编译依赖,不再需要sass等构建工具,并新增generate-theme.js构建脚本。
    • 每个主题由theme.config(颜色配置)+ theme-extra.css(可选特有样式)定义。
    • 自定义主题:在res/themes/下新建目录,复制已有theme.config修改颜色值,双击generate-theme.bat即可生成自定义主题。
  • 重构内部构建脚本。
    • 内部打包bat脚本改为npm脚本编排。
    • 使用esbuild统一替代terser(JS压缩混淆)和clean-css-cli(CSS压缩)。
    • FineUI.js组件层迁移到 ESM 模块化(不影响对外 API)。
    • ES2022 class extends 替代 John Resig Class.js(不影响对外 API)。
  • 为Notify新增DisplayProgress属性(bool?),用于关闭倒计时进度条显示(曹** - https://t.zsxq.com/ieFiS)。
    • 为Web.config和PageManager增加全局配置项(MessageBoxDisplayProgress=true)。
  • 修正表格在SummaryPosition=Top/Bottom模式下,数据为空时合计行虽隐藏但仍占据布局空间,导致Grid底部出现空白带的问题。
  • 表格数据为空且未设置EmptyText时,显示内置的「图标+文案」空状态。
  • 表格新增ResponsiveCardSize属性:屏幕宽度小于指定断点时表格自动切换为卡片模式。
    • [JS] 为表格新增属性responsiveCardSize,取值 sm(<768px)/md(<992px)/lg(<1200px);
    • [Core/Pro] 新增枚举属性 GridResponsiveCardSize(None/SM/MD/LG)。
    • 新增示例:布局/Block/响应式表格,并同步改造「响应式首页」中的表格示例。
  • 表格新增ShowPageSizeSelector属性(分页工具栏内置页大小下拉选择器)。
    • [JS] 新增属性showPageSizeSelector(默认false)、pageSizeOptions(默认[10,20,50,100])、pageSizeText(标签文字)、pageSizeChangeResetsPageIndex(默认true)。
    • [JS] 新增客户端事件pagesizechange/beforepagesizechange,签名(event, newPageSize, oldPageSize)。
    • [Core/Pro] 新增相应属性和事件。
    • 新增示例:表格/分页工具栏/页大小选择器(内存分页)、表格/分页工具栏/页大小选择器(数据库分页)。
  • 安全增加。
    • [Core/Pro] 修正当页面的内联脚本中包含</script>字符串时,页面脚本被浏览器提前截断、导致页面无法打开的问题(木南 - https://t.zsxq.com/6KiBx)。
    • 修正表格单元格提示会把单元格数据当作 HTML 处理、导致鼠标悬停时可能执行其中脚本的安全问题(默认启用列的HTML编码,也就是 EncodeText=true)。
    • 当禁用控件的HTML编码(EncodeText=false,涉及 Label、Tree、Menu、Toolbar、Button、表格单元格及提示等),自动移除其中的 <script> 标签作为安全防护。
    • 修正示例项目中展示用户提交/修改数据(如表格 ModifiedData、FilteredData 等)时未做 HTML 编码、直接输出到页面而存在 XSS 风险的问题。
      • 统一改为编码后输出(Pro/Core示例项目的基类新增 EncodeJson 方法、JS端 init.js 新增 encodeJson 方法)。

RELEASE ARCHIVE

历史版本