From 22638d2ca66dddae9f42a0029354b336240a4da5 Mon Sep 17 00:00:00 2001 From: daitingting Date: Wed, 23 Jul 2025 14:37:38 +0800 Subject: [PATCH 001/140] * [task#146862,done,2h] Compatible dm. --- module/metric/model.php | 12 +++++++++--- module/pivot/tao.php | 4 ++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/module/metric/model.php b/module/metric/model.php index e6ed316fa4..66463255b1 100755 --- a/module/metric/model.php +++ b/module/metric/model.php @@ -1538,7 +1538,9 @@ class metricModel extends model ->where('deleted')->eq(0) ->andWhere('shadow')->eq(0) ->andWhere('createdDate')->le($date) - ->andWhere("if(closedDate IS NOT NULL and YEAR(closedDate)!='0000', closedDate>='$date', true)") + ->andWhere("closedDate IS NOT NULL and YEAR(closedDate)!='0000'", true) + ->orWhere('closedDate')->ge($date) + ->markRight(1) ->andWhere("vision LIKE '%{$vision}%'", true) ->orWhere("vision IS NULL")->markRight(1) ->fetchPairs(); @@ -1548,7 +1550,9 @@ class metricModel extends model ->where('deleted')->eq(0) ->andWhere('type')->eq('project') ->andWhere('openedDate')->le($date) - ->andWhere("if(closedDate IS NOT NULL and YEAR(closedDate)!='0000', closedDate>='$date', true)") + ->andWhere("closedDate IS NOT NULL and YEAR(closedDate)!='0000'", true) + ->orWhere('closedDate')->ge($date) + ->markRight(1) ->andWhere("vision LIKE '%{$vision}%'", true) ->orWhere("vision IS NULL")->markRight(1) ->fetchPairs(); @@ -1558,7 +1562,9 @@ class metricModel extends model ->where('deleted')->eq(0) ->andWhere('type')->in('sprint,stage,kanban') ->andWhere('openedDate')->le($date) - ->andWhere("if(closedDate IS NOT NULL and YEAR(closedDate)!='0000', closedDate>='$date', true)") + ->andWhere("closedDate IS NOT NULL and YEAR(closedDate)!='0000'", true) + ->orWhere('closedDate')->ge($date) + ->markRight(1) ->andWhere("vision LIKE '%{$vision}%'", true) ->orWhere("vision IS NULL")->markRight(1) ->fetchPairs(); diff --git a/module/pivot/tao.php b/module/pivot/tao.php index 5173385469..5b10b79036 100644 --- a/module/pivot/tao.php +++ b/module/pivot/tao.php @@ -308,8 +308,8 @@ class pivotTao extends pivotModel { return $this->dao->select(<< Date: Fri, 25 Jul 2025 03:00:26 +0000 Subject: [PATCH 002/140] * [bug#64118,done,1h] skip doc diff permission check. --- lib/zin/wg/docapp/js/v1.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/zin/wg/docapp/js/v1.js b/lib/zin/wg/docapp/js/v1.js index dd5e1e9b07..858e2d7747 100644 --- a/lib/zin/wg/docapp/js/v1.js +++ b/lib/zin/wg/docapp/js/v1.js @@ -1787,7 +1787,7 @@ const customRenders = const versions = diffVersions ? diffVersions.value : []; if (versions.length === 2) { return { - fetcher: $.createLink('doc', 'diff', `&objectType=${spaceType.value}&docID=${doc.id}&newVersion=${versions[0]}&oldVersion=${versions[1]}`), + fetcher: $.createLink('doc', 'ajaxDiff', `&objectType=${spaceType.value}&docID=${doc.id}&newVersion=${versions[0]}&oldVersion=${versions[1]}`), }; } } From 32dbb0d78ddb6acb08f8cfa584888d96ab8858f7 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 29 Jul 2025 10:41:59 +0800 Subject: [PATCH 003/140] * [refac bug #64366] Delete preview link for file in open edition. --- lib/zin/wg/docapp/js/v1.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/zin/wg/docapp/js/v1.js b/lib/zin/wg/docapp/js/v1.js index 46c48ac0b1..028e0f5bcf 100644 --- a/lib/zin/wg/docapp/js/v1.js +++ b/lib/zin/wg/docapp/js/v1.js @@ -1216,7 +1216,7 @@ const actionsMap = const hasExtension = file.title.lastIndexOf('.' + file.extension) == (file.title.length - file.extension.length - 1); const canPreview = hasExtension && 'mp4,txt,jpg,jpeg,gif,png,bmp'.split(',').includes(file.extension); return [ - canPreview ? {'data-toggle': 'modal', 'data-size': 'lg', url: $.createLink('file', 'download', `fileID=${file.id}&mouse=left`), hint: lang.filePreview, icon: 'eye'} : {target: '_blank', url: $.createLink('file', 'download', `fileID=${file.id}&mouse=left`), hint: lang.filePreview, icon: 'eye'}, + canPreview ? {'data-toggle': 'modal', 'data-size': 'lg', url: $.createLink('file', 'download', `fileID=${file.id}&mouse=left`), hint: lang.filePreview, icon: 'eye'} : null, {target: '_blank', url: zui.formatString(docApp.props.fileUrl, file), hint: lang.fileDownload, icon: 'download'}, canEdit ? {hint: lang.fileRename, icon: 'pencil-alt', onClick: renameDocFile.bind(this, file, doc)} : null, canDelete ? {hint: lang.fileDelete, icon: 'trash', onClick: deleteDocFile.bind(this, file, doc)} : null, From 5b0db8ed5f9a90fca970bc7e8aaf6823bc247bcd Mon Sep 17 00:00:00 2001 From: wangzemei Date: Tue, 29 Jul 2025 13:13:21 +0800 Subject: [PATCH 004/140] * [bug#64380] remove statistics on closed tasks. --- module/metric/calc/task/scale/count_of_assigned_task.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/module/metric/calc/task/scale/count_of_assigned_task.php b/module/metric/calc/task/scale/count_of_assigned_task.php index df822d0e17..386b9e7faa 100644 --- a/module/metric/calc/task/scale/count_of_assigned_task.php +++ b/module/metric/calc/task/scale/count_of_assigned_task.php @@ -31,6 +31,8 @@ class count_of_assigned_task extends baseCalc $assignedTo = $row->assignedTo; $mode = $row->mode; + if($row->status == 'closed') return false; + if($mode == 'multi') $assignedTo = $row->account; if(!isset($this->result[$assignedTo])) $this->result[$assignedTo] = array(); $this->result[$assignedTo][$row->id] = $row->id; From 9c9d9d68ab7121264e39866e03e9bb8f277fb3a8 Mon Sep 17 00:00:00 2001 From: liyang Date: Tue, 29 Jul 2025 14:17:37 +0800 Subject: [PATCH 005/140] * [task#147120] add bind user menu config. --- module/repo/config.php | 2 ++ module/repo/model.php | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/module/repo/config.php b/module/repo/config.php index 1b6be8c333..b0f0c00ca3 100644 --- a/module/repo/config.php +++ b/module/repo/config.php @@ -2,6 +2,8 @@ global $lang, $app; $app->loadLang('repo'); +$config->repo->notSetMenuVars = array('maintain', 'create', 'createrepo', 'edit', 'import'); + $config->program = new stdclass(); $config->program->suffix['c'] = "cpp"; $config->program->suffix['cpp'] = "cpp"; diff --git a/module/repo/model.php b/module/repo/model.php index e37d17658b..9fdb9474ac 100644 --- a/module/repo/model.php +++ b/module/repo/model.php @@ -78,7 +78,7 @@ class repoModel extends model } } - if(!in_array($this->app->methodName, array('maintain', 'create', 'createrepo', 'edit','import'))) common::setMenuVars('devops', $repoID); + if(!in_array($this->app->methodName, $this->config->repo->notSetMenuVars)) common::setMenuVars('devops', $repoID); if(!session_id()) session_start(); $this->session->set('repoID', $repoID); session_write_close(); From ec8d90c912fc7e14b3161efa2adf741970ed7acd Mon Sep 17 00:00:00 2001 From: liyang Date: Tue, 29 Jul 2025 14:21:00 +0800 Subject: [PATCH 006/140] * [task#147120] add bind user menu config. --- module/repo/test/model/setmenu.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/module/repo/test/model/setmenu.php b/module/repo/test/model/setmenu.php index d8de8d4b8d..d68ad7dda5 100755 --- a/module/repo/test/model/setmenu.php +++ b/module/repo/test/model/setmenu.php @@ -11,6 +11,8 @@ timeout=0 cid=1 - 正常设置版本库id @2 +- 正常设置版本库id @3 +- 正常设置版本库id @4 - 设置不存在版本库id @1 - 无权限用户设置版本库id @0 @@ -29,6 +31,8 @@ $repo = new repoTest(); $repoID = 2; r($repo->setMenuTest($repoID)) && p() && e('2'); //正常设置版本库id +r($repo->setMenuTest(3)) && p() && e('3'); //正常设置版本库id +r($repo->setMenuTest(4)) && p() && e('4'); //正常设置版本库id r($repo->setMenuTest(10001)) && p() && e('1'); //设置不存在版本库id su('user19'); From 5146441ba8759bc7d58fe4f558234474d0abed59 Mon Sep 17 00:00:00 2001 From: daitingting Date: Tue, 29 Jul 2025 14:39:09 +0800 Subject: [PATCH 007/140] * [unittest] Add getPairsByScopeAndDate test. --- .../metric/test/lib/calc.unittest.class.php | 13 +++++ .../test/model/getpairsbyscopeanddate.php | 47 +++++++++++++++++++ module/metric/test/yaml/product.yaml | 8 ++++ module/metric/test/yaml/project.yaml | 6 ++- 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100755 module/metric/test/model/getpairsbyscopeanddate.php diff --git a/module/metric/test/lib/calc.unittest.class.php b/module/metric/test/lib/calc.unittest.class.php index 8c6e46f2c4..0295ecbb6b 100755 --- a/module/metric/test/lib/calc.unittest.class.php +++ b/module/metric/test/lib/calc.unittest.class.php @@ -134,6 +134,19 @@ class metricTest return $this->objectModel->getPairsByScope($scope); } + /** + * Test getPairsByScopeAndDate method. + * + * @param string $scope + * @param string $date + * @access public + * @return array|false + */ + public function getPairsByScopeAndDate($scope, $date) + { + return $this->objectModel->getPairsByScopeAndDate($scope, $date); + } + /** * Test getControlOptions method. * diff --git a/module/metric/test/model/getpairsbyscopeanddate.php b/module/metric/test/model/getpairsbyscopeanddate.php new file mode 100755 index 0000000000..f1c09ea2e8 --- /dev/null +++ b/module/metric/test/model/getpairsbyscopeanddate.php @@ -0,0 +1,47 @@ +#!/usr/bin/env php +loadYaml('user', true)->gen(30); +zenData('product')->loadYaml('product', true)->gen(10); +zenData('project')->loadYaml('project', true)->gen(40); + +$date = '2025-01-01'; + +r(count($metric->getPairsByScopeAndDate('user', $date))) && p('') && e('15'); // 测试user对象数 +r(count($metric->getPairsByScopeAndDate('product', $date))) && p('') && e('5'); // 测试product对象数 +r(count($metric->getPairsByScopeAndDate('project', $date))) && p('') && e('20'); // 测试project对象数 + +r($metric->getPairsByScopeAndDate('user', $date)) && p('admin,user2,user4,user8') && e('admin,用户2,用户4,用户8'); // 测试部分user对象 +r($metric->getPairsByScopeAndDate('product', $date)) && p('1,3,5') && e('正常产品1,正常产品3,正常产品5'); // 测试部分product对象 +r($metric->getPairsByScopeAndDate('project', $date)) && p('11,13,15') && e('项目11,项目13,项目15'); // 测试部分project对象 diff --git a/module/metric/test/yaml/product.yaml b/module/metric/test/yaml/product.yaml index 91136937a6..9b52e8b0aa 100644 --- a/module/metric/test/yaml/product.yaml +++ b/module/metric/test/yaml/product.yaml @@ -9,5 +9,13 @@ fields: range: 0{1},1{1} - field: vision range: rnd +- field: createdDate + range: "20110101 000000-20210101 000000:1Y" + type: timestamp + format: YYYY-MM-DD +- field: closedDate + range: "20110201 000000-20210201 000000:1Y" + type: timestamp + format: YYYY-MM-DD ... diff --git a/module/metric/test/yaml/project.yaml b/module/metric/test/yaml/project.yaml index 22c1c8bdc6..ed5f60dfba 100644 --- a/module/metric/test/yaml/project.yaml +++ b/module/metric/test/yaml/project.yaml @@ -11,8 +11,12 @@ fields: range: closed{2},doing{2},suspended{2},wait{2} - field: deleted range: 0{1},1{1} -- field: closedDate +- field: openedDate range: "20110101 000000-20210101 000000:10D" type: timestamp format: YYYY-MM-DD +- field: closedDate + range: "20110201 000000-20210201 000000:10D" + type: timestamp + format: YYYY-MM-DD ... From 26afc6df1e05e7a568f1ee36640ba12a72cf9cc4 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 29 Jul 2025 15:33:20 +0800 Subject: [PATCH 008/140] * [upgrade] Add CHANGELOG. --- doc/CHANGELOG | 203 +++++++++++++++++++++++++++++++- module/misc/lang/de.php | 2 +- module/misc/lang/en.php | 2 +- module/misc/lang/fr.php | 2 +- module/misc/lang/zh-cn.php | 2 +- module/upgrade/lang/version.php | 2 +- 6 files changed, 207 insertions(+), 6 deletions(-) diff --git a/doc/CHANGELOG b/doc/CHANGELOG index b6c72f3a87..3d684fff92 100644 --- a/doc/CHANGELOG +++ b/doc/CHANGELOG @@ -1,6 +1,207 @@ -2025-06-13 21.7.4 +2025-07-29 21.7.4 完成的需求 +企业版: +76383 执行Bug列表的统计权限 +76382 执行用例列表的统计权限 +76380 项目用例列表的统计权限 +76379 项目Bug列表的统计权限 +76378 项目执行列表的统计权限 +76140 实现用例列表的基本统计 +76139 实现Bug列表的进度分析 +76138 实现Bug列表的基本统计 +76137 实现需求列表的进度分析 +76136 实现需求列表的基本统计 +76135 实现迭代列表的资源分析 +76134 实现迭代列表的进度分析 +76133 实现迭代列表的任务统计 +76132 增加“按执行统计的执行关闭时开发任务完成率”度量项 +76130 实现“已关闭迭代汇总表”透视表 +76129 实现“进行中迭代汇总表”透视表 +76128 实现“迭代状态分布”柱状图 +76127 实现“迭代延期率”水球图 +76126 实现“迭代关闭率”水球图 +76125 实现“延期的迭代数”指标卡片 +76124 实现“已关闭迭代数”的指标卡片 +76123 实现项目列表顶部筛选条件的展示和导出功能 +76122 实现项目列表统计分析内容查看的选择列表 +76073 实现“进行中迭代数”的指标卡 +76072 在迭代列表打印统计分析的按钮 +76069 实现“迭代数”的指标卡片 +75895 项目编辑时,允许编辑项目流程 +75894 产品编辑时,允许编辑产品流程 +75342 任务列表的统计中后台更改键值配置项前台正常显示的范围 +75340 执行用例列表增加一个统计的入口 +75339 执行Bug列表增加一个统计的入口 +75303 实现用例列表顶部筛选条件的展示和导出功能 +75302 实现用例列表统计分析内容查看的选择列表 +75299 实现用例状态、优先级、结果、类型分布 +75298 实现用例来源产品模块分布 +75297 实现按团队成员统计的执行用例次数条形图 +75296 实现按团队成员统计的创建用例数条形图 +75295 实现需求用例密度指标卡片 +75294 实现需求用例覆盖率指标卡片 +75293 实现有用例的需求数指标卡片 +75292 实现用例数指标卡片 +75291 实现需求数指标卡片 +75288 实现按团队成员统计的解决Bug数 +75287 实现按团队成员统计的创建Bug数 +75286 实现每日新增、解决、关闭Bug数的折线图 +75285 实现激活Bug数指标卡片 +75284 实现已修复Bug数指标卡片 +75283 实现Bug总数的指标卡片 +75281 实现Bug列表顶部筛选条件的展示和导出功能 +75280 实现Bug列表统计分析内容查看的选择列表 +75279 实现“Bug严重程度、优先级、解决方案、类型”的四个饼图 +75278 实现Bug所在不同产品和模块的饼图 +75277 实现Bug状态分布柱状图 +75276 实现用例产生的Bug占比水球图 +75275 实现Bug修复率水球图 +75274 实现Bug有效率水球图 +75273 实现执行用例产生的Bug数指标卡片 +75272 实现已修复Bug数指标卡片 +75271 实现有效Bug数的指标卡片 +75270 实现研发完毕的需求的缺陷密度指标卡片 +75269 实现研发完毕的需求数的指标卡片 +75268 实现Bug总数的指标卡片 +75266 实现需求列表顶部筛选条件的展示和导出功能 +75265 实现需求所在不同产品和模块的饼图 +74913 实现统计内容的导出功能 +74803 实现“需求阶段分布”的柱状图 +74800 实现按条目/规模统计的需求完成率 +74799 实现按条目/规模统计的需求测试完毕率 +74798 实现按条目/规模统计的需求研发完毕率水球图 +74797 实现测试完成需求数和规模数的指标卡片 +74796 实现研发完成需求数和规模数的指标卡片 +74795 实现已完成需求数和规模数的指标卡片 +74794 实现需求数和规模数的指标卡片 +74790 实现“需求来源、优先级、所属类型、由谁创建”的四个饼图 +74788 实现“需求阶段分布”的柱状图 +74641 实现“需求状态分布”的柱状图 +74640 实现发生变更的需求数和规模数的指标卡片 +74639 实现已关闭需求数和规模数的指标卡片 +74638 实现已完成需求数和规模数的指标卡片 +74637 实现测试完成需求数和规模数的指标卡片 +74636 实现研发完成需求数和规模数的指标卡片 +74635 实现需求数和规模数的指标卡片 +74633 实现需求列表统计分析内容查看的选择列表 +74620 度量项支持动态数据列表 +74519 大屏透视表支持动态列表数据 +74518 大屏图表支持动态列表数据 +73487 实现“任务完成汇总表”透视表 +73486 实现“任务指派汇总表”透视表 +73485 实现“按团队成员统计的工时投入”透视表 +73484 实现“按团队成员统计的任务消耗工时”条形图 +73483 实现“Bug转任务的数量占比”水球图 +73482 实现“Bug转任务的消耗工时”指标卡片 +73481 实现“Bug转任务的数量”指标卡片 +73480 实现“已消耗工时数”指标卡片 +73479 实现“任务数”指标卡片 +73286 项目导出数据页面支持设置模板功能 +73250 实现“剩余工时数”指标卡片 +72893 实现“每日完成任务数量统计图”的柱状图 +72847 实现“不同类型任务的状态分布表”的表格 +72846 实现“不同类型任务的进度统计表”的透视表 +旗舰版: +76312 里程碑报告缺陷注入阶段逻辑修改 +76277 bug列表自定义列和搜索增加发现环节和注入环节 +76276 bug详情页面增加发现环节和注入环节 修复的Bug +开源版: +57750 安装禅道后,访问后台有报错 +57758 安装php8.1源码包,使用php8.2-fpm,开启debug后,登录页报错,无法登录 +61216 新增用例的相关需求下拉框无法搜索到列表展示外的需求 (Feedback#8272) +62040 文档中操作按钮点击没有反应 +62511 修改工时备注导致工时计算异常 (Feedback#9291) +62878 看板执行中创建多个任务类型泳道,任务只能在第一个默认的泳道中 +63326 用例库中的用例切换版本查看时标题不能显示对应版本的标题 +63802 用户的产品和项目访问权限丢失 (Feedback#9695) +64066 添加项目集白名单会删除掉原白名单数据 +64072 关闭的需求激活后无法变更 (Feedback#9697) +64094 完成后的多人任务批量指派不生效 (Feedback#9729) +64098 产品归属于空项目集时,批量编辑产品,系统会清空已有产品线属性。 (Feedback#9763) +64165 项目下建用例查看需求详情弹窗中,点击导入需求库无反应 +64192 内禅新建文档保存后内容丢失 +64263 批量提Bug页面中填写影响版本为主干保存时提示影响版本不能为空 +64275 看板执行中创建多个任务类型泳道,任务无法拖动到其他泳道中 +64289 子阶段的团队成员没有同步到父阶段 +64310 编辑任务工时显示多位小数 +64313 批量建/编辑用例页面相关研发需求列出了草稿状态的需求 +64318 待处理下批量编辑用例相关研发需求下拉列出的需求不对 +64319 贡献下批量编辑任务/用例页面跳转错误 +64327 批量激活Bug有报错 +64348 编辑用例页面相关研发需求无关联数据时显示0 +64358 下一个需求会跳过父子需求 +64359 计划关联需求页面,点击返回到计划列表页 +64362 导入用例,优先级显示为false +64364 零用例需求批量修改阶段与列表里的不一致 +64365 文档详情显示的用户头像与面板显示的不一致 +64366 导入创建的文档,附件的预览和下载都是下载 +64376 执行测试单关联的非执行下创建且没有关联执行需求的用例后项目用例列表未显示该用例 +企业版: +57771 导出的文档中显示多余空行 +63552 立项审批的条件中,类型获取不到数据 +63895 添加自定义工作流数据后点击动态中名称,提示App not found +63995 按执行统计的执行关闭时已完成的开发任务数不对 +64118 普通用户无法对比文档 +64248 用例报表中需求用例覆盖率计算时没有过滤父研发需求 +64250 项目阶段基本统计报表中进行中阶段汇总表中父阶段已消耗工时和阶段进度未正确显示 +64251 Bug每日新增、解决、关闭Bug数的折线图中数据统计不正确 +64252 项目/执行下发生变更的需求数和规模数统计了项目/执行开始之前的数据 +64253 项目阶段基本统计报表已关闭阶段汇总表无数据时导出的word中显示空表头 +64254 项目Bug报表中激活Bug数统计不正确 +64259 任务列表中点击产品,报表筛选条件缺少中文语言项 +64264 测试完成需求数和规模数没有统计关闭原因为已完成的研发需求数据 +64266 执行用例报表基本统计导出的word中图表标题错误 +64267 测试完成需求数和规模数统计了阶段为验收失败的研发需求数据 +64272 执行用例基本统计下柱状图上下没有间距 +64273 执行下添加团队成员后按团队成员统计的创建/执行用例数柱状图中展示错误 +64274 无产品无迭代项目下用例基本统计中无用例数据但执行用例次数柱状图中显示了数据 +64278 执行用例基本统计用例状态、优先级、结果、类型分布中用例数显示的百分比 +64280 任务报表中统计了已取消任务的剩余工时 +64281 研发完毕需求规模数指标卡片统计了父需求的规模 +64283 创建看板项目显示了项目流程字段 +64284 发生变更的需求数没有统计父需求 +64287 任务指派给分布图中没有统计已取消的任务 +64288 无迭代项目的任务报表统计范围不正确 +64294 项目Bug按照团队成员统计的创建Bug数统计不正确 +64296 项目Bug按照团队成员统计的解决Bug数统计不正确 +64298 任务指派汇总表没有统计未开始的多人并行任务 +64305 无迭代项目需求报表,基本统计中提示文案为执行 +64306 全部标签下进入报表,不显示列表筛选条件 +64308 按团队成员统计的任务消耗工时数条形图没有保留两位小数 +64309 报表导出弹窗右侧空白区域比较多 +64311 项目迭代进度分析中,任务进度与系统的不一致 +64322 文档对比后有报错 +64325 [不同类型任务的进度统计表]中进度百分比不正确 +64326 项目下Bug进度分析页面导出时有报错 +64328 任务指派汇总表没有统计未开始的多人并行任务 +64330 按规模统计的需求测试完成率不正确 +64331 项目下用例报表中需求用例覆盖率计算时没有过滤掉用户需求 +64333 统计需求的测试完毕率没有统计上阶段是验收失败的需求 +64335 执行关联两个产品时统计的需求研发完成数错误 +64336 项目下迭代报表返回链接不对 +64341 创建瀑布项目关联多个产品,阶段类型无默认值 +64343 瀑布项目需求阶段下报表没有统计用户需求数据 +64349 用例步骤的附件显示不完整 (Feedback#9839) +64373 需求变更条目数提示文案需修改 +64380 任务指派给是否统计已关闭的任务逻辑没有统一 +旗舰版: +59530 更新任务日志后任务的最后修改日期字段值没有更新 (Feedback#8298) +63654 由模板创建的文档中禅道数据区块中有些字段显示英文不显示中文语言项 +63665 文档模板升级后报错 +64097 工作流添加的模块,审批回退后审批人不能再评审 (Feedback#9747) +64099 项目评审可绑定的审批流if条件可选项无法支持全部项目字段 (Feedback#9541) +64102 两个用户同时进行审批时审批结果不准确 (Feedback#9728) +64203 流程模板中配置执行列表的字段,未在项目内的执行列表展示,反而在一级导航执行列表中展示了 +64245 提Bug页面报错 +64247 任务关联研发需求变更后,任务确认需求变更后刷新页面,增加异常历史记录数据 (Feedback#9904) +64374 升级到max7.3有sql报错 +IPD版: +64096 融合敏捷、融合瀑布项目的仪表盘处,添加“项目问题”时不能选择长区块 (Feedback#9743) +64100 项目阶段设置页面评审点选择不了 (Feedback#9819) +64271 创建IPD项目后关闭提示弹窗报错 +64301 从项目模板创建的项目,权限分配异常 (Feedback#9880) +64332 IPD项目前一个阶段未关闭,下一个阶段下的多人任务可以开始 2025-07-03 21.7.3 完成的需求 diff --git a/module/misc/lang/de.php b/module/misc/lang/de.php index 0b5acb0f2b..279f5098ae 100644 --- a/module/misc/lang/de.php +++ b/module/misc/lang/de.php @@ -114,7 +114,7 @@ $lang->misc->feature->promptExecImage = 'theme/default/images/main/prompt_exec $lang->misc->feature->promptLearnMore = 'https://www.zentao.net/book/zentaopms/1097.html'; /* Release Date. */ -$lang->misc->releaseDate['21.7.4'] = '2025-06-13'; +$lang->misc->releaseDate['21.7.4'] = '2025-07-29'; $lang->misc->releaseDate['21.7.3'] = '2025-07-03'; $lang->misc->releaseDate['21.7.2'] = '2025-06-27'; $lang->misc->releaseDate['21.7.1'] = '2025-05-30'; diff --git a/module/misc/lang/en.php b/module/misc/lang/en.php index 879367909a..ee9d5ea42b 100644 --- a/module/misc/lang/en.php +++ b/module/misc/lang/en.php @@ -115,7 +115,7 @@ $lang->misc->feature->promptExecImage = 'theme/default/images/main/prompt_exec $lang->misc->feature->promptLearnMore = 'https://www.zentao.net/book/zentaopms/1097.html'; /* Release Date. */ -$lang->misc->releaseDate['21.7.4'] = '2025-06-13'; +$lang->misc->releaseDate['21.7.4'] = '2025-07-29'; $lang->misc->releaseDate['21.7.3'] = '2025-07-03'; $lang->misc->releaseDate['21.7.2'] = '2025-06-27'; $lang->misc->releaseDate['21.7.1'] = '2025-05-30'; diff --git a/module/misc/lang/fr.php b/module/misc/lang/fr.php index 09d126f0ff..1e940a0492 100644 --- a/module/misc/lang/fr.php +++ b/module/misc/lang/fr.php @@ -114,7 +114,7 @@ $lang->misc->feature->promptExecImage = 'theme/default/images/main/prompt_exec $lang->misc->feature->promptLearnMore = 'https://www.zentao.net/book/zentaopms/1097.html'; /* Release Date. */ -$lang->misc->releaseDate['21.7.4'] = '2025-06-13'; +$lang->misc->releaseDate['21.7.4'] = '2025-07-29'; $lang->misc->releaseDate['21.7.3'] = '2025-07-03'; $lang->misc->releaseDate['21.7.2'] = '2025-06-27'; $lang->misc->releaseDate['21.7.1'] = '2025-05-30'; diff --git a/module/misc/lang/zh-cn.php b/module/misc/lang/zh-cn.php index 3988dffa4e..de3189eafc 100644 --- a/module/misc/lang/zh-cn.php +++ b/module/misc/lang/zh-cn.php @@ -115,7 +115,7 @@ $lang->misc->feature->promptExecImage = 'theme/default/images/main/prompt_exec $lang->misc->feature->promptLearnMore = 'https://www.zentao.net/book/zentaopms/1097.html'; /* Release Date. */ -$lang->misc->releaseDate['21.7.4'] = '2025-06-13'; +$lang->misc->releaseDate['21.7.4'] = '2025-07-29'; $lang->misc->releaseDate['21.7.3'] = '2025-07-03'; $lang->misc->releaseDate['21.7.2'] = '2025-06-27'; $lang->misc->releaseDate['21.7.1'] = '2025-05-30'; diff --git a/module/upgrade/lang/version.php b/module/upgrade/lang/version.php index 2a47b7cc4c..f67fbc0684 100644 --- a/module/upgrade/lang/version.php +++ b/module/upgrade/lang/version.php @@ -216,7 +216,7 @@ $lang->upgrade->fromVersions['21_7'] = '21.7'; $lang->upgrade->fromVersions['21_7_1'] = '21.7.1'; $lang->upgrade->fromVersions['21_7_2'] = '21.7.2'; $lang->upgrade->fromVersions['21_7_3'] = '21.7.3'; -$lang->upgrade->fromVersions['21_7_4'] = '21.7.4'; // pms insert position. +$lang->upgrade->fromVersions['21_7_4'] = '21.7.4'; // pms insert position. global $config; /* Lite. */ From 3436438f0e233b621c76ed49e733cb64884ac1e1 Mon Sep 17 00:00:00 2001 From: sunguangming Date: Tue, 29 Jul 2025 08:43:24 +0000 Subject: [PATCH 009/140] * [misc] modify users to quick. --- module/doc/control.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/doc/control.php b/module/doc/control.php index 13798a9390..8974003aac 100755 --- a/module/doc/control.php +++ b/module/doc/control.php @@ -2284,7 +2284,7 @@ class doc extends control $this->view->orderBy = $orderBy; $this->view->recPerPage = $recPerPage; $this->view->pageID = $pageID; - $this->view->users = $this->loadModel('user')->getPairs('noclosed,noletter'); + $this->view->users = $this->dao->select('account,realname,avatar')->from(TABLE_USER)->where('deleted')->eq('0')->fetchAll('account'); $this->view->title = $this->lang->doc->quick; $this->display(); } From 2591c5730079dfc8dc06996dbec7aae86a3574b3 Mon Sep 17 00:00:00 2001 From: sunhao Date: Tue, 29 Jul 2025 16:43:39 +0800 Subject: [PATCH 010/140] * [misc] update zui3 lib. --- www/js/zui3/zui.zentao.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/www/js/zui3/zui.zentao.js b/www/js/zui3/zui.zentao.js index e70a9bbebf..8157e3b735 100644 --- a/www/js/zui3/zui.zentao.js +++ b/www/js/zui3/zui.zentao.js @@ -1,14 +1,14 @@ var cd=(N,lt,Ft)=>{if(!lt.has(N))throw TypeError("Cannot "+Ft)};var Ot=(N,lt,Ft)=>(cd(N,lt,"read from private field"),Ft?Ft.call(N):lt.get(N)),Xt=(N,lt,Ft)=>{if(lt.has(N))throw TypeError("Cannot add the same private member more than once");lt instanceof WeakSet?lt.add(N):lt.set(N,Ft)},sn=(N,lt,Ft,Nl)=>(cd(N,lt,"write to private field"),Nl?Nl.call(N,Ft):lt.set(N,Ft),Ft);var hd=(N,lt,Ft)=>(cd(N,lt,"access private method"),Ft);(function(N,lt){typeof exports=="object"&&typeof module<"u"?lt(exports):typeof define=="function"&&define.amd?define(["exports"],lt):(N=typeof globalThis<"u"?globalThis:N||self,lt(N.zui={}))})(this,function(N){var el,tl,Fr,jr,Br,Hr,Ur,Wr,nl,Ry,sl,zy,fs,ps,Zg;"use strict";const lt="",Ft="",Nl="",nk="",sk="",ik="",rk="",ok="",ak="",lk="",ck="",hk="",El="3.0.0",Hy="production",md="f4d934835b340823247641e27081e1f0ef2177c8",En=document,io=window,gd=En.documentElement,Cs=En.createElement.bind(En),yd=Cs("div"),Ml=Cs("table"),Uy=Cs("tbody"),vd=Cs("tr"),{isArray:ro,prototype:bd}=Array,{concat:Wy,filter:Al,indexOf:_d,map:wd,push:Vy,slice:Cd,some:Pl,splice:Ky}=bd,qy=/^#(?:[\w-]|\\.|[^\x00-\xa0])*$/,Gy=/^\.(?:[\w-]|\\.|[^\x00-\xa0])*$/,Yy=/<.+>/,Zy=/^\w+$/;function Ll(s,e){const t=Xy(e);return!s||!t&&!ks(e)&&!ut(e)?[]:!t&&Gy.test(s)?e.getElementsByClassName(s.slice(1).replace(/\\/g,"")):!t&&Zy.test(s)?e.getElementsByTagName(s):e.querySelectorAll(s)}class oo{constructor(e,t){if(!e)return;if(Rl(e))return e;let n=e;if(It(e)){const i=t||En;if(n=qy.test(e)&&ks(i)?i.getElementById(e.slice(1).replace(/\\/g,"")):Yy.test(e)?$d(e):Rl(i)?i.find(e):It(i)?y(i).find(e):Ll(e,i),!n)return}else if(Ss(e))return this.ready(e);(n.nodeType||n===io)&&(n=[n]),this.length=n.length;for(let i=0,r=this.length;i{for(;e.firstChild;)e.removeChild(e.firstChild)})};function ao(...s){const e=Qy(s[0])?s.shift():!1,t=s.shift(),n=s.length;if(!t)return{};if(!n)return ao(e,y,t);for(let i=0;i{ut(r)&&bt(t,(o,a)=>{n?e?r.classList.add(a):r.classList.remove(a):r.classList.toggle(a)})})},ae.addClass=function(s){return this.toggleClass(s,!0)},ae.removeAttr=function(s){const e=lo(s);return this.each((t,n)=>{ut(n)&&bt(e,(i,r)=>{n.removeAttribute(r)})})};function tv(s,e){if(s){if(It(s)){if(arguments.length<2){if(!this[0]||!ut(this[0]))return;const t=this[0].getAttribute(s);return Ui(t)?void 0:t}return jt(e)?this:Ui(e)?this.removeAttr(s):this.each((t,n)=>{ut(n)&&n.setAttribute(s,e)})}for(const t in s)this.attr(t,s[t]);return this}}ae.attr=tv,ae.removeClass=function(s){return arguments.length?this.toggleClass(s,!1):this.attr("class","")},ae.hasClass=function(s){return!!s&&Pl.call(this,e=>ut(e)&&e.classList.contains(s))},ae.get=function(s){return jt(s)?Cd.call(this):(s=Number(s),this[s<0?s+this.length:s])},ae.eq=function(s){return y(this.get(s))},ae.first=function(){return this.eq(0)},ae.last=function(){return this.eq(-1)};function nv(s){return jt(s)?this.get().map(e=>ut(e)||Jy(e)?e.textContent:"").join(""):this.each((e,t)=>{ut(t)&&(t.textContent=s)})}ae.text=nv;function Mn(s,e,t){if(!ut(s))return;const n=io.getComputedStyle(s,null);return t?n.getPropertyValue(e)||void 0:n[e]||s.style[e]}function gn(s,e){return parseInt(Mn(s,e),10)||0}function Sd(s,e){return gn(s,`border${e?"Left":"Top"}Width`)+gn(s,`padding${e?"Left":"Top"}`)+gn(s,`padding${e?"Right":"Bottom"}`)+gn(s,`border${e?"Right":"Bottom"}Width`)}const Ol={};function sv(s){if(Ol[s])return Ol[s];const e=Cs(s);En.body.insertBefore(e,null);const t=Mn(e,"display");return En.body.removeChild(e),Ol[s]=t!=="none"?t:"block"}function xd(s){return Mn(s,"display")==="none"}function Dd(s,e){const t=s&&(s.matches||s.webkitMatchesSelector||s.msMatchesSelector);return!!t&&!!e&&t.call(s,e)}function co(s){return It(s)?(e,t)=>Dd(t,s):Ss(s)?s:Rl(s)?(e,t)=>s.is(t):s?(e,t)=>t===s:()=>!1}ae.filter=function(s){const e=co(s);return y(Al.call(this,(t,n)=>e.call(t,n,t)))};function Kn(s,e){return e?s.filter(e):s}ae.detach=function(s){return Kn(this,s).each((e,t)=>{t.parentNode&&t.parentNode.removeChild(t)}),this};const iv=/^\s*<(\w+)[^>]*>/,rv=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,Td={"*":yd,tr:Uy,td:vd,th:vd,thead:Ml,tbody:Ml,tfoot:Ml};function $d(s){if(!It(s))return[];if(rv.test(s))return[Cs(RegExp.$1)];const e=iv.test(s)&&RegExp.$1,t=Td[e]||Td["*"];return t.innerHTML=s,y(t.childNodes).detach().get()}y.parseHTML=$d,ae.has=function(s){const e=It(s)?(t,n)=>Ll(s,n).length:(t,n)=>n.contains(s);return this.filter(e)},ae.not=function(s){const e=co(s);return this.filter((t,n)=>(!It(s)||ut(n))&&!e.call(n,t,n))};function An(s,e,t,n){const i=[],r=Ss(e),o=n&&co(n);for(let a=0,l=s.length;ae.selected&&!e.disabled&&!e.parentNode.disabled),"value"):s.value||""}function ov(s){return arguments.length?this.each((e,t)=>{const n=t.multiple&&t.options;if(n||jd.test(t.type)){const i=ro(s)?wd.call(s,String):Ui(s)?[]:[String(s)];n?bt(t.options,(r,o)=>{o.selected=i.indexOf(o.value)>=0},!0):t.checked=i.indexOf(t.value)>=0}else t.value=jt(s)||Ui(s)?"":s}):this[0]&&Id(this[0])}ae.val=ov,ae.is=function(s){const e=co(s);return Pl.call(this,(t,n)=>e.call(t,n,t))},y.guid=1;function yn(s){return s.length>1?Al.call(s,(e,t,n)=>_d.call(n,e)===t):s}y.unique=yn,ae.add=function(s,e){return y(yn(this.get().concat(y(s,e).get())))},ae.children=function(s){return Kn(y(yn(An(this,e=>e.children))),s)},ae.parent=function(s){return Kn(y(yn(An(this,"parentNode"))),s)},ae.index=function(s){const e=s?y(s)[0]:this[0],t=s?this:y(e).parent().children();return _d.call(t,e)},ae.closest=function(s){const e=this.filter(s);if(e.length)return e;const t=this.parent();return t.length?t.closest(s):e},ae.siblings=function(s){return Kn(y(yn(An(this,e=>y(e).parent().children().not(e)))),s)},ae.find=function(s){return y(yn(An(this,e=>Ll(s,e))))};const av=/^\s*\s*$/g,lv=/^$|^module$|\/(java|ecma)script/i,cv=["type","src","nonce","noModule"];function hv(s,e){const t=y(s);t.filter("script").add(t.find("script")).each((n,i)=>{if(lv.test(i.type)&&gd.contains(i)){const r=Cs("script");r.text=i.textContent.replace(av,""),bt(cv,(o,a)=>{i[a]&&(r[a]=i[a])}),e.head.insertBefore(r,null),e.head.removeChild(r)}})}function uv(s,e,t,n,i){n?s.insertBefore(e,t?s.firstChild:null):s.nodeName==="HTML"?s.parentNode.replaceChild(e,s):s.parentNode.insertBefore(e,t?s:s.nextSibling),i&&hv(e,s.ownerDocument)}function qn(s,e,t,n,i,r,o,a){return bt(s,(l,c)=>{bt(y(c),(h,u)=>{bt(y(e),(p,m)=>{const b=t?u:m,w=t?m:u,C=t?h:p;uv(b,C?w.cloneNode(!0):w,n,i,!C)},a)},o)},r),e}ae.after=function(){return qn(arguments,this,!1,!1,!1,!0,!0)},ae.append=function(){return qn(arguments,this,!1,!1,!0)};function dv(s){if(!arguments.length)return this[0]&&this[0].innerHTML;if(jt(s))return this;const e=/]/.test(s);return this.each((t,n)=>{ut(n)&&(e?y(n).empty().append(s):n.innerHTML=s)})}ae.html=dv,ae.appendTo=function(s){return qn(arguments,this,!0,!1,!0)},ae.wrapInner=function(s){return this.each((e,t)=>{const n=y(t),i=n.contents();i.length?i.wrapAll(s):n.append(s)})},ae.before=function(){return qn(arguments,this,!1,!0)},ae.wrapAll=function(s){let e=y(s),t=e[0];for(;t.children.length;)t=t.firstElementChild;return this.first().before(e),this.appendTo(t)},ae.wrap=function(s){return this.each((e,t)=>{const n=y(s)[0];y(t).wrapAll(e?n.cloneNode(!0):n)})},ae.insertAfter=function(s){return qn(arguments,this,!0,!1,!1,!1,!1,!0)},ae.insertBefore=function(s){return qn(arguments,this,!0,!0)},ae.prepend=function(){return qn(arguments,this,!1,!0,!0,!0,!0)},ae.prependTo=function(s){return qn(arguments,this,!0,!0,!0,!1,!1,!0)},ae.contents=function(){return y(yn(An(this,s=>s.tagName==="IFRAME"?[s.contentDocument]:s.tagName==="TEMPLATE"?s.content.childNodes:s.childNodes)))},ae.next=function(s,e,t){return Kn(y(yn(An(this,"nextElementSibling",e,t))),s)},ae.nextAll=function(s){return this.next(s,!0)},ae.nextUntil=function(s,e){return this.next(e,!0,s)},ae.parents=function(s,e){return Kn(y(yn(An(this,"parentElement",!0,e))),s)},ae.parentsUntil=function(s,e){return this.parents(e,s)},ae.prev=function(s,e,t){return Kn(y(yn(An(this,"previousElementSibling",e,t))),s)},ae.prevAll=function(s){return this.prev(s,!0)},ae.prevUntil=function(s,e){return this.prev(e,!0,s)},ae.map=function(s){return y(Wy.apply([],wd.call(this,(e,t)=>s.call(e,t,e))))},ae.clone=function(){return this.map((s,e)=>e.cloneNode(!0))},ae.offsetParent=function(){return this.map((s,e)=>{let t=e.offsetParent;for(;t&&Mn(t,"position")==="static";)t=t.offsetParent;return t||gd})},ae.slice=function(s,e){return y(Cd.call(this,s,e))};const fv=/-([a-z])/g;function Fl(s){return s.replace(fv,(e,t)=>t.toUpperCase())}ae.ready=function(s){const e=()=>setTimeout(s,0,y);return En.readyState!=="loading"?e():En.addEventListener("DOMContentLoaded",e),this},ae.unwrap=function(){return this.parent().each((s,e)=>{if(e.tagName==="BODY")return;const t=y(e);t.replaceWith(t.children())}),this},ae.offset=function(){const s=this[0];if(!s)return;const e=s.getBoundingClientRect();return{top:e.top+io.pageYOffset,left:e.left+io.pageXOffset}},ae.position=function(){const s=this[0];if(!s)return;const e=Mn(s,"position")==="fixed",t=e?s.getBoundingClientRect():this.offset();if(!e){const n=s.ownerDocument;let i=s.offsetParent||n.documentElement;for(;(i===n.body||i===n.documentElement)&&Mn(i,"position")==="static";)i=i.parentNode;if(i!==s&&ut(i)){const r=y(i).offset();t.top-=r.top+gn(i,"borderTopWidth"),t.left-=r.left+gn(i,"borderLeftWidth")}}return{top:t.top-gn(s,"marginTop"),left:t.left-gn(s,"marginLeft")}};const Nd={class:"className",contenteditable:"contentEditable",for:"htmlFor",readonly:"readOnly",maxlength:"maxLength",tabindex:"tabIndex",colspan:"colSpan",rowspan:"rowSpan",usemap:"useMap"};ae.prop=function(s,e){if(s){if(It(s))return s=Nd[s]||s,arguments.length<2?this[0]&&this[0][s]:this.each((t,n)=>{n[s]=e});for(const t in s)this.prop(t,s[t]);return this}},ae.removeProp=function(s){return this.each((e,t)=>{delete t[Nd[s]||s]})};const pv=/^--/;function jl(s){return pv.test(s)}const Bl={},{style:mv}=yd,gv=["webkit","moz","ms"];function yv(s,e=jl(s)){if(e)return s;if(!Bl[s]){const t=Fl(s),n=`${t[0].toUpperCase()}${t.slice(1)}`,i=`${t} ${gv.join(`${n} `)}${n}`.split(" ");bt(i,(r,o)=>{if(o in mv)return Bl[s]=o,!1})}return Bl[s]}const vv={animationIterationCount:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0};function Ed(s,e,t=jl(s)){return!t&&!vv[s]&&kd(e)?`${e}px`:e}function bv(s,e){if(It(s)){const t=jl(s);return s=yv(s,t),arguments.length<2?this[0]&&Mn(this[0],s,t):s?(e=Ed(s,e,t),this.each((n,i)=>{ut(i)&&(t?i.style.setProperty(s,e):i.style[s]=e)})):this}for(const t in s)this.css(t,s[t]);return this}ae.css=bv;function Md(s,e){try{return s(e)}catch{return e}}const _v=/^\s+|\s+$/;function Ad(s,e){const t=s.dataset[e]||s.dataset[Fl(e)];return _v.test(t)?t:Md(JSON.parse,t)}function wv(s,e,t){t=Md(JSON.stringify,t),s.dataset[Fl(e)]=t}function Cv(s,e){if(!s){if(!this[0])return;const t={};for(const n in this[0].dataset)t[n]=Ad(this[0],n);return t}if(It(s))return arguments.length<2?this[0]&&Ad(this[0],s):jt(e)?this:this.each((t,n)=>{wv(n,s,e)});for(const t in s)this.data(t,s[t]);return this}ae.data=Cv;function Pd(s,e){const t=s.documentElement;return Math.max(s.body[`scroll${e}`],t[`scroll${e}`],s.body[`offset${e}`],t[`offset${e}`],t[`client${e}`])}bt([!0,!1],(s,e)=>{bt(["Width","Height"],(t,n)=>{const i=`${e?"outer":"inner"}${n}`;ae[i]=function(r){if(this[0])return ei(this[0])?e?this[0][`inner${n}`]:this[0].document.documentElement[`client${n}`]:ks(this[0])?Pd(this[0],n):this[0][`${e?"offset":"client"}${n}`]+(r&&e?gn(this[0],`margin${t?"Top":"Left"}`)+gn(this[0],`margin${t?"Bottom":"Right"}`):0)}})}),bt(["Width","Height"],(s,e)=>{const t=e.toLowerCase();ae[t]=function(n){if(!this[0])return jt(n)?void 0:this;if(!arguments.length)return ei(this[0])?this[0].document.documentElement[`client${e}`]:ks(this[0])?Pd(this[0],e):this[0].getBoundingClientRect()[t]-Sd(this[0],!s);const i=parseInt(n,10);return this.each((r,o)=>{if(!ut(o))return;const a=Mn(o,"boxSizing");o.style[t]=Ed(t,i+(a==="border-box"?Sd(o,!s):0))})}});const Ld="___cd";ae.toggle=function(s){return this.each((e,t)=>{if(!ut(t))return;const n=xd(t);(jt(s)?n:s)?(t.style.display=t[Ld]||"",xd(t)&&(t.style.display=sv(t.tagName))):n||(t[Ld]=Mn(t,"display"),t.style.display="none")})},ae.hide=function(){return this.toggle(!1)},ae.show=function(){return this.toggle(!0)};const Rd="___ce",Hl=".",Ul={focus:"focusin",blur:"focusout"},zd={mouseenter:"mouseover",mouseleave:"mouseout"},kv=/^(mouse|pointer|contextmenu|drag|drop|click|dblclick)/i;function Wl(s){return zd[s]||Ul[s]||s}function Vl(s){const e=s.split(Hl);return[e[0],e.slice(1).sort()]}ae.trigger=function(s,e){if(It(s)){const[n,i]=Vl(s),r=Wl(n);if(!r)return this;const o=kv.test(r)?"MouseEvents":"HTMLEvents";s=En.createEvent(o),s.initEvent(r,!0,!0),s.namespace=i.join(Hl),s.___ot=n}s.___td=e;const t=s.___ot in Ul;return this.each((n,i)=>{t&&Ss(i[s.___ot])&&(i[`___i${s.type}`]=!0,i[s.___ot](),i[`___i${s.type}`]=!1),i.dispatchEvent(s)})};function Od(s){return s[Rd]=s[Rd]||{}}function Sv(s,e,t,n,i){const r=Od(s);r[e]=r[e]||[],r[e].push([t,n,i]),s.addEventListener(e,i)}function Fd(s,e){return!e||!Pl.call(e,t=>s.indexOf(t)<0)}function ho(s,e,t,n,i){const r=Od(s);if(e)r[e]&&(r[e]=r[e].filter(([o,a,l])=>{if(i&&l.guid!==i.guid||!Fd(o,t)||n&&n!==a)return!0;s.removeEventListener(e,l)}));else for(e in r)ho(s,e,t,n,i)}ae.off=function(s,e,t){if(jt(s))this.each((n,i)=>{!ut(i)&&!ks(i)&&!ei(i)||ho(i)});else if(It(s))Ss(e)&&(t=e,e=""),bt(lo(s),(n,i)=>{const[r,o]=Vl(i),a=Wl(r);this.each((l,c)=>{!ut(c)&&!ks(c)&&!ei(c)||ho(c,a,o,e,t)})});else for(const n in s)this.off(n,s[n]);return this},ae.remove=function(s){return Kn(this,s).detach().off(),this},ae.replaceWith=function(s){return this.before(s).remove()},ae.replaceAll=function(s){return y(s).replaceWith(this),this};function xv(s,e,t,n,i){if(!It(s)){for(const r in s)this.on(r,e,t,s[r],i);return this}return It(e)||(jt(e)||Ui(e)?e="":jt(t)?(t=e,e=""):(n=t,t=e,e="")),Ss(n)||(n=t,t=void 0),n?(bt(lo(s),(r,o)=>{const[a,l]=Vl(o),c=Wl(a),h=a in zd,u=a in Ul;c&&this.each((p,m)=>{if(!ut(m)&&!ks(m)&&!ei(m))return;const b=function(w){if(w.target[`___i${w.type}`])return w.stopImmediatePropagation();if(w.namespace&&!Fd(l,w.namespace.split(Hl))||!e&&(u&&(w.target!==m||w.___ot===c)||h&&w.relatedTarget&&m.contains(w.relatedTarget)))return;let C=m;if(e){let T=w.target;for(;!Dd(T,e);)if(T===m||(T=T.parentNode,!T))return;C=T}Object.defineProperty(w,"currentTarget",{configurable:!0,get(){return C}}),Object.defineProperty(w,"delegateTarget",{configurable:!0,get(){return m}}),Object.defineProperty(w,"data",{configurable:!0,get(){return t}});const S=n.call(C,w,w.___td);i&&ho(m,c,l,e,b),S===!1&&(w.preventDefault(),w.stopPropagation())};b.guid=n.guid=n.guid||y.guid++,Sv(m,c,l,e,b)})}),this):this}ae.on=xv;function Dv(s,e,t,n){return this.on(s,e,t,n,!0)}ae.one=Dv;const Tv=/\r?\n/g;function $v(s,e){return`&${encodeURIComponent(s)}=${encodeURIComponent(e.replace(Tv,`\r `))}`}const Iv=/file|reset|submit|button|image/i,jd=/radio|checkbox/i;ae.serialize=function(){let s="";return this.each((e,t)=>{bt(t.elements||[t],(n,i)=>{if(i.disabled||!i.name||i.tagName==="FIELDSET"||Iv.test(i.type)||jd.test(i.type)&&!i.checked)return;const r=Id(i);if(!jt(r)){const o=ro(r)?r:[r];bt(o,(a,l)=>{s+=$v(i.name,l)})}})}),s.slice(1)},window.$=y;function Bd(s,e){if(s==null)return[s,void 0];typeof e=="string"&&(e=e.split("."));const t=e.join(".");let n=s;const i=[n];for(;typeof n=="object"&&n!==null&&e.length;){let r=e.shift(),o;const a=r.indexOf("[");if(a>0&&a1?i[r-2]:s,e[e.length-1]),o===void 0?t:o}catch{return t}}function Pn(s,e,t,n){let i;const r=Wi(s,e,void 0,o=>{i=o});return typeof r=="function"?r.apply(n??i,t):r}function Nv(s){return typeof s=="string"&&s!==""}function Se(s,...e){if(e.length===0)return s;if(e.length===1&&typeof e[0]=="object"&&e[0]){const t=e[0];return Object.keys(t).forEach(n=>{const i=t[n]??"";s=s.replace(new RegExp(`\\{${n}\\}`,"g"),`${i}`)}),s}for(let t=0;t(s[s.B=1]="B",s[s.KB=1024]="KB",s[s.MB=1048576]="MB",s[s.GB=1073741824]="GB",s[s.TB=1099511627776]="TB",s))(Kl||{});function ct(s,e=2,t){return Number.isNaN(s)?"?KB":(t||(s<1024?t="B":s<1048576?t="KB":s<1073741824?t="MB":s<1099511627776?t="GB":t="TB"),(s/Kl[t]).toFixed(e)+t)}const vn=s=>{const e=/^[0-9]*(B|KB|MB|GB|TB)$/;s=s.toUpperCase(),s.endsWith("B")||(s+="B");const t=s.match(e);if(!t)return 0;const n=t[1];return s=s.replace(n,""),Number.parseInt(s,10)*Kl[n]};let ql=(document.documentElement.getAttribute("lang")||"zh_cn").toLowerCase().replace("-","_"),Ln;function Hd(){return ql}function Ev(s){ql=s.toLowerCase().replace("-","_")}function Ud(s,e){Ln||(Ln={}),typeof s=="string"&&(s={[s]:e??{}}),y.extend(!0,Ln,s)}function Pe(s,e,t,n,i,r){Array.isArray(s)?Ln&&s.unshift(Ln):s=Ln?[Ln,s]:[s],typeof t=="string"&&(r=i,i=n,n=t,t=void 0);const o=i||ql;let a;for(const l of s){if(!l)continue;const c=l[o]||l.default;if(!c)continue;const h=r&&l===Ln?`${r}.${e}`:e;if(a=Wi(c,h),a!==void 0)break}return a===void 0?n:t?Se(a,...Array.isArray(t)?t:[t]):a}function Mv(s,e,t,n){return Pe(void 0,s,e,t,n)}Pe.addLang=Ud,Pe.getLang=Mv,Pe.getCode=Hd,Pe.setCode=Ev,Pe.map=Ln,Ud({zh_cn:{confirm:"确定",save:"保存",cancel:"取消",delete:"删除",reset:"重置",add:"添加",copy:"复制",close:"关闭"},zh_tw:{confirm:"確定",save:"儲存",cancel:"取消",delete:"刪除",reset:"重置",add:"添加",Copy:"複製",close:"關閉"},en:{confirm:"Confirm",save:"Save",cancel:"Cancel",delete:"Delete",reset:"Reset",add:"Add",copy:"Copy",close:"Close"}});function xs(s,e,t){t!=null&&(Array.isArray(t)?t.forEach(n=>xs(s,e,n)):!(t instanceof Blob)&&y.isPlainObject(t)?Object.entries(t).forEach(([n,i])=>{xs(s,`${e}[${n}]`,i)}):s.append(e,t instanceof Blob?t:String(t)))}function uo(s,e){const t=e||new FormData;return s&&(typeof s=="string"&&(s=new URLSearchParams(s)),s instanceof URLSearchParams?s.forEach((n,i)=>{xs(t,i,n)}):Array.isArray(s)?s.forEach(([n,i])=>{xs(t,n,i)}):s instanceof FormData?s.forEach((n,i)=>{xs(t,i,n)}):typeof s=="object"&&s&&Object.entries(s).forEach(([n,i])=>{xs(t,n,i)})),t}function kt(){return y.guid++}function fo(s,e){if(s===e)return!1;if(s&&e){const t=typeof s,n=typeof e;if(t!==n)return!0;if(t==="object"&&n==="object"){const i=Array.isArray(s),r=Array.isArray(e);if(i!==r)return!0;if(i&&r){if(s.length!==e.length)return!0;for(let l=0;ln instanceof Ds?n.value!==t[i]:fo(n,t[i])))&&(this._value=this._compute(),this._lastDependencies=e.map(n=>n instanceof Ds?n.cache:n)),this._value}}function Gl(...s){const e=[],t=new Map,n=(i,r)=>{if(Array.isArray(i)&&(r=i[1],i=i[0]),!i.length)return;const o=t.get(i);typeof o=="number"?e[o][1]=!!r:(t.set(i,e.length),e.push([i,!!r]))};return s.forEach(i=>{typeof i=="function"&&(i=i()),Array.isArray(i)?Gl(...i).forEach(n):i&&typeof i=="object"?Object.entries(i).forEach(n):typeof i=="string"&&i.split(" ").forEach(r=>n(r,!0))}),e.sort((i,r)=>(t.get(i[0])||0)-(t.get(r[0])||0))}const G=(...s)=>Gl(...s).reduce((e,[t,n])=>(n&&e.push(t),e),[]).join(" ");y.classes=G,y.fn.setClass=function(s,...e){return this.each((t,n)=>{const i=y(n);s===!0?i.attr("class",G(i.attr("class"),...e)):i.addClass(G(s,...e))})};const ti=new WeakMap;function po(s,e,t){const n=ti.has(s),i=n?ti.get(s):{};typeof e=="string"?i[e]=t:e===null?Object.keys(i).forEach(r=>{delete i[r]}):Object.assign(i,e),Object.keys(i).forEach(r=>{i[r]===void 0&&delete i[r]}),Object.keys(i).length?(!n&&s instanceof Element&&Object.assign(i,y(s).dataset(),i),ti.set(s,i)):ti.delete(s)}function Vi(s,e,t){let n=ti.get(s)||{};return t&&s instanceof Element&&(n=Object.assign({},y(s).dataset(),n)),e===void 0?n:n[e]}function Av(s){ti.delete(s)}y.fn.dataset=y.fn.data,y.fn.data=function(...s){const[e,t]=s;return!s.length||s.length===1&&typeof e=="string"?this.length?Vi(this[0],e,!0):void 0:this.each((n,i)=>po(i,e,t))},y.fn.removeData=function(s=null){return this.each((e,t)=>po(t,s))};function Gn(s,...e){return s.includes("RAWJS")&&(s=s.split('"RAWJS<').join("").split('>RAWJS"').join("").split("").join('"').split("").join(` `)),new Function(`return ${s}`)(...e)}function mo(s,...e){return s.includes("RAWJS")?Gn(s,...e):JSON.parse(s)}function Pv(s){return JSON.stringify(s,(e,t)=>typeof t=="function"?`RAWJS<${t.toString().split('"').join("").split(` -`).join("")}>RAWJS`:t)}function ni(s,e){const t=y(s)[0];if(!t)return;const{prefix:n,getter:i,evalValue:r,json:o=!0,evalArgs:a=[]}={prefix:"z-",...typeof e=="string"?{prefix:e}:e},l=Array.isArray(r)?new Set(r):void 0;return Array.from(t.attributes).reduce((c,h)=>{let{name:u}=h;const{value:p}=h;let m=p;if(u.startsWith(n)){if(u=u.slice(n.length).replace(/-([a-z])/g,b=>b[1].toUpperCase()),i)m=i(u,p);else try{r&&(!l||l.has(u))||r===void 0&&p.includes("RAWJS")?m=Gn(p,...a):o&&(m=JSON.parse(p))}catch{}c[u]=m}return c},{})}function Yl(s,e,t="z-"){const n=y(s);Object.keys(e).forEach(i=>{let r=e[i];typeof r=="function"&&(r=`RAWJS<${r}>RAWJS`),typeof r!="string"&&(r=JSON.stringify(r)),i=i.replace(/[A-Z]/g,o=>`-${o.toLowerCase()}`),n.attr(`${t}${i}`,r)})}function Lv(...s){var t;const e=s.length;if(!e)return ni(this);if(e===1){const[n]=s;return typeof n=="string"?(t=ni(this))==null?void 0:t[n]:(y.isPlainObject(n)&&Yl(this,n),this)}return Yl(this,{[s[0]]:s[1]}),this}y.fn.z=Lv,y.fn._attr=y.fn.attr,y.fn.extend({attr(...s){const[e,t]=s;return!s.length||s.length===1&&typeof e=="string"?this._attr.apply(this,s):typeof e=="object"?(e&&Object.keys(e).forEach(n=>{const i=e[n];i===null?this.removeAttr(n):this._attr(n,i)}),this):t===null?this.removeAttr(e):this._attr(e,t)}}),y.Event||(y.Event=(s,e)=>{const[t,...n]=s.split("."),i=new Event(t,{bubbles:!0,cancelable:!0});return i.namespace=n.join("."),i.___ot=t,i.___td=e,i});const Rn=(s,e)=>new Promise(t=>{const n=window.setTimeout(t,s);e&&e(n)}),Wd={};y.share=Wd;var go,qe,Vd;N.isValidElement=void 0;var Ts,Kd,qd,Zl,Xl,Jl,Ql,Ki={},Gd=[],Rv=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,yo=Array.isArray;function Yn(s,e){for(var t in e)s[t]=e[t];return s}function Yd(s){s&&s.parentNode&&s.parentNode.removeChild(s)}function v(s,e,t){var n,i,r,o={};for(r in e)r=="key"?n=e[r]:r=="ref"?i=e[r]:o[r]=e[r];if(arguments.length>2&&(o.children=arguments.length>3?go.call(arguments,2):t),typeof s=="function"&&s.defaultProps!=null)for(r in s.defaultProps)o[r]===void 0&&(o[r]=s.defaultProps[r]);return vo(s,o,n,i,null)}function vo(s,e,t,n,i){var r={type:s,props:e,key:t,ref:n,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:i??++Vd,__i:-1,__u:0};return i==null&&qe.vnode!=null&&qe.vnode(r),r}function me(){return{current:null}}function zn(s){return s.children}function ye(s,e){this.props=s,this.context=e}function si(s,e){if(e==null)return s.__?si(s.__,s.__i+1):null;for(var t;ee&&Ts.sort(Zl));bo.__r=0}function Jd(s,e,t,n,i,r,o,a,l,c,h){var u,p,m,b,w,C=n&&n.__k||Gd,S=e.length;for(t.__d=l,zv(t,e,C),l=t.__d,u=0;u0?vo(i.type,i.props,i.key,i.ref?i.ref:null,i.__v):i).__=s,i.__b=s.__b+1,r=null,(a=i.__i=Ov(i,t,o,h))!==-1&&(h--,(r=t[a])&&(r.__u|=131072)),r==null||r.__v===null?(a==-1&&u--,typeof i.type!="function"&&(i.__u|=65536)):a!==o&&(a==o-1?u--:a==o+1?u++:(a>o?u--:u++,i.__u|=65536))):i=s.__k[n]=null;if(h)for(n=0;n(l!=null&&!(131072&l.__u)?1:0))for(;o>=0||a=0){if((l=e[o])&&!(131072&l.__u)&&i==l.key&&r===l.type)return o;o--}if(a{!t||typeof t!="object"||Object.keys(t).forEach(n=>{let i=t[n];const r=s[n];i!==r&&(r!==void 0&&(n==="className"||n.endsWith("Class")?i=[r,i]:n==="children"?i=[..._o(r),..._o(i)]:typeof r=="object"&&(n==="style"||n.endsWith("Style")||n==="attrs"||n.endsWith("Attrs")||n==="props")&&(i=y.extend(r,i))),s[n]=i)})}),s}function nc(s){return Object.keys(s).forEach(e=>{s[e]===void 0&&delete s[e]}),s}function Co(s,e=!0){const t=y(s),n=t[0],i="zui-disable-scroll";if(e){if(t.data(i))return;if((t.css("scrollbar-gutter")||"").includes("stable")){t.data(i,{overflow:t.css("overflow")}).css("overflow","hidden");return}const r=n===document.body||t.is("html")?window.innerWidth-document.body.clientWidth:n.offsetWidth-n.clientWidth;if(!r)return;const o=t.css("paddingRight")||"0";t.data(i,{paddingRight:o,overflow:t.css("overflow")}).css({paddingRight:`${r+Number.parseInt(o,10)}px`,overflow:"hidden"})}else{const r=t.data(i);if(!r)return;t.css(r).removeData(i)}}y.fn.disableScroll=function(s=!0){return this.each((e,t)=>{Co(t,s)})},y.fn.enableScroll=function(s=!0){return this.disableScroll(!s)};function sc(s,e,t){if(!(t.on||"click").split(" ").includes(e.type))return;const n=t.selector?y(e.target).closest(t.selector):s;if(!n.length)return;const i=c=>c===""?!0:c,r=c=>{if(typeof c=="string")try{c=JSON.parse(c)}catch{}return c};if(i(t.once)){if(t.onceCalled)return;s.dataset("once-called",!0)}if(i(t.prevent)&&e.preventDefault(),i(t.stop)&&e.stopPropagation(),i(t.self)&&e.currentTarget!==e.target)return;const o=[["$element",s],["event",e],["options",t],["$target",n]],a=c=>typeof c=="function"?c(...o):y.runJS(c,...o);if(t.if!==void 0&&!a(t.if))return;const l=t.call;if(l){let c;if(typeof l=="string"?c=/^[$A-Z_][0-9A-Z_$.]*$/i.test(l)?Wi(window,l):a(l):c=l,typeof c=="function"){const h=[],u=t.params;t.params=h,typeof u=="string"&&u.length?u[0]==="["?h.push(...r(u)):h.push(...u.split(", ").map(p=>(p=p.trim(),p==="$element"?s:p==="event"?e:p==="options"?t:p.startsWith("$element.")||p.startsWith("event.")||p.startsWith("options.")?a(p):r(p)))):Array.isArray(u)?h.push(...u):h.push(u),c(...h)}}t.do&&a(t.do)}function Bv(s){const e=y(this),t=s.type,n=e.attr("zui-on");if(n){const[o,a]=n.split("~").map(l=>l.trim());o&&o.split(" ").includes(t)&&sc(e,s,y.extend({on:o},a?a.startsWith("{")?Gn(a):{do:a}:ni(e,{prefix:"data-",evalValue:["call","if","do"]})))}const i=e.attr(`zui-on-${t}`);i&&sc(e,s,y.extend({on:t},i.startsWith("{")?Gn(i):{do:i}));const r=e.attr("data-on");r&&r.split(" ").includes(t)&&sc(e,s,ni(e,{prefix:"data-",evalValue:["call","if","do"]}))}function rf(s){y(document).off(".zui.global").on(s.map(e=>`${e}.zui.global`).join(" "),`[zui-on],${s.map(e=>`[zui-on-${e}]`)},[data-on]`,Bv)}y(()=>{rf(["click","change","inited"])});function Xn(s,e){if(typeof s=="function")return Xn(s(...e||[]));if(typeof s=="number")return[s];let t=s.match(/(\d+)(%|px)?/);return t?[parseInt(t[1]),t[2]]:(t=s.match(/(\d+)\/(\d+)/),t?[100*parseInt(t[1])/parseInt(t[2]),"%"]:[NaN])}function He(s,e){if(s==null)return null;const[t,n="px"]=Xn(s,e);return Number.isNaN(t)?typeof s=="string"?s:null:`${t}${n}`}async function $s(s,e){var n,i,r;if(s instanceof Blob){const o=document.createElement("a");return o.href=window.URL.createObjectURL(s),e&&(o.download=decodeURIComponent(e)),o.click(),o.remove(),s}if(s instanceof Response){const o=await s.blob();return e=e||((r=(i=(n=s.headers.get("Content-Disposition"))==null?void 0:n.split(";")[1])==null?void 0:i.split("=")[1])==null?void 0:r.replace(/"/g,"")),$s(o,e)}const t=await fetch(s);return $s(t)}class of{constructor(e){this._$target=y(e)}on(...e){return this._$target.on(...e),this}one(...e){return this._$target.one(...e),this}off(...e){return this._$target.off(...e),this}trigger(...e){return this._$target.trigger(...e),this}}const bn=new of(document);y.bus=bn,y.on=bn.on.bind(bn),y.one=bn.one.bind(bn),y.off=bn.off.bind(bn),y.trigger=bn.trigger.bind(bn);var Hv=["Shift","Meta","Alt","Control"],af=typeof navigator=="object"?navigator.platform:"",lf=/Mac|iPod|iPhone|iPad/.test(af),Uv=lf?"Meta":"Control",Wv=af==="Win32"?["Control","Alt"]:lf?["Alt"]:[];function ic(s,e){return typeof s.getModifierState=="function"&&(s.getModifierState(e)||Wv.includes(e)&&s.getModifierState("AltGraph"))}function Vv(s){return s.trim().split(" ").map(function(e){var t=e.split(/\b\+/),n=t.pop();return[t=t.map(function(i){return i==="$mod"?Uv:i}),n]})}function cf(s,e){var t;e===void 0&&(e={});var n=(t=e.timeout)!=null?t:1e3,i=Object.keys(s).map(function(a){return[Vv(a),s[a]]}),r=new Map,o=null;return function(a){a instanceof KeyboardEvent&&(i.forEach(function(l){var c=l[0],h=l[1],u=r.get(c)||c;(function(p,m){return!(m[1].toUpperCase()!==p.key.toUpperCase()&&m[1]!==p.code||m[0].find(function(b){return!ic(p,b)})||Hv.find(function(b){return!m[0].includes(b)&&m[1]!==b&&ic(p,b)}))})(a,u[0])?u.length>1?r.set(c,u.slice(1)):(r.delete(c),h(a)):ic(a,a.key)||r.delete(c)}),o&&clearTimeout(o),o=setTimeout(r.clear.bind(r),n))}}function Kv(s,e,t){var n;t===void 0&&(t={});var i=(n=t.event)!=null?n:"keydown",r=cf(e,t);return s.addEventListener(i,r),function(){s.removeEventListener(i,r)}}function rc(s,e={}){if(!s)return;const t=Object.keys(e).reduce((n,i)=>(e[i].optional||(n[i]={...e[i]}),n),{});return Object.keys(s).forEach(n=>{const i=s[n];i?i===!0?e[n]&&(t[n]={...e[n]}):t[n]=i:delete t[n]}),Object.keys(t).reduce((n,i)=>{const{keys:r,handler:o}=t[i];return typeof r=="string"?n[r]=o:r.forEach(a=>{n[a]=o}),n},{})}function oc(s,e,t){const{timeout:n,event:i="keydown",scope:r,when:o}=t||{},a=cf(e,{timeout:n}),l=`.zui.hotkeys${r?`.${r}`:""}`,c="zui-hotkeys-composing";return y(s).on(`${i}${l}`,function(h){o&&o(h)===!1||y(h.target).data(c)||a(h)}).on(`compositionstart${l}`,h=>{y(h.target).data(c,!0)}).on(`compositionend${l}`,h=>{y(h.target).removeData(c)})}function ac(s,e){return y(s).off(`.zui.hotkeys${e?`.${e}`:""}`)}const qv=Kv;y.fn.hotkeys=function(s,e){return oc(this,s,e)},y.fn.unbindHotkeys=function(s){return ac(this,s)},y.hotkeys=function(s,e){oc(window,s,e)},y.unbindHotkeys=function(s){ac(window,s)};function ko(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement}async function hf(s){(typeof s=="string"||s instanceof Element||s instanceof y)&&(s={target:s});const{target:e,onError:t,onSuccess:n,afterExit:i,afterEnter:r}=s,o=y(e),a=o[0];if(!a)return;const l=a.requestFullscreen||a.webkitRequestFullscreen||a.mozRequestFullScreen;if(!l){t==null||t.call(a,new Error("[ZUI] The browser does not support full screen feature."));return}try{await l.call(a),n==null||n.call(a),y(a).off(".zui.fullscreen"),i&&o.on("exitFullscreen.zui.fullscreen",i),r&&o.on("enterFullscreen.zui.fullscreen",r)}catch(c){t==null||t.call(a,c)}document.zuiBindFullscreenChange||(document.zuiBindFullscreenChange=!0,y(document).on("fullscreenchange.zui webkitfullscreenchange.zui mozfullscreenchange.zui",c=>{const h=ko();let u=h;h?y(h).addClass("is-in-fullscreen"):(u=y(document).find(".is-in-fullscreen")[0]||document,y(u).removeClass("is-in-fullscreen")),y("body").toggleClass("has-in-fullscreen",!!h);const p={event:c,target:u,fullscreenElement:h};y(u).trigger(h?"enterFullscreen":"exitFullscreen",p).trigger("toggleFullscreen",p)}))}async function So(s){const e=ko();return s===!1&&!!e===s?s:e?(document.exitFullscreen(),!1):(await hf(s),!0)}y.fn.fullscreen=function(s){return So({target:this,...s})},y.getFullscreenElement=ko,y.toggleFullscreen=So;function Jn(s){return!s||s.parentNode===document?!1:s.parentNode?Jn(s.parentNode):!0}y.isDetached=Jn,y.fn.isDetached=function(){const s=this[0];return!s||Jn(s)};const Is=class Ny{constructor(e,t){var b;this._inited=!1,this._autoDestory=0,this._destroyed=!1;const{KEY:n,DATA_KEY:i,MULTI_INSTANCE:r,NAME:o,ATTR_KEY:a,ALL:l,TYPED_ALL:c}=this.constructor;if(!o)throw new Error('[ZUI] The component must have a "NAME" static property.');const h=y(e);if(h.data(n)&&!r)throw new Error(`[ZUI] The component "${o}" has been initialized on element.`);const u=h[0];if(!u)throw new Error(`[ZUI] Invalid selector "${e}" for component "${o}", can not find the element matched.`);const p=kt();this._gid=p,this._element=u,this.resetOptions(t),this._key=this.options.key??`__${p}`;let m=l.get(u);if(m?m.add(this):(m=new Set([this]),l.set(u,m)),c.has(o)?c.get(o).add(this):c.set(o,new Set([this])),h.data(n,this).attr(a,"").attr(i,`${p}`).attr("z-use",[...new Set([...m].map(w=>w.constructor.NAME))].join(",")),r){const w=`${n}:ALL`;let C=h.data(w);C||(C=new Map,h.data(w,C)),C.set(this._key,this)}this.init(),(b=this.options.$onCreate)==null||b.call(this),requestAnimationFrame(async()=>{var C;const{$fetcher:w}=this.options;if(w){const S=await dt(w,[],{dataType:"js"});if(this.destroyed)return;S&&this.setOptions(S)}this._inited=!0,await this.afterInit(),this.emit("inited",this.options),(C=this.options.$onInited)==null||C.call(this)})}static get ZUI(){return this.NAME.replace(/(^[A-Z]+)/,e=>e.toLowerCase())}static get KEY(){return`zui.${this.NAME}`}static get NAMESPACE(){return`.zui.${this.ZUI}`}static get DATA_KEY(){return`data-zui-${this.NAME}`}static get ATTR_KEY(){return`z-use-${this.NAME}`}static get SELECTOR(){return`[${this.DATA_KEY}]`}get inited(){return this._inited}get destroyed(){return this._destroyed}get element(){return this._element}get key(){return this._key}get options(){return this._options}get gid(){return this._gid}get $element(){return y(this.element)}get $emitter(){return this.$element}get i18nData(){return[this.options.i18n,this.constructor.i18n]}init(){}afterInit(){}render(e,t){this.setOptions(e,t)}destroy(){var m;const{KEY:e,DATA_KEY:t,ALL:n,TYPED_ALL:i,NAME:r,MULTI_INSTANCE:o,ATTR_KEY:a}=this.constructor,{$element:l,element:c}=this;if(this.emit("destroyed"),this._destroyed=!0,l.off(this.namespace).removeData(e).removeAttr(a).removeAttr(t),o){const b=this.$element.data(`${e}:ALL`);if(b)if(b.delete(this._key),b.size===0)this.$element.removeData(`${e}:ALL`);else{const w=b.values().next().value;l.data(e,w).attr(t,String(w==null?void 0:w.gid))}}const h=n.get(c);h&&(h.delete(this),h.size===0&&n.delete(c));const u=i.get(r);u&&(u.delete(this),u.size===0&&i.delete(r));const p=n.get(c);p!=null&&p.size?l.attr("z-use",[...new Set([...p].map(b=>b.constructor.NAME))].join(",")):l.removeAttr("z-use"),(m=this.options.$onDestroy)==null||m.call(this)}autoDestroy(e=100){this._autoDestory&&clearTimeout(this._autoDestory),this._autoDestory=window.setTimeout(()=>{this._autoDestory=0,Jn(this.element)&&this.destroy()},e)}setOptions(e,t){if(t){const n={...this.constructor.DEFAULT,...(e==null?void 0:e.$optionsFromDataset)!==!1?this.$element.dataset():{},...e},{$options:i}=n;if(i){const r=typeof i=="function"?i.call(this,this.element,n):i;r&&y.extend(n,r),delete n.$options}this._options=n}else e&&y.extend(this._options,e);return this._options}resetOptions(e){return this.setOptions(e,!0)}emit(e,...t){const n=y.Event(e);return n.__src=this,this.$emitter.trigger(n,[this,...t]),n}on(e,t,n){const i=this;this.$element[n!=null&&n.once?"one":"on"](this._wrapEvent(e),function(r,o){(!r.__src||r.__src===i)&&t.call(this,r,o)})}one(e,t){this.on(e,t,{once:!0})}off(e){this.$element.off(this._wrapEvent(e))}i18n(e,t,n){const{i18nData:i}=this;return Pe(i,e,t,n,this.options.lang,this.constructor.NAME)??Pe(i,e,t,n,this.options.lang)??`{i18n:${e}}`}get namespace(){return`${this.constructor.NAMESPACE}.${this._key}`}_wrapEvent(e){return e.split(" ").map(t=>t.includes(".")?t:`${t}${this.namespace}`).join(" ")}static get(e,t){const n=y(e);if(this.MULTI_INSTANCE&&t!==void 0){const i=n.data(`${this.KEY}:ALL`);return i?i.get(t):void 0}return n.data(this.KEY)}static isValid(e){return!0}static ensure(e,t){const n=this.get(e,t==null?void 0:t.key);if(n){if(this.isValid(n))return t&&n.setOptions(t),n;n.destroy()}return new this(e,t)}static getAll(e,t){var l;const{SELECTOR:n,ALL:i,TYPED_ALL:r}=this,o=[],a=c=>{c instanceof this&&(!t||t(c)!==!1)&&o.push(c)};return e?y(e).find(n).each((c,h)=>{var u;(u=i.get(h))==null||u.forEach(a)}):this!==Ny?(l=r.get(this.NAME))==null||l.forEach(a):i.forEach(c=>{c.forEach(a)}),o.sort((c,h)=>c.gid-h.gid)}static query(e,t,n){return e===void 0?this.getAll(void 0,n).pop():this.get(y(e).closest(this.SELECTOR),t)}static defineFn(e){let t=e||this.ZUI;y.fn[t]&&(t=`zui${this.NAME}`);const n=this;y.fn.extend({[t](i,...r){const o=typeof i=="object"?i:void 0,a=typeof i=="string"?i:void 0;let l;return this.each((c,h)=>{let u=n.get(h);if(u)o&&u.render(o);else{if(a)return;u=new n(h,o)}if(a){let p=u[a],m=u;p===void 0&&(m=u.$,p=m[a]),typeof p=="function"?l=p.call(m,...r):l=p}}),l!==void 0?l:this}})}static register(e,t){var i,r;e=e||this,t=(t??e.NAME).toLowerCase(),this.map.set(t,e);const n=(r=(i=e.toggle)==null?void 0:i.name)==null?void 0:r.toLowerCase();n&&n!==t&&this.toggleMap.set(n,e)}};Is.DEFAULT={},Is.MULTI_INSTANCE=!1,Is.ALL=new Map,Is.TYPED_ALL=new Map,Is.map=new Map,Is.toggleMap=new Map;let Ge=Is;function qi(s){return Ge.map.get(s.toLowerCase())}function xo(s,e,t={}){let n=qi(s);if(n||(n=lc(s)),!n)return null;const{$update:i,...r}=t;if(!n.MULTI_INSTANCE){const o=n.get(e);if(o)return i&&o.render(r,i==="reset"),o}return new n(e,r)}function Gv(s,e,t={}){requestAnimationFrame(()=>xo(s,e,t))}function uf(s,e){Ge.register(s,e)}function lc(s){const{zui:e}=window;if(e){s=s==null?void 0:s.toLowerCase();for(const t in e){const n=t.toLowerCase()===s;if(s&&!n)continue;const i=e[t];if(!(typeof i!="function"||!i.NAME||!i.ZUI)&&(Ge.map.has(t.toLowerCase())||uf(i),n))return i}}}function Yv(s){var e;s?(e=qi(s))==null||e.defineFn():window._zuiDefined||(lc(),Ge.map.forEach(t=>{t.defineFn()}),Object.assign(window,{_zuiDefined:!0}))}function Zv(s,e={}){const t=y(s);let n=t.attr("zui-create");const{update:i,onCreate:r}=e,o=(a,l)=>{if(l={$update:i,$optionsFromDataset:!1,...l},r){const h=r(a,l);if(h===!1)return;h&&(l=h)}const c=l.$lib;if(c){delete l.$lib,y.getLib(c).then(()=>xo(a,s,l));return}Gv(a,s,l)};if(typeof n=="string"){n=n.trim();const a=n.length?n.split(",").map(h=>h.trim()):[],l=ni(s,{prefix:"zui-create-",evalValue:!0}),c=Object.keys(l);if(!c.length&&a.length===1)o(a[0],t.dataset());else{const h=new Set;[...a,...c].forEach(u=>{if(h.has(u))return;const p=l[u];o(u,p),delete l[u],h.add(u)})}}else{const a=t.dataset(),l=a==null?void 0:a.zui;if(!l)return;console.warn("[ZUI] create component instance with [data-zui] is deprecated, use [zui-create] instead.",{element:s,options:e}),delete a.zui,o(l,a)}}function Xv(){y(document).on("click.zui.toggle mouseenter.zui.toggle","[data-toggle],[zui-toggle]",function(s){const e=y(this),t=e.dataset("toggle")||e.attr("zui-toggle");if(!t)return;const n=Ge.toggleMap.get(t)||qi(t),i=n==null?void 0:n.toggle;if(!i)return;const{trigger:r="click",skip:o="[disabled],.disabled",check:a}=i,l=s.type==="mouseover"?"hover":"click";if(!r.includes(l)||a&&!a.call(n,this,l,s)||o&&e.is(o))return;const{onGet:c,onCreate:h,setOptions:u=!0,getOptions:p,prevent:m=!0,handler:b,onToggle:w,convertHref:C}=i;let S=e.dataset();const T=e.attr(`zui-toggle-${t}`);if(T&&(S=y.extend(S,Gn(T))),C&&e.is("a")){const A=e.attr("href");if(A){const L=C===!0?{selector:"target",url:"url"}:C;"#.".includes(A[0])?L.selector&&S[L.selector]===void 0&&(S[L.selector]=A):L.url&&S[L.url]===void 0&&(S[L.url]=A)}}if(p&&(S=p.call(n,this,S,s)),b){b.call(n,this,S,l,s),m&&s.preventDefault();return}let I=c?c.call(n,this):n.get(this);if(I)u&&I.setOptions(S);else{const A=h?h.call(n,this,s,S):new n(this,S);if(!A)return;I=A}if(w){if(w.call(n,I,this,s)===!1)return}else{const{shown:A,show:L,hide:U,toggle:Y}=I;let Z;if(Y?Z=Y:L&&U?A?Z=U:Z=L:L&&(Z=L),Z)Z.call(I);else return}m&&s.preventDefault()})}function Jv(s,e){const t=Vi(s),n=[];return Object.keys(t).forEach(i=>{if(!i.startsWith("zui."))return;const r=t[i];(e==null?void 0:e(r,i))!==!1&&n.push(t[i])}),n}let Do=0;function df(s=100){if(Do&&clearTimeout(Do),s){Do=window.setTimeout(()=>df(0),s);return}Do=0,Ge.ALL.forEach(e=>{e.forEach(t=>t.autoDestroy())})}function Qv(){if(!document.body||Vi(document.body,"_autoDestoryMob"))return;const s=new MutationObserver(e=>{let t=!1;for(const n of e)if(n.removedNodes.length){t=!0;break}t&&df()});s.observe(document.body,{childList:!0,subtree:!0}),po(document.body,"_autoDestoryMob",s)}function cc(s,e){const t=y(s);t.find("[zui-create],[data-zui]").each(function(){var n;((n=e==null?void 0:e.beforeCreate)==null?void 0:n.call(e,this))!==!1&&Zv(this,e)}),t.find("[zui-init]").each(function(){this.hasAttribute("z-zui-inited")||(this.setAttribute("z-zui-inited",""),y.runJS(this.getAttribute("zui-init"),["$element",y(this)]))}),t.find(".hide-before-init").removeClass("invisible hidden opacity-0"),t.find(".scroll-into-view").scrollIntoView(),t.find('[data-on="inited"],[zui-on-inited]').each((n,i)=>{const r=y(i);r.zui()||r.trigger("inited")}),e!=null&&e.runJS&&t.runJS()}y.fn.zuiInit=function(s){return cc(this,s),this},y.fn.zui=function(s,e){const t=this[0];if(!t)return;if(typeof s!="string"){const i={};let r;return Jv(t,(o,a)=>{i[a]=o,(!r||r.gid1?t[0]:void 0,i=t[t.length>1?1:0],r=y(this).zui(n),o=r==null?void 0:r[i];typeof o=="function"&&o.apply(r,e)}),this},y(()=>{y("body").zuiInit({update:!0}),Xv(),Qv()});class To extends Ge{get $targets(){const{$element:e}=this,{targets:t}=this.options;return t?e.find(t):e}_handleScroll(e,t,n){const{offset:i=1}=this.options,r=this.$targets,o=e.getBoundingClientRect(),{scrollTop:a,scrollLeft:l}=e;r.each((c,h)=>{const u=h.getBoundingClientRect(),p=t==="top"&&a>0&&u.top<=o.top+i||t==="bottom"&&u.bottom>=o.bottom-i||t==="left"&&l>0&&u.left<=o.left+i||t==="right"&&l{this._raf&&cancelAnimationFrame(this._raf),this._raf=requestAnimationFrame(()=>{this._raf=0,this._handleScroll(l,t,i)})};this._scrollListener=c,l.addEventListener("scroll",c)}this._container=l,requestAnimationFrame(()=>{this._handleScroll(l,t,i)})}else this._ob=new IntersectionObserver(l=>{l.forEach(c=>{c.target.classList.toggle(i,c.intersectionRatiothis._ob.observe(c))}destroy(){var e;(e=this._ob)==null||e.disconnect(),this._container&&(this._container.removeEventListener("scroll",this._scrollListener),this._raf&&cancelAnimationFrame(this._raf))}}To.NAME="Sticky";const ii=24*60*60*1e3,Ze=s=>s===void 0?new Date:(s instanceof Date||(typeof s=="string"&&(s=s.trim(),/^\d+$/.test(s)&&(s=Number.parseInt(s,10))),typeof s=="number"&&s<1e10&&(s*=1e3),s=new Date(s)),s),ff=(s,e,t="day")=>{if(typeof e=="string"){const n=Number.parseInt(e,10);t=e.replace(n.toString(),""),e=n}return s=new Date(Ze(s).getTime()),t==="month"?s.setMonth(s.getMonth()+e):t==="year"?s.setFullYear(s.getFullYear()+e):t==="week"?s.setDate(s.getDate()+e*7):t==="hour"?s.setHours(s.getHours()+e):t==="minute"?s.setMinutes(s.getMinutes()+e):t==="second"?s.setSeconds(s.getSeconds()+e):s.setDate(s.getDate()+e),s},Qn=(s,e=new Date)=>Ze(s).toDateString()===Ze(e).toDateString(),Gi=(s,e=new Date)=>Ze(s).getFullYear()===Ze(e).getFullYear(),hc=(s,e=new Date)=>(s=Ze(s),e=Ze(e),s.getFullYear()===e.getFullYear()&&s.getMonth()===e.getMonth()),eb=(s,e=new Date)=>{s=Ze(s),e=Ze(e);const t=1e3*60*60*24,n=Math.floor(s.getTime()/t),i=Math.floor(e.getTime()/t);return Math.floor((n+4)/7)===Math.floor((i+4)/7)},tb=(s,e)=>Qn(Ze(e),s),nb=(s,e)=>Qn(Ze(e).getTime()-ii,s),sb=(s,e)=>Qn(Ze(e).getTime()+ii,s),uc=s=>s!=null&&!isNaN(Ze(s).getTime()),st=(s,e="yyyy-MM-dd hh:mm",t="")=>{if(s=Ze(s),!uc(s))return t;if(typeof e=="function")return e(s);const n={"M+":s.getMonth()+1,"d+":s.getDate(),"h+":s.getHours(),"H+":s.getHours()%12,"m+":s.getMinutes(),"s+":s.getSeconds(),"S+":s.getMilliseconds()};return/(y+)/i.test(e)&&(e.includes("[yyyy-]")&&(e=e.replace("[yyyy-]",Gi(s)?"":"yyyy-")),e=e.replace(RegExp.$1,`${s.getFullYear()}`.substring(4-RegExp.$1.length))),Object.keys(n).forEach(i=>{if(new RegExp(`(${i})`).test(e)){const r=`${n[i]}`;e=e.replace(RegExp.$1,RegExp.$1.length===1?r:`00${r}`.substring(r.length))}}),e},ib=(s,e,t)=>{const n={full:"yyyy-M-d",month:"M-d",day:"d",str:"{0} ~ {1}",...t},i=st(s,Gi(s)?n.month:n.full);if(Qn(s,e))return i;const r=st(e,Gi(s,e)?hc(s,e)?n.day:n.month:n.full);return n.str.replace("{0}",i).replace("{1}",r)};function dc(s){let e=0;if(typeof s!="string"&&(s=String(s)),s&&s.length)for(let t=0;t{try{a.includes("%")&&(a=decodeURIComponent(a)),a=JSON.parse(a)}catch{}return[o,a]})),params:n.map(o=>{if(o!=="undefined"){if(o==="null")return null;try{return o.includes("%")&&(o=decodeURIComponent(o)),JSON.parse(o)}catch{return o}}})}}function pf(s){if(Array.isArray(s))return{commands:s.map($o).filter(Boolean)};if(typeof s=="object")return s;s=s.replace(/^#!?/,"");const e=s.includes(">"),t=s.split(e?">":"|").map($o);return{async:e,commands:t.filter(Boolean)}}function fc(s,e,t){if(typeof s=="string"&&(s=$o(s)),!s)return;const{execute:n,event:i,scope:r}=e;if(!(r&&s.scope&&s.scope!==r))return n({name:s.name,options:{...e.options,...s.options},event:i,scope:s.scope,prevResult:t},s.params)}async function mf(s,e){const{async:t,commands:n}=pf(s);if(!n.length)return[];const{signal:i}=e;if(t){const o=[];let a;for(const l of n){if(!(i!=null&&i.aborted))break;a=await fc(l,e,a),i!=null&&i.aborted&&(a=void 0),o.push(a)}return o}return await Promise.all(n.map(o=>{if(!(i!=null&&i.aborted))return fc(o,e)}))}const ri="zui.commands",oi="z-commands",pc="zui-commands-proxy",gf="zui-command",Io={};function yf(s,e){typeof s=="string"&&e?Io[s]=e:typeof s=="object"&&Object.assign(Io,s)}function No(s,e){typeof e=="string"?e={scope:e}:typeof e=="function"&&(e={onCommand:e});const{scope:t="",events:n="click"}=e??{},i=y(s),r=(i.attr(oi)||"").split(",");t&&!r.includes(t)&&r.push(t),i.attr(oi,r.join(",")).data(ri,{[t]:{...e,scope:t,events:n,gid:kt()},...i.data(ri)})}function Eo(s,e=!0){const t=y(s);if(e===!0)t.removeAttr(oi),t.removeData(ri);else if(e.length){const n=t.data(ri)||{};e.split(",").forEach(r=>{delete n[r]});const i=Object.keys(n);i.length?t.attr(oi,i.join(",")).data(ri,No):Eo(t,!0)}}function vf(s,e){let t=s.closest(`[${oi}],[${pc}]`).first();if(t.attr(pc)!==void 0&&(t=y(t.data("zui.commandProxy")||t.attr(pc)).closest(`[${oi}]`)),!t.length)return;const n=t.data(ri)||{},i=Object.values(n).sort((o,a)=>a.gid-o.gid);let r;return e!=null&&e.length?(r=i.find(o=>o.scope===e),r||(r=i.find(o=>{var a;return!((a=o.scope)!=null&&a.length)&&!o.scoped})),r):(r=i.find(o=>{var a;return!((a=o.scope)!=null&&a.length)&&!o.scoped}),r||(r=i.find(o=>!o.scoped)),r?r.element=t[0]:r=vf(s.parent(),e),r)}function rb(s){if(!s.currentTarget)return;const e=y(s.currentTarget);if(e.closest(".disabled,[disabled]").length)return;const t=e.attr(gf)||(e.is('a[href^="#!"]')?e.attr("href"):"");if(!t)return;const n=new AbortController,i=()=>n.abort();mf(t,{signal:n.signal,execute:(r,o)=>{const{scope:a,name:l}=r,c={...r,abort:i};let h;const u=vf(e,a);if(u){c.element=u.element;const m=(u.commands?u.commands[`${a}~${l}`]||u.commands[l]:null)||u.onCommand;if(m&&(h=m(c,o),s.commandHandled))return h}const p=[c,o];if(e.trigger("command",p).trigger(`command:${a?`${l}.${a}`:l}`,p),a&&e.trigger(`command:.${a}`,p),s.commandHandled)return h;if(a==="event"){l==="stop"?s.stopPropagation():l==="prevent"?s.preventDefault():Pn(s,l,o);return}if(a!=null&&a.startsWith(".")){let m;if(a===".")m=e.closest("[z-use]").zui();else{const b=a.substring(1);m=e.closest(`[z-use-${b}]`).zui(b)}if(m)return Pn(m,l,o);console.warn(`[ZUI] Command "${l}" not found in scope "${a}".`);return}return a==="window"?Pn(window,l,o):a==="zui"?Pn(window.zui,l,o):a==="target"?Pn(e[0],l,o):a==="$target"?Pn(e,l,o):a==="$"?Pn(y,l,o):a===""&&Io[l]!==void 0?Io[l](c,o):h},event:s})}y.fn.command=function(s,e){return this.on(`command:${s}`,e)},y.fn.offCommand=function(s,e){return this.off(`command:${s}`,e)},y.fn.commands=function(s){return this.each((e,t)=>No(t,s)),this},y.fn.unbindCommands=function(s){return this.each((e,t)=>Eo(t,s)),this},y(()=>{y(document).on("click.zui.command",`[${gf}],a[href^="#!"]`,rb)});function Yi(s,e,t=!1){var i;const n=y(s);if(e!==void 0){if(typeof e=="string"&&e.length){const r=`zui-runjs-${kt()}`;n.append(`