This commit is contained in:
tengfei
2017-12-20 16:13:58 +08:00
46 changed files with 751 additions and 119 deletions
+355
View File
@@ -0,0 +1,355 @@
SET NAMES utf8;
SET time_zone = '+00:00';
SET foreign_key_checks = 0;
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
INSERT INTO `zt_action` (`id`, `objectType`, `objectID`, `product`, `project`, `actor`, `action`, `date`, `comment`, `extra`, `read`) VALUES
(1, 'user', 1, ',0,', 0, 'admin', 'login', '2017-12-11 18:52:19', '', '', '0'),
(2, 'user', 1, ',0,', 0, 'admin', 'logout', '2017-12-12 14:43:47', '', '', '0'),
(3, 'user', 2, ',0,', 0, 'thePO', 'login', '2017-12-12 14:43:59', '', '', '0'),
(4, 'product', 1, ',1,', 0, 'thePO', 'opened', '2017-12-12 14:44:57', '', '', '0'),
(5, 'productplan', 1, ',1,', 0, 'thePO', 'opened', '2017-12-12 14:48:38', '', '', '0'),
(6, 'productplan', 2, ',1,', 0, 'thePO', 'opened', '2017-12-12 14:49:38', '', '', '0'),
(7, 'productplan', 2, ',1,', 0, 'thePO', 'edited', '2017-12-12 14:50:13', '', '', '0'),
(8, 'productplan', 1, ',1,', 0, 'thePO', 'edited', '2017-12-12 14:51:01', '', '', '0'),
(9, 'story', 1, ',1,', 0, 'thePO', 'opened', '2017-12-12 14:58:30', '', '', '0'),
(10, 'story', 2, ',1,', 0, 'thePO', 'opened', '2017-12-12 14:58:30', '', '', '0'),
(11, 'story', 3, ',1,', 0, 'thePO', 'opened', '2017-12-12 14:58:30', '', '', '0'),
(12, 'story', 4, ',1,', 0, 'thePO', 'opened', '2017-12-12 14:58:30', '', '', '0'),
(13, 'story', 5, ',1,', 0, 'thePO', 'opened', '2017-12-12 14:58:30', '', '', '0'),
(14, 'story', 6, ',1,', 0, 'thePO', 'opened', '2017-12-12 14:58:30', '', '', '0'),
(15, 'story', 7, ',1,', 0, 'thePO', 'opened', '2017-12-12 14:58:30', '', '', '0'),
(16, 'story', 8, ',1,', 0, 'thePO', 'opened', '2017-12-12 14:58:30', '', '', '0'),
(17, 'project', 1, ',1,', 1, 'thePO', 'opened', '2017-12-12 15:01:14', '', '', '0'),
(18, 'story', 3, ',1,', 1, 'thePO', 'linked2project', '2017-12-12 15:02:18', '', '1', '0'),
(19, 'story', 2, ',1,', 1, 'thePO', 'linked2project', '2017-12-12 15:02:18', '', '1', '0'),
(20, 'story', 1, ',1,', 1, 'thePO', 'linked2project', '2017-12-12 15:02:18', '', '1', '0'),
(21, 'user', 2, ',0,', 0, 'thePO', 'logout', '2017-12-12 15:02:58', '', '', '0'),
(22, 'user', 3, ',0,', 0, 'pm1', 'login', '2017-12-12 15:03:09', '', '', '0'),
(23, 'task', 1, ',1,', 1, 'pm1', 'opened', '2017-12-12 15:05:06', '', '', '0'),
(24, 'task', 2, ',1,', 1, 'pm1', 'opened', '2017-12-12 15:05:06', '', '', '0'),
(25, 'task', 3, ',1,', 1, 'pm1', 'opened', '2017-12-12 15:05:06', '', '', '0'),
(26, 'task', 4, ',1,', 1, 'pm1', 'opened', '2017-12-12 15:05:06', '', '', '0'),
(27, 'task', 1, ',1,', 1, 'pm1', 'started', '2017-12-12 15:12:17', 'Start tp design and develop', '', '0'),
(28, 'task', 1, ',1,', 1, 'pm1', 'recordestimate', '2017-12-12 15:13:13', 'Finish UI design', '8', '0'),
(29, 'task', 2, ',1,', 1, 'pm1', 'started', '2017-12-12 15:13:25', 'Start<br />', '', '0'),
(30, 'task', 3, ',1,', 1, 'pm1', 'started', '2017-12-12 15:14:25', '', '', '0'),
(31, 'task', 3, ',1,', 1, 'pm1', 'recordestimate', '2017-12-12 15:14:47', 'Finish', '60', '0'),
(32, 'user', 3, ',0,', 0, 'pm1', 'logout', '2017-12-12 15:18:46', '', '', '0'),
(33, 'user', 1, ',0,', 0, 'admin', 'login', '2017-12-12 15:18:58', '', '', '0'),
(34, 'user', 10, ',0,', 0, 'admin', 'deleted', '2017-12-12 15:20:05', '', '1', '0'),
(35, 'user', 1, ',0,', 0, 'admin', 'logout', '2017-12-12 15:22:11', '', '', '0'),
(36, 'user', 12, ',0,', 0, 'theQS', 'login', '2017-12-12 15:22:36', '', '', '0'),
(37, 'user', 12, ',0,', 0, 'theQS', 'logout', '2017-12-12 15:22:48', '', '', '0'),
(38, 'user', 1, ',0,', 0, 'admin', 'login', '2017-12-12 15:23:02', '', '', '0'),
(39, 'user', 1, ',0,', 0, 'admin', 'logout', '2017-12-12 15:23:27', '', '', '0'),
(40, 'user', 11, ',0,', 0, 'qa1', 'login', '2017-12-12 15:23:34', '', '', '0'),
(41, 'build', 1, ',1,', 1, 'qa1', 'opened', '2017-12-12 15:25:13', '', '', '0'),
(42, 'bug', 1, ',1,', 1, 'qa1', 'opened', '2017-12-12 15:27:56', '', '', '0'),
(43, 'bug', 2, ',1,', 1, 'qa1', 'opened', '2017-12-12 15:30:32', '', '', '0'),
(44, 'user', 11, ',0,', 0, 'qa1', 'logout', '2017-12-12 15:32:26', '', '', '0'),
(45, 'user', 1, ',0,', 0, 'admin', 'login', '2017-12-12 15:32:41', '', '', '0'),
(46, 'project', 1, ',1,', 1, 'admin', 'started', '2017-12-12 15:32:54', '', '', '0'),
(47, 'product', 2, ',2,', 0, 'admin', 'opened', '2017-12-12 23:28:29', '', '', '0'),
(48, 'productplan', 3, ',2,', 0, 'admin', 'opened', '2017-12-12 23:31:59', '', '', '0'),
(49, 'productplan', 4, ',2,', 0, 'admin', 'opened', '2017-12-12 23:32:30', '', '', '0'),
(50, 'user', 1, ',0,', 0, 'admin', 'logout', '2017-12-12 23:33:01', '', '', '0'),
(51, 'user', 2, ',0,', 0, 'thePO', 'login', '2017-12-12 23:33:10', '', '', '0'),
(52, 'story', 9, ',2,', 0, 'thePO', 'opened', '2017-12-12 23:40:19', '', '', '0'),
(53, 'story', 10, ',2,', 0, 'thePO', 'opened', '2017-12-12 23:40:19', '', '', '0'),
(54, 'story', 11, ',2,', 0, 'thePO', 'opened', '2017-12-12 23:40:19', '', '', '0'),
(55, 'story', 12, ',2,', 0, 'thePO', 'opened', '2017-12-12 23:40:19', '', '', '0'),
(56, 'story', 13, ',2,', 0, 'thePO', 'opened', '2017-12-12 23:40:19', '', '', '0'),
(57, 'story', 14, ',2,', 0, 'thePO', 'opened', '2017-12-12 23:40:19', '', '', '0'),
(58, 'story', 15, ',2,', 0, 'thePO', 'opened', '2017-12-12 23:40:19', '', '', '0'),
(59, 'user', 2, ',0,', 0, 'thePO', 'logout', '2017-12-12 23:41:48', '', '', '0'),
(60, 'user', 3, ',0,', 0, 'pm1', 'login', '2017-12-12 23:41:58', '', '', '0'),
(61, 'project', 2, ',,', 2, 'pm1', 'opened', '2017-12-12 23:42:53', '', '', '0'),
(62, 'story', 14, ',2,', 2, 'pm1', 'linked2project', '2017-12-12 23:43:52', '', '2', '0'),
(63, 'story', 13, ',2,', 2, 'pm1', 'linked2project', '2017-12-12 23:43:52', '', '2', '0'),
(64, 'story', 12, ',2,', 2, 'pm1', 'linked2project', '2017-12-12 23:43:52', '', '2', '0'),
(65, 'story', 11, ',2,', 2, 'pm1', 'linked2project', '2017-12-12 23:43:52', '', '2', '0'),
(66, 'story', 10, ',2,', 2, 'pm1', 'linked2project', '2017-12-12 23:43:52', '', '2', '0'),
(67, 'story', 9, ',2,', 2, 'pm1', 'linked2project', '2017-12-12 23:43:52', '', '2', '0'),
(68, 'task', 5, ',2,', 2, 'pm1', 'opened', '2017-12-12 23:45:14', '', '', '0'),
(69, 'task', 6, ',2,', 2, 'pm1', 'opened', '2017-12-12 23:45:14', '', '', '0'),
(70, 'task', 7, ',2,', 2, 'pm1', 'opened', '2017-12-12 23:45:14', '', '', '0'),
(71, 'task', 8, ',2,', 2, 'pm1', 'opened', '2017-12-12 23:45:14', '', '', '0'),
(72, 'task', 9, ',2,', 2, 'pm1', 'opened', '2017-12-12 23:45:14', '', '', '0'),
(73, 'task', 10, ',2,', 2, 'pm1', 'opened', '2017-12-12 23:45:14', '', '', '0'),
(74, 'task', 8, ',2,', 2, 'pm1', 'started', '2017-12-12 23:45:36', '', '', '0'),
(75, 'task', 7, ',2,', 2, 'pm1', 'recordestimate', '2017-12-12 23:45:53', '', '8', '0'),
(76, 'user', 3, ',0,', 0, 'pm1', 'logout', '2017-12-12 23:46:28', '', '', '0'),
(77, 'user', 5, ',0,', 0, 'pg1', 'login', '2017-12-12 23:46:35', '', '', '0'),
(78, 'task', 9, ',2,', 2, 'pg1', 'started', '2017-12-12 23:46:58', '', '', '0'),
(79, 'task', 5, ',2,', 2, 'pg1', 'started', '2017-12-12 23:47:03', '', '', '0'),
(80, 'task', 5, ',2,', 2, 'pg1', 'finished', '2017-12-12 23:47:37', 'Finished general setup at backend', '', '0'),
(81, 'user', 5, ',0,', 0, 'pg1', 'logout', '2017-12-12 23:48:31', '', '', '0'),
(82, 'user', 7, ',0,', 0, 'pg3', 'login', '2017-12-12 23:48:39', '', '', '0'),
(83, 'build', 2, ',2,', 2, 'pg3', 'opened', '2017-12-12 23:49:31', '', '', '0'),
(84, 'task', 9, ',2,', 2, 'pg3', 'recordestimate', '2017-12-12 23:51:14', 'Finished page design.', '8', '0'),
(85, 'user', 7, ',0,', 0, 'pg3', 'logout', '2017-12-12 23:52:27', '', '', '0'),
(86, 'user', 2, ',0,', 0, 'thePO', 'login', '2017-12-12 23:52:30', '', '', '0'),
(87, 'story', 10, ',2,', 2, 'thePO', 'edited', '2017-12-12 23:52:40', '', '', '0'),
(88, 'story', 11, ',2,', 2, 'thePO', 'edited', '2017-12-12 23:53:04', '', '', '0'),
(89, 'project', 2, ',2,', 2, 'thePO', 'started', '2017-12-12 23:54:13', '', '', '0'),
(90, 'user', 2, ',0,', 0, 'thePO', 'logout', '2017-12-12 23:55:42', '', '', '0'),
(91, 'user', 7, ',0,', 0, 'pg3', 'login', '2017-12-12 23:55:49', '', '', '0'),
(92, 'testtask', 1, ',2,', 2, 'pg3', 'opened', '2017-12-12 23:56:59', '', '', '0'),
(93, 'user', 7, ',0,', 0, 'pg3', 'logout', '2017-12-12 23:57:22', '', '', '0'),
(94, 'user', 11, ',0,', 0, 'qa1', 'login', '2017-12-12 23:57:33', '', '', '0'),
(95, 'case', 1, ',2,', 0, 'qa1', 'opened', '2017-12-13 00:00:29', '', '', '0'),
(96, 'case', 2, ',2,', 0, 'qa1', 'opened', '2017-12-13 00:04:09', '', '', '0'),
(97, 'testsuite', 1, ',0,', 0, 'qa1', 'opened', '2017-12-13 00:05:13', '', '', '0'),
(98, 'bug', 3, ',2,', 2, 'qa1', 'opened', '2017-12-13 00:09:48', '', '', '0'),
(99, 'case', 3, ',2,', 0, 'qa1', 'opened', '2017-12-13 00:13:25', '', '', '0'),
(100, 'case', 2, ',2,', 0, 'qa1', 'edited', '2017-12-13 00:18:17', '', '', '0'),
(101, 'bug', 4, ',2,', 2, 'qa1', 'opened', '2017-12-13 00:30:07', '', '', '0'),
(102, 'bug', 4, ',2,', 2, 'qa1', 'edited', '2017-12-13 00:30:41', '', '', '0'),
(103, 'bug', 3, ',2,', 2, 'qa1', 'edited', '2017-12-13 00:31:10', '', '', '0'),
(104, 'bug', 5, ',2,', 2, 'qa1', 'opened', '2017-12-13 00:32:08', '', '', '0'),
(105, 'user', 11, ',0,', 0, 'qa1', 'logout', '2017-12-13 00:34:34', '', '', '0');
INSERT INTO `zt_bug` (`id`, `product`, `branch`, `module`, `project`, `plan`, `story`, `storyVersion`, `task`, `toTask`, `toStory`, `title`, `keywords`, `severity`, `pri`, `type`, `os`, `browser`, `hardware`, `found`, `steps`, `status`, `color`, `confirmed`, `activatedCount`, `activatedDate`, `mailto`, `openedBy`, `openedDate`, `openedBuild`, `assignedTo`, `assignedDate`, `deadline`, `resolvedBy`, `resolution`, `resolvedBuild`, `resolvedDate`, `closedBy`, `closedDate`, `duplicateBug`, `linkBug`, `case`, `caseVersion`, `result`, `testtask`, `lastEditedBy`, `lastEditedDate`, `deleted`) VALUES
(1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 'Switch desktops three time, then the order of desktops is different from that before.', '', 3, 0, 'codeerror', 'all', '', '', '', '<p>[Steps]Switch desktops three times.</p>\r\n<p>[Results]The order of desktops is different from that was before.</p>\r\n<p>[Expectations]The order of desktops is the same as that was before.</p>', 'active', '', 0, 0, '0000-00-00 00:00:00', ',pm1', 'qa1', '2017-12-12 15:27:55', '1', 'pm1', '2017-12-12 15:27:55', '2017-12-16', '', '', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 0, '', 0, 0, 0, 0, '', '0000-00-00 00:00:00', '0'),
(2, 1, 0, 2, 1, 0, 0, 1, 0, 0, 0, 'Full text retrieval in Word files. If Chinese characters exist in the file, it cannot be retrieved.', '', 3, 0, 'codeerror', '', '', '', '', '<p>[Steps]Enter “禅道(ZenTao)” in a Word and serach “禅道”.</p>\r\n<p>[Results] “禅道” is not found.</p>\r\n<p>[Expectations] “禅道” is found.</p>', 'active', '', 0, 0, '0000-00-00 00:00:00', '', 'qa1', '2017-12-12 15:30:32', '1', 'pm1', '2017-12-12 15:30:32', '0000-00-00', '', '', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 0, '', 0, 0, 0, 0, '', '0000-00-00 00:00:00', '0'),
(3, 2, 0, 8, 2, 0, 10, 1, 0, 0, 0, '400 page is incomplete.', '', 3, 0, 'codeerror', '', '', '', '', '<p>[Steps]</p>\r\n1. Click “400 page”<br /><p>[Results]</p>\r\n1. Not all 400 page is displayed.<br /><p>[Expectations]</p>\r\n1. List all 400 error pages.<br />', 'active', '', 0, 0, '0000-00-00 00:00:00', '', 'qa1', '2017-12-13 00:09:48', '2', '', '0000-00-00 00:00:00', '0000-00-00', '', '', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 0, '', 2, 1, 1, 1, 'qa1', '2017-12-13 00:31:10', '0'),
(4, 2, 0, 8, 2, 0, 10, 1, 0, 0, 0, 'Generate sitemap.', '', 3, 0, 'codeerror', '', '', '', '', '<p>[Steps]</p>\r\n1. Click “Generate sitemap”.<br /><p>[Results]</p>\r\n1. ‘Contact Us’ page is missing in sitemap.<br /><p>[Expectations]</p>\r\n1. Generate sitemap.<br />', 'active', '', 0, 0, '0000-00-00 00:00:00', '', 'qa1', '2017-12-13 00:30:07', '2', '', '0000-00-00 00:00:00', '0000-00-00', '', '', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 0, '', 2, 2, 0, 0, 'qa1', '2017-12-13 00:30:41', '0'),
(5, 2, 0, 8, 2, 0, 10, 1, 0, 0, 0, 'Database error in adding blogroll.', '', 3, 0, 'codeerror', '', '', '', '', '<p>[Steps]</p>\r\n1. Add ”www.zentao.pm\"<br /><p>[Results]</p>\r\n1. It cannot be added, and database error prompts.<br /><p>[Expectations]</p>1. In database form ‘friend link’, add ”www.zentao.pm\"<br />', 'active', '', 0, 0, '0000-00-00 00:00:00', '', 'qa1', '2017-12-13 00:32:08', '2', '', '0000-00-00 00:00:00', '0000-00-00', '', '', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 0, '', 2, 2, 0, 0, '', '0000-00-00 00:00:00', '0');
INSERT INTO `zt_build` (`id`, `product`, `branch`, `project`, `name`, `scmPath`, `filePath`, `date`, `stories`, `bugs`, `builder`, `desc`, `deleted`) VALUES
(1, 1, 0, 1, 'win10 V1.0build1', '', '', '2017-12-12', '', '', 'qa1', '', '0'),
(2, 2, 0, 2, 'blog v0.1', '', '', '2017-12-12', '', '', 'pg3', 'build for inner test<br />', '0');
INSERT INTO `zt_burn` (`project`, `date`, `estimate`, `left`, `consumed`) VALUES
(1, '2017-12-12', 280, 184, 68);
INSERT INTO `zt_case` (`id`, `product`, `branch`, `lib`, `module`, `path`, `story`, `storyVersion`, `title`, `precondition`, `keywords`, `pri`, `type`, `stage`, `howRun`, `scriptedBy`, `scriptedDate`, `scriptStatus`, `scriptLocation`, `status`, `color`, `frequency`, `order`, `openedBy`, `openedDate`, `reviewedBy`, `reviewedDate`, `lastEditedBy`, `lastEditedDate`, `version`, `linkCase`, `fromBug`, `fromCaseID`, `deleted`, `lastRunner`, `lastRunDate`, `lastRunResult`) VALUES
(1, 2, 0, 0, 8, 0, 11, 1, 'Cache setup test', '', '', 3, 'feature', ',unittest,feature', '', '', '0000-00-00', '', '', 'normal', '', '1', 0, 'qa1', '2017-12-13 00:00:29', '', '0000-00-00', '', '0000-00-00 00:00:00', 1, '', 0, 0, '0', 'qa1', '2017-12-13 00:10:24', 'pass'),
(2, 2, 0, 0, 8, 0, 10, 1, 'SEO setup test', '', '', 2, 'feature', ',feature', '', '', '0000-00-00', '', '', 'normal', '', '1', 0, 'qa1', '2017-12-13 00:04:09', '', '0000-00-00', 'qa1', '2017-12-13 00:18:17', 2, '', 0, 0, '0', 'qa1', '2017-12-13 00:23:48', 'fail'),
(3, 2, 0, 0, 8, 0, 0, 1, 'general setup test', '', '', 3, 'feature', '', '', '', '0000-00-00', '', '', 'normal', '', '1', 0, 'qa1', '2017-12-13 00:13:25', '', '0000-00-00', '', '0000-00-00 00:00:00', 1, '', 0, 0, '0', '', '0000-00-00 00:00:00', '');
INSERT INTO `zt_casestep` (`id`, `parent`, `case`, `version`, `type`, `desc`, `expect`) VALUES
(1, 0, 1, 1, 'step', 'Switch on cache.', 'Cache is on.'),
(2, 0, 1, 1, 'step', 'Switch off cache.', 'Cache is off.'),
(3, 0, 2, 1, 'step', 'Click “Generate sitemap”', 'Sitemap is generated.'),
(4, 0, 2, 1, 'step', 'Click “400 page”', 'List all 400 error pages'),
(5, 0, 2, 1, 'step', 'Set “Individual Blog” as global keyword.', 'Set “Individual Blog” as site keyword.'),
(6, 0, 3, 1, 'step', 'Set self introduction as “Self Intro ABC&quot;', 'Self introduction is set as “Self Intro ABC&quot;'),
(7, 0, 2, 2, 'step', 'Click “Generate sitemap”', 'Sitemap is generated.'),
(8, 0, 2, 2, 'step', 'Click “400 page”', 'List all 400 error pages'),
(9, 0, 2, 2, 'step', 'Set “Individual Blog” as global keyword.”', 'Set “Individual Blog” as site keyword.”'),
(10, 0, 2, 2, 'step', 'Add ”www.zentao.pm&quot;', 'In database form ‘friend link’, add ”www.zentao.pm&quot;');
INSERT INTO `zt_dept` (`id`, `name`, `parent`, `path`, `grade`, `order`, `position`, `function`, `manager`) VALUES
(1, 'Product Dept', 0, ',1,', 1, 10, '', '', ''),
(2, 'Dev Dept', 0, ',2,', 1, 20, '', '', ''),
(3, 'QA Dept', 0, ',3,', 1, 30, '', '', ''),
(4, 'Ops Dept', 0, ',4,', 1, 40, '', '', ''),
(5, 'Dev 1', 2, ',2,5,', 2, 10, '', '', ''),
(6, 'Dev 2', 2, ',2,6,', 2, 20, '', '', '');
INSERT INTO `zt_doclib` (`id`, `product`, `project`, `name`, `acl`, `groups`, `users`, `main`, `order`, `deleted`) VALUES
(1, 1, 0, 'Product Main Library', 'open', '', '', '1', 0, '0'),
(2, 0, 1, 'Project Main Library', 'open', '', '', '1', 0, '0'),
(3, 2, 0, 'Product Main Library', 'open', '', '', '1', 0, '0'),
(4, 0, 2, 'Project Main Library', 'open', '', '', '1', 0, '0');
INSERT INTO `zt_history` (`id`, `action`, `field`, `old`, `new`, `diff`) VALUES
(1, 7, 'desc', 'Finish developing system drive program.', 'Add advanced features such as remote desktop.', '001- <del>Finish developing system drive program.</del>\n001+ <ins>Add advanced features such as remote desktop.</ins>'),
(2, 8, 'desc', 'Finish developing general features.<br />', 'Finish developing general features for users.<br />', '001- <del>Finish developing features that are often used.<br /></del>\n001+ <ins>Finish developing general features for users.<br /></ins>'),
(3, 27, 'realStarted', '0000-00-00', '2017-12-12', ''),
(4, 27, 'assignedTo', 'pg2', 'pm1', ''),
(5, 27, 'status', 'wait', 'doing', ''),
(6, 28, 'left', '100', '64', ''),
(7, 28, 'consumed', '0', '8', ''),
(8, 29, 'realStarted', '0000-00-00', '2017-12-12', ''),
(9, 29, 'assignedTo', 'pg2', 'pm1', ''),
(10, 29, 'status', 'wait', 'doing', ''),
(11, 30, 'realStarted', '0000-00-00', '2017-12-12', ''),
(12, 30, 'assignedTo', 'pg3', 'pm1', ''),
(13, 30, 'status', 'wait', 'doing', ''),
(14, 31, 'left', '60', '0', ''),
(15, 31, 'consumed', '0', '60', ''),
(16, 31, 'status', 'doing', 'done', ''),
(17, 46, 'status', 'wait', 'doing', ''),
(18, 74, 'realStarted', '0000-00-00', '2017-12-12', ''),
(19, 74, 'status', 'wait', 'doing', ''),
(20, 75, 'left', '30', '55', ''),
(21, 75, 'consumed', '0', '8', ''),
(22, 75, 'status', 'wait', 'doing', ''),
(23, 78, 'realStarted', '0000-00-00', '2017-12-12', ''),
(24, 78, 'status', 'wait', 'doing', ''),
(25, 79, 'realStarted', '0000-00-00', '2017-12-12', ''),
(26, 79, 'status', 'wait', 'doing', ''),
(27, 80, 'consumed', '0', '30', ''),
(28, 80, 'assignedTo', 'pg1', 'pm1', ''),
(29, 80, 'finishedDate', '', '2017-12-12 23:47:37', ''),
(30, 80, 'left', '40', '0', ''),
(31, 80, 'status', 'doing', 'done', ''),
(32, 80, 'finishedBy', '', 'pg1', ''),
(33, 84, 'left', '60', '50', ''),
(34, 84, 'consumed', '0', '8', ''),
(35, 87, 'pri', '3', '2', ''),
(36, 88, 'pri', '3', '1', ''),
(37, 89, 'status', 'wait', 'doing', ''),
(38, 100, 'version', '1', '2', ''),
(39, 100, 'steps', 'Click “Generate sitemap” EXPECT: Sitemap is generated.\nClick “400 page” EXPECT: List all 400 error pages.\nSet “Individual Blog” as global keyword. EXPECT: Set “Individual Blog” as site keyword.\n', 'Click “Generate sitemap” EXPECT: Sitemap is generated.\nClick “400 page” EXPECT: List all 400 error pages.\nSet “Individual Blog” as global keyword. EXPECT: Set “Individual Blog” as site keyword.\nAdd ”www.zentao.pm&quot; EXPECT:In database form ‘friend link’, add ”www.zentao.pmww.zentao.pm&quot;\n', '004+ <ins> Add ”www.zentao.pm&quot; EXPECT:In database form ‘friend link’, add ”www.zentao.pmww.zentao.pm&quot;</ins>'),
(40, 102, 'title', 'SEO setup test', 'Generate sitemap', '001- <del>SEO setup test</del>\n001+ <ins>Generate sitemap</ins>'),
(41, 102, 'steps', '<p>[Steps]</p>\r\n1. Click “Generate sitemap”<br /><p>[Results]</p>\r\n1. ‘Contact Us’ page is missing in sitemap.<br /><p>[Expectations]</p>1. Generate sitemap<br />', '<p>[Steps]</p>\r\n1. Click “Generate sitemap”<br /><p>[Results]</p>\r\n1. ‘Contact Us’ page is missing in sitemap.<br /><p>[Expectations]</p>\r\n1. Generate sitemap<br />', '003- <del>1. ‘Contact Us’ page is missing in sitemap.<br /><p>[Expectations]</p>1. Generate sitemap<br /></del>\n003+ <ins>1. ‘Contact Us’ page is missing in sitemap.<br /><p>[Expectations]</p></ins>\n004+ <ins>1. Generate sitemap<br /></ins>'),
(42, 102, 'resolvedDate', '0000-00-00 00:00:00', '', ''),
(43, 103, 'title', 'SEO setup test', '400 page is incomplete.', '001- <del>SEO setup test</del>\n001+ <ins>400 page is incomplete.</ins>'),
(44, 103, 'steps', '<p>[Steps]</p>\r\n1. Click “400 page”<br /><p>[Results]</p>\r\n1. Not all 400 page is displayed.<br /><p>[Expectations]</p>1. List all 400 error pages.<br />', '<p>[Steps]</p>\r\n1. Click “400 page”<br /><p>[Results]</p>\r\n1. Not all 400 page is displayed.<br /><p>[Expectations]</p>\r\n1. List all 400 error pages.<br />', '003- <del>1. Not all 400 page is displayed.<br /><p>[Expectations]</p>1. List all 400 error pages.<br /></del>\n003+ <ins>1. Not all 400 page is displayed.<br /><p>[Expectations]</p></ins>\n004+ <ins>1. List all 400 error pages.<br /></ins>'),
(45, 103, 'resolvedDate', '0000-00-00 00:00:00', '', '');
INSERT INTO `zt_module` (`id`, `root`, `branch`, `name`, `parent`, `path`, `grade`, `order`, `type`, `owner`, `short`, `deleted`) VALUES
(1, 1, 0, 'Desktop', 0, ',1,', 1, 10, 'story', '', '', '0'),
(2, 1, 0, 'My Doc', 0, ',2,', 1, 20, 'story', '', '', '0'),
(3, 1, 0, 'Control Panel', 0, ',3,', 1, 30, 'story', '', '', '0'),
(4, 1, 0, 'Task Manager', 0, ',4,', 1, 40, 'story', '', '', '0'),
(5, 1, 0, 'Other', 0, ',5,', 1, 50, 'story', '', '', '0'),
(6, 2, 0, 'Frontend', 0, ',6,', 1, 10, 'story', '', '', '0'),
(7, 2, 0, 'Backend', 0, ',7,', 1, 20, 'story', '', '', '0'),
(8, 2, 0, 'Global setup', 7, ',7,8,', 2, 10, 'story', '', '', '0'),
(9, 2, 0, 'UI setup', 7, ',7,9,', 2, 20, 'story', '', '', '0'),
(10, 2, 0, 'Manage Articles', 7, ',7,10,', 2, 30, 'story', '', '', '0');
INSERT INTO `zt_product` (`id`, `name`, `code`, `line`, `type`, `status`, `desc`, `PO`, `QD`, `RD`, `acl`, `whitelist`, `createdBy`, `createdDate`, `createdVersion`, `order`, `deleted`) VALUES
(1, 'windows 10', 'win10', 0, 'normal', 'normal', '', 'thePO', 'thePM', 'pg3', 'open', '', 'thePO', '2017-12-12 14:44:55', '9.6.3', 5, '0'),
(2, 'Blog', 'blog', 0, 'normal', 'normal', 'A blogging system<br />', 'thePO', 'theQS', 'pg3', 'open', '', 'admin', '2017-12-12 23:28:29', '9.6.3', 10, '0');
INSERT INTO `zt_productplan` (`id`, `product`, `branch`, `title`, `desc`, `begin`, `end`, `deleted`) VALUES
(1, 1, 0, 'win10 v1.0', 'Finish developing general features for users.<br />', '2017-12-30', '2018-07-03', '0'),
(2, 1, 0, 'win10 v2.0', 'Add advanced features such as remote desktop.', '2018-07-04', '2019-01-05', '0'),
(3, 2, 0, 'blog v0.1', 'Start developing blog<br />', '2017-12-30', '2018-01-29', '0'),
(4, 2, 0, 'blog v0.2', 'Add more setup options of the blog.<br />', '2018-01-30', '2018-04-01', '0');
INSERT INTO `zt_project` (`id`, `isCat`, `catID`, `type`, `parent`, `name`, `code`, `begin`, `end`, `days`, `status`, `statge`, `pri`, `desc`, `openedBy`, `openedDate`, `openedVersion`, `closedBy`, `closedDate`, `canceledBy`, `canceledDate`, `PO`, `PM`, `QD`, `RD`, `team`, `acl`, `whitelist`, `order`, `deleted`) VALUES
(1, '0', 0, 'sprint', 0, ' 1st sprint of win10', 'win10Sprt1', '2017-12-12', '2017-12-25', 10, 'doing', '1', '1', 'Finish developing desktop.', '', 0, '9.6.3', '', 0, '', 0, '', '', '', '', ' 1st sprint of win10', 'open', '', 5, '0'),
(2, '0', 0, 'sprint', 0, '1st sprint of blog', 'blog v0.1', '2017-12-12', '2017-12-25', 10, 'doing', '1', '1', '', '', 0, '9.6.3', '', 0, '', 0, '', '', '', '', '1st sprint of blog', 'open', '', 10, '0');
INSERT INTO `zt_projectproduct` (`project`, `product`, `branch`) VALUES
(1, 1, 0),
(2, 2, 0);
INSERT INTO `zt_projectstory` (`project`, `product`, `story`, `version`, `order`) VALUES
(1, 1, 3, 1, 1),
(1, 1, 2, 1, 2),
(1, 1, 1, 1, 3),
(2, 2, 14, 1, 1),
(2, 2, 13, 1, 2),
(2, 2, 12, 1, 3),
(2, 2, 11, 1, 4),
(2, 2, 10, 1, 5),
(2, 2, 9, 1, 6);
INSERT INTO `zt_story` (`id`, `product`, `branch`, `module`, `plan`, `source`, `sourceNote`, `fromBug`, `title`, `keywords`, `type`, `pri`, `estimate`, `status`, `color`, `stage`, `mailto`, `openedBy`, `openedDate`, `assignedTo`, `assignedDate`, `lastEditedBy`, `lastEditedDate`, `reviewedBy`, `reviewedDate`, `closedBy`, `closedDate`, `closedReason`, `toBug`, `childStories`, `linkStories`, `duplicateStory`, `version`, `deleted`) VALUES
(1, 1, 0, 1, '1', '', '', 0, 'Offer up to 10 desktops to users', '', '', 3, 100, 'active', '', 'developing', NULL, 'thePO', '2017-12-12 14:58:30', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0'),
(2, 1, 0, 1, '1', '', '', 0, 'Custom desktop wallpaper.', '', '', 3, 80, 'active', '', 'developing', NULL, 'thePO', '2017-12-12 14:58:30', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0'),
(3, 1, 0, 1, '1', '', '', 0, 'Auto classify files.', '', '', 3, 60, 'active', '', 'projected', NULL, 'thePO', '2017-12-12 14:58:30', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0'),
(4, 1, 0, 2, '1', '', '', 0, 'Fast search document.', '', '', 3, 60, 'active', '', 'planned', NULL, 'thePO', '2017-12-12 14:58:30', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0'),
(5, 1, 0, 2, '1', '', '', 0, 'Full text retrieval', '', '', 3, 50, 'active', '', 'planned', NULL, 'thePO', '2017-12-12 14:58:30', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0'),
(6, 1, 0, 2, '1', '', '', 0, 'Add file preview.', '', '', 3, 60, 'active', '', 'planned', NULL, 'thePO', '2017-12-12 14:58:30', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0'),
(7, 1, 0, 4, '1', '', '', 0, 'Process list', '', '', 3, 50, 'active', '', 'planned', NULL, 'thePO', '2017-12-12 14:58:30', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0'),
(8, 1, 0, 4, '1', '', '', 0, 'Performance overview', '', '', 3, 60, 'active', '', 'planned', NULL, 'thePO', '2017-12-12 14:58:30', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0'),
(9, 2, 0, 8, '3', '', '', 0, 'General setup', '', '', 3, 40, 'active', '', 'developed', NULL, 'thePO', '2017-12-12 23:40:19', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0'),
(10, 2, 0, 8, '3', '', '', 0, 'SEO setup', '', '', 2, 50, 'active', '', 'projected', '', 'thePO', '2017-12-12 23:40:19', '', '0000-00-00 00:00:00', 'thePO', '2017-12-12 23:52:40', '', '0000-00-00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0'),
(11, 2, 0, 8, '3', '', '', 0, 'cache setup', '', '', 1, 30, 'active', '', 'developing', '', 'thePO', '2017-12-12 23:40:19', '', '0000-00-00 00:00:00', 'thePO', '2017-12-12 23:53:04', '', '0000-00-00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0'),
(12, 2, 0, 8, '3', '', '', 0, 'security setup', '', '', 3, 30, 'active', '', 'developing', NULL, 'thePO', '2017-12-12 23:40:19', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0'),
(13, 2, 0, 9, '3', '', '', 0, 'UI setup', '', '', 3, 60, 'active', '', 'developing', NULL, 'thePO', '2017-12-12 23:40:19', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0'),
(14, 2, 0, 6, '3', '', '', 0, 'Page display', '', '', 3, 60, 'active', '', 'projected', NULL, 'thePO', '2017-12-12 23:40:19', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0'),
(15, 2, 0, 10, '4', '', '', 0, 'Article management', '', '', 3, 50, 'active', '', 'planned', NULL, 'thePO', '2017-12-12 23:40:19', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0');
INSERT INTO `zt_storyspec` (`story`, `version`, `title`, `spec`, `verify`) VALUES
(1, 1, 'Offer up to 10 desktops to users', 'User can do different tasks on different desktops.', ''),
(2, 1, 'Custom desktop wallpaper', '', ''),
(3, 1, 'Auto classify files.', '', ''),
(4, 1, 'Fast search document.', '', ''),
(5, 1, 'Full text retrieval', '', ''),
(6, 1, 'Add file preview.', '', ''),
(7, 1, 'Process list', '', ''),
(8, 1, 'Performance overview', '', ''),
(9, 1, 'General setup', '', ''),
(10, 1, 'SEO setup', 'Set SEO switch and report.', ''),
(11, 1, 'cache setup', 'Set cache switch and time.', ''),
(12, 1, 'security setup', '', ''),
(13, 1, 'UI setup', '', ''),
(14, 1, 'Page display', '', ''),
(15, 1, 'Article management', '', '');
INSERT INTO `zt_suitecase` (`suite`, `product`, `case`, `version`) VALUES
(1, 0, 2, 1),
(1, 0, 1, 1);
INSERT INTO `zt_task` (`id`, `parent`, `project`, `module`, `story`, `storyVersion`, `fromBug`, `name`, `type`, `pri`, `estimate`, `consumed`, `left`, `deadline`, `status`, `color`, `mailto`, `desc`, `openedBy`, `openedDate`, `assignedTo`, `assignedDate`, `estStarted`, `realStarted`, `finishedBy`, `finishedDate`, `canceledBy`, `canceledDate`, `closedBy`, `closedDate`, `closedReason`, `lastEditedBy`, `lastEditedDate`, `deleted`) VALUES
(1, 0, 1, 1, 1, 1, 0, 'Offer up to 10 desktops to users.', 'devel', 3, 100, 8, 64, '0000-00-00', 'doing', '', NULL, 'User can do different tasks on different desktops.', 'pm1', '2017-12-12 15:05:06', 'pm1', '2017-12-12 15:12:17', '0000-00-00', '2017-12-12', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 'pm1', '2017-12-12 15:13:13', '0'),
(2, 0, 1, 1, 2, 1, 0, 'Custom desktop wallpaper', 'devel', 3, 80, 0, 80, '0000-00-00', 'doing', '', NULL, '', 'pm1', '2017-12-12 15:05:06', 'pm1', '2017-12-12 15:13:25', '0000-00-00', '2017-12-12', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 'pm1', '2017-12-12 15:13:25', '0'),
(3, 0, 1, 1, 3, 1, 0, 'Auto classify files.', 'devel', 3, 60, 60, 0, '0000-00-00', 'done', '', NULL, '', 'pm1', '2017-12-12 15:05:06', 'pm1', '2017-12-12 15:14:47', '0000-00-00', '2017-12-12', 'pm1', '2017-12-12 15:14:47', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 'pm1', '2017-12-12 15:14:47', '0'),
(4, 0, 1, 1, 3, 1, 0, 'File type configuration', 'devel', 4, 40, 0, 40, '0000-00-00', 'wait', '', NULL, '', 'pm1', '2017-12-12 15:05:06', 'pg3', '2017-12-12 15:05:06', '0000-00-00', '0000-00-00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '', '0000-00-00 00:00:00', '0'),
(5, 0, 2, 8, 9, 1, 0, 'General backend setup', 'devel', 3, 40, 30, 0, '0000-00-00', 'done', '', NULL, '', 'pm1', '2017-12-12 23:45:14', 'pm1', '2017-12-12 23:47:37', '0000-00-00', '2017-12-12', 'pg1', '2017-12-12 23:47:37', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 'pg1', '2017-12-12 23:47:37', '0'),
(6, 0, 2, 8, 10, 1, 0, 'backend SEO setup', 'devel', 3, 50, 0, 50, '0000-00-00', 'wait', '', NULL, 'Set SEO switch and report.', 'pm1', '2017-12-12 23:45:14', 'pg2', '2017-12-12 23:45:14', '0000-00-00', '0000-00-00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '', '0000-00-00 00:00:00', '0'),
(7, 0, 2, 8, 11, 1, 0, 'backend cache setup', 'devel', 3, 30, 8, 55, '0000-00-00', 'doing', '', NULL, 'Set cache switch and time.', 'pm1', '2017-12-12 23:45:14', 'pm1', '2017-12-12 23:45:53', '0000-00-00', '2017-12-12', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 'pm1', '2017-12-12 23:45:53', '0'),
(8, 0, 2, 8, 12, 1, 0, 'backend security setup', 'devel', 3, 30, 0, 30, '0000-00-00', 'doing', '', NULL, '', 'pm1', '2017-12-12 23:45:14', 'pm1', '2017-12-12 23:45:14', '0000-00-00', '2017-12-12', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 'pm1', '2017-12-12 23:45:35', '0'),
(9, 0, 2, 9, 13, 1, 0, 'backend UI setup', 'devel', 3, 60, 8, 50, '0000-00-00', 'doing', '', NULL, '', 'pm1', '2017-12-12 23:45:14', 'pg1', '2017-12-12 23:45:14', '0000-00-00', '2017-12-12', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 'pg3', '2017-12-12 23:51:14', '0'),
(10, 0, 2, 6, 14, 1, 0, 'Page display', 'devel', 3, 60, 0, 60, '0000-00-00', 'wait', '', NULL, '', 'pm1', '2017-12-12 23:45:14', 'pg2', '2017-12-12 23:45:14', '0000-00-00', '0000-00-00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '', '0000-00-00 00:00:00', '0');
INSERT INTO `zt_taskestimate` (`id`, `task`, `date`, `left`, `consumed`, `account`, `work`) VALUES
(1, 1, '2017-12-12', 100, 0, 'pm1', NULL),
(2, 1, '2017-12-12', 64, 8, 'pm1', 'Finish UI design'),
(3, 2, '2017-12-12', 80, 0, 'pm1', NULL),
(4, 3, '2017-12-12', 60, 0, 'pm1', NULL),
(5, 3, '2017-12-12', 0, 60, 'pm1', 'Finish'),
(6, 8, '2017-12-12', 30, 0, 'pm1', NULL),
(7, 7, '2017-12-12', 55, 8, 'pm1', ''),
(8, 9, '2017-12-12', 60, 0, 'pg1', NULL),
(9, 5, '2017-12-12', 40, 0, 'pg1', NULL),
(10, 5, '2017-12-12', 0, 30, 'pg1', NULL),
(11, 9, '2017-12-13', 50, 8, 'pg3', 'Finish page design');
INSERT INTO `zt_team` (`project`, `task`, `account`, `role`, `limited`, `join`, `days`, `hours`, `estimate`, `consumed`, `left`, `order`) VALUES
(1, 0, 'thePO', 'Product Owner', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0),
(1, 0, 'pm1', 'Project Manager', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0),
(1, 0, 'pg2', 'Developer', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0),
(1, 0, 'pg3', 'Developer', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0),
(1, 0, 'qa1', 'Tester', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0),
(2, 0, 'pm1', 'Project Manager', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0),
(2, 0, 'pg1', 'Developer', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0),
(2, 0, 'pg2', 'Developer', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0),
(2, 0, 'pg3', 'Developer', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0);
INSERT INTO `zt_testresult` (`id`, `run`, `case`, `version`, `caseResult`, `stepResults`, `lastRunner`, `date`) VALUES
(1, 1, 2, 1, 'fail', 'a:3:{i:3;a:2:{s:6:\"result\";s:4:\"pass\";s:4:\"real\";s:0:\"\";}i:4;a:2:{s:6:\"result\";s:4:\"fail\";s:4:\"real\";s:24:\"Not all 400 page is displayed.\";}i:5;a:2:{s:6:\"result\";s:4:\"pass\";s:4:\"real\";s:0:\"\";}}', 'qa1', '2017-12-13 00:08:52'),
(2, 2, 1, 1, 'pass', 'a:2:{i:1;a:2:{s:6:\"result\";s:4:\"pass\";s:4:\"real\";s:0:\"\";}i:2;a:2:{s:6:\"result\";s:4:\"pass\";s:4:\"real\";s:0:\"\";}}', 'qa1', '2017-12-13 00:10:24'),
(3, 0, 2, 2, 'fail', 'a:4:{i:7;a:2:{s:6:\"result\";s:4:\"fail\";s:4:\"real\";s:42:\"‘Contact Us’ page is missing in sitemap.\";}i:8;a:2:{s:6:\"result\";s:4:\"fail\";s:4:\"real\";s:36:\"400 page is missing.‘/notExitPage’;\";}i:9;a:2:{s:6:\"result\";s:4:\"pass\";s:4:\"real\";s:0:\"\";}i:10;a:2:{s:6:\"result\";s:3:\"n/a\";s:4:\"real\";s:45:\"Blogroll cannot be added, and database error prompts.\";}}', 'qa1', '2017-12-13 00:23:41'),
(4, 0, 2, 2, 'fail', 'a:4:{i:7;a:2:{s:6:\"result\";s:4:\"fail\";s:4:\"real\";s:42:\"‘Contact Us’ page is missing in sitemap.\";}i:8;a:2:{s:6:\"result\";s:4:\"fail\";s:4:\"real\";s:36:\"400 page is missing.‘/notExitPage’;\";}i:9;a:2:{s:6:\"result\";s:4:\"pass\";s:4:\"real\";s:0:\"\";}i:10;a:2:{s:6:\"result\";s:4:\"fail\";s:4:\"real\";s:45:\"Blogroll cannot be added, and database error prompts.\";}}', 'qa1', '2017-12-13 00:23:48');
INSERT INTO `zt_testrun` (`id`, `task`, `case`, `version`, `assignedTo`, `lastRunner`, `lastRunDate`, `lastRunResult`, `status`) VALUES
(1, 1, 2, 2, 'theQS', 'qa1', '2017-12-13 00:08:52', 'fail', 'done'),
(2, 1, 1, 1, 'qa1', 'qa1', '2017-12-13 00:10:24', 'pass', 'done');
INSERT INTO `zt_testsuite` (`id`, `product`, `name`, `desc`, `type`, `addedBy`, `addedDate`, `lastEditedBy`, `lastEditedDate`, `deleted`) VALUES
(1, 2, 'Testsuite', 'Testsuite', 'public', 'qa1', '2017-12-13 00:05:13', '', '0000-00-00 00:00:00', '0');
INSERT INTO `zt_testtask` (`id`, `name`, `product`, `project`, `build`, `owner`, `pri`, `begin`, `end`, `mailto`, `desc`, `report`, `status`, `deleted`) VALUES
(1, 'test for blog v0.1', 2, 2, '2', 'thePO', 0, '2018-01-05', '2018-01-20', '', '', '', 'wait', '0');
INSERT INTO `zt_user` (`dept`, `account`, `password`, `role`, `realname`, `nickname`, `commiter`, `avatar`, `birthday`, `gender`, `email`, `skype`, `qq`, `yahoo`, `gtalk`, `wangwang`, `mobile`, `phone`, `address`, `zipcode`, `join`, `visits`, `ip`, `last`, `fails`, `locked`, `ranzhi`, `score`, `scoreLevel`, `deleted`) VALUES
(1, 'thePO', 'e10adc3949ba59abbe56e057f20f883e', 'po', 'Richard', '', '', '', '0000-00-00', 'm', '', '', '', '', '', '', '', '', '', '', '0000-00-00', 3, '127.0.0.1', 1513093950, 0, '0000-00-00 00:00:00', '', 0, 0, '0'),
(5, 'pm1', 'e10adc3949ba59abbe56e057f20f883e', 'pm', 'Daniel', '', '', '', '0000-00-00', 'm', '', '', '', '', '', '', '', '', '', '', '0000-00-00', 2, '127.0.0.1', 1513093318, 0, '0000-00-00 00:00:00', '', 0, 0, '0'),
(6, 'pm2', 'e10adc3949ba59abbe56e057f20f883e', 'pm', 'Matthew', '', '', '', '0000-00-00', 'm', '', '', '', '', '', '', '', '', '', '', '0000-00-00', 0, '', 0, 0, '0000-00-00 00:00:00', '', 0, 0, '0'),
(5, 'pg1', 'e10adc3949ba59abbe56e057f20f883e', 'dev', 'Mark', '', '', '', '0000-00-00', 'm', '', '', '', '', '', '', '', '', '', '', '0000-00-00', 1, '127.0.0.1', 1513093595, 0, '0000-00-00 00:00:00', '', 0, 0, '0'),
(5, 'pg2', 'e10adc3949ba59abbe56e057f20f883e', 'dev', 'Andrew', '', '', '', '0000-00-00', 'm', '', '', '', '', '', '', '', '', '', '', '0000-00-00', 0, '', 0, 0, '0000-00-00 00:00:00', '', 0, 0, '0'),
(5, 'pg3', 'e10adc3949ba59abbe56e057f20f883e', 'dev', 'Jean', '', '', '', '0000-00-00', 'm', '', '', '', '', '', '', '', '', '', '', '0000-00-00', 2, '127.0.0.1', 1513094149, 0, '0000-00-00 00:00:00', '', 0, 0, '0'),
(3, 'thePM', 'e10adc3949ba59abbe56e057f20f883e', 'qd', 'Tracy', '', '', '', '0000-00-00', 'm', '', '', '', '', '', '', '', '', '', '', '0000-00-00', 0, '', 0, 0, '0000-00-00 00:00:00', '', 0, 0, '1'),
(3, 'qa1', 'e10adc3949ba59abbe56e057f20f883e', 'qa', 'Robert', '', '', '', '0000-00-00', 'm', '', '', '', '', '', '', '', '', '', 'admin', '0000-00-00', 2, '127.0.0.1', 1513094253, 0, '0000-00-00 00:00:00', '', 0, 0, '0'),
(3, 'theQS', 'e10adc3949ba59abbe56e057f20f883e', 'qd', 'Hannah', '', '', '', '0000-00-00', 'm', '', '', '', '', '', '', '', '', '', '', '0000-00-00', 1, '127.0.0.1', 1513063356, 0, '0000-00-00 00:00:00', '', 0, 0, '0');
INSERT INTO `zt_usergroup` (`account`, `group`) VALUES
('pg1', 2),
('pg2', 2),
('pg3', 2),
('pm1', 4),
('pm2', 4),
('qa1', 3),
('thePM', 8),
('thePO', 5);
+2 -2
View File
@@ -782,7 +782,7 @@ class baseDAO
{
$sql = $this->processSQL();
$table = $this->table;
$key = 'fetch-' . md5($sql);
$key = 'fetch-' . md5($sql . $field);
if(isset(dao::$cache[$table][$key]))
{
if(empty($field)) return $this->getRow(dao::$cache[$table][$key]);
@@ -800,7 +800,7 @@ class baseDAO
$this->setFields($field);
$result = $this->query()->fetch(PDO::FETCH_OBJ);
dao::$cache[$table][$key] = $result;
dao::$cache[$table][$key] = $this->getRow($result);
return $result ? $result->$field : '';
}
+2 -2
View File
@@ -960,7 +960,7 @@ class bug extends control
$this->view->users = $users;
$this->view->assignedTo = $assignedTo;
$this->view->projects = $this->loadModel('product')->getProjectPairs($productID, $bug->branch ? "0,{$bug->branch}" : 0, $params = 'nodeleted');
$this->view->builds = $this->loadModel('build')->getProductBuildPairs($productID, $branch = 0, 'all');
$this->view->builds = $this->loadModel('build')->getProductBuildPairs($productID, $branch = 0, 'all', true , $bug->project);
$this->view->actions = $this->action->getList('bug', $bugID);
$this->display();
}
@@ -1018,7 +1018,7 @@ class bug extends control
$this->view->bug = $bug;
$this->view->users = $this->user->getPairs('nodeleted', $bug->resolvedBy);
$this->view->builds = $this->loadModel('build')->getProductBuildPairs($productID, $bug->branch, 'noempty');
$this->view->builds = $this->loadModel('build')->getProductBuildPairs($productID, $bug->branch, 'noempty', true, $bug->project);
$this->view->actions = $this->action->getList('bug', $bugID);
$this->display();
+24
View File
@@ -136,3 +136,27 @@ if(navigator.userAgent.indexOf("Firefox") < 0)
this.style.height = (this.scrollHeight + 2) + "px";
});
}
$(document).keydown(function(event)
{
if(event.ctrlKey && event.keyCode == 38)
{
event.stopPropagation();
event.preventDefault();
selectFocusJump('up');
}
else if(event.ctrlKey && event.keyCode == 40)
{
event.stopPropagation();
event.preventDefault();
selectFocusJump('down');
}
else if(event.keyCode == 38)
{
inputFocusJump('up');
}
else if(event.keyCode == 40)
{
inputFocusJump('down');
}
});
+11 -2
View File
@@ -511,6 +511,7 @@ class bugModel extends model
->setDefault('openedBuild', '')
->setDefault('plan', 0)
->setDefault('deadline', '0000-00-00')
->setDefault('resolvedDate', '0000-00-00 00:00:00')
->setIF(strpos($this->config->bug->edit->requiredFields, 'deadline') !== false, 'deadline', $this->post->deadline)
->add('lastEditedBy', $this->app->user->account)
->add('lastEditedDate', $now)
@@ -2413,10 +2414,18 @@ class bugModel extends model
echo zget($plans, $bug->plan, '');
break;
case 'story':
echo zget($stories, $bug->story, '');
if(isset($stories[$bug->story]))
{
$story = $stories[$bug->story];
echo common::hasPriv('story', 'view') ? html::a(helper::createLink('story', 'view', "storyID=$story->id", 'html', true), $story->title, '', "class='iframe'") : $story->title;
}
break;
case 'task':
echo zget($tasks, $bug->task, '');
if(isset($tasks[$bug->task]))
{
$task = $tasks[$bug->task];
echo common::hasPriv('task', 'view') ? html::a(helper::createLink('task', 'view', "taskID=$task->id", 'html', true), $task->name, '', "class='iframe'") : $task->name;
}
break;
case 'type':
echo zget($this->lang->bug->typeList, $bug->type);
+2 -2
View File
@@ -211,7 +211,7 @@ js::set('oldResolvedBuild' , $bug->resolvedBuild);
</tr>
<tr>
<th><?php echo $lang->bug->resolvedDate;?></th>
<td><?php echo html::input('resolvedDate', $bug->resolvedDate, 'class=form-control');?></td>
<td><?php echo html::input('resolvedDate', $bug->resolvedDate, "class='form-control form-datetime'");?></td>
</tr>
<tr>
<th><?php echo $lang->bug->resolvedBuild;?></th>
@@ -236,7 +236,7 @@ js::set('oldResolvedBuild' , $bug->resolvedBuild);
</tr>
<tr>
<th><?php echo $lang->bug->closedDate;?></th>
<td><?php echo html::input('closedDate', $bug->closedDate, 'class=form-control');?></td>
<td><?php echo html::input('closedDate', $bug->closedDate, "class='form-control form-datetime'");?></td>
</tr>
</table>
</fieldset>
+12 -6
View File
@@ -116,25 +116,31 @@ class buildModel extends model
}
/**
* Get builds of a product in pairs.
*
* @param mix $products int|array
* @param string $params noempty|notrunk, can be a set of them
* Get builds of a product in pairs.
*
* @param mix $products int|array
* @param int $branch
* @param string $params noempty|notrunk, can be a set of them
* @param bool $replace
* @param int $project
*
* @access public
* @return string
* @return array
*/
public function getProductBuildPairs($products, $branch = 0, $params = 'noterminate, nodone', $replace = true)
public function getProductBuildPairs($products, $branch = 0, $params = 'noterminate, nodone', $replace = true, $project = 0)
{
$sysBuilds = array();
if(strpos($params, 'noempty') === false) $sysBuilds = array('' => '');
if(strpos($params, 'notrunk') === false) $sysBuilds = $sysBuilds + array('trunk' => $this->lang->trunk);
/* Add project for Bug#1344. */
$productBuilds = $this->dao->select('t1.id, t1.name, t1.project, t2.status as projectStatus, t3.id as releaseID, t3.status as releaseStatus, t4.name as branchName')->from(TABLE_BUILD)->alias('t1')
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id')
->leftJoin(TABLE_RELEASE)->alias('t3')->on('t1.id = t3.build')
->leftJoin(TABLE_BRANCH)->alias('t4')->on('t1.branch = t4.id')
->where('t1.product')->in($products)
->beginIF($branch)->andWhere('t1.branch')->in("0,$branch")->fi()
->beginIF($project)->andWhere('t1.project')->eq($project)->fi()
->andWhere('t1.deleted')->eq(0)
->orderBy('t1.date desc, t1.id desc')->fetchAll('id');
-1
View File
@@ -217,7 +217,6 @@ tfoot tr td .table-actions .btn{display:none;}
<th class='w-date {sorter:false}'> <?php common::printOrderLink('openedDate', $orderBy, $vars, $lang->bug->openedDateAB);?></th>
<th class='w-user {sorter:false}'> <?php common::printOrderLink('resolvedBy', $orderBy, $vars, $lang->bug->resolvedByAB);?></th>
<th class='w-100px {sorter:false}'> <?php common::printOrderLink('resolvedDate', $orderBy, $vars, $lang->bug->resolvedDateAB);?></th>
<th class='w-50px {sorter:false}'> <?php echo $lang->actions?></th>
</tr>
</thead>
<?php foreach($generatedBugs as $bug):?>
+1 -1
View File
@@ -458,7 +458,7 @@ $lang->pager->noRecord = "No History";
$lang->pager->digest = " <strong>%s</strong> in total. %s <strong>%s/%s</strong> &nbsp; ";
$lang->pager->recPerPage = " <strong>%s</strong> per page";
$lang->pager->first = "<i class='icon-step-backward' title='Home'></i>";
$lang->pager->pre = "<i class='icon-play icon-rotate-180' title='Previous Page'></i>";
$lang->pager->pre = "<i class='icon-play icon-flip-horizontal' title='Previous Page'></i>";
$lang->pager->next = "<i class='icon-play' title='Next Page'></i>";
$lang->pager->last = "<i class='icon-step-forward' title='Last Page'></i>";
$lang->pager->locate = "Go!";
+1 -1
View File
@@ -458,7 +458,7 @@ $lang->pager->noRecord = "暂时没有记录";
$lang->pager->digest = "共 <strong>%s</strong> 条记录,%s <strong>%s/%s</strong> &nbsp; ";
$lang->pager->recPerPage = "每页 <strong>%s</strong> 条";
$lang->pager->first = "<i class='icon-step-backward' title='首页'></i>";
$lang->pager->pre = "<i class='icon-play icon-rotate-180' title='上一页'></i>";
$lang->pager->pre = "<i class='icon-play icon-flip-horizontal' title='上一页'></i>";
$lang->pager->next = "<i class='icon-play' title='下一页'></i>";
$lang->pager->last = "<i class='icon-step-forward' title='末页'></i>";
$lang->pager->locate = "GO!";
+1 -1
View File
@@ -458,7 +458,7 @@ $lang->pager->noRecord = "暫時沒有記錄";
$lang->pager->digest = "共 <strong>%s</strong> 條記錄,%s <strong>%s/%s</strong> &nbsp; ";
$lang->pager->recPerPage = "每頁 <strong>%s</strong> 條";
$lang->pager->first = "<i class='icon-step-backward' title='首頁'></i>";
$lang->pager->pre = "<i class='icon-play icon-rotate-180' title='上一頁'></i>";
$lang->pager->pre = "<i class='icon-play icon-flip-horizontal' title='上一頁'></i>";
$lang->pager->next = "<i class='icon-play' title='下一頁'></i>";
$lang->pager->last = "<i class='icon-step-forward' title='末頁'></i>";
$lang->pager->locate = "GO!";
+3 -3
View File
@@ -126,7 +126,7 @@ $(function()
var $col = $cols.filter('[data-key=' + col.id + ']');
$col.toggleClass('disabled', !col.show);
$col.attr('data-order', col.order);
if(col.width) $col.find('input').val(col.width.replace('px', ''));
if(col.width) $col.find('input#width').val(col.width.replace('px', ''));
}
$('.cols-list').on('click', '.col:not(.require) .show-hide, .col:not(.require) .title', function()
@@ -149,14 +149,14 @@ $(function()
$list.sortable({trigger: '.title', selector: '.col'});
}
}).on('keyup change', 'input', function()
}).on('keyup change', 'input#width', function()
{
renderColWidth($(this).closest('.col'));
});
function renderColWidth($col)
{
var width = $col.find('input').val();
var width = $col.find('input#width').val();
if(width == 'auto')
{
width = '500';
+3
View File
@@ -90,6 +90,9 @@ $lang->dev->tableList['doccontent'] = 'Doc Content';
$lang->dev->tableList['storystage'] = 'Story Stage';
$lang->dev->tableList['tutorial'] = 'Tutorial';
$lang->dev->tableList['suitecase'] = 'Suite Case';
$lang->dev->tableList['score'] = 'Score';
$lang->dev->tableList['entry'] = 'Entry';
$lang->dev->tableList['webhook'] = 'WebHook';
$lang->dev->groupList['my'] = 'Dashboard';
$lang->dev->groupList['product'] = $lang->productCommon;
+3
View File
@@ -90,6 +90,9 @@ $lang->dev->tableList['doccontent'] = '文档内容';
$lang->dev->tableList['storystage'] = '需求阶段';
$lang->dev->tableList['tutorial'] = '新手教程';
$lang->dev->tableList['suitecase'] = '套件用例';
$lang->dev->tableList['score'] = '积分';
$lang->dev->tableList['entry'] = '应用';
$lang->dev->tableList['webhook'] = 'WebHook';
$lang->dev->groupList['my'] = '我的地盘';
$lang->dev->groupList['product'] = $lang->productCommon;
+3 -3
View File
@@ -27,8 +27,8 @@
<tr>
<th class='w-id'><?php echo $lang->group->id;?></th>
<th class='w-100px'><?php echo $lang->group->name;?></th>
<th><?php echo $lang->group->desc;?></th>
<th class='w-p60'><?php echo $lang->group->users;?></th>
<th class='w-250px'><?php echo $lang->group->desc;?></th>
<th><?php echo $lang->group->users;?></th>
<th class='w-150px {sorter:false}'><?php echo $lang->actions;?></th>
</tr>
</thead>
@@ -38,7 +38,7 @@
<tr class='text-center'>
<td class='strong'><?php echo $group->id;?></td>
<td class='text-left'><?php echo $group->name;?></td>
<td class='text-left'><?php echo $group->desc;?></td>
<td class='text-left' title='<?php echo $group->desc?>'><?php echo $group->desc;?></td>
<td class='text-left' title='<?php echo $users;?>'><?php echo $users;?></td>
<td class='text-center'>
<?php $lang->group->managepriv = $lang->group->managePrivByGroup;?>
+2 -1
View File
@@ -497,7 +497,8 @@ class installModel extends model
*/
public function importDemoData()
{
$demoDataFile = $this->app->getAppRoot() . 'db' . DS . 'demo.sql';
$demoDataFile = $this->app->clientLang == 'en' ? 'endemo.sql' : 'demo.sql';
$demoDataFile = $this->app->getAppRoot() . 'db' . DS . $demoDataFile;
$insertTables = explode(";\n", file_get_contents($demoDataFile));
foreach($insertTables as $table)
{
+2 -2
View File
@@ -35,8 +35,8 @@
<tr class='text-center'>
<td><?php echo $build->id;?></td>
<td class='text-left'><?php echo html::a($this->createLink('build', 'view', "build=$build->id"), $build->name);?></td>
<td class='text-left' title="<?php echo $build->scmPath?>"><?php strpos($build->scmPath, 'http') === 0 ? printf(html::a($build->scmPath)) : printf($build->scmPath);?></td>
<td class='text-left' title="<?php echo $build->filePath?>"><?php strpos($build->filePath, 'http') === 0 ? printf(html::a($build->filePath)) : printf($build->filePath);?></td>
<td class='text-left' title="<?php echo $build->scmPath?>"><?php echo strpos($build->scmPath, 'http') === true ? html::a($build->scmPath) : $build->scmPath;?></td>
<td class='text-left' title="<?php echo $build->filePath?>"><?php echo strpos($build->filePath, 'http') === true ? html::a($build->filePath) : $build->filePath;?></td>
<td><?php echo $build->date?></td>
<td><?php echo $users[$build->builder]?></td>
<td class='text-right'>
+8
View File
@@ -290,6 +290,14 @@ class project extends control
{
$groupTasks[$task->$groupBy][] = $task;
}
if(isset($task->children))
{
foreach($task->children as $child)
{
$groupTasks[$child->assignedToRealName][] = $child;
}
$task->children = true;
}
}
/* Process closed data when group by assignedTo. */
if($groupBy == 'assignedTo' and isset($groupTasks['Closed']))
+1
View File
@@ -21,6 +21,7 @@ $(function()
$('#module' + moduleID).addClass('active');
$('#product' + productID).addClass('active');
$('#branch' + branchID).addClass('active');
$(document).on('click', "#storyList tbody tr", function(){showCheckedSummary();});
$(document).on('change', "#storyList :checkbox", function(){showCheckedSummary();});
});
+12 -4
View File
@@ -564,7 +564,7 @@ class projectModel extends model
*
* @param int $projectID
* @access public
* @return void
* @return array
*/
public function close($projectID)
{
@@ -789,6 +789,7 @@ class projectModel extends model
$tasks = $this->dao->select('id, project, estimate, consumed, `left`, status, closedReason')
->from(TABLE_TASK)
->where('project')->in($projectKeys)
->andWhere('parent')->eq(0)
->andWhere('deleted')->eq(0)
->fetchGroup('project', 'id');
@@ -1681,7 +1682,7 @@ class projectModel extends model
*
* @param int $projectID
* @access public
* @return void
* @return array
*/
public function getBurnDataFlot($projectID = 0)
{
@@ -1835,7 +1836,7 @@ class projectModel extends model
*/
public function summary($tasks)
{
$taskSum = $statusWait = $statusDone = $statusDoing = $statusClosed = $statusCancel = $statusPause = 0;
$taskSum = $statusWait = $statusDone = $statusDoing = $statusClosed = $statusCancel = $statusPause = 0;
$totalEstimate = $totalConsumed = $totalLeft = 0.0;
foreach($tasks as $task)
@@ -1845,7 +1846,13 @@ class projectModel extends model
$totalLeft += (($task->status == 'cancel' or $task->closedReason == 'cancel') ? 0 : $task->left);
$statusVar = 'status' . ucfirst($task->status);
$$statusVar ++;
if(!empty($task->children)) $taskSum += count($task->children);
if(!empty($task->children)){
$taskSum += count($task->children);
foreach($task->children as $child)
{
if($child->status == 'wait') $statusWait ++;
}
}
$taskSum ++;
}
@@ -1921,6 +1928,7 @@ class projectModel extends model
* @param string $end
* @param string $type
* @param string|int $interval
* @param string $format
* @access public
* @return array
*/
+11 -34
View File
@@ -65,7 +65,7 @@
if($groupBy == 'assignedTo' and $groupName == '') $groupName = $this->lang->task->noAssigned;
?>
<?php
$rowspan = 0;
$groupSum = 0;
foreach($groupTasks as $taskKey => $task)
{
if(isset($currentFilter) and $currentFilter != 'all')
@@ -87,8 +87,6 @@
}
}
if(!empty($task->children)) $rowspan += count($task->children);
$groupEstimate += $task->estimate;
$groupConsumed += $task->consumed;
$groupLeft += ($task->status == 'cancel' ? 0 : $task->left);
@@ -99,7 +97,6 @@
if($task->status == 'closed') $groupClosed++;
}
$groupSum = count($groupTasks);
$rowspan += $groupSum;
?>
<?php $i = 0;?>
<?php foreach($groupTasks as $task):?>
@@ -107,7 +104,7 @@
<?php $taskLink = $this->createLink('task','view',"taskID=$task->id"); ?>
<tr class='text-center' data-id='<?php echo $groupIndex?>'>
<?php if($i == 0):?>
<td rowspan='<?php echo $rowspan?>' class='groupby text-left'>
<td rowspan='<?php echo $groupSum?>' class='groupby text-left'>
<?php echo html::a('###', "<i class='icon-caret-down'></i> " . $groupName, '', "class='expandGroup' data-action='expand' title='$groupName'");?>
<div class='groupSummary text' style='white-space:normal'>
<?php if($groupBy == 'assignedTo' and isset($members[$task->assignedTo])) printf($lang->project->memberHours, $users[$task->assignedTo], $members[$task->assignedTo]->totalHours);?>
@@ -116,8 +113,15 @@
</td>
<?php endif;?>
<td><?php echo $task->id;?></td>
<td><span class='<?php echo 'pri' . zget($lang->task->priList, $task->pri, $task->pri)?>'><?php echo zget($lang->task->priList, $task->pri, $task->pri);?></span></td>
<td class='text-left'><?php if(!empty($task->team)) echo '<span class="label">'.$lang->task->multipleAB.'</span> ';if(!common::printLink('task', 'view', "task=$task->id", $task->name)) echo $task->name;?></td>
<td><span class='<?php echo 'pri' . zget(array_keys($lang->task->priList), $task->pri, $task->pri)?>'><?php echo zget(array_keys($lang->task->priList), $task->pri, $task->pri);?></span></td>
<td class='text-left'>
<?php
if(!empty($task->team)) echo '<span class="label">' . $lang->task->multipleAB . '</span> ';
if(!empty($task->parent)) echo '<span class="label">' . $lang->task->childrenAB . '</span> ';
if(isset($task->children) && $task->children == true) echo '<span class="label">' . $lang->task->parentAB . '</span> ';
if(!common::printLink('task', 'view', "task=$task->id", $task->name)) echo $task->name;
?>
</td>
<td class='task-<?php echo $task->status;?>'><?php echo $lang->task->statusList[$task->status];?></td>
<td class='<?php if(isset($task->delay)) echo 'delayed';?>'><?php if(substr($task->deadline, 0, 4) > 0) echo $task->deadline;?></td>
<td <?php echo $assignedToClass;?>><?php echo $task->assignedToRealName;?></td>
@@ -132,33 +136,6 @@
<?php common::printIcon('task', 'delete', "projectID=$task->project&taskid=$task->id", '', 'list', '', 'hiddenwin');?>
</td>
</tr>
<?php if(!empty($task->children)):?>
<?php foreach($task->children as $key => $child):?>
<?php $class = $key == 0 ? 'table-child-top' : '';?>
<?php $class .= ($key + 1 == count($task->children)) ? ' table-child-bottom' : '';?>
<tr class='text-center table-children <?php echo $class;?>' data-id='<?php echo $groupIndex;?>'>
<td><?php echo $child->id;?></td>
<td>
<span class='<?php echo 'pri' . zget($lang->task->priList, $child->pri, $task->pri)?>'><?php echo zget($lang->task->priList, $child->pri, $child->pri);?></span>
</td>
<td class='text-left'><span class="label"><?php echo $lang->task->childrenAB;?></span> <?php if(!common::printLink('task', 'view', "task=$child->id", $child->name)) echo $child->name;?></td>
<td class='task-<?php echo $child->status;?>'><?php echo $lang->task->statusList[$child->status];?></td>
<td class='<?php if(isset($child->delay)) echo 'delayed';?>'><?php if(substr($child->deadline, 0, 4) > 0) echo $child->deadline;?></td>
<td <?php echo $assignedToClass;?>><?php echo $child->assignedToRealName;?></td>
<td><?php echo $users[$child->finishedBy];?></td>
<td><?php echo $child->estimate;?></td>
<td><?php echo $child->consumed;?></td>
<td><?php echo $child->left;?></td>
<td class='text-left'><?php echo $child->progress . '%';?></td>
<td><?php echo $lang->task->typeList[$child->type];?></td>
<td>
<?php common::printIcon('task', 'edit', "taskid=$child->id", '', 'list');?>
<?php common::printIcon('task', 'delete', "projectID=$child->project&taskid=$child->id", '', 'list', '', 'hiddenwin');?>
</td>
</tr>
<?php $i++;?>
<?php endforeach;?>
<?php endif;?>
<?php $i++;?>
<?php endforeach;?>
<?php if($i != 0):?>
+1
View File
@@ -15,6 +15,7 @@
<?php include '../../common/view/sortable.html.php';?>
<?php js::set('moduleID', ($type == 'byModule' ? $param : 0));?>
<?php js::set('productID', ($type == 'byProduct' ? $param : 0));?>
<?php js::set('branchID', ($type == 'byBranch' ? (int)$param : ''));?>
<?php js::set('confirmUnlinkStory', $lang->project->confirmUnlinkStory)?>
<div id='featurebar'>
<ul class='nav'>
+1 -1
View File
@@ -83,7 +83,7 @@ js::set('browseType', $browseType);
<?php foreach($task->children as $key => $child):?>
<?php $class = $key == 0 ? ' table-child-top' : '';?>
<?php $class .= ($key + 1 == count($task->children)) ? ' table-child-bottom' : '';?>
<tr class='text-center table-children<?php echo $class;?> parent-<?php echo $task->id;?>' data-id='<?php echo $child->id?>' data-status='<?php echo $task->status?>' data-estimate='<?php echo $task->estimate?>' data-consumed='<?php echo $task->consumed?>' data-left='<?php echo $task->left?>'>
<tr class='text-center table-children<?php echo $class;?> parent-<?php echo $task->id;?>' data-id='<?php echo $child->id?>' data-status='<?php echo $child->status?>' data-estimate='<?php echo $child->estimate?>' data-consumed='<?php echo $child->consumed?>' data-left='<?php echo $child->left?>'>
<?php foreach($customFields as $field) $this->task->printCell($field, $child, $users, $browseType, $branchGroups, $modulePairs, $useDatatable ? 'datatable' : 'table', true);?>
</tr>
<?php endforeach;?>
+25 -1
View File
@@ -33,7 +33,31 @@ $(document).on('mousedown', 'select', function()
}
$(this).val(value);
}
})
});
$(document).keydown(function(event)
{
if(event.ctrlKey && event.keyCode == 38)
{
event.stopPropagation();
event.preventDefault();
selectFocusJump('up');
}
else if(event.ctrlKey && event.keyCode == 40)
{
event.stopPropagation();
event.preventDefault();
selectFocusJump('down');
}
else if(event.keyCode == 38)
{
inputFocusJump('up');
}
else if(event.keyCode == 40)
{
inputFocusJump('down');
}
});
if(navigator.userAgent.indexOf("Firefox") < 0)
{
+1 -1
View File
@@ -90,4 +90,4 @@ $(document).on('change', 'select', function()
$(this).trigger("chosen:updated");
$(this).trigger("change");
}
})
});
+4 -3
View File
@@ -481,6 +481,7 @@ class storyModel extends model
->get();
if(isset($story->plan) and is_array($story->plan)) $story->plan = trim(join(',', $story->plan), ',');
if(empty($_POST['product'])) $story->branch = $oldStory->branch;
if(empty($_POST['branch'])) $story->branch = 0;
$this->dao->update(TABLE_STORY)
->data($story)
@@ -1672,7 +1673,7 @@ class storyModel extends model
->leftJoin(TABLE_PRODUCT)->alias('t4')->on('t2.product = t4.id')
->where('t1.project')->eq((int)$projectID)
->beginIF($type == 'byProduct')->andWhere('t1.product')->eq($param)->fi()
->beginIF($type == 'byBrach')->andWhere('t2.branch')->eq($param)->fi()
->beginIF($type == 'byBranch')->andWhere('t2.branch')->eq($param)->fi()
->beginIF($type == 'byModule' and $param)->andWhere('t2.module')->in($modules)->fi()
->andWhere('t2.deleted')->eq(0)
->orderBy($orderBy)
@@ -2512,13 +2513,13 @@ class storyModel extends model
$history = $this->action->getHistory($actionID);
$action->history = isset($history[$actionID]) ? $history[$actionID] : array();
$action->appendLink = '';
if(strpos($action->extra, ':')!== false)
if(strpos($action->extra, ':') !== false)
{
list($extra, $id) = explode(':', $action->extra);
$action->extra = $extra;
if($id)
{
$name = $this->dao->select('title')->from(TABLE_STORY)->where('id')->eq($id)->fetch('title');
$name = $this->dao->select('title')->from(TABLE_STORY)->where('id')->eq($id)->fetch('title');
if($name) $action->appendLink = html::a(zget($this->config->mail, 'domain', common::getSysURL()) . helper::createLink($action->objectType, 'view', "id=$id"), "#$id " . $name);
}
}
+4 -2
View File
@@ -173,10 +173,12 @@ $config->task->datatable->fieldList['closedReason']['fixed'] = 'no';
$config->task->datatable->fieldList['closedReason']['width'] = '80';
$config->task->datatable->fieldList['closedReason']['required'] = 'no';
$config->task->datatable->fieldList['story']['title'] = 'story';
global $lang;
$config->task->datatable->fieldList['story']['title'] = "storyAB";
$config->task->datatable->fieldList['story']['fixed'] = 'no';
$config->task->datatable->fieldList['story']['width'] = '80';
$config->task->datatable->fieldList['story']['width'] = '40';
$config->task->datatable->fieldList['story']['required'] = 'no';
$config->task->datatable->fieldList['story']['name'] = $lang->task->story;
$config->task->datatable->fieldList['mailto']['title'] = 'mailto';
$config->task->datatable->fieldList['mailto']['fixed'] = 'no';
+35 -5
View File
@@ -786,11 +786,18 @@ class task extends control
{
$teams = array_keys($task->team);
$task->openedBy = $this->task->getNextUser($teams, $task->assignedTo);
$task->nextBy = $this->task->getNextUser($teams, $task->assignedTo);
$task->myConsumed = $this->dao->select('consumed')->from(TABLE_TEAM)->where('task')->eq($taskID)->andWhere('account')->eq($task->assignedTo)->fetch('consumed');
$lastAccount = end($teams);
if($lastAccount != $task->assignedTo) $members = $this->task->getMemberPairs($task);
if($lastAccount != $task->assignedTo)
{
$members = $this->task->getMemberPairs($task);
}
else
{
$task->nextBy = $task->openedBy;
}
}
$this->view->title = $this->view->project->name . $this->lang->colon .$this->lang->task->finish;
@@ -1217,8 +1224,6 @@ class task extends control
}
$task->progress .= '%';
if($task->parent) $task->name = '[' . $taskLang->childrenAB . '] ' . $task->name;
}
}
else
@@ -1235,11 +1240,33 @@ class task extends control
$relatedStoryIdList = array();
foreach($tasks as $task) $relatedStoryIdList[$task->story] = $task->story;
/* Get team for multiple task. */
$taskTeam = $this->dao->select('*')->from(TABLE_TEAM)->where('task')->in(array_keys($tasks))->fetchGroup('task');
if(!empty($taskTeam))
{
foreach($taskTeam as $taskID => $team) $tasks[$taskID]->team = $team;
}
/* Get related objects title or names. */
$relatedStories = $this->dao->select('id,title')->from(TABLE_STORY) ->where('id')->in($relatedStoryIdList)->fetchPairs();
$relatedStories = $this->dao->select('id,title')->from(TABLE_STORY)->where('id')->in($relatedStoryIdList)->fetchPairs();
$relatedFiles = $this->dao->select('id, objectID, pathname, title')->from(TABLE_FILE)->where('objectType')->eq('task')->andWhere('objectID')->in(@array_keys($tasks))->andWhere('extra')->ne('editor')->fetchGroup('objectID');
$relatedModules = $this->loadModel('tree')->getTaskOptionMenu($projectID);
$children = $this->dao->select('*')->from(TABLE_TASK)->where('deleted')->eq(0)->andWhere('parent')->in(array_keys($tasks))->fetchGroup('parent', 'id');
if(!empty($children))
{
$position = 0;
foreach($tasks as $task)
{
$position ++;
if(isset($children[$task->id]))
{
array_splice($tasks, $position, 0, $children[$task->id]);
$position += count($children[$task->id]);
}
}
}
foreach($tasks as $task)
{
if($this->post->fileType == 'csv')
@@ -1266,6 +1293,9 @@ class task extends control
if(isset($users[$task->closedBy])) $task->closedBy = $users[$task->closedBy];
if(isset($users[$task->lastEditedBy])) $task->lastEditedBy = $users[$task->lastEditedBy];
if(!empty($task->parent)) $task->name = '[' . $taskLang->childrenAB . '] ' . $task->name;
if(!empty($task->team)) $task->name = '[' . $taskLang->multipleAB . '] ' . $task->name;
$task->openedDate = substr($task->openedDate, 0, 10);
$task->assignedDate = substr($task->assignedDate, 0, 10);
$task->finishedDate = substr($task->finishedDate, 0, 10);
+24 -1
View File
@@ -153,5 +153,28 @@ $(function()
if($.cookie('zeroTask') == 'true') toggleZeroTaskStory();
if(storyID != 0) setStoryRelated(0);
})
$(document).keydown(function(event)
{
if(event.ctrlKey && event.keyCode == 38)
{
event.stopPropagation();
event.preventDefault();
selectFocusJump('up');
}
else if(event.ctrlKey && event.keyCode == 40)
{
event.stopPropagation();
event.preventDefault();
selectFocusJump('down');
}
else if(event.keyCode == 38)
{
inputFocusJump('up');
}
else if(event.keyCode == 40)
{
inputFocusJump('down');
}
});
});
+2 -1
View File
@@ -44,4 +44,5 @@ $(document).on('change', 'select', function()
$(this).trigger("chosen:updated");
$(this).trigger("change");
}
})
});
+5
View File
@@ -24,6 +24,11 @@ function loadAll(projectID)
loadProjectStories(projectID);
loadProjectMembers(projectID);
}
else
{
$('#project').val(oldProjectID);
$("#project").trigger("chosen:updated");
}
}
/**
+2
View File
@@ -45,6 +45,7 @@ $lang->task->project = $lang->projectCommon;
$lang->task->module = 'Module';
$lang->task->moduleAB = 'Module';
$lang->task->story = 'Story';
$lang->task->storyAB = 'Story';
$lang->task->storySpec = 'Story Description';
$lang->task->storyVerify = 'Acceptance';
$lang->task->name = 'Name';
@@ -103,6 +104,7 @@ $lang->task->transferTo = 'Transfer To';
$lang->task->children = 'Child';
$lang->task->childrenAB = 'Child';
$lang->task->parent = 'Parent Task';
$lang->task->parentAB = 'Parent Task';
$lang->task->lblPri = 'P';
$lang->task->lblHour = '(h)';
$lang->task->deniedNotice = 'This task can only be started by the first user in the team.';
+2
View File
@@ -45,6 +45,7 @@ $lang->task->project = '所属' . $lang->projectCommon;
$lang->task->module = '所属模块';
$lang->task->moduleAB = '模块';
$lang->task->story = '相关需求';
$lang->task->storyAB = '需求';
$lang->task->storySpec = '需求描述';
$lang->task->storyVerify = '验收标准';
$lang->task->name = '任务名称';
@@ -103,6 +104,7 @@ $lang->task->transferTo = '转交给';
$lang->task->children = '子任务';
$lang->task->childrenAB = '子';
$lang->task->parent = '父任务';
$lang->task->parentAB = '父';
$lang->task->lblPri = 'P';
$lang->task->lblHour = '(h)';
$lang->task->deniedNotice = '此任务只允许由团队第一人开始。';
+41 -22
View File
@@ -259,7 +259,7 @@ class taskModel extends model
{
if(!$taskID) return true;
$tasks = $this->dao->select('`id`,`estimate`,`consumed`,`left`')->from(TABLE_TASK)->where('parent')->eq($taskID)->fetchAll('id');
$tasks = $this->dao->select('`id`,`estimate`,`consumed`,`left`')->from(TABLE_TASK)->where('parent')->eq($taskID)->andWhere('status')->ne('cancel')->fetchAll('id');
if(empty($tasks)) return true;
$estimate = 0;
@@ -666,7 +666,7 @@ class taskModel extends model
if($this->post->left == 0)
{
$task->status = 'done';
$task->finishedBy = $this->app->user->account;
$task->finishedBy = $oldTask->openedBy; // Fix bug#1341
$task->finishedDate = helper::now();
}
else
@@ -850,20 +850,24 @@ class taskModel extends model
$this->dao->update(TABLE_TASK)->data($newTask)->where('id')->eq((int)$taskID)->exec();
if($task->assignedTo != $teams[count($teams) - 1]) return common::createChanges($task, $newTask);
$data->assignedTo = $task->openedBy; // Fix bug#1345
}
}
$this->dao->update(TABLE_TASK)->data($data)->where('id')->eq($taskID)->exec();
$oldTask = new stdClass();
$oldTask->consumed = $task->consumed;
$oldTask->left = $task->left;
$oldTask->status = $oldStatus;
$oldTask->consumed = $task->consumed;
$oldTask->left = $task->left;
$oldTask->status = $oldStatus;
$oldTask->assignedTo = $task->assignedTo;
$newTask = new stdClass();
$newTask->left = $left;
$newTask->consumed = $task->consumed + $consumed;
$newTask->status = $task->status;
$newTask->left = $left;
$newTask->consumed = $task->consumed + $consumed;
$newTask->status = $task->status;
$newTask->assignedTo = $data->assignedTo;
$changes = common::createChanges($oldTask, $newTask);
if(!empty($actionID)) $this->action->logHistory($actionID, $changes);
@@ -932,7 +936,8 @@ class taskModel extends model
$this->dao->update(TABLE_TASK)->data($newTask)->where('id')->eq((int)$taskID)->exec();
if($oldTask->assignedTo != $teams[count($teams) - 1]) return common::createChanges($oldTask, $newTask);
$task->consumed = $myTime->consumed;
$task->consumed = $myTime->consumed;
$task->assignedTo = $oldTask->openedBy; // Fix bug#1345
}
if($task->finishedDate == substr($now, 0, 10)) $task->finishedDate = $now;
@@ -1030,9 +1035,10 @@ class taskModel extends model
/**
* Cancel a task.
*
* @param int $taskID
* @param int $taskID
*
* @access public
* @return void
* @return array
*/
public function cancel($taskID)
{
@@ -1059,9 +1065,10 @@ class taskModel extends model
/**
* Activate a task.
*
* @param int $taskID
* @param int $taskID
*
* @access public
* @return void
* @return array
*/
public function activate($taskID)
{
@@ -1100,8 +1107,9 @@ class taskModel extends model
/**
* Get task info by Id.
*
* @param int $taskID
* @param bool $setImgSize
* @param int $taskID
* @param bool $setImgSize
*
* @access public
* @return object|bool
*/
@@ -1211,8 +1219,12 @@ class taskModel extends model
->leftJoin(TABLE_USER)->alias('t3')->on('t1.assignedTo = t3.account')
->leftJoin(TABLE_TEAM)->alias('t4')->on('t1.id = t4.task')
->where('t1.project')->eq((int)$projectID)
->andWhere('t1.parent', $type == 'myinvolved')->eq(0)
->beginIF($type == 'myinvolved')->orWhere('t4.account')->eq($this->app->user->account)->markRight(1)->fi()
->beginIF(!in_array($type, array('assignedtome', 'myinvolved')))->andWhere('t1.parent')->eq(0)->fi()
->beginIF($type == 'myinvolved')
->andWhere('t4.account', true)->eq($this->app->user->account)
->orWhere('t1.assignedTo')->eq($this->app->user->account)
->orWhere('t1.finishedby')->eq($this->app->user->account)
->markRight(1)->fi()
->beginIF($productID)->andWhere('t2.product')->eq((int)$productID)->fi()
->beginIF($type == 'undone')->andWhere("(t1.status = 'wait' or t1.status ='doing')")->fi()
->beginIF($type == 'needconfirm')->andWhere('t2.version > t1.storyVersion')->andWhere("t2.status = 'active'")->fi()
@@ -1225,7 +1237,7 @@ class taskModel extends model
->orderBy('t1.`parent`,' . $orderBy)
->page($pager)
->fetchAll('id');
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'task', ($productID or $type == 'needconfirm' or $type == 'myinvolved') ? false : true);
if(empty($tasks)) return array();
@@ -2025,7 +2037,7 @@ class taskModel extends model
$class = '';
if($id == 'status') $class .= ' task-' . $task->status;
if($id == 'id') $class .= ' cell-id';
if($id == 'name' or $id == 'story') $class .= ' text-left';
if($id == 'name') $class .= ' text-left';
if($id == 'deadline' and isset($task->delay)) $class .= ' delayed';
if($id == 'assignedTo' && $task->assignedTo == $account) $class .= ' red';
@@ -2041,8 +2053,8 @@ class taskModel extends model
echo $canView ? html::a($taskLink, sprintf('%03d', $task->id)) : sprintf('%03d', $task->id);
break;
case 'pri':
echo "<span class='pri" . zget($this->lang->task->priList, $task->pri, $task->pri) . "'>";
echo $task->pri == '0' ? '' : zget($this->lang->task->priList, $task->pri, $task->pri);
echo "<span class='pri" . zget(array_keys($this->lang->task->priList), $task->pri, $task->pri) . "'>";
echo $task->pri == '0' ? '' : zget(array_keys($this->lang->task->priList), $task->pri, $task->pri);
echo "</span>";
break;
case 'name':
@@ -2118,7 +2130,14 @@ class taskModel extends model
case 'story':
if(!empty($task->storyID))
{
if(!common::printLink('story', 'view', "storyid=$task->storyID", $task->storyTitle)) echo $task->storyTitle;
if(common::hasPriv('story', 'view'))
{
echo html::a(helper::createLink('story', 'view', "storyid=$task->storyID", 'html', true), "<i class='icon icon-{$this->lang->icons['story']}'></i>", '', "class='iframe' title='{$task->storyTitle}'");
}
else
{
echo $task->storyTitle;
}
}
break;
case 'mailto':
+1
View File
@@ -15,6 +15,7 @@
<?php include '../../common/view/kindeditor.html.php';?>
<?php js::set('oldStoryID', $task->story); ?>
<?php js::set('oldAssignedTo', $task->assignedTo); ?>
<?php js::set('oldProjectID', $task->project); ?>
<?php js::set('confirmChangeProject', $lang->task->confirmChangeProject); ?>
<?php js::set('changeProjectConfirmed', false); ?>
<form class='form-condensed' method='post' enctype='multipart/form-data' target='hiddenwin' id='dataform'>
+1 -1
View File
@@ -38,7 +38,7 @@
</tr>
<tr>
<th><?php echo empty($task->team) ? $lang->task->assign : $lang->task->transferTo;?></th>
<td><?php echo html::select('assignedTo', $members, $task->openedBy, "class='form-control chosen'");?></td><td></td>
<td><?php echo html::select('assignedTo', $members, $task->nextBy, "class='form-control chosen'");?></td><td></td>
</tr>
<tr>
<th><?php echo $lang->task->finishedDate;?></th>
+1 -1
View File
@@ -19,7 +19,7 @@ $config->testcase->export->listFields = array('type', 'stage', 'pri', 'status'
$config->testcase->exportFields = '
id, product, branch, module, story,
title, precondition, stepDesc, stepExpect, keywords,
title, precondition, stepDesc, stepExpect, real, keywords,
pri, type, stage, status, bugsAB, resultsAB, stepNumberAB, lastRunResult, openedBy, openedDate,
lastEditedBy, lastEditedDate, version, linkCase';
+17 -2
View File
@@ -1106,6 +1106,17 @@ class testcase extends control
}
}
$stmt = $this->dao->select('*')->from(TABLE_TESTRESULT)
->where('`case`')->in(array_keys($cases))
->beginIF($taskID)->andWhere('run')->eq($taskID)->fi()
->orderBy('id_desc')
->query();
$results = array();
while($result = $stmt->fetch())
{
if(!isset($results[$result->case])) $results[$result->case] = unserialize($result->stepResults);
}
/* Get users, products and projects. */
$users = $this->loadModel('user')->getPairs('noletter');
$products = $this->loadModel('product')->getPairs('nocode');
@@ -1134,7 +1145,7 @@ class testcase extends control
$relatedModules = $this->dao->select('id, name')->from(TABLE_MODULE)->where('id')->in($relatedModuleIdList)->fetchPairs();
$relatedStories = $this->dao->select('id,title')->from(TABLE_STORY) ->where('id')->in($relatedStoryIdList)->fetchPairs();
$relatedCases = $this->dao->select('id, title')->from(TABLE_CASE)->where('id')->in($relatedCaseIdList)->fetchPairs();
$relatedSteps = $this->dao->select('parent,`case`,version,type,`desc`,expect')->from(TABLE_CASESTEP)->where('`case`')->in(@array_keys($cases))->orderBy('version desc,id')->fetchGroup('case');
$relatedSteps = $this->dao->select('id,parent,`case`,version,type,`desc`,expect')->from(TABLE_CASESTEP)->where('`case`')->in(@array_keys($cases))->orderBy('version desc,id')->fetchGroup('case', 'id');
$relatedModules = array('0' => '/') + $relatedModules;
$cases = $this->testcase->appendData($cases);
@@ -1142,6 +1153,9 @@ class testcase extends control
{
$case->stepDesc = '';
$case->stepExpect = '';
$case->real = '';
$result = isset($results[$case->id]) ? $results[$case->id] : array();
if($case->lastRunResult == 'fail' and !isset($relatedSteps[$case->id]) and !empty($result)) $case->real = $result[0]['real'];
if(isset($relatedSteps[$case->id]))
{
$i = $childId = 0;
@@ -1162,6 +1176,7 @@ class testcase extends control
$sign = (in_array($this->post->fileType, array('html', 'xml'))) ? '<br />' : "\n";
$case->stepDesc .= $stepId . ". " . $step->desc . $sign;
$case->stepExpect .= $stepId . ". " . $step->expect . $sign;
if($case->lastRunResult == 'fail') $case->real .= $stepId . ". " . (isset($result[$step->id]) ? $result[$step->id]['real'] : '') . $sign;
$childId ++;
}
}
@@ -1531,7 +1546,7 @@ class testcase extends control
$num = $out[1];
$sign = $out[2];
$signbit = $sign == '.' ? 1 : 3;
$step = trim(substr($step, strlen($num) + $signbit));
$step = trim(substr($step, strpos($step, $sign) + $signbit));
if(!empty($step)) $caseStep[$num]['content'] = $step;
$caseStep[$num]['type'] = 'step';
}
+24
View File
@@ -57,6 +57,30 @@ $(document).ready(function()
$(this).val(value);
}
});
$(document).keydown(function(event)
{
if(event.ctrlKey && event.keyCode == 38)
{
event.stopPropagation();
event.preventDefault();
selectFocusJump('up');
}
else if(event.ctrlKey && event.keyCode == 40)
{
event.stopPropagation();
event.preventDefault();
selectFocusJump('down');
}
else if(event.keyCode == 38)
{
inputFocusJump('up');
}
else if(event.keyCode == 40)
{
inputFocusJump('down');
}
});
});
/**
+1 -1
View File
@@ -75,4 +75,4 @@ $(document).on('change', 'select', function()
$(this).trigger("chosen:updated");
$(this).trigger("change");
}
})
});
+4 -1
View File
@@ -1307,7 +1307,10 @@ class testcaseModel extends model
echo $this->lang->testcase->typeList[$case->type];
break;
case 'stage':
foreach(explode(',', trim($case->stage, ',')) as $stage) echo $this->lang->testcase->stageList[$stage] . '<br />';
$stages = '';
foreach(explode(',', trim($case->stage, ',')) as $stage) $stages .= $this->lang->testcase->stageList[$stage] . ',';
$stages = trim($stages, ',');
echo "<span title='$stages'>$stages</span>";
break;
case 'status':
if($case->needconfirm)
+1 -1
View File
@@ -26,7 +26,7 @@
<small class='text-muted'><?php echo html::icon($lang->icons['story']) . ' ' . $story->title ?></small>
<?php endif;?>
<div class='actions'>
<?php echo html::commonButton($lang->pasteText, "data-toggle='myModal' ")?>
<?php echo html::commonButton($lang->pasteText, "data-toggle='myModal'", 'btn btn-primary')?>
<button type="button" class="btn btn-default" data-toggle="customModal"><i class='icon icon-cog'></i></button>
</div>
</div>
+11 -5
View File
@@ -574,7 +574,12 @@ class treeModel extends model
if($startModule) $startModulePath = $startModule->path . '%';
}
$projectModules = $this->getTaskTreeModules($rootID, true);
$projectModules = $this->getTaskTreeModules($rootID, true);
$projectBranches = $this->dao->select('DISTINCT t2.branch')->from(TABLE_PROJECTSTORY)->alias('t1')
->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id')
->where('t1.project')->eq($rootID)
->andWhere('t2.deleted')->eq(0)
->fetchPairs();
/* Get module according to product. */
$products = $this->loadModel('product')->getProductsByProject($rootID);
@@ -602,12 +607,13 @@ class treeModel extends model
while($module = $stmt->fetch())
{
/* if not manage, ignore unused modules. */
if(!isset($projectModules[$module->id])) continue;
$this->buildTree($treeMenu, $module, 'task', $userFunc, $extra);
if(isset($projectModules[$module->id])) $this->buildTree($treeMenu, $module, 'task', $userFunc, $extra);
}
if(isset($treeMenu[0]) and $branch)
if((isset($treeMenu[0]) and $branch) or isset($projectBranches[$branch]))
{
$treeMenu[0] = "<li>" . html::a($link, $branchName, '_self', "id='branch$branch'") . "<ul>{$treeMenu[0]}</ul></li>";
$childMenu = isset($treeMenu[0]) ? "<ul>{$treeMenu[0]}</ul>" : '';
$link = helper::createLink('project', 'story', "project=$rootID&ordery=&status=byBranch&praram=$branch");
if($branchName) $treeMenu[0] = "<li>" . html::a($link, $branchName, '_self', "id='branch$branch'") . "{$childMenu}</li>";
}
$tree .= isset($treeMenu[0]) ? $treeMenu[0] : '';
}
+21
View File
@@ -1938,4 +1938,25 @@ class upgradeModel extends model
}
return true;
}
/**
* Change story field width.
*
* @access public
* @return bool
*/
public function changeStoryWidth()
{
$projectCustom = $this->dao->select('*')->from(TABLE_CONFIG)->where('section')->eq('projectTask')->andWhere('`key`')->in('cols,tablecols')->fetchAll('id');
foreach($projectCustom as $configID => $projectTask)
{
$fields = json_decode($projectTask->value);
foreach($fields as $i => $field)
{
if($field->id == 'story') $field->width = '40px';
}
$this->dao->update(TABLE_CONFIG)->set('value')->eq(json_encode($fields))->where('id')->eq($configID)->exec();
}
return true;
}
}
+5 -5
View File
@@ -61,11 +61,11 @@ if(empty($config->notMd5Pwd))js::import($jsRoot . 'md5.js');
<span><?php echo $lang->user->loginWithDemoUser; ?></span>
<?php
$sign = $config->requestType == 'GET' ? '&' : '?';
if(isset($demoUsers['productManager'])) echo html::a(inlink('login') . $sign . "account=productManager&password=123456", $demoUsers['productManager'], 'hiddenwin');
if(isset($demoUsers['projectManager'])) echo html::a(inlink('login') . $sign . "account=projectManager&password=123456", $demoUsers['projectManager'], 'hiddenwin');
if(isset($demoUsers['testManager'])) echo html::a(inlink('login') . $sign . "account=testManager&password=123456", $demoUsers['testManager'], 'hiddenwin');
if(isset($demoUsers['dev1'])) echo html::a(inlink('login') . $sign . "account=dev1&password=123456", $demoUsers['dev1'], 'hiddenwin');
if(isset($demoUsers['tester1'])) echo html::a(inlink('login') . $sign . "account=tester1&password=123456", $demoUsers['tester1'], 'hiddenwin');
foreach($demoUsers as $demoUser => $demoRealname)
{
if(strpos($this->app->company->admins, ",{$demoUser},") !== false) continue;
echo html::a(inlink('login') . $sign . "account={$demoUser}&password=" . md5(md5('123456') + $this->session->rand), $demoRealname, 'hiddenwin');
}
?>
</div>
<?php endif;?>
+58
View File
@@ -1941,6 +1941,51 @@ function revertModuleCookie()
}
}
/**
* Focus move up or down for input.
*
* @param type up|down
*/
function inputFocusJump(type){
var hasFocus = $('input').is(':focus');
if(hasFocus)
{
var title = $("input:focus").attr('name').replace(/\[\d]/g, '');
var $input = $(":input[name^=" + title + "]:text:not(:disabled):not([name*='%'])");
var num = $input.length;
var index = parseInt($("input:focus").attr('name').replace(/[^0-9]/g, ''));
var nextIndex = type == 'down' ? index + 1 : index - 1;
if(nextIndex < num && nextIndex >= 0)
{
$input[nextIndex].focus();
}
}
}
/**
* Focus move up or down for select.
*
* @param type
*/
function selectFocusJump(type)
{
var hasFocus = $('select').is(':focus');
if(hasFocus)
{
var title = $("select:focus").attr('name').replace(/\[\d]/g, '');
var $select = $("select[name^=" + title + "]:not([name*='%'])");
var num = $select.length;
var index = parseInt($("select:focus").attr('name').replace(/[^0-9]/g, ''));
var nextIndex = type == 'down' ? index + 1 : index - 1;
if(nextIndex < num && nextIndex >= 0)
{
$select[nextIndex].focus();
}
}
}
/* Ping the server every some minutes to keep the session. */
needPing = true;
@@ -1997,4 +2042,17 @@ $(document).ready(function()
initHelpLink();
checkTutorial();
revertModuleCookie();
/* Adjust for dropdown position. */
$('li.dropdown-submenu').mouseover(function()
{
$('li.dropdown-submenu > .dropdown-menu').each(function()
{
if($(this).css('display') == 'block')
{
var topPosition = $(this).offset().top;
if(topPosition < 0) $(this).css('bottom', Number($(this).css('bottom').replace('px', '')) + topPosition);
}
})
})
});