Merge branch 'master' of https://gitlab.zcorp.cc/easycorp/zentaopms
This commit is contained in:
+14
-14
@@ -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';
|
||||
|
||||
@@ -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
@@ -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');
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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¶m=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¶m=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();
|
||||
|
||||
|
||||
@@ -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¶m=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¶m=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();
|
||||
|
||||
|
||||
@@ -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¶m=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¶m=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();
|
||||
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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¶m=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¶m=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();
|
||||
|
||||
|
||||
@@ -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¶m=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¶m=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();
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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'"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
*/
|
||||
$lang->company->common = '组织视图';
|
||||
$lang->company->index = "组织视图首页";
|
||||
$lang->company->create = "添加公司";
|
||||
$lang->company->edit = "编辑公司";
|
||||
$lang->company->view = "公司信息";
|
||||
$lang->company->browse = "用户列表";
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
*/
|
||||
$lang->company->common = '組織視圖';
|
||||
$lang->company->index = "組織視圖首頁";
|
||||
$lang->company->create = "添加公司";
|
||||
$lang->company->edit = "編輯公司";
|
||||
$lang->company->view = "公司信息";
|
||||
$lang->company->browse = "用戶列表";
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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§ion=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'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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'");?>
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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 = '添加白名单';
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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'");
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -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¶m=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(
|
||||
{
|
||||
|
||||
@@ -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';
|
||||
|
||||
|
||||
@@ -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 +1,2 @@
|
||||
.future {display: inline-block}
|
||||
.c-number {overflow:hidden;text-align:right!important;text-overflow:ellipsis;white-space:nowrap}
|
||||
|
||||
@@ -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$';
|
||||
|
||||
@@ -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$';
|
||||
|
||||
@@ -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$';
|
||||
|
||||
@@ -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$';
|
||||
|
||||
@@ -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$';
|
||||
|
||||
@@ -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$';
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
@@ -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');
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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 = "激活";
|
||||
|
||||
@@ -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 = "激活";
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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¶m=$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>
|
||||
|
||||
@@ -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¶m=$param&storyType=$storyType&orderBy=$orderBy&recTotal=$recTotal&recPerPage=$recPerPage&pageID=$pageID");
|
||||
echo $this->fetch('product', 'browse', "productID=$productID&branch=$branch&browseType=$browseType¶m=$param&storyType=$storyType&orderBy=$orderBy&recTotal=$recTotal&recPerPage=$recPerPage&pageID=$pageID&from=project");
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
@@ -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
@@ -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=¶m=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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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';?>
|
||||
|
||||
@@ -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'>
|
||||
|
||||
@@ -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';?>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"'));
|
||||
}
|
||||
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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 = "以产品组织的迭代:可以选择多个产品及其下面的迭代归并到一个项目集和项目中,也可以选择某一个产品将其下面所属的迭代归并到项目集和项目中。";
|
||||
|
||||
@@ -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 = "以產品組織的迭代:可以選擇多個產品及其下面的迭代歸併到一個項目集和項目中,也可以選擇某一個產品將其下面所屬的迭代歸併到項目集和項目中。";
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
})
|
||||
});
|
||||
|
||||
|
||||
@@ -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>";
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>";
|
||||
|
||||
@@ -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>";
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
@@ -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];
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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.
@@ -107,7 +107,7 @@
|
||||
<glyph unicode="" 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="" 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="" 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="" 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="" 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="" 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="" glyph-name="home" d="M426.667-56.889v256h170.667v-256h213.333v341.333h128l-426.667 384-426.667-384h128v-341.333h213.333z" />
|
||||
<glyph unicode="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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
Reference in New Issue
Block a user