This commit is contained in:
tianshujie98
2021-02-20 16:02:03 +08:00
102 changed files with 1175 additions and 269 deletions
+14 -14
View File
@@ -172,20 +172,20 @@ $filter->program->pgmbrowse->cookie['showClosed'] = 'code';
$filter->program->export->cookie['checkedItem'] = 'reg::checked';
$filter->program->ajaxgetpgmdropmenu->cookie['showClosed'] = 'code';
$filter->project->default->cookie['lastProject'] = 'int';
$filter->project->default->cookie['lastPRJ'] = 'int';
$filter->project->default->cookie['projectMode'] = 'code';
$filter->project->story->cookie['storyModuleParam'] = 'int';
$filter->project->story->cookie['storyPreProjectID'] = 'int';
$filter->project->story->cookie['storyProductParam'] = 'int';
$filter->project->story->cookie['storyBranchParam'] = 'reg::checked';
$filter->project->story->cookie['projectStoryOrder'] = 'reg::orderBy';
$filter->project->task->cookie['moduleBrowseParam'] = 'int';
$filter->project->task->cookie['preProjectID'] = 'int';
$filter->project->task->cookie['productBrowseParam'] = 'int';
$filter->project->task->cookie['projectTaskOrder'] = 'reg::orderBy';
$filter->project->task->cookie['windowWidth'] = 'int';
$filter->project->export->cookie['checkedItem'] = 'reg::checked';
$filter->project->default->cookie['lastProject'] = 'int';
$filter->project->default->cookie['lastPRJ'] = 'int';
$filter->project->default->cookie['projectMode'] = 'code';
$filter->project->story->cookie['storyModuleParam'] = 'int';
$filter->project->story->cookie['storyPreProjectID'] = 'int';
$filter->project->story->cookie['storyProductParam'] = 'int';
$filter->project->story->cookie['storyBranchParam'] = 'reg::checked';
$filter->project->story->cookie['projectStoryOrder'] = 'reg::orderBy';
$filter->project->task->cookie['moduleBrowseParam'] = 'int';
$filter->project->task->cookie['preProjectID'] = 'int';
$filter->project->task->cookie['productBrowseParam'] = 'int';
$filter->project->task->cookie['projectTaskOrder'] = 'reg::orderBy';
$filter->project->task->cookie['windowWidth'] = 'int';
$filter->project->export->cookie['checkedItem'] = 'reg::checked';
$filter->qa->default->cookie['lastProduct'] = 'int';
$filter->qa->default->cookie['preBranch'] = 'int';
+522
View File
@@ -0,0 +1,522 @@
ALTER TABLE `zt_project` DROP `isCat`, DROP `catID`;
ALTER TABLE `zt_project` ADD `project` mediumint(8) NOT NULL DEFAULT 0 AFTER `id`;
ALTER TABLE `zt_project` ADD `model` char(30) NOT NULL AFTER `project`;
ALTER TABLE `zt_project` CHANGE `type` `type` char(30) NOT NULL DEFAULT 'sprint' AFTER `model`;
ALTER TABLE `zt_project` CHANGE `acl` `acl` char(30) NOT NULL DEFAULT 'open';
ALTER TABLE `zt_project` ADD `product` varchar(20) NOT NULL DEFAULT 'single' AFTER `type`;
ALTER TABLE `zt_project` ADD `lifetime` char(30) NOT NULL AFTER `product`;
ALTER TABLE `zt_project` ADD `budget` varchar(30) NOT NULL DEFAULT '0' AFTER `lifetime`;
ALTER TABLE `zt_project` ADD `budgetUnit` char(30) NOT NULL DEFAULT 'CNY' AFTER `budget`;
ALTER TABLE `zt_project` ADD `percent` float unsigned NOT NULL DEFAULT '0' AFTER `budgetUnit`;
ALTER TABLE `zt_project` ADD `path` varchar(255) NOT NULL AFTER `parent`;
ALTER TABLE `zt_project` ADD `grade` tinyint unsigned NOT NULL AFTER `path`;
ALTER TABLE `zt_project` ADD `auth` char(30) NOT NULL AFTER `percent`;
ALTER TABLE `zt_project` ADD `milestone` enum('0','1') NOT NULL default '0' AFTER `percent`;
ALTER TABLE `zt_project` ADD `attribute` varchar(30) NOT NULL DEFAULT '' AFTER `budgetUnit`;
ALTER TABLE `zt_project` ADD `realBegan` date NOT NULL AFTER `end`;
ALTER TABLE `zt_project` ADD `realEnd` date NOT NULL AFTER `realBegan`;
ALTER TABLE `zt_project` ADD `version` smallint(6) NOT NULL AFTER `desc`;
ALTER TABLE `zt_project` ADD `parentVersion` smallint(6) NOT NULL AFTER `version`;
ALTER TABLE `zt_project` ADD `planDuration` int(11) NOT NULL AFTER `parentVersion`;
ALTER TABLE `zt_project` ADD `realDuration` int(11) NOT NULL AFTER `planDuration`;
ALTER TABLE `zt_project` ADD `output` text NOT NULL AFTER `milestone`;
ALTER TABLE `zt_product` ADD `program` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_product` ADD `bind` enum('0','1') NOT NULL DEFAULT '0' AFTER `code`;
ALTER TABLE `zt_task` ADD `PRJ` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_doc` ADD `PRJ` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_story` ADD `PRJ` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_repo` ADD `product` varchar(255) NOT NULL AFTER `id`;
ALTER TABLE `zt_bug` ADD `PRJ` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_case` ADD `PRJ` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_testtask` ADD `PRJ` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_testreport` ADD `PRJ` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_testsuite` ADD `PRJ` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_build` ADD `PRJ` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_release` ADD `PRJ` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_group` ADD `PRJ` mediumint NOT NULL AFTER `id`;
INSERT INTO `zt_group` (`name`, `role`, `desc`) VALUES ('项目管理员', 'PRJAdmin', '项目管理员可以维护项目的权限');
ALTER TABLE `zt_usergroup` ADD `PRJ` text NOT NULL;
ALTER TABLE `zt_userview` ADD `programs` mediumtext NOT NULL AFTER `account`;
ALTER TABLE `zt_userview` ADD `sprints` mediumtext NOT NULL AFTER `programs`;
ALTER TABLE `zt_user` ADD `company` mediumint unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_user` ADD `type` char(30) NOT NULL default 'inside' AFTER `account`;
ALTER TABLE `zt_user` ADD `nature` text NOT NULL AFTER `zipcode`;
ALTER TABLE `zt_user` ADD `analysis` text NOT NULL AFTER `nature`;
ALTER TABLE `zt_user` ADD `strategy` text NOT NULL AFTER `analysis`;
ALTER TABLE `zt_user` CHANGE `avatar` `avatar` text NOT NULL AFTER `commiter`;
REPLACE INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system','custom','','hourPoint','1');
REPLACE INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'custom', '', 'URSR', '3');
REPLACE INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'program', '', 'unitList', 'CNY,USD');
REPLACE INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'program', '', 'defaultCurrency', 'CNY');
ALTER TABLE `zt_config` MODIFY COLUMN `value` longtext NOT NULL AFTER `key`;
-- DROP TABLE IF EXISTS `zt_stage`;
CREATE TABLE IF NOT EXISTS `zt_stage` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`percent` varchar(255) NOT NULL,
`type` varchar(255) NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
`editedBy` varchar(30) NOT NULL,
`editedDate` datetime NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_stakeholder`;
CREATE TABLE IF NOT EXISTS `zt_stakeholder` (
`id` mediumint(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`objectID` mediumint(8) NOT NULL,
`objectType` char(30) NOT NULL,
`user` char(30) NOT NULL,
`type` char(30) NOT NULL,
`key` enum('0','1') NOT NULL,
`from` char(30) NOT NULL,
`createdBy` char(30) NOT NULL,
`createdDate` date NOT NULL,
`editedBy` char(30) NOT NULL,
`editedDate` date NOT NULL,
`deleted` enum('0','1') NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_expect`;
CREATE TABLE IF NOT EXISTS `zt_expect` (
`id` mediumint(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`userID` mediumint(8) NOT NULL,
`PRJ` mediumint(8) NOT NULL DEFAULT 0,
`expect` text NOT NULL,
`progress` text NOT NULL,
`createdBy` char(30) NOT NULL,
`createdDate` date NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
REPLACE INTO `zt_stage` (`name`,`percent`,`type`,`createdBy`,`createdDate`,`editedBy`,`editedDate`,`deleted`) VALUES
('需求','10','request','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
('设计','10','design','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
('开发','50','dev','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
('测试','15','qa','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
('发布','10','release','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
('总结评审','5','review','admin','2020-02-08 21:08:45','admin','2020-02-12 13:50:27','0');
-- DROP TABLE IF EXISTS `zt_design`;
CREATE TABLE IF NOT EXISTS `zt_design` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`PRJ` varchar(255) NOT NULL,
`product` varchar(255) NOT NULL,
`commit` text NOT NULL,
`commitedBy` varchar(30) NOT NULL,
`project` mediumint(9) NOT NULL DEFAULT '0',
`name` varchar(255) NOT NULL,
`status` varchar(30) NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
`editedBy` varchar(30) NOT NULL,
`editedDate` datetime NOT NULL,
`assignedTo` varchar(30) NOT NULL,
`assignedBy` varchar(30) NOT NULL,
`assignedDate` datetime NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
`story` char(30) NOT NULL,
`desc` text NOT NULL,
`version` smallint(6) NOT NULL,
`type` char(30) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `zt_designspec` (
`design` mediumint(8) NOT NULL,
`version` smallint(6) NOT NULL,
`name` varchar(255) NOT NULL,
`desc` text NOT NULL,
`files` varchar(255) NOT NULL,
UNIQUE KEY `design` (`design`,`version`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_issue`;
CREATE TABLE IF NOT EXISTS `zt_issue` (
`id` mediumint(8) UNSIGNED NOT NULL AUTO_INCREMENT,
`resolvedBy` varchar(30) NOT NULL,
`PRJ` varchar(255) NOT NULL,
`title` varchar(255) NOT NULL,
`desc` text NOT NULL,
`pri` char(30) NOT NULL,
`severity` char(30) NOT NULL,
`type` char(30) NOT NULL,
`activity` varchar(255) NOT NULL,
`deadline` date NOT NULL,
`resolution` char(30) NOT NULL,
`resolutionComment` text NOT NULL,
`objectID` varchar(255) NOT NULL,
`resolvedDate` date NOT NULL,
`status` varchar(30) NOT NULL,
`owner` varchar(255) NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
`editedBy` varchar(30) NOT NULL,
`editedDate` datetime NOT NULL,
`activateBy` varchar(30) NOT NULL,
`activateDate` date NOT NULL,
`closedBy` varchar(30) NOT NULL,
`closedDate` date NOT NULL,
`assignedTo` varchar(30) NOT NULL,
`assignedBy` varchar(30) NOT NULL,
`assignedDate` datetime NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `zt_risk` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`PRJ` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
`source` char(30) NOT NULL,
`category` char(30) NOT NULL,
`strategy` char(30) NOT NULL,
`status` varchar(30) NOT NULL DEFAULT 'active',
`impact` char(30) NOT NULL,
`probability` char(30) NOT NULL,
`rate` char(30) NOT NULL,
`pri` char(30) NOT NULL,
`identifiedDate` date NOT NULL,
`prevention` text NOT NULL,
`remedy` text NOT NULL,
`plannedClosedDate` date NOT NULL,
`actualClosedDate` date NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
`editedBy` varchar(30) NOT NULL,
`editedDate` datetime NOT NULL,
`resolution` text NOT NULL,
`resolvedBy` varchar(30) NOT NULL,
`activateBy` varchar(30) NOT NULL,
`activateDate` date NOT NULL,
`assignedTo` varchar(30) NOT NULL,
`cancelBy` varchar(30) NOT NULL,
`cancelDate` date NOT NULL,
`cancelReason` char(30) NOT NULL,
`closedBy` char(30) NOT NULL,
`closedDate` date NOT NULL,
`hangupBy` varchar(30) NOT NULL,
`hangupDate` date NOT NULL,
`trackedBy` varchar(30) NOT NULL,
`trackedDate` date NOT NULL,
`assignedDate` date NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_projectspec`;
CREATE TABLE IF NOT EXISTS `zt_projectspec` (
`project` mediumint(8) NOT NULL,
`version` smallint(6) NOT NULL,
`name` varchar(255) NOT NULL,
`milestone` enum('0','1') NOT NULL DEFAULT '0',
`begin` date NOT NULL,
`end` date NOT NULL,
UNIQUE KEY `project` (`project`,`version`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_budget`;
CREATE TABLE IF NOT EXISTS `zt_budget` (
`id` int(8) NOT NULL AUTO_INCREMENT,
`PRJ` mediumint(8) NOT NULL,
`stage` char(30) NOT NULL,
`subject` mediumint(8) NOT NULL,
`amount` char(30) NOT NULL,
`name` varchar(255) NOT NULL,
`desc` text NOT NULL,
`createdBy` char(30) NOT NULL,
`createdDate` date NOT NULL,
`lastEditedBy` char(30) NOT NULL,
`lastEditedDate` date NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_durationestimation`;
CREATE TABLE IF NOT EXISTS `zt_durationestimation` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`PRJ` mediumint(8) unsigned NOT NULL,
`stage` mediumint(9) NOT NULL,
`workload` varchar(255) NOT NULL,
`worktimeRate` varchar(255) NOT NULL,
`people` varchar(255) NOT NULL,
`startDate` date NOT NULL,
`endDate` date NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
`editedBy` varchar(30) NOT NULL,
`editedDate` datetime NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_workestimation`;
CREATE TABLE IF NOT EXISTS `zt_workestimation` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`PRJ` mediumint(8) unsigned NOT NULL,
`scale` decimal(10, 2) unsigned NOT NULL,
`productivity` decimal(10, 2) unsigned NOT NULL,
`duration` decimal(10, 2) unsigned NOT NULL,
`unitLaborCost` decimal(10, 2) unsigned NOT NULL,
`totalLaborCost` decimal(10, 2) unsigned NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
`editedBy` varchar(30) NOT NULL,
`editedDate` datetime NOT NULL,
`assignedTo` varchar(30) NOT NULL,
`assignedDate` datetime NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
`dayHour` decimal(10,2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `zt_holiday` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL DEFAULT '',
`type` enum('holiday', 'working') NOT NULL DEFAULT 'holiday',
`desc` text NOT NULL,
`year` char(4) NOT NULL,
`begin` date NOT NULL,
`end` date NOT NULL,
PRIMARY KEY (`id`),
KEY `year` (`year`),
KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
ALTER TABLE `zt_task` ADD `design` mediumint(8) unsigned NOT NULL AFTER `module`;
ALTER TABLE `zt_task` ADD `version` smallint(6) NOT NULL AFTER `desc`;
ALTER TABLE `zt_task` ADD `activatedDate` date NOT NULL AFTER `lastEditedDate`;
ALTER TABLE `zt_task` ADD `planDuration` int(11) NOT NULL AFTER `closedDate`;
ALTER TABLE `zt_task` ADD `realDuration` int(11) NOT NULL AFTER `closedDate`;
ALTER TABLE `zt_task` ADD `designVersion` smallint(6) unsigned NOT NULL AFTER `storyVersion`;
ALTER TABLE `zt_burn` ADD `storyPoint` float NOT NULL AFTER `consumed`;
ALTER TABLE `zt_burn` ADD `product` mediumint(8) unsigned NOT NULL DEFAULT '0' AFTER `project`;
-- DROP TABLE IF EXISTS `zt_taskspec`;
CREATE TABLE IF NOT EXISTS `zt_taskspec` (
`task` mediumint(8) NOT NULL,
`version` smallint(6) NOT NULL,
`name` varchar(255) NOT NULL,
`estStarted` date NOT NULL,
`deadline` date NOT NULL,
UNIQUE KEY `task` (`task`,`version`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `zt_weeklyreport`(
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`PRJ` mediumint(8) unsigned NOT NULL,
`weekStart` date NOT NULL,
`pv` float(9,2) NOT NULL,
`ev` float(9,2) NOT NULL,
`ac` float(9,2) NOT NULL,
`sv` float(9,2) NOT NULL,
`cv` float(9,2) NOT NULL,
`staff` smallint(5) unsigned NOT NULL,
`progress` varchar(255) NOT NULL,
`workload` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `week` (`PRJ`,`weekStart`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
ALTER TABLE `zt_block` ADD `type` char(30) NOT NULL AFTER `module`;
ALTER TABLE `zt_block` ADD UNIQUE `account_module_type_order` (`account`, `module`, `type`, `order`), DROP INDEX `accountModuleOrder`;
INSERT INTO `zt_cron` (`m`, `h`, `dom`, `mon`, `dow`, `command`, `remark`, `type`, `buildin`, `status`, `lastTime`) VALUES ('1', '0', '*', '*', '*', 'moduleName=weekly&methodName=computeWeekly', '更新项目周报', 'system', 0, 'normal', '2020-08-27 10:07:53');
ALTER TABLE `zt_story` ADD `URChanged` enum('0','1') NOT NULL DEFAULT '0' AFTER `version`;
ALTER TABLE `zt_team` MODIFY `type` enum('project','task','stage','sprint') NOT NULL DEFAULT 'project' AFTER `root`;
CREATE TABLE IF NOT EXISTS `zt_planstory` (
`plan` mediumint(8) unsigned NOT NULL,
`story` mediumint(8) unsigned NOT NULL,
`order` mediumint(9) NOT NULL,
UNIQUE KEY `unique` (`plan`,`story`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `zt_acl` (
`id` mediumint(9) NOT NULL AUTO_INCREMENT,
`account` char(30) NOT NULL,
`objectType` char(30) NOT NULL,
`objectID` mediumint(9) NOT NULL DEFAULT '0',
`type` char(40) NOT NULL DEFAULT 'whitelist',
`source` char(30) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_searchindex`;
CREATE TABLE IF NOT EXISTS `zt_searchindex` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`objectType` char(20) NOT NULL,
`objectID` mediumint(9) NOT NULL,
`title` text NOT NULL,
`content` text NOT NULL,
`addedDate` datetime NOT NULL,
`editedDate` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `object` (`objectType`,`objectID`),
KEY `addedDate` (`addedDate`),
FULLTEXT KEY `content` (`content`),
FULLTEXT KEY `title` (`title`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_searchdict`;
CREATE TABLE IF NOT EXISTS `zt_searchdict` (
`key` smallint(5) unsigned NOT NULL,
`value` char(3) NOT NULL,
PRIMARY KEY (`key`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
REPLACE INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
(1, 'product', 'dashboard'),
(1, 'projectstory', 'story'),
(1, 'projectstory', 'track'),
(1, 'projectstory', 'view'),
(1, 'projectstory', 'linkStory'),
(1, 'projectstory', 'unLinkStory'),
(1, 'my', 'preference'),
(1, 'my', 'uploadAvatar'),
(1, 'user', 'execution'),
(1, 'user', 'issue'),
(1, 'user', 'risk'),
(1, 'user', 'cropAvatar'),
(1, 'program', 'PRJView'),
(1, 'search', 'index'),
(1, 'search', 'buildIndex'),
(2, 'product', 'dashboard'),
(2, 'projectstory', 'story'),
(2, 'projectstory', 'track'),
(2, 'projectstory', 'view'),
(2, 'my', 'preference'),
(2, 'my', 'uploadAvatar'),
(2, 'user', 'execution'),
(2, 'user', 'issue'),
(2, 'user', 'risk'),
(2, 'user', 'cropAvatar'),
(2, 'search', 'index'),
(3, 'product', 'dashboard'),
(3, 'projectstory', 'story'),
(3, 'projectstory', 'track'),
(3, 'projectstory', 'view'),
(3, 'my', 'preference'),
(3, 'my', 'uploadAvatar'),
(3, 'user', 'execution'),
(3, 'user', 'issue'),
(3, 'user', 'risk'),
(3, 'user', 'cropAvatar'),
(3, 'search', 'index'),
(4, 'product', 'dashboard'),
(4, 'projectstory', 'story'),
(4, 'projectstory', 'track'),
(4, 'projectstory', 'view'),
(4, 'my', 'preference'),
(4, 'my', 'uploadAvatar'),
(4, 'user', 'execution'),
(4, 'user', 'issue'),
(4, 'user', 'risk'),
(4, 'user', 'cropAvatar'),
(4, 'program', 'PRJView'),
(4, 'search', 'index'),
(5, 'product', 'dashboard'),
(5, 'projectstory', 'story'),
(5, 'projectstory', 'track'),
(5, 'projectstory', 'view'),
(5, 'projectstory', 'linkStory'),
(5, 'projectstory', 'unLinkStory'),
(5, 'my', 'preference'),
(5, 'my', 'uploadAvatar'),
(5, 'user', 'execution'),
(5, 'user', 'issue'),
(5, 'user', 'risk'),
(5, 'user', 'cropAvatar'),
(5, 'program', 'PRJView'),
(5, 'search', 'index'),
(6, 'product', 'dashboard'),
(6, 'projectstory', 'story'),
(6, 'projectstory', 'track'),
(6, 'projectstory', 'view'),
(6, 'my', 'preference'),
(6, 'my', 'uploadAvatar'),
(6, 'user', 'execution'),
(6, 'user', 'issue'),
(6, 'user', 'risk'),
(6, 'user', 'cropAvatar'),
(6, 'program', 'PRJView'),
(6, 'search', 'index'),
(7, 'product', 'dashboard'),
(7, 'projectstory', 'story'),
(7, 'projectstory', 'track'),
(7, 'projectstory', 'view'),
(7, 'projectstory', 'linkStory'),
(7, 'projectstory', 'unLinkStory'),
(7, 'my', 'preference'),
(7, 'my', 'uploadAvatar'),
(7, 'user', 'execution'),
(7, 'user', 'issue'),
(7, 'user', 'risk'),
(7, 'user', 'cropAvatar'),
(7, 'program', 'PRJView'),
(7, 'search', 'index'),
(8, 'product', 'dashboard'),
(8, 'projectstory', 'story'),
(8, 'projectstory', 'track'),
(8, 'projectstory', 'view'),
(8, 'my', 'preference'),
(8, 'my', 'uploadAvatar'),
(8, 'user', 'execution'),
(8, 'user', 'issue'),
(8, 'user', 'risk'),
(8, 'user', 'cropAvatar'),
(8, 'program', 'PRJView'),
(8, 'search', 'index'),
(9, 'product', 'dashboard'),
(9, 'projectstory', 'story'),
(9, 'projectstory', 'track'),
(9, 'projectstory', 'view'),
(9, 'projectstory', 'linkStory'),
(9, 'projectstory', 'unLinkStory'),
(9, 'my', 'preference'),
(9, 'my', 'uploadAvatar'),
(9, 'user', 'execution'),
(9, 'user', 'issue'),
(9, 'user', 'risk'),
(9, 'user', 'cropAvatar'),
(9, 'program', 'PRJView'),
(9, 'search', 'index'),
(10, 'product', 'dashboard'),
(10, 'projectstory', 'story'),
(10, 'projectstory', 'track'),
(10, 'projectstory', 'view'),
(10, 'my', 'preference'),
(10, 'my', 'uploadAvatar'),
(10, 'user', 'execution'),
(10, 'user', 'issue'),
(10, 'user', 'risk'),
(10, 'user', 'cropAvatar'),
(10, 'search', 'index'),
(11, 'product', 'dashboard'),
(11, 'projectstory', 'story'),
(11, 'projectstory', 'track'),
(11, 'projectstory', 'view'),
(11, 'my', 'preference'),
(11, 'my', 'uploadAvatar'),
(11, 'user', 'execution'),
(11, 'user', 'issue'),
(11, 'user', 'risk'),
(11, 'user', 'cropAvatar');
INSERT INTO `zt_lang` (`lang`, `module`, `section`, `key`, `value`, `system`) VALUES
('zh-cn', 'custom', 'URSRList', '1', '{\"SRName\":\"\\u7814\\u53d1\\u9700\\u6c42\",\"URName\":\"\\u7528\\u6237\\u9700\\u6c42\"}', '1'),('zh-cn', 'custom', 'URSRList', '2', '{\"SRName\":\"\\u8f6f\\u9700\",\"URName\":\"\\u7528\\u9700\"}', '1'),
('zh-cn', 'custom', 'URSRList', '3', '{\"SRName\":\"\\u6545\\u4e8b\",\"URName\":\"\\u9700\\u6c42\"}', '1'),
('zh-cn', 'custom', 'URSRList', '4', '{\"SRName\":\"\\u6545\\u4e8b\",\"URName\":\"\\u53f2\\u8bd7\"}', '1');
+8 -1
View File
@@ -1733,6 +1733,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
(1,'program','PRJStart'),
(1,'program','PRJSuspend'),
(1,'program','PRJView'),
(1,'program','PRJUpdateOrder'),
(1,'program','PRJWhitelist'),
(1,'program','unbindWhielist'),
(1,'program','unlinkStakeholder'),
@@ -2539,6 +2540,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
(4,'program','PRJProgramTitle'),
(4,'program','PRJStart'),
(4,'program','PRJSuspend'),
(4,'program','PRJUpdateOrder'),
(4,'program','PRJView'),
(4,'program','PRJWhitelist'),
(4,'program','unbindWhielist'),
@@ -2845,6 +2847,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
(5,'program','PRJStart'),
(5,'program','PRJSuspend'),
(5,'program','PRJView'),
(5,'program','PRJUpdateOrder'),
(5,'program','PRJWhitelist'),
(5,'program','unbindWhielist'),
(5,'program','unlinkStakeholder'),
@@ -3138,6 +3141,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
(6,'program','PRJStart'),
(6,'program','PRJSuspend'),
(6,'program','PRJView'),
(6,'program','PRJUpdateOrder'),
(6,'program','PRJWhitelist'),
(6,'program','unbindWhielist'),
(6,'program','unlinkStakeholder'),
@@ -3424,6 +3428,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
(7,'program','PRJStart'),
(7,'program','PRJSuspend'),
(7,'program','PRJView'),
(7,'program','PRJUpdateOrder'),
(7,'program','PRJWhitelist'),
(7,'program','unbindWhielist'),
(7,'program','unlinkStakeholder'),
@@ -3692,6 +3697,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
(8,'program','PRJStart'),
(8,'program','PRJSuspend'),
(8,'program','PRJView'),
(8,'program','PRJUpdateOrder'),
(8,'program','PRJWhitelist'),
(8,'program','unbindWhielist'),
(8,'program','unlinkStakeholder'),
@@ -3970,6 +3976,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
(9,'program','PRJStart'),
(9,'program','PRJSuspend'),
(9,'program','PRJView'),
(9,'program','PRJUpdateOrder'),
(9,'program','PRJWhitelist'),
(9,'program','unbindWhielist'),
(9,'program','unlinkStakeholder'),
@@ -4323,7 +4330,7 @@ INSERT INTO `zt_stage` (`name`,`percent`,`type`,`createdBy`,`createdDate`,`edite
('总结评审','5','review','admin','2020-02-08 21:08:45','admin','2020-02-12 13:50:27','0');
INSERT INTO `zt_lang` (`lang`, `module`, `section`, `key`, `value`, `system`) VALUES
('zh-cn', 'custom', 'URSRList', '1', '{\"SRName\":\"\\u8f6f\\u4ef6\\u9700\\u6c42\",\"URName\":\"\\u7528\\u6237\\u9700\\u6c42\"}', '1'),
('zh-cn', 'custom', 'URSRList', '1', '{\"SRName\":\"\\u7814\\u53d1\\u9700\\u6c42\",\"URName\":\"\\u7528\\u6237\\u9700\\u6c42\"}', '1'),
('zh-cn', 'custom', 'URSRList', '2', '{\"SRName\":\"\\u8f6f\\u9700\",\"URName\":\"\\u7528\\u9700\"}', '1'),
('zh-cn', 'custom', 'URSRList', '3', '{\"SRName\":\"\\u6545\\u4e8b\",\"URName\":\"\\u9700\\u6c42\"}', '1'),
('zh-cn', 'custom', 'URSRList', '4', '{\"SRName\":\"\\u6545\\u4e8b\",\"URName\":\"\\u53f2\\u8bd7\"}', '1');
+15
View File
@@ -662,6 +662,19 @@ class actionModel extends model
if($this->app->user->admin) $condition = 1;
}
/* If is project, select its related. */
$executions = array();
$products = array();
if(is_numeric($projectID))
{
$project = $this->loadModel('program')->getPRJByID($projectID);
if($project->type == 'project')
{
$executions = $this->loadModel('project')->getExecutionPairs($projectID);
$products = $this->loadModel('product')->getProductPairsByProject($projectID);
}
}
$this->loadModel('doc');
$libs = $this->doc->getLibs('all');
$docs = $this->doc->getPrivDocs(array_keys($libs), 0, 'all');
@@ -677,6 +690,8 @@ class actionModel extends model
->beginIF($account != 'all')->andWhere('actor')->eq($account)->fi()
->beginIF(is_numeric($productID))->andWhere('product')->like("%,$productID,%")->fi()
->beginIF(is_numeric($projectID))->andWhere('project')->eq($projectID)->fi()
->beginIF(!empty($executions))->markLeft()->orWhere('project')->in(array_keys($executions))->fi()->markRight()
->beginIF(!empty($products))->markLeft()->orWhere('product')->in(array_keys($products))->fi()->markRight()
->beginIF($productID == 'notzero')->andWhere('product')->gt(0)->andWhere('product')->notlike('%,0,%')->fi()
->beginIF($projectID == 'notzero')->andWhere('project')->gt(0)->fi()
->beginIF($projectID == 'all' or $productID == 'all')->andWhere("IF((objectType!= 'doc' && objectType!= 'doclib'), ($condition), '1=1')")->fi()
+1 -1
View File
@@ -1315,7 +1315,7 @@ class block extends control
$count = isset($this->params->count) ? (int)$this->params->count : 15;
$type = isset($this->params->type) ? $this->params->type : 'all';
$pager = pager::init(0, $count, 1);
$this->view->executionStats = $this->loadModel('project')->getExecutionStats($this->session->PRJ, $type, 0, 0, 30, 'id_asc', $pager);
$this->view->executionStats = $this->loadModel('project')->getExecutionStats($this->session->PRJ, $type, 0, 0, 30, 'id_desc', $pager);
}
/**
+1
View File
@@ -4,3 +4,4 @@
.col-side .chosen-container[id^="resolvedBuild"] {width: 172px!important}
.chosen-choices li.search-choice{word-break: break-all;}
#linkBugBox > li {margin-left:-56px}
#branch{width: 95px;}
+1 -1
View File
@@ -90,7 +90,7 @@ js::set('oldResolvedBuild' , $bug->resolvedBuild);
<td>
<div class='input-group'>
<?php echo html::select('product', $products, $productID, "onchange='loadAll(this.value)' class='form-control chosen'");?>
<?php if($this->session->currentProductType != 'normal') echo html::select('branch', $branches, $bug->branch, "onchange='loadBranch();' class='form-control' style='width:65px'");?>
<?php if($this->session->currentProductType != 'normal') echo html::select('branch', $branches, $bug->branch, "onchange='loadBranch();' class='form-control'");?>
</div>
</td>
</tr>
+3 -3
View File
@@ -183,14 +183,14 @@ $lang->product->menu->list = array('link' => $lang->productCommon . '|product|al
$lang->product->viewMenu = new stdclass();
$lang->product->viewMenu->requirement = array('link' => "$lang->URCommon|product|browse|productID=%s&branch=&browseType=unclosed&param=0&storyType=requirement", 'alias' => 'batchedit', 'subModule' => 'story');
$lang->product->viewMenu->story = array('link' => "$lang->SRCommon|product|browse|productID=%s", 'alias' => 'batchedit', 'subModule' => 'story');
$lang->product->viewMenu->track = array('link' => "Track|story|track|productID=%s");
$lang->product->viewMenu->plan = array('link' => "Plan|productplan|browse|productID=%s", 'subModule' => 'productplan');
$lang->product->viewMenu->release = array('link' => "Release|release|browse|productID=%s", 'subModule' => 'release');
$lang->product->viewMenu->roadmap = 'Roadmap|product|roadmap|productID=%s';
$lang->product->viewMenu->project = "Project|product|project|status=all&productID=%s";
$lang->product->viewMenu->track = array('link' => "Track|story|track|productID=%s");
$lang->product->viewMenu->doc = array('link' => 'Doc|doc|objectLibs|type=product&objectID=%s&from=product', 'subModule' => 'doc');
$lang->product->viewMenu->dynamic = 'Dynamic|product|dynamic|productID=%s';
$lang->product->viewMenu->dashboard = array('link' => 'Dashboard|product|dashboard|productID=%s');
$lang->product->viewMenu->dynamic = 'Dynamic|product|dynamic|productID=%s';
$lang->product->viewMenu->set = array('link' => 'Setting|product|view|productID=%s', 'subModule' => 'tree,branch', 'alias' => 'edit');
$lang->product->setMenu = new stdclass();
@@ -342,7 +342,7 @@ $lang->scrumproduct->menu->view = array('link' => 'Übersicht|product|view|p
$lang->scrumproduct->menu->requirement = array('link' => "Requirement|product|browse|productID=%s&branch=&browseType=unclosed&param=0&storyType=requirement", 'alias' => 'batchedit', 'subModule' => 'story');
$lang->scrumproduct->menu->story = array('link' => "Story|product|browse|productID=%s", 'alias' => 'batchedit', 'subModule' => 'story');
$lang->product->dividerMenu = ',plan,project,';
$lang->product->dividerMenu = ',plan,project,dashboard,';
$lang->story = new stdclass();
+3 -3
View File
@@ -183,14 +183,14 @@ $lang->product->menu->list = array('link' => $lang->productCommon . '|product|al
$lang->product->viewMenu = new stdclass();
$lang->product->viewMenu->requirement = array('link' => "$lang->URCommon|product|browse|productID=%s&branch=&browseType=unclosed&param=0&storyType=requirement", 'alias' => 'batchedit', 'subModule' => 'story');
$lang->product->viewMenu->story = array('link' => "$lang->SRCommon|product|browse|productID=%s", 'alias' => 'batchedit', 'subModule' => 'story');
$lang->product->viewMenu->track = array('link' => "Track|story|track|productID=%s");
$lang->product->viewMenu->plan = array('link' => "Plan|productplan|browse|productID=%s", 'subModule' => 'productplan');
$lang->product->viewMenu->release = array('link' => "Release|release|browse|productID=%s", 'subModule' => 'release');
$lang->product->viewMenu->roadmap = 'Roadmap|product|roadmap|productID=%s';
$lang->product->viewMenu->project = "Project|product|project|status=all&productID=%s";
$lang->product->viewMenu->track = array('link' => "Track|story|track|productID=%s");
$lang->product->viewMenu->doc = array('link' => 'Doc|doc|objectLibs|type=product&objectID=%s&from=product', 'subModule' => 'doc');
$lang->product->viewMenu->dynamic = 'Dynamic|product|dynamic|productID=%s';
$lang->product->viewMenu->dashboard = array('link' => 'Dashboard|product|dashboard|productID=%s');
$lang->product->viewMenu->dynamic = 'Dynamic|product|dynamic|productID=%s';
$lang->product->viewMenu->set = array('link' => 'Setting|product|view|productID=%s', 'subModule' => 'tree,branch', 'alias' => 'edit');
$lang->product->setMenu = new stdclass();
@@ -342,7 +342,7 @@ $lang->scrumproduct->menu->view = array('link' => 'Overview|product|view|pro
$lang->scrumproduct->menu->requirement = array('link' => "Requirement|product|browse|productID=%s&branch=&browseType=unclosed&param=0&storyType=requirement", 'alias' => 'batchedit', 'subModule' => 'story');
$lang->scrumproduct->menu->story = array('link' => "Story|product|browse|productID=%s", 'alias' => 'batchedit', 'subModule' => 'story');
$lang->product->dividerMenu = ',plan,project,';
$lang->product->dividerMenu = ',plan,project,dashboard,';
$lang->story = new stdclass();
+3 -3
View File
@@ -183,14 +183,14 @@ $lang->product->menu->list = array('link' => $lang->productCommon . '|product|al
$lang->product->viewMenu = new stdclass();
$lang->product->viewMenu->requirement = array('link' => "$lang->URCommon|product|browse|productID=%s&branch=&browseType=unclosed&param=0&storyType=requirement", 'alias' => 'batchedit', 'subModule' => 'story');
$lang->product->viewMenu->story = array('link' => "$lang->SRCommon|product|browse|productID=%s", 'alias' => 'batchedit', 'subModule' => 'story');
$lang->product->viewMenu->track = array('link' => "Track|story|track|productID=%s");
$lang->product->viewMenu->plan = array('link' => "Plan|productplan|browse|productID=%s", 'subModule' => 'productplan');
$lang->product->viewMenu->release = array('link' => "Release|release|browse|productID=%s", 'subModule' => 'release');
$lang->product->viewMenu->roadmap = 'Roadmap|product|roadmap|productID=%s';
$lang->product->viewMenu->project = "Project|product|project|status=all&productID=%s";
$lang->product->viewMenu->track = array('link' => "Track|story|track|productID=%s");
$lang->product->viewMenu->doc = array('link' => 'Doc|doc|objectLibs|type=product&objectID=%s&from=product', 'subModule' => 'doc');
$lang->product->viewMenu->dynamic = 'Dynamic|product|dynamic|productID=%s';
$lang->product->viewMenu->dashboard = array('link' => 'Dashboard|product|dashboard|productID=%s');
$lang->product->viewMenu->dynamic = 'Dynamic|product|dynamic|productID=%s';
$lang->product->viewMenu->set = array('link' => 'Setting|product|view|productID=%s', 'subModule' => 'tree,branch', 'alias' => 'edit');
$lang->product->setMenu = new stdclass();
@@ -342,7 +342,7 @@ $lang->scrumproduct->menu->view = array('link' => 'Overview|product|view|pro
$lang->scrumproduct->menu->requirement = array('link' => "Requirement|product|browse|productID=%s&branch=&browseType=unclosed&param=0&storyType=requirement", 'alias' => 'batchedit', 'subModule' => 'story');
$lang->scrumproduct->menu->story = array('link' => "Story|product|browse|productID=%s", 'alias' => 'batchedit', 'subModule' => 'story');
$lang->product->dividerMenu = ',plan,project,';
$lang->product->dividerMenu = ',plan,project,dashboard,';
$lang->story = new stdclass();
+7 -7
View File
@@ -56,14 +56,14 @@ $lang->todo->menuOrder = $lang->my->menuOrder;
/* product menu order. */
$lang->product->menuOrder[5] = 'requirement';
$lang->product->menuOrder[10] = 'story';
$lang->product->menuOrder[15] = 'track';
$lang->product->menuOrder[20] = 'plan';
$lang->product->menuOrder[25] = 'release';
$lang->product->menuOrder[30] = 'roadmap';
$lang->product->menuOrder[35] = 'project';
$lang->product->menuOrder[15] = 'plan';
$lang->product->menuOrder[20] = 'release';
$lang->product->menuOrder[25] = 'roadmap';
$lang->product->menuOrder[30] = 'project';
$lang->product->menuOrder[35] = 'track';
$lang->product->menuOrder[40] = 'doc';
$lang->product->menuOrder[45] = 'dynamic';
$lang->product->menuOrder[50] = 'dashboard';
$lang->product->menuOrder[45] = 'dashboard';
$lang->product->menuOrder[50] = 'dynamic';
$lang->product->menuOrder[55] = 'setting';
$lang->product->menuOrder[60] = 'create';
$lang->product->menuOrder[65] = 'all';
+3 -3
View File
@@ -183,14 +183,14 @@ $lang->product->menu->list = array('link' => $lang->productCommon . '|product|al
$lang->product->viewMenu = new stdclass();
$lang->product->viewMenu->requirement = array('link' => "$lang->URCommon|product|browse|productID=%s&branch=&browseType=unclosed&param=0&storyType=requirement", 'alias' => 'batchedit', 'subModule' => 'story');
$lang->product->viewMenu->story = array('link' => "$lang->SRCommon|product|browse|productID=%s", 'alias' => 'batchedit', 'subModule' => 'story');
$lang->product->viewMenu->track = array('link' => "Track|story|track|productID=%s");
$lang->product->viewMenu->plan = array('link' => "Plan|productplan|browse|productID=%s", 'subModule' => 'productplan');
$lang->product->viewMenu->release = array('link' => "Release|release|browse|productID=%s", 'subModule' => 'release');
$lang->product->viewMenu->roadmap = 'Roadmap|product|roadmap|productID=%s';
$lang->product->viewMenu->project = "Project|product|project|status=all&productID=%s";
$lang->product->viewMenu->track = array('link' => "Track|story|track|productID=%s");
$lang->product->viewMenu->doc = array('link' => 'Doc|doc|objectLibs|type=product&objectID=%s&from=product', 'subModule' => 'doc');
$lang->product->viewMenu->dynamic = 'Dynamic|product|dynamic|productID=%s';
$lang->product->viewMenu->dashboard = array('link' => 'Dashboard|product|dashboard|productID=%s');
$lang->product->viewMenu->dynamic = 'Dynamic|product|dynamic|productID=%s';
$lang->product->viewMenu->set = array('link' => 'Setting|product|view|productID=%s', 'subModule' => 'tree,branch', 'alias' => 'edit');
$lang->product->setMenu = new stdclass();
@@ -342,7 +342,7 @@ $lang->scrumproduct->menu->view = array('link' => 'Overview|product|view|pro
$lang->scrumproduct->menu->requirement = array('link' => "Requirement|product|browse|productID=%s&branch=&browseType=unclosed&param=0&storyType=requirement", 'alias' => 'batchedit', 'subModule' => 'story');
$lang->scrumproduct->menu->story = array('link' => "Story|product|browse|productID=%s", 'alias' => 'batchedit', 'subModule' => 'story');
$lang->product->dividerMenu = ',plan,project,';
$lang->product->dividerMenu = ',plan,project,dashboard,';
$lang->story = new stdclass();
+3 -3
View File
@@ -183,14 +183,14 @@ $lang->product->menu->list = array('link' => $lang->productCommon . '|product|al
$lang->product->viewMenu = new stdclass();
$lang->product->viewMenu->requirement = array('link' => "$lang->URCommon|product|browse|productID=%s&branch=&browseType=unclosed&param=0&storyType=requirement", 'alias' => 'batchedit', 'subModule' => 'story');
$lang->product->viewMenu->story = array('link' => "$lang->SRCommon|product|browse|productID=%s", 'alias' => 'batchedit', 'subModule' => 'story');
$lang->product->viewMenu->track = array('link' => "矩阵|story|track|productID=%s");
$lang->product->viewMenu->plan = array('link' => "计划|productplan|browse|productID=%s", 'subModule' => 'productplan');
$lang->product->viewMenu->release = array('link' => '发布|release|browse|productID=%s', 'subModule' => 'release');
$lang->product->viewMenu->roadmap = '路线图|product|roadmap|productID=%s';
$lang->product->viewMenu->project = "项目|product|project|status=all&productID=%s";
$lang->product->viewMenu->track = array('link' => "矩阵|story|track|productID=%s");
$lang->product->viewMenu->doc = array('link' => '文档|doc|objectLibs|type=product&objectID=%s&from=product', 'subModule' => 'doc');
$lang->product->viewMenu->dynamic = '动态|product|dynamic|productID=%s';
$lang->product->viewMenu->dashboard = array('link' => '仪表盘|product|dashboard|productID=%s');
$lang->product->viewMenu->dynamic = '动态|product|dynamic|productID=%s';
$lang->product->viewMenu->set = array('link' => '设置|product|view|productID=%s', 'subModule' => 'tree,branch', 'alias' => 'edit');
$lang->product->setMenu = new stdclass();
@@ -342,7 +342,7 @@ $lang->scrumproduct->menu->view = array('link' => '概况|product|view|produc
$lang->scrumproduct->menu->requirement = array('link' => "{$lang->URCommon}|product|browse|productID=%s&branch=&browseType=unclosed&param=0&storyType=requirement", 'alias' => 'batchedit', 'subModule' => 'story');
$lang->scrumproduct->menu->story = array('link' => "{$lang->SRCommon}|product|browse|productID=%s", 'alias' => 'batchedit', 'subModule' => 'story');
$lang->product->dividerMenu = ',plan,project,';
$lang->product->dividerMenu = ',plan,project,dashboard,';
$lang->story = new stdclass();
+1 -1
View File
@@ -22,7 +22,7 @@
.datatable .flexarea tbody>tr.checked>td:first-child:before,
.datatable .fixed-right tbody>tr.checked>td:first-child:before {display: none}
.datatable>.scroll-wrapper {z-index: 10;}
.has-fixed-footer .scroll-wrapper {bottom: 89px; position: fixed;}
.has-fixed-footer .scroll-wrapper {bottom: 49px; position: fixed;}
.has-fixed-footer .scroll-wrapper .scroll-slide.scroll-pos-out{height:8px;bottom: -8px;}
.has-fixed-footer .scroll-wrapper .scroll-slide.scroll-pos-out .bar{height:8px;}
.datatable .flexarea thead>tr>th:first-child,
+28
View File
@@ -89,6 +89,22 @@ class company extends control
$this->view->param = $param;
$this->view->type = $type;
$this->view->browseType = $browseType;
$this->view->companies = $this->company->getOutsideCompanies();
$this->display();
}
public function create()
{
if(!empty($_POST))
{
$this->company->create();
if(dao::isError()) die(js::error(dao::getError()));
die(js::reload('parent.parent'));
}
$this->view->title = $this->lang->company->common . $this->lang->colon . $this->lang->company->create;
$this->view->position = $this->lang->company->create;
$this->display();
}
@@ -259,4 +275,16 @@ class company extends control
$this->view->direction = $direction;
$this->display();
}
/**
* Ajax get outside company.
*
* @access public
* @return void
*/
public function ajaxGetOutsideCompany()
{
$companies = $this->company->getOutsideCompanies();
die(html::select('company', $companies, '', "class='form-control chosen'"));
}
}
+1
View File
@@ -11,6 +11,7 @@
*/
$lang->company->common = 'Unternehmen';
$lang->company->index = "Start";
$lang->company->create = "Add Company";
$lang->company->edit = "Bearbeiten";
$lang->company->view = "Unternehmensinfo";
$lang->company->browse = "Benutzerliste";
+1
View File
@@ -11,6 +11,7 @@
*/
$lang->company->common = 'Company';
$lang->company->index = "Company Home";
$lang->company->create = "Add Company";
$lang->company->edit = "Edit Company";
$lang->company->view = "Company Information";
$lang->company->browse = "User List";
+1
View File
@@ -11,6 +11,7 @@
*/
$lang->company->common = 'Entreprise';
$lang->company->index = "Accueil Entreprise";
$lang->company->create = "Add Company";
$lang->company->edit = "Edit Entreprise";
$lang->company->view = "Informations Entreprise";
$lang->company->browse = "Liste Utilisateurs";
+1
View File
@@ -11,6 +11,7 @@
*/
$lang->company->common = 'Doanh nghiệp';
$lang->company->index = "Trang doanh nghiệp";
$lang->company->create = "Add Company";
$lang->company->edit = "Sửa doanh nghiệp";
$lang->company->view = "Thông tin doanh nghiệp";
$lang->company->browse = "Danh sách người dùng";
+1
View File
@@ -11,6 +11,7 @@
*/
$lang->company->common = '组织视图';
$lang->company->index = "组织视图首页";
$lang->company->create = "添加公司";
$lang->company->edit = "编辑公司";
$lang->company->view = "公司信息";
$lang->company->browse = "用户列表";
+1
View File
@@ -11,6 +11,7 @@
*/
$lang->company->common = '組織視圖';
$lang->company->index = "組織視圖首頁";
$lang->company->create = "添加公司";
$lang->company->edit = "編輯公司";
$lang->company->view = "公司信息";
$lang->company->browse = "用戶列表";
+8
View File
@@ -72,7 +72,11 @@ js::set('confirmDelete', $lang->user->confirmDelete);
</th>
<th><?php common::printOrderlink('realname', $orderBy, $vars, $lang->user->realname);?></th>
<th><?php common::printOrderLink('account', $orderBy, $vars, $lang->user->account);?></th>
<?php if($browseType == 'inside'):?>
<th class="w-90px"><?php common::printOrderLink('role', $orderBy, $vars, $lang->user->role);?></th>
<?php else:?>
<th class="w-90px"><?php common::printOrderLink('company', $orderBy, $vars, $lang->user->company);?></th>
<?php endif;?>
<th class="c-url"><?php common::printOrderLink('email', $orderBy, $vars, $lang->user->email);?></th>
<th class="c-type"><?php common::printOrderLink('gender', $orderBy, $vars, $lang->user->gender);?></th>
<th><?php common::printOrderLink('phone', $orderBy, $vars, $lang->user->phone);?></th>
@@ -94,7 +98,11 @@ js::set('confirmDelete', $lang->user->confirmDelete);
</td>
<td title="<?php echo $user->realname;?>"><?php echo $user->realname;?></td>
<td><?php echo $user->account;?></td>
<?php if($browseType == 'inside'):?>
<td class="w-90px" title='<?php echo zget($lang->user->roleList, $user->role, '');?>'><?php echo zget($lang->user->roleList, $user->role, '');?></td>
<?php else:?>
<td class="w-90px" title='<?php echo zget($companies, $user->company, '');?>'><?php echo zget($companies, $user->company, '');?></td>
<?php endif;?>
<td class="c-url" title="<?php echo $user->email;?>"><?php echo html::mailto($user->email);?></td>
<td class="c-type"><?php echo zget($lang->user->genderList, $user->gender, $user->gender);?></td>
<td><?php echo $user->phone;?></td>
+2 -20
View File
@@ -505,17 +505,9 @@ class custom extends control
else
{
$lang = $this->app->getClientLang();
$this->dao->delete()->from(TABLE_LANG)
->where('lang')->eq($lang)
->andWhere('section')->eq('URSRList')
->andWhere('`key`')->eq($key)
->exec();
$defaultConcept = $this->dao->select('`value`')->from(TABLE_CONFIG)
->where('module')->eq('custom')
->andWhere('`key`')->eq('URSR')
->fetch('value');
$this->custom->deleteItems("lang=$lang&section=URSRList&key=$key");
$defaultConcept = $this->loadModel('setting')->getItem('owner=system&module=custom&key=URSR');
$this->dao->update(TABLE_CONFIG)
->set('`value`')->eq($defaultConcept)
->where('module')->eq('common')
@@ -523,16 +515,6 @@ class custom extends control
->andWhere('`value`')->eq($key)
->exec();
/* Stay default concept. */
if($defaultConcept == $key)
{
$this->dao->update(TABLE_CONFIG)
->set('`value`')->eq(1)
->where('module')->eq('custom')
->andWhere('`key`')->eq('URSR')
->exec();
}
die(js::locate(inlink('browseStoryConcept'), 'parent'));
}
}
+3 -1
View File
@@ -384,7 +384,7 @@ class deptModel extends model
* Get user pairs of a department.
*
* @param int $deptID
* @param string $params
* @param string $params userid|outside|all
* @access public
* @return array
*/
@@ -392,9 +392,11 @@ class deptModel extends model
{
$childDepts = $this->getAllChildID($deptID);
$keyField = strpos($params, 'useid') !== false ? 'id' : 'account';
$type = (strpos($params, 'outside') !== false) ? 'outside' : 'inside';
return $this->dao->select("$keyField, realname")->from(TABLE_USER)
->where('deleted')->eq(0)
->beginIF(strpos($params, 'all') === false)->andWhere('type')->eq($type)->fi()
->beginIF($deptID)->andWhere('dept')->in($childDepts)->fi()
->orderBy('account')
->fetchPairs();
+2 -2
View File
@@ -24,11 +24,11 @@ body.menu-hide {padding-left: 0;}
.menu-hide #menu .nav > li > a > .text {display: none}
.menu-hide #menu .nav > li.has-avatar > a {padding: 2px 0;}
#moreExecution {display:none; max-height: 520px; min-height: 520px; max-width:260px; min-width: 150px; position: fixed; bottom: 40px; z-index: 999; background: white; padding: 20px 10px; border: 1px solid #efefef}
#moreExecution {display:none; max-height: 520px; min-height: 520px; max-width:360px; min-width: 150px; position: fixed; bottom: 40px; z-index: 999; background: white; padding: 20px 10px; border: 1px solid #efefef}
.more-execution-show {left: 96px;}
.more-execution-hide {left: 40px;}
#moreExecution .icon-search {opacity: 0.5;}
#executionList {max-height: 450px; min-height: 450px; max-width:260px; min-width: 150px; margin-top: 5px;}
#executionList {max-height: 450px; min-height: 450px; max-width:360px; min-width: 150px; margin-top: 5px;}
@media screen and (max-height: 768px)
{
+3
View File
@@ -227,6 +227,9 @@ class misc extends control
*/
public function captcha($sessionVar = 'captcha', $uuid = '')
{
$obLevel = ob_get_level();
for($i = 0; $i < $obLevel; $i++) ob_end_clean();
header('Content-Type: image/jpeg');
$captcha = $this->app->loadClass('captcha');
$this->session->set($sessionVar, $captcha->getPhrase());
+3 -2
View File
@@ -43,7 +43,7 @@
<?php endif;?>
<th class='w-100px'><?php echo $lang->program->begin;?></th>
<th class='w-100px'><?php echo $lang->program->end;?></th>
<th class='w-100px'><?php echo $lang->program->PRJBudget;?></th>
<th class='text-right w-100px'><?php echo $lang->program->PRJBudget;?></th>
<th class='w-100px'><?php echo $lang->program->PRJPM;?></th>
<th class='text-center w-180px'><?php echo $lang->actions;?></th>
</tr>
@@ -60,7 +60,8 @@
<?php endif;?>
<td class='text-left'><?php echo $project->begin;?></td>
<td class='text-left'><?php echo $project->end == '0000-00-00' ? '' : $project->end;?></td>
<td class='text-left'><?php echo $project->budget != 0 ? zget($lang->program->currencySymbol, $project->budgetUnit) . number_format($project->budget, 2) : $lang->program->future;?></td>
<?php $programBudget = in_array($this->app->getClientLang(), ['zh-cn','zh-tw']) && $project->budget >= 10000 ? number_format($project->budget / 10000, 1) . $this->lang->program->tenThousand : number_format($project->budget, 1);?>
<td class='text-right'><?php echo $project->budget != 0 ? zget($lang->program->currencySymbol, $project->budgetUnit) . ' ' . $programBudget : $lang->program->future;?></td>
<td>
<?php $userID = isset($PMList[$project->PM]) ? $PMList[$project->PM]->id : ''?>
<?php if(!empty($project->PM)) echo html::a($this->createLink('user', 'profile', "userID=$userID", '', true), zget($users, $project->PM), '', "data-toggle='modal' data-type='iframe' data-width='600'");?>
+2 -2
View File
@@ -27,8 +27,8 @@ $lang->personnel->created = 'Created';
$lang->personnel->finished = 'Finished';
$lang->personnel->wait = 'Pending';
$lang->personnel->resolved = 'Resolved';
$lang->personnel->UR = 'UR';
$lang->personnel->SR = 'SR';
$lang->personnel->UR = $lang->URCommon;
$lang->personnel->SR = $lang->SRCommon;
$lang->personnel->whitelist = 'Whitelist';
$lang->personnel->addWhitelist = 'Add Whitelist';
+2 -2
View File
@@ -27,8 +27,8 @@ $lang->personnel->created = 'Created';
$lang->personnel->finished = 'Finished';
$lang->personnel->wait = 'Pending';
$lang->personnel->resolved = 'Resolved';
$lang->personnel->UR = 'UR';
$lang->personnel->SR = 'SR';
$lang->personnel->UR = $lang->URCommon;
$lang->personnel->SR = $lang->SRCommon;
$lang->personnel->whitelist = 'Whitelist';
$lang->personnel->addWhitelist = 'Add Whitelist';
+2 -2
View File
@@ -27,8 +27,8 @@ $lang->personnel->created = 'Created';
$lang->personnel->finished = 'Finished';
$lang->personnel->wait = 'Pending';
$lang->personnel->resolved = 'Resolved';
$lang->personnel->UR = 'UR';
$lang->personnel->SR = 'SR';
$lang->personnel->UR = $lang->URCommon;
$lang->personnel->SR = $lang->SRCommon;
$lang->personnel->whitelist = 'Whitelist';
$lang->personnel->addWhitelist = 'Add Whitelist';
+2 -2
View File
@@ -27,8 +27,8 @@ $lang->personnel->created = 'Created';
$lang->personnel->finished = 'Finished';
$lang->personnel->wait = 'Pending';
$lang->personnel->resolved = 'Resolved';
$lang->personnel->UR = 'UR';
$lang->personnel->SR = 'SR';
$lang->personnel->UR = $lang->URCommon;
$lang->personnel->SR = $lang->SRCommon;
$lang->personnel->whitelist = 'Whitelist';
$lang->personnel->addWhitelist = 'Add Whitelist';
+2 -2
View File
@@ -27,8 +27,8 @@ $lang->personnel->created = '创建';
$lang->personnel->finished = '完成';
$lang->personnel->wait = '待处理';
$lang->personnel->resolved = '解决';
$lang->personnel->UR = '用需';
$lang->personnel->SR = '软需';
$lang->personnel->UR = $lang->URCommon;
$lang->personnel->SR = $lang->SRCommon;
$lang->personnel->whitelist = '白名单列表';
$lang->personnel->addWhitelist = '添加白名单';
+2 -2
View File
@@ -27,8 +27,8 @@ $lang->personnel->created = '創建';
$lang->personnel->finished = '完成';
$lang->personnel->wait = '待處理';
$lang->personnel->resolved = '解決';
$lang->personnel->UR = '用需';
$lang->personnel->SR = '軟需';
$lang->personnel->UR = $lang->URCommon;
$lang->personnel->SR = $lang->SRCommon;
$lang->personnel->whitelist = '白名單列表';
$lang->personnel->addWhitelist = '添加白名單';
+22 -19
View File
@@ -79,7 +79,7 @@ class product extends control
public function project($status = 'all', $productID = 0, $branch = 0, $PRJMine = 0)
{
$this->product->setMenu($this->products, $productID, $branch);
$this->lang->product->switcherMenu = $this->loadModel('product')->getSwitcher($productID);
$this->lang->product->switcherMenu = $this->product->getSwitcher($productID);
$this->lang->product->mainMenuAction = $this->product->getProductMainAction();
$this->app->loadLang('my');
@@ -117,10 +117,11 @@ class product extends control
* @param int $recTotal
* @param int $recPerPage
* @param int $pageID
* @param string $from product|project
* @access public
* @return void
*/
public function browse($productID = 0, $branch = 0, $browseType = '', $param = 0, $storyType = 'story', $orderBy = '', $recTotal = 0, $recPerPage = 20, $pageID = 1)
public function browse($productID = 0, $branch = 0, $browseType = '', $param = 0, $storyType = 'story', $orderBy = '', $recTotal = 0, $recPerPage = 20, $pageID = 1, $from = 'product')
{
/* Lower browse type. */
$browseType = strtolower($browseType);
@@ -273,6 +274,7 @@ class product extends control
$this->view->products = $this->products;
$this->view->projectProducts = isset($projectProducts) ? $projectProducts : array();
$this->view->storyType = $storyType;
$this->view->from = $from;
$this->display();
}
@@ -353,7 +355,7 @@ class product extends control
/* Set menu. */
$this->app->loadLang('custom');
$this->lang->product->menu = $this->lang->product->viewMenu;
$this->lang->product->switcherMenu = $this->loadModel('product')->getSwitcher($productID);
$this->lang->product->switcherMenu = $this->product->getSwitcher($productID);
$this->lang->product->mainMenuAction = $this->product->getProductMainAction();
@@ -618,7 +620,7 @@ class product extends control
$moduleIndex = array_search('product', $this->lang->noMenuModule);
if($moduleIndex !== false) unset($this->lang->noMenuModule[$moduleIndex]);
$this->lang->product->menu = $this->lang->product->viewMenu;
$this->lang->product->switcherMenu = $this->loadModel('product')->getSwitcher($productID);
$this->lang->product->switcherMenu = $this->product->getSwitcher($productID);
$this->lang->product->mainMenuAction = $this->product->getProductMainAction();
$product->desc = $this->loadModel('file')->setImgSize($product->desc);
@@ -677,7 +679,7 @@ class product extends control
public function roadmap($productID, $branch = 0)
{
$this->lang->product->menu = $this->lang->product->viewMenu;
$this->lang->product->switcherMenu = $this->loadModel('product')->getSwitcher($productID, '', $branch);
$this->lang->product->switcherMenu = $this->product->getSwitcher($productID, '', $branch);
$this->lang->product->mainMenuAction = $this->product->getProductMainAction();
$this->product->setMenu($this->products, $productID, $branch);
@@ -750,7 +752,7 @@ class product extends control
$this->view->position[] = html::a($this->createLink($this->moduleName, 'browse'), $this->products[$productID]);
$this->view->position[] = $this->lang->product->dynamic;
$this->lang->product->switcherMenu = $this->loadModel('product')->getSwitcher($productID, $type);
$this->lang->product->switcherMenu = $this->product->getSwitcher($productID, $type);
$this->lang->product->mainMenuAction = $this->product->getProductMainAction();
$this->view->userIdPairs = $this->loadModel('user')->getPairs('noletter|nodeleted|noclosed|useid');
@@ -783,7 +785,7 @@ class product extends control
if(!$product) die(js::locate('product', 'all'));
$this->lang->product->menu = $this->lang->product->viewMenu;
$this->lang->product->switcherMenu = $this->loadModel('product')->getSwitcher($productID);
$this->lang->product->switcherMenu = $this->product->getSwitcher($productID);
$this->lang->product->mainMenuAction = $this->product->getProductMainAction();
$product->desc = $this->loadModel('file')->setImgSize($product->desc);
@@ -885,14 +887,15 @@ class product extends control
$inProduct = zget($this->lang->navGroup, $module) == 'product';
$products = $inProduct ? $this->product->getList() : $this->product->getProductsByProject($this->session->PRJ);
$this->view->link = $this->product->getProductLink($module, $method, $extra);
$this->view->productID = $productID;
$this->view->module = $module;
$this->view->method = $method;
$this->view->extra = $extra;
$this->view->products = $products;
$this->view->projectID = $this->session->PRJ;
$this->view->programs = $this->loadModel('program')->getPGMOption();
$this->view->link = $this->product->getProductLink($module, $method, $extra);
$this->view->productID = $productID;
$this->view->module = $module;
$this->view->method = $method;
$this->view->extra = $extra;
$this->view->products = $products;
$this->view->projectID = $this->session->PRJ;
$this->view->programs = $this->loadModel('program')->getPGMOption();
$this->view->openModule = $inProduct ? 'product' : 'project';
$this->display();
}
@@ -963,7 +966,7 @@ class product extends control
*/
public function all($browseType = 'noclosed', $orderBy = 'order_asc')
{
$this->lang->product->mainMenuAction = html::a('javascript:history.go(-1);', '<i class="icon icon-back"></i> ' . $this->lang->goback, '', "class='btn btn-link'");
if($this->session->moreProductLink) $this->lang->product->mainMenuAction = html::a($this->session->moreProductLink, '<i class="icon icon-back"></i> ' . $this->lang->goback, '', "class='btn btn-link'");
/* Load module and set session. */
$this->loadModel('program');
@@ -1007,7 +1010,7 @@ class product extends control
public function whitelist($productID = 0, $module = 'product', $objectType = 'product', $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
{
$this->lang->product->menu = $this->lang->product->viewMenu;
$this->lang->product->switcherMenu = $this->loadModel('product')->getSwitcher($productID, '', 0);
$this->lang->product->switcherMenu = $this->product->getSwitcher($productID, '', 0);
$this->lang->product->mainMenuAction = $this->product->getProductMainAction();
$this->product->setMenu($this->products, $productID, 0);
$this->lang->modulePageNav = '';
@@ -1026,8 +1029,8 @@ class product extends control
*/
public function addWhitelist($productID = 0, $deptID = 0, $branch = '')
{
$this->lang->product->menu = $this->lang->product->viewMenu;
$this->lang->product->switcherMenu = $this->loadModel('product')->getSwitcher($productID, '', $branch);
$this->lang->product->menu = $this->lang->product->viewMenu;
$this->lang->product->switcherMenu = $this->product->getSwitcher($productID, '', $branch);
$this->lang->product->mainMenuAction = $this->product->getProductMainAction();
$this->product->setMenu($this->products, $productID, $branch);
$moduleIndex = array_search('product', $this->lang->noMenuModule);
+1
View File
@@ -440,6 +440,7 @@ class productModel extends model
{
$currentModule = $this->app->moduleName;
$currentMethod = $this->app->methodName;
$this->session->set('moreProductLink', $this->app->getURI(true));
$this->loadModel('project');
$currentProductName = $this->lang->product->common;
+4 -3
View File
@@ -7,6 +7,7 @@ $iCharges = 0;
$others = 0;
$closeds = 0;
$productNames = array();
foreach($products as $product)
{
if($product->status == 'normal' and $product->PO == $this->app->user->account) $iCharges++;
@@ -26,19 +27,19 @@ foreach($products as $product)
{
$objectID = ($product->type != 'platform' && $module == 'branch' && $method == 'manage') ? $productID : $product->id;
$linkHtml = $this->product->setParamsForLink($module, $link, $projectID, $product->id);
$myProductsHtml .= html::a($linkHtml, html::icon($lang->icons['product']) . ' ' . $productName, '', "class='text-important' title='{$productName}' data-key='" . zget($productsPinYin, $product->name, '') . "' data-group='product'");
$myProductsHtml .= html::a($linkHtml, html::icon($lang->icons['product']) . ' ' . $productName, '', "class='text-important' title='{$productName}' data-key='" . zget($productsPinYin, $product->name, '') . "' data-group='$openModule'");
}
else if($product->status == 'normal' and !($product->PO == $this->app->user->account))
{
$objectID = ($product->type != 'platform' && $module == 'branch' && $method == 'manage') ? $productID : $product->id;
$linkHtml = $this->product->setParamsForLink($module, $link, $projectID, $product->id);
$normalProductsHtml .= html::a($linkHtml, html::icon($lang->icons['product']) . ' ' . $productName, '', "title='{$productName}' data-key='" . zget($productsPinYin, $product->name, '') . "' data-group='product'");
$normalProductsHtml .= html::a($linkHtml, html::icon($lang->icons['product']) . ' ' . $productName, '', "title='{$productName}' data-key='" . zget($productsPinYin, $product->name, '') . "' data-group='$openModule'");
}
else if($product->status == 'closed')
{
$objectID = ($product->type != 'platform' && $module == 'branch' && $method == 'manage') ? $productID : $product->id;
$linkHtml = $this->product->setParamsForLink($module, $link, $projectID, $objectID);
$closedProductsHtml .= html::a($linkHtml, html::icon($lang->icons['product']) . ' ' . $productName, '', "title='{$productName}' class='closed' data-key='" . zget($productsPinYin, $product->name, '') . "' data-group='product'");
$closedProductsHtml .= html::a($linkHtml, html::icon($lang->icons['product']) . ' ' . $productName, '', "title='{$productName}' class='closed' data-key='" . zget($productsPinYin, $product->name, '') . "' data-group='$openModule'");
}
}
?>
+21 -4
View File
@@ -23,10 +23,15 @@ $unfoldStories = zget($unfoldStories, $productID, array());
js::set('unfoldStories', $unfoldStories);
js::set('unfoldAll', $lang->project->treeLevel['all']);
js::set('foldAll', $lang->project->treeLevel['root']);
js::set('storyType', $storyType);
js::set('storyType', $storyType);
$lang->story->createCommon = $storyType == 'story' ? $lang->story->createStory : $lang->story->createRequirement;
$isProjectStroy = $this->app->rawModule == 'projectstory';
?>
<style>
.btn-group .icon-close:before {font-size: 5px; vertical-align: 25%;}
</style>
<div id="mainMenu" class="clearfix">
<?php if(!$isProjectStroy):?>
<div id="sidebarHeader">
<div class="title">
<?php
@@ -39,6 +44,7 @@ $lang->story->createCommon = $storyType == 'story' ? $lang->story->createStory :
?>
</div>
</div>
<?php endif;?>
<div class="btn-toolbar pull-left">
<?php if($this->app->rawModule == 'projectstory'): ?>
<div class='btn-group'>
@@ -52,6 +58,16 @@ $lang->story->createCommon = $storyType == 'story' ? $lang->story->createStory :
?>
</ul>
</div>
<div class="btn-group">
<a href="javascript:;" class="btn btn-link" style="padding-right: 0;"> <?php echo $moduleName;?> </a>
<?php
if($moduleID)
{
$removeLink = $browseType == 'bymodule' ? $this->createLink($this->app->rawModule, $this->app->rawMethod, "productID=$productID&branch=$branch&browseType=$browseType&param=0&storyType=$storyType&orderBy=$orderBy&recTotal=0&recPerPage={$pager->recPerPage}") : 'javascript:removeCookieByKey("storyModule")';
echo html::a($removeLink, "<i class='icon icon-sm icon-close'></i>", '', "class='text-muted btn btn-link' style='padding-left: 0;'");
}
?>
</div>
<?php endif;?>
<?php
foreach(customModel::getFeatureMenu($this->moduleName, $this->methodName) as $menuItem)
@@ -110,7 +126,6 @@ $lang->story->createCommon = $storyType == 'story' ? $lang->story->createStory :
?>
</ul>
</div>
<?php $isProjectStroy = $this->app->rawModule == 'projectstory';?>
<?php if(common::canModify('product', $product)):?>
<div class='btn-group dropdown-hover'>
<?php echo html::a('javascript:;', "<i class='icon icon-plus'></i> {$lang->story->create} </span><span class='caret'>", '', "class='btn btn-secondary'");?>
@@ -251,11 +266,13 @@ $lang->story->createCommon = $storyType == 'story' ? $lang->story->createStory :
<tbody>
<?php foreach($stories as $story):?>
<tr data-id='<?php echo $story->id?>' data-estimate='<?php echo $story->estimate?>' data-cases='<?php echo zget($storyCases, $story->id, 0);?>'>
<?php $story->from = $from;?>
<?php foreach($setting as $key => $value) $this->story->printCell($value, $story, $users, $branches, $storyStages, $modulePairs, $storyTasks, $storyBugs, $storyCases, $useDatatable ? 'datatable' : 'table');?>
</tr>
<?php if(!empty($story->children)):?>
<?php $i = 0;?>
<?php foreach($story->children as $key => $child):?>
<?php $child->from = $from;?>
<?php $class = $i == 0 ? ' table-child-top' : '';?>
<?php $class .= ($i + 1 == count($story->children)) ? ' table-child-bottom' : '';?>
<tr class='table-children<?php echo $class;?> parent-<?php echo $story->id;?>' data-id='<?php echo $child->id?>' data-status='<?php echo $child->status?>' data-estimate='<?php echo $child->estimate?>'>
@@ -487,8 +504,8 @@ $('#branch' + branchID).closest('li').addClass('active');
$(function()
{
// Update table summary text
<?php $storyCommon = $lang->SRCommon;?>
// Update table summary text.
<?php $storyCommon = $storyType == 'requirement' ? $lang->URCommon : $lang->SRCommon;?>
var checkedSummary = '<?php echo str_replace('%storyCommon%', $storyCommon, $lang->product->checkedSummary)?>';
$('#productStoryForm').table(
{
+1 -1
View File
@@ -88,7 +88,7 @@ $config->program->datatable->fieldList['PRJBudget']['required'] = 'yes';
$config->program->datatable->fieldList['teamCount']['title'] = 'teamCount';
$config->program->datatable->fieldList['teamCount']['fixed'] = 'no';
$config->program->datatable->fieldList['teamCount']['width'] = '60';
$config->program->datatable->fieldList['teamCount']['width'] = '40';
$config->program->datatable->fieldList['teamCount']['required'] = 'no';
$config->program->datatable->fieldList['teamCount']['sort'] = 'no';
+2 -3
View File
@@ -132,8 +132,7 @@ class program extends control
$this->view->title = $this->lang->program->PGMProduct;
$this->view->position[] = $this->lang->program->PGMProduct;
$this->view->program = $this->program->getPGMByID($programID);
$this->view->program = $program;
$this->view->browseType = $browseType;
$this->view->orderBy = $orderBy;
$this->view->pager = $pager;
@@ -797,7 +796,7 @@ class program extends control
public function PRJBrowse($programID = 0, $browseType = 'doing', $param = 0, $orderBy = 'order_desc', $recTotal = 0, $recPerPage = 15, $pageID = 1)
{
$this->lang->program->menu = $this->lang->PRJ->menu;
$this->lang->program->mainMenuAction = html::a('javascript:history.go(-1);', '<i class="icon icon-back"></i> ' . $this->lang->goback, '', "class='btn btn-link'");
if($this->session->moreProjectLink) $this->lang->program->mainMenuAction = html::a($this->session->moreProjectLink, '<i class="icon icon-back"></i> ' . $this->lang->goback, '', "class='btn btn-link'");
$this->app->session->set('PRJBrowse', $this->app->getURI(true));
$this->loadModel('datatable');
+1
View File
@@ -1 +1,2 @@
.future {display: inline-block}
.c-number {overflow:hidden;text-align:right!important;text-overflow:ellipsis;white-space:nowrap}
+1 -1
View File
@@ -116,7 +116,7 @@ $lang->program->unitList['NZD'] = 'New Zealand';
$lang->program->unitList['THB'] = 'Thai Baht';
$lang->program->unitList['SGD'] = 'Singapore';
$lang->program->currencySymbol['CNY'] = '¥';
$lang->program->currencySymbol['CNY'] = '¥';
$lang->program->currencySymbol['USD'] = '$';
$lang->program->currencySymbol['HKD'] = 'HK$';
$lang->program->currencySymbol['NTD'] = 'NT$';
+1 -1
View File
@@ -116,7 +116,7 @@ $lang->program->unitList['NZD'] = 'New Zealand';
$lang->program->unitList['THB'] = 'Thai Baht';
$lang->program->unitList['SGD'] = 'Singapore';
$lang->program->currencySymbol['CNY'] = '¥';
$lang->program->currencySymbol['CNY'] = '¥';
$lang->program->currencySymbol['USD'] = '$';
$lang->program->currencySymbol['HKD'] = 'HK$';
$lang->program->currencySymbol['NTD'] = 'NT$';
+1 -1
View File
@@ -116,7 +116,7 @@ $lang->program->unitList['NZD'] = 'New Zealand';
$lang->program->unitList['THB'] = 'Thai Baht';
$lang->program->unitList['SGD'] = 'Singapore';
$lang->program->currencySymbol['CNY'] = '¥';
$lang->program->currencySymbol['CNY'] = '¥';
$lang->program->currencySymbol['USD'] = '$';
$lang->program->currencySymbol['HKD'] = 'HK$';
$lang->program->currencySymbol['NTD'] = 'NT$';
+1 -1
View File
@@ -116,7 +116,7 @@ $lang->program->unitList['NZD'] = 'New Zealand';
$lang->program->unitList['THB'] = 'Thai Baht';
$lang->program->unitList['SGD'] = 'Singapore';
$lang->program->currencySymbol['CNY'] = '¥';
$lang->program->currencySymbol['CNY'] = '¥';
$lang->program->currencySymbol['USD'] = '$';
$lang->program->currencySymbol['HKD'] = 'HK$';
$lang->program->currencySymbol['NTD'] = 'NT$';
+3 -1
View File
@@ -98,6 +98,8 @@ $lang->program->changeProgramTip = '修改项目集后,该项目关联
$lang->program->linkedProjectsTip = '关联的项目如下';
$lang->program->multiLinkedProductsTip = '该项目关联的如下产品还关联了其他项目,请取消关联后再操作';
$lang->program->tenThousand = '万';
$lang->program->unitList['CNY'] = '人民币';
$lang->program->unitList['USD'] = '美元';
$lang->program->unitList['HKD'] = '港元';
@@ -116,7 +118,7 @@ $lang->program->unitList['NZD'] = '新西兰元';
$lang->program->unitList['THB'] = '泰国铢';
$lang->program->unitList['SGD'] = '新加坡元';
$lang->program->currencySymbol['CNY'] = '¥';
$lang->program->currencySymbol['CNY'] = '¥';
$lang->program->currencySymbol['USD'] = '$';
$lang->program->currencySymbol['HKD'] = 'HK$';
$lang->program->currencySymbol['NTD'] = 'NT$';
+3 -1
View File
@@ -93,6 +93,8 @@ $lang->program->morePRJ = '更多項目';
$lang->program->productNotEmpty = '請關聯產品或創建產品。';
$lang->program->existProductName = '產品名稱已存在。';
$lang->program->tenThousand = '萬';
$lang->program->unitList['CNY'] = '人民幣';
$lang->program->unitList['USD'] = '美元';
$lang->program->unitList['HKD'] = '港元';
@@ -111,7 +113,7 @@ $lang->program->unitList['NZD'] = '新西蘭元';
$lang->program->unitList['THB'] = '泰國銖';
$lang->program->unitList['SGD'] = '新加坡元';
$lang->program->currencySymbol['CNY'] = '¥';
$lang->program->currencySymbol['CNY'] = '¥';
$lang->program->currencySymbol['USD'] = '$';
$lang->program->currencySymbol['HKD'] = 'HK$';
$lang->program->currencySymbol['NTD'] = 'NT$';
+11 -7
View File
@@ -618,7 +618,7 @@ class programModel extends model
{
echo(js::alert($this->lang->program->accessDenied));
if(!$this->server->http_referer) die(js::locate(helper::createLink('program', 'browse')));
if(!$this->server->http_referer) die(js::locate(helper::createLink('program', 'prjbrowse')));
$loginLink = $this->config->requestType == 'GET' ? "?{$this->config->moduleVar}=user&{$this->config->methodVar}=login" : "user{$this->config->requestFix}login";
if(strpos($this->server->http_referer, $loginLink) !== false) die(js::locate(helper::createLink('program', 'browse')));
@@ -739,7 +739,7 @@ class programModel extends model
->andWhere('grade')->eq($childGrade)
->fetch('sumBudget');
return $parentProgram->budget - $childSumBudget;
return (float)$parentProgram->budget - (float)$childSumBudget;
}
/**
@@ -864,6 +864,8 @@ class programModel extends model
*/
public function getPRJSwitcher($projectID, $currentModule, $currentMethod)
{
$this->session->set('moreProjectLink', $this->app->getURI(true));
$this->loadModel('project');
$currentProjectName = $this->lang->program->common;
if($projectID)
@@ -1777,8 +1779,8 @@ class programModel extends model
if($col->show)
{
$class = "c-$id";
$title = '';
$class = "c-$id" . (in_array($id, ['PRJBudget', 'teamCount']) ? ' c-number' : ' c-name');
if($id == 'id') $class .= ' cell-id';
@@ -1803,15 +1805,17 @@ class programModel extends model
}
if($id == 'PRJBudget')
{
$budget = $project->budget != 0 ? zget($this->lang->program->currencySymbol, $project->budgetUnit) . number_format($project->budget, 2) : $this->lang->program->future;
$title = "title='$budget'";
$programBudget = in_array($this->app->getClientLang(), ['zh-cn','zh-tw']) && $project->budget >= 10000 ? number_format($project->budget / 10000, 1) . $this->lang->program->tenThousand : number_format($project->budget, 1);
$budgetTitle = $project->budget != 0 ? zget($this->lang->program->currencySymbol, $project->budgetUnit) . ' ' . $programBudget : $this->lang->program->future;
$title = "title='$budgetTitle'";
}
if($id == 'PRJEstimate') $title = "title='{$project->hours->totalEstimate} {$this->lang->project->workHour}'";
if($id == 'PRJConsume') $title = "title='{$project->hours->totalConsumed} {$this->lang->project->workHour}'";
if($id == 'PRJSurplus') $title = "title='{$project->hours->totalLeft} {$this->lang->project->workHour}'";
echo "<td class='c-name " . $class . "' $title>";
echo "<td class='$class' $title>";
switch($id)
{
case 'id':
@@ -1848,7 +1852,7 @@ class programModel extends model
echo "<span class='status-task status-{$project->status}'> " . zget($this->lang->program->statusList, $project->status) . "</span>";
break;
case 'PRJBudget':
echo $budget;
echo $budgetTitle;
break;
case 'teamCount':
echo $project->teamCount;
+3 -2
View File
@@ -9,7 +9,7 @@
<?php echo $lang->program->PGMName;?>
</th>
<th class='w-100px'><?php common::printOrderLink('PM', $orderBy, $vars, $lang->program->PGMPM);?></th>
<th class='w-100px'><?php common::printOrderLink('budget', $orderBy, $vars, $lang->program->PGMBudget);?></th>
<th class='text-right w-100px'><?php common::printOrderLink('budget', $orderBy, $vars, $lang->program->PGMBudget);?></th>
<th class='w-90px'> <?php common::printOrderLink('status', $orderBy, $vars, $lang->program->PGMStatus);?></th>
<th class='w-100px'><?php common::printOrderLink('begin', $orderBy, $vars, $lang->program->begin);?></th>
<th class='w-100px'><?php common::printOrderLink('end', $orderBy, $vars, $lang->program->end);?></th>
@@ -56,7 +56,8 @@
<?php $userID = isset($PMList[$program->PM]) ? $PMList[$program->PM]->id : ''?>
<?php if(!empty($program->PM)) echo html::a($this->createLink('user', 'profile', "userID=$userID", '', true), zget($users, $program->PM), '', "data-toggle='modal' data-type='iframe' data-width='600'");?>
</td>
<td class='text-left'><?php echo $program->budget != 0 ? zget($lang->program->currencySymbol, $program->budgetUnit) . number_format($program->budget, 2) : $lang->program->future;?></td>
<?php $programBudget = in_array($this->app->getClientLang(), ['zh-cn','zh-tw']) && $program->budget >= 10000 ? number_format($program->budget / 10000, 1) . $lang->program->tenThousand : number_format($program->budget, 1);?>
<td class='text-right'><?php echo $program->budget != 0 ? zget($lang->program->currencySymbol, $program->budgetUnit) . ' ' . $programBudget : $lang->program->future;?></td>
<td class='c-status'><span class="status-program status-<?php echo $program->status?>"><?php echo zget($lang->project->statusList, $program->status, '');?></span></td>
<td><?php echo $program->begin;?></td>
<td><?php echo $program->end == LONG_TIME ? $lang->program->PRJLongTime : $program->end;?></td>
+27 -11
View File
@@ -121,6 +121,7 @@ class project extends control
$this->loadModel('search');
$this->loadModel('task');
$this->loadModel('datatable');
$this->loadModel('setting');
if(common::hasPriv('project', 'create')) $this->lang->TRActions = html::a($this->createLink('project', 'create', ''), "<i class='icon icon-sm icon-plus'></i> " . $this->lang->project->create, '', "class='btn btn-primary'");
@@ -133,6 +134,14 @@ class project extends control
$products = $this->loadModel('product')->getProductPairsByProject($executionID);
setcookie('preProjectID', $executionID, $this->config->cookieLife, $this->config->webRoot, '', false, true);
/* Save the recently five executions visited in the cookie. */
$recentExecutions = isset($this->config->project->recentExecutions) ? explode(',', $this->config->project->recentExecutions) : array();
array_unshift($recentExecutions, $executionID);
$recentExecutions = array_unique($recentExecutions);
$recentExecutions = array_slice($recentExecutions, 0, 5);
$this->setting->setItem($this->app->user->account . 'common.project.recentExecutions', implode(',', $recentExecutions));
$this->setting->setItem($this->app->user->account . 'common.project.lastExecution', $executionID);
if($this->cookie->preProjectID != $executionID)
{
$_COOKIE['moduleBrowseParam'] = $_COOKIE['productBrowseParam'] = 0;
@@ -2471,18 +2480,25 @@ class project extends control
*/
public function ajaxGetRecentExecutions()
{
$executions = $this->project->getRecentExecutions();
if(!empty($executions))
$allExecution = $this->project->getRecentExecutions();
if(!empty($allExecution))
{
$executionsName = array();
foreach($executions as $execution) $executionsName[] = $execution->name;
$executionsPinYin = common::convert2Pinyin($executionsName);
foreach($executions as $execution)
foreach($allExecution as $type => $executionList)
{
$link = helper::createLink('project', 'task', 'executionID=' . $execution->id, '', false, $execution->project);
$execution->code = empty($execution->code) ? $execution->name : $execution->code;
$dataKey = 'date-key="' . zget($executionsPinYin, $execution->name, $execution->name) . '"';
echo html::a($link, '<i class="icon icon-' . $this->lang->icons[$execution->type] . '"></i> ' . $execution->name, '', "class='search-list-item' title='$execution->name' $dataKey");
echo '<div class="heading">'. $this->lang->project->$type . '</div>';
$color = $type == 'recent' ? 'text-brown' : '';
$executions = $allExecution[$type];
$executionsName = array();
foreach($executions as $execution) $executionsName[] = $execution->name;
$executionsPinYin = common::convert2Pinyin($executionsName);
foreach($executions as $execution)
{
$link = helper::createLink('project', 'task', 'executionID=' . $execution->id, '', false, $execution->project);
$execution->code = empty($execution->code) ? $execution->name : $execution->code;
$dataKey = 'date-key="' . zget($executionsPinYin, $execution->name, $execution->name) . '"';
$class = "class='search-list-item $color' title='$execution->name' $dataKey";
echo html::a($link, '<i class="icon icon-' . $this->lang->icons[$execution->type] . '"></i> ' . $execution->name, '', $class);
}
}
}
else
@@ -2545,7 +2561,7 @@ class project extends control
* @access public
* @return void
*/
public function all($status = 'all', $projectID = 0, $orderBy = 'id_asc', $productID = 0, $recTotal = 0, $recPerPage = 10, $pageID = 1)
public function all($status = 'all', $projectID = 0, $orderBy = 'id_desc', $productID = 0, $recTotal = 0, $recPerPage = 10, $pageID = 1)
{
$this->app->loadLang('my');
$this->app->loadLang('programplan');
+1
View File
@@ -81,6 +81,7 @@ $lang->project->waitTasks = 'Waiting Tasks';
$lang->project->viewByUser = 'By User';
$lang->project->oneProduct = "Only one stage can be linked {$lang->productCommon}";
$lang->project->noLinkProduct = "Stage not linked {$lang->productCommon}";
$lang->project->recent = 'Recent visits: ';
$lang->project->start = 'Start';
$lang->project->activate = 'Aktivieren';
+1
View File
@@ -81,6 +81,7 @@ $lang->project->waitTasks = 'Waiting Tasks';
$lang->project->viewByUser = 'By User';
$lang->project->oneProduct = "Only one stage can be linked {$lang->productCommon}";
$lang->project->noLinkProduct = "Stage not linked {$lang->productCommon}";
$lang->project->recent = 'Recent visits: ';
$lang->project->start = 'Start';
$lang->project->activate = 'Activate';
+1
View File
@@ -81,6 +81,7 @@ $lang->project->waitTasks = 'Waiting Tasks';
$lang->project->viewByUser = 'Par Utilisateur';
$lang->project->oneProduct = "Only one stage can be linked {$lang->productCommon}";
$lang->project->noLinkProduct = "Stage not linked {$lang->productCommon}";
$lang->project->recent = 'Recent visits: ';
$lang->project->start = 'Démarrer';
$lang->project->activate = 'Activer';
+1
View File
@@ -81,6 +81,7 @@ $lang->project->waitTasks = 'Waiting Tasks';
$lang->project->viewByUser = 'Theo người dùng';
$lang->project->oneProduct = "Only one stage can be linked {$lang->productCommon}";
$lang->project->noLinkProduct = "Stage not linked {$lang->productCommon}";
$lang->project->recent = 'Recent visits: ';
$lang->project->start = 'Bắt đầu';
$lang->project->activate = 'Kích hoạt';
+1
View File
@@ -81,6 +81,7 @@ $lang->project->waitTasks = '待处理';
$lang->project->viewByUser = '按用户查看';
$lang->project->oneProduct = "阶段只能关联一个{$lang->productCommon}";
$lang->project->noLinkProduct = "阶段没有关联{$lang->productCommon}";
$lang->project->recent = '近期访问:';
$lang->project->start = "开始";
$lang->project->activate = "激活";
+1
View File
@@ -81,6 +81,7 @@ $lang->project->waitTasks = '待處理';
$lang->project->viewByUser = '按用戶查看';
$lang->project->oneProduct = "階段只能關聯一個{$lang->productCommon}";
$lang->project->noLinkProduct = "階段沒有關聯{$lang->productCommon}";
$lang->project->recent = '近期访问:';
$lang->project->start = "開始";
$lang->project->activate = "激活";
+22 -6
View File
@@ -276,12 +276,18 @@ class projectModel extends model
*/
public function saveState($executionID, $executions)
{
/* When the cookie and session do not exist, get it from the database. */
if(empty($executionID) && isset($this->config->project->lastExecution) && isset($executions[$this->config->project->lastExecution]))
{
$this->session->set('project', $this->config->project->lastExecution);
return $this->session->project;
}
if($executionID > 0) $this->session->set('project', (int)$executionID);
if($executionID == 0 and $this->cookie->lastProject)
{
/* Project link is project-task. */
$executionID = (int)$this->cookie->lastProject;
$executions = $this->getExecutionPairs($this->session->PRJ);
$executionID = in_array($executionID, array_keys($executions)) ? $executionID : key($executions);
$this->session->set('project', $executionID);
}
@@ -3594,7 +3600,7 @@ class projectModel extends model
->beginIF(!$this->app->user->admin)->andWhere('t1.project')->in($this->app->user->view->projects)->fi()
->andWhere('t1.status')->ne('closed')
->andWhere('t1.deleted')->eq('0')
->orderBy('id_desc')
->orderBy('project_desc, id_desc')
->fetchAll();
/* Get the project or product to which the execution belongs. */
@@ -3602,19 +3608,29 @@ class projectModel extends model
$stageIdList = array();
foreach($executions as $execution)
{
if($execution->type == 'stage') $stageIdList[$execution->id] = $execution->id;
if($execution->type == 'sprint') $projectIdList[$execution->project] = $execution->project;
if($execution->type == 'stage') $stageIdList[$execution->id] = $execution->id;
$projectIdList[$execution->project] = $execution->project;
}
$projectPairs = $this->loadModel('program')->getPRJPairsByIdList($projectIdList);
$productPairs = $this->getStageLinkProductPairs($stageIdList);
$recentExecutions = isset($this->config->project->recentExecutions) ? explode(',', $this->config->project->recentExecutions) : array();
$allExecution = array('recent' => array(), 'mine' => array());
foreach($executions as $execution)
{
if($execution->type == 'stage') $execution->name = zget($productPairs, $execution->id) . '/' . $execution->name;
if($execution->type == 'stage') $execution->name = zget($projectPairs, $execution->project) . '/' . zget($productPairs, $execution->id) . '/' . $execution->name;
if($execution->type == 'sprint') $execution->name = zget($projectPairs, $execution->project) . '/' . $execution->name;
if(in_array($execution->id, $recentExecutions))
{
$index = array_search($execution->id, $recentExecutions);
$allExecution['recent'][$index] = $execution;
continue;
}
$allExecution['mine'][] = $execution;
}
return $executions;
ksort($allExecution['recent']);
return $allExecution;
}
/**
+2 -2
View File
@@ -157,7 +157,7 @@
<tr id="story<?php echo $story->id;?>" data-id='<?php echo $story->id;?>' data-order='<?php echo $story->order ?>' data-estimate='<?php echo $story->estimate?>' data-cases='<?php echo zget($storyCases, $story->id, 0)?>'>
<td class='cell-id'>
<?php if($canBatchAction):?>
<?php echo html::checkbox('storyIdList', array($story->id => '')) . html::a(helper::createLink('story', 'view', "storyID=$story->id"), sprintf('%03d', $story->id));?>
<?php echo html::checkbox('storyIdList', array($story->id => '')) . html::a(helper::createLink('story', 'view', "storyID=$story->id&version=$story->version&from=project&param=$project->id"), sprintf('%03d', $story->id), null, "data-group='project'");?>
<?php else:?>
<?php printf('%03d', $story->id);?>
<?php endif;?>
@@ -169,7 +169,7 @@
<td class='c-name' title="<?php echo $story->title?>">
<?php if(isset($branchGroups[$story->product][$story->branch])) echo "<span class='label label-outline label-badge'>" . $branchGroups[$story->product][$story->branch] . '</span>';?>
<?php if($story->parent > 0) echo "<span class='label'>{$lang->story->childrenAB}</span>";?>
<?php echo html::a($storyLink,$story->title, null, "style='color: $story->color'");?>
<?php echo html::a($storyLink,$story->title, null, "style='color: $story->color' data-group='project'");?>
</td>
<td class='c-user' title='<?php echo zget($users, $story->openedBy);?>'><?php echo zget($users, $story->openedBy);?></td>
<td class='c-user' title='<?php echo zget($users, $story->assignedTo);?>'><?php echo zget($users, $story->assignedTo);?></td>
+1 -1
View File
@@ -54,7 +54,7 @@ class projectStory extends control
$this->lang->story->createStory = str_replace($this->lang->SRCommon, $this->lang->SRCommon, $this->lang->story->createStory);
$this->lang->story->noStory = str_replace($this->lang->SRCommon, $this->lang->SRCommon, $this->lang->story->noStory);
echo $this->fetch('product', 'browse', "productID=$productID&branch=$branch&browseType=$browseType&param=$param&storyType=$storyType&orderBy=$orderBy&recTotal=$recTotal&recPerPage=$recPerPage&pageID=$pageID");
echo $this->fetch('product', 'browse', "productID=$productID&branch=$branch&browseType=$browseType&param=$param&storyType=$storyType&orderBy=$orderBy&recTotal=$recTotal&recPerPage=$recPerPage&pageID=$pageID&from=project");
}
/**
+2 -4
View File
@@ -298,16 +298,14 @@ class report extends control
if(empty($userID)) unset($depts[0]);
$accounts = array();
if($dept)
{
$accounts = $this->loadModel('dept')->getDeptUserPairs($dept);
}
if($dept) $accounts = $this->loadModel('dept')->getDeptUserPairs($dept);
if($userID)
{
$user = $this->loadModel('user')->getById($userID, 'id');
$dept = $user->dept;
$accounts = array($user->account => ($user->realname ? $user->realname : $user->account));
}
if(empty($accounts)) $accounts = $this->user->getPairs('noletter|noclosed');
if($accounts) $accounts = array_keys($accounts);
if($dept)
+5 -5
View File
@@ -119,13 +119,13 @@ $lang->report->annualData->baseInfo = "Basic Data";
$lang->report->annualData->actionData = "Operation Data";
$lang->report->annualData->contributionData = "Contribution Data";
$lang->report->annualData->radar = "Capability Radar Chart";
$lang->report->annualData->projects = "{$lang->projectCommon} Data";
$lang->report->annualData->projects = "{$lang->executionCommon} Data";
$lang->report->annualData->products = "{$lang->productCommon} Data";
$lang->report->annualData->stories = "Story Data";
$lang->report->annualData->tasks = "Task Data";
$lang->report->annualData->bugs = "Bug Data";
$lang->report->annualData->cases = "Case Data";
$lang->report->annualData->statusStat = "{$lang->storyCommon}/task/bug status distribution (as of today)";
$lang->report->annualData->statusStat = "{$lang->SRCommon}/task/bug status distribution (as of today)";
$lang->report->annualData->companyUsers = "Number of company";
$lang->report->annualData->deptUsers = "Number of departments";
@@ -150,7 +150,7 @@ $lang->report->annualData->taskMonthActions = "Monthly task operation";
$lang->report->annualData->bugMonthActions = "Monthly bug operation";
$lang->report->annualData->caseMonthActions = "Monthly case operation";
$lang->report->annualData->projectFields['name'] = "{$lang->projectCommon} name";
$lang->report->annualData->projectFields['name'] = "{$lang->executionCommon} name";
$lang->report->annualData->projectFields['story'] = "Finished stories";
$lang->report->annualData->projectFields['task'] = "Finished tasks";
$lang->report->annualData->projectFields['bug'] = "Resolved bugs";
@@ -166,10 +166,10 @@ $lang->report->annualData->productFields['story'] = "Created stories";
$lang->report->annualData->productFields['finished'] = "Finished stories";
$lang->report->annualData->objectTypeList['product'] = $lang->productCommon;
$lang->report->annualData->objectTypeList['story'] = $lang->storyCommon;
$lang->report->annualData->objectTypeList['story'] = $lang->SRCommon;
$lang->report->annualData->objectTypeList['productplan'] = "Plan";
$lang->report->annualData->objectTypeList['release'] = "Release";
$lang->report->annualData->objectTypeList['project'] = $lang->projectCommon;
$lang->report->annualData->objectTypeList['project'] = $lang->executionCommon;
$lang->report->annualData->objectTypeList['task'] = 'Task';
$lang->report->annualData->objectTypeList['repo'] = 'Code';
$lang->report->annualData->objectTypeList['bug'] = 'Bug';
+5 -5
View File
@@ -119,13 +119,13 @@ $lang->report->annualData->baseInfo = "Basic Data";
$lang->report->annualData->actionData = "Operation Data";
$lang->report->annualData->contributionData = "Contribution Data";
$lang->report->annualData->radar = "Capability Radar Chart";
$lang->report->annualData->projects = "{$lang->projectCommon} Data";
$lang->report->annualData->projects = "{$lang->executionCommon} Data";
$lang->report->annualData->products = "{$lang->productCommon} Data";
$lang->report->annualData->stories = "Story Data";
$lang->report->annualData->tasks = "Task Data";
$lang->report->annualData->bugs = "Bug Data";
$lang->report->annualData->cases = "Case Data";
$lang->report->annualData->statusStat = "{$lang->storyCommon}/task/bug status distribution (as of today)";
$lang->report->annualData->statusStat = "{$lang->SRCommon}/task/bug status distribution (as of today)";
$lang->report->annualData->companyUsers = "Number of company";
$lang->report->annualData->deptUsers = "Number of departments";
@@ -150,7 +150,7 @@ $lang->report->annualData->taskMonthActions = "Monthly task operation";
$lang->report->annualData->bugMonthActions = "Monthly bug operation";
$lang->report->annualData->caseMonthActions = "Monthly case operation";
$lang->report->annualData->projectFields['name'] = "{$lang->projectCommon} name";
$lang->report->annualData->projectFields['name'] = "{$lang->executionCommon} name";
$lang->report->annualData->projectFields['story'] = "Finished stories";
$lang->report->annualData->projectFields['task'] = "Finished tasks";
$lang->report->annualData->projectFields['bug'] = "Resolved bugs";
@@ -166,10 +166,10 @@ $lang->report->annualData->productFields['story'] = "Created stories";
$lang->report->annualData->productFields['finished'] = "Finished stories";
$lang->report->annualData->objectTypeList['product'] = $lang->productCommon;
$lang->report->annualData->objectTypeList['story'] = $lang->storyCommon;
$lang->report->annualData->objectTypeList['story'] = $lang->SRCommon;
$lang->report->annualData->objectTypeList['productplan'] = "Plan";
$lang->report->annualData->objectTypeList['release'] = "Release";
$lang->report->annualData->objectTypeList['project'] = $lang->projectCommon;
$lang->report->annualData->objectTypeList['project'] = $lang->executionCommon;
$lang->report->annualData->objectTypeList['task'] = 'Task';
$lang->report->annualData->objectTypeList['repo'] = 'Code';
$lang->report->annualData->objectTypeList['bug'] = 'Bug';
+5 -5
View File
@@ -119,13 +119,13 @@ $lang->report->annualData->baseInfo = "Basic Data";
$lang->report->annualData->actionData = "Operation Data";
$lang->report->annualData->contributionData = "Contribution Data";
$lang->report->annualData->radar = "Capability Radar Chart";
$lang->report->annualData->projects = "{$lang->projectCommon} Data";
$lang->report->annualData->projects = "{$lang->executionCommon} Data";
$lang->report->annualData->products = "{$lang->productCommon} Data";
$lang->report->annualData->stories = "Story Data";
$lang->report->annualData->tasks = "Task Data";
$lang->report->annualData->bugs = "Bug Data";
$lang->report->annualData->cases = "Case Data";
$lang->report->annualData->statusStat = "{$lang->storyCommon}/task/bug status distribution (as of today)";
$lang->report->annualData->statusStat = "{$lang->SRCommon}/task/bug status distribution (as of today)";
$lang->report->annualData->companyUsers = "Number of company";
$lang->report->annualData->deptUsers = "Number of departments";
@@ -150,7 +150,7 @@ $lang->report->annualData->taskMonthActions = "Monthly task operation";
$lang->report->annualData->bugMonthActions = "Monthly bug operation";
$lang->report->annualData->caseMonthActions = "Monthly case operation";
$lang->report->annualData->projectFields['name'] = "{$lang->projectCommon} name";
$lang->report->annualData->projectFields['name'] = "{$lang->executionCommon} name";
$lang->report->annualData->projectFields['story'] = "Finished stories";
$lang->report->annualData->projectFields['task'] = "Finished tasks";
$lang->report->annualData->projectFields['bug'] = "Resolved bugs";
@@ -166,10 +166,10 @@ $lang->report->annualData->productFields['story'] = "Created stories";
$lang->report->annualData->productFields['finished'] = "Finished stories";
$lang->report->annualData->objectTypeList['product'] = $lang->productCommon;
$lang->report->annualData->objectTypeList['story'] = $lang->storyCommon;
$lang->report->annualData->objectTypeList['story'] = $lang->SRCommon;
$lang->report->annualData->objectTypeList['productplan'] = "Plan";
$lang->report->annualData->objectTypeList['release'] = "Release";
$lang->report->annualData->objectTypeList['project'] = $lang->projectCommon;
$lang->report->annualData->objectTypeList['project'] = $lang->executionCommon;
$lang->report->annualData->objectTypeList['task'] = 'Task';
$lang->report->annualData->objectTypeList['repo'] = 'Code';
$lang->report->annualData->objectTypeList['bug'] = 'Bug';
+5 -5
View File
@@ -119,13 +119,13 @@ $lang->report->annualData->baseInfo = "Basic Data";
$lang->report->annualData->actionData = "Operation Data";
$lang->report->annualData->contributionData = "Contribution Data";
$lang->report->annualData->radar = "Capability Radar Chart";
$lang->report->annualData->projects = "{$lang->projectCommon} Data";
$lang->report->annualData->projects = "{$lang->executionCommon} Data";
$lang->report->annualData->products = "{$lang->productCommon} Data";
$lang->report->annualData->stories = "Story Data";
$lang->report->annualData->tasks = "Task Data";
$lang->report->annualData->bugs = "Bug Data";
$lang->report->annualData->cases = "Case Data";
$lang->report->annualData->statusStat = "{$lang->storyCommon}/task/bug status distribution (as of today)";
$lang->report->annualData->statusStat = "{$lang->SRCommon}/task/bug status distribution (as of today)";
$lang->report->annualData->companyUsers = "Number of company";
$lang->report->annualData->deptUsers = "Number of departments";
@@ -150,7 +150,7 @@ $lang->report->annualData->taskMonthActions = "Monthly task operation";
$lang->report->annualData->bugMonthActions = "Monthly bug operation";
$lang->report->annualData->caseMonthActions = "Monthly case operation";
$lang->report->annualData->projectFields['name'] = "{$lang->projectCommon} name";
$lang->report->annualData->projectFields['name'] = "{$lang->executionCommon} name";
$lang->report->annualData->projectFields['story'] = "Finished stories";
$lang->report->annualData->projectFields['task'] = "Finished tasks";
$lang->report->annualData->projectFields['bug'] = "Resolved bugs";
@@ -166,10 +166,10 @@ $lang->report->annualData->productFields['story'] = "Created stories";
$lang->report->annualData->productFields['finished'] = "Finished stories";
$lang->report->annualData->objectTypeList['product'] = $lang->productCommon;
$lang->report->annualData->objectTypeList['story'] = $lang->storyCommon;
$lang->report->annualData->objectTypeList['story'] = $lang->SRCommon;
$lang->report->annualData->objectTypeList['productplan'] = "Plan";
$lang->report->annualData->objectTypeList['release'] = "Release";
$lang->report->annualData->objectTypeList['project'] = $lang->projectCommon;
$lang->report->annualData->objectTypeList['project'] = $lang->executionCommon;
$lang->report->annualData->objectTypeList['task'] = 'Task';
$lang->report->annualData->objectTypeList['repo'] = 'Code';
$lang->report->annualData->objectTypeList['bug'] = 'Bug';
+6 -6
View File
@@ -119,13 +119,13 @@ $lang->report->annualData->baseInfo = "基本数据";
$lang->report->annualData->actionData = "操作数据";
$lang->report->annualData->contributionData = "贡献数据";
$lang->report->annualData->radar = "能力雷达图";
$lang->report->annualData->projects = "{$lang->projectCommon}数据";
$lang->report->annualData->projects = "{$lang->executionCommon}数据";
$lang->report->annualData->products = "{$lang->productCommon}数据";
$lang->report->annualData->stories = "需求数据";
$lang->report->annualData->tasks = "任务数据";
$lang->report->annualData->bugs = "Bug数据";
$lang->report->annualData->cases = "用例数据";
$lang->report->annualData->statusStat = "{$lang->storyCommon}/任务/Bug状态分布(截止今日)";
$lang->report->annualData->statusStat = "{$lang->SRCommon}/任务/Bug状态分布(截止今日)";
$lang->report->annualData->companyUsers = "公司总人数";
$lang->report->annualData->deptUsers = "部门人数";
@@ -150,8 +150,8 @@ $lang->report->annualData->taskMonthActions = "每月任务操作情况";
$lang->report->annualData->bugMonthActions = "每月Bug操作情况";
$lang->report->annualData->caseMonthActions = "每月用例操作情况";
$lang->report->annualData->projectFields['name'] = "{$lang->projectCommon}名称";
$lang->report->annualData->projectFields['story'] = "完成{$lang->storyCommon}数";
$lang->report->annualData->projectFields['name'] = "{$lang->executionCommon}名称";
$lang->report->annualData->projectFields['story'] = "完成{$lang->SRCommon}数";
$lang->report->annualData->projectFields['task'] = "完成任务数";
$lang->report->annualData->projectFields['bug'] = "解决Bug数";
@@ -162,14 +162,14 @@ if(!empty($config->URAndSR))
{
$lang->report->annualData->productFields['requirement'] = "创建{$lang->URCommon}数";
}
$lang->report->annualData->productFields['story'] = "创建{$lang->storyCommon}数";
$lang->report->annualData->productFields['story'] = "创建{$lang->SRCommon}数";
$lang->report->annualData->productFields['finished'] = "完成需求数";
$lang->report->annualData->objectTypeList['product'] = $lang->productCommon;
$lang->report->annualData->objectTypeList['story'] = "需求";
$lang->report->annualData->objectTypeList['productplan'] = "计划";
$lang->report->annualData->objectTypeList['release'] = "发布";
$lang->report->annualData->objectTypeList['project'] = $lang->projectCommon;
$lang->report->annualData->objectTypeList['project'] = $lang->executionCommon;
$lang->report->annualData->objectTypeList['task'] = '任务';
$lang->report->annualData->objectTypeList['repo'] = '代码';
$lang->report->annualData->objectTypeList['bug'] = 'Bug';
-12
View File
@@ -214,18 +214,6 @@ class stakeholder extends control
die(html::select('user', $users, '', "class='form-control chosen' onchange=changeUser(this.value);"));
}
/**
* Ajax get outside company.
*
* @access public
* @return void
*/
public function ajaxGetOutsideCompany()
{
$companys = $this->loadModel('company')->getOutsideCompanies();
die(html::select('company', $companys, '', "class='form-control chosen'"));
}
/**
* Ajax get control.
*
+1 -1
View File
@@ -51,7 +51,7 @@ $(function()
}
else
{
var link = createLink('stakeholder', 'ajaxGetOutsideCompany');
var link = createLink('company', 'ajaxGetOutsideCompany');
$.post(link, function(data)
{
$('#company').replaceWith(data);
+55 -20
View File
@@ -528,10 +528,11 @@ class story extends control
* Edit a story.
*
* @param int $storyID
* @param string $from product|project
* @access public
* @return void
*/
public function edit($storyID)
public function edit($storyID, $from = 'product')
{
if(!empty($_POST))
{
@@ -552,10 +553,17 @@ class story extends control
}
else
{
die(js::locate($this->createLink('story', 'view', "storyID=$storyID"), 'parent'));
$module = $from == 'project' ? 'projectstory' : 'story';
die(js::locate($this->createLink($module, 'view', "storyID=$storyID"), 'parent'));
}
}
if($from == 'project')
{
$this->app->rawModule = 'projectstory';
$this->lang->navGroup->story = 'project';
}
$this->commonAction($storyID);
/* Assign. */
@@ -726,10 +734,11 @@ class story extends control
* Change a story.
*
* @param int $storyID
* @param string $from product|project
* @access public
* @return void
*/
public function change($storyID)
public function change($storyID, $from = 'product')
{
if(!empty($_POST))
{
@@ -749,7 +758,14 @@ class story extends control
$this->executeHooks($storyID);
die(js::locate($this->createLink('story', 'view', "storyID=$storyID"), 'parent'));
$module = $from == 'project' ? 'projectstory' : 'story';
die(js::locate($this->createLink($module, 'view', "storyID=$storyID"), 'parent'));
}
if($from == 'project')
{
$this->app->rawModule = 'projectstory';
$this->lang->navGroup->story = 'project';
}
$this->commonAction($storyID);
@@ -829,20 +845,30 @@ class story extends control
$users = $this->user->getPairs('noletter');
/* Set the menu. */
$this->lang->product->menu = $this->lang->product->viewMenu;
$this->lang->product->switcherMenu = $this->product->getSwitcher($product->id);
$this->lang->product->mainMenuAction = $this->product->getProductMainAction();
$this->product->setMenu($this->product->getPairs(), $product->id, $story->branch);
if($this->app->rawModule == 'projectstory')
{
$project = $this->dao->findById((int)$this->session->PRJ)->from(TABLE_PROJECT)->fetch();
$this->lang->product->menu = $this->lang->menu->{$project->model};
}
if($from == 'project')
{
$project = $this->loadModel('project')->getById($param);
if($project->status == 'done') $from = '';
$project = $this->dao->findById((int)$this->session->PRJ)->from(TABLE_PROJECT)->fetch();
$this->app->rawModule = 'project';
$this->lang->navGroup->story = 'project';
$this->lang->product->menu = $this->lang->menu->{$project->model};
$this->project->setMenu($this->project->getExecutionPairs($this->session->PRJ, 'all', 'nodeleted'), $project->id);
/* If status is done, can not create task from story. */
$execution = $this->loadModel('project')->getById($param);
if($execution->status == 'done') $from = '';
}
else
{
$this->lang->product->menu = $this->lang->product->viewMenu;
$this->product->setMenu($this->product->getPairs(), $product->id, $story->branch);
$this->lang->product->switcherMenu = $this->product->getSwitcher($product->id);
$this->lang->product->mainMenuAction = $this->product->getProductMainAction();
if($this->app->rawModule == 'projectstory')
{
$project = $this->dao->findById((int)$this->session->PRJ)->from(TABLE_PROJECT)->fetch();
$this->lang->product->menu = $this->lang->menu->{$project->model};
}
}
$this->executeHooks($storyID);
@@ -913,10 +939,11 @@ class story extends control
* Review a story.
*
* @param int $storyID
* @param string $from product|project
* @access public
* @return void
*/
public function review($storyID)
public function review($storyID, $from = 'product')
{
$this->product;
$this->lang->product->menu = $this->lang->product->viewMenu;
@@ -938,7 +965,8 @@ class story extends control
$this->executeHooks($storyID);
die(js::locate(inlink('view', "storyID=$storyID"), 'parent'));
$module = $from == 'project' ? 'projectstory' : 'story';
die(js::locate($this->createLink($module, 'view', "storyID=$storyID"), 'parent'));
}
/* Get story and product. */
@@ -948,7 +976,15 @@ class story extends control
$this->story->replaceURLang($story->type);
/* Set menu. */
$this->product->setMenu($this->product->getPairs(), $product->id, $story->branch);
if($from == 'project')
{
$this->app->rawModule = 'projectstory';
$this->lang->navGroup->story = 'project';
}
else
{
$this->product->setMenu($this->product->getPairs(), $product->id, $story->branch);
}
/* Set the review result options. */
if($story->status == 'draft' and $story->version == 1) unset($this->lang->story->reviewResultList['revert']);
@@ -1367,7 +1403,6 @@ class story extends control
$this->session->set('bugList', $this->app->getURI(true));
$this->session->set('revisionList', $this->app->getURI(true));
/* Load pager and get tracks. */
$this->app->loadClass('pager', $static = true);
$pager = new pager($recTotal, $recPerPage, $pageID);
+1 -1
View File
@@ -4,7 +4,7 @@ $(function()
if(typeof(storyType) == 'undefined') storyType = '';
if(typeof(rawModule) == 'undefined') rawModule = 'product';
if(typeof(project) != 'undefined') rawModule = 'projectstory';
if(rawModule != 'projectstory')
if(['project', 'projectstory'].indexOf(rawModule) === -1)
{
$('#navbar .nav li').removeClass('active');
$("#navbar .nav li[data-id=" + storyType + ']').addClass('active');
+33 -16
View File
@@ -3482,10 +3482,10 @@ class storyModel extends model
break;
}
common::printIcon('story', 'change', $vars, $story, 'list', 'fork');
common::printIcon('story', 'review', $vars, $story, 'list', 'glasses');
common::printIcon('story', 'change', $vars . "&from=$story->from", $story, 'list', 'fork', '', '', false, "data-group=$story->from");
common::printIcon('story', 'review', $vars . "&from=$story->from", $story, 'list', 'glasses', '', '', false, "data-group=$story->from");
common::printIcon('story', 'close', $vars, $story, 'list', '', '', 'iframe', true);
common::printIcon('story', 'edit', $vars, $story, 'list');
common::printIcon('story', 'edit', $vars . "&from=$story->from", $story, 'list', '', '', '', false, "data-group=$story->from");
common::printIcon('story', 'createCase', "productID=$story->product&branch=$story->branch&module=0&from=&param=0&$vars", $story, 'list', 'sitemap');
common::printIcon('story', 'batchCreate', "productID=$story->product&branch=$story->branch&module=$story->module&storyID=$story->id", $story, 'list', 'split', '', '', '', '', $this->lang->story->subdivide);
if($this->app->rawModule == 'projectstory') common::printIcon('projectstory', 'unlinkStory', "projectID={$this->session->PRJ}&storyID=$story->id", '', 'list', 'unlink', 'hiddenwin');
@@ -3644,19 +3644,30 @@ class storyModel extends model
$stories = empty($stories) ? array() : $stories;
foreach($stories as $id => $title)
{
$stories[$id] = new stdclass();
$stories[$id]->title = $title;
$stories[$id]->case = $this->loadModel('testcase')->getStoryCases($id);
$stories[$id]->bug = $this->loadModel('bug')->getStoryBugs($id);
$stories[$id]->design = $this->dao->select('id, name')->from(TABLE_DESIGN)->where('story')->eq($id)->fetchAll('id');
$stories[$id]->revision = $this->dao->select('BID, extra')->from(TABLE_RELATION)->where('AType')->eq('design')->andWhere('BType')->eq('commit')->andWhere('AID')->in(array_keys($stories[$id]->design))->fetchPairs();
$stories[$id] = new stdclass();
$stories[$id]->title = $title;
$stories[$id]->cases = $this->loadModel('testcase')->getStoryCases($id);
$stories[$id]->bugs = $this->loadModel('bug')->getStoryBugs($id);
$stories[$id]->tasks = $this->loadModel('task')->getStoryTasks($id);
$stories[$id]->designs = $this->dao->select('id, name')->from(TABLE_DESIGN)->where('story')->eq($id)->fetchAll('id');
$stories[$id]->revisions = $this->dao->select('BID, extra')->from(TABLE_RELATION)
->where('AType')->eq('design')
->andWhere('BType')->eq('commit')
->andWhere('AID')->in(array_keys($stories[$id]->designs))
->fetchPairs();
}
$requirement->track = $stories;
}
/* Get no requirements story. */
$subdividedStories = $this->dao->select('BID')->from(TABLE_RELATION)->where('AType')->eq('requirement')->andWhere('BType')->eq('story')->andWhere('relation')->eq('subdivideinto')->andWhere('product')->eq($productID)->fetchPairs('BID', 'BID');
$subdividedStories = $this->dao->select('BID')->from(TABLE_RELATION)
->where('AType')->eq('requirement')
->andWhere('BType')->eq('story')
->andWhere('relation')->eq('subdivideinto')
->andWhere('product')->eq($productID)
->fetchPairs('BID', 'BID');
$stories = $this->getProductStories($productID, 0, 0, 'all', 'story', 'id_desc', true, $subdividedStories);
if($stories) $pager->recTotal += 1;
@@ -3664,13 +3675,19 @@ class storyModel extends model
{
foreach($stories as $id => $story)
{
$stories[$id] = new stdclass();
$stories[$id]->title = $story->title;
$stories[$id]->case = $this->loadModel('testcase')->getStoryCases($id);
$stories[$id]->bug = $this->loadModel('bug')->getStoryBugs($id);
$stories[$id]->design = $this->dao->select('id, name')->from(TABLE_DESIGN)->where('story')->eq($id)->fetchAll('id');
$stories[$id]->revision = $this->dao->select('BID, extra')->from(TABLE_RELATION)->where('AType')->eq('design')->andWhere('BType')->eq('commit')->andWhere('AID')->in(array_keys($stories[$id]->design))->fetchPairs();
$stories[$id] = new stdclass();
$stories[$id]->title = $story->title;
$stories[$id]->cases = $this->loadModel('testcase')->getStoryCases($id);
$stories[$id]->bugs = $this->loadModel('bug')->getStoryBugs($id);
$stories[$id]->tasks = $this->loadModel('task')->getStoryTasks($id);
$stories[$id]->designs = $this->dao->select('id, name')->from(TABLE_DESIGN)->where('story')->eq($id)->fetchAll('id');
$stories[$id]->revisions = $this->dao->select('BID, extra')->from(TABLE_RELATION)
->where('AType')->eq('design')
->andWhere('BType')->eq('commit')
->andWhere('AID')->in(array_keys($stories[$id]->designs))
->fetchPairs();
}
$requirements['noRequirement'] = $stories;
}
+1
View File
@@ -89,4 +89,5 @@
<?php js::set('oldStoryVerify', $story->verify);?>
<?php js::set('changed', 0);?>
<?php js::set('storyType', $story->type);?>
<?php js::set('rawModule', $this->app->rawModule);?>
<?php include '../../common/view/footer.html.php';?>
+1
View File
@@ -14,6 +14,7 @@
<?php js::set('oldProductID', $story->product);?>
<?php js::set('parentStory', !empty($story->children));?>
<?php js::set('moveChildrenTips', $lang->story->moveChildrenTips);?>
<?php js::set('rawModule', $this->app->rawModule);?>
<div class='main-content' id='mainContent'>
<form method='post' enctype='multipart/form-data' target='hiddenwin' id='dataform'>
<div class='main-header'>
+1
View File
@@ -95,4 +95,5 @@ var assignedTo = '<?php $story->lastEditedBy ? print($story->lastEditedBy) : pri
</div>
<?php js::set('storyID', $story->id);?>
<?php js::set('storyType', $story->type);?>
<?php js::set('rawModule', $this->app->rawModule);?>
<?php include '../../common/view/footer.html.php';?>
+10 -4
View File
@@ -38,6 +38,7 @@
<?php endif;?>
</th>
<th><?php echo $lang->story->story;?></th>
<th><?php echo $lang->story->tasks;?></th>
<th><?php echo $lang->story->design;?></th>
<th><?php echo $lang->story->case;?></th>
<th><?php echo $lang->story->repoCommit;?></th>
@@ -61,24 +62,29 @@
<?php if($i != 1) echo '<tr>';?>
<td style='padding-left: 10px;'><?php echo html::a($this->createLink($module, 'view', "storyID=$storyID"), $story->title, '',"title='$story->title' data-group='$openModel'");?></td>
<td>
<?php foreach($story->design as $designID => $design):?>
<?php foreach($story->tasks as $taskID => $task):?>
<?php echo html::a($this->createLink('task', 'view', "taskID=$taskID"), $task->name, '', "title='$task->name'") . '<br/>';?>
<?php endforeach;?>
</td>
<td>
<?php foreach($story->designs as $designID => $design):?>
<?php echo html::a($this->createLink('design', 'view', "designID=$designID"), $design->name, '', "title='$design->name'") . '<br/>';?>
<?php endforeach;?>
</td>
<td>
<?php foreach($story->case as $caseID => $case):?>
<?php foreach($story->cases as $caseID => $case):?>
<?php echo html::a($this->createLink('testcase', 'view', "caseID=$caseID", '', false, $case->PRJ), $case->title, '', "title='$case->title'") . '<br/>';?>
<?php endforeach;?>
</td>
<td>
<?php foreach($story->revision as $revision => $repoID):?>
<?php foreach($story->revisions as $revision => $repoID):?>
<?php
echo html::a($this->createLink('design', 'revision', "repoID=$revision"), '#'. $revision) . '<br/>';
?>
<?php endforeach;?>
</td>
<td>
<?php foreach($story->bug as $bugID => $bug):?>
<?php foreach($story->bugs as $bugID => $bug):?>
<?php echo html::a($this->createLink('bug', 'view', "bugID=$bugID"), $bug->title, '', "title='$bug->title'") . '<br/>';?>
<?php endforeach;?>
</td>
+10 -8
View File
@@ -185,13 +185,14 @@ class upgrade extends control
* @access public
* @return void
*/
public function mergeProgram($type = 'productline')
public function mergeProgram($type = 'productline', $programID = 0)
{
$this->session->set('upgrading', true);
$this->app->loadLang('program');
if($_POST)
{
$programID = 0;
if($type == 'productline')
{
$linkedProducts = array();
@@ -281,7 +282,7 @@ class upgrade extends control
}
}
die(js::locate($this->createLink('upgrade', 'mergeProgram', "type=$type"), 'parent'));
die(js::locate($this->createLink('upgrade', 'mergeProgram', "type=$type&programID=$programID"), 'parent'));
}
/* Get no merged product and project count. */
@@ -433,11 +434,12 @@ class upgrade extends control
$programs = $this->upgrade->getProgramPairs();
$this->view->title = $this->lang->upgrade->mergeProgram;
$this->view->programs = $programs;
$this->view->projects = $this->upgrade->getProjectPairsByProgram(key($programs));
$this->view->users = $this->loadModel('user')->getPairs('noclosed|noempty');
$this->view->groups = $this->loadModel('group')->getPairs();
$this->view->title = $this->lang->upgrade->mergeProgram;
$this->view->programs = $programs;
$this->view->programID = $programID;
$this->view->projects = array('' => '') + $this->upgrade->getProjectPairsByProgram(key($programs));
$this->view->users = $this->loadModel('user')->getPairs('noclosed|noempty');
$this->view->groups = $this->loadModel('group')->getPairs();
$this->display();
}
@@ -478,7 +480,7 @@ class upgrade extends control
*/
public function ajaxGetProjectPairsByProgram($programID = 0)
{
$projects = $this->upgrade->getProjectPairsByProgram($programID);
$projects = array('' => '') + $this->upgrade->getProjectPairsByProgram($programID);
die(html::select('projects', $projects, '', 'class="form-control"'));
}
+1
View File
@@ -87,6 +87,7 @@ $lang->upgrade->repo = 'Repo';
$lang->upgrade->mergeRepo = 'Merge Repo';
$lang->upgrade->newProgram = 'Create';
$lang->upgrade->projectEmpty = 'Project must be not empty.';
$lang->upgrade->mergeSummary = "Dear users, there are %s products and %s iterations in your system waiting for Migration. By System Calculation, we recommend your migration plan as follows, you can also adjust according to your own situation:";
$lang->upgrade->mergeByProductLine = "PRODUCTLINE-BASED iterations: Consolidate the entire product line and the products and iterations below it into one large project.";
$lang->upgrade->mergeByProduct = "PRODUCT-BASED iterations: You can select multiple products and their lower iterations to merge into a large project, or you can select a product to merge its lower iterations into a larger project";
+1
View File
@@ -87,6 +87,7 @@ $lang->upgrade->repo = 'Repo';
$lang->upgrade->mergeRepo = 'Merge Repo';
$lang->upgrade->newProgram = 'Create';
$lang->upgrade->projectEmpty = 'Project must be not empty.';
$lang->upgrade->mergeSummary = "Dear users, there are %s products and %s iterations in your system waiting for Migration. By System Calculation, we recommend your migration plan as follows, you can also adjust according to your own situation:";
$lang->upgrade->mergeByProductLine = "PRODUCTLINE-BASED iterations: Consolidate the entire product line and the products and iterations below it into one large project.";
$lang->upgrade->mergeByProduct = "PRODUCT-BASED iterations: You can select multiple products and their lower iterations to merge into a large project, or you can select a product to merge its lower iterations into a larger project";
+1
View File
@@ -87,6 +87,7 @@ $lang->upgrade->repo = 'Repo';
$lang->upgrade->mergeRepo = 'Merge Repo';
$lang->upgrade->newProgram = 'Create';
$lang->upgrade->projectEmpty = 'Project must be not empty.';
$lang->upgrade->mergeSummary = "Dear users, there are %s products and %s iterations in your system waiting for Migration. By System Calculation, we recommend your migration plan as follows, you can also adjust according to your own situation:";
$lang->upgrade->mergeByProductLine = "PRODUCTLINE-BASED iterations: Consolidate the entire product line and the products and iterations below it into one large project.";
$lang->upgrade->mergeByProduct = "PRODUCT-BASED iterations: You can select multiple products and their lower iterations to merge into a large project, or you can select a product to merge its lower iterations into a larger project";
+1
View File
@@ -87,6 +87,7 @@ $lang->upgrade->repo = 'Repo';
$lang->upgrade->mergeRepo = 'Merge Repo';
$lang->upgrade->newProgram = 'Create';
$lang->upgrade->projectEmpty = 'Project must be not empty.';
$lang->upgrade->mergeSummary = "Dear users, there are %s products and %s iterations in your system waiting for Migration. By System Calculation, we recommend your migration plan as follows, you can also adjust according to your own situation:";
$lang->upgrade->mergeByProductLine = "PRODUCTLINE-BASED iterations: Consolidate the entire product line and the products and iterations below it into one large project.";
$lang->upgrade->mergeByProduct = "PRODUCT-BASED iterations: You can select multiple products and their lower iterations to merge into a large project, or you can select a product to merge its lower iterations into a larger project";
+1
View File
@@ -87,6 +87,7 @@ $lang->upgrade->repo = '版本库';
$lang->upgrade->mergeRepo = '归并版本库';
$lang->upgrade->newProgram = '新建';
$lang->upgrade->projectEmpty = '所属项目不能为空!';
$lang->upgrade->mergeSummary = "尊敬的用户,您的系统中共有%s个产品,%s个迭代等待迁移。";
$lang->upgrade->mergeByProductLine = "以产品线组织的产品和迭代:将整个产品线及其下面的产品和迭代归并到一个项目集和项目中,也可以分开归并。";
$lang->upgrade->mergeByProduct = "以产品组织的迭代:可以选择多个产品及其下面的迭代归并到一个项目集和项目中,也可以选择某一个产品将其下面所属的迭代归并到项目集和项目中。";
+1
View File
@@ -87,6 +87,7 @@ $lang->upgrade->repo = '版本庫';
$lang->upgrade->mergeRepo = '歸併版本庫';
$lang->upgrade->newProgram = '新建';
$lang->upgrade->projectEmpty = '項目不能爲空!';
$lang->upgrade->mergeSummary = "尊敬的用戶,您的系統中共有%s個產品,%s個迭代等待遷移。";
$lang->upgrade->mergeByProductLine = "以產品綫組織的產品和迭代:將整個產品綫及其下面的產品和迭代歸併到一個項目集和項目中,也可以分開歸併。";
$lang->upgrade->mergeByProduct = "以產品組織的迭代:可以選擇多個產品及其下面的迭代歸併到一個項目集和項目中,也可以選擇某一個產品將其下面所屬的迭代歸併到項目集和項目中。";
+31 -4
View File
@@ -632,6 +632,10 @@ class upgradeModel extends model
case '12_5_2':
$this->saveLogs('Execute 12_5_2');
$this->appendExec('12_5_2');
case '15_0':
$this->saveLogs('Execute 15_0');
$this->execSQL($this->getUpgradeFile('15.0'));
$this->appendExec('15_0');
}
$this->deletePatch();
@@ -815,6 +819,7 @@ class upgradeModel extends model
case '12_5':
case '12_5_1':
case '12_5_2':
case '15_0' : $confirmContent .= file_get_contents($this->getUpgradeFile('15.0'));
}
return str_replace('zt_', $this->config->db->prefix, $confirmContent);
}
@@ -4013,7 +4018,12 @@ class upgradeModel extends model
if(dao::isError()) return false;
$programID = $this->dao->lastInsertId();
$this->dao->update(TABLE_PROJECT)->set('grade')->eq(1)->set('path')->eq(",{$programID},")->where('id')->eq($programID)->exec();
$this->dao->update(TABLE_PROGRAM)
->set('grade')->eq(1)
->set('path')->eq(",{$programID},")
->set('`order`')->eq($programID * 5)
->where('id')->eq($programID)
->exec();
}
else
{
@@ -4029,7 +4039,6 @@ class upgradeModel extends model
$project->name = $data->PRJName;
$project->type = 'project';
$project->model = 'scrum';
$project->code = $data->code;
$project->parent = $programID;
$project->status = 'wait';
$project->begin = $data->begin;
@@ -4042,7 +4051,6 @@ class upgradeModel extends model
$project->acl = $data->acl;
$this->lang->project->name = $this->lang->program->PRJName;
$this->lang->project->code = $this->lang->program->PRJCode;
$this->dao->insert(TABLE_PROJECT)->data($project)
->batchcheck('name', 'notempty')
@@ -4051,7 +4059,12 @@ class upgradeModel extends model
if(dao::isError()) return false;
$projectID = $this->dao->lastInsertId();
$this->dao->update(TABLE_PROJECT)->set('grade')->eq(2)->set('path')->eq(",{$programID},{$projectID},")->where('id')->eq($projectID)->exec();
$this->dao->update(TABLE_PROJECT)
->set('grade')->eq(2)
->set('path')->eq(",{$programID},{$projectID},")
->set('`order`')->eq($projectID * 5)
->where('id')->eq($projectID)
->exec();
}
else
{
@@ -4073,6 +4086,8 @@ class upgradeModel extends model
*/
public function processMergedData($programID, $projectID, $productIdList = array(), $sprintIdList = array())
{
if(!$projectID) die(js::alert($this->lang->upgrade->projectEmpty));
/* Product linked objects. */
$this->dao->update(TABLE_STORY)->set('PRJ')->eq($programID)->where('product')->in($productIdList)->exec();
$this->dao->update(TABLE_RELEASE)->set('PRJ')->eq($programID)->where('product')->in($productIdList)->exec();
@@ -4087,6 +4102,18 @@ class upgradeModel extends model
$this->dao->update(TABLE_TASK)->set('PRJ')->eq($projectID)->where('project')->in($sprintIdList)->exec();
$this->dao->update(TABLE_DOC)->set('PRJ')->eq($projectID)->where("lib IN(SELECT id from " . TABLE_DOCLIB . " WHERE type = 'project' and project " . helper::dbIN($sprintIdList) . ')')->exec();
/* Put sprint stories into project story mdoule. */
$sprintStories = $this->dao->select('*')->from(TABLE_PROJECTSTORY)
->where('project')->in($sprintIdList)
->fetchAll();
foreach($sprintStories as $sprintStory)
{
$projectStory = $sprintStory;
$projectStory->project = $projectID;
$this->dao->insert(TABLE_PROJECTSTORY)->data($projectStory)->exec();
}
/* Compute product acl. */
$products = $this->dao->select('id,program,acl')->from(TABLE_PRODUCT)->where('id')->in($productIdList)->fetchAll();
foreach($products as $product)
+5 -9
View File
@@ -3,9 +3,9 @@
<?php if($programs):?>
<tr>
<th><?php echo $lang->upgrade->existPGM;?></th>
<td>
<td class='required'>
<div class='input-group'>
<?php echo html::select("programs", $programs, '', "class='form-control' onchange='getProjectByProgram(this)'");?>
<?php echo html::select("programs", $programs, $programID, "class='form-control' onchange='getProjectByProgram(this)'");?>
<span class='input-group-addon'>
<div class="checkbox-primary">
<input type="checkbox" name="newProgram" value="0" checked onchange="toggleProgram(this)" id="newProgram0" />
@@ -16,10 +16,10 @@
</td>
</tr>
<?php endif;?>
<?php if($projects):?>
<?php if(count($projects) > 1):?>
<tr>
<th><?php echo $lang->upgrade->existPRJ;?></th>
<td>
<td class='required'>
<div class='input-group'>
<?php echo html::select("projects", $projects, '', "class='form-control'");?>
<span class='input-group-addon'>
@@ -40,10 +40,6 @@
<th><?php echo $lang->program->PRJName;?></th>
<td class='required'><?php echo html::input("PRJName", isset($sprintName) ? $sprintName : '', "class='form-control'");?></td>
</tr>
<tr class='PGMParams'>
<th><?php echo $lang->program->PRJCode;?></th>
<td><?php echo html::input("code", '', "class='form-control'");?></td>
</tr>
<tr class='PGMParams'>
<th><?php echo $lang->program->PRJPM;?></th>
<td><?php echo html::select('PM', array('' => '') + $users, '', "class='form-control chosen'");?></td>
@@ -66,7 +62,7 @@
</tr>
<tr class='PGMParams'>
<th><?php echo $lang->project->acl;?></th>
<td><?php echo nl2br(html::radio('acl', $lang->program->PGMPRJAclList, 'open', "onclick='setWhite(this.value);'", 'block'));?></td>
<td><?php echo nl2br(html::radio('acl', $lang->program->PGMPRJAclList, 'open', '', 'block'));?></td>
</tr>
</table>
<div class='table-foot text-center'><?php echo html::submitButton();?></div>
+9 -4
View File
@@ -1,4 +1,7 @@
<style> #source .lineGroup .productList{width: 250px;} </style>
<style>
#source .lineGroup .productList{width: 250px; word-break: break-all;}
.checkbox-primary > label{height: auto;}
</style>
<div class='alert alert-info'>
<?php
printf($lang->upgrade->mergeSummary, $noMergedProductCount, $noMergedSprintCount);
@@ -9,26 +12,28 @@
<div class='table-col' id='source'>
<div class='cell'>
<div class='lineGroup-title'>
<div class='item'><strong><?php echo $lang->upgrade->product;?></strong></div>
<div class='item w-250px'><strong><?php echo $lang->upgrade->product;?></strong></div>
<div class='item'><strong><?php echo $lang->upgrade->project;?></strong></div>
</div>
<div class='line-groups'>
<?php $isChecked = true;?>
<?php foreach($noMergedProducts as $productID => $product):?>
<div class='lineGroup'>
<div class='productList'>
<?php echo html::checkBox("products", array($product->id => "{$lang->productCommon} #{$product->id} {$product->name}"), $product->id, "data-productid='{$product->id}' data-begin='{$product->createdDate}'");?>
<?php echo html::checkBox("products", array($product->id => "{$product->name}"), $isChecked ? $product->id : '', "data-productid='{$product->id}' data-begin='{$product->createdDate}'");?>
</div>
<div class='projectList'>
<div class='scroll-handle'>
<?php if(isset($productGroups[$productID])):?>
<?php foreach($productGroups[$productID] as $sprint):?>
<?php echo html::checkBox("sprints[$productID]", array($sprint->id => "{$lang->upgrade->project} #{$sprint->id} {$sprint->name}"), $sprint->id, "data-product='{$productID}' data-begin='{$sprint->begin}' data-end='{$sprint->end}'");?>
<?php echo html::checkBox("sprints[$productID]", array($sprint->id => "{$sprint->name}"), $isChecked ? $sprint->id : '', "data-product='{$productID}' data-begin='{$sprint->begin}' data-end='{$sprint->end}'");?>
<?php echo html::hidden("sprintIdList[$productID][$sprint->id]", $sprint->id);?>
<?php endforeach;?>
<?php endif;?>
</div>
</div>
</div>
<?php $isChecked = false;?>
<?php endforeach;?>
</div>
</div>
+2
View File
@@ -575,6 +575,7 @@ class user extends control
$this->view->roleGroup = $roleGroup;
$this->view->deptID = $deptID;
$this->view->rand = $this->user->updateSessionRandom();
$this->view->companies = $this->loadModel('company')->getOutsideCompanies();
$this->display();
}
@@ -663,6 +664,7 @@ class user extends control
$this->view->user = $user;
$this->view->depts = $this->dept->getOptionMenu();
$this->view->userGroups = implode(',', array_keys($userGroups));
$this->view->companies = $this->loadModel('company')->getOutsideCompanies();
$this->view->groups = $this->dao->select('id, name')->from(TABLE_GROUP)->fetchPairs('id', 'name');
$this->view->rand = $this->user->updateSessionRandom();
+49
View File
@@ -1,3 +1,31 @@
$(function()
{
$("input[name='new[]']").change(function()
{
if($(this).prop('checked'))
{
$('#company').replaceWith("<input name='company' id='company' class='form-control'/>");
$('#company_chosen').remove();
}
else
{
var link = createLink('company', 'ajaxGetOutsideCompany');
$.post(link, function(data)
{
$('#company').replaceWith(data);
$('#company').chosen();
})
}
})
})
/**
* Change group when change role.
*
* @param role $role
* @access public
* @return void
*/
function changeGroup(role)
{
if(role && roleGroup[role])
@@ -11,6 +39,27 @@ function changeGroup(role)
$('#group').trigger("chosen:updated");
}
/**
* Show or hide companies based on user type.
*
* @param type $type
* @access public
* @return void
*/
function changeType(type)
{
if(type == 'inside')
{
$('#companyBox').addClass('hide');
$('#dept, #join, #commiter').closest('tr').removeClass('hide');
}
else
{
$('#companyBox').removeClass('hide');
$('#dept, #join, #commiter').closest('tr').addClass('hide');
}
}
$(function()
{
var password1Encrypted = false
+43
View File
@@ -19,4 +19,47 @@ $(function()
password1Encrypted = true;
password2Encrypted = true;
})
$("input[name='new[]']").change(function()
{
if($(this).prop('checked'))
{
$('#company').replaceWith("<input name='company' id='company' class='form-control'/>");
$('#company_chosen').remove();
}
else
{
var link = createLink('company', 'ajaxGetOutsideCompany');
$.post(link, function(data)
{
$('#company').replaceWith(data);
$('#company').chosen();
})
}
})
changeType(type);
});
/**
* Show or hide companies based on user type.
*
* @param type $type
* @access public
* @return void
*/
function changeType(type)
{
if(type == 'inside')
{
$('#company').closest('td').addClass('hide');
$('#groups').closest('td').next('th').addClass('hide');
$('#dept, #commiter').closest('tr').removeClass('hide');
}
else
{
$('#company').closest('td').removeClass('hide');
$('#groups').closest('td').next('th').removeClass('hide');
$('#dept, #commiter').closest('tr').addClass('hide');
}
}
+4 -4
View File
@@ -74,11 +74,11 @@ $(document).ready(function()
*/
$('.captchaBox .input-group .input-group-addon img').click(function()
{
var captchaLink = createLink('misc', 'captcha', "sessionVar=captcha");
captchaLink += captchaLink.indexOf('?') < 0 ? '?' : '&';
captchaLink += 's=' + Math.random();
var captchaLink = createLink('misc', 'captcha', "sessionVar=captcha");
captchaLink += captchaLink.indexOf('?') < 0 ? '?' : '&';
captchaLink += 's=' + Math.random();
$(this).attr('src', captchaLink);
$(this).attr('src', captchaLink);
})
});
+4
View File
@@ -52,6 +52,7 @@ $lang->user->verifyPassword = 'Ihr Login Passwort';
$lang->user->resetPassword = 'Passwort vergessen?';
$lang->user->score = 'Score';
$lang->user->name = 'Name';
$lang->user->type = 'User Type';
$lang->user->cropAvatar = 'Crop Avatar';
$lang->user->cropAvatarTip = 'Drag and drop the box to select the image clipping range.';
$lang->user->cropImageTip = 'The image used is too small, the recommended image size is at least 48x48, the current image size is %s';
@@ -145,6 +146,9 @@ $lang->user->genderList['f'] = 'Weiblich';
$lang->user->thirdPerson['m'] = 'Him';
$lang->user->thirdPerson['f'] = 'Her';
$lang->user->typeList['inside'] = $lang->user->inside;
$lang->user->typeList['outside'] = $lang->user->outside;
$lang->user->passwordStrengthList[0] = "<span style='color:red'>Schwach</span>";
$lang->user->passwordStrengthList[1] = "<span style='color:#000'>Gut</span>";
$lang->user->passwordStrengthList[2] = "<span style='color:green'>Stark</span>";
+5
View File
@@ -52,6 +52,7 @@ $lang->user->verifyPassword = 'Password';
$lang->user->resetPassword = 'Forgot Password?';
$lang->user->score = 'Score';
$lang->user->name = 'Name';
$lang->user->type = 'User Type';
$lang->user->cropAvatar = 'Crop Avatar';
$lang->user->cropAvatarTip = 'Drag and drop the box to select the image clipping range.';
$lang->user->cropImageTip = 'The image used is too small, the recommended image size is at least 48x48, the current image size is %s';
@@ -145,6 +146,9 @@ $lang->user->genderList['f'] = 'Female';
$lang->user->thirdPerson['m'] = 'Him';
$lang->user->thirdPerson['f'] = 'Her';
$lang->user->typeList['inside'] = $lang->user->inside;
$lang->user->typeList['outside'] = $lang->user->outside;
$lang->user->passwordStrengthList[0] = "<span style='color:red'>Weak</span>";
$lang->user->passwordStrengthList[1] = "<span style='color:#000'>Good</span>";
$lang->user->passwordStrengthList[2] = "<span style='color:green'>Strong</span>";
@@ -200,6 +204,7 @@ $lang->user->error->dangerPassword = "ID %s,Passwords cannot be used with [%s]
$lang->user->error->verifyPassword = "Verification failed. Please enter your Login Password.";
$lang->user->error->originalPassword = "Old password is incorrect.";
$lang->user->error->companyEmpty = "Company name must be not empty.";
$lang->user->contactFieldList['phone'] = $lang->user->phone;
$lang->user->contactFieldList['mobile'] = $lang->user->mobile;
+4
View File
@@ -52,6 +52,7 @@ $lang->user->verifyPassword = 'Mot de Passe';
$lang->user->resetPassword = 'Password oublié ?';
$lang->user->score = 'Score';
$lang->user->name = 'Name';
$lang->user->type = 'User Type';
$lang->user->cropAvatar = 'Crop Avatar';
$lang->user->cropAvatarTip = 'Drag and drop the box to select the image clipping range.';
$lang->user->cropImageTip = 'The image used is too small, the recommended image size is at least 48x48, the current image size is %s';
@@ -145,6 +146,9 @@ $lang->user->genderList['f'] = 'Femme';
$lang->user->thirdPerson['m'] = 'lui';
$lang->user->thirdPerson['f'] = 'lui';
$lang->user->typeList['inside'] = $lang->user->inside;
$lang->user->typeList['outside'] = $lang->user->outside;
$lang->user->passwordStrengthList[0] = "<span style='color:red'>Faible</span>";
$lang->user->passwordStrengthList[1] = "<span style='color:#000'>Bon</span>";
$lang->user->passwordStrengthList[2] = "<span style='color:green'>Fort</span>";
+4
View File
@@ -52,6 +52,7 @@ $lang->user->verifyPassword = 'Mật khẩu';
$lang->user->resetPassword = 'Quên mật khẩu?';
$lang->user->score = 'Điểm';
$lang->user->name = 'Name';
$lang->user->type = 'User Type';
$lang->user->cropAvatar = 'Crop Avatar';
$lang->user->cropAvatarTip = 'Drag and drop the box to select the image clipping range.';
$lang->user->cropImageTip = 'The image used is too small, the recommended image size is at least 48x48, the current image size is %s';
@@ -145,6 +146,9 @@ $lang->user->genderList['f'] = 'Nữ';
$lang->user->thirdPerson['m'] = 'anh ấy';
$lang->user->thirdPerson['f'] = 'cô ấy';
$lang->user->typeList['inside'] = $lang->user->inside;
$lang->user->typeList['outside'] = $lang->user->outside;
$lang->user->passwordStrengthList[0] = "<span style='color:red'>Yếu</span>";
$lang->user->passwordStrengthList[1] = "<span style='color:#000'>Tốt</span>";
$lang->user->passwordStrengthList[2] = "<span style='color:green'>Mạnh</span>";
+5
View File
@@ -52,6 +52,7 @@ $lang->user->verifyPassword = '您的密码';
$lang->user->resetPassword = '忘记密码';
$lang->user->score = '积分';
$lang->user->name = '名称';
$lang->user->type = '用户类型';
$lang->user->cropAvatar = '剪切头像';
$lang->user->cropAvatarTip = '拖拽选框来选择头像剪切范围';
$lang->user->cropImageTip = '所使用的头像图片过小,建议图片大小至少为 48x48,当前图片大小为 %s';
@@ -147,6 +148,9 @@ $lang->user->genderList['f'] = '女';
$lang->user->thirdPerson['m'] = '他';
$lang->user->thirdPerson['f'] = '她';
$lang->user->typeList['inside'] = $lang->user->inside;
$lang->user->typeList['outside'] = $lang->user->outside;
$lang->user->passwordStrengthList[0] = "<span style='color:red'>弱</span>";
$lang->user->passwordStrengthList[1] = "<span style='color:#000'>中</span>";
$lang->user->passwordStrengthList[2] = "<span style='color:green'>强</span>";
@@ -202,6 +206,7 @@ $lang->user->error->dangerPassword = "【ID %s】的密码不能使用【%s】
$lang->user->error->verifyPassword = "验证失败,请检查您的系统登录密码是否正确";
$lang->user->error->originalPassword = "原密码不正确";
$lang->user->error->companyEmpty = "公司名称不能为空!";
$lang->user->contactFieldList['phone'] = $lang->user->phone;
$lang->user->contactFieldList['mobile'] = $lang->user->mobile;
+4
View File
@@ -52,6 +52,7 @@ $lang->user->verifyPassword = '您的密碼';
$lang->user->resetPassword = '忘記密碼';
$lang->user->score = '積分';
$lang->user->name = '名稱';
$lang->user->type = '用戶類型';
$lang->user->cropAvatar = '剪切頭像';
$lang->user->cropAvatarTip = '拖拽選框來選擇頭像剪切範圍';
$lang->user->cropImageTip = '所使用的頭像圖片過小,建議圖片大小至少為 48x48,當前圖片大小為 %s';
@@ -145,6 +146,9 @@ $lang->user->genderList['f'] = '女';
$lang->user->thirdPerson['m'] = '他';
$lang->user->thirdPerson['f'] = '她';
$lang->user->typeList['inside'] = $lang->user->inside;
$lang->user->typeList['outside'] = $lang->user->outside;
$lang->user->passwordStrengthList[0] = "<span style='color:red'>弱</span>";
$lang->user->passwordStrengthList[1] = "<span style='color:#000'>中</span>";
$lang->user->passwordStrengthList[2] = "<span style='color:green'>強</span>";
+37 -4
View File
@@ -241,12 +241,13 @@ class userModel extends model
if(strtolower($_POST['account']) == 'guest') return false;
$user = fixer::input('post')
->setDefault('join', '0000-00-00' )
->setDefault('type', 'inside' )
->setDefault('join', '0000-00-00')
->setDefault('type', 'inside')
->setDefault('company', 0)
->setIF($this->post->password1 != false, 'password', substr($this->post->password1, 0, 32))
->setIF($this->post->password1 == false, 'password', '')
->setIF($this->post->email != false, 'email', trim($this->post->email))
->remove('group, password1, password2, verifyPassword, passwordStrength')
->remove('new, group, password1, password2, verifyPassword, passwordStrength')
->get();
if(empty($_POST['verifyPassword']) or $this->post->verifyPassword != md5($this->app->user->password . $this->session->rand))
@@ -255,6 +256,21 @@ class userModel extends model
return false;
}
if(isset($_POST['new']))
{
if(empty($user->company))
{
dao::$errors['company'][] = $this->lang->user->error->companyEmpty;
return false;
}
$company = new stdClass();
$company->name = $user->company;
$this->dao->insert(TABLE_COMPANY)->data($company)->exec();
$user->company = $this->dao->lastInsertID();
}
$this->dao->insert(TABLE_USER)->data($user)
->autoCheck()
->batchCheck($this->config->user->create->requiredFields, 'notempty')
@@ -423,7 +439,7 @@ class userModel extends model
->setDefault('join', '0000-00-00')
->setIF($this->post->password1 != false, 'password', substr($this->post->password1, 0, 32))
->setIF($this->post->email != false, 'email', trim($this->post->email))
->remove('password1, password2, groups,verifyPassword, passwordStrength')
->remove('new, password1, password2, groups,verifyPassword, passwordStrength')
->get();
if(empty($_POST['verifyPassword']) or $this->post->verifyPassword != md5($this->app->user->password . $this->session->rand))
@@ -431,6 +447,22 @@ class userModel extends model
dao::$errors['verifyPassword'][] = $this->lang->user->error->verifyPassword;
return false;
}
if(isset($_POST['new']))
{
if(empty($user->company))
{
dao::$errors['company'][] = $this->lang->user->error->companyEmpty;
return false;
}
$company = new stdClass();
$company->name = $user->company;
$this->dao->insert(TABLE_COMPANY)->data($company)->exec();
$user->company = $this->dao->lastInsertID();
}
$requiredFields = array();
foreach(explode(',', $this->config->user->edit->requiredFields) as $field)
{
@@ -536,6 +568,7 @@ class userModel extends model
$users[$id]['realname'] = $data->realname[$id];
$users[$id]['commiter'] = $data->commiter[$id];
$users[$id]['email'] = $data->email[$id];
$users[$id]['type'] = $data->type[$id];
$users[$id]['join'] = $data->join[$id];
$users[$id]['skype'] = $data->skype[$id];
$users[$id]['qq'] = $data->qq[$id];
+3
View File
@@ -49,6 +49,7 @@
<th class='<?php echo $minWidth?> required'><?php echo $lang->user->account;?></th>
<th class='<?php echo $minWidth?> required'><?php echo $lang->user->realname;?></th>
<th class='w-120px'><?php echo $lang->user->role;?></th>
<th class='w-120px'><?php echo $lang->user->type;?></th>
<th class='<?php echo $minWidth . zget($visibleFields, 'commiter', ' hidden')?>'><?php echo $lang->user->commiter;?></th>
<th class='<?php echo $minWidth . zget($visibleFields, 'email', ' hidden')?>'> <?php echo $lang->user->email;?></th>
<th class='w-120px<?php echo zget($visibleFields, 'join', ' hidden')?>'> <?php echo $lang->user->join;?></th>
@@ -72,6 +73,7 @@
<?php
$dept = ($first and empty($user->dept)) ? 0 : (empty($user->dept) ? 'ditto' : $user->dept);
$role = ($first and empty($user->role)) ? 0 : (empty($user->role) ? 'ditto' : $user->role);
$type = empty($user->type) ? 'inside' : $user->type;
$first = false;
?>
<tr class='text-center'>
@@ -80,6 +82,7 @@
<td><?php echo html::input("account[$user->id]", $user->account, "class='form-control'");?></td>
<td><?php echo html::input("realname[$user->id]", $user->realname, "class='form-control'");?></td>
<td><?php echo html::select("role[$user->id]", $lang->user->roleList, $role, "class='form-control'");?></td>
<td><?php echo html::select("type[$user->id]", $lang->user->typeList, $type, "class='form-control'");?></td>
<td class='<?php echo zget($visibleFields, 'commiter', 'hidden')?>'><?php echo html::input("commiter[$user->id]", $user->commiter, "class='form-control'");?></td>
<td class='<?php echo zget($visibleFields, 'email', 'hidden')?>'> <?php echo html::input("email[$user->id]", $user->email, "class='form-control'");?></td>
<td class='<?php echo zget($visibleFields, 'join', 'hidden')?>'> <?php echo html::input("join[$user->id]", $user->join, "class='form-control form-date'");?></td>
+13
View File
@@ -24,6 +24,19 @@
<form class="load-indicator main-form form-ajax" id="createForm" method="post" target='hiddenwin'>
<table align='center' class="table table-form">
<?php $thClass = common::checkNotCN() ? 'w-enVerifyPassword' : 'w-verifyPassword';?>
<tr>
<th class='<?php echo $thClass?>'><?php echo $lang->user->type;?></th>
<td colspan='2'><?php echo html::radio('type', $lang->user->typeList , 'inside', "onclick='changeType(this.value)'");?></td>
</tr>
<tr id='companyBox' class='hide'>
<th><?php echo $lang->user->company;?></th>
<td>
<div class='input-group'>
<?php echo html::select('company', $companies, '', "class='form-control chosen'");?>
<span class='input-group-addon'><?php echo html::checkBox('new', $lang->company->create);?></span>
</div>
</td>
</tr>
<tr>
<th class='<?php echo $thClass?>'><?php echo $lang->user->dept;?></th>
<td class='w-p40'><?php echo html::select('dept', $depts, $deptID, "class='form-control chosen'");?></td>
+16 -7
View File
@@ -13,6 +13,7 @@
<?php include '../../common/view/header.html.php';?>
<?php include '../../common/view/datepicker.html.php';?>
<?php js::import($jsRoot . 'md5.js');?>
<?php js::set('type', $user->type);?>
<div id="mainContent" class="main-content">
<div class="center-block">
<div class="main-header">
@@ -28,22 +29,30 @@
<tr>
<th class='w-140px'><?php echo $lang->user->realname;?></th>
<td class='w-p40'><?php echo html::input('realname', $user->realname, "class='form-control'");?></td>
<th class='w-130px'><?php echo $lang->user->join;?></th>
<td><?php echo html::input('join', formatTime($user->join), "class='form-control form-date'");?></td>
<th class='w-130px'><?php echo $lang->user->role;?></th>
<td><?php echo html::select('role', $lang->user->roleList, $user->role, "class='form-control'");?></td>
</tr>
<tr>
<th class='w-140px'><?php echo $lang->user->dept;?></th>
<td class='w-p40'><?php echo html::select('dept', $depts, $user->dept, "class='form-control chosen'");?></td>
<th><?php echo $lang->user->role;?></th>
<td><?php echo html::select('role', $lang->user->roleList, $user->role, "class='form-control'");?></td>
<th><?php echo $lang->user->join;?></th>
<td><?php echo html::input('join', formatTime($user->join), "class='form-control form-date'");?></td>
</tr>
<tr>
<th><?php echo $lang->group->priv;?></th>
<td colspan='3'><?php echo html::select('groups[]', $groups, $userGroups, 'size=3 multiple=multiple class="form-control chosen"');?></td>
<td><?php echo html::select('groups[]', $groups, $userGroups, 'size=3 multiple=multiple class="form-control chosen"');?></td>
<th><?php echo $lang->user->company;?></th>
<td>
<div class='input-group'>
<?php echo html::select('company', $companies, $user->company, "class='form-control chosen'");?>
<span class='input-group-addon'><?php echo html::checkBox('new', $lang->company->create);?></span>
</div>
</td>
</tr>
<tr>
<th><?php echo $lang->user->type;?></th>
<td><?php echo html::radio('type', $lang->user->typeList , $user->type, "onclick='changeType(this.value)'");?></td>
<th><?php echo $lang->user->gender;?></th>
<td colspan="3"><?php echo html::radio('gender', (array)$lang->user->genderList, $user->gender);?></td>
<td><?php echo html::radio('gender', (array)$lang->user->genderList, $user->gender);?></td>
</tr>
</table>
<table align='center' class='table table-form'>
File diff suppressed because one or more lines are too long
Binary file not shown.
+2 -1
View File
@@ -107,7 +107,7 @@
<glyph unicode="&#xe953;" glyph-name="format-bold" d="M576.001 28.443h-199.112v170.667h199.112c47.216 0 85.334-38.115 85.334-85.334s-38.115-85.334-85.334-85.334zM376.891 540.442h170.667c47.216 0 85.334-38.115 85.334-85.334s-38.115-85.334-85.334-85.334h-170.667zM695.467 296.391c55.181 38.685 93.866 101.829 93.866 158.721 0 128.569-99.557 227.556-227.556 227.556h-355.556v-796.444h400.498c119.468 0 211.057 96.71 211.057 215.608 0 86.471-48.923 160.427-122.311 194.561z" />
<glyph unicode="&#xe954;" glyph-name="format-header-pound" d="M40.636 614.399h94.272v-282.817h188.545v282.817h94.272v-659.907h-94.272v282.817h-188.545v-282.817h-94.272v659.907zM512 425.852h108.882l15.085 141.408h94.272l-15.085-141.408h94.272l15.085 141.408h94.272l-15.085-141.408h79.663v-94.272h-89.558l-9.426-94.272h98.987v-94.272h-108.882l-15.085-141.408h-94.272l15.085 141.408h-94.272l-15.085-141.408h-94.272l15.085 141.408h-79.663v94.272h89.558l9.426 94.272h-98.987v94.272zM705.26 331.581l-9.426-94.272h94.272l9.426 94.272h-94.272z" />
<glyph unicode="&#xe955;" glyph-name="format-italic" d="M398.223 682.666v-170.667h125.726l-194.561-455.11h-158.721v-170.667h455.11v170.667h-125.726l194.561 455.11h158.721v170.667h-455.11z" />
<glyph unicode="&#xe956;" glyph-name="format-list-bulleted" d="M285.111 618.807h668.726v-95.532h-668.726v95.532zM285.111 236.678v95.532h668.726v-95.532h-668.726zM141.812 642.689c39.644 0 71.648-32.004 71.648-71.648s-32.004-71.648-71.648-71.648c-39.644 0-71.648 32.004-71.648 71.648s32.004 71.648 71.648 71.648zM141.812 356.091c39.644 0 71.648-32.004 71.648-71.648s-32.004-71.648-71.648-71.648c-39.644 0-71.648 32.004-71.648 71.648s32.004 71.648 71.648 71.648zM285.111-49.922v95.532h668.726v-95.532h-668.726zM141.812 69.497c39.644 0 71.648-32.004 71.648-71.648s-32.004-71.648-71.648-71.648c-39.644 0-71.648 32.004-71.648 71.648s32.004 71.648 71.648 71.648z" />
<glyph unicode="&#xe956;" glyph-name="test" d="M245.634 346.318h91.447c0 93.265 75.607 168.871 168.871 168.871 0 0 0 0 0 0v91.446c-143.63-0.335-259.984-116.687-260.318-260.318v0zM815.042 670.649v0c-179.231 178.841-469.508 178.521-648.348-0.71s-178.521-469.508 0.71-648.348c153.985-153.648 394.744-177.933 576.312-58.128l182.892-182.892 64.622 64.622-174.967 175.579c179.047 179.827 178.502 470.727-1.219 649.881v0zM231.004 86.61v0c-142.262 143.433-141.311 375.034 2.12 517.295s375.034 141.311 517.295-2.12c141.438-142.601 141.438-372.572 0-515.175v0c-142.262-143.433-373.863-144.382-517.295-2.122-0.71 0.704-1.417 1.411-2.12 2.122v0z" />
<glyph unicode="&#xe957;" glyph-name="code" d="M632.794 70.731l213.713 213.713-213.713 213.713 65.043 65.043 278.756-278.756-278.756-278.756-65.043 65.043zM391.206 70.731l-213.713 213.713 213.713 213.713-65.043 65.043-278.756-278.756 278.756-278.756 65.043 65.043z" />
<glyph unicode="&#xe958;" glyph-name="home" d="M426.667-56.889v256h170.667v-256h213.333v341.333h128l-426.667 384-426.667-384h128v-341.333h213.333z" />
<glyph unicode="&#xe959;" glyph-name="chevron-double-up" d="M200.448-170.668l-95.705 95.705 407.257 407.257 407.257-407.257-95.705-95.705-311.553 310.873-311.553-310.873zM200.448 236.592l-95.705 95.705 407.257 407.257 407.257-407.257-95.705-95.705-311.553 310.873-311.553-310.873z" />
@@ -189,6 +189,7 @@
<glyph unicode="&#xe9a5;" glyph-name="shield-check" d="M511.999 804.569l418.909-186.182v-279.273c0-258.327-178.734-499.898-418.909-558.544-235.799 57.577-412.393 291.514-418.722 544.488l-0.186 14.057v279.273l418.908 186.182zM511.999 702.728l-325.818-144.803v-218.81c0-204.148 133.4-395.263 312.319-457.588l13.498-4.375 1.769 0.465c180.829 56.692 318.091 244.69 323.863 448.232l0.186 13.265v218.81l-325.818 144.803zM687.15 463.671l68.608-62.929-285.975-311.994-173.754 144.756 59.578 71.54 105.518-87.878 226.025 246.505z" />
<glyph unicode="&#xe9a6;" glyph-name="ok" d="M36.571 804.571v-1024M73.143 804.571v-1024M109.714 804.571v-1024M146.286 804.571v-1024M182.857 804.571v-1024M219.429 804.571v-1024M256 804.571v-1024M292.571 804.571v-1024M329.143 804.571v-1024M365.714 804.571v-1024M402.286 804.571v-1024M438.857 804.571v-1024M475.429 804.571v-1024M512 804.571v-1024M548.571 804.571v-1024M585.143 804.571v-1024M621.714 804.571v-1024M658.286 804.571v-1024M694.857 804.571v-1024M731.429 804.571v-1024M768 804.571v-1024M804.571 804.571v-1024M841.143 804.571v-1024M877.714 804.571v-1024M914.286 804.571v-1024M950.857 804.571v-1024M987.429 804.571v-1024M0 768h1024M0 731.428h1024M0 694.857h1024M0 658.285h1024M0 621.714h1024M0 585.142h1024M0 548.571h1024M0 512h1024M0 475.428h1024M0 438.857h1024M0 402.285h1024M0 365.714h1024M0 329.142h1024M0 292.571h1024M0 256h1024M0 219.428h1024M0 182.857h1024M0 146.285h1024M0 109.714h1024M0 73.142h1024M0 36.571h1024M0 0h1024M0-36.572h1024M0-73.143h1024M0-109.715h1024M0-146.286h1024M0-182.858h1024M512 804.571c282.768 0 512-229.23 512-512s-229.23-512-512-512c-282.768 0-512 229.23-512 512s229.23 512 512 512zM512 729.142c-242.375 0-438.857-196.483-438.857-438.857s196.483-438.857 438.857-438.857c242.375 0 438.857 196.483 438.857 438.857s-196.483 438.857-438.857 438.857zM364.16 453.723c93.376 0 152.192-62.784 152.192-163.456 0-100.352-58.88-162.944-152.256-162.944-93.568 0-152.192 62.592-152.192 162.944 0 100.672 58.624 163.456 152.192 163.456h0.064zM624.896 448.219v-143.936h1.92l118.592 144h73.472l-116.8-140.096 124.928-175.68h-78.976l-93.632 131.904-29.504-35.456v-96.384h-66.176v315.648h66.176zM364.096 398.555c-51.584 0-84.864-41.984-84.864-108.288 0-66.048 33.024-107.84 84.864-107.84 51.648 0 84.672 41.792 84.672 107.84 0 66.304-33.024 108.288-84.672 108.288z" />
<glyph unicode="&#xe9a7;" glyph-name="more-alt" d="M36.571 804.571v-1024M73.143 804.571v-1024M109.714 804.571v-1024M146.286 804.571v-1024M182.857 804.571v-1024M219.429 804.571v-1024M256 804.571v-1024M292.571 804.571v-1024M329.143 804.571v-1024M365.714 804.571v-1024M402.286 804.571v-1024M438.857 804.571v-1024M475.429 804.571v-1024M512 804.571v-1024M548.571 804.571v-1024M585.143 804.571v-1024M621.714 804.571v-1024M658.286 804.571v-1024M694.857 804.571v-1024M731.429 804.571v-1024M768 804.571v-1024M804.571 804.571v-1024M841.143 804.571v-1024M877.714 804.571v-1024M914.286 804.571v-1024M950.857 804.571v-1024M987.429 804.571v-1024M0 768h1024M0 731.428h1024M0 694.857h1024M0 658.285h1024M0 621.714h1024M0 585.142h1024M0 548.571h1024M0 512h1024M0 475.428h1024M0 438.857h1024M0 402.285h1024M0 365.714h1024M0 329.142h1024M0 292.571h1024M0 256h1024M0 219.428h1024M0 182.857h1024M0 146.285h1024M0 109.714h1024M0 73.142h1024M0 36.571h1024M0 0h1024M0-36.572h1024M0-73.143h1024M0-109.715h1024M0-146.286h1024M0-182.858h1024M512-219.429c-282.331 0-512 229.669-512 512s229.669 512 512 512c282.331 0 512-229.669 512-512s-229.669-512-512-512zM512 731.428c-242.003 0-438.857-196.854-438.857-438.857s196.854-438.857 438.857-438.857c242.001 0 438.857 196.854 438.857 438.857s-196.854 438.857-438.857 438.857zM742.857 270.107c0-3.707-1.851-7.878-4.626-10.659l-215.59-215.957c-2.776-2.781-6.94-4.634-10.641-4.634s-7.865 1.854-10.641 4.634l-215.59 215.957c-2.776 2.781-4.626 6.951-4.626 10.659s1.851 7.878 4.626 10.659l23.132 23.171c2.776 2.781 6.477 4.634 10.641 4.634 3.701 0 7.865-1.854 10.641-4.634l181.817-182.127 181.817 182.127c2.776 2.781 6.94 4.634 10.641 4.634s7.865-1.854 10.641-4.634l23.132-23.171c2.776-2.781 4.626-6.951 4.626-10.659zM742.857 473.535c0-3.707-1.851-7.878-4.626-10.659l-215.59-215.957c-2.776-2.781-6.94-4.634-10.641-4.634s-7.865 1.854-10.641 4.634l-215.59 215.957c-2.776 2.781-4.626 6.951-4.626 10.659s1.851 7.878 4.626 10.659l23.132 23.171c2.776 2.781 6.477 4.634 10.641 4.634 3.701 0 7.865-1.854 10.641-4.634l181.817-182.127 181.817 182.127c2.776 2.781 6.94 4.634 10.641 4.634s7.865-1.854 10.641-4.634l23.132-23.171c2.776-2.781 4.626-6.951 4.626-10.659z" />
<glyph unicode="&#xe9a8;" glyph-name="list, format-list-bulleted" d="M74.278 678.363c-41.028 0-74.278-33.069-74.278-73.84s33.25-73.83 74.278-73.83c41.028 0 74.278 33.059 74.278 73.83s-33.25 73.84-74.278 73.84zM993.42 682.6h-730.258c-16.912 0-30.58-13.615-30.58-30.398v-84.171c0-16.793 13.667-30.398 30.58-30.398h730.258c16.89 0 30.58 13.605 30.58 30.398v84.171c0 16.784-13.692 30.398-30.58 30.398zM993.42 360.399h-730.258c-16.912 0-30.58-13.605-30.58-30.408v-84.172c0-16.783 13.667-30.398 30.58-30.398h730.258c16.89 0 30.58 13.615 30.58 30.398v84.172c0 16.806-13.692 30.408-30.58 30.408zM993.42 38.187h-730.258c-16.912 0-30.58-13.604-30.58-30.388v-84.172c0-16.781 13.667-30.407 30.58-30.407h730.258c16.89 0 30.58 13.626 30.58 30.407v84.172c0 16.783-13.692 30.388-30.58 30.388zM74.278 356.161c-41.028 0-74.278-33.058-74.278-73.841 0-40.773 33.25-73.83 74.278-73.83s74.278 33.058 74.278 73.83c0 40.781-33.25 73.841-74.278 73.841v0zM74.278 33.947c-41.028 0-74.278-33.058-74.278-73.828 0-40.773 33.25-73.83 74.278-73.83s74.278 33.058 74.278 73.83c0 40.771-33.25 73.828-74.278 73.828z" />
<glyph unicode="&#xf016;" glyph-name="file, file-empty" horiz-adv-x="878" d="M838.857 587.428c21.143-21.143 38.857-63.429 38.857-93.714v-658.286c0-30.286-24.571-54.857-54.857-54.857h-768c-30.286 0-54.857 24.571-54.857 54.857v914.286c0 30.286 24.571 54.857 54.857 54.857h512c30.286 0 72.571-17.714 93.714-38.857zM585.143 726.857v-214.857h214.857c-3.429 9.714-8.571 19.429-12.571 23.429l-178.857 178.857c-4 4-13.714 9.143-23.429 12.571zM804.571-146.286v585.143h-237.714c-30.286 0-54.857 24.571-54.857 54.857v237.714h-438.857v-877.714h731.429z" />
<glyph unicode="&#xf02d;" glyph-name="book" d="M948.764 510.653c13.529-19.482 17.318-44.918 9.741-69.81l-148.822-490.3c-13.529-45.999-61.152-81.716-107.693-81.716h-499.501c-55.199 0-114.186 43.835-134.21 100.116-8.658 24.352-8.658 48.165-1.083 68.728 1.083 10.823 3.248 21.647 3.789 34.635 0.541 8.658-4.329 15.694-3.248 22.188 2.165 12.988 13.529 22.188 22.188 36.799 16.235 27.058 34.635 70.893 40.587 99.033 2.706 10.281-2.706 22.188 0 31.388 2.706 10.281 12.988 17.859 18.401 27.6 14.612 24.894 33.554 73.058 36.259 98.493 1.083 11.364-4.329 23.811-1.083 32.471 3.789 12.447 15.694 17.859 23.811 28.682 12.988 17.859 34.635 69.269 37.881 97.952 1.083 9.199-4.329 18.401-2.706 28.14 2.165 10.281 15.153 21.106 23.811 33.554 22.728 33.554 27.058 107.693 95.787 88.211l-0.541-1.623c9.199 2.165 18.401 4.871 27.6 4.871h411.831c25.434 0 48.165-11.364 61.694-30.306 14.070-19.482 17.318-44.918 9.741-70.352l-148.281-490.3c-25.434-83.34-39.505-101.74-108.235-101.74h-470.277c-7.035 0-15.694-1.623-20.565-8.117-4.329-6.495-4.871-11.364-0.541-23.269 10.823-31.388 48.165-37.881 77.93-37.881h499.501c20.024 0 43.293 11.364 49.247 30.846l162.352 534.135c3.248 10.281 3.248 21.106 2.706 30.846 12.447-4.871 23.811-12.447 31.929-23.269zM372.959 509.57c-3.248-9.741 2.165-17.318 11.905-17.318h329.032c9.199 0 19.482 7.576 22.728 17.318l11.364 34.635c3.248 9.741-2.165 17.318-11.905 17.318h-329.032c-9.199 0-19.482-7.576-22.728-17.318zM328.043 371.031c-3.248-9.741 2.165-17.318 11.905-17.318h329.032c9.199 0 19.482 7.576 22.728 17.318l11.364 34.635c3.248 9.741-2.165 17.318-11.905 17.318h-329.032c-9.199 0-19.482-7.576-22.728-17.318z" />
<glyph unicode="&#xf064;" glyph-name="share" d="M960.285 412.526c0-8.506-3.502-16.511-9.505-22.514l-256.163-256.163c-6.003-6.003-14.008-9.505-22.514-9.505-17.512 0-32.020 14.509-32.020 32.020v128.082h-112.072c-215.638 0-357.227-41.527-357.227-280.178 0-20.513 1.001-41.025 2.501-61.54 0.5-8.005 2.501-17.011 2.501-25.015 0-9.505-6.003-17.512-16.010-17.512-7.004 0-10.506 3.502-14.008 8.506-7.505 10.506-13.009 26.518-18.511 38.025-28.517 64.041-63.54 155.598-63.54 225.643 0 56.036 5.504 113.572 26.518 166.606 69.545 172.609 273.673 201.628 437.778 201.628h112.072v128.082c0 17.512 14.509 32.020 32.020 32.020 8.506 0 16.511-3.502 22.514-9.505l256.163-256.163c6.003-6.003 9.505-14.008 9.505-22.514z" />

Before

Width:  |  Height:  |  Size: 183 KiB

After

Width:  |  Height:  |  Size: 184 KiB

Some files were not shown because too many files have changed in this diff Show More