Squashed commit of the following:
commitb9e9f86d39Author: caoyanyi <caoyanyi@easycorp.ltd> Date: Fri Apr 26 13:35:56 2024 +0800 * Adjust mr actions style. commit1ddb2067b2Author: hufangzhou <hufangzhou@easycorp.ltd> Date: Fri Apr 26 13:24:05 2024 +0800 * Fix bug #48463. commit94528ed5b0Author: xieqiyu <xieqiyu@easycorp.ltd> Date: Fri Apr 26 13:17:29 2024 +0800 * Fix bug#48410. commitd1b38c54f9Author: caoyanyi <caoyanyi@easycorp.ltd> Date: Fri Apr 26 13:13:38 2024 +0800 - Remove mr repos switch block. commitc94da3e17aAuthor: sunhao <sunhao@easycorp.ltd> Date: Fri Apr 26 11:30:43 2024 +0800 * my: optimize UI of manage contacts page. commit2e74f33d22Author: 宋辰轩 <songchenxuan@easycorp.ltd> Date: Fri Apr 26 11:13:16 2024 +0800 * Fix bug #48317. commit45b6beccaeAuthor: liwenrui <liwenrui@easycorp.ltd> Date: Fri Apr 26 11:13:06 2024 +0800 * handle direct client download without selecting os. commit82be78538fAuthor: wangyuting <wangyuting@easycorp.ltd> Date: Fri Apr 26 10:43:42 2024 +0800 * Fix ipd project only one execution bug. commitfaa6c605fcAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Fri Apr 26 10:42:25 2024 +0800 * Fix bug #48499, modify the icon. commit5134736779Author: xieqiyu <xieqiyu@easycorp.ltd> Date: Fri Apr 26 10:41:35 2024 +0800 * Fix bug#48167. commit5ca23cd76fAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Fri Apr 26 10:30:02 2024 +0800 * Fix bug #48453. commit23cde4b38eAuthor: sunhao <sunhao@easycorp.ltd> Date: Fri Apr 26 10:19:28 2024 +0800 * tutorial: fix tutorial start modal style. commit1d710e10bdAuthor: sunhao <sunhao@easycorp.ltd> Date: Fri Apr 26 10:18:40 2024 +0800 * zin: fix batch-form style in old iframe modal. commitc9092603f0Author: liumengyi <liumengyi@easycorp.ltd> Date: Fri Apr 26 10:15:27 2024 +0800 * Fix bug #48495. commitc0aeb9f69dAuthor: sunguangming <sunguangming@easycorp.ltd> Date: Fri Apr 26 10:12:39 2024 +0800 * Fix bug #48431. commit4348fd543aAuthor: 宋辰轩 <songchenxuan@easycorp.ltd> Date: Fri Apr 26 10:11:45 2024 +0800 * Fix bug #48445. commitc9df08b1a1Author: 宋辰轩 <songchenxuan@easycorp.ltd> Date: Fri Apr 26 10:07:01 2024 +0800 * Fix bug for screen browse. commitebc469c0a4Author: wangyuting <wangyuting@easycorp.ltd> Date: Fri Apr 26 09:55:44 2024 +0800 * Adjust recentproject block css. commit9337fa109aAuthor: wangyuting <wangyuting@easycorp.ltd> Date: Fri Apr 26 09:50:34 2024 +0800 * Adjust recentproject block css. commit07903733bfAuthor: 王怡栋 <wangyidong@cnezsoft.com> Date: Fri Apr 26 09:33:39 2024 +0800 * Fix bug #48473. commita347de8354Author: wangyuting <wangyuting@easycorp.ltd> Date: Fri Apr 26 09:34:29 2024 +0800 * Add progress to recentproject block. task #116976. commite6e6c6047eAuthor: xieqiyu <xieqiyu@easycorp.ltd> Date: Fri Apr 26 09:29:12 2024 +0800 * Modify the problem of code review. commita53a577b69Author: sunguangming <sunguangming@easycorp.ltd> Date: Fri Apr 26 09:13:43 2024 +0800 * Finish task #45906. commit774cb4efbcAuthor: wangyuting <wangyuting@easycorp.ltd> Date: Fri Apr 26 09:03:42 2024 +0800 * Adjust review by me data to DAO search. commit976ef156b6Author: tianshujie <tianshujie@easycorp.ltd> Date: Fri Apr 26 09:00:51 2024 +0800 * Add class for copy project button. commit36f2c24a97Author: tianshujie <tianshujie@easycorp.ltd> Date: Fri Apr 26 09:00:39 2024 +0800 * Fix bug #48480. commitae9ef45621Author: xieqiyu <xieqiyu@easycorp.ltd> Date: Thu Apr 25 21:12:27 2024 +0800 * Optimated code. commit20eefb90dcAuthor: sunhao <sunhao@easycorp.ltd> Date: Thu Apr 25 19:42:50 2024 +0800 * zin: optimize UI for loading old pages. commit56006bca4fAuthor: sunhao <sunhao@easycorp.ltd> Date: Thu Apr 25 18:18:24 2024 +0800 * theme: update themes for old pages. commit0dd32057e4Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 17:15:25 2024 +0800 * Modify style of productplan desc. commit272cdc4a61Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 17:03:07 2024 +0800 * Fix bug #48413, replace executionLang with productplanLang. commit1f0b96aab2Author: tanghucheng <tanghucheng@easycorp.ltd> Date: Thu Apr 25 16:59:05 2024 +0800 * Program in the product lines can be empty. commitfb6bb48ee6Author: 宋辰轩 <songchenxuan@easycorp.ltd> Date: Thu Apr 25 17:02:29 2024 +0800 * Remove update bi guide img file. commit66bcb21455Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 16:48:22 2024 +0800 * Fix bug #48464, set icon by project model. commitc5738c4129Author: 宋辰轩 <songchenxuan@easycorp.ltd> Date: Thu Apr 25 16:47:41 2024 +0800 * Fix bug for preview pivot. commitcc0a8aabceAuthor: hufangzhou <hufangzhou@easycorp.ltd> Date: Thu Apr 25 16:39:20 2024 +0800 + Add the or vision image. commit73d70324fdAuthor: hufangzhou <hufangzhou@easycorp.ltd> Date: Thu Apr 25 16:34:31 2024 +0800 * Change lang item. commita54780438aAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 16:33:11 2024 +0800 * Modify the style of bugSteps. commitff5be095b4Author: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 16:32:24 2024 +0800 * Fix bug #48453. commit0432554143Author: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 16:21:52 2024 +0800 + Add comment. commit9155a82131Author: caoyanyi <caoyanyi@easycorp.ltd> Date: Thu Apr 25 16:07:55 2024 +0800 * Adjust jenkins job form style. commitdc272445cfAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 15:59:31 2024 +0800 * Fix bug if the execution doesn't have the products. commit1fce0df29bAuthor: caoyanyi <caoyanyi@easycorp.ltd> Date: Thu Apr 25 15:48:41 2024 +0800 * Adjust app create tips. commita48e48394eAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 15:47:09 2024 +0800 * Fix bug #48452. commitc500f9ce58Author: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 15:27:17 2024 +0800 * Fix bug #48449. commit076b33652cAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 15:11:57 2024 +0800 * Fix bug #48429, don't append relatedBugs to excludeBugs when linking bugs. commitbf59668dffAuthor: caoyanyi <caoyanyi@easycorp.ltd> Date: Fri Apr 19 11:22:22 2024 +0800 + Add page data for repo code view. commit91e83ce12bAuthor: caoyanyi <caoyanyi@easycorp.ltd> Date: Thu Apr 25 15:10:34 2024 +0800 * Adjust repo branch switch style. commit16147ac595Author: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 15:09:44 2024 +0800 * Fix bug #48444. commitda77572ec8Author: wangyuting <wangyuting@easycorp.ltd> Date: Thu Apr 25 15:06:20 2024 +0800 * Adjust executionstatistic block burn. task #116977. commit73235c93c8Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 15:03:45 2024 +0800 * Fix bug #48436, add ztfRun to the actions in execution::testcase. commit248b65ba6aAuthor: xieqiyu <xieqiyu@easycorp.ltd> Date: Thu Apr 25 15:02:39 2024 +0800 * Fix bug#48420. commit388f54b5ecAuthor: xieqiyu <xieqiyu@easycorp.ltd> Date: Thu Apr 25 15:01:03 2024 +0800 * Fix bug#48427. commit2c4122b084Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 14:58:02 2024 +0800 * Fix bug #48441, keep in current tab when changing the stepsType. commitc9b094b3abAuthor: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 14:58:13 2024 +0800 * Fix bug #48438. commitae10a1c686Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 14:54:28 2024 +0800 * Fix bug #48435, replace `$this->session` with `$app->session`. commitc81031dab9Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 14:49:42 2024 +0800 * Fix bug #48430, replace `{runID}`. commit0635779f1fAuthor: 王怡栋 <wangyidong@cnezsoft.com> Date: Thu Apr 25 14:48:58 2024 +0800 * Fix bug #48419. commit2b1358fb75Author: zhouxin <zhouxin@easycorp.ltd> Date: Thu Apr 25 14:46:08 2024 +0800 * Fix bug #47408. commitaef64e2c85Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 14:45:30 2024 +0800 * Fix bug #48423, replace `<br />` with `<p></p>`. commit392a031495Author: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 14:41:55 2024 +0800 * Show the product line when the program is not selected. commit1449ea4d06Author: tanghucheng <tanghucheng@easycorp.ltd> Date: Thu Apr 25 14:41:09 2024 +0800 * Fix bug #116431. commit9ce8dfe3eeAuthor: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 14:31:03 2024 +0800 * Fix bug #48433. commit62a8779806Author: sunguangming <sunguangming@easycorp.ltd> Date: Thu Apr 25 14:28:56 2024 +0800 * Add loadProductModules function. commit8ec4efde62Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 14:27:36 2024 +0800 * Add return type. commit035f15b16eAuthor: sunhao <sunhao@easycorp.ltd> Date: Thu Apr 25 14:21:50 2024 +0800 * disable loading effect on loading modal with same url. commit1b7aac3f6fAuthor: zhouxin <zhouxin@easycorp.ltd> Date: Thu Apr 25 14:19:34 2024 +0800 * Fix bug #47654. commit730ab12d86Author: sunhao <sunhao@easycorp.ltd> Date: Thu Apr 25 13:59:51 2024 +0800 * zin: add favicon to base page. commite7051b2d2fAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 13:58:51 2024 +0800 * Fix bug #48421, removes duplicate projects. commit3089e95041Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 13:43:47 2024 +0800 * Fix bug #48176. commit1409059467Author: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 13:41:20 2024 +0800 * Fix bug #48418. commit6934f36b9eAuthor: zhouxin <zhouxin@easycorp.ltd> Date: Thu Apr 25 13:35:10 2024 +0800 * Remove useless method. commit908f7dd087Author: wangyuting <wangyuting@easycorp.ltd> Date: Thu Apr 25 13:30:56 2024 +0800 * Adjust teamachievement block css. task #116978. commitabb2d04bd0Author: zhouxin <zhouxin@easycorp.ltd> Date: Thu Apr 25 13:25:53 2024 +0800 * Optimize code. commit042726dd6aAuthor: tanghucheng <tanghucheng@easycorp.ltd> Date: Thu Apr 25 11:16:45 2024 +0800 * Fix bug #48143, Add $config->story->dtable->fieldList['roadmap']['width']. commitb3b3a4884bAuthor: tanghucheng <tanghucheng@easycorp.ltd> Date: Thu Apr 25 11:00:11 2024 +0800 * Fix bug #48415. commitb2878c8644Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 10:59:32 2024 +0800 - Remove `var_dump`. commitb8e22a5446Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 10:59:02 2024 +0800 * Optimize code for uploading files. commit328cf2c605Author: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 10:57:27 2024 +0800 - Remove unused style. commit98f501ad66Author: sunhao <sunhao@easycorp.ltd> Date: Thu Apr 25 10:57:18 2024 +0800 * zui: update zui3 lib. commit138ae9b7bbAuthor: caoyanyi <caoyanyi@easycorp.ltd> Date: Thu Apr 25 10:55:12 2024 +0800 * Adjust repo page language. commit2a4abbde8dAuthor: 宋辰轩 <songchenxuan@easycorp.ltd> Date: Thu Apr 25 10:24:32 2024 +0800 * Fix bug #48350. commitc2c122b678Author: wangyuting <wangyuting@easycorp.ltd> Date: Thu Apr 25 10:22:08 2024 +0800 * Adjust welcome block css. task #116979. commit1cba83c80fAuthor: sunhao <sunhao@easycorp.ltd> Date: Thu Apr 25 10:21:24 2024 +0800 * kanban: optimize label style. commita92ca103b9Author: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 10:18:16 2024 +0800 * Fix bug #48402. commitdecae20945Author: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 10:11:24 2024 +0800 * Adjust select execution title style. commit8fc680ecc9Author: 宋辰轩 <songchenxuan@easycorp.ltd> Date: Thu Apr 25 10:03:04 2024 +0800 * Add delete file. commit0c08073647Author: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 09:39:41 2024 +0800 * The date field was not validated when fixing the bug import task. commitb6aa30da6fAuthor: liyang <liyang@easycorp.ltd> Date: Thu Apr 25 09:41:02 2024 +0800 Add delete btn in import repo page. commit188bdfff90Author: liyang <liyang@easycorp.ltd> Date: Thu Apr 25 09:30:58 2024 +0800 Hide the hidden function of the imported code library page commit22e899b21fAuthor: sunguangming <sunguangming@easycorp.ltd> Date: Thu Apr 25 09:26:39 2024 +0800 * Fix bug #48372. commitdea8d5785aAuthor: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 09:25:57 2024 +0800 * Remove the box when it is out of focus. commit94117eac4aAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 09:21:31 2024 +0800 * Modify testtask's order in qastatistic block. commit16558b955dAuthor: 宋辰轩 <songchenxuan@easycorp.ltd> Date: Thu Apr 25 09:18:46 2024 +0800 * Use ajaxGetOldDropMenu commiteb7f606fe5Author: hufangzhou <hufangzhou@easycorp.ltd> Date: Thu Apr 25 09:07:24 2024 +0800 * Add todo-calendar privilege to or interface. commit119fef4faeAuthor: wangyuting <wangyuting@easycorp.ltd> Date: Thu Apr 25 09:06:33 2024 +0800 * Adjust closedSetting to closeSetting. commit1179f36595Author: tanghucheng <tanghucheng@easycorp.ltd> Date: Thu Apr 25 08:58:31 2024 +0800 * Fix bug #47758, unset percent when disabled. commitb143356a55Author: sunguangming <sunguangming@easycorp.ltd> Date: Thu Apr 25 08:56:35 2024 +0800 * Fix bug #48379. commite1ec138058Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 08:52:51 2024 +0800 * Optimize code for bug #48271. commit8ca008736aAuthor: liwenrui <liwenrui@easycorp.ltd> Date: Thu Apr 25 08:49:31 2024 +0800 * tweak again, actually only wanted to add padding to the top. commit388006b340Author: liwenrui <liwenrui@easycorp.ltd> Date: Thu Apr 25 08:49:05 2024 +0800 * tweak zeneditor to add some padding back. commit0e0121b201Author: liwenrui <liwenrui@easycorp.ltd> Date: Thu Apr 25 08:27:23 2024 +0800 * update zeneditor and remove paragraph margin within. commit5e3b42a9f3Author: sunhao <sunhao@easycorp.ltd> Date: Wed Apr 24 17:32:20 2024 +0800 * zui: update zui3 lib. commit3e543c1403Author: wangyuting <wangyuting@easycorp.ltd> Date: Wed Apr 24 17:30:35 2024 +0800 * Optimize code. commitce8e34849dAuthor: wangyuting <wangyuting@easycorp.ltd> Date: Wed Apr 24 17:29:17 2024 +0800 * Fix project menu bug. bug #48121. commitbff8da8abaAuthor: sunhao <sunhao@easycorp.ltd> Date: Wed Apr 24 17:20:38 2024 +0800 * zin: sort fields after reload form. commit01e15f6635Author: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 16:53:10 2024 +0800 * Fix bug #46381. commitb89caabfceAuthor: hufangzhou <hufangzhou@easycorp.ltd> Date: Wed Apr 24 16:53:21 2024 +0800 * Adjust the default filename for export execution. commit17d5d65a17Author: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 16:47:28 2024 +0800 * Fix bug #48367, get linked bugs. commit3ee2f3ea5cAuthor: 宋辰轩 <songchenxuan@easycorp.ltd> Date: Wed Apr 24 16:45:43 2024 +0800 * Fix bug for preview pivot menu. commit2c00f9a657Author: xieqiyu <xieqiyu@easycorp.ltd> Date: Wed Apr 24 16:29:25 2024 +0800 * Fix bug#48334. commit484e24fd9dAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 16:24:24 2024 +0800 * Fix bug #48343. commit1aa110645cAuthor: liwenrui <liwenrui@easycorp.ltd> Date: Wed Apr 24 16:01:19 2024 +0800 * fix ai prompt menu injected multiple times, bug #48358. commita2333979b5Author: zhouxin <zhouxin@easycorp.ltd> Date: Wed Apr 24 15:59:09 2024 +0800 * Fix height of project deviation pivot. commit7a3b20222fAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 15:54:16 2024 +0800 * Replace runID in testcase::browse. commitab05d56301Author: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 15:45:01 2024 +0800 * No iterative project hides execution column. commitdffcd9e5c7Author: sunguangming <sunguangming@easycorp.ltd> Date: Wed Apr 24 15:46:18 2024 +0800 * Fix sql error. commit22d89bb361Author: xieqiyu <xieqiyu@easycorp.ltd> Date: Wed Apr 24 15:43:11 2024 +0800 * Fix bug#48349. commit603195b1e1Author: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 15:41:27 2024 +0800 * Adjust execution column style of the build list. commit989f2b8ca5Author: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 15:27:01 2024 +0800 * Fix bug #48344, set runID. commit2db2a7f9dcAuthor: caoyanyi <caoyanyi@easycorp.ltd> Date: Wed Apr 24 15:25:54 2024 +0800 - Remove gitfox for 20.0. commit3a1f824210Author: xieqiyu <xieqiyu@easycorp.ltd> Date: Wed Apr 24 15:24:46 2024 +0800 * Fix bug#48351. commitaf0b038283Author: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 15:14:43 2024 +0800 * Fix bug #48348. commitd4dc98d604Author: tanghucheng <tanghucheng@easycorp.ltd> Date: Wed Apr 24 15:13:00 2024 +0800 * Fix bug #48140, Enabled child stage for ipd project. commit08e0f83941Author: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 15:07:36 2024 +0800 * Adjust height of the batchcreate stakeholder page. commit8e1dfa7634Author: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 14:58:29 2024 +0800 * Fix bug #48345. commit0562ebb542Author: sunguangming <sunguangming@easycorp.ltd> Date: Wed Apr 24 14:55:42 2024 +0800 * Add story pairs to search form. commit2c062163a5Author: tanghucheng <tanghucheng@easycorp.ltd> Date: Wed Apr 24 14:40:10 2024 +0800 * Fix bug #48314. commitb812069307Author: qixinzhi <qixinzhi@easycorp.ltd> Date: Wed Apr 24 06:38:51 2024 +0000 * Auto column width with cell max value length. commitf9c1a3e850Author: qixinzhi <qixinzhi@easycorp.ltd> Date: Wed Apr 24 06:38:04 2024 +0000 * Delete screen 3 scheme. commit3ffa92734fAuthor: hufangzhou <hufangzhou@easycorp.ltd> Date: Wed Apr 24 14:35:14 2024 +0800 * Fix bug #48239. commit99e1864ca8Author: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 14:30:08 2024 +0800 * Fix bug #46381. commit81c3ebaa0aAuthor: caoyanyi <caoyanyi@easycorp.ltd> Date: Wed Apr 24 14:28:26 2024 +0800 + Add time fliter for commit search. commit14d5bf7cf0Author: caoyanyi <caoyanyi@easycorp.ltd> Date: Wed Apr 24 09:34:53 2024 +0800 * Adjust repo create page linkage. commit6880ef70afAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 14:22:28 2024 +0800 * Replace `->size` with `set::width` and `set::height` in echarts. commitb4ea64832aAuthor: caoyanyi <caoyanyi@easycorp.ltd> Date: Wed Apr 24 14:15:13 2024 +0800 * Adjust job view repo name. commit8168c98ba8Author: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 14:13:53 2024 +0800 * Fix bug #48262. commitd480ef87bdAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 13:51:05 2024 +0800 * Fix bug #48025, modify id. commit003a73d5cbAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 13:49:12 2024 +0800 * Fix bug #48025, modify id. commit3ad257eb53Author: daitingting <daitingting@xirangit.com> Date: Wed Apr 24 05:43:53 2024 +0000 * Fix bug #48261. commit77e6744f1dAuthor: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 13:42:13 2024 +0800 * Fix bug #48294. commitf10b3f5710Author: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 13:36:01 2024 +0800 * Reset code. commit068f97bc38Author: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 13:18:34 2024 +0800 * Fix bug #48308, set control of stage. commit078d566703Author: wangyuting <wangyuting@easycorp.ltd> Date: Wed Apr 24 13:18:41 2024 +0800 * Adjust edit feedback data toggle. commit34738e42d9Author: zhouxin <zhouxin@easycorp.ltd> Date: Wed Apr 24 13:13:29 2024 +0800 * Adjust lang. commiteddba468d0Author: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 13:07:40 2024 +0800 * Fix bug #48310. commitfc673b76ceAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 11:26:49 2024 +0800 * Fix bug #48310. commit7840c1ab35Author: sunguangming <sunguangming@easycorp.ltd> Date: Wed Apr 24 11:24:40 2024 +0800 * Remove dm driver from convert date. commitd47e91c07eAuthor: hufangzhou <hufangzhou@easycorp.ltd> Date: Wed Apr 24 11:20:10 2024 +0800 * Fix bug #48293. commitd475b63a74Author: daitingting <daitingting@xirangit.com> Date: Wed Apr 24 03:16:57 2024 +0000 * Fix bug #48261. commit655cc652beAuthor: 王怡栋 <wangyidong@cnezsoft.com> Date: Wed Apr 24 11:14:54 2024 +0800 * Fix bug for select usage when install. commit425fade713Author: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 11:14:19 2024 +0800 * Fix bug #48303. commit723797107bAuthor: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 11:09:27 2024 +0800 * Fix bug #48303. commit6740a4c699Author: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 11:06:32 2024 +0800 * Fix bug #48306. commitc42f7ad83eAuthor: zhouxin <zhouxin@easycorp.ltd> Date: Wed Apr 24 11:02:21 2024 +0800 * Fix bug #48073. commite38f2f6531Author: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 10:42:42 2024 +0800 * Set search form open. commit2cb511cf52Author: 王怡栋 <wangyidong@cnezsoft.com> Date: Wed Apr 24 10:07:43 2024 +0800 * Fix error for sso module. commitf8b093e0ebAuthor: xieqiyu <xieqiyu@easycorp.ltd> Date: Wed Apr 24 10:21:37 2024 +0800 * Fix the bug of duration and BSA default value. commitc3e9c7d7cdAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 10:20:25 2024 +0800 * Fix bug #48243. commitc7cf68be63Author: hufangzhou <hufangzhou@easycorp.ltd> Date: Wed Apr 24 10:17:03 2024 +0800 * Fix bug #48280, #48289. commitb9cdcf5bcdAuthor: sunhao <sunhao@easycorp.ltd> Date: Wed Apr 24 10:17:34 2024 +0800 * my: fix cannot update badges in main navbar. commit3aa9609ce2Author: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 10:16:21 2024 +0800 * Fix bug #48294. commitfb26e627deAuthor: sunhao <sunhao@easycorp.ltd> Date: Wed Apr 24 10:10:56 2024 +0800 Revert "* zin: fix cannot find page method on update." This reverts commit367a4ae49d. commit63a70421edAuthor: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 09:45:07 2024 +0800 * Fix bug #48271. commitc1a66b708bAuthor: sunguangming <sunguangming@easycorp.ltd> Date: Wed Apr 24 09:40:09 2024 +0800 * Modify upgrade method. commitc68b2170f9Author: 王怡栋 <wangyidong@cnezsoft.com> Date: Wed Apr 24 09:18:09 2024 +0800 * Fix for sso login from zdoo. commit580b4f170fAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 09:30:37 2024 +0800 * Fix bug #48272, update program's consumed, left and progress. commit1d9791a55eAuthor: 王怡栋 <wangyidong@cnezsoft.com> Date: Tue Apr 23 17:27:07 2024 +0800 * Remove useless code. commit40f0e10c1fAuthor: caoyanyi <caoyanyi@easycorp.ltd> Date: Tue Apr 23 17:18:03 2024 +0800 * Update standard sql. # Conflicts: # db/update20.0.beta2.sql # module/block/config/feedback.php # module/block/zen.php # module/custom/lang/vi.php # module/mr/ui/browsebyexecution.html.php # module/repo/lang/de.php # module/repo/lang/en.php # module/repo/lang/fr.php # module/repo/lang/zh-cn.php # module/space/lang/de.php # module/space/lang/en.php # module/space/lang/fr.php # module/space/lang/zh-cn.php # module/space/ui/createapplication.html.php # www/js/zui3/zen-editor/index.esm.js # www/js/zui3/zen-editor/p-0aaccc7e.js # www/js/zui3/zen-editor/p-276dd30f.js # www/js/zui3/zen-editor/p-2b13cc9a.js # www/js/zui3/zen-editor/p-38d18c5d.js # www/js/zui3/zen-editor/p-3f6cad83.js # www/js/zui3/zen-editor/p-51e3a048.js # www/js/zui3/zen-editor/p-617d463f.js # www/js/zui3/zen-editor/p-62c0132e.js # www/js/zui3/zen-editor/p-6d22490c.js # www/js/zui3/zen-editor/p-a563f50b.js # www/js/zui3/zen-editor/p-bf31230c.js # www/js/zui3/zen-editor/p-c6c95773.js # www/js/zui3/zen-editor/p-d83dd3f0.js # www/js/zui3/zen-editor/p-d8bedd14.js # www/js/zui3/zen-editor/p-eaaa4129.js # www/js/zui3/zen-editor/zen-editor.esm.js
This commit is contained in:
@@ -25,3 +25,4 @@ UPDATE `zt_grouppriv` SET `method` = 'deleteWorkhour' WHERE `module` = 'task' AN
|
||||
ALTER TABLE `zt_demandreview` CHANGE `reviewDate` `reviewDate` datetime NULL;
|
||||
|
||||
DELETE FROM `zt_lang` WHERE `module` = 'project' AND `section` = 'menuOrder';
|
||||
DELETE FROM `zt_config` WHERE `module` = 'bi' AND `key` IN ('update2BI','bizGuide','pmsGuide');
|
||||
|
||||
@@ -22,27 +22,27 @@ renderContactList = function()
|
||||
* 选择联系人列表后加载联系人。
|
||||
* Load contact users after selecting contact list.
|
||||
*
|
||||
* @param string value
|
||||
* @param string target
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
window.loadContactUsers = function(value)
|
||||
window.loadContactUsers = function(target)
|
||||
{
|
||||
const event = this.base;
|
||||
const $picker = $(event).zui('picker');
|
||||
const picker = event.target;
|
||||
const $picker = $(picker).zui('picker');
|
||||
if($picker === undefined)
|
||||
{
|
||||
if(config.debug) console.log('[ZIN] Contact picker not found');
|
||||
return;
|
||||
}
|
||||
|
||||
if(!value) return;
|
||||
const listID = $picker.$.value;
|
||||
if(!listID) return;
|
||||
|
||||
const link = $.createLink('user', 'ajaxGetContactUsers', 'listID=' + value);
|
||||
const target = this.props.loadTarget === undefined ? '' : this.props.loadTarget;
|
||||
const link = $.createLink('user', 'ajaxGetContactUsers', 'listID=' + listID);
|
||||
$.getJSON(link, function(users)
|
||||
{
|
||||
const $target = target ? $("[name^='" + target + "']") : $(event).closest('span').prev();
|
||||
const $target = target ? $("[name^='" + target + "']") : $(picker).closest('#contactBox').prev();
|
||||
const $targetPicker = $target.zui('picker');
|
||||
if($targetPicker === undefined)
|
||||
{
|
||||
|
||||
@@ -63,8 +63,7 @@ class contactList extends wg
|
||||
set::name($this->prop('name')),
|
||||
set::items($items),
|
||||
set::placeholder($this->prop('placeholder')),
|
||||
set::onChange(jsRaw('loadContactUsers')),
|
||||
setData('loadTarget', $target)
|
||||
on::change()->call('loadContactUsers', "{$target}")
|
||||
),
|
||||
a
|
||||
(
|
||||
|
||||
@@ -51,6 +51,7 @@ class formBatchPanel extends formPanel
|
||||
.panel-form-batch > .panel-body {position: relative; padding: 0; margin: 0 -16px}
|
||||
.panel-form-batch .form {gap: 0}
|
||||
.panel-form-batch .form-batch-container {max-height: calc(100vh - 214px); padding: 0 16px 16px; flex: auto; min-height: 0; overflow: auto}
|
||||
.modal-body .panel-form-batch .form-batch-container {max-height: unset;}
|
||||
.panel-form-batch .form-actions {left: 0; position: static; flex: none; padding: 24px 0; border-top: 1px solid var(--color-border)}
|
||||
CSS;
|
||||
}
|
||||
|
||||
@@ -90,7 +90,7 @@ class linkedStoryList extends storyList
|
||||
'data-url' => str_replace('{id}', "$story->id", $this->unlinkUrl),
|
||||
'data-params' => 'event',
|
||||
'data-call' => 'unlinkStory',
|
||||
'hint' => $lang->story->unlinkStory
|
||||
'hint' => $story->type == 'requirement' ? str_replace($lang->SRCommon, $lang->URCommon, $lang->story->unlinkStory) : $lang->story->unlinkStory
|
||||
);
|
||||
|
||||
if(is_array($unlinkBtn)) $btn = array_merge($btn, $unlinkBtn);
|
||||
|
||||
@@ -19,14 +19,14 @@ class navbar extends wg
|
||||
$object = $app->dbh->query('SELECT project,type FROM ' . TABLE_EXECUTION . " WHERE `id` = '$executionID'")->fetch();
|
||||
if(empty($object)) return;
|
||||
|
||||
$executionPairs = array();
|
||||
$userCondition = !$app->user->admin ? " AND `id` " . helper::dbIN($app->user->view->sprints) : '';
|
||||
$orderBy = $object->type == 'stage' ? 'ORDER BY `id` ASC' : 'ORDER BY `id` DESC';
|
||||
$executionList = $app->dbh->query("SELECT id,name,parent FROM " . TABLE_EXECUTION . " WHERE `project` = '{$object->project}' AND `deleted` = '0' $userCondition $orderBy")->fetchAll();
|
||||
$executionPairs = array();
|
||||
$userCondition = !$app->user->admin ? " AND `id` " . helper::dbIN($app->user->view->sprints) : '';
|
||||
$orderBy = $object->type == 'stage' ? 'ORDER BY `id` ASC' : 'ORDER BY `id` DESC';
|
||||
$executionList = $app->dbh->query("SELECT id,name,parent FROM " . TABLE_EXECUTION . " WHERE `project` = '{$object->project}' AND `deleted` = '0' $userCondition $orderBy")->fetchAll();
|
||||
$parentExecutions = array_flip(array_column($executionList, 'parent'));
|
||||
foreach($executionList as $execution)
|
||||
{
|
||||
if(isset($executionPairs[$execution->parent])) unset($executionPairs[$execution->parent]);
|
||||
if($execution->id == $executionID) continue;
|
||||
if($execution->id == $executionID || isset($parentExecutions[$execution->id])) continue;
|
||||
$executionPairs[$execution->id] = $execution->name;
|
||||
}
|
||||
|
||||
|
||||
@@ -86,7 +86,7 @@ class backup extends control
|
||||
/**
|
||||
* Backup.
|
||||
*
|
||||
* param string $reload yes|no
|
||||
* @param string $reload yes|no
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -306,6 +306,7 @@ class backup extends control
|
||||
if($attachFileName)
|
||||
{
|
||||
$log = $this->backup->getBackupDirProgress($attachFileName);
|
||||
if(empty($log)) return print('');
|
||||
$message = sprintf($this->lang->backup->progressAttach, zget($log, 'allCount', 0), zget($log, 'count', 0));
|
||||
}
|
||||
|
||||
@@ -313,6 +314,7 @@ class backup extends control
|
||||
if($codeFileName)
|
||||
{
|
||||
$log = $this->backup->getBackupDirProgress($codeFileName);
|
||||
if(empty($log)) return print('');
|
||||
$message = sprintf($this->lang->backup->progressCode, zget($log, 'allCount', 0), zget($log, 'count', 0));
|
||||
}
|
||||
|
||||
|
||||
@@ -44,13 +44,13 @@ function backupData()
|
||||
{
|
||||
clearInterval(timeID);
|
||||
$('#message').append(data);
|
||||
setTimeout(function(){return location.href = $.createLink('backup', 'index');}, 2000);
|
||||
setTimeout(function(){return loadPage($.createLink('backup', 'index'));}, 2000);
|
||||
},
|
||||
error: function(request, textstatus, error)
|
||||
{
|
||||
clearInterval(timeID);
|
||||
if(textstatus == 'timeout') $('#message').append("<p class='text-danger'>" + backupTimeout + '</p>');
|
||||
setTimeout(function(){return location.href = $.createLink('backup', 'index');}, 2000);
|
||||
setTimeout(function(){return loadPage($.createLink('backup', 'index'));}, 2000);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -62,6 +62,7 @@ function backupData()
|
||||
{
|
||||
$.get($.createLink('backup', 'ajaxGetProgress'), function(data)
|
||||
{
|
||||
if(data == '') return;
|
||||
$('#message').html(data);
|
||||
});
|
||||
}, 1000);
|
||||
|
||||
@@ -193,17 +193,18 @@ class backupModel extends model
|
||||
{
|
||||
$die = "<?php die();?" . ">\n";
|
||||
$tmpFile = $fileName . '.tmp';
|
||||
rename($fileName, $tmpFile);
|
||||
|
||||
file_put_contents($tmpFile, $die);
|
||||
$fh = fopen($fileName, 'r');
|
||||
file_put_contents($fileName, $die);
|
||||
$fh = fopen($tmpFile, 'r');
|
||||
$length = 2 * 1024 * 1024;
|
||||
while(!feof($fh))
|
||||
{
|
||||
$buff = fread($fh, $length);
|
||||
file_put_contents($tmpFile, $buff, FILE_APPEND);
|
||||
file_put_contents($fileName, $buff, FILE_APPEND);
|
||||
}
|
||||
fclose($fh);
|
||||
rename($tmpFile, $fileName);
|
||||
unlink($tmpFile);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -331,7 +332,7 @@ class backupModel extends model
|
||||
$log = json_decode(file_get_contents($tmpLogFile), true);
|
||||
return empty($log) ? array() : $log;
|
||||
}
|
||||
return array();
|
||||
return array('allCount' => 0, 'count' => 0);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -401,7 +402,7 @@ class backupModel extends model
|
||||
/**
|
||||
* Get disk space.
|
||||
*
|
||||
* @param int $backupPath
|
||||
* @param string $backupPath
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
|
||||
@@ -51,6 +51,7 @@ class backupZen extends backup
|
||||
* backupSQL
|
||||
*
|
||||
* @param string $fileName
|
||||
* @param string $reload
|
||||
* @access protected
|
||||
* @return array
|
||||
*/
|
||||
@@ -83,6 +84,7 @@ class backupZen extends backup
|
||||
* Backup appendix file.
|
||||
*
|
||||
* @param string $fileName
|
||||
* @param string $reload
|
||||
* @access protected
|
||||
* @return array
|
||||
*/
|
||||
@@ -110,6 +112,7 @@ class backupZen extends backup
|
||||
* Backup code
|
||||
*
|
||||
* @param string $fileName
|
||||
* @param string $reload
|
||||
* @access protected
|
||||
* @return array
|
||||
*/
|
||||
|
||||
@@ -296,7 +296,7 @@ $config->block->size['product']['releasestatistic'] = array(1 => 8, 2 => 5);
|
||||
|
||||
$config->block->size['project']['overview'] = array(1 => 3);
|
||||
$config->block->size['project']['statistic'] = array(2 => 5, 1 => 8);
|
||||
$config->block->size['project']['recentproject'] = array(2 => 4, 1 => 9);
|
||||
$config->block->size['project']['recentproject'] = array(2 => 4, 1 => 10);
|
||||
$config->block->size['project']['project'] = array(2 => 6, 1 => 6);
|
||||
|
||||
$config->block->size['scrumproject']['scrumoverview'] = array(2 => 5, 1 => 8);
|
||||
|
||||
@@ -8,7 +8,7 @@ if(in_array($config->edition, array('max', 'biz', 'ipd')))
|
||||
$config->block->feedback->dtable = new stdclass();
|
||||
$config->block->feedback->dtable->fieldList = array();
|
||||
$config->block->feedback->dtable->fieldList['id'] = array('name' => 'id', 'title' => $lang->idAB, 'type' => 'id' , 'sort' => 'number');
|
||||
$config->block->feedback->dtable->fieldList['title'] = array('name' => 'title', 'title' => $lang->feedback->title, 'type' => 'title', 'sort' => true, 'flex' => 1, 'link' => array('module' => 'feedback', 'method' => 'adminView', 'params' => 'feedbackID={id}'));
|
||||
$config->block->feedback->dtable->fieldList['title'] = array('name' => 'title', 'title' => $lang->feedback->title, 'type' => 'title', 'sort' => true, 'flex' => 1, 'link' => array('module' => 'feedback', 'method' => $config->vision == 'lite' ? 'view' : 'adminView', 'params' => 'feedbackID={id}'));
|
||||
$config->block->feedback->dtable->fieldList['product'] = array('name' => 'product', 'title' => $lang->feedback->product, 'type' => 'category', 'sort' => true);
|
||||
$config->block->feedback->dtable->fieldList['pri'] = array('name' => 'pri', 'title' => $lang->feedback->pri, 'type' => 'pri', 'sort' => true);
|
||||
$config->block->feedback->dtable->fieldList['status'] = array('name' => 'status', 'title' => $lang->feedback->status, 'type' => 'status', 'sort' => true, 'statusMap' => $lang->feedback->statusList);
|
||||
|
||||
@@ -147,6 +147,7 @@ blockPanel
|
||||
div($contents),
|
||||
h::css
|
||||
(
|
||||
'.block-assigntome .panel-heading .panel-title {overflow: hidden; text-overflow: clip; white-space: nowrap; width : 40%}',
|
||||
'.block-assigntome .nav > .nav-item > a {padding: 0 16px; border-radius: 4px; height: 28px; color: var(--color-gray-700)}',
|
||||
'.block-assigntome .nav > .nav-item > a.active {font-weight: bold; color: var(--color-gray-900); background: var(--color-primary-50)}'
|
||||
)
|
||||
|
||||
@@ -19,14 +19,14 @@ foreach($projects as $projectID => $project)
|
||||
|
||||
$cards[] = cell
|
||||
(
|
||||
setClass('p-2', $longBlock ? 'w-1/3' : 'w-full h-40'),
|
||||
setClass('p-2', $longBlock ? 'w-1/3' : 'w-full h-50'),
|
||||
div
|
||||
(
|
||||
setClass('border rounded-sm h-full px-4 hover:shadow hover:border-primary cursor-pointer open-url group', $longBlock ? 'py-4' : 'py-2'),
|
||||
setClass('border rounded-sm h-full px-4 hover:shadow hover:border-primary cursor-pointer open-url group', $longBlock ? 'py-3' : 'py-2'),
|
||||
setData('url', $viewLink),
|
||||
div
|
||||
(
|
||||
setClass('mb-4'),
|
||||
setClass('mb-2'),
|
||||
a
|
||||
(
|
||||
setClass('font-bold text-fore text-md group-hover:text-primary'),
|
||||
@@ -55,9 +55,9 @@ foreach($projects as $projectID => $project)
|
||||
),
|
||||
$project->end == LONG_TIME ? $lang->program->longTime : $project->end
|
||||
),
|
||||
($project->multiple && $execution) ? array
|
||||
div
|
||||
(
|
||||
div
|
||||
$project->multiple && $execution ? div
|
||||
(
|
||||
span
|
||||
(
|
||||
@@ -74,8 +74,21 @@ foreach($projects as $projectID => $project)
|
||||
setClass('label warning-pale circle ml-2'),
|
||||
$lang->execution->statusList[$execution->status]
|
||||
)
|
||||
),
|
||||
) : null
|
||||
) : div(setClass('h-5'))
|
||||
),
|
||||
div
|
||||
(
|
||||
setClass('flex items-center'),
|
||||
span(setClass('num mr-1'), $project->progress . '%'),
|
||||
progressBar
|
||||
(
|
||||
setClass('progress flex-auto'),
|
||||
set::height(8),
|
||||
set::percent($project->progress),
|
||||
set::color('var(--color-primary-300)'),
|
||||
set::background('rgba(0,0,0,0.02)')
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
+4
-19
@@ -435,7 +435,7 @@ class blockZen extends block
|
||||
/* 获取昨日解决的Bug数。 */
|
||||
$fixBug = 0;
|
||||
$fixBugGroup = $this->metric->getResultByCode('count_of_daily_fixed_bug_in_user', array('user' => $this->app->user->account, 'year' => date('Y', $yesterday), 'month' => date('m', $yesterday), 'day' => date('d', $yesterday)));
|
||||
if(!empty($fixBug))
|
||||
if(!empty($fixBugGroup))
|
||||
{
|
||||
$fixBugGroup = reset($fixBugGroup);
|
||||
$fixBug = zget($fixBugGroup, 'value', 0);
|
||||
@@ -469,27 +469,12 @@ class blockZen extends block
|
||||
$assignedGroup = reset($assignedGroup);
|
||||
$count = zget($assignedGroup, 'value', 0);
|
||||
}
|
||||
$assignToMe[$field] = array('number' => $count, 'href' => helper::createLink('my', 'work', "mode=$field&type=$type"));
|
||||
$assignToMe[$field] = array('number' => $count, 'href' => common::hasPriv('my', 'work') ? helper::createLink('my', 'work', "mode=$field&type=$type") : '');
|
||||
}
|
||||
|
||||
/* 生成待我审批的数据。 */
|
||||
$reviewByMe['reviewByMe']['number'] = 0;
|
||||
$reviewByMe['reviewByMe']['href'] = helper::createLink('my', 'audit');
|
||||
foreach($this->lang->block->welcome->reviewList as $field => $label)
|
||||
{
|
||||
/* 根据不同的模块生成不同的度量项查询码。 */
|
||||
$code = "reviewing_{$field}";
|
||||
|
||||
/* 查询当前指派给当前用户的不同数据。 */
|
||||
$reviewingGroup = $this->metric->getResultByCode("count_of_{$code}_in_user", array('user' => $this->app->user->account));
|
||||
$count = 0;
|
||||
if(!empty($reviewingGroup))
|
||||
{
|
||||
$reviewingGroup = reset($reviewingGroup);
|
||||
$count = zget($reviewingGroup, 'value', 0);
|
||||
}
|
||||
$reviewByMe['reviewByMe']['number'] += $count;
|
||||
}
|
||||
$reviewList = $this->loadModel('my')->getReviewingList('all');
|
||||
$reviewByMe['reviewByMe'] = array('number' => count($reviewList), 'href' => common::hasPriv('my', 'audit') ? helper::createLink('my', 'audit') : '');
|
||||
|
||||
$this->view->todaySummary = date(DT_DATE3, time()) . ' ' . $this->lang->datepicker->dayNames[date('w', time())]; // 当前年月日 星期几。
|
||||
$this->view->welcomeType = $welcomeType;
|
||||
|
||||
@@ -947,7 +947,7 @@ class commonModel extends model
|
||||
}
|
||||
else
|
||||
{
|
||||
if(strpos($sql, ' ORDER BY') !== false) $queryCondition = substr($sql, 0, strpos($sql, ' ORDER BY '));
|
||||
$queryCondition = strpos($sql, ' ORDER BY') !== false ? substr($sql, 0, strpos($sql, ' ORDER BY ')) : $sql;
|
||||
}
|
||||
$queryCondition = trim($queryCondition);
|
||||
if(empty($queryCondition)) $queryCondition = "1=1";
|
||||
|
||||
@@ -193,6 +193,7 @@ window.getItem = function(info)
|
||||
info.item.title = info.item.title.replaceAll(searchValue, "<span class='text-danger'>" + searchValue + "</span>");
|
||||
info.item.title = {html: info.item.title};
|
||||
}
|
||||
info.item.titleAttrs = {'class': 'card-title clip'};
|
||||
}
|
||||
|
||||
window.renderAvatar = function(item)
|
||||
|
||||
@@ -238,6 +238,7 @@ window.getItem = function(info)
|
||||
|
||||
info.item.content = {html: content};
|
||||
if(info.item.color && info.item.color != '#fff') info.item.className = 'color-' + info.item.color.replace('#', '');
|
||||
info.item.titleAttrs = {'class': 'card-title clip'};
|
||||
}
|
||||
|
||||
window.getItemActions = function(item)
|
||||
|
||||
@@ -1109,7 +1109,7 @@ class fileModel extends model
|
||||
|
||||
$objectType = zget($this->config->file->objectType, $file->objectType);
|
||||
|
||||
$html .= "<li class='mb-2 file' title='{$uploadDate}'>" . html::a($downloadLink, $fileTitle . " <span class='text-gray'>({$fileSize})</span>", '_blank', "id='fileTitle$file->id' onclick=\"return downloadFile($file->id, '$file->extension', $imageWidth, '$file->title')\"");
|
||||
$html .= "<li class='mb-2 file' title='{$uploadDate}'>" . html::a($downloadLink, $fileTitle . " <span class='text-gray'>({$fileSize})</span>", '_blank', "id='fileTitle$file->id'");
|
||||
if(strpos('view,edit', $method) !== false)
|
||||
{
|
||||
if(common::hasPriv($objectType, 'view', $object)) $html = $this->buildFileActions($html, $downloadLink, $imageWidth, $showEdit, $showDelete, $file, $object);
|
||||
|
||||
@@ -32,7 +32,7 @@ $(function()
|
||||
|
||||
function resizeModal()
|
||||
{
|
||||
const $modal = $('body>.modal-dialog>.modal-content>.modal-body,.modal-body').first();
|
||||
const $modal = $('body>.modal-dialog>.modal-content,.modal-body').first();
|
||||
const height = $modal.outerHeight();
|
||||
$modal.closest('body').height(height);
|
||||
}
|
||||
|
||||
@@ -182,6 +182,8 @@ window.getItem = function(info)
|
||||
renderGeneralItem(info);
|
||||
}
|
||||
if(info.item.color && info.item.color != '#fff') info.item.className = 'color-' + info.item.color.replace('#', '');
|
||||
|
||||
info.item.titleAttrs = {'class': 'card-title clip'};
|
||||
}
|
||||
|
||||
window.renderGeneralItem = function(info)
|
||||
@@ -283,11 +285,11 @@ window.renderProductplanItem = function(info)
|
||||
|
||||
if(info.item.deleted == '0')
|
||||
{
|
||||
statusBox = '<span class="label label-' + info.item.objectStatus + '">' + executionLang.statusList[info.item.objectStatus] + '</span>';
|
||||
statusBox = '<span class="label label-' + info.item.objectStatus + '">' + productplanLang.statusList[info.item.objectStatus] + '</span>';
|
||||
}
|
||||
else
|
||||
{
|
||||
statusBox = '<span class="label label-deleted">' + executionLang.deleted + '</span>';
|
||||
statusBox = '<span class="label label-deleted">' + productplanLang.deleted + '</span>';
|
||||
}
|
||||
|
||||
const today = zui.formatDate(new Date(), 'yyyy-MM-dd');
|
||||
@@ -295,7 +297,7 @@ window.renderProductplanItem = function(info)
|
||||
|
||||
const date = '<span class="ml-2 label ' + labelType + '">' + info.item.begin.slice(5) + ' ' + productplanLang.to + ' ' + info.item.end.slice(5) + '</span>';
|
||||
info.item.content = {html: info.item.desc}
|
||||
info.item.contentClass = 'text-gray';
|
||||
info.item.contentClass = 'text-gray clip mr-2';
|
||||
info.item.footer = {html: statusBox + date}
|
||||
}
|
||||
window.renderTicketItem = function(info)
|
||||
|
||||
@@ -66,3 +66,5 @@ window.showPackageSize = () =>
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
if(!$('#downloadClient input#os:not(.hidden)').length && !$('#downloadClient button.primary').length) getClient();
|
||||
|
||||
@@ -10,10 +10,7 @@ declare(strict_types=1);
|
||||
*/
|
||||
namespace zin;
|
||||
|
||||
dropmenu
|
||||
(
|
||||
set::url(createLink('execution', 'ajaxGetDropMenu', "objectID=$objectID&module={$app->rawModule}&method={$app->rawMethod}"))
|
||||
);
|
||||
dropmenu(set::url(createLink('execution', 'ajaxGetDropMenu', "objectID=$objectID&module={$app->rawModule}&method={$app->rawMethod}")));
|
||||
|
||||
foreach($MRList as $index => $MR)
|
||||
{
|
||||
@@ -78,36 +75,11 @@ if(empty($repoID))
|
||||
}
|
||||
|
||||
$MRs = initTableData($MRList, $config->mr->dtable->fieldList, $this->mr);
|
||||
$repoData = array(array(
|
||||
'text' => $lang->mr->statusList['all'],
|
||||
'data-app' => $app->tab,
|
||||
'url' => createLink('mr', 'browse', "repoID=0&mode={$mode}¶m={$param}&objectID={$objectID}"),
|
||||
'active' => !$repoID
|
||||
));
|
||||
foreach($repoList as $repo)
|
||||
{
|
||||
if(!in_array($repo->SCM, $this->config->repo->gitServiceTypeList)) continue;
|
||||
|
||||
$repoData[] = array(
|
||||
'text' => $repo->name,
|
||||
'data-app' => $app->tab,
|
||||
'url' => createLink('mr', 'browse', "repoID={$repo->id}&mode={$mode}¶m={$param}&objectID={$objectID}"),
|
||||
'active' => $repo->id == $repoID
|
||||
);
|
||||
}
|
||||
|
||||
featureBar
|
||||
(
|
||||
set::current($mode != 'status' ? $mode : $param),
|
||||
set::linkParams("repoID={$repoID}&mode=status¶m={key}&objectID={$objectID}"),
|
||||
count($repoPairs) > 1 ? to::leading(
|
||||
dropdown
|
||||
(
|
||||
btn(setClass('ghost'), zget($repoPairs, $repoID, $lang->mr->statusList['all'])),
|
||||
set::items($repoData),
|
||||
set::placement('bottom-end')
|
||||
)
|
||||
) : null
|
||||
set::linkParams("repoID={$repoID}&mode=status¶m={key}&objectID={$objectID}")
|
||||
);
|
||||
|
||||
toolBar
|
||||
|
||||
@@ -294,7 +294,7 @@ panel
|
||||
|
||||
div
|
||||
(
|
||||
setClass('flex justify-center items-center pt-6'),
|
||||
setClass('detail-actions center sticky mt-4 bottom-4 z-10'),
|
||||
floatToolbar
|
||||
(
|
||||
set::object($MR),
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
#mainContent .tab-pane li {height: 2rem; line-height: 2rem; cursor: pointer;}
|
||||
#mainContent .tab-pane li.active {background-color: var(--color-gray-100);}
|
||||
#mainContent .tab-pane li {color: rgba(var(--color-black-rgb),var(--tw-text-opacity));}
|
||||
#mainContent .tab-pane li.active {font-weight: 600; color: rgba(var(--color-primary-500-rgb),var(--tw-text-opacity));}
|
||||
#mainContent .tab-pane li:hover {color: rgba(var(--color-primary-500-rgb),var(--tw-text-opacity));}
|
||||
#manageContacts .tabs > .nav-tabs {margin-top: 1rem;}
|
||||
#contactTab .listitem {color: inherit}
|
||||
#contactTab .listitem.selected {color: var(--color-primary-500); font-weight: bold;}
|
||||
|
||||
#contactPanel .form-row .form-group {padding-left: 70px;}
|
||||
#contactPanel .form-row .form-group .form-label {padding-left: 0; justify-content: start; width: 80px;}
|
||||
#contactPanel .form-actions {margin-top: 0;}
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
function createContact()
|
||||
{
|
||||
$('#contactTab').find('.contact').removeClass('active');
|
||||
const url = $.createLink('my', 'manageContacts');
|
||||
loadPage(url, '#contactPanel');
|
||||
}
|
||||
|
||||
function getContact(event)
|
||||
{
|
||||
$('#contactTab').find('.contact').removeClass('active');
|
||||
const $li = $(event.target).addClass('active');
|
||||
const listID = $li.data('id');
|
||||
const url = $.createLink('my', 'manageContacts', 'listID=' + listID);
|
||||
loadPage(url, '#contactPanel');
|
||||
}
|
||||
@@ -12,27 +12,20 @@ namespace zin;
|
||||
|
||||
$listID = isset($list->id) ? $list->id : 0;
|
||||
|
||||
$myContactList = array();
|
||||
$publicContactList = array();
|
||||
$myContactList = array();
|
||||
$publicContactList = array();
|
||||
$isActivePublicList = false;
|
||||
foreach($lists as $contactList)
|
||||
{
|
||||
$selected = $listID == $contactList->id;
|
||||
if($contactList->account == $app->user->account)
|
||||
{
|
||||
$myContactList[] = li
|
||||
(
|
||||
setClass('contact ellipsis pl-2 ' . ($listID == $contactList->id ? 'active' : '')),
|
||||
set('data-id', $contactList->id),
|
||||
$contactList->listName
|
||||
);
|
||||
$myContactList[] = array('text' => $contactList->listName, 'url' => createLink('my', 'manageContacts', "listID=$contactList->id"), 'selected' => $selected);
|
||||
}
|
||||
else if($contactList->public)
|
||||
{
|
||||
$publicContactList[] = li
|
||||
(
|
||||
setClass('contact ellipsis pl-2'),
|
||||
set('data-id', $contactList->id),
|
||||
$contactList->listName
|
||||
);
|
||||
$publicContactList[] = array('text' => $contactList->listName, 'url' => createLink('my', 'manageContacts', "listID=$contactList->id"), 'selected' => $selected);
|
||||
if($selected) $isActivePublicList = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,63 +35,49 @@ if(!empty($list->userList))
|
||||
foreach(explode(',', $list->userList) as $account) $userList[] = zget($users, $account);
|
||||
}
|
||||
|
||||
panel
|
||||
div
|
||||
(
|
||||
set::shadow(false),
|
||||
setClass('panel-form px-4 mx-auto size-lg'),
|
||||
on::click('#createContact', 'createContact'),
|
||||
on::click('.contact', 'getContact'),
|
||||
setClass('canvas shadow ring rounded mx-auto'),
|
||||
style::maxWidth(1200),
|
||||
div
|
||||
(
|
||||
setID('manageContacts'),
|
||||
setClass('w-full flex'),
|
||||
setClass('row'),
|
||||
cell
|
||||
(
|
||||
set::width('180px'),
|
||||
setClass('border-r overflow-hidden'),
|
||||
div
|
||||
setClass('col flex-none p-4 gap-3 w-48 items-stretch'),
|
||||
div(setClass('text-gray'), $lang->my->contactList),
|
||||
btn
|
||||
(
|
||||
setClass('border-b py-3 pr-4'),
|
||||
div(span(setClass('text-gray'), $lang->my->contactList)),
|
||||
div
|
||||
(
|
||||
setClass('pt-3'),
|
||||
a
|
||||
(
|
||||
setID('createContact'),
|
||||
setClass('btn primary-pale bd-primary w-full'),
|
||||
icon('plus'),
|
||||
$lang->my->createContacts
|
||||
)
|
||||
)
|
||||
set::type('primary-pale'),
|
||||
set::icon('plus'),
|
||||
set::url('my', 'manageContacts'),
|
||||
setData('load', '#contactPanel'),
|
||||
setClass('w-full'),
|
||||
$lang->my->createContacts
|
||||
),
|
||||
tabs
|
||||
(
|
||||
setID('contactTab'),
|
||||
setClass('pr-4'),
|
||||
tabPane
|
||||
(
|
||||
set::key('my'),
|
||||
set::title($lang->my->myContact),
|
||||
set::active(true),
|
||||
ul
|
||||
(
|
||||
setClass('pl-0'),
|
||||
$myContactList
|
||||
)
|
||||
set::active(!$isActivePublicList),
|
||||
simpleList(set::items($myContactList)),
|
||||
),
|
||||
tabPane
|
||||
(
|
||||
set::key('public'),
|
||||
set::title($lang->my->publicContact),
|
||||
ul($publicContactList)
|
||||
set::active($isActivePublicList),
|
||||
simpleList(set::items($publicContactList)),
|
||||
)
|
||||
)
|
||||
),
|
||||
divider(),
|
||||
cell
|
||||
(
|
||||
setID('contactPanel'),
|
||||
setClass('flex-1 px-8'),
|
||||
setClass('flex-1 px-8 pb-8'),
|
||||
div
|
||||
(
|
||||
set('class', 'panel-title text-lg flex w-full py-6'),
|
||||
@@ -120,6 +99,7 @@ panel
|
||||
($mode == 'create' || $mode == 'edit') ? form
|
||||
(
|
||||
set::actions(array()),
|
||||
$listID ? null : on::init()->removeClass('#contactTab .selected', 'selected'),
|
||||
formRow
|
||||
(
|
||||
formGroup
|
||||
@@ -196,5 +176,3 @@ panel
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
render();
|
||||
|
||||
@@ -79,7 +79,7 @@ sidebar
|
||||
$this->config->edition == 'open' ? div
|
||||
(
|
||||
set::width(240),
|
||||
setClass('bg-canvas px-4 py-2 module-menu shadow'),
|
||||
setClass('bg-canvas px-4 py-2 module-menu'),
|
||||
html(empty($config->isINT) ? $lang->bizVersion : $lang->bizVersionINT)
|
||||
) : null
|
||||
)
|
||||
|
||||
@@ -67,10 +67,9 @@ class pivotZen extends pivot
|
||||
if($this->config->edition == 'open' && $group->grade == 1) continue;
|
||||
|
||||
$pivots = $this->pivot->getAllPivotByGroupID($group->id);
|
||||
|
||||
if(empty($group->collector) && empty($pivots)) continue;
|
||||
|
||||
$menus[] = (object)array('id' => $group->id, 'parent' => 0, 'name' => $group->name);
|
||||
if($group->grade > 1) $menus[] = (object)array('id' => $group->id, 'parent' => 0, 'name' => $group->name);
|
||||
|
||||
if($pivots) $pivots = $this->pivot->processPivot($pivots, false);
|
||||
|
||||
|
||||
@@ -663,7 +663,7 @@ class product extends control
|
||||
}
|
||||
|
||||
$this->view->title = $this->lang->product->manageLine;
|
||||
$this->view->programs = $this->loadModel('program')->getTopPairs('withDeleted');
|
||||
$this->view->programs = array(0 => $this->lang->null) + $this->loadModel('program')->getTopPairs('withDeleted');
|
||||
$this->view->lines = $this->product->getLines();
|
||||
$this->view->fields = $this->config->product->form->manageLine;
|
||||
$this->display();
|
||||
@@ -1002,7 +1002,7 @@ class product extends control
|
||||
public function ajaxGetLine(int $programID, int $productID = 0)
|
||||
{
|
||||
$lines = array();
|
||||
if(empty($productID) or $programID) $lines = $this->product->getLinePairs($programID);
|
||||
if(empty($productID) || $programID) $lines = $this->product->getLinePairs($programID, true);
|
||||
|
||||
$items = array();
|
||||
foreach($lines as $lineID => $lineName) $items[] = array('text' => $lineName, 'value' => $lineID);
|
||||
|
||||
@@ -325,7 +325,7 @@ class productTao extends productModel
|
||||
*/
|
||||
protected function createLine(int $programID, string $lineName): int|false
|
||||
{
|
||||
if($programID <= 0) return false;
|
||||
if($programID < 0) return false;
|
||||
if(empty($lineName)) return false;
|
||||
|
||||
$line = new stdClass();
|
||||
|
||||
@@ -172,8 +172,8 @@ $fnBuildLinkStoryButton = function() use($lang, $app, $product, $projectHasProdu
|
||||
);
|
||||
|
||||
}
|
||||
if($canLinkStory && !$canlinkPlanStory) return item(set($linkItem + array('class' => 'btn primary link-story-btn', 'icon' => 'plus')));
|
||||
if($canlinkPlanStory && !$canLinkStory) return item(set($linkPlanItem + array('class' => 'btn primary', 'icon' => 'plus')));
|
||||
if($canLinkStory && !$canlinkPlanStory) return item(set($linkItem + array('class' => 'btn primary link-story-btn', 'icon' => 'link')));
|
||||
if($canlinkPlanStory && !$canLinkStory) return item(set($linkPlanItem + array('class' => 'btn primary', 'icon' => 'link')));
|
||||
};
|
||||
|
||||
/* DataTable columns. */
|
||||
|
||||
@@ -74,7 +74,7 @@ foreach($lines as $line)
|
||||
(
|
||||
set::width('1/2'),
|
||||
set::className('ml-4'),
|
||||
set::control(array('control' => 'picker', 'id' => "programs_id{$line->id}")),
|
||||
set::control(array('control' => 'picker', 'id' => "programs_id{$line->id}", 'required' => true)),
|
||||
set::name("programs[id$line->id]"),
|
||||
set::items($programs),
|
||||
set::value($line->root),
|
||||
@@ -103,9 +103,10 @@ for($i = 0; $i <= 5; $i ++)
|
||||
(
|
||||
set::width('1/2'),
|
||||
set::className('ml-4'),
|
||||
set::control(array('control' => 'picker', 'id' => "programs_{$i}")),
|
||||
set::control(array('control' => 'picker', 'id' => "programs_{$i}", 'required'=> true)),
|
||||
set::name("programs[$i]"),
|
||||
set::items($programs)
|
||||
set::items($programs),
|
||||
set::value('0')
|
||||
) : null
|
||||
),
|
||||
cell
|
||||
|
||||
@@ -639,11 +639,6 @@ class productZen extends product
|
||||
foreach($data->modules as $id => $name)
|
||||
{
|
||||
if(empty($name)) continue;
|
||||
if(in_array($this->config->systemMode, array('ALM', 'PLM')) and empty($data->programs[$id]))
|
||||
{
|
||||
dao::$errors["programs[{$id}]"] = $this->lang->product->programEmpty;
|
||||
return false;
|
||||
}
|
||||
|
||||
$programID = $data->programs[$id];
|
||||
if(!isset($lines[$programID])) $lines[$programID] = array();
|
||||
|
||||
@@ -235,7 +235,7 @@ window.getCol = function(col)
|
||||
|
||||
window.getItem = function(info)
|
||||
{
|
||||
if(info.item.delay)
|
||||
if(info.item.delay && ['wait', 'doing'].includes(info.item.status))
|
||||
{
|
||||
info.item.suffix = productplanLang.expired;
|
||||
info.item.suffixClass = 'label danger rounded-xl' + (info.item.status == 'doing' ? ' mr-8' : '');
|
||||
|
||||
@@ -222,8 +222,8 @@ class projectModel extends model
|
||||
$this->app->loadClass('pager', true);
|
||||
foreach($projects as $projectID => $project)
|
||||
{
|
||||
$orderBy = $project->model == 'waterfall' ? 'id_asc' : 'id_desc';
|
||||
$pager = $project->model == 'waterfall' ? null : new pager(0, 1, 1);
|
||||
$orderBy = in_array($project->model, array('waterfall', 'ipd')) ? 'id_asc' : 'id_desc';
|
||||
$pager = in_array($project->model, array('waterfall', 'ipd')) ? null : new pager(0, 1, 1);
|
||||
$project->executions = $this->loadModel('execution')->getStatData($projectID, 'undone', 0, 0, false, '', $orderBy, $pager);
|
||||
$project->teamCount = isset($teamCount[$projectID]) ? $teamCount[$projectID] : 0;
|
||||
$project->estimate = isset($estimates[$projectID]) ? round($estimates[$projectID]->estimate, 2) : 0;
|
||||
@@ -925,10 +925,11 @@ class projectModel extends model
|
||||
* @param string $model all|scrum|waterfall|kanban
|
||||
* @param string $param noclosed
|
||||
* @param int $projectID
|
||||
* @param bool $pairs
|
||||
* @access public
|
||||
* @return array array(projectID => projectName, ...)
|
||||
*/
|
||||
public function getPairsByModel(string $model = 'all', string $param = '', int $projectID = 0): array
|
||||
public function getPairsByModel(string $model = 'all', string $param = '', int $projectID = 0, bool $pairs = true): array
|
||||
{
|
||||
if(commonModel::isTutorialMode()) return $this->loadModel('tutorial')->getProjectPairs();
|
||||
|
||||
@@ -972,7 +973,7 @@ class projectModel extends model
|
||||
$projectPairs = array();
|
||||
foreach($allProjects as $programID => $projects)
|
||||
{
|
||||
foreach($projects as $project) $projectPairs[$project->id] = $project->name;
|
||||
foreach($projects as $project) $projectPairs[$project->id] = $pairs ? $project->name : $project;
|
||||
}
|
||||
return $projectPairs;
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ formGridPanel
|
||||
btn
|
||||
(
|
||||
set::icon('copy'),
|
||||
setClass('primary-ghost size-md'),
|
||||
setClass('primary-ghost size-md copy-project-btn'),
|
||||
toggle::modal(array('target' => '#copyProjectModal', 'destoryOnHide' => true, 'size' => 'sm')),
|
||||
$lang->project->copy
|
||||
),
|
||||
@@ -122,17 +122,17 @@ JS
|
||||
$copyProjectsBox = array();
|
||||
if(!empty($copyProjects))
|
||||
{
|
||||
foreach($copyProjects as $id => $name)
|
||||
foreach($copyProjects as $id => $project)
|
||||
{
|
||||
$copyProjectsBox[] = btn
|
||||
(
|
||||
setClass('project-block justify-start'),
|
||||
setClass($copyProjectID == $id ? 'primary-outline' : ''),
|
||||
set('data-id', $id),
|
||||
set('data-pinyin', zget($copyPinyinList, $name, '')),
|
||||
icon(setClass('text-gray'), !empty($model) ? ($model == 'scrum' ? 'sprint' : $model) : $lang->icons['project']),
|
||||
set('data-pinyin', zget($copyPinyinList, $project->name, '')),
|
||||
icon(setClass('text-gray'), !empty($project->model) ? ($project->model == 'scrum' ? 'sprint' : $project->model) : $lang->icons['project']),
|
||||
on::click($toggleActiveProject),
|
||||
span($name, set::title($name), setClass('text-left'))
|
||||
span($project->name, set::title($project->name), setClass('text-left'))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -316,6 +316,10 @@ class projectZen extends project
|
||||
}
|
||||
}
|
||||
|
||||
/* Get copy projects. */
|
||||
$copyProjects = $this->project->getPairsByModel($model, '', 0, false);
|
||||
$copyProjectPairs = array_combine(array_keys($copyProjects), array_column($copyProjects, 'name'));
|
||||
|
||||
$this->view->title = $this->lang->project->create;
|
||||
$this->view->gobackLink = (isset($output['from']) && $output['from'] == 'global') ? $this->createLink('project', 'browse') : '';
|
||||
$this->view->model = $model;
|
||||
@@ -326,8 +330,8 @@ class projectZen extends project
|
||||
$this->view->branchID = isset($output['branchID']) ? $output['branchID'] : 0;
|
||||
$this->view->allProducts = $allProducts;
|
||||
$this->view->multiBranchProducts = $this->product->getMultiBranchPairs((int)$topProgramID);
|
||||
$this->view->copyProjects = $this->project->getPairsByModel($model);
|
||||
$this->view->copyPinyinList = common::convert2Pinyin($this->view->copyProjects);
|
||||
$this->view->copyProjects = $copyProjects;
|
||||
$this->view->copyPinyinList = common::convert2Pinyin($copyProjectPairs);
|
||||
$this->view->copyProjectID = $copyProjectID;
|
||||
$this->view->parentProgram = $parentProgram;
|
||||
$this->view->programList = $this->program->getParentPairs();
|
||||
|
||||
@@ -128,6 +128,7 @@ function onScmChange()
|
||||
const $hostPicker = $('#serviceHost').zui('picker');
|
||||
$hostPicker.render({items: data});
|
||||
$hostPicker.$.clear();
|
||||
onHostChange();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,8 @@ class screen extends control
|
||||
*/
|
||||
public function browse(int $dimensionID = 0)
|
||||
{
|
||||
$this->checkShowGuide();
|
||||
//$this->checkShowGuide();
|
||||
$this->view->showGuide = false;
|
||||
|
||||
$dimensionID = $this->loadModel('dimension')->getDimension($dimensionID);
|
||||
|
||||
|
||||
@@ -3814,7 +3814,6 @@ class storyModel extends model
|
||||
$storyLang->legendLinkStories = str_replace($SRCommon, $URCommon, $storyLang->legendLinkStories);
|
||||
$storyLang->legendChildStories = str_replace($SRCommon, $URCommon, $storyLang->legendChildStories);
|
||||
$storyLang->legendSpec = str_replace($SRCommon, $URCommon, $storyLang->legendSpec);
|
||||
$storyLang->unlinkStory = str_replace($SRCommon, $URCommon, $storyLang->unlinkStory);
|
||||
|
||||
$storyLang->notice->closed = str_replace($SRCommon, $URCommon, $storyLang->notice->closed);
|
||||
$storyLang->notice->reviewerNotEmpty = str_replace($SRCommon, $URCommon, $storyLang->notice->reviewerNotEmpty);
|
||||
|
||||
@@ -54,7 +54,9 @@ function toggleZeroTaskStory()
|
||||
const $storyTd = $(this);
|
||||
$.getJSON(getStoryLink, function(stories)
|
||||
{
|
||||
$storyTd.find('[name^=story]').zui('picker').render({items: stories});
|
||||
const $storyPicker = $storyTd.find('[name^=story]').zui('picker');
|
||||
$storyPicker.render({items: stories});
|
||||
$storyPicker.$.setValue(0);
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -87,7 +89,7 @@ function setStoryRelated(event)
|
||||
{
|
||||
const storyInfo = data['storyInfo'];
|
||||
|
||||
$module.zui('picker').$.setValue(parseInt(storyInfo.moduleID));
|
||||
$module.zui('picker').$.setValue(parseInt(storyInfo.moduleID), true);
|
||||
$storyEstimate.val(storyInfo.estimate);
|
||||
$storyPri.val(storyInfo.pri);
|
||||
$storyDesc.val(storyInfo.spec);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#start {padding: 40px; text-align: center; color: #fff;}
|
||||
#startModal {color: #fff;}
|
||||
#start {padding: 40px; text-align: center;}
|
||||
.start-icon {position: relative; width: 140px; height: 140px; margin: 0 auto; line-height: 140px;}
|
||||
.start-icon .icon1{font-size: 140px; color: rgba(0,0,0,.1); text-shadow: 0 1px 7px rgb(0,0,0,.1); animation: -spin 15s linear infinite}
|
||||
.start-icon .icon2{font-size: 56px; position: absolute; top: 35px; left: 42px; color: #EBF2F9; z-index: 10; width: 70px; height: 70px; text-align: center; line-height: 70px; text-shadow: 0 1px 3px rgb(0,0,0,.15);}
|
||||
@@ -7,4 +8,4 @@ h1{font-size: 24px;}
|
||||
.btn-start-now{min-width: 120px; height: 42px;}
|
||||
.btn-lg{padding: 11px 16px; font-size: 14px; line-height: 18px; border-radius: 4px;}
|
||||
.btn-info{color: #2e7fff; background-color: #e6f0ff; border-color: transparent;}
|
||||
.tutorial-start .modal-dialog .modal-content .modal-body {padding: 0; margin-top: 0;}
|
||||
#startModal .modal-body {padding: 0; margin-top: 0;}
|
||||
|
||||
@@ -10,6 +10,8 @@ declare(strict_types=1);
|
||||
*/
|
||||
namespace zin;
|
||||
|
||||
setID('startModal');
|
||||
|
||||
div
|
||||
(
|
||||
setID('start'),
|
||||
|
||||
@@ -1 +1 @@
|
||||
export{M as MonacoEditor,Z as ZenEditor}from"./p-38bd6d84.js";import"./p-1f29e0e0.js";
|
||||
export{M as MonacoEditor,Z as ZenEditor}from"./p-898ed1c1.js";import"./p-b9d115dd.js";
|
||||
@@ -1 +1 @@
|
||||
import{p as e,b as o}from"./p-1f29e0e0.js";export{s as setNonce}from"./p-1f29e0e0.js";import"./p-49a055b9.js";(()=>{const o=import.meta.url,r={};return""!==o&&(r.resourcesUrl=new URL(".",o).href),e(r)})().then((e=>o([["p-a72657f3",[[65,"zen-editor",{name:[1],uploadUrl:[1,"upload-url"],placeholder:[1],fullscreenable:[4],resizable:[4],exposeEditor:[4,"expose-editor"],size:[1],hideMenubar:[4,"hide-menubar"],menubarMode:[1,"menubar-mode"],bubbleMenu:[4,"bubble-menu"],locale:[1],css:[1],collaborative:[4],hocuspocus:[1],docName:[1,"doc-name"],username:[1],userColor:[1,"user-color"],value:[1025],editor:[32],isFullscreen:[32],rendered:[32],setHTML:[64],getHTML:[64],getText:[64],focusEditor:[64],blurEditor:[64]},null,{css:["onCSSChange"]}],[1,"zen-editor-core",{name:[1],uploadUrl:[1,"upload-url"],placeholder:[1],initialContent:[1,"initial-content"],resizable:[4],exposeEditor:[4,"expose-editor"],size:[1],hideMenubar:[4,"hide-menubar"],menubarMode:[1,"menubar-mode"],extraMenubarItems:[1,"extra-menubar-items"],bubbleMenu:[4,"bubble-menu"],locale:[1],styles:[16],collaborative:[4],hocuspocus:[1],docName:[1,"doc-name"],username:[1],userColor:[1,"user-color"],updateInputValue:[16],fullscreenable:[4],toggleFullscreen:[16],isFullscreen:[4,"is-fullscreen"],value:[1],editor:[32],forceUpdateCounter:[32],isMonaco:[32]},null,{locale:["onLocaleChanage"]}],[2,"zen-editor-bubble-menu",{menuProps:[16],editor:[16],disabled:[4],element:[32]}],[1,"zen-editor-menubar",{editor:[16],menubarMode:[2,"menubar-mode"],extraMenubarItems:[1,"extra-menubar-items"],forceUpdateCounter:[2,"force-update-counter"],states:[8],toggleMonaco:[16],toggleFullscreen:[16],styles:[16]}],[0,"monaco-editor",{options:[8],initialValue:[1,"initial-value"],tiptapEditor:[16],updateInputValue:[16],setFocus:[64],getValue:[64]},null,{options:["onOptionsChange"]}],[1,"zen-editor-content",{editor:[16],styles:[16]},[[2,"click","handleClick"]]],[0,"zen-editor-menu-item",{itemProps:[8,"item-props"],menubarMode:[2,"menubar-mode"],styles:[16]}]]],["p-5330989c",[[0,"zen-editor-floating-menu",{menuProps:[16],editor:[16],element:[32]}]]],["p-1e3048b8",[[0,"zen-editor-footer",{editor:[16],forceUpdateCounter:[2,"force-update-counter"],toggleFullscreen:[16],showCharCount:[4,"show-char-count"]}]]]],e)));
|
||||
import{p as e,b as o}from"./p-b9d115dd.js";export{s as setNonce}from"./p-b9d115dd.js";import{g as r}from"./p-90d6b5f8.js";(()=>{const o=import.meta.url,r={};return""!==o&&(r.resourcesUrl=new URL(".",o).href),e(r)})().then((async e=>(await r(),o([["p-5306bec1",[[65,"zen-editor",{name:[1],readonly:[1028],uploadUrl:[1,"upload-url"],placeholder:[1],fullscreenable:[4],resizable:[4],exposeEditor:[4,"expose-editor"],size:[1],hideUI:[4,"hide-ui"],hideMenubar:[4,"hide-menubar"],menubarMode:[1,"menubar-mode"],bubbleMenu:[4,"bubble-menu"],preferHardBreak:[4,"prefer-hard-break"],locale:[1],css:[1],collaborative:[4],hocuspocus:[1],docName:[1,"doc-name"],username:[1],userColor:[1,"user-color"],value:[1025],editor:[32],isFullscreen:[32],rendered:[32],setHTML:[64],insertHTML:[64],getHTML:[64],getText:[64],focusEditor:[64],blurEditor:[64],setReadonly:[64]},null,{css:["onCSSChange"]}],[1,"zen-editor-core",{name:[1],readonly:[4],uploadUrl:[1,"upload-url"],placeholder:[1],initialContent:[1,"initial-content"],resizable:[4],exposeEditor:[4,"expose-editor"],size:[1],hideUI:[4,"hide-ui"],hideMenubar:[4,"hide-menubar"],menubarMode:[1,"menubar-mode"],extraMenubarItems:[1,"extra-menubar-items"],bubbleMenu:[4,"bubble-menu"],preferHardBreak:[4,"prefer-hard-break"],locale:[1],styles:[16],collaborative:[4],hocuspocus:[1],docName:[1,"doc-name"],username:[1],userColor:[1,"user-color"],updateInputValue:[16],fullscreenable:[4],toggleFullscreen:[16],isFullscreen:[4,"is-fullscreen"],value:[1],editor:[32],forceUpdateCounter:[32],isMonaco:[32]},null,{locale:["onLocaleChanage"]}],[2,"zen-editor-bubble-menu",{menuProps:[16],editor:[16],disabled:[4],element:[32]}],[1,"zen-editor-menubar",{editor:[16],menubarMode:[2,"menubar-mode"],extraMenubarItems:[1,"extra-menubar-items"],forceUpdateCounter:[2,"force-update-counter"],states:[8],toggleMonaco:[16],toggleFullscreen:[16],styles:[16]}],[0,"monaco-editor",{options:[8],initialValue:[1,"initial-value"],tiptapEditor:[16],updateInputValue:[16],setFocus:[64],getValue:[64]},null,{options:["onOptionsChange"]}],[1,"zen-editor-content",{editor:[16],styles:[16]},[[2,"click","handleClick"]]],[0,"zen-editor-menu-item",{itemProps:[8,"item-props"],menubarMode:[2,"menubar-mode"],styles:[16]}]]],["p-de75d67e",[[0,"zen-editor-floating-menu",{menuProps:[16],editor:[16],element:[32]}]]],["p-cd71f736",[[0,"zen-editor-footer",{editor:[16],forceUpdateCounter:[2,"force-update-counter"],toggleFullscreen:[16],showCharCount:[4,"show-char-count"]}]]]],e))));
|
||||
+3
-2
@@ -630,19 +630,20 @@
|
||||
{
|
||||
$page = $('<div/>')
|
||||
.append($('<iframe />').attr({name: `app-${currentCode}-old`, frameborder: 'no', scrolling: 'auto', style: 'width:100%;height:100%;'}))
|
||||
.attr({id: 'oldPage', class: 'canvas fixed w-full h-full top-0 left-0 load-indicator', style: 'z-index:100;'})
|
||||
.attr({id: 'oldPage', class: 'canvas fixed w-full h-full top-0 left-0', style: 'z-index:100;'})
|
||||
.insertAfter('body')
|
||||
.on('oldPageLoad.app', () =>
|
||||
{
|
||||
const frame = window.frameElement;
|
||||
frame.classList.remove('loading');
|
||||
frame.classList.add('in');
|
||||
$page.find('iframe').removeClass('invisible');
|
||||
$page.removeClass('loading').find('iframe').addClass('in');
|
||||
$(document).trigger('pageload.app');
|
||||
});
|
||||
}
|
||||
if($page.hasClass('hidden')) $page.addClass('loading').removeClass('hidden');
|
||||
const $iframe = $page.find('iframe').removeClass('in');
|
||||
const $iframe = $page.find('iframe').removeClass('in').addClass('invisible');
|
||||
if($iframe.attr('src') === url) $iframe[0].contentWindow.location.reload();
|
||||
else $iframe.attr('src', url);
|
||||
currentAppUrl = url;
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 153 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 150 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 147 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 136 KiB |
File diff suppressed because one or more lines are too long
@@ -9,6 +9,11 @@
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
|
||||
body {font-family: -apple-system,Noto Sans,Helvetica Neue,Helvetica,Nimbus Sans L,Arial,Liberation Sans,PingFang SC,Hiragino Sans GB,Noto Sans CJK SC,Source Han Sans SC,Source Han Sans CN,Microsoft YaHei,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,WenQuanYi Zen Hei Sharp,sans-serif;}
|
||||
|
||||
.container {max-width: 1720px!important}
|
||||
@media (min-width: 1720px) {.container {max-width:1720px}}
|
||||
|
||||
.mt-md {margin-top: 100px!important;}
|
||||
/* Finish task #5068*/
|
||||
.main-table .table{cursor:pointer;}
|
||||
@@ -78,9 +83,18 @@ th.c-confirmed, th.c-confirm {text-align: center;}
|
||||
.confirmed, .confirm1 {color: #313C52;}
|
||||
.unconfirmed, .confirm0 {color: #9EA3B0;}
|
||||
|
||||
#navbar .nav>li.active>a {background-color: transparent;}
|
||||
#navbar .nav>li.active>a:before {position: absolute; right: 10px; bottom: 8px!important; left: 10px; display: block; height: 2px; content: ' '; background-color: var(--color-primary); opacity: .9;}
|
||||
.theme-default #navbar .nav>li.active>a:before {background-color: #fff;}
|
||||
#navbar .nav>li>a {font-size: 14px; padding: 8px 12px 10px;}
|
||||
#navbar .nav>li>a:hover {background-color: rgba(0,0,0,.04);}
|
||||
#navbar .nav>li.active>a {background-color: rgba(0,0,0,.08);}
|
||||
#mainHeader {height: 48px;}
|
||||
.header-btn {padding: 7px 0;}
|
||||
.header-btn > .btn {display: inline-flex; align-items: center; gap: 6px; padding: 0 6px!important; height: 32px;}
|
||||
.header-btn+.header-btn:before {top: 15px; left: -14px;}
|
||||
.header-btn+.header-btn > .btn {padding-left: 5px!important;}
|
||||
#heading {left: 9px;}
|
||||
#toolbar {right: 9px;}
|
||||
@media (min-width: 1400px){#heading {left: 33px}#toolbar {right: 34px}}
|
||||
#userNav>li>a {padding-top: 9px;}
|
||||
|
||||
#userNav > li {height: 48px; display: flex; align-items: center; justify-content: center;}
|
||||
#userNav > li + li {margin-left: 8px;}
|
||||
@@ -91,6 +105,7 @@ th.c-confirmed, th.c-confirm {text-align: center;}
|
||||
#userNav>li.open>a:before, #userNav>li>a:hover:before {position: absolute; bottom: 0px; left: calc(50% - 5px); width: 0; height: 0; content: ' '; border-color: transparent transparent #fff transparent; border-style: solid; border-width: 0 6px 6px 6px;}
|
||||
#userNav .dropdown-menu {z-index: 2000;}
|
||||
#userNav .dropdown-menu:hover + .dropdown-toggle:before {position: absolute; bottom: 0px; left: calc(50% - 5px); width: 0; height: 0; content: ' '; border-color: transparent transparent #fff transparent; border-style: solid; border-width: 0 6px 6px 6px;}
|
||||
#userNav>li:hover>a,#userNav>li>a:hover {background: none;}
|
||||
#userNav .dropdown-menu, #userNav .create-list {margin-right: -15px !important; border-top: 0px;}
|
||||
#userNav .dropdown-menu .dropdown-submenu>ul {margin-right: 0px !important;}
|
||||
#userNav .dropdown-menu .dropdown-submenu>ul::before {position: absolute; content: ''; top: -60px; bottom: -40px; left: -40px; right: 0;}
|
||||
@@ -110,6 +125,12 @@ th.c-confirmed, th.c-confirm {text-align: center;}
|
||||
#headerActions .dropdown-menu:before, #headerActions .dropdown-menu:hover:before {position: absolute; top: -9px; right: 50%; width: 0; height: 0; content: ' '; border-color: transparent transparent #fff transparent; border-style: solid; border-width: 0 10px 10px 10px;}
|
||||
[lang^='zh'] #headerActions {right: 235px;}
|
||||
|
||||
#mainMenu>.btn-toobar .btn-active-text, #mainMenu>.btn-toolBar .btn-active-text, #mainMenu>.btn-toolbar .btn-active-text {color: var(--color-fore); background-color: var(--color-pale);}
|
||||
.btn-active-text .text {color: inherit}
|
||||
#mainMenu>.btn-toolbar {height: 32px; display: flex; align-items: center;}
|
||||
#mainMenu>.btn-toolbar .btn {padding: 0 8px; height: 28px; display: inline-flex; gap: 4px; align-items: center;}
|
||||
#mainMenu>.btn-toolbar .label-badge {border-radius: 4px;}
|
||||
|
||||
.icon-size-width:before {content: "\e9c5"; transform: rotate(90deg); -ms-transform: rotate(90deg); -moz-transform: rotate(90deg); -webkit-transform: rotate(90deg); -o-transform: rotate(90deg);}
|
||||
.checkbox-primary > label{overflow: hidden;}
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user