diff --git a/VERSION b/VERSION index 563f2f6bc4..cfac36bbc5 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -15.8 +16.0.beta1 diff --git a/api/v1/entries/bugs.php b/api/v1/entries/bugs.php index 5fa3a8a862..9e6621a61d 100644 --- a/api/v1/entries/bugs.php +++ b/api/v1/entries/bugs.php @@ -39,7 +39,8 @@ class bugsEntry extends entry if($bug->status == 'active' and $bug->confirmed) $status = array('code' => 'confirmed', 'name' => $this->lang->bug->labelConfirmed); if($bug->resolution == 'postponed') $status = array('code' => 'postponed', 'name' => $this->lang->bug->labelPostponed); if(!empty($bug->delay)) $status = array('code' => 'delay', 'name' => $this->lang->bug->overdueBugs); - $bug->status = $status; + $bug->status = $status['code']; + $bug->statusName = $status['name']; $result[$bug->id] = $this->format($bug, 'activatedDate:time,openedBy:user,openedDate:time,assignedTo:user,assignedDate:time,mailto:userList,resolvedBy:user,resolvedDate:time,closedBy:user,closedDate:time,lastEditedBy:user,lastEditedDate:time,deadline:date,deleted:bool'); } @@ -53,7 +54,8 @@ class bugsEntry extends entry foreach($storyChangeds as $bugID) { $status = array('code' => 'storyChanged', 'name' => $this->lang->bug->changed); - $result[$bugID]->status = $status; + $result[$bugID]->status = $status['code']; + $result[$bugID]->statusName = $status['name']; } return $this->send(200, array('page' => $pager->pageID, 'total' => $pager->recTotal, 'limit' => $pager->recPerPage, 'bugs' => array_values($result))); diff --git a/api/v1/entries/executionbugs.php b/api/v1/entries/executionbugs.php index 0a47390a56..65a19f92f4 100644 --- a/api/v1/entries/executionbugs.php +++ b/api/v1/entries/executionbugs.php @@ -39,7 +39,8 @@ class executionBugsEntry extends entry if($bug->status == 'active' and $bug->confirmed) $status = array('code' => 'confirmed', 'name' => $this->lang->bug->labelConfirmed); if($bug->resolution == 'postponed') $status = array('code' => 'postponed', 'name' => $this->lang->bug->labelPostponed); if(!empty($bug->delay)) $status = array('code' => 'delay', 'name' => $this->lang->bug->overdueBugs); - $bug->status = $status; + $bug->status = $status['code']; + $bug->statusName = $status['name']; $result[$bug->id] = $this->format($bug, 'activatedDate:time,openedDate:time,assignedDate:time,resolvedDate:time,closedDate:time,lastEditedDate:time,deadline:date,deleted:bool'); } @@ -53,7 +54,8 @@ class executionBugsEntry extends entry foreach($storyChangeds as $bugID) { $status = array('code' => 'storyChanged', 'name' => $this->lang->bug->changed); - $result[$bugID]->status = $status; + $result[$bugID]->status = $status['code']; + $result[$bugID]->statusName = $status['name']; } return $this->send(200, array('page' => $pager->pageID, 'total' => $pager->recTotal, 'limit' => $pager->recPerPage, 'bugs' => array_values($result))); diff --git a/api/v1/entries/executioncases.php b/api/v1/entries/executioncases.php index fbdd958a41..8cef23bee0 100644 --- a/api/v1/entries/executioncases.php +++ b/api/v1/entries/executioncases.php @@ -35,7 +35,7 @@ class executionCasesEntry extends entry $result = array(); foreach($cases as $case) { - $case->status = array('code' => $case->status, 'name' => $this->lang->testcase->statusList[$case->status]); + $case->statusName = 'name' => $this->lang->testcase->statusList[$case->status]; $result[] = $this->format($case, 'openedDate:time,reviewedDate:date,lastEditedDate:time,lastRunDate:time'); } diff --git a/api/v1/entries/projectbugs.php b/api/v1/entries/projectbugs.php index c0fd1ce86e..7468563e61 100644 --- a/api/v1/entries/projectbugs.php +++ b/api/v1/entries/projectbugs.php @@ -39,7 +39,8 @@ class projectBugsEntry extends entry if($bug->status == 'active' and $bug->confirmed) $status = array('code' => 'confirmed', 'name' => $this->lang->bug->labelConfirmed); if($bug->resolution == 'postponed') $status = array('code' => 'postponed', 'name' => $this->lang->bug->labelPostponed); if(!empty($bug->delay)) $status = array('code' => 'delay', 'name' => $this->lang->bug->overdueBugs); - $bug->status = $status; + $bug->status = $status['code']; + $bug->statusName = $status['name']; $result[$bug->id] = $this->format($bug, 'activatedDate:time,openedDate:time,assignedDate:time,resolvedDate:time,closedDate:time,lastEditedDate:time,deadline:date,deleted:bool'); } @@ -53,7 +54,8 @@ class projectBugsEntry extends entry foreach($storyChangeds as $bugID) { $status = array('code' => 'storyChanged', 'name' => $this->lang->bug->changed); - $result[$bugID]->status = $status; + $result[$bugID]->status = $status['code']; + $result[$bugID]->statusName = $status['name']; } return $this->send(200, array('page' => $pager->pageID, 'total' => $pager->recTotal, 'limit' => $pager->recPerPage, 'bugs' => array_values($result))); diff --git a/api/v1/entries/projectcases.php b/api/v1/entries/projectcases.php index e96f69196a..d237ce1b6e 100644 --- a/api/v1/entries/projectcases.php +++ b/api/v1/entries/projectcases.php @@ -38,7 +38,7 @@ class projectCasesEntry extends entry $result = array(); foreach($cases as $case) { - $case->status = array('code' => $case->status, 'name' => $this->lang->testcase->statusList[$case->status]); + $case->statusName = $this->lang->testcase->statusList[$case->status]; $result[] = $this->format($case, 'openedDate:time,reviewedDate:date,lastEditedDate:time,lastRunDate:time'); } diff --git a/api/v1/entries/user.php b/api/v1/entries/user.php index 0630c3ca98..0201193876 100644 --- a/api/v1/entries/user.php +++ b/api/v1/entries/user.php @@ -221,7 +221,8 @@ class userEntry extends Entry if($bug->status == 'active' and $bug->confirmed) $status = array('code' => 'confirmed', 'name' => $this->lang->bug->labelConfirmed); if($bug->resolution == 'postponed') $status = array('code' => 'postponed', 'name' => $this->lang->bug->labelPostponed); if(!empty($bug->delay)) $status = array('code' => 'delay', 'name' => $this->lang->bug->overdueBugs); - $bug->status = $status; + $bug->status = $status['code']; + $bug->statusName = $status['name']; $bugs[$bug->id] = $bug; } @@ -235,7 +236,8 @@ class userEntry extends Entry foreach($storyChangeds as $bugID) { $status = array('code' => 'storyChanged', 'name' => $this->lang->bug->changed); - $bugs[$bugID]->status = $status; + $bugs[$bugID]->status = $status['code']; + $bugs[$bugID]->statusName = $status['name']; } $info->bug['total'] = $data->data->pager->recTotal; @@ -271,7 +273,7 @@ class userEntry extends Entry $stories = array(); foreach($data->data->stories as $story) { - $story->status = array('code' => $story->status, 'name' => $this->lang->story->statusList[$story->status]); + $story->statusName = $this->lang->story->statusList[$story->status]; $stories[$story->id] = $story; } diff --git a/config/config.php b/config/config.php index 07a836a83c..89e8e1e0b8 100644 --- a/config/config.php +++ b/config/config.php @@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}} if(!function_exists('getWebRoot')){function getWebRoot(){}} /* 基本设置。Basic settings. */ -$config->version = '15.8'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it. +$config->version = '16.0.beta1'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it. $config->charset = 'UTF-8'; // ZenTaoPHP的编码。 The encoding of ZenTaoPHP. $config->cookieLife = time() + 2592000; // Cookie的生存时间。The cookie life time. $config->timezone = 'Asia/Shanghai'; // 时区设置。 The time zone setting, for more see http://www.php.net/manual/en/timezones.php. diff --git a/db/zentao.sql b/db/zentao.sql index d05177fe58..626398945f 100644 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -653,7 +653,7 @@ CREATE TABLE IF NOT EXISTS `zt_kanbanlane` ( `name` varchar(255) NOT NULL DEFAULT '', `color` char(30) NOT NULL, `order` smallint(6) NOT NULL DEFAULT '0', - `lastEditedDate` datetime NOT NULL, + `lastEditedTime` datetime NOT NULL, `deleted` enum('0','1') NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; diff --git a/doc/CHANGELOG b/doc/CHANGELOG index 04b9c75f2c..a1410a5242 100644 --- a/doc/CHANGELOG +++ b/doc/CHANGELOG @@ -1,73 +1,189 @@ -2021-11-19 15.8 +2021-12-06 16.0.beat1 完成的需求 -28965 实现分支的新增/编辑操作 -28941 重新登陆系统后产品下拉菜单应当保持上次选中的产品名称 -28932 实现分支的批量操作 -28931 调整分支管理功能 -28904 优化项目列表“我参与的”筛选结果 -28833 创建执行页面可以直接维护相关负责人信息 -28819 调整项目集/产品/项目/执行重名规则 -28510 项目列表中增加项目代号字段显示 -28509 项目概况中增加项目代号的显示 -28466 测试Bug列表中增加按所属项目的搜索条件 -28138 员工负载表中增加项目名称信息 -28131 待处理任务列表中子任务名称前显示父任务 -28098 需求批量转任务时对已经转换过任务的需求进行提示 -25673 分支增加排序功能 -25670 多分支产品浏览需求的时候将所有和主干区分开 -25667 将所有分支概念改为主干并处理历史数据 -25666 可以将某一个分支关闭 -25665 梳理项目和执行关联产品分支的逻辑 -15478 我的地盘bug列表增加确认字段 -14877 根据分支提示上次版本计划名称 -14778 分支设置默认分支功能 -14772 需求修改所属分支时如果有冲突给出提示 -14771 启用多分支功能后增加分支字样显示的控制 -14761 选择某一个分支之后点击其他菜单希望能够保持分支下拉菜单状态 -14005 能够按照平台分支浏览用户需求 -29147 产品下软件需求列表需求名称前显示主干的分支名 -29145 项目和执行关联了产品的多个分支及计划时调整概况页面显示方式 -29144 所有分支下批量编辑需求/BUG/用例,所属模块数据默认为所有分支的模块时,需要处理分支与模块不一致的问题 -29143 批量创建需求/BUG/用例时所属模块选择同上,需要检测上一行数据的所属分支和当前行的所属分支是否一致 -29142 启用多分支功能后要Bug增加分支字样显示的控制 -29141 启用多分支功能后要用例增加分支字样显示的控制 -29059 多分支产品批量创建需求时分支字段设为默认项 -28974 产品列表批量调整计划时在计划名称前显示分支信息 -28973 提交Bug时分支与影响版本要跟着联动 -28972 产品列表左侧的模块设置调整为显示设置 -28310 未开始的项目集有项目开始的时候自动将项目集状态设置为开始 -28309 未开始的项目有执行开始的时候自动将项目状态设置为开始 -28308 未开始的执行有任务开始的时候自动将执行状态设置为开始 +14005 能够按照平台分支浏览用户需求 +14429 父需求支持变更 +14761 选择某一个分支之后点击其他菜单希望能够保持分支下拉菜单状态 +14771 启用多分支功能后增加分支字样显示的控制 +14772 需求修改所属分支时如果有冲突给出提示 +14778 分支设置默认分支功能 +14877 根据分支提示上次版本计划名称 +15134 员工负载表增加备注说明 +15470 看板可以设置一个单元格里面卡片的排列方式 +15478 我的地盘bug列表增加确认字段 +25665 梳理项目和执行关联产品分支的逻辑 +25666 可以将某一个分支关闭 +25667 将所有分支概念改为主干并处理历史数据 +25670 多分支产品浏览需求的时候将所有和主干区分开 +25673 分支增加排序功能 +27484 文档库右侧目录增加文件的浮动操作菜单 +27485 文档库右侧目录增加目录的浮动操作菜单 +27486 wiki目录中,当鼠标悬浮到文章名称时展示文章快捷操作 +27487 wiki目录中,鼠标悬浮到具体章节时展示章节的快捷操作 +27927 执行看板默认只显示一屏滚动时再往下加载 +28098 需求批量转任务时对已经转换过任务的需求进行提示 +28131 待处理任务列表中子任务名称前显示父任务 +28138 员工负载表中增加项目名称信息 +28147 统计列表中具备横向滚动条的列表可以直接展示出来 +28153 Bug创建表中优化执行查询条件 +28235 关闭项目时增加实际完成日期的记录 +28236 项目工时统计中增加实际开始和实际完成的信息 +28237 执行启动时增加实际开始日期的记录 +28238 关闭执行时增加实际完成日期的记录 +28239 执行工时统计中增加实际开始和实际完成的信息 +28310 未开始的项目 +28466 测试Bug列表中增加按所属项目的搜索条件 +28509 项目概况中增加项目代号的显示 +28510 项目列表中增加项目代号字段显示 +28719 项目看板中看板列显示数量汇总 +28727 计划创建迭代时选择项目点击下一步后自动关闭选择弹窗 +28809 执行看板中进行中项目排序规则调整 +28810 执行看板中已关闭的执行只展示最近2期数据 +28811 执行看板中执行支持拖动调整看板列和状态 +28811 执行看板中执行支持拖动调整看板列和状态 +28812 项目看板中调整项目集和项目的排序规则 +28813 项目看板中已关闭的项目只展示最近2个数据 +28814 项目看板中项目支持拖动调整看板列和状态 +28814 项目看板中项目支持拖动调整看板列和状态 +28815 产品看板中看板列显示数量汇总 +28816 产品看板中调整项目集和产品的排序规则 +28817 项目集看板中调整项目集和产品的排序规则 +28818 项目集看板中看板列显示数量汇总 +28819 调整项目集/产品/项目/执行重名规则 +28833 创建执行页面可以直接维护相关负责人信息 +28834 项目的分组权限中移除无用的模块和方法 +28835 关联多个产品的项目也可以选择归并方式 +28904 优化项目列表“我参与的”筛选结果 结 +28928 可以设置哪些人不需要提醒 +28929 编辑bug修改状态时如果未修改成功希望有错误提示 +28931 调整分支管理功能 +28932 实现分支的批量操作 +28941 重新登陆系统后产品下拉菜单应当保持上次选中的产品名称 +28944 在开源版中增加瀑布模型的相关功能 +28959 老版本升级新版本数据归并的时候,可以修改项目、执行名称。 +28960 调整产品列表页面的宽度展示比例 +28965 实现分支的新增/编辑操作 +28970 需求列表批量选中希望可以通过shift快捷键操作 +28972 产品列表左侧的模块设置调整为显示设置 +28973 提交Bug时分支与影响版本要跟着联动 +28974 产品列表批量调整计划时在计划名称前显示分支信息 +28993 创建或者编辑用例时调整所属需求的查询逻辑 +29000 产品列表中调整字段显示宽度 +29002 动态支持按正序/倒序切换排序 +29030 已挂起的项目/执行下面的任务不在待办/待处理的任务中展示 +29059 多分支产品批量创建需求时分支字段设为默认项 +29069 组织团队成员任务列表增加优先级排序功能 +29074 用户下拉菜单中增加人员的头像/部门/职位信息 +29108 提交/编辑软件需求页面中增加反馈者和通知邮箱信息 +29109 提交/编辑Bug页面中增加反馈者和通知邮箱信息 +29116 创建/编辑发布信息的通知人员中增加反馈者 +29127 计划的Bug列表中增加批量编辑和调整计划功能 +29131 产品概况中增加评审人员的设置 +29134 看板页面的刷新不要抖动用更加平滑的方式呈现 +29141 启用多分支功能后要用例增加分支字样显示的控制 +29142 启用多分支功能后要Bug增加分支字样显示的控制 +29143 批量创建需求/BUG/用例时所属模块选择同上,需要检测上一行数据的所属分支和当前行的所属分支是否一致 +29144 所有分支下批量编辑需求/BUG/用例,所属模块数据默认为所有分支的模块时,需要处理分支与模块不一致的问题 +29145 项目和执行关联了产品的多个分支及计划时调整概况页面显示方式 +29147 产品下软件需求列表需求名称前显示主干的分支名 +29156 启用多分支功能后项目需求列表增加是否显示分支名 +29157 启用多分支功能后执行需求列表增加是否显示分支名 +29158 启用多分支功能后执行任务列表增加是否显示分支名 +29166 需求调整分支时,需求所属模块为主干的不用清空所属模块 +29167 Bug调整分支时所属模块为主干的不用清空所属模块 +29168 用例调整分支时所属模块为主干的不用清空所属模块 +29173 项目关联产品计划时不允许关联父计划 +29174 执行关联产品计划时不允许关联父计划 +29182 分支下拉菜单中显示已关闭的分支状态 +29192 归并数据遇到重名数据时可修改重名的数据 +29193 调整发布中消息通知的触发方式 +29218 分支的状态全部为关闭时才能调整产品类型为正常 +29234 梳理分支逻辑 +29438 在执行1下创建测试用例在执行2用例列表中也能看到 修复的BUG -15826 后台评审流程开启后产品中批量创建研发需求没有默认需要评审 -15798 报告导出之后不展示饼状图 -15780 更改项目集的父项目集时,下面的产品线不能变更到顶层项目集 -15695 建用例,有默认所属模块可选择所有需求 -15694 执行下创建用例,可以选择产品所有的模块和需求 -15693 卡片展示项目时,项目状态显示不正确 -15691 套件的用例列表右上角的操作按钮样式不一致 -15690 切换产品后,新建用例未显示在用例列表中 -15689 测试单的报表百分比换行 -15688 新建用例,模块和需求对应错误 -15687 自定义任务优先级展示问题 -15686 创建项目填充数据后,再选择项目集数据被清空 -15665 维护目录和版本管理前的icon图标一样 -12023 产品下分支页面建议优化 -11290 邮件列表中主题字段内容部分遮挡 -16302 项目软件需求下搜索下拉列中所属分支显示为%s -16257 创建执行的时候已经关闭的项目仍然可以选择 -16139 设为分支为默认分支icon没有显示完全 -16130 项目下创建测试用例时相关需求列出的数据不对 -16018 项目-测试-BUG界面提交BUG不显示多分支/平台 -16000 执行测试用例下用例标题换行显示 -15828 项目集列表中删除顶级项目,跳转错误 -15781 项目创建版本时选择不到产品分支 -15675 版本下解决又激活的bug,重新解决的时候,应该带有之前版本信息 -14101 青春蓝-引导页国际版配图为中文 -13756 提bug页面没有正常显示所属产品分支的控件 -6978 多分支产品bug搜索影响版本不太清晰 6917 用例转bug编号会变化 - +6978 多分支产品bug搜索影响版本不太清晰 +11290 邮件列表中主题字段内容部分遮挡 +12023 产品下分支页面建议优化 +13756 提bug页面没有正常显示所属产品分支的控件 +14101 青春蓝-引导页国际版配图为中文 +15665 维护目录和版本管理前的icon图标一样 +15675 版本下解决又激活的bug,重新解决的时候,应该带有之前版本信息 +15675 版本下解决又激活的bug,重新解决的时候,应该带有之前版本信息 +15686 创建项目填充数据后,再选择项目集数据被清空 +15687 自定义任务优先级展示问题 +15688 新建用例,模块和需求对应错误 +15689 测试单的报表百分比换行 +15690 切换产品后,新建用例未显示在用例列表中 +15691 套件的用例列表右上角的操作按钮样式不一致 +15693 卡片展示项目时,项目状态显示不正确 +15694 执行下创建用例,可以选择产品所有的模块和需求 +15695 建用例,有默认所属模块可选择所有需求 +15737 统计视图无法通过权限控制取消 +15780 更改项目集的父项目集时,下面的产品线不能变更到顶层项目集 +15781 项目创建版本时选择不到产品分支 +15798 报告导出之后不展示饼状图 +15826 后台评审流程开启后产品中批量创建研发需求没有默认需要评审 +15828 项目集列表中删除顶级项目,跳转错误 +16000 执行测试用例下用例标题换行显示 +16018 项目-测试-BUG界面提交BUG不显示多分支/平台 +16130 项目下创建测试用例时相关需求列出的数据不对 +16139 设为分支为默认分支icon没有显示完全 +16257 创建执行的时候已经关闭的项目仍然可以选择 +16302 项目软件需求下搜索下拉列中所属分支显示为%s +16527 批量编辑用例时,列出了所有分支 +16567 多分支产品的任务名称前主干分支名称显示其他分支名称不显示 +16570 经典模式多分支产品批量提bug时标题未填写点击保存没做提示 +16573 经典模式多分支产品批量创建用例未填写用例标题保存直接跳转列表没做提示 +16574 关联产品页面已关联产品可以下拉选择其他未关联的分支 +16582 分支1版本可以关联其他分支需求 +16583 批量编辑测试用例分支显示错误导致无法选择模块 +16584 执行版本不能按照所属分支搜索 +16585 主干版本前未显示主干标识 +16587 需求编辑页面所处阶段处分支展示方式建议优化 +16588 项目/执行下显示了未关联的分支需求 +16589 多分支产品测试用例列表用例类型展示有遮挡 +16591 批量编辑研发需求修改分支后再修改回去计划没有随之联动 +16592 多分支产品项目的研发需求模块展示不对 +16593 测试下Bug页面中左侧模块树默认高亮了主干 +16603 项目列表中项目名称显示不全 +16605 项目的用例下显示了所有的分支 +16608 编辑模块页面选择分支后上级模块列出的还是主干模块 +16609 导出用例的模板显示了所有分支 +16612 用例模板没显示分支下的模块 +16616 导入用例分支下拉列表显示了所有分支 +16620 研发需求变动列表一条用例显示多次 +16621 搜索用例时,所属分支列出了所有分支 +16622 产品下研发需求页搜索的所属模块下拉只列出了主干下的模块 +16623 多分支产品关闭的分支在项目关联产品的时候仍然显示 +16624 产品详情页中左上角产品下拉菜单中无当前产品选项 +16626 测试套件中不显示其他分支模块只显示主干模块 +16631 套件的用例名称前不显示主干 +16637 测试单关联用例列表,用例列表显示分支标识 +16639 测试用例详情页指派给用户显示数字 +16640 测试单的优先级显示为0 +16641 地盘待处理下用例批量编辑页面相关研发需求未带出 +16643 地盘下批量编辑任务页面“贡献”菜单位置显示不对 +16645 创建Gitlab动态没有链接地址 +16646 文档的产品库中产品显示错误 +16647 测试单生成报告提示没有关联的非Trunk测试单 +16648 项目列表中项目名称完全折叠隐藏 +16650 多分支产品测试套件详情所属模块只展示主干模块 +16653 发布可以关联所有分支的需求 +16676 地盘待处理下批量执行用例页面有代码报错 +16680 产品库创建文档时所属文档库下拉无法选择其他产品库 +16681 导入用例库测试用例分支和模块不对应 +16682 地盘贡献下复制用例页面有代码报错 +16683 测试单关联测试用例不能选择主干 +16684 套件中用例标题的主干分支不显示 +16685 测试单关联测试用例分支=空搜索到的数据为主干的测试用例 +16689 测试单用例列表不显示测试用例相关模块 +16690 产品下需求批量编辑页面计划显示不对 +16692 项目下软件需求批量编辑页面分支显示不对 +16694 提交测试的测试单不应该受左上角选择分支影响 +16697 测试单关联测试用例选择所属分支应该只能选择版本关联的分支 +16700 项目创建发布选择版本后产品分支会消失 +16708 批量编辑多分支产品的研发需求报错 +16713 产品需求模块中主干模块直接显示不用增加层级 2021-11-02 15.7.1 修复的BUG 15835 创建产品选择产品线选中样式不对 diff --git a/module/action/lang/de.php b/module/action/lang/de.php index e7f2ca54bf..f1efa44c41 100644 --- a/module/action/lang/de.php +++ b/module/action/lang/de.php @@ -9,18 +9,29 @@ * @version $Id: de.php 4729 2013-05-03 07:53:55Z chencongzhi520@gmail.com $ * @link http://www.zentao.net */ -$lang->action->common = 'Log'; -$lang->action->product = $lang->productCommon; -$lang->action->project = 'Project'; -$lang->action->execution = $lang->execution->common; -$lang->action->objectType = 'Object Type'; -$lang->action->objectID = 'ID'; -$lang->action->objectName = 'Objekt Name'; -$lang->action->actor = 'Handler'; -$lang->action->action = 'Aktion'; -$lang->action->actionID = 'Aktion ID'; -$lang->action->date = 'Datum'; -$lang->action->extra = 'Wertschöpfung'; +global $config; + +$lang->action->common = 'Log'; +$lang->action->id = 'ID'; +$lang->action->product = $lang->productCommon; +$lang->action->project = 'Project'; +$lang->action->execution = $lang->execution->common; +$lang->action->objectType = 'Object Type'; +$lang->action->objectID = 'ID'; +$lang->action->objectName = 'Objekt Name'; +$lang->action->actor = 'Handler'; +$lang->action->action = 'Aktion'; +$lang->action->actionID = 'Aktion ID'; +$lang->action->date = 'Datum'; +$lang->action->extra = 'Wertschöpfung'; +$lang->action->system = 'System'; +$lang->action->url = 'URL'; +$lang->action->contentType = 'Content Type'; +$lang->action->data = 'Data'; +$lang->action->result = 'Result'; +$lang->action->modified = 'Modified'; +$lang->action->old = 'Old'; +$lang->action->new = 'New'; $lang->action->trash = 'Aufräumen'; $lang->action->undelete = 'Wiederherstellen'; diff --git a/module/action/lang/en.php b/module/action/lang/en.php index d5f0fd0622..d30f55cafa 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -29,6 +29,9 @@ $lang->action->url = 'URL'; $lang->action->contentType = 'Content Type'; $lang->action->data = 'Data'; $lang->action->result = 'Result'; +$lang->action->modified = 'Modified'; +$lang->action->old = 'Old'; +$lang->action->new = 'New'; $lang->action->trash = 'Recycle'; $lang->action->undelete = 'Restore'; @@ -295,6 +298,8 @@ $lang->action->label->startProgram = '(The start of the project sets th $lang->action->label->createmr = 'Merge Request Linked'; $lang->action->label->deletemr = 'Merge Request Unlinked'; $lang->action->label->mergedmr = 'Merge Request Merged'; +$lang->action->label->compilepass = 'Compile Success'; +$lang->action->label->compilefail = 'Compile Fail'; $lang->action->label->reopen = 'Reopen'; $lang->action->label->approve = 'Passed'; $lang->action->label->reject = 'Rejected'; diff --git a/module/branch/view/ajaxgetdropmenu.html.php b/module/branch/view/ajaxgetdropmenu.html.php index e31ed3807b..472398d74c 100644 --- a/module/branch/view/ajaxgetdropmenu.html.php +++ b/module/branch/view/ajaxgetdropmenu.html.php @@ -13,11 +13,11 @@ foreach($branches as $branchID => $branch) if($branchID == 'all' or empty($branchID) or $statusList[$branchID] == 'active') { - $activeBranchesHtml .= html::a($linkHtml, $branch, '', "class='$selected' data-key='{$branchesPinyin[$branch]}'"); + $activeBranchesHtml .= html::a($linkHtml, $branch, '', "class='$selected' data-key='{$branchesPinyin[$branch]}' data-app='{$this->app->tab}'"); } else { - $closedBranchesHtml .= html::a($linkHtml, $branch, '', "class='$selected' data-key='{$branchesPinyin[$branch]}'"); + $closedBranchesHtml .= html::a($linkHtml, $branch, '', "class='$selected' data-key='{$branchesPinyin[$branch]}' data-app='{$this->app->tab}'"); } } ?> diff --git a/module/bug/lang/en.php b/module/bug/lang/en.php index 902709a2f4..52773b0205 100644 --- a/module/bug/lang/en.php +++ b/module/bug/lang/en.php @@ -186,6 +186,7 @@ $lang->bug->legendComment = 'Note'; $lang->bug->legendLife = 'Bug Life'; $lang->bug->legendMisc = 'Misc.'; $lang->bug->legendRelated = 'Related Info'; +$lang->bug->legendThisWeekCreated = 'This Week Created'; /* Button. */ $lang->bug->buttonConfirm = 'Confirm'; @@ -280,6 +281,7 @@ $lang->bug->statusList['active'] = 'Active'; $lang->bug->statusList['resolved'] = 'Resolved'; $lang->bug->statusList['closed'] = 'Closed'; +$lang->bug->confirmedList[''] = ''; $lang->bug->confirmedList[1] = 'Yes'; $lang->bug->confirmedList[0] = 'No'; diff --git a/module/bug/view/batchcreate.html.php b/module/bug/view/batchcreate.html.php index b5aff4f206..1554c6333e 100644 --- a/module/bug/view/batchcreate.html.php +++ b/module/bug/view/batchcreate.html.php @@ -15,7 +15,6 @@

bug->batchCreate;?> - session->currentProductType !== 'normal' and $branch !== 'all') echo '' . $branches[$branch] . '';?>

createLink('file', 'uploadImages', 'module=bug¶ms=' . helper::safe64Encode("productID=$productID&executionID=$executionID&moduleID=$moduleID")), $lang->uploadImages, '', "data-toggle='modal' data-type='iframe' class='btn btn-primary' data-width='70%'")?> diff --git a/module/build/model.php b/module/build/model.php index b5176147c5..fe46c08ec1 100644 --- a/module/build/model.php +++ b/module/build/model.php @@ -78,15 +78,15 @@ class buildModel extends model /** * Get builds of a project in pairs. * - * @param int $projectID - * @param int $productID - * @param int $branch - * @param string $params noempty|notrunk, can be a set of them - * @param int $buildID + * @param int $projectID + * @param int $productID + * @param int|string $branch + * @param string $params noempty|notrunk|nodone|noterminate, can be a set of them + * @param int $buildID * @access public * @return array */ - public function getProjectBuildPairs($projectID, $productID, $branch = 0, $params = '', $buildID = 0) + public function getProjectBuildPairs($projectID, $productID, $branch = 'all', $params = '', $buildID = 0) { $sysBuilds = array(); $selectedBuilds = array(); @@ -100,7 +100,7 @@ class buildModel extends model ->leftJoin(TABLE_BRANCH)->alias('t4')->on('t1.branch = t4.id') ->where('t1.project')->eq((int)$projectID) ->beginIF($productID)->andWhere('t1.product')->eq((int)$productID)->fi() - ->beginIF($branch)->andWhere('t1.branch')->in("0,$branch")->fi() + ->beginIF($branch !== 'all')->andWhere('t1.branch')->eq($branch)->fi() ->andWhere('t1.deleted')->eq(0) ->orderBy('t1.date desc, t1.id desc')->fetchAll('id'); diff --git a/module/caselib/css/createcase.css b/module/caselib/css/createcase.css index ff92b8cd36..bc54a9a26d 100644 --- a/module/caselib/css/createcase.css +++ b/module/caselib/css/createcase.css @@ -4,11 +4,11 @@ #steps .btn-group .btn {padding-left: 0; padding-right: 0; min-width: 30px;} .step-actions {width: 100px;} #steps .active td {transition: background-color .5s;} -#steps .step-group .step-steps {resize: none; max-height: 30px;} -#steps .step-group .step-expects {display: none;} +#steps .step-steps {resize: none; max-height: 30px;} +#steps .step-expects {display: none;} #steps .step-item .step-item-id {display: table-cell; min-width: 40px;} #steps .step-item .step-id {color: transparent;} -#steps .step-group .step-id {font-weight: bold;} +#steps .step-id {font-weight: bold;} #steps .step-actions {width: 90px; text-align: center;} #steps .btn-step-move {cursor: move;} @@ -19,7 +19,6 @@ #steps.sortable-sorting > tr.drag-row + tr > td {box-shadow: inset 0 4px 2px rgba(0,0,0,.2);} #steps.sortable-sorting > tr.drag-row > td {background-color: #edf3fe !important;} #steps.sortable > tr.drop-success > td {background-color: #cfe0ff; transition: background-color 2s;} -#steps .step-type-toggle {padding: 0;} #steps .step-type-menu-box {position: relative;} #steps .step-type-menu {position: absolute; top: 25px; right: 0; z-index: 10; box-shadow: 0 6px 12px rgba(0,0,0,.175); background-color: #fff; display: none; border: 1px solid #bbb; min-width: 60px;} #steps .step-step[data-type="item"] .step-type-menu > a[data-value="item"] {display: none;} diff --git a/module/caselib/js/createcase.js b/module/caselib/js/createcase.js index af418f5064..d4a5019d54 100644 --- a/module/caselib/js/createcase.js +++ b/module/caselib/js/createcase.js @@ -19,64 +19,70 @@ function loadLibModules(libID) */ function initSteps(selector) { + /* Auto adjust textarea height. */ + $('textarea.autosize').each(function() + { + $.autoResizeTextarea(this); + }); + var $steps = $(selector || '#steps'); var $stepTemplate = $('#stepTemplate').detach().removeClass('template').attr('id', null); - var initSortableCallTask = null; var groupNameText = $steps.data('groupName'); - var insertStepRow = function($row, count, type) + var insertStepRow = function($row, count, type, notFocus) { if(count === undefined) count = 1; + var $step; for(var i = 0; i < count; ++i) { - var $step = $stepTemplate.clone(); + $step = $stepTemplate.clone(); if($row) $row.after($step); - else $steps.append($step); + if(!$row) $steps.append($step); $step.addClass('step-new'); - setTimeout(function(){$step.find('.step-steps').focus();}, 10); + if(type) $step.find('.step-type').val(type); } + if(!notFocus && $step) setTimeout(function(){$step.find('.step-steps').focus();}, 10); }; var updateStepType = function($step, type) { var targetIsGroup = type =='group'; - $step.attr('data-type', type).find('.step-steps').toggleClass('autosize', !targetIsGroup).attr('placeholder', targetIsGroup ? groupNameText : null).focus(); - - var displayType = (type =='item' && $step.hasClass('step-step')) ? 'step' : type; - - var activeTypeText = $step.find('.step-type-menu > a').removeClass('active').filter('[data-value="' + displayType + '"]').addClass('active').text(); - $step.find('.step-type-current > span').text(activeTypeText); + $step.attr('data-type', type).find('.step-steps').addClass('autosize').attr('placeholder', targetIsGroup ? groupNameText : null); }; - var refreshSteps = function() + var getStepsElements = function() + { + return $steps.children('.step:not(.drag-shadow)'); + }; + var refreshSteps = function(skipAutoAddStep) { var parentId = 1, childId = 0; - $steps.children('.step:not(.drag-shadow)').each(function(idx) + getStepsElements().each(function(idx) { - var $step = $(this); + var $step = $(this).attr('data-index', idx + 1); var type = $step.find('.step-type').val(); var stepID; if(type == 'group') { - $step.removeClass('step-item step-step').addClass('step-group'); + $step.removeClass('step-item').removeClass('step-step').addClass('step-group'); stepID = parentId++; $step.find('.step-id').text(stepID); childId = 1; } else if(type == 'step') { - $step.removeClass('step-item step-group').addClass('step-step'); + $step.removeClass('step-item').removeClass('step-group').addClass('step-step'); stepID = parentId++; $step.find('.step-id').text(stepID); childId = 0; } - else + else // step type is not set { - if(childId) // as child + if(childId) // type as child { stepID = (parentId - 1) + '.' + (childId++); - $step.removeClass('step-step step-group').addClass('step-item').find('.step-item-id').text(stepID); + $step.removeClass('step-step').removeClass('step-group').addClass('step-item').find('.step-item-id').text(stepID); } - else + else // type as step { - $step.removeClass('step-item step-group').addClass('step-step'); + $step.removeClass('step-item').removeClass('step-group').addClass('step-step'); stepID = parentId++; $step.find('.step-id').text(stepID); } @@ -87,6 +93,25 @@ function initSteps(selector) updateStepType($step, type); }); + + /* Auto insert step to group without any steps */ + if(!skipAutoAddStep) + { + var needRefresh = false; + getStepsElements().each(function(idx) + { + var $step = $(this).attr('data-index', idx + 1); + if($step.attr('data-type') !== 'group') return; + var $nextStep = $step.next('.step:not(.drag-shadow)'); + if(!$nextStep.length || $nextStep.attr('data-type') !== 'item') + { + insertStepRow($step, 1, 'item', true); + needRefresh = true; + } + }); + + if(needRefresh) refreshSteps(true); + } }; var initSortable = function() { @@ -110,7 +135,7 @@ function initSteps(selector) { if(!isMouseDown) return; var $targetStep = $(this); - $steps.children('.step').each(function(idx) + getStepsElements().each(function(idx) { $(this).data('order', idx); }); @@ -133,14 +158,47 @@ function initSteps(selector) refreshSteps(); }).on('click', '.btn-step-delete', function() { - if($('tbody#steps tr.step').size() == 1) return false; + if($steps.children('.step').length == 1) return; $(this).closest('.step').remove(); refreshSteps(); - }).on('click', '.step-type-menu a', function() + }).on('change', '.step-group-toggle', function() { - var $a = $(this); - $a.closest('.step').find('.step-type').val($a.data('value')); + var $checkbox = $(this); + var $step = $checkbox.closest('.step'); + var isChecked = $checkbox.is(':checked'); + var suggestType = isChecked ? 'group' : 'item'; + if(!isChecked) + { + var $prevStep = $step.prev('.step:not(.drag-shadow)'); + var suggestChild = $prevStep.length && $prevStep.is('.step-group') && $step.next('.step:not(.drag-shadow)').length; + suggestType = suggestChild ? 'item' : 'step'; + } + $step.find('.step-type').val(suggestType); + + /* Auto insert step to group without any steps */ + if(suggestType === 'group') + { + var $nextStep = $step.next('.step:not(.drag-shadow)'); + if(!$nextStep.length || $nextStep.find('.step-type').val() !== 'item') + { + insertStepRow($step, 1, 'item', true); + } + } + refreshSteps(); + }).on('change', '.form-control', function() + { + var $control = $(this); + if($control.val()) + { + var $step = $control.closest('.step'); + if($step.data('index') === getStepsElements().length) + { + insertStepRow($step, 1, 'step', true); + if($step.is('.step-item,.step-group')) insertStepRow($step, 1, 'item', true); + refreshSteps(); + } + } }); initSortable(); refreshSteps(); diff --git a/module/caselib/view/createcase.html.php b/module/caselib/view/createcase.html.php index 0e83d94e66..864d900ff1 100644 --- a/module/caselib/view/createcase.html.php +++ b/module/caselib/view/createcase.html.php @@ -26,184 +26,176 @@
- - - - - - - - - - - - - - - + + + - - - - - - - - + + + + + + + + + + + diff --git a/module/common/lang/en.php b/module/common/lang/en.php index e2e937bfb1..3df8b20a9c 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -108,6 +108,10 @@ $lang->customMenu = 'Custom Menu'; $lang->customField = 'Custom Field'; $lang->lineNumber = 'Line No.'; $lang->tutorialConfirm = 'You are using ZenTao tutorial. Do you want to quit right now?'; +$lang->levelExceeded = 'The level has exceeded the display range. For more information, please go to the web page or view it through search.'; + +$lang->serviceAgreement = "Service Agreement"; +$lang->privacyPolicy = "Privacy Policy"; $lang->preShortcutKey = '[Shortcut:←]'; $lang->nextShortcutKey = '[Shortcut:→]'; diff --git a/module/common/view/kanban.html.php b/module/common/view/kanban.html.php index 24f9a91645..449585b97e 100644 --- a/module/common/view/kanban.html.php +++ b/module/common/view/kanban.html.php @@ -436,21 +436,6 @@ $.extend($.fn.kanban.Constructor.DEFAULTS, var color = kanbanColorList[lane.$index % kanbanColorList.length]; $name.css('background-color', color); }, - onRenderKanban: function($kanban, kanbanData) - { - /* Update project count and execution count */ - var doingProjectCount = 0; - var doingExecutionCount = 0; - var $doingProjectItems = $kanban.find('.kanban-lane-col[data-type="doingProject"] > .kanban-lane-items'); - if($doingProjectItems.length) - { - doingProjectCount = $doingProjectItems.find('.project-item').length; - doingExecutionCount = $doingProjectItems.find('.execution-item').length; - } - - $kanban.find('.kanban-header-col[data-type="doingProject"] > .title > .count').text(doingProjectCount || 0); - $kanban.find('.kanban-header-col[data-type="doingExecution"] > .title > .count').text(doingExecutionCount || 0); - }, onCreate: function(kanban) { kanban.$.on('scroll', tryUpdateKanbanAffix); diff --git a/module/design/control.php b/module/design/control.php index b70a81edae..09b13a3465 100644 --- a/module/design/control.php +++ b/module/design/control.php @@ -277,7 +277,7 @@ class design extends control */ public function linkCommit($designID = 0, $repoID = 0, $begin = '', $end = '', $recTotal = 0, $recPerPage = 50, $pageID = 1) { - $design = $this->design->getById($designID); + $design = $this->design->getById($designID); $productID = $this->commonAction($design->project, $design->product, $designID); /* Get project and date. */ @@ -330,9 +330,10 @@ class design extends control $this->view->designID = $designID; $this->view->begin = $begin; $this->view->end = $end; - $this->view->design = $this->design->getByID($designID); + $this->view->design = $design; $this->view->pager = $pager; $this->view->users = $this->loadModel('user')->getPairs('noletter'); + $this->view->type = $design->type; $this->display(); } diff --git a/module/design/js/linkcommit.js b/module/design/js/linkcommit.js index 66527962f7..69af091bdf 100644 --- a/module/design/js/linkcommit.js +++ b/module/design/js/linkcommit.js @@ -4,16 +4,16 @@ $('#begin, #end, #repo').change(function() var end = $('#end').val(); var repo = $('#repo').val(); - if(begin.indexOf('-') != -1) - { + if(begin.indexOf('-') != -1) + { var beginarray = begin.split("-"); - var begin = ''; + var begin = ''; for(i = 0; i < beginarray.length; i++) begin = begin + beginarray[i]; - } - if(end.indexOf('-') != -1) - { + } + if(end.indexOf('-') != -1) + { var endarray = end.split("-"); - var end = ''; + var end = ''; for(i = 0 ; i < endarray.length ; i++) end = end + endarray[i]; } @@ -26,3 +26,9 @@ $('#begin, #end, #repo').change(function() location.href = createLink('design', 'linkCommit', "designID=" + designID + '&repoID=' + repo + '&begin=' + begin + '&end=' + end); }) + +$(function() +{ + $('#subNavbar .nav li').removeClass('active'); + $('#subNavbar .nav li[data-id=' + type + ']').addClass('active'); +}) diff --git a/module/design/view/linkcommit.html.php b/module/design/view/linkcommit.html.php index 540e59b1f8..d431727609 100644 --- a/module/design/view/linkcommit.html.php +++ b/module/design/view/linkcommit.html.php @@ -84,5 +84,6 @@ +design->errorDate);?> diff --git a/module/dev/lang/en.php b/module/dev/lang/en.php index 5f3ab803b5..831fc433d9 100644 --- a/module/dev/lang/en.php +++ b/module/dev/lang/en.php @@ -28,96 +28,103 @@ $lang->dev->fields['length'] = 'Length'; $lang->dev->fields['null'] = 'Null'; $lang->dev->tableList = array(); -$lang->dev->tableList['action'] = 'Action'; -$lang->dev->tableList['bug'] = 'Bug'; -$lang->dev->tableList['build'] = 'Build'; -$lang->dev->tableList['burn'] = 'Burndown Chart'; -$lang->dev->tableList['case'] = 'Test Case'; -$lang->dev->tableList['casestep'] = 'Case Step'; -$lang->dev->tableList['company'] = 'Company'; -$lang->dev->tableList['config'] = 'Configuration'; -$lang->dev->tableList['custom'] = 'Custom'; -$lang->dev->tableList['dept'] = 'Department'; -$lang->dev->tableList['doc'] = 'Document'; -$lang->dev->tableList['doclib'] = 'Document Library'; -$lang->dev->tableList['effort'] = 'Effort'; -$lang->dev->tableList['extension'] = 'Extension'; -$lang->dev->tableList['file'] = 'File'; -$lang->dev->tableList['group'] = 'Group'; -$lang->dev->tableList['grouppriv'] = 'Privilege'; -$lang->dev->tableList['history'] = 'History'; -$lang->dev->tableList['lang'] = 'Language'; -$lang->dev->tableList['module'] = 'Module'; -$lang->dev->tableList['program'] = 'Program'; -$lang->dev->tableList['product'] = $lang->productCommon; -$lang->dev->tableList['productplan'] = $lang->productCommon . 'Plan'; -$lang->dev->tableList['project'] = 'Project'; -$lang->dev->tableList['projectproduct'] = 'Project' . $lang->productCommon; -$lang->dev->tableList['projectstory'] = 'Project Story'; -$lang->dev->tableList['execution'] = $lang->executionCommon; -$lang->dev->tableList['release'] = 'Release'; -$lang->dev->tableList['story'] = 'Story'; -$lang->dev->tableList['storyspec'] = 'Story Description'; -$lang->dev->tableList['task'] = 'Task'; -$lang->dev->tableList['taskestimate'] = 'Estimates'; -$lang->dev->tableList['team'] = 'Team'; -$lang->dev->tableList['testresult'] = 'Test Result'; -$lang->dev->tableList['testrun'] = 'Test Run'; -$lang->dev->tableList['testtask'] = 'Test Request'; -$lang->dev->tableList['todo'] = 'Todo'; -$lang->dev->tableList['user'] = 'User'; -$lang->dev->tableList['usercontact'] = 'User Contact'; -$lang->dev->tableList['usergroup'] = 'User Group'; -$lang->dev->tableList['userquery'] = 'User Query'; -$lang->dev->tableList['usertpl'] = 'User Template'; -$lang->dev->tableList['admin'] = 'Admin'; -$lang->dev->tableList['api'] = 'API'; -$lang->dev->tableList['backup'] = 'Backup'; -$lang->dev->tableList['common'] = 'Common'; -$lang->dev->tableList['convert'] = 'Convert'; -$lang->dev->tableList['dev'] = 'Develop'; -$lang->dev->tableList['git'] = 'GIT'; -$lang->dev->tableList['index'] = 'Home'; -$lang->dev->tableList['install'] = 'Install'; -$lang->dev->tableList['mail'] = 'Email'; -$lang->dev->tableList['misc'] = 'Misc.'; -$lang->dev->tableList['my'] = 'Dashboard'; -$lang->dev->tableList['qa'] = 'Test'; -$lang->dev->tableList['report'] = 'Report'; -$lang->dev->tableList['search'] = 'Search'; -$lang->dev->tableList['sso'] = 'SSO'; -$lang->dev->tableList['svn'] = 'SVN'; -$lang->dev->tableList['testcase'] = 'Test Case'; -$lang->dev->tableList['testreport'] = 'Test Report'; -$lang->dev->tableList['testsuite'] = 'Test Suite'; -$lang->dev->tableList['caselib'] = 'Case Library'; -$lang->dev->tableList['tree'] = 'Module Tree'; -$lang->dev->tableList['upgrade'] = 'Update'; -$lang->dev->tableList['cron'] = 'Cron'; -$lang->dev->tableList['datatable'] = 'Data Table'; -$lang->dev->tableList['block'] = 'Block'; -$lang->dev->tableList['branch'] = 'Branch'; -$lang->dev->tableList['doccontent'] = 'Doc Content'; -$lang->dev->tableList['storystage'] = 'Story Phase'; -$lang->dev->tableList['tutorial'] = 'Tutorial'; -$lang->dev->tableList['suitecase'] = 'Suite Case'; -$lang->dev->tableList['score'] = 'Score'; -$lang->dev->tableList['entry'] = 'Application'; -$lang->dev->tableList['webhook'] = 'WebHook'; -$lang->dev->tableList['log'] = 'Log'; -$lang->dev->tableList['message'] = 'Message'; -$lang->dev->tableList['notify'] = 'Notification'; -$lang->dev->tableList['userview'] = 'User Privilege'; -$lang->dev->tableList['repo'] = 'Code'; -$lang->dev->tableList['repohistory'] = 'Repo History'; -$lang->dev->tableList['repofiles'] = 'Repo Files'; -$lang->dev->tableList['repobranch'] = 'Repo Branch'; -$lang->dev->tableList['ci'] = 'CI'; -$lang->dev->tableList['compile'] = 'Compile'; -$lang->dev->tableList['jenkins'] = 'Jenkins'; -$lang->dev->tableList['job'] = 'Job'; -$lang->dev->tableList['searchdict'] = 'Search dict'; -$lang->dev->tableList['searchindex'] = 'Search index'; +$lang->dev->tableList['action'] = 'Action'; +$lang->dev->tableList['bug'] = 'Bug'; +$lang->dev->tableList['build'] = 'Build'; +$lang->dev->tableList['burn'] = 'Burndown Chart'; +$lang->dev->tableList['case'] = 'Test Case'; +$lang->dev->tableList['casestep'] = 'Case Step'; +$lang->dev->tableList['company'] = 'Company'; +$lang->dev->tableList['config'] = 'Configuration'; +$lang->dev->tableList['custom'] = 'Custom'; +$lang->dev->tableList['dept'] = 'Department'; +$lang->dev->tableList['doc'] = 'Document'; +$lang->dev->tableList['doclib'] = 'Document Library'; +$lang->dev->tableList['effort'] = 'Effort'; +$lang->dev->tableList['extension'] = 'Extension'; +$lang->dev->tableList['file'] = 'File'; +$lang->dev->tableList['group'] = 'Group'; +$lang->dev->tableList['grouppriv'] = 'Privilege'; +$lang->dev->tableList['history'] = 'History'; +$lang->dev->tableList['lang'] = 'Language'; +$lang->dev->tableList['module'] = 'Module'; +$lang->dev->tableList['program'] = 'Program'; +$lang->dev->tableList['product'] = $lang->productCommon; +$lang->dev->tableList['productplan'] = $lang->productCommon . 'Plan'; +$lang->dev->tableList['project'] = 'Project'; +$lang->dev->tableList['projectproduct'] = 'Project' . $lang->productCommon; +$lang->dev->tableList['projectstory'] = 'Project Story'; +$lang->dev->tableList['execution'] = $lang->executionCommon; +$lang->dev->tableList['release'] = 'Release'; +$lang->dev->tableList['story'] = 'Story'; +$lang->dev->tableList['storyspec'] = 'Story Description'; +$lang->dev->tableList['task'] = 'Task'; +$lang->dev->tableList['taskestimate'] = 'Estimates'; +$lang->dev->tableList['team'] = 'Team'; +$lang->dev->tableList['testresult'] = 'Test Result'; +$lang->dev->tableList['testrun'] = 'Test Run'; +$lang->dev->tableList['testtask'] = 'Test Request'; +$lang->dev->tableList['todo'] = 'Todo'; +$lang->dev->tableList['user'] = 'User'; +$lang->dev->tableList['usercontact'] = 'User Contact'; +$lang->dev->tableList['usergroup'] = 'User Group'; +$lang->dev->tableList['userquery'] = 'User Query'; +$lang->dev->tableList['usertpl'] = 'User Template'; +$lang->dev->tableList['admin'] = 'Admin'; +$lang->dev->tableList['api'] = 'API'; +$lang->dev->tableList['backup'] = 'Backup'; +$lang->dev->tableList['common'] = 'Common'; +$lang->dev->tableList['convert'] = 'Convert'; +$lang->dev->tableList['dev'] = 'Develop'; +$lang->dev->tableList['git'] = 'GIT'; +$lang->dev->tableList['index'] = 'Home'; +$lang->dev->tableList['install'] = 'Install'; +$lang->dev->tableList['mail'] = 'Email'; +$lang->dev->tableList['misc'] = 'Misc.'; +$lang->dev->tableList['my'] = 'Dashboard'; +$lang->dev->tableList['qa'] = 'Test'; +$lang->dev->tableList['report'] = 'Report'; +$lang->dev->tableList['search'] = 'Search'; +$lang->dev->tableList['sso'] = 'SSO'; +$lang->dev->tableList['svn'] = 'SVN'; +$lang->dev->tableList['testcase'] = 'Test Case'; +$lang->dev->tableList['testreport'] = 'Test Report'; +$lang->dev->tableList['testsuite'] = 'Test Suite'; +$lang->dev->tableList['caselib'] = 'Case Library'; +$lang->dev->tableList['tree'] = 'Module Tree'; +$lang->dev->tableList['upgrade'] = 'Update'; +$lang->dev->tableList['cron'] = 'Cron'; +$lang->dev->tableList['datatable'] = 'Data Table'; +$lang->dev->tableList['block'] = 'Block'; +$lang->dev->tableList['branch'] = 'Branch'; +$lang->dev->tableList['doccontent'] = 'Doc Content'; +$lang->dev->tableList['storystage'] = 'Story Phase'; +$lang->dev->tableList['tutorial'] = 'Tutorial'; +$lang->dev->tableList['suitecase'] = 'Suite Case'; +$lang->dev->tableList['score'] = 'Score'; +$lang->dev->tableList['entry'] = 'Application'; +$lang->dev->tableList['webhook'] = 'WebHook'; +$lang->dev->tableList['log'] = 'Log'; +$lang->dev->tableList['message'] = 'Message'; +$lang->dev->tableList['notify'] = 'Notification'; +$lang->dev->tableList['userview'] = 'User Privilege'; +$lang->dev->tableList['repo'] = 'Code'; +$lang->dev->tableList['repohistory'] = 'Repo History'; +$lang->dev->tableList['repofiles'] = 'Repo Files'; +$lang->dev->tableList['repobranch'] = 'Repo Branch'; +$lang->dev->tableList['ci'] = 'CI'; +$lang->dev->tableList['compile'] = 'Compile'; +$lang->dev->tableList['jenkins'] = 'Jenkins'; +$lang->dev->tableList['job'] = 'Job'; +$lang->dev->tableList['searchdict'] = 'Search dict'; +$lang->dev->tableList['searchindex'] = 'Search index'; +$lang->dev->tableList['kanbanlane'] = 'Kanban Lane'; +$lang->dev->tableList['kanbancolumn'] = 'Kanban Column'; +$lang->dev->tableList['stakeholder'] = 'Stakeholder'; +$lang->dev->tableList['im_chat_message_index'] = 'Zentao Client Message'; +$lang->dev->tableList['im_message_backup'] = 'Zentao Client Backup'; +$lang->dev->tableList['im_message_index'] = 'Zentao Client Message Index'; +$lang->dev->tableList['im_userdevice'] = 'Zentao Client User Device'; $lang->dev->groupList['my'] = 'Dashboard'; $lang->dev->groupList['program'] = 'Program'; diff --git a/module/execution/css/kanban.css b/module/execution/css/kanban.css index 06da3858aa..372183c4b4 100644 --- a/module/execution/css/kanban.css +++ b/module/execution/css/kanban.css @@ -37,11 +37,11 @@ #kanbans .kanban-card[data-scale-size="4"] {padding: 8px;} #kanbans .kanban-card[data-scale-size="3"] {padding: 3px 4px;} #kanbans .kanban-card[data-scale-size="3"] > .title {white-space: normal; max-height: 100%;} -#kanbans .kanban-card[data-scale-size="2"] {padding: 3px 4px;} -#kanbans .kanban-card[data-scale-size="2"] > .title {line-height: 18px; white-space: normal; max-height: 100%;} -#kanbans .kanban-card[data-scale-size="2"] > .title > .infos {display: inline-block; height: 18px; vertical-align: top;} -#kanbans .kanban-card[data-scale-size="2"] > .title > .infos > .info-pri {transform: scale(.8); vertical-align: top;} -#kanbans .kanban-card[data-scale-size="2"] > .title > .infos > .avatar {display: inline-block; transform: scale(.8); position: relative; top: -1px; vertical-align: top; margin-right: -1px;} +#kanbans .kanban-card[data-scale-size="2"] {padding: 3px 4px; overflow: hidden;} +#kanbans .kanban-card[data-scale-size="2"] > .title {display: inline; line-height: 18px; white-space: normal; max-height: 100%; word-break: break-all;} +#kanbans .kanban-card[data-scale-size="2"] > .infos {display: inline-block; height: 18px; vertical-align: top; margin: 0;} +#kanbans .kanban-card[data-scale-size="2"] > .infos > .info-pri {transform: scale(.8); vertical-align: top;} +#kanbans .kanban-card[data-scale-size="2"] > .infos > .avatar {display: inline-block; transform: scale(.8); position: relative; top: -2px; vertical-align: top; margin-right: -1px;} #kanbanScaleControl {width: 100px;} #kanbanScaleControl .input-group-addon {background: #fff; padding: 5px;} diff --git a/module/execution/js/kanban.js b/module/execution/js/kanban.js index 11d735ea65..78024bbef0 100644 --- a/module/execution/js/kanban.js +++ b/module/execution/js/kanban.js @@ -64,7 +64,7 @@ function renderDeadline(deadline) } /** - * Render story item 提供方法渲染看板中的需求卡片 + * Render story item * @param {Object} item Story item object * @param {JQuery} $item Kanban item element * @param {Object} col Column object @@ -99,6 +99,7 @@ function renderStoryItem(item, $item, col) $infos[scaleSize <= 1 ? 'append' : 'prepend'](avatarHtml); if(scaleSize <= 1) $infos.appendTo($item); + else if(scaleSize === 2) $infos.prependTo($item); else $infos.prependTo($item.find('.title')); } else if(scaleSize === 4) @@ -125,7 +126,7 @@ function renderStoryItem(item, $item, col) } /** - * Render bug item 提供方法渲染看板中的 Bug 卡片 + * Render bug item * @param {Object} item Bug item object * @param {JQuery} $item Kanban item element * @param {Object} col Column object @@ -162,6 +163,7 @@ function renderBugItem(item, $item, col) $infos[scaleSize <= 1 ? 'append' : 'prepend'](avatarHtml); if(scaleSize <= 1) $infos.appendTo($item); + else if(scaleSize === 2) $infos.prependTo($item); else $infos.prependTo($item.find('.title')); } else if(scaleSize === 4) @@ -188,7 +190,7 @@ function renderBugItem(item, $item, col) } /** - * Render task item 提供方法渲染看板中的任务卡片 + * Render task item * @param {Object} item Task item object * @param {JQuery} $item Kanban item element * @param {Object} col Column object @@ -225,6 +227,7 @@ function renderTaskItem(item, $item, col) $infos[scaleSize <= 1 ? 'append' : 'prepend'](avatarHtml); if(scaleSize <= 1) $infos.appendTo($item); + else if(scaleSize === 2) $infos.prependTo($item); else $infos.prependTo($item.find('.title')); } else if(scaleSize === 4) @@ -252,13 +255,13 @@ function renderTaskItem(item, $item, col) return $item; } -/* Add column renderer/ 添加特定列类型或列条目类型渲染方法 */ +/* Add column renderer */ addColumnRenderer('story', renderStoryItem); addColumnRenderer('bug', renderBugItem); addColumnRenderer('task', renderTaskItem); /** - * Render column count 渲染看板列头上的卡片数目 + * Render column count * @param {JQuery} $count Kanban count element * @param {number} count Column cards count * @param {number} col Column object @@ -271,7 +274,7 @@ function renderColumnCount($count, count, col) } /** - * Render header column 渲染看板列头部 + * Render header column * @param {JQuery} $col Header column element * @param {Object} col Header column object * @param {JQuery} $header Header element @@ -307,7 +310,7 @@ function renderHeaderCol($col, col, $header, kanban) } /** - * Render lane name 渲染看板泳道名称 + * Render lane name * @param {JQuery} $name Name element * @param {Object} lane Lane object * @param {JQuery} $kanban $kanban element @@ -331,9 +334,8 @@ function renderLaneName($name, lane, $kanban, columns, kanban) /** * Updata kanban data - * 更新看板上的数据 - * @param {string} kanbanID Kanban id 看板 ID - * @param {Object} data Kanban data 看板数据 + * @param {string} kanbanID Kanban id + * @param {Object} data Kanban data */ function updateKanban(kanbanID, data) { @@ -345,10 +347,9 @@ function updateKanban(kanbanID, data) /** * Create kanban in page - * 在界面上创建一个看板界面 - * @param {string} kanbanID Kanban id 看板 ID - * @param {Object} data Kanban data 看板数据 - * @param {Object} options Kanban options 组件初始化数据 看板名称 + * @param {string} kanbanID Kanban id + * @param {Object} data Kanban data + * @param {Object} options Kanban options */ function createKanban(kanbanID, data, options) { @@ -502,7 +503,6 @@ function findDropColumns($element, $root) /** * Change column type for a card - * 变更卡片类型 * @param {Object} card Card object * @param {String} fromColType The column type before change * @param {String} toColType The column type after change @@ -568,13 +568,6 @@ function changeCardColType(card, fromColType, toColType, kanbanID) var modalTrigger = new $.zui.ModalTrigger({type: 'iframe', width: '80%', url: link}); modalTrigger.show(); } - - /* - // TODO: The server must return a updated kanban data 服务器返回更新后的看板数据 - - // 调用 updateKanban 更新看板数据 - updateKanban(kanbanID, newKanbanData); - */ } /** @@ -588,7 +581,7 @@ function handleFinishDrop(event) var $dragCol = $card.closest('.kanban-lane-col'); var $dropCol = $(event.target); - /* Get d-n-d(drag and drop) infos 获取拖放操作相关信息 */ + /* Get d-n-d(drag and drop) infos */ var card = $card.data('item'); var fromColType = $dragCol.data('type'); var toColType = $dropCol.data('type'); @@ -599,9 +592,7 @@ function handleFinishDrop(event) $('#kanbans').find('.can-drop-here').removeClass('can-drop-here'); } -/** - * Handle sort cards in column 处理对列卡片进行排序 - */ +/** Handle sort cards in column */ function handleSortColCards() { /* TODO: handle sort cards from column contextmenu */ @@ -609,7 +600,7 @@ function handleSortColCards() } /** - * Create column menu 创建列操作菜单 + * Create column menu * @returns {Object[]} */ function createColumnMenu(options) @@ -626,7 +617,7 @@ function createColumnMenu(options) } /** - * Create column create button menu 创建列添加按钮操作菜单 + * Create column create button menu * @returns {Object[]} */ function createColumnCreateMenu(options) @@ -656,7 +647,7 @@ function createColumnCreateMenu(options) } /** - * Create lane menu 创建泳道操作菜单 + * Create lane menu * @returns {Object[]} */ function createLaneMenu(options) @@ -681,7 +672,7 @@ function createLaneMenu(options) } /** - * Create story menu 创建需求卡片操作菜单 + * Create story menu * @returns {Object[]} */ function createStoryMenu(options) @@ -703,7 +694,7 @@ function createStoryMenu(options) } /** - * Create bug menu 创建 Bug 卡片操作菜单 + * Create bug menu * @returns {Object[]} */ function createBugMenu(options) @@ -724,7 +715,7 @@ function createBugMenu(options) } /** - * Create task menu 创建任务卡片操作菜单 + * Create task menu * @returns {Object[]} */ function createTaskMenu(options) @@ -819,7 +810,7 @@ $(function() $('#kanbanScaleControl .btn[data-type="+"]').attr('disabled', window.kanbanScaleSize >= 4 ? 'disabled' : null); $('#kanbanScaleControl .btn[data-type="-"]').attr('disabled', window.kanbanScaleSize <= 1 ? 'disabled' : null); - /* Common options 用于初始化看板的通用选项 */  + /* Common options */  var commonOptions = { maxColHeight: 'auto', @@ -843,7 +834,7 @@ $(function() onRenderCount: renderColumnCount }; - /* Create kanban 创建看板 */ + /* Create kanban */ if(groupBy == 'default') { var kanbanLane = ''; @@ -858,7 +849,7 @@ $(function() } else { - /* Create kanban by group. 分泳道创建看板. */ + /* Create kanban by group. */ createKanban(browseType, kanbanGroup[groupBy], commonOptions); } diff --git a/module/execution/lang/en.php b/module/execution/lang/en.php index 76cce78e04..1f5ecdef08 100644 --- a/module/execution/lang/en.php +++ b/module/execution/lang/en.php @@ -103,6 +103,7 @@ $lang->execution->copyNoExecution = 'There are no ' . $lang->executionCommon . $lang->execution->noTeam = 'No team members at the moment'; $lang->execution->or = ' or '; $lang->execution->selectProject = 'Please select project'; +$lang->execution->unfoldClosed = 'Unfold Closed'; $lang->execution->editName = 'Edit Name'; $lang->execution->setWIP = 'WIP Settings'; $lang->execution->sortColumn = 'Kanban Card Sorting'; diff --git a/module/gitlab/lang/en.php b/module/gitlab/lang/en.php index 4ec1cdea56..07c7ad4e7f 100644 --- a/module/gitlab/lang/en.php +++ b/module/gitlab/lang/en.php @@ -154,7 +154,7 @@ $lang->gitlab->group->requestAccessEnabledTip = "Allow users to $lang->gitlab->group->lfsEnabled = 'Large File Storage'; $lang->gitlab->group->lfsEnabledTip = "Allow projects within this group to use Git LFS(This setting can be overridden in each project)"; $lang->gitlab->group->projectCreationLevel = "Allowed to create projects"; -$lang->gitlab->group->projectCreationLevelList['none'] = "No one"; +$lang->gitlab->group->projectCreationLevelList['noone'] = "No one"; $lang->gitlab->group->projectCreationLevelList['maintainer'] = "Maintainers"; $lang->gitlab->group->projectCreationLevelList['developer'] = "Developers + Maintainers"; $lang->gitlab->group->subgroupCreationLevel = "Allowed to create projects"; diff --git a/module/kanban/lang/en.php b/module/kanban/lang/en.php index 5f49e1f9b5..73f6560c61 100644 --- a/module/kanban/lang/en.php +++ b/module/kanban/lang/en.php @@ -21,15 +21,15 @@ $lang->kanban->group->task['default'] = "Default"; $lang->kanban->group->task['pri'] = "Task Priority"; $lang->kanban->group->task['type'] = "Task Type"; $lang->kanban->group->task['module'] = "Task Module"; -$lang->kanban->group->task['story'] = "Story"; $lang->kanban->group->task['assignedTo'] = "Assigned To"; +$lang->kanban->group->task['story'] = "Story"; $lang->kanban->group->bug = array(); $lang->kanban->group->bug['default'] = "Default"; $lang->kanban->group->bug['pri'] = "Bug Priority"; -$lang->kanban->group->bug['type'] = "Bug Type"; -$lang->kanban->group->bug['module'] = "Bug Module"; $lang->kanban->group->bug['severity'] = "Bug Severity"; +$lang->kanban->group->bug['module'] = "Bug Module"; +$lang->kanban->group->bug['type'] = "Bug Type"; $lang->kanban->group->bug['assignedTo'] = "Assigned To"; $lang->kanban->WIP = 'WIP'; diff --git a/module/misc/lang/de.php b/module/misc/lang/de.php index 540eae8091..901cd084bd 100644 --- a/module/misc/lang/de.php +++ b/module/misc/lang/de.php @@ -84,6 +84,16 @@ $lang->misc->feature = new stdclass(); $lang->misc->feature->lastest = 'Letzte Version'; $lang->misc->feature->detailed = 'Details'; +$lang->misc->releaseDate['16.0.beta1'] = '2021-12-06'; +$lang->misc->releaseDate['15.7.1'] = '2021-11-02'; +$lang->misc->releaseDate['15.7'] = '2021-10-18'; +$lang->misc->releaseDate['15.6'] = '2021-10-12'; +$lang->misc->releaseDate['15.5'] = '2021-09-14'; +$lang->misc->releaseDate['15.4'] = '2021-08-23'; +$lang->misc->releaseDate['15.3'] = '2021-08-04'; +$lang->misc->releaseDate['15.2'] = '2021-07-20'; +$lang->misc->releaseDate['15.0.3'] = '2021-06-24'; +$lang->misc->releaseDate['15.0.2'] = '2021-06-12'; $lang->misc->releaseDate['15.0.1'] = '2021-06-06'; $lang->misc->releaseDate['15.0'] = '2021-04-30'; $lang->misc->releaseDate['15.0.rc3'] = '2021-04-16'; @@ -143,6 +153,16 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22'; $lang->misc->releaseDate['7.1.stable'] = '2015-03-07'; $lang->misc->releaseDate['6.3.stable'] = '2014-11-07'; +$lang->misc->feature->all['16.0.beta1'][] = array('title' => 'Add waterfall model project, add task kanban, improved branch management, and fixed bugs.', 'desc' => ''); +$lang->misc->feature->all['15.7.1'][] = array('title' => 'Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.7'][] = array('title' => 'Add API Lib. Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.6'][] = array('title' => 'Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.5'][] = array('title' => 'Add Program / Product / Project Kanban, global addition function and novice guidance. Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.4'][] = array('title' => 'Fix bug', 'desc' => ''); +$lang->misc->feature->all['15.3'][] = array('title' => 'Adjust interface style and document, fix bug', 'desc' => ''); +$lang->misc->feature->all['15.2'][] = array('title' => 'Optimize the new version upgrade process, add execution kanban.', 'desc' => ''); +$lang->misc->feature->all['15.0.3'][] = array('title' => 'Fix Bug', 'desc' => ''); +$lang->misc->feature->all['15.0.2'][] = array('title' => 'Fix Bug', 'desc' => ''); $lang->misc->feature->all['15.0.1'][] = array('title' => 'Fix Bug', 'desc' => ''); $lang->misc->feature->all['15.0'][] = array('title' => 'Fix Bug', 'desc' => ''); $lang->misc->feature->all['15.0.rc3'][] = array('title' => 'Adjust details,Fix bug', 'desc' => ''); diff --git a/module/misc/lang/en.php b/module/misc/lang/en.php index 1608e7f6d3..b34ce0bee2 100644 --- a/module/misc/lang/en.php +++ b/module/misc/lang/en.php @@ -94,7 +94,7 @@ $lang->misc->feature->downloadFile = 'Download introduction'; $lang->misc->feature->tutorialDesc = '

ZenTao 15.0 has new functions, and you know how to use it through the "Tutorial".

Click your [Avatar-Theme-Young Blue] to set it.

'; $lang->misc->feature->themeDesc = '

ZenTao 15.0+ a new "Youth Blue" theme, the pages are more beautiful and the experience is more friendly.

Click your [Avatar-Theme-Young Blue] to set it.

'; -$lang->misc->releaseDate['15.8'] = '2021-11-19'; +$lang->misc->releaseDate['16.0.beta1'] = '2021-12-06'; $lang->misc->releaseDate['15.7.1'] = '2021-11-02'; $lang->misc->releaseDate['15.7'] = '2021-10-18'; $lang->misc->releaseDate['15.6'] = '2021-10-12'; @@ -163,14 +163,14 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22'; $lang->misc->releaseDate['7.1.stable'] = '2015-03-07'; $lang->misc->releaseDate['6.3.stable'] = '2014-11-07'; -$lang->misc->feature->all['15.8'][] = array('title' => 'Optimize the branch management and its details. Fix bug.', 'desc' => ''); -$lang->misc->feature->all['15.7.1'][] = array('title' => 'Fix bug.', 'desc' => ''); -$lang->misc->feature->all['15.7'][] = array('title' => 'Add API Lib. Fix bug.', 'desc' => ''); -$lang->misc->feature->all['15.6'][] = array('title' => 'Fix bug.', 'desc' => ''); -$lang->misc->feature->all['15.5'][] = array('title' => 'Add Program / Product / Project Kanban, global addition function and novice guidance. Fix bug.', 'desc' => ''); -$lang->misc->feature->all['15.4'][] = array('title' => 'Fix bug', 'desc' => ''); -$lang->misc->feature->all['15.3'][] = array('title' => 'Adjust interface style and document, fix bug', 'desc' => ''); -$lang->misc->feature->all['15.2'][] = array('title' => 'Optimize the new version upgrade process, add execution kanban.', 'desc' => ''); +$lang->misc->feature->all['16.0.beta1'][] = array('title' => 'Add waterfall model project, add task kanban, improved branch management, and fixed bugs.', 'desc' => ''); +$lang->misc->feature->all['15.7.1'][] = array('title' => 'Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.7'][] = array('title' => 'Add API Lib. Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.6'][] = array('title' => 'Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.5'][] = array('title' => 'Add Program / Product / Project Kanban, global addition function and novice guidance. Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.4'][] = array('title' => 'Fix bug', 'desc' => ''); +$lang->misc->feature->all['15.3'][] = array('title' => 'Adjust interface style and document, fix bug', 'desc' => ''); +$lang->misc->feature->all['15.2'][] = array('title' => 'Optimize the new version upgrade process, add execution kanban.', 'desc' => ''); $lang->misc->feature->all['15.0.3'][] = array('title' => 'Fix Bug', 'desc' => ''); $lang->misc->feature->all['15.0.2'][] = array('title' => 'Fix Bug', 'desc' => ''); diff --git a/module/misc/lang/fr.php b/module/misc/lang/fr.php index 26ae8b15ed..3271ed9f1d 100644 --- a/module/misc/lang/fr.php +++ b/module/misc/lang/fr.php @@ -84,6 +84,16 @@ $lang->misc->feature = new stdclass(); $lang->misc->feature->lastest = 'Dernière Version'; $lang->misc->feature->detailed = 'Détail'; +$lang->misc->releaseDate['16.0.beta1'] = '2021-12-06'; +$lang->misc->releaseDate['15.7.1'] = '2021-11-02'; +$lang->misc->releaseDate['15.7'] = '2021-10-18'; +$lang->misc->releaseDate['15.6'] = '2021-10-12'; +$lang->misc->releaseDate['15.5'] = '2021-09-14'; +$lang->misc->releaseDate['15.4'] = '2021-08-23'; +$lang->misc->releaseDate['15.3'] = '2021-08-04'; +$lang->misc->releaseDate['15.2'] = '2021-07-20'; +$lang->misc->releaseDate['15.0.3'] = '2021-06-24'; +$lang->misc->releaseDate['15.0.2'] = '2021-06-12'; $lang->misc->releaseDate['15.0.1'] = '2021-06-06'; $lang->misc->releaseDate['15.0'] = '2021-04-30'; $lang->misc->releaseDate['15.0.rc3'] = '2021-04-16'; @@ -143,6 +153,16 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22'; $lang->misc->releaseDate['7.1.stable'] = '2015-03-07'; $lang->misc->releaseDate['6.3.stable'] = '2014-11-07'; +$lang->misc->feature->all['16.0.beta1'][] = array('title' => 'Add waterfall model project, add task kanban, improved branch management, and fixed bugs.', 'desc' => ''); +$lang->misc->feature->all['15.7.1'][] = array('title' => 'Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.7'][] = array('title' => 'Add API Lib. Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.6'][] = array('title' => 'Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.5'][] = array('title' => 'Add Program / Product / Project Kanban, global addition function and novice guidance. Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.4'][] = array('title' => 'Fix bug', 'desc' => ''); +$lang->misc->feature->all['15.3'][] = array('title' => 'Adjust interface style and document, fix bug', 'desc' => ''); +$lang->misc->feature->all['15.2'][] = array('title' => 'Optimize the new version upgrade process, add execution kanban.', 'desc' => ''); +$lang->misc->feature->all['15.0.3'][] = array('title' => 'Fix Bug', 'desc' => ''); +$lang->misc->feature->all['15.0.2'][] = array('title' => 'Fix Bug', 'desc' => ''); $lang->misc->feature->all['15.0.1'][] = array('title' => 'Fix Bug', 'desc' => ''); $lang->misc->feature->all['15.0'][] = array('title' => 'Fix Bug', 'desc' => ''); $lang->misc->feature->all['15.0.rc3'][] = array('title' => 'Adjust details, fix bug.', 'desc' => ''); diff --git a/module/misc/lang/vi.php b/module/misc/lang/vi.php index 417344e346..e0410ae5b5 100644 --- a/module/misc/lang/vi.php +++ b/module/misc/lang/vi.php @@ -84,6 +84,16 @@ $lang->misc->feature = new stdclass(); $lang->misc->feature->lastest = 'Latest Version'; $lang->misc->feature->detailed = 'Chi tiết'; +$lang->misc->releaseDate['16.0.beta1'] = '2021-12-06'; +$lang->misc->releaseDate['15.7.1'] = '2021-11-02'; +$lang->misc->releaseDate['15.7'] = '2021-10-18'; +$lang->misc->releaseDate['15.6'] = '2021-10-12'; +$lang->misc->releaseDate['15.5'] = '2021-09-14'; +$lang->misc->releaseDate['15.4'] = '2021-08-23'; +$lang->misc->releaseDate['15.3'] = '2021-08-04'; +$lang->misc->releaseDate['15.2'] = '2021-07-20'; +$lang->misc->releaseDate['15.0.3'] = '2021-06-24'; +$lang->misc->releaseDate['15.0.2'] = '2021-06-12'; $lang->misc->releaseDate['15.0.1'] = '2021-06-06'; $lang->misc->releaseDate['15.0'] = '2021-04-30'; $lang->misc->releaseDate['15.0.rc3'] = '2021-04-16'; @@ -143,6 +153,16 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22'; $lang->misc->releaseDate['7.1.stable'] = '2015-03-07'; $lang->misc->releaseDate['6.3.stable'] = '2014-11-07'; +$lang->misc->feature->all['16.0.beta1'][] = array('title' => 'Add waterfall model project, add task kanban, improved branch management, and fixed bugs.', 'desc' => ''); +$lang->misc->feature->all['15.7.1'][] = array('title' => 'Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.7'][] = array('title' => 'Add API Lib. Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.6'][] = array('title' => 'Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.5'][] = array('title' => 'Add Program / Product / Project Kanban, global addition function and novice guidance. Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.4'][] = array('title' => 'Fix bug', 'desc' => ''); +$lang->misc->feature->all['15.3'][] = array('title' => 'Adjust interface style and document, fix bug', 'desc' => ''); +$lang->misc->feature->all['15.2'][] = array('title' => 'Optimize the new version upgrade process, add execution kanban.', 'desc' => ''); +$lang->misc->feature->all['15.0.3'][] = array('title' => 'Fix Bug', 'desc' => ''); +$lang->misc->feature->all['15.0.2'][] = array('title' => 'Fix Bug', 'desc' => ''); $lang->misc->feature->all['15.0.1'][] = array('title' => 'Fix Bug', 'desc' => ''); $lang->misc->feature->all['15.0'][] = array('title' => 'Fix Bug', 'desc' => ''); $lang->misc->feature->all['15.0.rc3'][] = array('title' => 'Adjust detail, fix bug.', 'desc' => ''); diff --git a/module/misc/lang/zh-cn.php b/module/misc/lang/zh-cn.php index ca0b6feaec..d635055797 100644 --- a/module/misc/lang/zh-cn.php +++ b/module/misc/lang/zh-cn.php @@ -94,7 +94,7 @@ $lang->misc->feature->downloadFile = '下载新版本功能介绍文档'; $lang->misc->feature->tutorialDesc = "

禅道15系列新增了多项功能,您可以通过“新手引导教程”快速了解禅道的基本使用方法。

通过鼠标经过 [头像-新手引导],点击新手引导,即可进入新手引导教程。

"; $lang->misc->feature->themeDesc = "

禅道15系列上线了全新的“青春蓝”主题,页面呈现更加美观,体验更加友好。

通过鼠标经过 [头像-主题-青春蓝],点击青春蓝,即可设置成功。

"; -$lang->misc->releaseDate['15.8'] = '2021-11-19'; +$lang->misc->releaseDate['16.0.beta1'] = '2021-12-06'; $lang->misc->releaseDate['15.7.1'] = '2021-11-02'; $lang->misc->releaseDate['15.7'] = '2021-10-18'; $lang->misc->releaseDate['15.6'] = '2021-10-12'; @@ -163,14 +163,14 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22'; $lang->misc->releaseDate['7.1.stable'] = '2015-03-07'; $lang->misc->releaseDate['6.3.stable'] = '2014-11-07'; -$lang->misc->feature->all['15.8'][] = array('title' => '完善分支管理和细节。修复Bug。', 'desc' => ''); -$lang->misc->feature->all['15.7.1'][] = array('title' => '修复Bug。', 'desc' => ''); -$lang->misc->feature->all['15.7'][] = array('title' => '新增接口库。修复Bug。', 'desc' => ''); -$lang->misc->feature->all['15.6'][] = array('title' => '修复Bug。', 'desc' => ''); -$lang->misc->feature->all['15.5'][] = array('title' => '增加项目集/产品/项目看板视图、全局添加功能、新手引导。 修复Bug。', 'desc' => ''); -$lang->misc->feature->all['15.4'][] = array('title' => '修复Bug', 'desc' => ''); -$lang->misc->feature->all['15.3'][] = array('title' => '实现界面风格改动和文档优化,修复Bug', 'desc' => ''); -$lang->misc->feature->all['15.2'][] = array('title' => '优化新版本升级流程,增加执行看板。', 'desc' => ''); +$lang->misc->feature->all['16.0.beta1'][] = array('title' => '新增瀑布模型项目,新增任务看板,完善分支管理和细节,修复Bug。', 'desc' => ''); +$lang->misc->feature->all['15.7.1'][] = array('title' => '修复Bug。', 'desc' => ''); +$lang->misc->feature->all['15.7'][] = array('title' => '新增接口库。修复Bug。', 'desc' => ''); +$lang->misc->feature->all['15.6'][] = array('title' => '修复Bug。', 'desc' => ''); +$lang->misc->feature->all['15.5'][] = array('title' => '增加项目集/产品/项目看板视图、全局添加功能、新手引导。 修复Bug。', 'desc' => ''); +$lang->misc->feature->all['15.4'][] = array('title' => '修复Bug', 'desc' => ''); +$lang->misc->feature->all['15.3'][] = array('title' => '实现界面风格改动和文档优化,修复Bug', 'desc' => ''); +$lang->misc->feature->all['15.2'][] = array('title' => '优化新版本升级流程,增加执行看板。', 'desc' => ''); $lang->misc->feature->all['15.0.3'][] = array('title' => '修复Bug', 'desc' => ''); $lang->misc->feature->all['15.0.2'][] = array('title' => '修复Bug', 'desc' => ''); diff --git a/module/mr/lang/en.php b/module/mr/lang/en.php index 25d79820fc..102d6f192c 100644 --- a/module/mr/lang/en.php +++ b/module/mr/lang/en.php @@ -37,6 +37,9 @@ $lang->mr->gitlabID = 'GitLab'; $lang->mr->repoID = 'Repo'; $lang->mr->jobID = 'Compile job'; +$lang->mr->canMerge = "Can merge"; +$lang->mr->cantMerge = "不可合并"; + $lang->mr->approval = 'Approval'; $lang->mr->approve = 'Approve'; $lang->mr->reject = 'Reject'; @@ -74,12 +77,14 @@ $lang->mr->mergeStatusList['checking'] = 'checking'; $lang->mr->mergeStatusList['can_be_merged'] = 'can be merged'; $lang->mr->mergeStatusList['cannot_be_merged'] = 'cannot be merged'; -$lang->mr->description = 'Description'; -$lang->mr->confirmDelete = 'Are you sure to delete this merge request?'; -$lang->mr->sourceProject = 'Source project'; -$lang->mr->sourceBranch = 'Source branch'; -$lang->mr->targetProject = 'Target project'; -$lang->mr->targetBranch = 'Target branch'; +$lang->mr->description = 'Description'; +$lang->mr->confirmDelete = 'Are you sure to delete this merge request?'; +$lang->mr->sourceProject = 'Source project'; +$lang->mr->sourceBranch = 'Source branch'; +$lang->mr->targetProject = 'Target project'; +$lang->mr->targetBranch = 'Target branch'; +$lang->mr->noCompileJob = 'No Compile Job'; +$lang->mr->compileUnexecuted = 'Compile Unexecuted'; $lang->mr->notFound = "Merge Request does not exist!"; $lang->mr->toCreatedMessage = "The merge request you submitted:%s, the build task succeeded."; diff --git a/module/product/js/kanban.js b/module/product/js/kanban.js index 30d2879cc2..674434c117 100644 --- a/module/product/js/kanban.js +++ b/module/product/js/kanban.js @@ -9,14 +9,22 @@ function processKanbanData(key, programsData) var kanbanId = key; /* Generate columns */ - var columns = []; + var columns = []; var hasDoingProject = false; + var executionsCol; $.each(kanbanColumns, function(_, column) { var colType = column.type; + if(colType === 'doingProject') hasDoingProject = true; + column = $.extend({}, column, + { + kanban: kanbanId, + id: kanbanId + '-' + colType, + parentType: (hasDoingProject && (colType === 'doingProject' || colType === 'doingExecution')) ? 'doing' : false, + }); + if(colType === 'doingProject') { - hasDoingProject = true; columns.push( { kanban: kanbanId, @@ -27,12 +35,12 @@ function processKanbanData(key, programsData) count: '' }); } - columns.push($.extend({}, column, + else if(colType === 'doingExecution') { - kanban: kanbanId, - id: kanbanId + '-' + colType, - parentType: (hasDoingProject && (colType === 'doingProject' || colType === 'doingExecution')) ? 'doing' : false, - })); + executionsCol = column; + executionsCol.count = 0; + } + columns.push(column); }); /* Format lanes data */ @@ -76,6 +84,8 @@ function processKanbanData(key, programsData) var execution = latestExecutions[projectID]; if(!execution || !execution.id) return; + + executionsCol.count++; projectItem.execution = $.extend({}, execution, {id: 'execution-' + execution.id, _id: execution.id}); }); } diff --git a/module/product/lang/en.php b/module/product/lang/en.php index 386387d4d6..b7ed529b21 100644 --- a/module/product/lang/en.php +++ b/module/product/lang/en.php @@ -55,6 +55,7 @@ $lang->product->project = $lang->executionCommon . ' List'; $lang->product->build = 'Build List'; $lang->product->moreProduct = "More Product"; $lang->product->projectInfo = "Projects that are linked to this {$lang->productCommon} are listed below."; +$lang->product->progress = "Progress"; $lang->product->currentExecution = "Current Execution"; $lang->product->activeStories = 'Active [S]'; @@ -77,6 +78,7 @@ $lang->product->assignToNullBugs = 'Unassigned [B]'; $lang->product->assignToNullBugsTitle = 'Unassigned Bugs'; $lang->product->closedBugs = 'Closed Bug'; $lang->product->bugFixedRate = 'Bug Repair rate'; +$lang->product->unfoldClosed = 'Unfold Closed'; $lang->product->confirmDelete = " Do you want to delete the {$lang->productCommon}?"; $lang->product->errorNoProduct = "No {$lang->productCommon} is created yet!"; diff --git a/module/product/model.php b/module/product/model.php index 3d268bed7c..b7c7c80051 100644 --- a/module/product/model.php +++ b/module/product/model.php @@ -75,10 +75,10 @@ class productModel extends model */ public function select($products, $productID, $currentModule, $currentMethod, $extra = '', $branch = '', $module = 0, $moduleType = '', $withBranch = true) { - $isBrowseBug = (strpos(',project,execution,', ",{$this->app->tab},") !== false and strpos(',bug,testcase,testtask,ajaxselectstory,', ",{$this->app->rawMethod},") !== false and isset($products[0])) ? true : false; + $isQaModule = (strpos(',project,execution,', ",{$this->app->tab},") !== false and strpos(',bug,testcase,testtask,ajaxselectstory,', ",{$this->app->rawMethod},") !== false and isset($products[0])) ? true : false; $this->app->loadLang('product'); - if(!$isBrowseBug and !$productID) + if(!$isQaModule and !$productID) { unset($this->lang->product->menu->settings['subMenu']->branch); return; @@ -88,10 +88,13 @@ class productModel extends model setcookie("lastProduct", $productID, $this->config->cookieLife, $this->config->webRoot, '', $this->config->cookieSecure, true); if($productID) $currentProduct = $this->getById($productID); - if($isBrowseBug and $this->app->tab == 'project') $extra = $this->session->project; - if($isBrowseBug and $this->app->tab == 'execution') $extra = $this->session->execution; + if($isQaModule and $this->app->tab == 'project') + { + if($this->app->tab == 'project') $extra = $currentMethod == 'testcase' ? $extra : $this->session->project; + if($this->app->tab == 'execution') $extra = $this->session->execution; + } - if($isBrowseBug and !$productID) + if($isQaModule and !$productID) { $currentProduct = new stdclass(); $currentProduct->name = $products[$productID]; @@ -102,7 +105,7 @@ class productModel extends model $output = ''; if(!empty($products)) { - $dropMenuLink = helper::createLink($isBrowseBug ? 'bug' : 'product', 'ajaxGetDropMenu', "objectID=$productID&module=$currentModule&method=$currentMethod&extra=$extra"); + $dropMenuLink = helper::createLink($isQaModule ? 'bug' : 'product', 'ajaxGetDropMenu', "objectID=$productID&module=$currentModule&method=$currentMethod&extra=$extra"); $output = "
"; @@ -539,7 +542,7 @@ class productModel extends model if($currentModule == 'tree' and $currentMethod == 'browse') $isShowBranch = true; if($currentModule == 'product' and strpos($this->config->product->showBranchMethod, $currentMethod) !== false) $isShowBranch = true; if($this->app->tab == 'qa' and strpos(',testsuite,testreport,testtask,', ",$currentModule,") === false) $isShowBranch = true; - if($this->app->tab == 'qa' and $currentModule == 'testtask' and strpos(',create,edit,', ",$currentMethod,") === false) $isShowBranch = true; + if($this->app->tab == 'qa' and $currentModule == 'testtask' and strpos(',create,edit,browseunits,importunitresult,unitcases,', ",$currentMethod,") === false) $isShowBranch = true; if($isShowBranch) { $this->lang->product->branch = sprintf($this->lang->product->branch, $this->lang->product->branchName[$currentProduct->type]); @@ -1978,7 +1981,19 @@ class productModel extends model elseif($module == 'testtask') { $extra = $method != 'browse' ? '' : "&extra=$extra"; - $link = helper::createLink($module, 'browse', "productID=%s" . ($branch ? "&branch=%s" : '&branch=0') . $extra); + if(strtolower($method) == 'browseunits') + { + $methodName = 'browseUnits'; + $param = '&browseType=newest&orderBy=id_desc&recTotal=0&recPerPage=0&pageID=1'; + $param .= $this->app->tab == 'project' ? "&projectID={$this->session->project}" : ''; + } + else + { + $methodName = 'browse'; + $param = ($branch ? "&branch=%s" : '&branch=0') . $extra; + } + + $link = helper::createLink($module, $methodName, "productID=%s" . $param); } elseif($module == 'bug' && $method == 'view') { @@ -1994,6 +2009,10 @@ class productModel extends model $projectID = isset($output['projectID']) ? $output['projectID'] : 0; $link = helper::createLink($module, $method, "productID=%s&branch=" . ($branch ? "%s" : '') . "&groupBy=&projectID=$projectID") . "#app=project"; } + elseif($module == 'testcase' and $method == 'browse') + { + $link = helper::createLink('testcase', 'browse', "productID=%s" . ($branch ? "&branch=%s" : '&branch=all') . "&browseType=$extra"); + } elseif($module == 'testreport' and ($method == 'create' or $method == 'edit')) { $vars = $method == 'edit' ? "objectID=%s" : "objectID=&objectType=testtask&extra=%s"; @@ -2027,6 +2046,11 @@ class productModel extends model { return helper::createLink('design', 'browse', "productID=%s"); } + elseif($module == 'project' and $method == 'testcase') + { + $params = explode('|', $extra); + return helper::createLink('project', 'testcase', "projectID={$params[0]}&productID=%s&branch=all&browseType={$params[1]}"); + } elseif($module == 'project' or $module == 'execution') { $objectID = $module == 'project' ? 'projectID' : 'executionID'; diff --git a/module/product/view/ajaxgetdropmenu.html.php b/module/product/view/ajaxgetdropmenu.html.php index e5e4614385..7dacf4a174 100644 --- a/module/product/view/ajaxgetdropmenu.html.php +++ b/module/product/view/ajaxgetdropmenu.html.php @@ -82,7 +82,7 @@ foreach($products as $programID => $programProducts) if($product->status == 'normal' and $product->PO == $this->app->user->account) { - $myProductsHtml .= '
  • ' . html::a($linkHtml, $productName, '', "class='$selected productName' title='{$productName}' data-key='" . zget($productsPinYin, $product->name, '') . "' " . $locateTab) . '
  • '; + $myProductsHtml .= '
  • ' . html::a($linkHtml, $productName, '', "class='$selected productName' title='{$productName}' data-key='" . zget($productsPinYin, $product->name, '') . "' data-app='$app->tab'") . '
  • '; if($selected == 'selected') $tabActive = 'myProduct'; diff --git a/module/productplan/lang/en.php b/module/productplan/lang/en.php index d4f1596ed2..0f61f73e15 100644 --- a/module/productplan/lang/en.php +++ b/module/productplan/lang/en.php @@ -79,10 +79,12 @@ $lang->productplan->endList[93] = '3 Months'; $lang->productplan->endList[186] = '6 Months'; $lang->productplan->endList[365] = '1 Year'; -$lang->productplan->errorNoTitle = 'ID %s title should not be empty.'; -$lang->productplan->errorNoBegin = 'ID %s begin time should not be empty.'; -$lang->productplan->errorNoEnd = 'ID %s end time should not be empty.'; -$lang->productplan->beginGeEnd = 'ID %s begin time should not be >= end time.'; +$lang->productplan->errorNoTitle = 'ID %s title should not be empty.'; +$lang->productplan->errorNoBegin = 'ID %s begin time should not be empty.'; +$lang->productplan->errorNoEnd = 'ID %s end time should not be empty.'; +$lang->productplan->beginGeEnd = 'ID %s begin time should not be >= end time.'; +$lang->productplan->beginLetterParent = "The start date of the parent plan: %s, the start date cannot be less than the start date of the parent plan."; +$lang->productplan->endGreaterParent = "The completion date of the parent plan: %s, the completion date cannot be greater than the completion date of the parent plan."; $lang->productplan->featureBar['browse']['all'] = 'All'; $lang->productplan->featureBar['browse']['unexpired'] = 'Unexpired'; diff --git a/module/program/js/kanban.js b/module/program/js/kanban.js index 8e46008db4..28c36e6796 100644 --- a/module/program/js/kanban.js +++ b/module/program/js/kanban.js @@ -10,9 +10,17 @@ function processKanbanData(key, programsData) /* Generate columns */ var columns = []; + var executionsCol; $.each(kanbanColumns, function(_, column) { var colType = column.type; + column = $.extend({}, column, + { + kanban: kanbanId, + id: kanbanId + '-' + column.type, + parentType: (colType === 'doingProject' || colType === 'doingExecution') ? 'doing' : false, + }); + if(colType === 'doingProject') { columns.push( @@ -25,13 +33,12 @@ function processKanbanData(key, programsData) count: '' }); } - - columns.push($.extend({}, column, + else if(colType === 'doingExecution') { - kanban: kanbanId, - id: kanbanId + '-' + column.type, - parentType: (colType === 'doingProject' || colType === 'doingExecution') ? 'doing' : false, - })); + executionsCol = column; + executionsCol.count = 0; + } + columns.push(column); }); /* Format lanes data */ @@ -87,6 +94,8 @@ function processKanbanData(key, programsData) var execution = project.execution; if(!execution || !execution.id) return; + + executionsCol.count++; projectItem.execution = $.extend({}, execution, {id: 'execution-' + execution.id, _id: execution.id}); }); } diff --git a/module/program/model.php b/module/program/model.php index 2455b423cf..3115650a18 100644 --- a/module/program/model.php +++ b/module/program/model.php @@ -449,7 +449,6 @@ class programModel extends model ->where('t1.deleted')->eq('0') ->beginIF($this->config->systemMode == 'new')->andWhere('t1.type')->eq('project')->fi() ->beginIF($this->config->systemMode == 'new' and ($this->cookie->involved or $involved))->andWhere('t2.type')->eq('project')->fi() - ->beginIF($this->config->systemMode == 'new' and ($this->cookie->involved or $involved))->andWhere('t3.objectType')->eq('project')->fi() ->beginIF($browseType != 'all' and $browseType != 'undone')->andWhere('t1.status')->eq($browseType)->fi() ->beginIF($browseType == 'undone')->andWhere('t1.status')->in('wait,doing')->fi() ->beginIF($path)->andWhere('t1.path')->like($path . '%')->fi() diff --git a/module/programplan/lang/en.php b/module/programplan/lang/en.php index 0a1830767e..55f3e82766 100644 --- a/module/programplan/lang/en.php +++ b/module/programplan/lang/en.php @@ -51,12 +51,12 @@ $lang->programplan->exporting = 'Exporting'; $lang->programplan->exportFail = 'Failed'; $lang->programplan->hideCriticalPath = 'Hide Critical Path'; $lang->programplan->showCriticalPath = 'Show Critical Path'; -$lang->programplan->errorEnd = "Project end date: %s, end date should be <= project end date."; $lang->programplan->errorBegin = "Project begin date: %s, begin date should be >= project begin date."; $lang->programplan->emptyBegin = '『Begin』should not be blank'; $lang->programplan->emptyEnd = '『End』should not be blank'; $lang->programplan->checkBegin = '『Begin』should be valid date'; $lang->programplan->checkEnd = '『End』should be valid date'; +$lang->programplan->errorEnd = "Project end date: %s, end date should be <= project end date."; $lang->programplan->milestoneList[1] = 'Yes'; $lang->programplan->milestoneList[0] = 'No'; diff --git a/module/project/control.php b/module/project/control.php index 022f155e7d..fbfcdfef1d 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -969,7 +969,9 @@ class project extends control $this->session->set('bugList', $this->app->getURI(true), 'project'); $products = array('0' => $this->lang->product->all) + $this->product->getProducts($projectID, 'all', '', false); - $this->lang->modulePageNav = $this->product->select($products, $productID, 'project', 'testcase', '', $branch, 0, '', false); + + $extra = "$projectID|$browseType"; + $this->lang->modulePageNav = $this->product->select($products, $productID, 'project', 'testcase', $extra, $branch, 0, '', false); echo $this->fetch('testcase', 'browse', "productID=$productID&branch=$branch&browseType=$browseType¶m=$param&orderBy=$orderBy&recTotal=$orderBy&recPerPage=$recPerPage&pageID=$pageID&projectID=$projectID"); } diff --git a/module/project/js/kanban.js b/module/project/js/kanban.js index 506d68b027..33cc274a05 100644 --- a/module/project/js/kanban.js +++ b/module/project/js/kanban.js @@ -10,9 +10,17 @@ function processKanbanData(key, programGroup) /* Generate columns */ var columns = []; + var executionsCol; $.each(kanbanColumns, function(_, column) { var colType = column.type; + column = $.extend({}, column, + { + kanban: kanbanId, + id: kanbanId + '-' + column.type, + parentType: (colType === 'doingProject' || colType === 'doingExecution') ? 'doing' : false, + }); + if(colType === 'doingProject') { columns.push( @@ -25,13 +33,13 @@ function processKanbanData(key, programGroup) count: '' }); } - - columns.push($.extend({}, column, + else if(colType === 'doingExecution') { - kanban: kanbanId, - id: kanbanId + '-' + column.type, - parentType: (colType === 'doingProject' || colType === 'doingExecution') ? 'doing' : false, - })); + executionsCol = column; + executionsCol.count = 0; + } + + columns.push(column); }); /* Format lanes data */ var lanes = []; @@ -58,6 +66,7 @@ function processKanbanData(key, programGroup) var execution = latestExecutions[projectID]; if(execution && execution.id) { + executionsCol.count++; projectItem.execution = $.extend({}, execution, {id: 'execution-' + execution.id, _id: execution.id}); } } @@ -72,6 +81,15 @@ function processKanbanData(key, programGroup) return {id: kanbanId, columns: columns, lanes: lanes}; } +/** Define kanban d-n-d rules */ +var projectDropRules = +{ + waitProject: ['doingProject', 'closedProject'], + doingProject: ['closedProject'], + closedProject: ['doingProject'], +}; +window.kanbanDropRules = {my: projectDropRules, other: projectDropRules}; + /* * Find drop columns * @param {JQuery} $element Drag element @@ -145,13 +163,6 @@ function changeCardColType(card, fromColType, toColType, kanbanID) var modalTrigger = new $.zui.ModalTrigger({type: 'iframe', width: '80%', url: link}); modalTrigger.show(); } - - /* - // TODO: The server must return a updated kanban data 服务器返回更新后的看板数据 - - // 调用 updateKanban 更新看板数据 - updateKanban(kanbanID, newKanbanData); - */ } /** @@ -161,7 +172,7 @@ function changeCardColType(card, fromColType, toColType, kanbanID) */ function handleFinishDrop(event) { - var $card = $(event.element); // The drag card + var $card = $(event.element).closest('.kanban-item'); // The drag card var $dragCol = $card.closest('.kanban-lane-col'); var $dropCol = $(event.target); @@ -171,8 +182,6 @@ function handleFinishDrop(event) var toColType = $dropCol.data('type'); var kanbanID = $card.closest('.kanban').data('id'); - if(fromColType == 'doingProject') card = $card.parent().parent().data('item'); - changeCardColType(card, fromColType, toColType, kanbanID); } @@ -197,7 +206,7 @@ $(function() virtualize: true, droppable: { - selector: '.kanban-item:not(.execution-item)', + selector: '.kanban-card:not(.execution-item)', target: findDropColumns, finish: handleFinishDrop, mouseButton: 'left' diff --git a/module/project/lang/en.php b/module/project/lang/en.php index 4fab2f1b2c..3e26598ab8 100644 --- a/module/project/lang/en.php +++ b/module/project/lang/en.php @@ -180,9 +180,6 @@ $lang->project->createExecution = "There is no {$lang->executionCommon} u $lang->project->unlinkExecutionMember = "The user participated in %s executions such as %s%s. Do you want to remove the user from those executions as well? (The data related to this user will not be deleted.)"; $lang->project->unlinkExecutionMembers = "The team members you are removing are also in the execution team of this project. Do you want to remove them from the execution team too?"; -$lang->project->realEndNotEmpty = 'Actual End should not be empty.'; -$lang->project->realEndNotFuture = 'Actual End should be < = today.'; - $lang->project->tenThousand = ''; $lang->project->unitList['CNY'] = 'RMB'; diff --git a/module/release/lang/zh-cn.php b/module/release/lang/zh-cn.php index 644767324c..75304b8ae9 100644 --- a/module/release/lang/zh-cn.php +++ b/module/release/lang/zh-cn.php @@ -56,7 +56,7 @@ $lang->release->createdBugs = '本次共遗留 %s 个Bug'; $lang->release->export = '导出HTML'; $lang->release->yesterday = '昨日发布'; $lang->release->all = '所有'; -$lang->release->notify = '通知'; +$lang->release->notify = '发送通知'; $lang->release->notifyUsers = '通知人员'; $lang->release->mailto = '抄送给'; $lang->release->mailContent = '

    尊敬的用户,您好!

    您反馈的如下需求和Bug已经在 %s版本中发布,请联系客户经理查看最新版本。

    '; diff --git a/module/report/lang/zh-cn.php b/module/report/lang/zh-cn.php index 8b5dc45830..c88541dcd9 100644 --- a/module/report/lang/zh-cn.php +++ b/module/report/lang/zh-cn.php @@ -112,6 +112,7 @@ $lang->report->proVersion = 'Try ZenTao Pro for more!'; $lang->report->workloadDesc = '工作负载=用户所有任务剩余工时之和/选择的时间天数*每天的工时。例如:起止时间设为1月1日~1月7日、工作日天数5天、每天工时8h,统计的是所有指派给该人员的未完成的任务,在5天内,每天8h的情况下的工作负载。'; + $lang->report->annualData = new stdclass(); $lang->report->annualData->title = "%s %s年工作汇总"; $lang->report->annualData->exportByZentao = "由禅道系统导出"; diff --git a/module/story/lang/en.php b/module/story/lang/en.php index d5da3bf802..4842c41a97 100644 --- a/module/story/lang/en.php +++ b/module/story/lang/en.php @@ -250,6 +250,7 @@ $lang->story->legendChildStories = 'Child Stories'; $lang->story->legendSpec = 'Description'; $lang->story->legendVerify = 'Acceptance'; $lang->story->legendMisc = 'Misc.'; +$lang->story->legendInformation = 'Story Information'; $lang->story->lblChange = 'Change'; $lang->story->lblReview = 'Review'; diff --git a/module/task/lang/en.php b/module/task/lang/en.php index 56fea24343..b2c4b83bd8 100644 --- a/module/task/lang/en.php +++ b/module/task/lang/en.php @@ -25,6 +25,7 @@ $lang->task->delayed = 'Delayed'; $lang->task->view = "Task Detail"; $lang->task->logEfforts = "Effort"; $lang->task->record = "Estimates"; +$lang->task->teamConsumed = "Tean Consumed"; $lang->task->start = "Start"; $lang->task->startAction = "Start Task"; $lang->task->restart = "Continue"; @@ -197,6 +198,7 @@ $lang->task->legendBasic = 'Basic Info'; $lang->task->legendEffort = 'Effort'; $lang->task->legendLife = 'Task Life'; $lang->task->legendDesc = 'Task Description'; +$lang->task->legendDetail = 'Task Detail'; $lang->task->confirmDelete = "Do you want to delete this task?"; $lang->task->confirmDeleteEstimate = "Do you want to delete it?"; diff --git a/module/testcase/control.php b/module/testcase/control.php index 8817d56461..085b8ae52d 100644 --- a/module/testcase/control.php +++ b/module/testcase/control.php @@ -131,7 +131,7 @@ class testcase extends control } else { - $this->qa->setMenu($this->products, $productID, $branch); + $this->qa->setMenu($this->products, $productID, $branch, $browseType); } $uri = $this->app->getURI(true); @@ -1365,6 +1365,12 @@ class testcase extends control */ public function export($productID, $orderBy, $taskID = 0, $browseType = '') { + if(strpos($orderBy, 'case') !== false) + { + list($field, $sort) = explode('_', $orderBy); + $orderBy = '`' . $field . '`_' . $sort; + } + $product = $this->loadModel('product')->getById($productID); if($product->type != 'normal') $this->lang->testcase->branch = $this->lang->product->branchName[$product->type]; if($_POST) @@ -1847,11 +1853,16 @@ class testcase extends control $caseLang = $this->lang->testcase; $caseConfig = $this->config->testcase; $branches = $this->loadModel('branch')->getPairs($productID); - $modules = $this->loadModel('tree')->getOptionMenu($productID, 'case', 0, empty($branches) ? 0 : array_keys($branches)); $stories = $this->loadModel('story')->getProductStoryPairs($productID, $branch); $fields = $this->testcase->getImportFields($productID); $fields = array_flip($fields); + $branchModules = $this->loadModel('tree')->getOptionMenu($productID, 'case', 0, empty($branches) ? array(0) : array_keys($branches)); + foreach($branchModules as $branchID => $moduleList) + { + foreach($moduleList as $moduleID => $moduleName) $modules[$moduleID] = $moduleName; + } + if(!empty($maxImport) and file_exists($tmpFile)) { $data = unserialize(file_get_contents($tmpFile)); diff --git a/module/testcase/view/batchcreate.html.php b/module/testcase/view/batchcreate.html.php index 6c85306db3..1c39dc88fa 100644 --- a/module/testcase/view/batchcreate.html.php +++ b/module/testcase/view/batchcreate.html.php @@ -18,7 +18,6 @@

    testcase->batchCreate;?> - session->currentProductType !== 'normal' and $branch !== 'all') echo '' . $branches[$branch] . '';?> arrow . $story->title ?> diff --git a/module/testcase/view/view.html.php b/module/testcase/view/view.html.php index db1001db61..b87f82e4bf 100644 --- a/module/testcase/view/view.html.php +++ b/module/testcase/view/view.html.php @@ -131,7 +131,7 @@ id", $case, 'button', '', '', 'showinonlybody'); if(!$isLibCase and $case->auto != 'unit') common::printIcon('testcase', 'create', "productID=$case->product&branch=$case->branch&moduleID=$case->module&from=testcase¶m=$case->id", $case, 'button', 'copy'); - if($isLibCase and common::hasPriv('caselib', 'createCase')) echo html::a($this->createLink('caselib', 'createCase', "libID=$case->lib&moduleID=$case->module¶m=$case->id", $case), "", '', "class='btn' title='{$lang->testcase->copy}'"); + if($isLibCase and common::hasPriv('caselib', 'createCase')) echo html::a($this->createLink('caselib', 'createCase', "libID=$case->lib&moduleID=$case->module¶m=$case->id"), "", '', "class='btn' title='{$lang->testcase->copy}'"); common::printIcon('testcase', 'delete', "caseID=$case->id", $case, 'button', 'trash', 'hiddenwin', ''); ?> diff --git a/module/testreport/control.php b/module/testreport/control.php index 5f3a9164c2..52b14a3fa7 100644 --- a/module/testreport/control.php +++ b/module/testreport/control.php @@ -250,6 +250,7 @@ class testreport extends control $execution = $this->execution->getById($executionID); $tasks = $this->testtask->getExecutionTasks($executionID); + $task = $objectID ? $this->testtask->getById($objectID) : key($tasks); $owners = array(); $buildIdList = array(); $productIdList = array(); @@ -287,8 +288,8 @@ class testreport extends control $builds = $this->build->getByList($buildIdList); $stories = !empty($builds) ? $this->testreport->getStories4Test($builds) : $this->story->getExecutionStories($execution->id);; - $begin = !empty($begin) ? date("Y-m-d", strtotime($begin)) : $execution->begin; - $end = !empty($end) ? date("Y-m-d", strtotime($end)) : $execution->end; + $begin = !empty($begin) ? date("Y-m-d", strtotime($begin)) : $task->begin; + $end = !empty($end) ? date("Y-m-d", strtotime($end)) : $task->end; $owner = current($owners); $bugs = $this->testreport->getBugs4Test($builds, $productIdList, $begin, $end, 'execution'); diff --git a/module/testtask/control.php b/module/testtask/control.php index f6f1581325..43bf017e86 100644 --- a/module/testtask/control.php +++ b/module/testtask/control.php @@ -175,7 +175,7 @@ class testtask extends control } $this->loadModel('project')->setMenu($this->session->project); - $this->lang->modulePageNav = $this->product->select($this->products, $productID, 'testtask', 'browseUnits', "projectID=$projectID"); + $this->lang->modulePageNav = $this->product->select($this->products, $productID, 'testtask', 'browseUnits', "projectID=$projectID", '', 0, '', false); } else { @@ -365,7 +365,7 @@ class testtask extends control $this->lang->scrum->menu->qa['subMenu']->testcase['subModule'] = 'testtask'; $this->lang->scrum->menu->qa['subMenu']->testtask['subModule'] = ''; $this->loadModel('project')->setMenu($this->session->project); - $this->lang->modulePageNav = $this->product->select($this->products, $productID, 'testtask', 'browseUnits'); + $this->lang->modulePageNav = $this->product->select($this->products, $productID, 'testtask', 'browseUnits', '', '', 0, '', false); } else { @@ -1365,7 +1365,7 @@ class testtask extends control ->andWhere('`case`')->in($this->post->caseIDList) ->exec(); $this->loadModel('action'); - foreach($this->post->caseIDList as $caseID) $this->action->create('case', $caseID, 'assigned', '', $taskID); + foreach($this->post->caseIDList as $caseID) $this->action->create('case', $caseID, 'assigned', '', $this->post->assignedTo); die(js::locate($this->session->caseList, 'parent')); } @@ -1394,7 +1394,7 @@ class testtask extends control $this->lang->scrum->menu->qa['subMenu']->testcase['subModule'] = 'testtask'; $this->lang->scrum->menu->qa['subMenu']->testtask['subModule'] = ''; $this->loadModel('project')->setMenu($this->session->project); - $this->lang->modulePageNav = $this->product->select($this->products, $productID, 'testtask', 'browseUnits'); + $this->lang->modulePageNav = $this->product->select($this->products, $productID, 'testtask', 'browseUnits', '', '', 0, '', false); /* Replace language. */ $project = $this->project->getByID($this->session->project); diff --git a/module/testtask/lang/en.php b/module/testtask/lang/en.php index b664c40091..3254494df6 100644 --- a/module/testtask/lang/en.php +++ b/module/testtask/lang/en.php @@ -37,9 +37,11 @@ $lang->testtask->next = 'Next'; $lang->testtask->start = "Start"; $lang->testtask->close = "Close"; $lang->testtask->wait = "Waiting"; +$lang->testtask->waitAB = "Waiting"; $lang->testtask->block = "Block"; $lang->testtask->activate = "Activate"; $lang->testtask->testing = "Testing"; +$lang->testtask->testingAB = "Testing"; $lang->testtask->blocked = "Blocked"; $lang->testtask->done = "Tested"; $lang->testtask->totalStatus = "All"; @@ -116,10 +118,9 @@ $lang->testtask->statusList['doing'] = 'Doing'; $lang->testtask->statusList['done'] = 'Closed'; $lang->testtask->statusList['blocked'] = 'Blocked'; -$lang->testtask->priList[0] = ''; -$lang->testtask->priList[3] = '3'; $lang->testtask->priList[1] = '1'; $lang->testtask->priList[2] = '2'; +$lang->testtask->priList[3] = '3'; $lang->testtask->priList[4] = '4'; $lang->testtask->unlinkedCases = 'Unlinked Case'; diff --git a/module/testtask/model.php b/module/testtask/model.php index 74ba37814e..51243d6618 100644 --- a/module/testtask/model.php +++ b/module/testtask/model.php @@ -72,12 +72,11 @@ class testtaskModel extends model { $products = $scopeAndStatus[0] == 'all' ? $this->app->user->view->products : array(); - return $this->dao->select("t1.*, t2.name AS productName, t3.name AS executionName, t4.name AS buildName, if(t4.name != '', t4.branch, t5.branch) AS branch") + return $this->dao->select("t1.*, t2.name AS productName, t3.name AS executionName, t4.name AS buildName, t4.branch AS branch") ->from(TABLE_TESTTASK)->alias('t1') ->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product = t2.id') ->leftJoin(TABLE_EXECUTION)->alias('t3')->on('t1.execution = t3.id') ->leftJoin(TABLE_BUILD)->alias('t4')->on('t1.build = t4.id') - ->leftJoin(TABLE_PROJECTPRODUCT)->alias('t5')->on('t1.execution = t5.project and t1.product = t5.product') ->where('t1.deleted')->eq(0) ->andWhere('t1.auto')->ne('unit') @@ -86,7 +85,7 @@ class testtaskModel extends model ->beginIF($scopeAndStatus[0] == 'all')->andWhere('t1.product')->in($products)->fi() ->beginIF(strtolower($scopeAndStatus[1]) == 'totalstatus')->andWhere('t1.status')->in('blocked,doing,wait,done')->fi() ->beginIF(strtolower($scopeAndStatus[1]) != 'totalstatus')->andWhere('t1.status')->eq($scopeAndStatus[1])->fi() - ->beginIF($branch !== 'all')->andWhere("if(t4.branch, t4.branch, t5.branch) = '$branch'")->fi() + ->beginIF($branch !== 'all')->andWhere('t4.branch')->eq($branch)->fi() ->beginIF($beginTime)->andWhere('t1.begin')->ge($beginTime)->fi() ->beginIF($endTime)->andWhere('t1.end')->le($endTime)->fi() ->orderBy($orderBy) diff --git a/module/testtask/view/caseheader.html.php b/module/testtask/view/caseheader.html.php index 5d55265d62..ea8c25bd69 100644 --- a/module/testtask/view/caseheader.html.php +++ b/module/testtask/view/caseheader.html.php @@ -37,7 +37,7 @@
    id", $task, 'button', 'link'); - common::printIcon('testcase', 'export', "productID=$productID&orderBy=`case`_desc&taskID=$task->id", '', 'button', '', '', 'export'); + common::printIcon('testcase', 'export', "productID=$productID&orderBy=case_desc&taskID=$task->id", '', 'button', '', '', 'export'); common::printIcon('testtask', 'report', "productID=$productID&taskID=$task->id&browseType=$browseType&branchID=$task->branch&moduleID=" . (empty($moduleID) ? '' : $moduleID)); common::printIcon('testtask', 'view', "taskID=$task->id", '', 'button', 'list-alt'); common::printBack($this->session->testtaskList, 'btn btn-link'); diff --git a/module/upgrade/control.php b/module/upgrade/control.php index 80d6f1421c..1dd48d2d36 100644 --- a/module/upgrade/control.php +++ b/module/upgrade/control.php @@ -392,7 +392,7 @@ class upgrade extends control foreach($projectProducts as $projectProduct) { $data = new stdclass(); - $data->project = $projectList[$projectProduct->project]; + $data->project = $_POST['projectType'] == 'execution' ? $projectList : $projectList[$projectProduct->project]; $data->product = $projectProduct->product; $data->plan = $projectProduct->plan; $data->branch = $projectProduct->branch; diff --git a/www/js/zui/kanban/min.css b/www/js/zui/kanban/min.css index 069a39a9f2..951e7637d5 100644 --- a/www/js/zui/kanban/min.css +++ b/www/js/zui/kanban/min.css @@ -1,6 +1,6 @@ /*! - * ZUI: ZUI Kanban View - v1.10.0 - 2021-12-02 + * ZUI: ZUI Kanban View - v1.10.0 - 2021-12-06 * http://openzui.com * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2021 cnezsoft.com; Licensed MIT - */.kanban{min-height:300px}.kanban-header{position:relative;background-color:rgba(0,0,0,.07)}.use-flex .kanban-cols{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;flex-direction:row;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto}.kanban-col{min-width:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.no-flex .kanban-col{position:absolute;top:0;bottom:0}.kanban-col+.kanban-col{border-left:2px solid #fff}.kanban-header-cols{position:absolute;top:0;right:0;bottom:0;left:auto}.kanban-header-col{position:relative}.kanban-header-col>.title>.icon{display:inline-block;vertical-align:middle}.kanban-header-col>.title>.text{display:inline-block;margin:0 5px;overflow:hidden;font-weight:700;text-overflow:clip;white-space:nowrap;vertical-align:middle}.kanban-header-col>.title>.count{position:relative;top:1px;display:inline-block;color:#8b91a2;vertical-align:middle}.kanban-affixed .kanban-header-col>.title>.count{color:#ededed}.use-flex .kanban-header-col{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:0;min-height:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0 30px;flex-direction:row;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row}.use-flex .kanban-header-col>.title{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;max-width:100%;flex-direction:row;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.no-flex .kanban-header-col>.title{position:absolute;top:50%;right:30px;left:30px;margin-top:-10px;line-height:20px;text-align:center;white-space:nowrap}.kanban-header-col>.actions{position:absolute;top:0;right:0}.kanban-header-col>.actions>.btn,.kanban-header-col>.actions>a{min-width:20px}.kanban-header-col>.actions>.btn>.icon,.kanban-header-col>.actions>a>.icon{opacity:.5}.kanban-affixed .kanban-header-col>.actions>.btn,.kanban-affixed .kanban-header-col>.actions>a{color:#fff}.kanban-header-parent-col>.kanban-header-col,.kanban-header-parent-col>.kanban-header-sub-cols{height:50%}.use-flex .kanban-header-parent-col{padding:0;flex-direction:column;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch}.kanban-header-sub-cols{position:relative;margin-top:-1px;margin-left:-2px;border-top:2px solid #fff}.use-flex .kanban-header-sub-cols{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;flex-direction:row;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row}.use-flex .kanban-header-sub-cols>.kanban-col{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-col:first-child>.kanban-header-sub-cols{margin-left:0}.kanban-lane,.kanban-sub-lane{position:relative;background-color:#f1f3f5}.use-flex .kanban-lane,.use-flex .kanban-sub-lane{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-height:0;flex-direction:row;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.kanban-lane+.kanban-lane{margin-top:2px}.kanban-lane>*{opacity:1;-webkit-transition:opacity .1s;-o-transition:opacity .1s;transition:opacity .1s}.kanban-lane.virtual-pending>*{opacity:0}.kanban-lane .has-sub-lane{background:0 0}.no-flex .kanban-lane-cols{position:absolute;top:0;right:0;bottom:0}.no-flex .kanban-sub-lane-cols{position:absolute;top:0;right:0;bottom:0;left:0}.kanban-sub-lane{-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto}.kanban-lane-name{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:20px;overflow:hidden;color:#fff;text-align:center;background-color:#3dc6fd;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none}.kanban-lane-name>.text{position:absolute;top:5px;bottom:5px;left:0;display:block;overflow:hidden;line-height:20px;text-align:center;white-space:nowrap;-webkit-writing-mode:tb-rl;-ms-writing-mode:tb-rl;writing-mode:tb-rl;-webkit-writing-mode:vertical-rl;writing-mode:vertical-rl}.no-flex .kanban-lane-name{position:absolute;top:0;bottom:0;left:0}.use-flex .kanban-sub-lanes{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;flex-direction:column;-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-pack:stretch;-webkit-justify-content:stretch;-ms-flex-pack:stretch;justify-content:stretch;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column}.no-flex .kanban-sub-lanes{position:absolute;top:0;right:0;bottom:0}.kanban-sub-lanes.no-sub-lane{background-color:#f1f3f5}.kanban-dragging .kanban-lane-col{-webkit-transition:-webkit-box-shadow .1s;-o-transition:box-shadow .1s;transition:-webkit-box-shadow .1s;transition:box-shadow .1s;transition:box-shadow .1s,-webkit-box-shadow .1s}.kanban-lane-col.drop-target{-webkit-box-shadow:inset 0 0 0 3px rgba(255,152,0,.25);box-shadow:inset 0 0 0 3px rgba(255,152,0,.25)}.kanban-lane-col.drop-to{-webkit-box-shadow:inset 0 0 1px 4px rgba(255,152,0,.75);box-shadow:inset 0 0 1px 4px rgba(255,152,0,.75)}.kanban-lane-col.drop-to .kanban-lane-actions>.btn{background-color:rgba(255,152,0,.25);border:1px dotted #ff9800}.kanban-lane-col.drop-to .kanban-lane-actions>.btn>span{opacity:0}.kanban-lane-col[data-type=EMPTY]{background-color:#fff}.kanban-lane-items{height:100%;overflow:auto}.kanban-lane-actions{padding:10px 15px}.use-flex .kanban-items-grid{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start}.kanban-card{position:relative;padding:8px 10px;background:#fff;border:1px solid #fff;border-radius:4px;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);-webkit-transition:-webkit-box-shadow .2s,-webkit-transform .2s;-o-transition:box-shadow .2s,-o-transform .2s;transition:-webkit-box-shadow .2s,-webkit-transform .2s;transition:box-shadow .2s,transform .2s;transition:box-shadow .2s,transform .2s,-webkit-box-shadow .2s,-webkit-transform .2s,-o-transform .2s}.drag-from .kanban-card{background-color:#aaa;opacity:.2}.kanban-card:hover{border-color:rgba(0,0,0,.1);-webkit-box-shadow:0 4px 10px 0 rgba(0,0,0,.09);box-shadow:0 4px 10px 0 rgba(0,0,0,.09)}.drag-shadow .kanban-card{z-index:10;border-color:rgba(0,0,0,.2);-webkit-box-shadow:0 4px 10px 0 rgba(0,0,0,.05),0 4px 20px 0 rgba(0,0,0,.3);box-shadow:0 4px 10px 0 rgba(0,0,0,.05),0 4px 20px 0 rgba(0,0,0,.3);-webkit-transition:-webkit-box-shadow .2s,-webkit-transform .4s!important;-o-transition:box-shadow .2s,-o-transform .4s!important;transition:-webkit-box-shadow .2s,-webkit-transform .4s!important;transition:box-shadow .2s,transform .4s!important;transition:box-shadow .2s,transform .4s,-webkit-box-shadow .2s,-webkit-transform .4s,-o-transform .4s!important}.drag-shadow .kanban-card.in{-webkit-transform:scale(1.1) rotate(5deg);-ms-transform:scale(1.1) rotate(5deg);-o-transform:scale(1.1) rotate(5deg);transform:scale(1.1) rotate(5deg)}.kanban-dragging{cursor:move} \ No newline at end of file + */.kanban{min-height:300px}.kanban-header{position:relative;background-color:rgba(0,0,0,.07)}.use-flex .kanban-cols{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:0;flex-direction:row;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto}.kanban-col{min-width:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.no-flex .kanban-col{position:absolute;top:0;bottom:0}.kanban-col+.kanban-col{border-left:2px solid #fff}.kanban-header-cols{position:absolute;top:0;right:0;bottom:0;left:auto}.kanban-header-col{position:relative}.kanban-header-col>.title>.icon{display:inline-block;vertical-align:middle}.kanban-header-col>.title>.text{display:inline-block;margin:0 5px;overflow:hidden;font-weight:700;text-overflow:clip;white-space:nowrap;vertical-align:middle}.kanban-header-col>.title>.count{position:relative;top:1px;display:inline-block;color:#8b91a2;vertical-align:middle}.kanban-affixed .kanban-header-col>.title>.count{color:#ededed}.use-flex .kanban-header-col{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:0;min-height:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0 30px;flex-direction:row;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row}.use-flex .kanban-header-col>.title{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;max-width:100%;flex-direction:row;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.no-flex .kanban-header-col>.title{position:absolute;top:50%;right:30px;left:30px;margin-top:-10px;line-height:20px;text-align:center;white-space:nowrap}.kanban-header-col>.actions{position:absolute;top:0;right:0}.kanban-header-col>.actions>.btn,.kanban-header-col>.actions>a{min-width:20px}.kanban-header-col>.actions>.btn>.icon,.kanban-header-col>.actions>a>.icon{opacity:.5}.kanban-affixed .kanban-header-col>.actions>.btn,.kanban-affixed .kanban-header-col>.actions>a{color:#fff}.kanban-header-parent-col>.kanban-header-col,.kanban-header-parent-col>.kanban-header-sub-cols{height:50%}.use-flex .kanban-header-parent-col{padding:0;flex-direction:column;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch}.kanban-header-sub-cols{position:relative;margin-top:-1px;margin-left:-2px;border-top:2px solid #fff}.use-flex .kanban-header-sub-cols{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;flex-direction:row;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row}.use-flex .kanban-header-sub-cols>.kanban-col{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-col:first-child>.kanban-header-sub-cols{margin-left:0}.kanban-lane,.kanban-sub-lane{position:relative;background-color:#f1f3f5}.use-flex .kanban-lane,.use-flex .kanban-sub-lane{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-height:0;flex-direction:row;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.kanban-lane+.kanban-lane{margin-top:2px}.kanban-lane>*{opacity:1;-webkit-transition:opacity .1s;-o-transition:opacity .1s;transition:opacity .1s}.kanban-lane.virtual-pending>*{opacity:0}.kanban-lane .has-sub-lane{background:0 0}.no-flex .kanban-lane-cols{position:absolute;top:0;right:0;bottom:0}.no-flex .kanban-sub-lane-cols{position:absolute;top:0;right:0;bottom:0;left:0}.kanban-sub-lane{-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto}.kanban-lane-name{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:20px;overflow:hidden;color:#fff;text-align:center;background-color:#3dc6fd;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none}.kanban-lane-name>.text{position:absolute;top:5px;bottom:5px;left:0;display:block;overflow:hidden;line-height:20px;text-align:center;white-space:nowrap;-webkit-writing-mode:tb-rl;-ms-writing-mode:tb-rl;writing-mode:tb-rl;-webkit-writing-mode:vertical-rl;writing-mode:vertical-rl}.no-flex .kanban-lane-name{position:absolute;top:0;bottom:0;left:0}.use-flex .kanban-sub-lanes{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;flex-direction:column;-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-pack:stretch;-webkit-justify-content:stretch;-ms-flex-pack:stretch;justify-content:stretch;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column}.no-flex .kanban-sub-lanes{position:absolute;top:0;right:0;bottom:0}.kanban-sub-lanes.no-sub-lane{background-color:#f1f3f5}.kanban-dragging .kanban-lane-col{-webkit-transition:-webkit-box-shadow .1s;-o-transition:box-shadow .1s;transition:-webkit-box-shadow .1s;transition:box-shadow .1s;transition:box-shadow .1s,-webkit-box-shadow .1s}.kanban-lane-col.drop-target{-webkit-box-shadow:inset 0 0 0 3px rgba(255,152,0,.25);box-shadow:inset 0 0 0 3px rgba(255,152,0,.25)}.kanban-lane-col.drop-to{-webkit-box-shadow:inset 0 0 1px 4px rgba(255,152,0,.75);box-shadow:inset 0 0 1px 4px rgba(255,152,0,.75)}.kanban-lane-col.drop-to .kanban-lane-actions>.btn{background-color:rgba(255,152,0,.25);border:1px dotted #ff9800}.kanban-lane-col.drop-to .kanban-lane-actions>.btn>span{opacity:0}.kanban-lane-col[data-type=EMPTY]{background-color:#fff}.kanban-lane-items{height:100%;overflow:auto}.kanban-lane-actions{padding:10px 15px}.use-flex .kanban-items-grid{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start}.kanban-card{position:relative;padding:8px 10px;background:#fff;border:1px solid #fff;border-radius:4px;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);-webkit-transition:-webkit-box-shadow .2s,-webkit-transform .2s;-o-transition:box-shadow .2s,-o-transform .2s;transition:-webkit-box-shadow .2s,-webkit-transform .2s;transition:box-shadow .2s,transform .2s;transition:box-shadow .2s,transform .2s,-webkit-box-shadow .2s,-webkit-transform .2s,-o-transform .2s}.drag-from .kanban-card{background-color:#aaa;opacity:.2}.kanban-card:hover{border-color:rgba(0,0,0,.1);-webkit-box-shadow:0 4px 10px 0 rgba(0,0,0,.09);box-shadow:0 4px 10px 0 rgba(0,0,0,.09)}.drag-shadow .kanban-card{z-index:10;border-color:rgba(0,0,0,.2);-webkit-box-shadow:0 4px 10px 0 rgba(0,0,0,.05),0 4px 20px 0 rgba(0,0,0,.3);box-shadow:0 4px 10px 0 rgba(0,0,0,.05),0 4px 20px 0 rgba(0,0,0,.3);-webkit-transition:-webkit-box-shadow .2s,-webkit-transform .4s!important;-o-transition:box-shadow .2s,-o-transform .4s!important;transition:-webkit-box-shadow .2s,-webkit-transform .4s!important;transition:box-shadow .2s,transform .4s!important;transition:box-shadow .2s,transform .4s,-webkit-box-shadow .2s,-webkit-transform .4s,-o-transform .4s!important}.drag-shadow .kanban-card.in{-webkit-transform:scale(1.1) rotate(5deg);-ms-transform:scale(1.1) rotate(5deg);-o-transform:scale(1.1) rotate(5deg);transform:scale(1.1) rotate(5deg)}.kanban-dragging{cursor:move} \ No newline at end of file diff --git a/www/js/zui/kanban/min.js b/www/js/zui/kanban/min.js index de64e49a2c..3733872db2 100644 --- a/www/js/zui/kanban/min.js +++ b/www/js/zui/kanban/min.js @@ -1,7 +1,7 @@ /*! - * ZUI: ZUI Kanban View - v1.10.0 - 2021-12-02 + * ZUI: ZUI Kanban View - v1.10.0 - 2021-12-06 * http://openzui.com * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2021 cnezsoft.com; Licensed MIT */ -!function(){"use strict";function a(a,e){return n&&!e?requestAnimationFrame(a):setTimeout(a,e||0)}function e(a){return n?cancelAnimationFrame(a):void clearTimeout(a)}var n="function"==typeof window.requestAnimationFrame;$.zui({asap:a,clearAsap:e})}(),function(a){"use strict";function e(e,n){"string"==typeof e&&(e=a(e)),e instanceof a&&(e=e[0]);var t=e.getBoundingClientRect(),r=window.innerHeight||document.documentElement.clientHeight,d=window.innerWidth||document.documentElement.clientWidth;if(n)return t.left>=0&&t.top>=0&&t.left+t.width<=d&&t.top+t.height<=r;var i=t.top<=r&&t.top+t.height>=0,o=t.left<=d&&t.left+t.width>=0;return i&&o}var n="zui.virtualRender",t=function(e,r){"function"==typeof r&&(r={render:r});var d=this;d.name=n,d.$=a(e),d.options=r=a.extend({},t.DEFAULTS,this.$.data(),r),d.rendered=!1;var i=r.container;"function"==typeof i&&(i=i(d));var o=a(i?i:window);d.tryRender()||(d.$container=o,d.scrollListener=d.tryRender.bind(d),r.pendingClass&&d.$.addClass(r.pendingClass),o.on("scroll",d.scrollListener))};t.prototype.tryRender=function(){var n=this;return!(n.rendered||!e(n.$))&&(n.renderTaskID&&a.zui.clearAsap(n.renderTaskID),n.renderTaskID=a.zui.asap(function(){n.renderTaskID=null;var a=n.options.render(n.$);a!==!1&&(n.rendered=!0,n.destroy())},n.options.delay),!0)},t.prototype.destroy=function(){var e=this;e.renderTaskID&&a.zui.clearAsap(e.renderTaskID),e.scrollListener&&(e.$container.off("scroll",e.scrollListener),e.scrollListener=null);var t=e.options.pendingClass;t&&e.$.removeClass(t),e.$.removeData(n)},t.DEFAULTS={pendingClass:"virtual-pending"},a.fn.virtualRender=function(e){return this.each(function(){var r=a(this),d=r.data(n);if(d){if("string"==typeof e)return d[e]();d.destroy()}r.data(n,d=new t(this,e))})},a.zui.isElementInViewport=e}(jQuery),function(a){"use strict";var e="zui.kanban",n="object"==typeof CSS&&CSS.supports("display","flex"),t=function(n,r){var d=this;if(d.name=e,d.$=a(n).addClass("kanban"),r=d.setOptions(a.extend({},t.DEFAULTS,this.$.data(),r)),r.onAction){var i=function(e){var n=a(this);r.onAction(n.data("action"),n,e,d)};d.$.on("click",".action",i).on("dblclick",".action-dbc",i)}if("auto"===r.droppable&&(r.droppable=!r.readonly),r.droppable){var o=0,s={dropOnMouseleave:!0,selector:".kanban-item",target:'.kanban-lane-col:not([data-type="EMPTY"])',drop:function(a){"function"==typeof r.droppable?r.droppable(a):r.onAction&&r.onAction("dropItem",a.element,a,d)},start:function(e){d.$.addClass("kanban-dragging"),o&&clearTimeout(o),o=setTimeout(function(){a(e.shadowElement).addClass("in"),o=0},50)},always:function(){d.$.removeClass("kanban-dragging"),o&&(clearTimeout(o),o=0)}};"object"==typeof r.droppable&&a.extend(s,r.droppable),d.$.droppable(s)}if(!r.useFlex){var l=0;a(window).on("resize",function(){l&&a.zui.clearAsap(l),l=a.zui.asap(function(){l=0,d.adjustSize()})})}r.onCreate&&r.onCreate(d)};t.prototype.setOptions=function(e){var t=this,r=a.extend({},t.options,e);t.options=r,r.useFlex&&!n&&(r.useFlex=!1),t.$.toggleClass("no-flex",!r.useFlex).toggleClass("use-flex",!!r.useFlex);var d=!!a.fn.virtualRender&&r.virtualize;return d&&("object"!=typeof d&&(d={lane:!0}),t.virtualize=a.extend({},d)),t.data=r.data||[],t.render(t.data),r},t.prototype.render=function(a){var e=this;a&&(e.data=a),e.data&&!Array.isArray(e.data)&&(e.data=[e.data]);var t=e.data||[];e.options.beforeRender&&e.options.beforeRender(e,t),e.$.toggleClass("kanban-readonly",!!e.options.readonly).toggleClass("kanban-no-lane-name",!!e.options.noLaneName),e.$.children(".kanban-board").addClass("kanban-expired");for(var r=0;r0&&t.subLaneSpace&&(k.$height+=t.subLaneSpace)}}else for(var y=k.items||k.cards||{},g=0;g-1){var r=n.data[t];e=a.extend(r,e),n.data[t]=e}else n.data.push(e)}e.id||(e.id=a.zui.uuid());var d=e.id,i=n.options,o=n.$,s=o.children('.kanban-board[data-id="'+d+'"]');s.length?s.removeClass("kanban-expired"):s=a('
    ').appendTo(o),n.layoutKanban(e,s),n.renderKanbanHeader(e,s),s.children(".kanban-lane").addClass("kanban-expired");for(var l=e.lanes||[],c=0;c
    ').prependTo(n),r.useFlex||i.addClass("clearfix")),i.css("height",(d?2:1)*r.headerHeight).toggleClass("kanban-header-has-parent",!!d);var o=i.children(".kanban-cols");o.css("left",e.$layout.laneNameWidth).children(".kanban-col").addClass("kanban-expired");for(var s=e.columns,l=e.$layout.columnsMap||{},c=null,p=null,u=0;u.kanban-col").addClass("kanban-expired"):o=a(['
    ','
    ','
    ','','',i.showCount?'':"","
    ","
    ",'
    ',"
    ","
    "].join("")),s&&s.length?s.after(o):n.prepend(o),o.data("col",e).attr("data-type",e.type);var l=r.$layout.columnWidth;i.useFlex?o.css("flex",e.subs.length+" "+e.subs.length+" "+l*e.subs.length+"%"):o.css({width:l*e.subs.length+"%",left:e.$index*l+"%"});var c=o.children(".kanban-header-col");c.find(".title>.icon").attr("class","icon icon-"+(e.icon||""));var p=c.find(".title>.text").text(e.name);if(e.color&&p.css("color",e.color),i.showCount){var u=void 0!==e.count?e.count:e.$cardsCount;i.showZeroCount||u||(u="");var h=c.find(".title>.count").text(u);i.onRenderCount&&i.onRenderCount(h,u,e,d)}i.onRenderHeaderCol&&i.onRenderHeaderCol(o,e,n,r)},t.prototype.renderHeaderCol=function(e,n,t,r,d){var i=this,o=i.options;if(e.parentType&&t){var s=n.children('.kanban-header-parent-col[data-id="'+t.id+'"]');n=s.children(".kanban-header-sub-cols")}var l=n.children('.kanban-header-col[data-id="'+e.id+'"]'),c=r?n.children('.kanban-header-col[data-id="'+r.id+'"]:not(.kanban-expired)'):null;l.length?l.removeClass("kanban-expired"):l=a(['
    ','
    ','','',o.showCount?'':"","
    ",'
    ',"
    "].join("")),c&&c.length?c.after(l):n.prepend(l),l.data("col",e).attr("data-type",e.type);var p=t?100/t.subs.length:d.$layout.columnWidth;o.useFlex?l.css("flex","1 1 "+p+"%"):l.css({left:(t?e.$subIndex:e.$index)*p+"%",width:p+"%"}),l.find(".title>.icon").attr("class","icon icon-"+(e.icon||""));var u=l.find(".title>.text").text(e.name);if(e.color&&u.css("color",e.color),o.showCount){var h=void 0!==e.count?e.count:e.$cardsCount;o.showZeroCount||h||(h="");var b=l.find(".title>.count").text(h);o.onRenderCount&&o.onRenderCount(b,h,e,i)}o.onRenderHeaderCol&&o.onRenderHeaderCol(l,e,n,d)},t.prototype.renderLane=function(e,t,r,d){var i=this,o=i.options;r=r||i.$.children('.kanban-board[data-id="'+e.kanban+'"]');var s=r.children('.kanban-lane[data-id="'+e.id+'"]');s.length?s.removeClass("kanban-expired"):(s=a('
    ').appendTo(r),n||s.addClass("clearfix"));var l=e.subLanes?e.subLanes.length:0;s.attr("data-index",e.$index).data("lane",e).toggleClass("has-sub-lane",l>0).css({height:e.$height}),i.virtualizeRender(d,"lane",s,function(){if(!o.noLaneName){var n=s.children('.kanban-lane-name[data-id="'+e.id+'"]');n.length||(n=a('
    ').prependTo(s)),n.empty().css("width",o.laneNameWidth).attr("title",e.name).append(a('').text(e.name)),e.color&&n.css("background-color",e.color),o.onRenderLaneName&&o.onRenderLaneName(n,e,r,t,d)}s.children(".kanban-cols,.kanban-sub-lanes").addClass("kanban-expired");var l;l=e.subLanes?i.renderSubLanes(e,t,s,d):i.renderLaneCols(t,e.items||e.cards||{},s,e,d),o.useFlex||l.css("left",d.$layout.laneNameWidth),s.children(".kanban-expired").remove()},{lane:e,columns:t,kanban:d})},t.prototype.virtualizeRender=function(e,n,t,r,d){var i=this,o=i.virtualize,s=o?o[n]:null;return s?("function"==typeof s&&(s=s(d,t)),"number"==typeof s&&t.height(s),void t.virtualRender(a.extend({render:r},i.options.virtualRenderOptions))):r()},t.prototype.renderSubLanes=function(e,n,t,r){var d=this,i=t.children(".kanban-sub-lanes");i.length?i.removeClass("kanban-expired"):i=a('
    ').appendTo(t),i.children(".kanban-sub-lane").addClass("kanban-expired");for(var o=0;o

    ').appendTo(r),n||o.addClass("clearfix")),o.attr("data-index",i).data("lane",e).css({height:e.$height}),o.children(".kanban-col").addClass("kanban-expired");var s=e.items||e.cards;s&&this.renderLaneCols(t,s,o,e,d),o.children(".kanban-expired").remove()},t.prototype.renderLaneCols=function(e,n,t,r,d){var i=this,o=t.children(".kanban-cols");o.length?o.removeClass("kanban-expired"):o=a('
    ').appendTo(t),o.children(".kanban-col").addClass("kanban-expired");for(var s=null,l=0;l1).attr("data-cards-per-row",s),d.children(".kanban-expired").remove()},t.prototype.renderLaneCol=function(e,n,t){var r=this,d=r.options,i=n.children('.kanban-lane-col[data-id="'+e.id+'"]'),o=t?n.children('.kanban-lane-col[data-id="'+t.id+'"]:not(.kanban-expired)'):null;i.length?i.removeClass("kanban-expired"):(i=a(['
    ','
    ',"
    "].join("")),r.options.readonly||i.append(['
    ','","
    "].join("")),d.laneItemsClass&&i.find(".kanban-lane-items").addClass(d.laneItemsClass),d.laneColClass&&i.addClass(d.laneColClass)),o&&o.length?o.after(i):n.prepend(i),i.attr({"data-parent":e.parentType?e.parentType:null,"data-type":e.type}).data("col",e);var s=e.$kanbanData.$layout.columnWidth;return d.useFlex?i.css("flex","1 1 "+s+"%"):i.css({left:e.$index*s+"%",width:s+"%"}),i},t.prototype.renderCard=function(e,n,t,r,d){var i=this.options,o=n.children('.kanban-item[data-id="'+e.id+'"]');o.length?o.removeClass("kanban-expired"):(o=a('
    ').appendTo(n),i.wrapCard&&o.append('
    '));var s=t.cardsPerRow||r.cardsPerRow||d.cardsPerRow||i.cardsPerRow;o.data("item",e).css({padding:i.cardSpace/2,width:s>1?100/s+"%":""});var l=i.wrapCard?o.children(".kanban-card"):o;l.css("height",i.cardHeight);var c=i.cardRender||i.itemRender;if(c)c(e,l,t,r,d);else{var p=l.find(".title");p.length||(p=a('
    ').appendTo(l)),p.text(e.name||e.title)}return l},t.prototype.tryAdjustKanbanSize=function(a,e,n){},t.prototype.adjustKanbanSize=function(a,e){},t.prototype.adjustLaneSize=function(a,e){},t.prototype.adjustSize=function(){},t.DEFAULTS={minColWidth:100,maxColHeight:400,minColHeight:90,minSubColHeight:40,subLaneSpace:2,laneNameWidth:20,headerHeight:32,cardHeight:40,cardSpace:10,cardsPerRow:1,wrapCard:!0,fluidBoardWidth:!0,addItemText:"添加条目",createColumnText:"添加看板列",useFlex:!0,cardRender:null,calcColHeight:null,droppable:"auto",readonly:!1,laneColClass:"",noLaneName:!1,showCount:!0,showZeroCount:!1,virtualize:!1},a.fn.kanban=function(n){return this.each(function(){var r=a(this),d=r.data(e),i="object"==typeof n&&n;d||r.data(e,d=new t(this,i)),"string"==typeof n&&d[n]()})},t.NAME=e,a.fn.kanban.Constructor=t}(jQuery); \ No newline at end of file +!function(){"use strict";function e(e,a){return n&&!a?requestAnimationFrame(e):setTimeout(e,a||0)}function a(e){return n?cancelAnimationFrame(e):void clearTimeout(e)}var n="function"==typeof window.requestAnimationFrame;$.zui({asap:e,clearAsap:a})}(),function(e){"use strict";function a(a,n){"string"==typeof a&&(a=e(a)),a instanceof e&&(a=a[0]);var t=a.getBoundingClientRect(),r=window.innerHeight||document.documentElement.clientHeight,d=window.innerWidth||document.documentElement.clientWidth;if(n)return t.left>=0&&t.top>=0&&t.left+t.width<=d&&t.top+t.height<=r;var i=t.top<=r&&t.top+t.height>=0,o=t.left<=d&&t.left+t.width>=0;return i&&o}var n="zui.virtualRender",t=function(a,r){"function"==typeof r&&(r={render:r});var d=this;d.name=n,d.$=e(a),d.options=r=e.extend({},t.DEFAULTS,this.$.data(),r),d.rendered=!1;var i=r.container;"function"==typeof i&&(i=i(d));var o=e(i?i:window);d.tryRender()||(d.$container=o,d.scrollListener=d.tryRender.bind(d),r.pendingClass&&d.$.addClass(r.pendingClass),o.on("scroll",d.scrollListener))};t.prototype.tryRender=function(){var n=this;return!(n.rendered||!a(n.$))&&(n.renderTaskID&&e.zui.clearAsap(n.renderTaskID),n.renderTaskID=e.zui.asap(function(){n.renderTaskID=null;var e=n.options.render(n.$);e!==!1&&(n.rendered=!0,n.destroy())},n.options.delay),!0)},t.prototype.destroy=function(){var a=this;a.renderTaskID&&e.zui.clearAsap(a.renderTaskID),a.scrollListener&&(a.$container.off("scroll",a.scrollListener),a.scrollListener=null);var t=a.options.pendingClass;t&&a.$.removeClass(t),a.$.removeData(n)},t.DEFAULTS={pendingClass:"virtual-pending"},e.fn.virtualRender=function(a){return this.each(function(){var r=e(this),d=r.data(n);if(d){if("string"==typeof a)return d[a]();d.destroy()}r.data(n,d=new t(this,a))})},e.zui.isElementInViewport=a}(jQuery),function(e){"use strict";var a="zui.kanban",n="object"==typeof CSS&&CSS.supports("display","flex"),t=function(n,r){var d=this;if(d.name=a,d.$=e(n).addClass("kanban"),r=d.setOptions(e.extend({},t.DEFAULTS,this.$.data(),r)),r.onAction){var i=function(a){var n=e(this);r.onAction(n.data("action"),n,a,d)};d.$.on("click",".action",i).on("dblclick",".action-dbc",i)}if("auto"===r.droppable&&(r.droppable=!r.readonly),r.droppable){var o=0,s={dropOnMouseleave:!0,selector:".kanban-item",target:'.kanban-lane-col:not([data-type="EMPTY"])',drop:function(e){"function"==typeof r.droppable?r.droppable(e):r.onAction&&r.onAction("dropItem",e.element,e,d)},start:function(a){d.$.addClass("kanban-dragging"),o&&clearTimeout(o),o=setTimeout(function(){e(a.shadowElement).addClass("in"),o=0},50)},always:function(){d.$.removeClass("kanban-dragging"),o&&(clearTimeout(o),o=0)}};"object"==typeof r.droppable&&e.extend(s,r.droppable),d.$.droppable(s)}if(!r.useFlex){var l=0;e(window).on("resize",function(){l&&e.zui.clearAsap(l),l=e.zui.asap(function(){l=0,d.adjustSize()})})}r.onCreate&&r.onCreate(d)};t.prototype.setOptions=function(a){var t=this,r=e.extend({},t.options,a);t.options=r,r.useFlex&&!n&&(r.useFlex=!1),t.$.toggleClass("no-flex",!r.useFlex).toggleClass("use-flex",!!r.useFlex);var d=!!e.fn.virtualRender&&r.virtualize;return d&&("object"!=typeof d&&(d={lane:!0}),t.virtualize=e.extend({},d)),t.data=r.data||[],t.render(t.data),r},t.prototype.render=function(e){var a=this;e&&(a.data=e),a.data&&!Array.isArray(a.data)&&(a.data=[a.data]);var t=a.data||[];a.options.beforeRender&&a.options.beforeRender(a,t),a.$.toggleClass("kanban-readonly",!!a.options.readonly).toggleClass("kanban-no-lane-name",!!a.options.noLaneName),a.$.children(".kanban-board").addClass("kanban-expired");for(var r=0;r0&&t.subLaneSpace&&(k.$height+=t.subLaneSpace)}}else for(var y=k.items||k.cards||{},g=0;g-1){var r=n.data[t];a=e.extend(r,a),n.data[t]=a}else n.data.push(a)}a.id||(a.id=e.zui.uuid());var d=a.id,i=n.options,o=n.$,s=o.children('.kanban-board[data-id="'+d+'"]');s.length?s.removeClass("kanban-expired"):s=e('
    ').appendTo(o),n.layoutKanban(a,s),n.renderKanbanHeader(a,s),s.children(".kanban-lane").addClass("kanban-expired");for(var l=a.lanes||[],c=0;c
    ').prependTo(n),r.useFlex||i.addClass("clearfix")),i.css("height",(d?2:1)*r.headerHeight).toggleClass("kanban-header-has-parent",!!d);var o=i.children(".kanban-cols");o.css("left",a.$layout.laneNameWidth).children(".kanban-col").addClass("kanban-expired");for(var s=a.columns,l=a.$layout.columnsMap||{},c=null,p=null,u=0;u.kanban-col").addClass("kanban-expired"):o=e(['
    ','
    ','
    ','','',i.showCount?'':"","
    ","
    ",'
    ',"
    ","
    "].join("")),s&&s.length?s.after(o):n.prepend(o),o.data("col",a).attr("data-type",a.type);var l=r.$layout.columnWidth;i.useFlex?o.css("flex",a.subs.length+" "+a.subs.length+" "+l*a.subs.length+"%"):o.css({width:l*a.subs.length+"%",left:a.$index*l+"%"});var c=o.children(".kanban-header-col");c.find(".title>.icon").attr("class","icon icon-"+(a.icon||""));var p=c.find(".title>.text").text(a.name);if(a.color&&p.css("color",a.color),i.showCount){var u=void 0!==a.count?a.count:a.$cardsCount;i.showZeroCount||u||(u="");var h=c.find(".title>.count").text(u);i.onRenderCount&&i.onRenderCount(h,u,a,d)}i.onRenderHeaderCol&&i.onRenderHeaderCol(o,a,n,r)},t.prototype.renderHeaderCol=function(a,n,t,r,d){var i=this,o=i.options;if(a.parentType&&t){var s=n.children('.kanban-header-parent-col[data-id="'+t.id+'"]');n=s.children(".kanban-header-sub-cols")}var l=n.children('.kanban-header-col[data-id="'+a.id+'"]'),c=r?n.children('.kanban-header-col[data-id="'+r.id+'"]:not(.kanban-expired)'):null;l.length?l.removeClass("kanban-expired"):l=e(['
    ','
    ','','',o.showCount?'':"","
    ",'
    ',"
    "].join("")),c&&c.length?c.after(l):n.prepend(l),l.data("col",a).attr("data-type",a.type);var p=t?100/t.subs.length:d.$layout.columnWidth;o.useFlex?l.css("flex","1 1 "+p+"%"):l.css({left:(t?a.$subIndex:a.$index)*p+"%",width:p+"%"}),l.find(".title>.icon").attr("class","icon icon-"+(a.icon||""));var u=l.find(".title>.text").text(a.name);if(a.color&&u.css("color",a.color),o.showCount){var h=void 0!==a.count?a.count:a.$cardsCount;o.showZeroCount||h||(h="");var b=l.find(".title>.count").text(h);o.onRenderCount&&o.onRenderCount(b,h,a,i)}o.onRenderHeaderCol&&o.onRenderHeaderCol(l,a,n,d)},t.prototype.renderLane=function(a,t,r,d){var i=this,o=i.options;r=r||i.$.children('.kanban-board[data-id="'+a.kanban+'"]');var s=r.children('.kanban-lane[data-id="'+a.id+'"]');s.length?s.removeClass("kanban-expired"):(s=e('
    ').appendTo(r),n||s.addClass("clearfix"));var l=a.subLanes?a.subLanes.length:0;s.attr("data-index",a.$index).data("lane",a).toggleClass("has-sub-lane",l>0).css({height:a.$height}),i.virtualizeRender(d,"lane",s,function(){if(!o.noLaneName){var n=s.children('.kanban-lane-name[data-id="'+a.id+'"]');n.length||(n=e('
    ').prependTo(s)),n.empty().css("width",o.laneNameWidth).attr("title",a.name).append(e('').text(a.name)),a.color&&n.css("background-color",a.color),o.onRenderLaneName&&o.onRenderLaneName(n,a,r,t,d)}s.children(".kanban-cols,.kanban-sub-lanes").addClass("kanban-expired");var l;l=a.subLanes?i.renderSubLanes(a,t,s,d):i.renderLaneCols(t,a.items||a.cards||{},s,a,d),o.useFlex||l.css("left",d.$layout.laneNameWidth),s.children(".kanban-expired").remove()},{lane:a,columns:t,kanban:d})},t.prototype.virtualizeRender=function(a,n,t,r,d){var i=this,o=i.virtualize,s=o?o[n]:null;return s?("function"==typeof s&&(s=s(d,t)),"number"==typeof s&&t.height(s),void t.virtualRender(e.extend({render:r},i.options.virtualRenderOptions))):r()},t.prototype.renderSubLanes=function(a,n,t,r){var d=this,i=t.children(".kanban-sub-lanes");i.length?i.removeClass("kanban-expired"):i=e('
    ').appendTo(t),i.children(".kanban-sub-lane").addClass("kanban-expired");for(var o=0;o').appendTo(r),n||o.addClass("clearfix")),o.attr("data-index",i).data("lane",a).css({height:a.$height}),o.children(".kanban-col").addClass("kanban-expired");var s=a.items||a.cards;s&&this.renderLaneCols(t,s,o,a,d),o.children(".kanban-expired").remove()},t.prototype.renderLaneCols=function(a,n,t,r,d){var i=this,o=t.children(".kanban-cols");o.length?o.removeClass("kanban-expired"):o=e('
    ').appendTo(t),o.children(".kanban-col").addClass("kanban-expired");for(var s=null,l=0;l1).attr("data-cards-per-row",s),d.children(".kanban-expired").remove()},t.prototype.renderLaneCol=function(a,n,t){var r=this,d=r.options,i=n.children('.kanban-lane-col[data-id="'+a.id+'"]'),o=t?n.children('.kanban-lane-col[data-id="'+t.id+'"]:not(.kanban-expired)'):null;i.length?i.removeClass("kanban-expired"):(i=e(['
    ','
    ',"
    "].join("")),r.options.readonly||i.append(['
    ','","
    "].join("")),d.laneItemsClass&&i.find(".kanban-lane-items").addClass(d.laneItemsClass),d.laneColClass&&i.addClass(d.laneColClass)),o&&o.length?o.after(i):n.prepend(i),i.attr({"data-parent":a.parentType?a.parentType:null,"data-type":a.type}).data("col",a);var s=a.$kanbanData.$layout.columnWidth;return d.useFlex?i.css("flex","1 1 "+s+"%"):i.css({left:a.$index*s+"%",width:s+"%"}),i},t.prototype.renderCard=function(a,n,t,r,d){var i=this.options,o=n.children('.kanban-item[data-id="'+a.id+'"]');o.length?o.removeClass("kanban-expired"):(o=e('
    ').appendTo(n),i.wrapCard&&o.append('
    '));var s=t.cardsPerRow||r.cardsPerRow||d.cardsPerRow||i.cardsPerRow;o.data("item",a).css({padding:i.cardSpace/2,width:s>1?100/s+"%":""});var l=i.wrapCard?o.children(".kanban-card"):o;l.css("height",i.cardHeight);var c=i.cardRender||i.itemRender;if(c)c(a,l,t,r,d);else{var p=l.find(".title");p.length||(p=e('
    ').appendTo(l)),p.text(a.name||a.title)}return l},t.prototype.tryAdjustKanbanSize=function(e,a,n){},t.prototype.adjustKanbanSize=function(e,a){},t.prototype.adjustLaneSize=function(e,a){},t.prototype.adjustSize=function(){},t.DEFAULTS={minColWidth:100,maxColHeight:400,minColHeight:90,minSubColHeight:40,subLaneSpace:2,laneNameWidth:20,headerHeight:32,cardHeight:40,cardSpace:10,cardsPerRow:1,wrapCard:!0,fluidBoardWidth:!0,addItemText:"添加条目",createColumnText:"添加看板列",useFlex:!0,cardRender:null,calcColHeight:null,droppable:"auto",readonly:!1,laneColClass:"",noLaneName:!1,showCount:!0,showZeroCount:!1,virtualize:!1},e.fn.kanban=function(n){return this.each(function(){var r=e(this),d=r.data(a),i="object"==typeof n&&n;d||r.data(a,d=new t(this,i)),"string"==typeof n&&d[n]()})},t.NAME=a,e.fn.kanban.Constructor=t}(jQuery); \ No newline at end of file diff --git a/www/js/zui/min.js b/www/js/zui/min.js index 351314ce8a..86083ba53c 100644 --- a/www/js/zui/min.js +++ b/www/js/zui/min.js @@ -1,5 +1,5 @@ /*! - * ZUI: ZUI for Zentao - v1.10.0 - 2021-12-03 + * ZUI: ZUI for Zentao - v1.10.0 - 2021-12-06 * http://openzui.com * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2021 cnezsoft.com; Licensed MIT @@ -16,8 +16,8 @@ function(t,e,i){"$:nomunge";function n(){o=e[r](function(){a.each(function(){var * Copyright 2006, 2014 Klaus Hartl * Released under the MIT license */ -function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t("object"==typeof exports?require("jquery"):jQuery)}(function(t){function e(t){return r.raw?t:encodeURIComponent(t)}function i(t){return r.raw?t:decodeURIComponent(t)}function n(t){return e(r.json?JSON.stringify(t):String(t))}function o(t){0===t.indexOf('"')&&(t=t.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return t=decodeURIComponent(t.replace(s," ")),r.json?JSON.parse(t):t}catch(e){}}function a(t,e){var i=r.raw?t:o(t);return"function"==typeof e?e(i):i}var s=/\+/g,r=t.cookie=function(o,s,l){if(void 0!==s&&"function"!=typeof s){if(l=t.extend({},r.defaults,l),"number"==typeof l.expires){var h=l.expires,c=l.expires=new Date;c.setTime(+c+864e5*h)}return document.cookie=[e(o),"=",n(s),l.expires?"; expires="+l.expires.toUTCString():"",l.path?"; path="+l.path:"",l.domain?"; domain="+l.domain:"",l.secure?"; secure":""].join("")}for(var d=o?void 0:{},u=document.cookie?document.cookie.split("; "):[],f=0,p=u.length;f=0;t--)delete this.page[i[t]];this.set(a,this.page)}},s.prototype.pageRemove=function(t){"undefined"!=typeof this.page[t]&&(this.page[t]=null,this.pageSave())},s.prototype.pageClear=function(){this.page={},this.pageSave()},s.prototype.pageGet=function(t,e){var i=this.page[t];return void 0===e||null!==i&&void 0!==i?i:e},s.prototype.pageSet=function(t,i){e.isPlainObject(t)?e.extend(!0,this.page,t):this.page[this.serialize(t)]=i,this.pageSave()},s.prototype.check=function(){if(!this.enable&&!this.silence)throw new Error("Browser not support localStorage or enable status been set true.");return this.enable},s.prototype.length=function(){return this.check()?i.getLength?i.getLength():i.length:0},s.prototype.removeItem=function(t){return i.removeItem(t),this},s.prototype.remove=function(t){return this.removeItem(t)},s.prototype.getItem=function(t){return i.getItem(t)},s.prototype.get=function(t,e){var i=this.deserialize(this.getItem(t));return"undefined"!=typeof i&&null!==i||"undefined"==typeof e?i:e},s.prototype.key=function(t){return i.key(t)},s.prototype.setItem=function(t,e){return i.setItem(t,e),this},s.prototype.set=function(t,e){return void 0===e?this.remove(t):(this.setItem(t,this.serialize(e)),this)},s.prototype.clear=function(){return i.clear(),this},s.prototype.forEach=function(t){for(var e=this.length(),n=e-1;n>=0;n--){var o=i.key(n);t(o,this.get(o))}return this},s.prototype.getAll=function(){var t={};return this.forEach(function(e,i){t[e]=i}),t},s.prototype.serialize=function(t){return"string"==typeof t?t:JSON.stringify(t)},s.prototype.deserialize=function(t){if("string"==typeof t)try{return JSON.parse(t)}catch(e){return t||void 0}},e.zui({store:new s})}(window,jQuery),function(t){"use strict";var e="zui.searchBox",i=function(e,n){var o=this;o.name=name,o.$=t(e),o.options=n=t.extend({},i.DEFAULTS,o.$.data(),n);var a=o.$.is(n.inputSelector)?o.$:o.$.find(n.inputSelector);if(a.length){var s=function(){o.changeTimer&&(clearTimeout(o.changeTimer),o.changeTimer=null)},r=function(){s();var t=o.getSearch();if(t!==o.lastValue){var e=""===t;a.toggleClass("empty",e),o.$.callComEvent(o,"onSearchChange",[t,e]),o.lastValue=t}};o.$input=a=a.first(),a.on(n.listenEvent,function(t){o.changeTimer=setTimeout(function(){r()},n.changeDelay)}).on("focus",function(t){a.addClass("focus"),o.$.callComEvent(o,"onFocus",[t])}).on("blur",function(t){a.removeClass("focus"),o.$.callComEvent(o,"onBlur",[t])}).on("keydown",function(t){var e=0,i=t.which;27===i&&n.escToClear?(this.setSearch("",!0),r(),e=1):13===i&&n.onPressEnter&&(r(),o.$.callComEvent(o,"onPressEnter",[t]));var a=o.$.callComEvent(o,"onKeyDown",[t]);a===!1&&(e=1),e&&t.preventDefault()}),o.$.on("click",".search-clear-btn",function(t){o.setSearch("",!0),r(),o.focus(),t.preventDefault()}),r()}else console.error("ZUI: search box init error, cannot find search box input element.")};i.DEFAULTS={inputSelector:'input[type="search"],input[type="text"]',listenEvent:"change input paste",changeDelay:500},i.prototype.getSearch=function(){return this.$input&&t.trim(this.$input.val())},i.prototype.setSearch=function(t,e){var i=this.$input;i&&(i.val(t),e||i.trigger("change"))},i.prototype.focus=function(){this.$input&&this.$input.focus()},t.fn.searchBox=function(n){return this.each(function(){var o=t(this),a=o.data(e),s="object"==typeof n&&n;a||o.data(e,a=new i(this,s)),"string"==typeof n&&a[n]()})},i.NAME=e,t.fn.searchBox.Constructor=i}(jQuery),function(t,e){"use strict";var i="zui.draggable",n={container:"body",move:!0},o=0,a=function(e,i){var a=this;a.$=t(e),a.id=o++,a.options=t.extend({},n,a.$.data(),i),a.init()};a.DEFAULTS=n,a.NAME=i,a.prototype.init=function(){var n,o,a,s,r,l=this,h=l.$,c="before",d="drag",u="finish",f="."+i+"."+l.id,p="mousedown"+f,g="mouseup"+f,m="mousemove"+f,v=l.options,y=v.selector,b=v.handle,w=h,x="function"==typeof v.move,C=function(t){var e=t.pageX,i=t.pageY;r=!0;var o={left:e-a.x,top:i-a.y};w.removeClass("drag-ready").addClass("dragging"),v.move&&(x?v.move(o,w):w.css(o)),v[d]&&v[d]({event:t,element:w,startOffset:a,pos:o,offset:{x:e-n.x,y:i-n.y},smallOffset:{x:e-s.x,y:i-s.y}}),s.x=e,s.y=i,v.stopPropagation&&t.stopPropagation()},_=function(i){if(t(e).off(f),!r)return void w.removeClass("drag-ready");var o={left:i.pageX-a.x,top:i.pageY-a.y};w.removeClass("drag-ready dragging"),v.move&&(x?v.move(o,w):w.css(o)),v[u]&&v[u]({event:i,element:w,startOffset:a,pos:o,offset:{x:i.pageX-n.x,y:i.pageY-n.y},smallOffset:{x:i.pageX-s.x,y:i.pageY-s.y}}),i.preventDefault(),v.stopPropagation&&i.stopPropagation()},k=function(i){var l=t.zui.getMouseButtonCode(v.mouseButton);if(!(l>-1&&i.button!==l)){var h=t(this);if(y&&(w=b?h.closest(y):h),v[c]){var d=v[c]({event:i,element:w});if(d===!1)return}var u=t(v.container),f=w.offset();o=u.offset(),n={x:i.pageX,y:i.pageY},a={x:i.pageX-f.left+o.left,y:i.pageY-f.top+o.top},s=t.extend({},n),r=!1,w.addClass("drag-ready"),i.preventDefault(),v.stopPropagation&&i.stopPropagation(),t(e).on(m,C).on(g,_)}};b?h.on(p,b,k):y?h.on(p,y,k):h.on(p,k)},a.prototype.destroy=function(){var n="."+i+"."+this.id;this.$.off(n),t(e).off(n),this.$.data(i,null)},t.fn.draggable=function(e){return this.each(function(){var n=t(this),o=n.data(i),s="object"==typeof e&&e;o||n.data(i,o=new a(this,s)),"string"==typeof e&&o[e]()})},t.fn.draggable.Constructor=a}(jQuery,document),function(t,e,i){"use strict";var n="zui.droppable",o={target:".droppable-target",deviation:5,sensorOffsetX:0,sensorOffsetY:0,dropToClass:"drop-to",dropTargetClass:"drop-target"},a=0,s=function(e,i){var n=this;n.id=a++,n.$=t(e),n.options=t.extend({},o,n.$.data(),i),n.init()};s.DEFAULTS=o,s.NAME=n,s.prototype.trigger=function(e,i){return t.zui.callEvent(this.options[e],i,this)},s.prototype.init=function(){var o,a,s,r,l,h,c,d,u,f,p,g,m,v=this,y=v.$,b=v.options,w=b.deviation,x="."+n+"."+v.id,C="mousedown"+x,_="mouseup"+x,k="mousemove"+x,T=b.selector,S=b.handle,D=b.flex,M=b.container,P=b.canMoveHere,z=b.dropToClass,L=y,F=!1,I=M?t(b.container).first():T?y:t("body");b.dropOnMouseleave&&(_+=" mouseleave"+x);var $=function(e){if(F&&(p={left:e.pageX,top:e.pageY},!(i.abs(p.left-d.left)a&&p.top>s&&p.left-1&&i.button!==n)){var p=t(this);T&&(L=S?p.closest(T):p),L.hasClass("drag-shadow")||b.before&&b.before({event:i,element:L})===!1||(F=!0,o="function"==typeof b.target?b.target(L,y):I.find(b.target),a=null,s=null,r=!1,l=!0,h=null,c=L.offset(),u=I.offset(),u.top=u.top-I.scrollTop(),u.left=u.left-I.scrollLeft(),d={left:i.pageX,top:i.pageY},g=t.extend({},d),f={left:d.left-c.left,top:d.top-c.top},L.addClass("drag-from"),t(e).on(k,$).on(_,A),m=setTimeout(function(){t(e).on(C,A)},10),i.preventDefault(),b.stopPropagation&&i.stopPropagation())}};S?y.on(C,S,E):T?y.on(C,T,E):y.on(C,E)},s.prototype.destroy=function(){var i="."+n+"."+this.id;this.$.off(i),t(e).off(i),this.$.data(n,null)},s.prototype.reset=function(){this.destroy(),this.init()},t.fn.droppable=function(e){return this.each(function(){var i=t(this),o=i.data(n),a="object"==typeof e&&e;o||i.data(n,o=new s(this,a)),"string"==typeof e&&o[e]()})},t.fn.droppable.Constructor=s}(jQuery,document,Math),+function(t,e){"use strict";function i(e,i,a){return this.each(function(){var s=t(this),r=s.data(n),l=t.extend({},o.DEFAULTS,s.data(),"object"==typeof e&&e);r||s.data(n,r=new o(this,l)),"string"==typeof e?r[e](i,a):l.show&&r.show(i,a)})}var n="zui.modal",o=function(i,o){var a=this;a.options=o,a.$body=t(document.body),a.$element=t(i),a.$backdrop=a.isShown=null,a.scrollbarWidth=0,o.moveable===e&&(a.options.moveable=a.$element.hasClass("modal-moveable")),o.remote&&a.$element.find(".modal-content").load(o.remote,function(){a.$element.trigger("loaded."+n)}),o.scrollInside&&t(window).on("resize."+n,function(){a.isShown&&a.adjustPosition(e,100)})};o.VERSION="3.2.0",o.TRANSITION_DURATION=300,o.BACKDROP_TRANSITION_DURATION=150,o.DEFAULTS={backdrop:!0,keyboard:!0,show:!0,position:"fit"};var a=function(e,i){var n=t(window);i.left=Math.max(0,Math.min(i.left,n.width()-e.outerWidth())),i.top=Math.max(0,Math.min(i.top,n.height()-e.outerHeight())),e.css(i)};o.prototype.toggle=function(t,e){return this.isShown?this.hide():this.show(t,e)},o.prototype.adjustPosition=function(i,o){var s=this;if(clearTimeout(s.reposTask),o)return void(s.reposTask=setTimeout(s.adjustPosition.bind(s,i,0),o));var r=s.options;if(i===e&&(i=r.position),i!==e&&null!==i){"function"==typeof i&&(i=i(s));var l=s.$element.find(".modal-dialog"),h=t(window).height(),c={maxHeight:"initial",overflow:"visible"},d=l.find(".modal-body").css(c);if(r.scrollInside&&d.length){var u=r.headerHeight,f=r.footerHeight,p=l.find(".modal-header"),g=l.find(".modal-footer");"number"!=typeof u&&(u=p.length?p.outerHeight():"function"==typeof u?u(p):0),"number"!=typeof f&&(f=g.length?g.outerHeight():"function"==typeof f?f(g):0),c.maxHeight=h-u-f,c.overflow=d[0].scrollHeight>c.maxHeight?"auto":"visible",d.css(c)}var m=Math.max(0,(h-l.outerHeight())/2);if("fit"===i?i={top:m>50?Math.floor(2*m/3):m}:"center"===i?i={top:m}:t.isPlainObject(i)||(i={top:i}),l.hasClass("modal-moveable")){var v=null,y=r.rememberPos;y&&(y===!0?v=s.$element.data("modal-pos"):t.zui.store&&(v=t.zui.store.pageGet(n+".rememberPos."+y))),i=t.extend(i,{left:Math.max(0,(t(window).width()-l.outerWidth())/2)},v),"inside"===r.moveable?a(l,i):l.css(i)}else l.css(i)}},o.prototype.setMoveable=function(){t.fn.draggable||console.error("Moveable modal requires draggable.js.");var e=this,i=e.options,o=e.$element.find(".modal-dialog").removeClass("modal-dragged");o.toggleClass("modal-moveable",!!i.moveable),e.$element.data("modal-moveable-setup")||o.draggable({container:e.$element,handle:".modal-header",before:function(){var t=o.css("margin-top");t&&"0px"!==t&&o.css("top",t).css("margin-top","").addClass("modal-dragged")},finish:function(o){var a=i.rememberPos;a&&(e.$element.data("modal-pos",o.pos),t.zui.store&&a!==!0&&t.zui.store.pageSet(n+".rememberPos."+a,o.pos))},move:"inside"!==i.moveable||function(t){a(o,t)}})},o.prototype.show=function(e,i){var a=this,s=t.Event("show."+n,{relatedTarget:e});a.$element.trigger(s),a.$element.toggleClass("modal-scroll-inside",!!a.options.scrollInside),a.isShown||s.isDefaultPrevented()||(a.isShown=!0,a.options.moveable&&a.setMoveable(),a.options.backdrop!==!1&&(a.setScrollbar(),a.$body.addClass("modal-open")),a.escape(),a.$element.on("click.dismiss."+n,'[data-dismiss="modal"]',function(t){a.hide(),t.stopPropagation()}),a.backdrop(function(){var s=t.support.transition&&a.$element.hasClass("fade");a.$element.parent().length||a.$element.appendTo(a.$body),a.$element.show().scrollTop(0),s&&a.$element[0].offsetWidth,a.$element.addClass("in").attr("aria-hidden",!1),a.adjustPosition(i),a.enforceFocus();var r=t.Event("shown."+n,{relatedTarget:e});s?a.$element.find(".modal-dialog").one("bsTransitionEnd",function(){a.$element.trigger("focus").trigger(r)}).emulateTransitionEnd(o.TRANSITION_DURATION):a.$element.trigger("focus").trigger(r)}))},o.prototype.hide=function(e){e&&e.preventDefault&&e.preventDefault();var i=this;e=t.Event("hide."+n),i.$element.trigger(e),i.isShown&&!e.isDefaultPrevented()&&(i.isShown=!1,i.options.backdrop!==!1&&(i.$body.removeClass("modal-open"),i.resetScrollbar()),i.escape(),t(document).off("focusin."+n),i.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss."+n),t.support.transition&&i.$element.hasClass("fade")?i.$element.one("bsTransitionEnd",i.hideModal.bind(i)).emulateTransitionEnd(o.TRANSITION_DURATION):i.hideModal())},o.prototype.enforceFocus=function(){t(document).off("focusin."+n).on("focusin."+n,function(t){this.$element[0]===t.target||this.$element.has(t.target).length||this.$element.trigger("focus")}.bind(this))},o.prototype.escape=function(){this.isShown&&this.options.keyboard?t(document).on("keydown.dismiss."+n,function(i){if(27==i.which){var o=t.Event("escaping."+n),a=this.$element.triggerHandler(o,"esc");if(a!=e&&!a)return;this.hide()}}.bind(this)):this.isShown||t(document).off("keydown.dismiss."+n)},o.prototype.hideModal=function(){var t=this;this.$element.hide(),this.backdrop(function(){t.$element.trigger("hidden."+n)})},o.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},o.prototype.backdrop=function(e){var i=this,a=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var s=t.support.transition&&a;if(this.$backdrop=t('').appendTo("body").data(n,i);var s=function(t,i,n){n=n||e[t],"function"==typeof n&&o.on(i+a,n)};s("onShow","show"),s("shown","shown"),s("onHide","hide",function(t){if("iframe"===e.type&&i.$iframeBody){var n=i.$iframeBody.triggerHandler("modalhide"+a,[i]);n===!1&&t.preventDefault()}var o=e.onHide;if(o)return o(t)}),s("hidden","hidden"),s("loaded","loaded"),o.on("shown"+a,function(){i.isShown=!0}).on("hidden"+a,function(){i.isShown=!1}),this.$modal=o,this.$dialog=o.find(".modal-dialog"),e.mergeOptions&&(this.options=e)},r.prototype.show=function(i){var a=this,l=t.extend({},r.DEFAULTS,a.options,{url:a.$trigger?a.$trigger.attr("href")||a.$trigger.attr("data-url")||a.$trigger.data("url"):a.options.url},i),h=a.isShown;l=a.initOptions(l),h||a.init(l);var c=a.$modal,d=c.find(".modal-dialog"),u=l.custom,f=d.find(".modal-body").css("padding","").toggleClass("load-indicator loading",!!h),p=d.find(".modal-header"),g=d.find(".modal-content");c.toggleClass("fade",l.fade).addClass(l.className).toggleClass("modal-loading",!h).toggleClass("modal-scroll-inside",!!l.scrollInside),d.toggleClass("modal-md","md"===l.size).toggleClass("modal-sm","sm"===l.size).toggleClass("modal-lg","lg"===l.size).toggleClass("modal-fullscreen","fullscreen"===l.size),p.toggle(l.showHeader),p.find(".modal-icon").attr("class","modal-icon icon-"+l.icon),p.find(".modal-title-name").text(l.title||""),l.size&&"fullscreen"===l.size&&(l.width="",l.height="");var m=function(){clearTimeout(this.resizeTask),this.resizeTask=setTimeout(function(){a.adjustPosition(l.position)},100)},v=function(t,e){return"undefined"==typeof t&&(t=l.delay),setTimeout(function(){d=c.find(".modal-dialog"),l.width&&"auto"!=l.width&&d.css("width",l.width),l.height&&"auto"!=l.height&&(d.css("height",l.height),"iframe"===l.type&&f.css("height",d.height()-p.outerHeight())),a.adjustPosition(l.position),c.removeClass("modal-loading").removeClass("modal-updating"),h&&f.removeClass("loading"),"iframe"!=l.type&&(f=d.off("resize."+n).find(".modal-body").off("resize."+n),l.scrollInside&&(f=f.children().off("resize."+n)),(f.length?f:d).on("resize."+n,m)),e&&e()},t)};if("custom"===l.type&&u)if("function"==typeof u){var y=u({modal:c,options:l,modalTrigger:a,ready:v});typeof y===s&&(f.html(y),v())}else u instanceof t?(f.html(t("
    ").append(u.clone()).html()),v()):(f.html(u),v());else if(l.url){var b=function(){var t=c.callComEvent(a,"broken");"string"==typeof t&&f.html(t),v()};if(c.attr("ref",l.url),"iframe"===l.type){c.addClass("modal-iframe"),this.firstLoad=!0;var w="iframe-"+l.name;p.detach(),f.detach(),g.empty().append(p).append(f),f.css("padding",0).html(''),l.waittime>0&&(a.waitTimeout=v(l.waittime,b));var x=document.getElementById(w);x.onload=x.onreadystatechange=function(i){var o=!!l.scrollInside;if(a.firstLoad&&c.addClass("modal-loading"),!this.readyState||"complete"==this.readyState){a.firstLoad=!1,l.waittime>0&&clearTimeout(a.waitTimeout);try{c.attr("ref",x.contentWindow.location.href);var s=e.frames[w];s.modalWidthReset&&(l.width=s.modalWidthReset);var r=s.$;if(r&&"auto"===l.height&&"fullscreen"!=l.size){var h=r("body").addClass("body-modal").toggleClass("body-modal-scroll-inside",o);a.$iframeBody=h,l.iframeBodyClass&&h.addClass(l.iframeBodyClass);var d=[],u=function(i){c.removeClass("fade");var n=h.outerHeight();if(i===!0&&l.onlyIncreaseHeight&&(n=Math.max(n,f.data("minModalHeight")||0),f.data("minModalHeight",n)),o){var a=l.headerHeight;"number"!=typeof a?a=p.outerHeight():"function"==typeof a&&(a=a(p));var s=t(e).height();n=Math.min(n,s-a)}for(d.length>1&&n===d[0]&&(n=Math.max(n,d[1])),d.push(n);d.length>2;)d.shift();f.css("height",n),l.fade&&c.addClass("fade"),v()};c.callComEvent(a,"loaded",{modalType:"iframe",jQuery:r}),setTimeout(u,100),h.off("resize."+n).on("resize."+n,u),o&&t(e).off("resize."+n).on("resize."+n,u)}else v();var g=l.handleLinkInIframe;g&&r("body").on("click","string"==typeof g?g:"a[href]",function(){t(this).is('[data-toggle="modal"]')||c.addClass("modal-updating")}),l.iframeStyle&&r("head").append("")}catch(i){v()}}}}else t.ajax(t.extend({url:l.url,success:function(i){try{var s=t(i);s.filter(".modal-dialog").length?d.parent().empty().append(s):s.filter(".modal-content").length?d.find(".modal-content").replaceWith(s):f.wrapInner(s)}catch(r){e.console&&e.console.warn&&console.warn("ZUI: Cannot recogernize remote content.",{error:r,data:i}),c.html(i)}c.callComEvent(a,"loaded",{modalType:o}),v(),l.scrollInside&&t(e).off("resize."+n).on("resize."+n,m)},error:b},l.ajaxOptions))}h||c.modal({show:"show",backdrop:l.backdrop,moveable:l.moveable,rememberPos:l.rememberPos,keyboard:l.keyboard,scrollInside:l.scrollInside})},r.prototype.close=function(t,i){var n=this;(t||i)&&n.$modal.on("hidden"+a,function(){"function"==typeof t&&t(),typeof i===s&&i.length&&!n.$modal.data("cancel-reload")&&("this"===i?e.location.reload():e.location=i)}),n.$modal.modal("hide")},r.prototype.toggle=function(t){this.isShown?this.close():this.show(t)},r.prototype.adjustPosition=function(t){t=t===i?this.options.position:t,"function"==typeof t&&(t=t(this)),this.$modal.modal("adjustPosition",t)},t.zui({ModalTrigger:r,modalTrigger:new r}),t.fn.modalTrigger=function(e,i){return t(this).each(function(){var o=t(this),a=o.data(n),l=t.extend({title:o.attr("title")||o.text(),url:o.attr("href"),type:o.hasClass("iframe")?"iframe":""},o.data(),t.isPlainObject(e)&&e);return a?void(typeof e==s?a[e](i):l.show&&a.show(i)):(o.data(n,a=new r(l,o)),void o.on((l.trigger||"click")+".toggle."+n,function(e){l=t.extend(l,{url:o.attr("href")||o.attr("data-url")||o.data("url")||l.url}),a.toggle(l),o.is("a")&&e.preventDefault()}))})};var l=t.fn.modal;t.fn.modal=function(e,i){return t(this).each(function(){var n=t(this);n.hasClass("modal")?l.call(n,e,i):n.modalTrigger(e,i)})},t.fn.modal.bs=l;var h=function(e){return e?e=t(e):(e=t(".modal.modal-trigger"),!e.length),e&&e instanceof t?e:null},c=function(i,o,a){var s=i;if("function"==typeof i){var r=a;a=o,o=i,i=r}i=h(i),i&&i.length?i.each(function(){t(this).data(n).close(o,a)}):t("body").hasClass("modal-open")||t(".modal.in").length||t("body").hasClass("body-modal")&&e.parent.$.zui.closeModal(s,o,a)},d=function(t,e){e=h(e),e&&e.length&&e.modal("adjustPosition",t)},u=function(e,i){"string"==typeof e&&(e={url:e});var o=h(i);o&&o.length&&o.each(function(){t(this).data(n).show(e)})};t.zui({reloadModal:u,closeModal:c,ajustModalPosition:d,adjustModalPosition:d}),t(document).on("click."+n+".data-api",'[data-toggle="modal"]',function(e){var i=t(this),o=i.attr("href"),a=null;try{a=t(i.attr("data-target")||o&&o.replace(/.*(?=#[^\s]+$)/,""))}catch(s){}a&&a.length||(i.data(n)?i.trigger(".toggle."+n):i.modalTrigger({show:!0})),i.is("a")&&e.preventDefault()}).on("click."+n+".data-api",'[data-dismiss="modal"]',function(){t.zui.closeModal()})}(window.jQuery,window,void 0),+function(t){"use strict";var e=function(t,e){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.init("tooltip",t,e)};e.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'
    ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},e.prototype.init=function(e,i,n){this.enabled=!0,this.type=e,this.$element=t(i),this.options=this.getOptions(n);for(var o=this.options.trigger.split(" "),a=o.length;a--;){var s=o[a];if("click"==s)this.$element.on("click."+this.type,this.options.selector,this.toggle.bind(this));else if("manual"!=s){var r="hover"==s?"mouseenter":"focus",l="hover"==s?"mouseleave":"blur";this.$element.on(r+"."+this.type,this.options.selector,this.enter.bind(this)),this.$element.on(l+"."+this.type,this.options.selector,this.leave.bind(this))}}this.options.selector?this._options=t.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},e.prototype.getDefaults=function(){return e.DEFAULTS},e.prototype.getOptions=function(e){return e=t.extend({},this.getDefaults(),this.$element.data(),e),e.delay&&"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),e},e.prototype.getDelegateOptions=function(){var e={},i=this.getDefaults();return this._options&&t.each(this._options,function(t,n){i[t]!=n&&(e[t]=n)}),e},e.prototype.enter=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget)[this.type](this.getDelegateOptions()).data("zui."+this.type);return clearTimeout(i.timeout),i.hoverState="in",i.options.delay&&i.options.delay.show?void(i.timeout=setTimeout(function(){"in"==i.hoverState&&i.show()},i.options.delay.show)):i.show()},e.prototype.leave=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget)[this.type](this.getDelegateOptions()).data("zui."+this.type);return clearTimeout(i.timeout),i.hoverState="out",i.options.delay&&i.options.delay.hide?void(i.timeout=setTimeout(function(){"out"==i.hoverState&&i.hide()},i.options.delay.hide)):i.hide()},e.prototype.show=function(e){var i=t.Event("show.zui."+this.type);if((e||this.hasContent())&&this.enabled){var n=this;if(n.$element.trigger(i),i.isDefaultPrevented())return;var o=n.tip();n.setContent(e),n.options.animation&&o.addClass("fade");var a="function"==typeof n.options.placement?n.options.placement.call(n,o[0],n.$element[0]):n.options.placement,s=/\s?auto?\s?/i,r=s.test(a);r&&(a=a.replace(s,"")||"top"),o.detach().css({top:0,left:0,display:"block"}).addClass(a),n.options.container?o.appendTo(n.options.container):o.insertAfter(n.$element);var l=n.getPosition(),h=o[0].offsetWidth,c=o[0].offsetHeight;if(r){var d=n.$element.parent(),u=a,f=document.documentElement.scrollTop||document.body.scrollTop,p="body"==n.options.container?window.innerWidth:d.outerWidth(),g="body"==n.options.container?window.innerHeight:d.outerHeight(),m="body"==n.options.container?0:d.offset().left;a="bottom"==a&&l.top+l.height+c-f>g?"top":"top"==a&&l.top-f-c<0?"bottom":"right"==a&&l.right+h>p?"left":"left"==a&&l.left-h

    '}),e.prototype=t.extend({},t.fn.tooltip.Constructor.prototype),e.prototype.constructor=e,e.prototype.getDefaults=function(){return e.DEFAULTS},e.prototype.setContent=function(){var t=this.tip(),e=this.getTarget();if(e)return e.find(".arrow").length<1&&t.addClass("no-arrow"),void t.html(e.html());var i=this.getTitle(),n=this.getContent();t.find(".popover-title")[this.options.html?"html":"text"](i),t.find(".popover-content")[this.options.html?"html":"text"](n),t.removeClass("fade top bottom left right in"),this.options.tipId&&t.attr("id",this.options.tipId),this.options.tipClass&&t.addClass(this.options.tipClass),t.find(".popover-title").html()||t.find(".popover-title").hide()},e.prototype.hasContent=function(){return this.getTarget()||this.getTitle()||this.getContent()},e.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr("data-content")||("function"==typeof e.content?e.content.call(t[0]):e.content)},e.prototype.getTarget=function(){var e=this.$element,i=this.options,n=e.attr("data-target")||("function"==typeof i.target?i.target.call(e[0]):i.target);return!!n&&("$next"==n?e.next(".popover"):t(n))},e.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},e.prototype.tip=function(){return this.$tip||(this.$tip=t(this.options.template)),this.$tip};var i=t.fn.popover;t.fn.popover=function(i){return this.each(function(){var n=t(this),o=n.data("zui.popover"),a="object"==typeof i&&i;o||n.data("zui.popover",o=new e(this,a)),"string"==typeof i&&o[i]()})},t.fn.popover.Constructor=e,t.fn.popover.noConflict=function(){return t.fn.popover=i,this}}(window.jQuery),+function(t){"use strict";function e(e){t(o).remove(),t(a).each(function(e){var o=i(t(this));o.hasClass("open")&&(o.trigger(e=t.Event("hide."+n)),e.isDefaultPrevented()||o.removeClass("open").trigger("hidden."+n))})}function i(e){var i=e.attr("data-target");i||(i=e.attr("href"),i=i&&/#/.test(i)&&i.replace(/.*(?=#[^\s]*$)/,""));var n;try{n=i&&t(i)}catch(o){}return n&&n.length?n:e.parent()}var n="zui.dropdown",o=".dropdown-backdrop",a="[data-toggle=dropdown]",s=function(e){t(e).on("click."+n,this.toggle)};s.prototype.toggle=function(o){var a=t(this);if(!a.is(".disabled, :disabled")){var s=i(a),r=s.hasClass("open");if(e(),!r){if("ontouchstart"in document.documentElement&&!s.closest(".navbar-nav").length&&t('',a={icons:{},type:"default",placement:"top",time:4e3,parent:"body",close:!0,fade:!0,scale:!0},s={},r=function(e,r){t.isPlainObject(e)?r=t.extend({},r,e):e&&(r?r.content=e:r={content:e});var l=this;r=l.options=t.extend({},a,r),l.id=r.id||n++;var h=s[l.id];h&&h.destroy(),s[l.id]=l,l.$=t(o.format(r)).toggleClass("fade",r.fade).toggleClass("scale",r.scale).attr("id","messager-"+l.id),r.cssClass&&l.$.addClass(r.cssClass);var c=!1,d=l.$.find(".messager-actions"),u=function(e){var n=t('
    testcase->lib;?> -
    - -
    -
    -
    - testcase->module?> - "; - echo html::a($this->createLink('tree', 'browse', "rootID=$libID&view=caselib¤tModuleID=0", 'html', true), "", '', "data-toggle='tooltip' class='btn iframe' title='{$lang->tree->manage}'"); - echo ''; - echo ""; - echo html::a("javascript:void(0)", "", '', "class='btn refresh' title='{$lang->refresh}' onclick='loadLibModules($libID)'"); - echo ''; - } - ?> -
    -
    testcase->type;?>testcase->typeList, $type, "class='form-control chosen'");?> -
    - testcase->stage?> - testcase->stageList, $stage, "class='form-control chosen' multiple='multiple'");?> -
    -
    testcase->title;?> -
    -
    - -
    - - - -
    +
    testcase->lib;?> +
    +
    - - testcase->pri;?> +
    +
    + testcase->module?> testcase->priList as $priKey => $priValue) + echo html::select('module', $moduleOptionMenu, $currentModuleID, "onchange='loadModuleRelated();' class='form-control chosen'"); + if(count($moduleOptionMenu) == 1) { - if(!empty($priKey) and (string)$priKey != (string)$priValue) - { - $hasCustomPri = true; - break; - } - } - $priList = $lang->testcase->priList; - if(end($priList)) unset($priList[0]); - if(!isset($priList[$pri])) - { - reset($priList); - $pri = key($priList); + echo ""; + echo html::a($this->createLink('tree', 'browse', "rootID=$libID&view=caselib¤tModuleID=0", 'html', true), "", '', "data-toggle='tooltip' class='btn iframe' title='{$lang->tree->manage}'"); + echo ''; + echo ""; + echo html::a("javascript:void(0)", "", '', "class='btn refresh' title='{$lang->refresh}' onclick='loadLibModules($libID)'"); + echo ''; } ?> - - - - -
    - -
    - - -
    -
    testcase->precondition;?>
    testcase->steps;?> - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + +
    testcase->stepID;?>testcase->stepDesc;?>testcase->stepExpect;?>actions;?>
    -
    testcase->type;?>testcase->typeList, $type, "class='form-control chosen'");?> +
    + testcase->stage?> + testcase->stageList, $stage, "class='form-control chosen' multiple='multiple'");?> +
    +
    testcase->title;?> +
    +
    + +
    + + + +
    +
    + + testcase->pri;?> + testcase->priList as $priKey => $priValue) + { + if(!empty($priKey) and (string)$priKey != (string)$priValue) + { + $hasCustomPri = true; + break; + } + } + $priList = $lang->testcase->priList; + if(end($priList)) unset($priList[0]); + if(!isset($priList[$pri])) + { + reset($priList); + $pri = key($priList); + } + ?> + + + + +
    + + +
    + + +
    +
    testcase->precondition;?>
    testcase->steps;?> + + + + + + + + + + + + + - - - - $step):?> - - - + + + + $step):?> + + + - - - - - -
    testcase->stepID;?>testcase->stepDesc;?>testcase->stepExpect;?>actions;?>
    +
    + + + + +
    + +
    -
    - - -
    -
    - - - -
    -
    -
    - - desc, "rows='1' class='form-control autosize step-steps'") ?> - - type)) $step->type = 'step';?> - -
    +
    + + + +
    +
    +
    + + desc, "rows='1' class='form-control autosize step-steps'") ?> + + type)) $step->type = 'step';?> + +
    + type === 'group') echo ' checked' ?>> +
    -
    - - -
    expect, "rows='1' class='form-control autosize step-expects'") ?> -
    - - - -
    -
    -
    testcase->keywords;?>
    testcase->files;?>fetch('file', 'buildform');?>
    expect, "rows='1' class='form-control autosize step-expects'") ?> +
    + + + +
    +
    +
    testcase->keywords;?>
    testcase->files;?>fetch('file', 'buildform');?>