issue:17256358 - added issuetracker module
git-svn-id: http://xe-core.googlecode.com/svn/sandbox@4484 201d5d3c-b55e-5fd7-737f-ddc643e51545
402
modules/issuetracker/classes/svn.class.php
Normal file
|
|
@ -0,0 +1,402 @@
|
|||
<?php
|
||||
/**
|
||||
* @class svn
|
||||
* @author zero <zero@zeroboard.com>
|
||||
* @brief svn source browser class
|
||||
**/
|
||||
class Svn {
|
||||
|
||||
var $url = null;
|
||||
|
||||
var $svn_cmd = null;
|
||||
var $diff_cmd = null;
|
||||
|
||||
var $tmp_dir = '/tmp';
|
||||
|
||||
var $oXml = null;
|
||||
|
||||
function Svn($url, $svn_cmd='/usr/bin/svn', $diff_cmd='/usr/bin/diff') {
|
||||
if(substr($url,-1)!='/') $url .= '/';
|
||||
$this->url = $url;
|
||||
|
||||
$this->svn_cmd = $svn_cmd;
|
||||
$this->diff_cmd = $diff_cmd;
|
||||
|
||||
$this->tmp_dir = _XE_PATH_.'files/cache/tmp';
|
||||
if(!is_dir($this->tmp_dir)) FileHandler::makeDir($this->tmp_dir);
|
||||
|
||||
$this->oXml = new XmlParser();
|
||||
}
|
||||
|
||||
function getStatus($path = '/') {
|
||||
if(substr($path,0,1)=='/') $path = substr($path,1);
|
||||
if(strpos($path,'..')!==false) return;
|
||||
|
||||
$command = sprintf("%s --non-interactive --config-dir %s log --xml --limit 1 '%s%s'", $this->svn_cmd, $this->tmp_dir, $this->url, $path);
|
||||
$buff = $this->execCmd($command, $error);
|
||||
$xmlDoc = $this->oXml->parse($buff);
|
||||
|
||||
$date = $xmlDoc->log->logentry->date->body;
|
||||
|
||||
$output->revision = $xmlDoc->log->logentry->attrs->revision;
|
||||
$output->author = $xmlDoc->log->logentry->author->body;
|
||||
$output->msg = $this->linkXE($xmlDoc->log->logentry->msg->body);
|
||||
$output->date = $this->getDateStr('Y-m-d H:i:s', $date);
|
||||
$output->gap = $this->getTimeGap($date);
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
function getList($path, $revs = null) {
|
||||
if(substr($path,0,1)=='/') $path = substr($path,1);
|
||||
if(strpos($path,'..')!==false) return;
|
||||
|
||||
$command = sprintf(
|
||||
"%s --non-interactive --config-dir %s list '%s%s'%s",
|
||||
$this->svn_cmd,
|
||||
$this->tmp_dir,
|
||||
$this->url,
|
||||
$path,
|
||||
$revs?'@'.(int)$revs:null
|
||||
);
|
||||
|
||||
$buff = $this->execCmd($command, $error);
|
||||
|
||||
$list = explode("\n",$buff);
|
||||
|
||||
if(!count($list)) return null;
|
||||
|
||||
$file_list = $directory_list = $output = array();
|
||||
|
||||
foreach($list as $name) {
|
||||
if(!$name) continue;
|
||||
$obj = null;
|
||||
$obj->name = $name;
|
||||
$obj->path = $path.$name;
|
||||
|
||||
$logs = $this->getLog($obj->path, $revs, null, false, 1);
|
||||
$obj->revision = $logs[0]->revision;
|
||||
$obj->author = $logs[0]->author;
|
||||
$obj->date = $this->getDateStr("Y-m-d H:i",$logs[0]->date);
|
||||
$obj->gap = $this->getTimeGap($logs[0]->date);
|
||||
$obj->msg = $this->linkXE($logs[0]->msg);
|
||||
|
||||
if(substr($obj->path,-1)=='/') $obj->type = 'directory';
|
||||
else $obj->type = 'file';
|
||||
|
||||
if($obj->type == 'file') $file_list[] = $obj;
|
||||
else $directory_list[] = $obj;
|
||||
}
|
||||
return array_merge($directory_list, $file_list);
|
||||
}
|
||||
|
||||
function getFileContent($path, $revs = null) {
|
||||
if(strpos($path,'..')!==false) return;
|
||||
|
||||
$command = sprintf(
|
||||
"%s --non-interactive --config-dir %s cat '%s%s'%s",
|
||||
$this->svn_cmd,
|
||||
$this->tmp_dir,
|
||||
$this->url,
|
||||
$path,
|
||||
$revs?'@'.$revs:null
|
||||
);
|
||||
|
||||
$content = $this->execCmd($command, $error);
|
||||
|
||||
$log = $this->getLog($path, $revs, null, false, 1);
|
||||
|
||||
$output->revision = $log[0]->revision;
|
||||
$output->author = $log[0]->author;
|
||||
$output->date = $log[0]->date;
|
||||
$output->msg = $this->linkXE($log[0]->msg);
|
||||
$output->content = $content;
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
function getDiff($path, $brev = null, $erev = null) {
|
||||
$eContent = $this->getFileContent($path, $erev);
|
||||
$bContent = $this->getFileContent($path, $brev);
|
||||
if(!$eContent||!$bContent) return;
|
||||
|
||||
$eFile = sprintf('%s/tmp.%s',$this->tmp_dir, md5($eContent->revision."\n".$eContent->content));
|
||||
$bFile = sprintf('%s/tmp.%s',$this->tmp_dir, md5($bContent->revision."\n".$bContent->content));
|
||||
|
||||
$f = fopen($eFile,'w');
|
||||
fwrite($f, $eContent->content);
|
||||
fclose($f);
|
||||
|
||||
$f = fopen($bFile,'w');
|
||||
fwrite($f, $bContent->content);
|
||||
fclose($f);
|
||||
|
||||
$command = sprintf('%s %s %s', $this->diff_cmd, $bFile, $eFile);
|
||||
$output = $this->execCmd($command, $error);
|
||||
|
||||
$list = explode("\n", $output);
|
||||
$cnt = count($list);
|
||||
|
||||
$output = array();
|
||||
$obj = null;
|
||||
for($i=0;$i<$cnt;$i++) {
|
||||
$line = $list[$i];
|
||||
if(preg_match('/^([0-9,]+)(d|c|a)([0-9,]+)$/',$line, $mat)) {
|
||||
if($obj!==null) $output[] = $obj;
|
||||
$obj = null;
|
||||
$before = $mat[1];
|
||||
switch($mat[2]) {
|
||||
case 'c' : $type = 'modified'; break;
|
||||
case 'd' : $type = 'deleted'; break;
|
||||
case 'a' : $type = 'added'; break;
|
||||
}
|
||||
|
||||
$t = explode(',',$after);
|
||||
$after = $mat[3];
|
||||
|
||||
$obj->before_line = $before;
|
||||
$obj->after_line = $after;
|
||||
$obj->diff_type = $type;
|
||||
$obj->before_code = '';
|
||||
$obj->after_code = '';
|
||||
}
|
||||
|
||||
if($obj!==null&&preg_match('/^</',$line)) {
|
||||
$str = substr($line,1);
|
||||
$obj->before_code .= $str."\n";
|
||||
}
|
||||
|
||||
if($obj!==null&&preg_match('/^>/',$line)) {
|
||||
$str = substr($line,1);
|
||||
$obj->after_code .= $str."\n";
|
||||
}
|
||||
}
|
||||
if($obj!==null) $output[] = $obj;
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
function getComp($path, $brev, $erev) {
|
||||
if(!$brev) {
|
||||
$command = sprintf("%s --non-interactive --config-dir %s log --xml --limit 2 '%s%s@%d'", $this->svn_cmd, $this->tmp_dir, $this->url, $path, $erev);
|
||||
$buff = $this->execCmd($command, $error);
|
||||
$xmlDoc = $this->oXml->parse($buff);
|
||||
$brev = $xmlDoc->log->logentry[1]->attrs->revision;
|
||||
if(!$brev) return;
|
||||
}
|
||||
|
||||
$command = sprintf("%s --non-interactive --config-dir %s diff '%s%s@%d' '%s%s@%d'",
|
||||
$this->svn_cmd,
|
||||
$this->tmp_dir,
|
||||
$this->url,
|
||||
$path,
|
||||
$brev,
|
||||
$this->url,
|
||||
$path,
|
||||
$erev
|
||||
);
|
||||
$output = $this->execCmd($command, $error);
|
||||
|
||||
$list = explode("\n",$output);
|
||||
$cnt = count($list);
|
||||
$output = array();
|
||||
$obj = null;
|
||||
$idx = 0;
|
||||
for($i=0;$i<$cnt;$i++) {
|
||||
$str = $list[$i];
|
||||
if(preg_match('/^Index: (.*)$/', $str, $m)) {
|
||||
if($obj!==null) $output[] = $obj;
|
||||
$obj = null;
|
||||
$obj->filename = $m[1];
|
||||
$idx = 0;
|
||||
$code_idx = -1;
|
||||
$code_changed = false;
|
||||
continue;
|
||||
}
|
||||
if(preg_match('/^(\=+)$/',$str)) continue;
|
||||
if(preg_match('/^--- ([^\(]+)\(revision ([0-9]+)\)$/i',$str,$m)) {
|
||||
$obj->before_revision = $m[2];
|
||||
continue;
|
||||
}
|
||||
if(preg_match('/^\+\+\+ ([^\(]+)\(revision ([0-9]+)\)$/i',$str,$m)) {
|
||||
$obj->after_revision = $m[2];
|
||||
continue;
|
||||
}
|
||||
if(preg_match('/^@@ \-([0-9]+),([0-9]+) \+([0-9]+),([0-9]+) @@$/', $str, $m)) {
|
||||
$obj->changed[$idx]->before_line = sprintf('%d ~ %d', $m[1], $m[2]);
|
||||
$obj->changed[$idx]->after_line = sprintf('%d ~ %d', $m[3], $m[4]);
|
||||
continue;
|
||||
}
|
||||
if(preg_match('/^\-(.*)$/i',$str)) {
|
||||
if(!$code_changed) {
|
||||
$code_changed = true;
|
||||
$code_idx++;
|
||||
}
|
||||
$obj->changed[$idx]->before_code[$code_idx] .= substr($str,1)."\n";
|
||||
continue;
|
||||
}
|
||||
if(preg_match('/^\+(.*)$/i',$str)) {
|
||||
$obj->changed[$idx]->after_code[$code_idx] .= substr($str,1)."\n";
|
||||
$code_changed = false;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if($obj!==null) $output[] = $obj;
|
||||
return $output;
|
||||
}
|
||||
|
||||
function getLog($path, $erev=null, $brev=null, $quiet = false, $limit = 2) {
|
||||
if(strpos($path,'..')!==false) return;
|
||||
|
||||
$command = sprintf(
|
||||
"%s --non-interactive --config-dir %s log --xml %s %s %s '%s%s'",
|
||||
$this->svn_cmd,
|
||||
$this->tmp_dir,
|
||||
$quiet?'--quiet':'--verbose',
|
||||
$limit?'--limit '.$limit:'',
|
||||
$erev>0?(sprintf('-r%d:%d',(int)$erev, (int)$brev)):'',
|
||||
$this->url,
|
||||
$path
|
||||
);
|
||||
|
||||
$output = $this->execCmd($command, $error);
|
||||
|
||||
$xmlDoc = $this->oXml->parse($output);
|
||||
$items = $xmlDoc->log->logentry;
|
||||
if(!$items) return null;
|
||||
|
||||
$output = null;
|
||||
if(!is_array($items)) $items = array($items);
|
||||
foreach($items as $tmp) {
|
||||
$obj = null;
|
||||
$date = $tmp->date->body;
|
||||
|
||||
$obj->revision = $tmp->attrs->revision;
|
||||
$obj->author = $tmp->author->body;
|
||||
$obj->date = $this->getDateStr("Y-m-d H:i",$date);
|
||||
$obj->gap = $this->getTimeGap($date);
|
||||
|
||||
$paths = $tmp->paths->path;
|
||||
if(!is_array($paths)) $paths = array($paths);
|
||||
foreach($paths as $key => $val) {
|
||||
$tmp_obj = null;
|
||||
$tmp_obj->action = $val->attrs->action;
|
||||
$tmp_obj->copyfrom_path = $val->attrs->{"copyfrom-path"};
|
||||
$tmp_obj->copyfrom_rev = $val->attrs->{"copyfrom-rev"};
|
||||
$tmp_obj->path = $val->body;
|
||||
$obj->paths[] = $tmp_obj;
|
||||
}
|
||||
|
||||
$obj->msg = $this->linkXE($tmp->msg->body);
|
||||
$output[] = $obj;
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
|
||||
|
||||
function getPath($path) {
|
||||
$buff = pathinfo($path);
|
||||
return $buff['dirname'];
|
||||
}
|
||||
|
||||
function execCmd($command, &$error) {
|
||||
$err = false;
|
||||
|
||||
$descriptorspec = array (
|
||||
0 => array('pipe', 'r'),
|
||||
1 => array('pipe', 'w'),
|
||||
2 => array('pipe', 'w')
|
||||
);
|
||||
|
||||
$fp = proc_open($command, $descriptorspec, $pipes);
|
||||
|
||||
if (!is_resource($fp)) return;
|
||||
|
||||
$handle = $pipes[1];
|
||||
$output = '';
|
||||
while (!feof($handle)) {
|
||||
$buff = fgets($handle,1024);
|
||||
$output .= $buff;
|
||||
}
|
||||
|
||||
$error = '';
|
||||
while (!feof($pipes[2])) {
|
||||
$error .= fgets($pipes[2], 1024);
|
||||
}
|
||||
|
||||
fclose($pipes[0]);
|
||||
fclose($pipes[1]);
|
||||
fclose($pipes[2]);
|
||||
|
||||
proc_close($fp);
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
function getParentPath($path) {
|
||||
$parent_path = null;
|
||||
if($path) {
|
||||
$pathinfo = pathinfo($path);
|
||||
$parent_path = $pathinfo['dirname'].'/';
|
||||
}
|
||||
}
|
||||
|
||||
function explodePath($source_path, $is_file = false) {
|
||||
if(!$source_path) return;
|
||||
|
||||
$arr_path = explode('/', $source_path);
|
||||
if(substr($source_path,-1)!='/') $file = array_pop($arr_path);
|
||||
|
||||
$output = array('/'=>'');
|
||||
|
||||
$path = null;
|
||||
foreach($arr_path as $p) {
|
||||
if(!trim($p)) continue;
|
||||
$path .= $p.'/';
|
||||
$output[$p] = $path;
|
||||
}
|
||||
|
||||
if($file) $output[$file] = $source_path;
|
||||
return $output;
|
||||
}
|
||||
|
||||
function getDateStr($format, $str) {
|
||||
return date($format, strtotime($str));
|
||||
}
|
||||
|
||||
function getTimeGap($str, $dayStr = 'day', $hourStr = 'hour', $minStr = 'minute') {
|
||||
$time = strtotime($str);
|
||||
|
||||
$time_gap = time()-$time;
|
||||
|
||||
if($time_gap < 60) return '1 '.$minStr;
|
||||
else if($time_gap < 60*60) return (int)($time_gap / 60).' '.$minStr;
|
||||
else if($time_gap < 60*60*24) {
|
||||
$hour = (int)($time_gap/(60*60));
|
||||
$time_gap -= $hour*60*60;
|
||||
$min = (int)($time_gap/60);
|
||||
return sprintf("%02d",$hour)." ".$hourStr." ".($mid?sprintf("%02d",$min)." ".$minStr:'');
|
||||
} else {
|
||||
$day = (int)($time_gap/(60*60*24));
|
||||
$time_gap -= $day*60*60*24;
|
||||
$hour = (int)($time_gap/(60*60));
|
||||
return $day." ".$dayStr." ".($hour?sprintf("%02d",$hour)." ".$hourStr:'');
|
||||
}
|
||||
}
|
||||
|
||||
function linkXE($msg) {
|
||||
$msg = preg_replace_callback('/(.[0-9]+)/s',array($this, '_linkDocument'),$msg);
|
||||
return $msg;
|
||||
}
|
||||
|
||||
function _linkDocument($matches) {
|
||||
$document_srl = $matches[1];
|
||||
if(in_array(substr($document_srl,0,1),array('r','#','/'))) return $matches[0];
|
||||
if(!$document_srl || !preg_match('/^([0-9]+)$/',$document_srl)) return $matches[0];
|
||||
|
||||
return sprintf('<a href="%s" onclick="window.open(this.href);return false;">%d</a>',getUrl('','document_srl',$document_srl), $document_srl);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
11
modules/issuetracker/conf/info.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module version="0.2">
|
||||
<title xml:lang="ko">이슈트래커</title>
|
||||
<description xml:lang="ko">각종 이슈 처리를 위한 모듈입니다.</description>
|
||||
<version>1.0</version>
|
||||
<date>2008-08-04</date>
|
||||
<category>service</category>
|
||||
<author email_address="haneul0318@gmail.com" link="http://www.seungyeop.kr">
|
||||
<name xml:lang="ko">haneul, zero</name>
|
||||
</author>
|
||||
</module>
|
||||
80
modules/issuetracker/conf/module.xml
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<module>
|
||||
<grants>
|
||||
<grant name="access" default="guest">
|
||||
<title xml:lang="ko">프로젝트 접근</title>
|
||||
</grant>
|
||||
<grant name="browser_source" default="guest">
|
||||
<title xml:lang="ko">소스 열람</title>
|
||||
</grant>
|
||||
<grant name="ticket_view" default="guest">
|
||||
<title xml:lang="ko">티켓 열람</title>
|
||||
</grant>
|
||||
<grant name="ticket_write" default="guest">
|
||||
<title xml:lang="ko">티켓 생성</title>
|
||||
</grant>
|
||||
<grant name="commiter" default="member">
|
||||
<title xml:lang="ko">개발자</title>
|
||||
</grant>
|
||||
<grant name="download" default="guest">
|
||||
<title xml:lang="ko">다운로드</title>
|
||||
</grant>
|
||||
<grant name="manager" default="root">
|
||||
<title xml:lang="ko">프로젝트 관리</title>
|
||||
</grant>
|
||||
</grants>
|
||||
<actions>
|
||||
<action name="dispIssuetrackerViewIssue" type="view" standalone="true" index="true"/>
|
||||
<action name="dispIssuetrackerViewSource" type="view" standalone="true"/>
|
||||
<action name="dispIssuetrackerViewMilestone" type="view" standalone="true" />
|
||||
<action name="dispIssuetrackerNewIssue" type="view" standalone="true"/>
|
||||
<action name="dispIssuetrackerDeleteIssue" type="view" standalone="true"/>
|
||||
<action name="dispIssuetrackerDeleteTrackback" type="view" standalone="true"/>
|
||||
<action name="dispIssuetrackerMilestone" type="view" standalone="true" />
|
||||
<action name="dispIssuetrackerDownload" type="view" standalone="true" />
|
||||
|
||||
<action name="procIssuetrackerInsertIssue" type="controller" standalone="true" />
|
||||
<action name="procIssuetrackerDeleteIssue" type="controller" standalone="true" />
|
||||
<action name="procIssuetrackerDeleteTrackback" type="controller" standalone="true" />
|
||||
<action name="procIssuetrackerVerificationPassword" type="controller" standalone="true" />
|
||||
<action name="procIssuetrackerInsertHistory" type="controller" standalone="true" />
|
||||
|
||||
<action name="dispIssuetrackerAdminContent" type="view" standalone="true" admin_index="true" />
|
||||
<action name="dispIssuetrackerAdminProjectSetting" type="view" standalone="true" />
|
||||
<action name="dispIssuetrackerAdminReleaseSetting" type="view" standalone="true" />
|
||||
<action name="dispIssuetrackerAdminAdditionSetup" type="view" standalone="true" />
|
||||
<action name="dispIssuetrackerAdminGrantInfo" type="view" standalone="true" />
|
||||
<action name="dispIssuetrackerAdminSkinInfo" type="view" standalone="true" />
|
||||
<action name="dispIssuetrackerAdminProjectInfo" type="view" standalone="true" />
|
||||
<action name="dispIssuetrackerAdminInsertProject" type="view" standalone="true" />
|
||||
<action name="dispIssuetrackerAdminDeleteIssuetracker" type="view" standalone="true" />
|
||||
|
||||
<action name="dispIssuetrackerAdminModifyMilestone" type="view" standalone="true" />
|
||||
<action name="dispIssuetrackerAdminModifyPriority" type="view" standalone="true" />
|
||||
<action name="dispIssuetrackerAdminModifyType" type="view" standalone="true" />
|
||||
<action name="dispIssuetrackerAdminModifyComponent" type="view" standalone="true" />
|
||||
<action name="dispIssuetrackerAdminModifyPackage" type="view" standalone="true" />
|
||||
<action name="dispIssuetrackerAdminModifyRelease" type="view" standalone="true" />
|
||||
<action name="dispIssuetrackerAdminAttachRelease" type="view" standalone="true" />
|
||||
|
||||
<action name="procIssuetrackerAdminInsertProject" type="controller" standalone="true" />
|
||||
<action name="procIssuetrackerAdminInsertMilestone" type="controller" standalone="true" />
|
||||
<action name="procIssuetrackerAdminInsertPriority" type="controller" standalone="true" />
|
||||
<action name="procIssuetrackerAdminInsertComponent" type="controller" standalone="true" />
|
||||
<action name="procIssuetrackerAdminInsertType" type="controller" standalone="true" />
|
||||
<action name="procIssuetrackerAdminInsertPackage" type="controller" standalone="true" />
|
||||
<action name="procIssuetrackerAdminInsertRelease" type="controller" standalone="true" />
|
||||
<action name="procIssuetrackerAdminDeleteIssuetracker" type="controller" standalone="true" />
|
||||
<action name="procIssuetrackerAdminDeleteMilestone" type="controller" standalone="true" />
|
||||
<action name="procIssuetrackerAdminDeletePriority" type="controller" standalone="true" />
|
||||
<action name="procIssuetrackerAdminDeleteType" type="controller" standalone="true" />
|
||||
<action name="procIssuetrackerAdminDeleteComponent" type="controller" standalone="true" />
|
||||
<action name="procIssuetrackerAdminDeletePackage" type="controller" standalone="true" />
|
||||
<action name="procIssuetrackerAdminDeleteRelease" type="controller" standalone="true" />
|
||||
<action name="procIssuetrackerAdminDeleteFile" type="controller" standalone="true" />
|
||||
<action name="procIssuetrackerAdminAttachRelease" type="controller" standalone="true" />
|
||||
<action name="procIssuetrackerAdminInsertGrant" type="controller" standalone="true" />
|
||||
<action name="procIssuetrackerAdminUpdateSkinInfo" type="controller" standalone="true" />
|
||||
|
||||
</actions>
|
||||
</module>
|
||||
457
modules/issuetracker/issuetracker.admin.controller.php
Normal file
|
|
@ -0,0 +1,457 @@
|
|||
<?php
|
||||
/**
|
||||
* @class issuetrackerAdminController
|
||||
* @author zero (zero@nzeo.com)
|
||||
* @brief issuetracker 모듈의 admin controller class
|
||||
**/
|
||||
|
||||
class issuetrackerAdminController extends issuetracker {
|
||||
|
||||
/**
|
||||
* @brief 초기화
|
||||
**/
|
||||
function init() {
|
||||
}
|
||||
|
||||
function procIssuetrackerAdminInsertProject($args = null) {
|
||||
// module 모듈의 model/controller 객체 생성
|
||||
$oModuleController = &getController('module');
|
||||
$oModuleModel = &getModel('module');
|
||||
|
||||
// 만약 module_srl이 , 로 연결되어 있다면 일괄 정보 수정으로 처리
|
||||
if(strpos(Context::get('module_srl'),',')!==false) {
|
||||
// 대상 모듈들을 구해옴
|
||||
$modules = $oModuleModel->getModulesInfo(Context::get('module_srl'));
|
||||
$args = Context::getRequestVars();
|
||||
|
||||
for($i=0;$i<count($modules);$i++) {
|
||||
$obj = $extra_vars = null;
|
||||
|
||||
$obj = $modules[$i];
|
||||
$extra_vars = unserialize($obj->extra_vars);
|
||||
|
||||
$obj->module = 'issuetracker';
|
||||
$obj->module_category_srl = $args->module_category_srl;
|
||||
$obj->layout_srl = $args->layout_srl;
|
||||
$obj->skin = $args->skin;
|
||||
$obj->description = $args->description;
|
||||
$obj->header_text = $args->header_text;
|
||||
$obj->footer_text = $args->footer_text;
|
||||
$obj->admin_id = $args->admin_id;
|
||||
|
||||
$extra_vars->admin_mail = $args->admin_mail;
|
||||
|
||||
$obj->extra_vars = serialize($extra_vars);
|
||||
|
||||
$output = $oModuleController->updateModule($obj);
|
||||
if(!$output->toBool()) return $output;
|
||||
}
|
||||
|
||||
return new Object(0,'success_updated');
|
||||
}
|
||||
|
||||
// 일단 입력된 값들을 모두 받아서 db 입력항목과 그외 것으로 분리
|
||||
if(!$args) {
|
||||
$args = Context::gets('module_srl','module_category_srl','project_name','layout_srl','skin','browser_title','description','is_default','header_text','footer_text','admin_id');
|
||||
$extra_var = delObjectVars(Context::getRequestVars(), $args);
|
||||
}
|
||||
|
||||
$args->module = 'issuetracker';
|
||||
$args->mid = $args->project_name;
|
||||
unset($args->project_name);
|
||||
if($args->is_default!='Y') $args->is_default = 'N';
|
||||
|
||||
// 기본 값외의 것들을 정리
|
||||
unset($extra_var->act);
|
||||
unset($extra_var->page);
|
||||
unset($extra_var->project_name);
|
||||
unset($extra_var->module_srl);
|
||||
|
||||
// 확장변수(20개로 제한된 고정 변수) 체크
|
||||
$user_defined_extra_vars = array();
|
||||
foreach($extra_var as $key => $val) {
|
||||
if(substr($key,0,11)!='extra_vars_') continue;
|
||||
preg_match('/^extra_vars_([0-9]+)_(.*)$/i', $key, $matches);
|
||||
if(!$matches[1] || !$matches[2]) continue;
|
||||
|
||||
$user_defined_extra_vars[$matches[1]]->{$matches[2]} = $val;
|
||||
unset($extra_var->{$key});
|
||||
}
|
||||
for($i=1;$i<=20;$i++) if(!$user_defined_extra_vars[$i]->name) unset($user_defined_extra_vars[$i]);
|
||||
$extra_var->extra_vars = $user_defined_extra_vars;
|
||||
|
||||
// module_srl이 넘어오면 원 모듈이 있는지 확인
|
||||
if($args->module_srl) {
|
||||
$module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl);
|
||||
|
||||
// 만약 원래 모듈이 없으면 새로 입력하기 위한 처리
|
||||
if($module_info->module_srl != $args->module_srl) unset($args->module_srl);
|
||||
}
|
||||
|
||||
// $extra_var를 serialize
|
||||
$args->extra_vars = serialize($extra_var);
|
||||
|
||||
// is_default=='Y' 이면
|
||||
if($args->is_default=='Y') $oModuleController->clearDefaultModule();
|
||||
|
||||
// module_srl의 값에 따라 insert/update
|
||||
if(!$args->module_srl) {
|
||||
$output = $oModuleController->insertModule($args);
|
||||
$msg_code = 'success_registed';
|
||||
|
||||
// 파일업로드, 댓글 파일업로드, 관리에 대한 권한 지정
|
||||
if($output->toBool()) {
|
||||
$oMemberModel = &getModel('member');
|
||||
$admin_group = $oMemberModel->getAdminGroup();
|
||||
$admin_group_srl = $admin_group->group_srl;
|
||||
|
||||
$module_srl = $output->get('module_srl');
|
||||
$grants = serialize(array('manager'=>array($admin_group_srl)));
|
||||
|
||||
$oModuleController->updateModuleGrant($module_srl, $grants);
|
||||
}
|
||||
} else {
|
||||
$output = $oModuleController->updateModule($args);
|
||||
$msg_code = 'success_updated';
|
||||
}
|
||||
|
||||
if(!$output->toBool()) return $output;
|
||||
|
||||
$this->add('page',Context::get('page'));
|
||||
$this->add('module_srl',$output->get('module_srl'));
|
||||
$this->setMessage($msg_code);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 프로젝트 삭제
|
||||
**/
|
||||
function procIssuetrackerAdminDeleteIssuetracker() {
|
||||
$module_srl = Context::get('module_srl');
|
||||
|
||||
// 원본을 구해온다
|
||||
$oModuleController = &getController('module');
|
||||
$output = $oModuleController->deleteModule($module_srl);
|
||||
if(!$output->toBool()) return $output;
|
||||
|
||||
$args->module_srl = $module_srl;
|
||||
$output = executeQuery('issue.deleteMilestones', $args);
|
||||
$output = executeQuery('issue.deleteTypes', $args);
|
||||
$output = executeQuery('issue.deletePriorities', $args);
|
||||
$output = executeQuery('issue.deleteComponents', $args);
|
||||
|
||||
$this->add('module','issuetracker');
|
||||
$this->add('page',Context::get('page'));
|
||||
$this->setMessage('success_deleted');
|
||||
}
|
||||
|
||||
|
||||
function procIssuetrackerAdminInsertMilestone()
|
||||
{
|
||||
$args = Context::getRequestVars();
|
||||
$args->module_srl = $this->module_srl;
|
||||
if($args->is_default=='Y') executeQuery('issuetracker.clearMilestoneDefault', $args);
|
||||
|
||||
if(!$args->milestone_srl)
|
||||
{
|
||||
$args->milestone_srl = getNextSequence();
|
||||
executeQuery("issuetracker.insertMilestone", $args);
|
||||
}
|
||||
else
|
||||
{
|
||||
executeQuery("issuetracker.updateMilestone", $args);
|
||||
}
|
||||
}
|
||||
|
||||
function procIssuetrackerAdminInsertType()
|
||||
{
|
||||
$args = Context::getRequestVars();
|
||||
$args->module_srl = $this->module_srl;
|
||||
if($args->is_default=='Y') executeQuery('issuetracker.clearTypeDefault', $args);
|
||||
|
||||
if($args->type_srl) {
|
||||
$output = executeQuery("issuetracker.updateType", $args);
|
||||
|
||||
} else {
|
||||
$args->type_srl = getNextSequence();
|
||||
executeQuery("issuetracker.insertType", $args);
|
||||
}
|
||||
}
|
||||
|
||||
function procIssuetrackerAdminInsertComponent()
|
||||
{
|
||||
$args = Context::getRequestVars();
|
||||
$args->module_srl = $this->module_srl;
|
||||
if($args->is_default=='Y') executeQuery('issuetracker.clearComponentsDefault', $args);
|
||||
|
||||
if($args->component_srl) {
|
||||
$output = executeQuery("issuetracker.updateComponent", $args);
|
||||
|
||||
} else {
|
||||
|
||||
$args->component_srl = getNextSequence();
|
||||
$output = executeQuery("issuetracker.insertComponent", $args);
|
||||
}
|
||||
}
|
||||
|
||||
function procIssuetrackerAdminInsertPriority()
|
||||
{
|
||||
$args = Context::getRequestVars();
|
||||
$args->module_srl = $this->module_srl;
|
||||
if($args->is_default=='Y') executeQuery('issuetracker.clearPrioritiesDefault',$args);
|
||||
|
||||
if($args->priority_srl) {
|
||||
$output = executeQuery("issuetracker.updatePriority", $args);
|
||||
|
||||
} else {
|
||||
$oIssuetrackerModel = &getModel('issuetracker');
|
||||
$listorder = $oIssuetrackerModel->getPriorityMaxListorder($args->module_srl);
|
||||
if($listorder<0) return;
|
||||
$args->priority_srl = getNextSequence();
|
||||
$args->listorder = $listorder+ 1;
|
||||
$output = executeQuery("issuetracker.insertPriority", $args);
|
||||
}
|
||||
}
|
||||
|
||||
function procIssuetrackerAdminDeleteMilestone()
|
||||
{
|
||||
$args = Context::getRequestVars();
|
||||
$output = executeQuery("issuetracker.deleteMilestone", $args);
|
||||
$this->setMessage('success_deleted');
|
||||
}
|
||||
|
||||
function procIssuetrackerAdminDeletePriority()
|
||||
{
|
||||
$args = Context::getRequestVars();
|
||||
$output = executeQuery("issuetracker.deletePriority", $args);
|
||||
$this->setMessage('success_deleted');
|
||||
}
|
||||
|
||||
function procIssuetrackerAdminDeleteType()
|
||||
{
|
||||
$args = Context::getRequestVars();
|
||||
$output = executeQuery("issuetracker.deleteType", $args);
|
||||
$this->setMessage('success_deleted');
|
||||
}
|
||||
|
||||
function procIssuetrackerAdminDeleteComponent()
|
||||
{
|
||||
$args = Context::getRequestVars();
|
||||
$output = executeQuery("issuetracker.deleteComponent", $args);
|
||||
$this->setMessage('success_deleted');
|
||||
}
|
||||
|
||||
function procIssuetrackerAdminInsertPackage()
|
||||
{
|
||||
$args = Context::getRequestVars();
|
||||
$args->module_srl = $this->module_srl;
|
||||
|
||||
if(!$args->package_srl)
|
||||
{
|
||||
$args->package_srl = getNextSequence();
|
||||
executeQuery("issuetracker.insertPackage", $args);
|
||||
}
|
||||
else
|
||||
{
|
||||
executeQuery("issuetracker.updatePackage", $args);
|
||||
}
|
||||
}
|
||||
|
||||
function procIssuetrackerAdminInsertRelease()
|
||||
{
|
||||
$args = Context::getRequestVars();
|
||||
$args->module_srl = $this->module_srl;
|
||||
|
||||
if(!$args->release_srl)
|
||||
{
|
||||
$args->release_srl = getNextSequence();
|
||||
executeQuery("issuetracker.insertRelease", $args);
|
||||
}
|
||||
else
|
||||
{
|
||||
executeQuery("issuetracker.updateRelease", $args);
|
||||
}
|
||||
}
|
||||
|
||||
function procIssuetrackerAdminDeletePackage()
|
||||
{
|
||||
$args = Context::getRequestVars();
|
||||
$package_srl = $args->package_srl;
|
||||
if(!$package_srl) return new Object(-1, 'msg_invalid_request');
|
||||
|
||||
$oIssuetrackerModel= &getModel('issuetracker');
|
||||
$release_list = $oIssuetrackerModel->getReleaseList($package_srl);
|
||||
|
||||
$output = executeQuery("issuetracker.deletePackage", $args);
|
||||
if(!$output->toBool()) return $output;
|
||||
|
||||
if(!count($release_list)) return;
|
||||
|
||||
foreach($release_list as $release_srl => $release) {
|
||||
$this->deleteRelease($release_srl);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function procIssuetrackerAdminDeleteRelease()
|
||||
{
|
||||
$release_srl = Context::get('release_srl');
|
||||
$this->deleteRelease($release_srl);
|
||||
$this->setMessage('success_deleted');
|
||||
}
|
||||
|
||||
function deleteRelease($release_srl) {
|
||||
$args->release_srl = $release_srl;
|
||||
$output = executeQuery("issuetracker.deleteRelease", $args);
|
||||
if(!$output->toBool()) return $output;
|
||||
|
||||
$oFileController = &getController('file');
|
||||
$oFileController->deleteFiles($args->release_srl);
|
||||
}
|
||||
|
||||
function procIssuetrackerAdminAttachRelease() {
|
||||
$module_srl = Context::get('module_srl');
|
||||
$module = Context::get('module');
|
||||
$mid = Context::get('mid');
|
||||
$release_srl = Context::get('release_srl');
|
||||
$package_srl = Context::get('package_srl');
|
||||
$comment = Context::get('comment');
|
||||
$file_info = Context::get('file');
|
||||
|
||||
if(!Context::isUploaded() || !$module_srl || !$release_srl) {
|
||||
$msg = Context::getLang('msg_invalid_request');
|
||||
} else if(!is_uploaded_file($file_info['tmp_name'])) {
|
||||
$msg = Context::getLang('msg_not_attached');
|
||||
} else {
|
||||
$oFileController = &getController('file');
|
||||
$output = $oFileController->insertFile($file_info, $module_srl, $release_srl, 0);
|
||||
$msg = Context::getLang('msg_attached');
|
||||
$oFileController->setFilesValid($release_srl);
|
||||
$file_srl = $output->get('file_srl');
|
||||
Context::set('file_srl', $file_srl);
|
||||
|
||||
if($comment) {
|
||||
$comment_args->file_srl = $file_srl;
|
||||
$comment_args->comment = $comment;
|
||||
executeQuery('issuetracker.updateReleaseFile', $comment_args);
|
||||
}
|
||||
}
|
||||
Context::set('msg', $msg);
|
||||
Context::set('layout','none');
|
||||
$this->setTemplatePath(sprintf("%stpl/",$this->module_path));
|
||||
$this->setTemplateFile('attached');
|
||||
}
|
||||
|
||||
function procIssuetrackerAdminDeleteFile()
|
||||
{
|
||||
$file_srl = Context::get('file_srl');
|
||||
if(!$file_srl) return new Object(-1, 'msg_invalid_request');
|
||||
|
||||
$oFileController = &getController('file');
|
||||
return $oFileController->deleteFile($file_srl);
|
||||
}
|
||||
|
||||
function procIssuetrackerAdminInsertGrant() {
|
||||
$module_srl = Context::get('module_srl');
|
||||
|
||||
// 현 모듈의 권한 목록을 가져옴
|
||||
$grant_list = $this->xml_info->grant;
|
||||
|
||||
if(count($grant_list)) {
|
||||
foreach($grant_list as $key => $val) {
|
||||
$group_srls = Context::get($key);
|
||||
if($group_srls) $arr_grant[$key] = explode('|@|',$group_srls);
|
||||
}
|
||||
$grants = serialize($arr_grant);
|
||||
}
|
||||
|
||||
$oModuleController = &getController('module');
|
||||
$oModuleController->updateModuleGrant($module_srl, $grants);
|
||||
|
||||
$this->add('module_srl',Context::get('module_srl'));
|
||||
$this->setMessage('success_registed');
|
||||
}
|
||||
|
||||
function procIssuetrackerAdminUpdateSkinInfo() {
|
||||
// module_srl에 해당하는 정보들을 가져오기
|
||||
$module_srl = Context::get('module_srl');
|
||||
$oModuleModel = &getModel('module');
|
||||
$module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
|
||||
$skin = $module_info->skin;
|
||||
|
||||
// 스킨의 정보를 구해옴 (extra_vars를 체크하기 위해서)
|
||||
$skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin);
|
||||
|
||||
// 입력받은 변수들을 체크 (mo, act, module_srl, page등 기본적인 변수들 없앰)
|
||||
$obj = Context::getRequestVars();
|
||||
unset($obj->act);
|
||||
unset($obj->module_srl);
|
||||
unset($obj->page);
|
||||
|
||||
// 원 skin_info에서 extra_vars의 type이 image일 경우 별도 처리를 해줌
|
||||
if($skin_info->extra_vars) {
|
||||
foreach($skin_info->extra_vars as $vars) {
|
||||
if($vars->type!='image') continue;
|
||||
|
||||
$image_obj = $obj->{$vars->name};
|
||||
|
||||
// 삭제 요청에 대한 변수를 구함
|
||||
$del_var = $obj->{"del_".$vars->name};
|
||||
unset($obj->{"del_".$vars->name});
|
||||
if($del_var == 'Y') {
|
||||
FileHandler::removeFile($module_info->{$vars->name});
|
||||
continue;
|
||||
}
|
||||
|
||||
// 업로드 되지 않았다면 이전 데이터를 그대로 사용
|
||||
if(!$image_obj['tmp_name']) {
|
||||
$obj->{$vars->name} = $module_info->{$vars->name};
|
||||
continue;
|
||||
}
|
||||
|
||||
// 정상적으로 업로드된 파일이 아니면 무시
|
||||
if(!is_uploaded_file($image_obj['tmp_name'])) {
|
||||
unset($obj->{$vars->name});
|
||||
continue;
|
||||
}
|
||||
|
||||
// 이미지 파일이 아니어도 무시
|
||||
if(!preg_match("/\.(jpg|jpeg|gif|png)$/i", $image_obj['name'])) {
|
||||
unset($obj->{$vars->name});
|
||||
continue;
|
||||
}
|
||||
|
||||
// 경로를 정해서 업로드
|
||||
$path = sprintf("./files/attach/images/%s/", $module_srl);
|
||||
|
||||
// 디렉토리 생성
|
||||
if(!FileHandler::makeDir($path)) return false;
|
||||
|
||||
$filename = $path.$image_obj['name'];
|
||||
|
||||
// 파일 이동
|
||||
if(!move_uploaded_file($image_obj['tmp_name'], $filename)) {
|
||||
unset($obj->{$vars->name});
|
||||
continue;
|
||||
}
|
||||
|
||||
// 변수를 바꿈
|
||||
unset($obj->{$vars->name});
|
||||
$obj->{$vars->name} = $filename;
|
||||
}
|
||||
}
|
||||
|
||||
// serialize하여 저장
|
||||
$skin_vars = serialize($obj);
|
||||
|
||||
$oModuleController = &getController('module');
|
||||
$oModuleController->updateModuleSkinVars($module_srl, $skin_vars);
|
||||
|
||||
$this->setLayoutPath('./common/tpl');
|
||||
$this->setLayoutFile('default_layout.html');
|
||||
$this->setTemplatePath($this->module_path.'tpl');
|
||||
$this->setTemplateFile("top_refresh.html");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
?>
|
||||
306
modules/issuetracker/issuetracker.admin.view.php
Normal file
|
|
@ -0,0 +1,306 @@
|
|||
<?php
|
||||
/**
|
||||
* @class issuetrackerAdminView
|
||||
* @author zero (zero@nzeo.com)
|
||||
* @brief issuetracker 모듈의 admin view class
|
||||
**/
|
||||
|
||||
class issuetrackerAdminView extends issuetracker {
|
||||
|
||||
function init() {
|
||||
// module_srl이 있으면 미리 체크하여 존재하는 모듈이면 module_info 세팅
|
||||
$module_srl = Context::get('module_srl');
|
||||
if(!$module_srl && $this->module_srl) {
|
||||
$module_srl = $this->module_srl;
|
||||
Context::set('module_srl', $module_srl);
|
||||
}
|
||||
|
||||
// module model 객체 생성
|
||||
$oModuleModel = &getModel('module');
|
||||
|
||||
// module_srl이 넘어오면 해당 모듈의 정보를 미리 구해 놓음
|
||||
if($module_srl) {
|
||||
$module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
|
||||
if(!$module_info) {
|
||||
Context::set('module_srl','');
|
||||
$this->act = 'list';
|
||||
} else {
|
||||
$this->module_info = $module_info;
|
||||
Context::set('module_info',$module_info);
|
||||
}
|
||||
}
|
||||
|
||||
// 모듈 카테고리 목록을 구함
|
||||
$module_category = $oModuleModel->getModuleCategories();
|
||||
Context::set('module_category', $module_category);
|
||||
|
||||
$template_path = sprintf("%stpl/",$this->module_path);
|
||||
$this->setTemplatePath($template_path);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 프로젝트 관리 목록 보여줌
|
||||
**/
|
||||
function dispIssuetrackerAdminContent() {
|
||||
// 등록된 board 모듈을 불러와 세팅
|
||||
$args->sort_index = "module_srl";
|
||||
$args->page = Context::get('page');
|
||||
$args->list_count = 40;
|
||||
$args->page_count = 10;
|
||||
$args->s_module_category_srl = Context::get('module_category_srl');
|
||||
$output = executeQuery('issuetracker.getProjectList', $args);
|
||||
|
||||
// 템플릿에 쓰기 위해서 context::set
|
||||
Context::set('total_count', $output->total_count);
|
||||
Context::set('total_page', $output->total_page);
|
||||
Context::set('page', $output->page);
|
||||
Context::set('project_list', $output->data);
|
||||
Context::set('page_navigation', $output->page_navigation);
|
||||
|
||||
// 템플릿 파일 지정
|
||||
$this->setTemplateFile('index');
|
||||
}
|
||||
|
||||
function dispIssuetrackerAdminInsertProject() {
|
||||
// 스킨 목록 구해옴
|
||||
$oModuleModel = &getModel('module');
|
||||
$skin_list = $oModuleModel->getSkins($this->module_path);
|
||||
Context::set('skin_list',$skin_list);
|
||||
|
||||
// 레이아웃 목록을 구해옴
|
||||
$oLayoutMode = &getModel('layout');
|
||||
$layout_list = $oLayoutMode->getLayoutList();
|
||||
Context::set('layout_list', $layout_list);
|
||||
|
||||
// 템플릿 파일 지정
|
||||
$this->setTemplateFile('project_insert');
|
||||
}
|
||||
|
||||
function dispIssuetrackerAdminModifyMilestone() {
|
||||
if(!Context::get('milestone_srl')) return $this->dispIssuetrackerAdminContent();
|
||||
|
||||
$milestone_srl = Context::get('milestone_srl');
|
||||
$oModel = &getModel('issuetracker');
|
||||
$output = $oModel->getMilestone($milestone_srl);
|
||||
|
||||
$milestone = $output->data;
|
||||
Context::set('milestone', $milestone);
|
||||
$this->setTemplateFile('modify_milestone');
|
||||
}
|
||||
|
||||
function dispIssuetrackerAdminModifyPriority() {
|
||||
if(!Context::get('priority_srl')) return $this->dispIssuetrackerAdminContent();
|
||||
|
||||
$priority_srl = Context::get('priority_srl');
|
||||
$oModel = &getModel('issuetracker');
|
||||
$output = $oModel->getPriority($priority_srl);
|
||||
|
||||
$priority = $output->data;
|
||||
Context::set('priority', $priority);
|
||||
$this->setTemplateFile('modify_priority');
|
||||
}
|
||||
|
||||
function dispIssuetrackerAdminModifyType() {
|
||||
if(!Context::get('type_srl')) return $this->dispIssuetrackerAdminContent();
|
||||
|
||||
$type_srl = Context::get('type_srl');
|
||||
$oModel = &getModel('issuetracker');
|
||||
$output = $oModel->getType($type_srl);
|
||||
|
||||
$type = $output->data;
|
||||
Context::set('type', $type);
|
||||
$this->setTemplateFile('modify_type');
|
||||
}
|
||||
|
||||
function dispIssuetrackerAdminModifyComponent() {
|
||||
if(!Context::get('component_srl')) return $this->dispIssuetrackerAdminContent();
|
||||
|
||||
$component_srl = Context::get('component_srl');
|
||||
$oModel = &getModel('issuetracker');
|
||||
$output = $oModel->getComponent($component_srl);
|
||||
|
||||
$component = $output->data;
|
||||
Context::set('component', $component);
|
||||
$this->setTemplateFile('modify_component');
|
||||
}
|
||||
|
||||
function dispIssuetrackerAdminModifyPackage() {
|
||||
$package_srl = Context::get('package_srl');
|
||||
if($package_srl) {
|
||||
$oModel = &getModel('issuetracker');
|
||||
$package = $oModel->getPackage($package_srl);
|
||||
Context::set('package', $package);
|
||||
}
|
||||
$this->setTemplateFile('modify_package');
|
||||
}
|
||||
|
||||
function dispIssuetrackerAdminModifyRelease() {
|
||||
$release_srl = Context::get('release_srl');
|
||||
if($release_srl) {
|
||||
$oModel = &getModel('issuetracker');
|
||||
$release = $oModel->getRelease($release_srl);
|
||||
Context::set('release', $release);
|
||||
}
|
||||
$this->setTemplateFile('modify_release');
|
||||
}
|
||||
|
||||
function dispIssuetrackerAdminAttachRelease() {
|
||||
if(!Context::get('release_srl')) return $this->dispIssuetrackerAdminContent();
|
||||
|
||||
$release_srl = Context::get('release_srl');
|
||||
$oModel = &getModel('issuetracker');
|
||||
$release = $oModel->getRelease($release_srl);
|
||||
Context::set('release', $release);
|
||||
$this->setTemplateFile('attach_release');
|
||||
}
|
||||
|
||||
function dispIssuetrackerAdminProjectSetting() {
|
||||
|
||||
if(!Context::get('module_srl')) return $this->dispIssuetrackerAdminContent();
|
||||
|
||||
$module_srl = Context::get('module_srl');
|
||||
|
||||
// priority
|
||||
$oIssuetrackerModel = &getModel('issuetracker');
|
||||
$priority_list = $oIssuetrackerModel->getList($module_srl, "Priorities");
|
||||
Context::set('priority_list', $priority_list);
|
||||
|
||||
// component
|
||||
$component_list = $oIssuetrackerModel->getList($module_srl, "Components");
|
||||
Context::set('component_list', $component_list);
|
||||
|
||||
// milestone
|
||||
$milestone_list = $oIssuetrackerModel->getList($module_srl, "Milestones");
|
||||
Context::set('milestone_list', $milestone_list);
|
||||
|
||||
// type
|
||||
$type_list = $oIssuetrackerModel->getList($module_srl, "Types");
|
||||
Context::set('type_list', $type_list);
|
||||
$this->setTemplateFile('project_setting');
|
||||
}
|
||||
|
||||
function dispIssuetrackerAdminReleaseSetting() {
|
||||
|
||||
if(!Context::get('module_srl')) return $this->dispIssuetrackerAdminContent();
|
||||
|
||||
$module_srl = Context::get('module_srl');
|
||||
$package_srl = Context::get('package_srl');
|
||||
|
||||
$oIssuetrackerModel = &getModel('issuetracker');
|
||||
$package_list = $oIssuetrackerModel->getPackageList($module_srl);
|
||||
|
||||
if($package_srl) {
|
||||
$release_list = $oIssuetrackerModel->getReleaseList($package_srl);
|
||||
if($release_list) $package_list[$package_srl]->releases = $release_list;
|
||||
}
|
||||
|
||||
Context::set('package_list', $package_list);
|
||||
|
||||
$this->setTemplateFile('release_setting');
|
||||
}
|
||||
|
||||
function dispIssuetrackerAdminProjectInfo() {
|
||||
|
||||
// module_srl 값이 없다면 그냥 index 페이지를 보여줌
|
||||
if(!Context::get('module_srl')) return $this->dispIssuetrackerAdminContent();
|
||||
|
||||
// 레이아웃이 정해져 있다면 레이아웃 정보를 추가해줌(layout_title, layout)
|
||||
if($this->module_info->layout_srl) {
|
||||
$oLayoutModel = &getModel('layout');
|
||||
$layout_info = $oLayoutModel->getLayout($this->module_info->layout_srl);
|
||||
$this->module_info->layout = $layout_info->layout;
|
||||
$this->module_info->layout_title = $layout_info->layout_title;
|
||||
}
|
||||
|
||||
// 정해진 스킨이 있으면 해당 스킨의 정보를 구함
|
||||
if($this->module_info->skin) {
|
||||
$oModuleModel = &getModel('module');
|
||||
$skin_info = $oModuleModel->loadSkinInfo($this->module_path, $this->module_info->skin);
|
||||
$this->module_info->skin_title = $skin_info->title;
|
||||
}
|
||||
|
||||
// 템플릿 파일 지정
|
||||
$this->setTemplateFile('project_info');
|
||||
}
|
||||
|
||||
function dispIssuetrackerAdminAdditionSetup() {
|
||||
$content = '';
|
||||
|
||||
// 추가 설정을 위한 트리거 호출
|
||||
// 이슈트래커 모듈이지만 차후 다른 모듈에서의 사용도 고려하여 trigger 이름을 공용으로 사용할 수 있도록 하였음
|
||||
$output = ModuleHandler::triggerCall('module.dispAdditionSetup', 'before', $content);
|
||||
$output = ModuleHandler::triggerCall('module.dispAdditionSetup', 'after', $content);
|
||||
Context::set('setup_content', $content);
|
||||
|
||||
// 템플릿 파일 지정
|
||||
$this->setTemplateFile('addition_setup');
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 권한 목록 출력
|
||||
**/
|
||||
function dispIssuetrackerAdminGrantInfo() {
|
||||
// module_srl을 구함
|
||||
$module_srl = Context::get('module_srl');
|
||||
|
||||
// module.xml에서 권한 관련 목록을 구해옴
|
||||
$grant_list = $this->xml_info->grant;
|
||||
Context::set('grant_list', $grant_list);
|
||||
|
||||
// 권한 그룹의 목록을 가져온다
|
||||
$oMemberModel = &getModel('member');
|
||||
$group_list = $oMemberModel->getGroups();
|
||||
Context::set('group_list', $group_list);
|
||||
|
||||
$this->setTemplateFile('grant_list');
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 스킨 정보 보여줌
|
||||
**/
|
||||
function dispIssuetrackerAdminSkinInfo() {
|
||||
|
||||
// 현재 선택된 모듈의 스킨의 정보 xml 파일을 읽음
|
||||
$module_info = Context::get('module_info');
|
||||
$skin = $module_info->skin;
|
||||
|
||||
$oModuleModel = &getModel('module');
|
||||
$skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin);
|
||||
|
||||
// skin_info에 extra_vars 값을 지정
|
||||
if(count($skin_info->extra_vars)) {
|
||||
foreach($skin_info->extra_vars as $key => $val) {
|
||||
$group = $val->group;
|
||||
$name = $val->name;
|
||||
$type = $val->type;
|
||||
$value = $module_info->{$name};
|
||||
if($type=="checkbox"&&!$value) $value = array();
|
||||
$skin_info->extra_vars[$key]->value= $value;
|
||||
}
|
||||
}
|
||||
|
||||
Context::set('skin_info', $skin_info);
|
||||
$this->setTemplateFile('skin_info');
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 이슈트래커 삭제 화면 출력
|
||||
**/
|
||||
function dispIssuetrackerAdminDeleteIssuetracker() {
|
||||
|
||||
if(!Context::get('module_srl')) return $this->dispIssuetrackerAdminContent();
|
||||
|
||||
$module_info = Context::get('module_info');
|
||||
|
||||
$oDocumentModel = &getModel('document');
|
||||
$document_count = $oDocumentModel->getDocumentCount($module_info->module_srl);
|
||||
$module_info->document_count = $document_count;
|
||||
|
||||
Context::set('module_info',$module_info);
|
||||
|
||||
// 템플릿 파일 지정
|
||||
$this->setTemplateFile('issuetracker_delete');
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
57
modules/issuetracker/issuetracker.class.php
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
<?PHP
|
||||
/**
|
||||
* @class issuetracker
|
||||
* @author haneul (haneul0318@gmail.com)
|
||||
* @brief base class for the issue tracker
|
||||
**/
|
||||
|
||||
require_once(_XE_PATH_.'modules/issuetracker/issuetracker.item.php');
|
||||
|
||||
class issuetracker extends ModuleObject
|
||||
{
|
||||
// 검색 대상 지정
|
||||
var $search_option = array('title','content','title_content','user_name','nick_name','user_id','tag');
|
||||
|
||||
// 이슈 목록 노출 대상
|
||||
var $display_option = array('no','title','milestone','priority','type','component','status','occured_version','package','regdate','assignee', 'writer');
|
||||
var $default_enable = array('no','title','status','release','regdate','assignee','writer');
|
||||
|
||||
function moduleInstall()
|
||||
{
|
||||
// action forward에 등록 (관리자 모드에서 사용하기 위함)
|
||||
$oModuleController = &getController('module');
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerViewMilestone');
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerViewSource');
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerViewIssue');
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerNewIssue');
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerDeleteIssue');
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerDeleteTrackback');
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerDownload');
|
||||
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerAdminContent');
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerAdminProjectSetting');
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerAdminReleaseSetting');
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerAdminAdditionSetup');
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerAdminGrantInfo');
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerAdminSkinInfo');
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerAdminInsertProject');
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerAdminDeleteIssuetracker');
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerAdminProjectInfo');
|
||||
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerAdminModifyMilestone');
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerAdminModifyPriority');
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerAdminModifyType');
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerAdminModifyComponent');
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerAdminModifyPackage');
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerAdminModifyRelease');
|
||||
$oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerAdminAttachRelease');
|
||||
|
||||
$oModuleController->insertActionForward('issuetracker', 'controller', 'procIssuetrackerAdminAttachRelease');
|
||||
}
|
||||
|
||||
function checkUpdate()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
?>
|
||||
371
modules/issuetracker/issuetracker.controller.php
Normal file
|
|
@ -0,0 +1,371 @@
|
|||
<?php
|
||||
/**
|
||||
* @class issuetrackerController
|
||||
* @author zero (zero@nzeo.com)
|
||||
* @brief issuetracker 모듈의 Controller class
|
||||
**/
|
||||
|
||||
class issuetrackerController extends issuetracker {
|
||||
|
||||
/**
|
||||
* @brief 초기화
|
||||
**/
|
||||
function init() {
|
||||
}
|
||||
|
||||
function procIssuetrackerInsertIssue() {
|
||||
// 권한 체크
|
||||
if(!$this->grant->ticket_write) return new Object(-1, 'msg_not_permitted');
|
||||
|
||||
// 글작성시 필요한 변수를 세팅
|
||||
$obj = Context::getRequestVars();
|
||||
$obj->module_srl = $this->module_srl;
|
||||
|
||||
if(!$obj->title) $obj->title = cut_str(strip_tags($obj->content),20,'...');
|
||||
|
||||
// 관리자가 아니라면 게시글 색상/굵기 제거
|
||||
if(!$this->grant->manager) {
|
||||
unset($obj->title_color);
|
||||
unset($obj->title_bold);
|
||||
}
|
||||
|
||||
if($obj->occured_version_srl == 0)
|
||||
{
|
||||
unset($obj->occured_version_srl);
|
||||
}
|
||||
|
||||
// document module의 model 객체 생성
|
||||
$oDocumentModel = &getModel('document');
|
||||
|
||||
// document module의 controller 객체 생성
|
||||
$oDocumentController = &getController('document');
|
||||
|
||||
// 이미 존재하는 글인지 체크
|
||||
$oDocument = $oDocumentModel->getDocument($obj->document_srl, $this->grant->manager);
|
||||
|
||||
// 이미 존재하는 경우 수정
|
||||
if($oDocument->isExists() && $oDocument->document_srl == $obj->document_srl) {
|
||||
$output = $oDocumentController->updateDocument($oDocument, $obj);
|
||||
$msg_code = 'success_updated';
|
||||
|
||||
if(!$output->toBool()) return $output;
|
||||
|
||||
// 그렇지 않으면 신규 등록
|
||||
} else {
|
||||
// transaction start
|
||||
$oDB = &DB::getInstance();
|
||||
$oDB->begin();
|
||||
|
||||
$output = executeQuery("issuetracker.insertIssue", $obj);
|
||||
if(!$output->toBool()) return $output;
|
||||
|
||||
$output = $oDocumentController->insertDocument($obj);
|
||||
$msg_code = 'success_registed';
|
||||
$obj->document_srl = $output->get('document_srl');
|
||||
|
||||
if(!$output->toBool()) {
|
||||
$oDB->rollback();
|
||||
return $output;
|
||||
}
|
||||
|
||||
$oDB->commit();
|
||||
|
||||
// 문제가 없고 모듈 설정에 관리자 메일이 등록되어 있으면 메일 발송
|
||||
if($output->toBool() && $this->module_info->admin_mail) {
|
||||
$oMail = new Mail();
|
||||
$oMail->setTitle($obj->title);
|
||||
$oMail->setContent( sprintf("From : <a href=\"%s\">%s</a><br/>\r\n%s", getUrl('','document_srl',$obj->document_srl), getUrl('','document_srl',$obj->document_srl), $obj->content));
|
||||
$oMail->setSender($obj->user_name, $obj->email_address);
|
||||
|
||||
$target_mail = explode(',',$this->module_info->admin_mail);
|
||||
for($i=0;$i<count($target_mail);$i++) {
|
||||
$email_address = trim($target_mail[$i]);
|
||||
if(!$email_address) continue;
|
||||
$oMail->setReceiptor($email_address, $email_address);
|
||||
$oMail->send();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 오류 발생시 멈춤
|
||||
if(!$output->toBool()) return $output;
|
||||
|
||||
// 결과를 리턴
|
||||
$this->add('mid', Context::get('mid'));
|
||||
$this->add('document_srl', $output->get('document_srl'));
|
||||
|
||||
// 성공 메세지 등록
|
||||
$this->setMessage($msg_code);
|
||||
}
|
||||
|
||||
function procIssuetrackerDeleteIssue() {
|
||||
// 문서 번호 확인
|
||||
$document_srl = Context::get('document_srl');
|
||||
|
||||
// 문서 번호가 없다면 오류 발생
|
||||
if(!$document_srl) return $this->doError('msg_invalid_document');
|
||||
|
||||
// document module model 객체 생성
|
||||
$oDocumentController = &getController('document');
|
||||
|
||||
// 삭제 시도
|
||||
$output = $oDocumentController->deleteDocument($document_srl, $this->grant->manager);
|
||||
if(!$output->toBool()) return $output;
|
||||
|
||||
// 이슈 삭제
|
||||
$args->target_srl = $document_srl;
|
||||
$output = executeQuery('issuetracker.deleteIssue', $args);
|
||||
|
||||
// 성공 메세지 등록
|
||||
$this->add('mid', Context::get('mid'));
|
||||
$this->add('page', $output->get('page'));
|
||||
$this->setMessage('success_deleted');
|
||||
}
|
||||
|
||||
function procIssuetrackerInsertHistory() {
|
||||
// 권한 체크
|
||||
if(!$this->grant->ticket_write && !$this->grant->commiter) return new Object(-1, 'msg_not_permitted');
|
||||
|
||||
// 원 이슈를 가져옴
|
||||
$target_srl = Context::get('target_srl');
|
||||
$oIssuetrackerModel = &getModel('issuetracker');
|
||||
$oIssue = $oIssuetrackerModel->getIssue($target_srl);
|
||||
if(!$oIssue->isExists()) return new Object(-1,'msg_not_founded');
|
||||
|
||||
// 로그인 정보
|
||||
$logged_info = Context::get('logged_info');
|
||||
|
||||
// 글작성시 필요한 변수를 세팅
|
||||
$args->target_srl = $target_srl;
|
||||
$args->content = Context::get('content');
|
||||
if($logged_info->member_srl) {
|
||||
$args->member_srl = $logged_info->member_srl;
|
||||
$args->nick_name = $logged_info->nick_name;
|
||||
} else {
|
||||
$args->nick_name = Context::get('nick_name');
|
||||
$args->password = md5(Context::get('password'));
|
||||
}
|
||||
|
||||
// 커미터일 경우 각종 상태 변경값을 받아서 이슈의 상태를 변경하고 히스토리 생성
|
||||
if($this->grant->commiter) {
|
||||
$milestone_srl = Context::get('milestone_srl');
|
||||
$priority_srl = Context::get('priority_srl');
|
||||
$type_srl = Context::get('type_srl');
|
||||
$component_srl = Context::get('component_srl');
|
||||
$package_srl = Context::get('package_srl');
|
||||
$occured_version_srl = Context::get('occured_version_srl');
|
||||
$action = Context::get('action');
|
||||
$status = Context::get('status');
|
||||
$assignee_srl = Context::get('assignee_srl');
|
||||
|
||||
$project = $oIssuetrackerModel->getProjectInfo($this->module_srl);
|
||||
$history = array();
|
||||
$change_args = null;
|
||||
|
||||
if($milestone_srl != $oIssue->get('milestone_srl')) {
|
||||
$new_milestone = null;
|
||||
if(count($project->milestones)) {
|
||||
foreach($project->milestones as $val) {
|
||||
if($val->milestone_srl == $milestone_srl) {
|
||||
$new_milestone = $val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($milestone_srl == 0)
|
||||
{
|
||||
$new_milestone->title = "";
|
||||
}
|
||||
|
||||
if($new_milestone) {
|
||||
$history['milestone'] = array($oIssue->getMilestoneTitle(), $new_milestone->title);
|
||||
$change_args->milestone_srl = $milestone_srl;
|
||||
}
|
||||
}
|
||||
|
||||
if($priority_srl != $oIssue->get('priority_srl')) {
|
||||
$new_priority = null;
|
||||
if(count($project->priorities)) {
|
||||
foreach($project->priorities as $val) {
|
||||
if($val->priority_srl == $priority_srl) {
|
||||
$new_priority = $val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($new_priority) {
|
||||
$history['priority'] = array($oIssue->getPriorityTitle(), $new_priority->title);
|
||||
$change_args->priority_srl = $priority_srl;
|
||||
}
|
||||
}
|
||||
|
||||
if($type_srl != $oIssue->get('type_srl')) {
|
||||
$new_type = null;
|
||||
if(count($project->types)) {
|
||||
foreach($project->types as $val) {
|
||||
if($val->type_srl == $type_srl) {
|
||||
$new_type = $val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($new_type) {
|
||||
$history['type'] = array($oIssue->getTypeTitle(), $new_type->title);
|
||||
$change_args->type_srl = $type_srl;
|
||||
}
|
||||
}
|
||||
|
||||
if($component_srl != $oIssue->get('component_srl')) {
|
||||
$new_component = null;
|
||||
if(count($project->components)) {
|
||||
foreach($project->components as $val) {
|
||||
if($val->component_srl == $component_srl) {
|
||||
$new_component = $val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($new_component) {
|
||||
$history['component'] = array($oIssue->getComponentTitle(), $new_component->title);
|
||||
$change_args->component_srl = $component_srl;
|
||||
}
|
||||
}
|
||||
|
||||
if($package_srl != $oIssue->get('package_srl')) {
|
||||
$new_package = null;
|
||||
if(count($project->packages)) {
|
||||
foreach($project->packages as $val) {
|
||||
if($val->package_srl == $package_srl) {
|
||||
$new_package = $val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($new_package) {
|
||||
$history['package'] = array($oIssue->getPackageTitle(), $new_package->title);
|
||||
$change_args->package_srl = $package_srl;
|
||||
}
|
||||
}
|
||||
|
||||
if($occured_version_srl != $oIssue->get('occured_version_srl')) {
|
||||
$new_release = null;
|
||||
if(count($project->releases)) {
|
||||
foreach($project->releases as $val) {
|
||||
if($val->release_srl == $occured_version_srl) {
|
||||
$new_release = $val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($new_release) {
|
||||
$history['occured_version'] = array($oIssue->getReleaseTitle(), $new_release->title);
|
||||
$change_args->occured_version_srl = $occured_version_srl;
|
||||
}
|
||||
}
|
||||
|
||||
$status_lang = Context::getLang('status_list');
|
||||
switch($action) {
|
||||
case 'resolve' :
|
||||
$history['status'] = array($oIssue->getStatus(), $status_lang[$status]);
|
||||
$change_args->status = $status;
|
||||
break;
|
||||
case 'reassign' :
|
||||
$oMemberModel = &getModel('member');
|
||||
$member_info = $oMemberModel->getMemberInfoByMemberSrl($assignee_srl);
|
||||
$history['assignee'] = array($oIssue->get('assignee_srl'), $member_info->nick_name);
|
||||
$change_args->assignee_srl = $assignee_srl;
|
||||
$change_args->assignee_name = $member_info->nick_name;
|
||||
|
||||
if($oIssue->get('status')!='assign') {
|
||||
$change_args->status = 'assign';
|
||||
$history['status'] = array($oIssue->getStatus(), $status_lang[$change_args->status]);
|
||||
$change_args->status = $change_args->status;
|
||||
}
|
||||
break;
|
||||
case 'accept' :
|
||||
$history['assignee'] = array($oIssue->get('assignee_name'), $logged_info->nick_name);
|
||||
$change_args->assignee_srl = $logged_info->member_srl;
|
||||
$change_args->assignee_name = $logged_info->nick_name;
|
||||
|
||||
$change_args->status = 'assign';
|
||||
$history['status'] = array($oIssue->getStatus(), $status_lang[$change_args->status]);
|
||||
$change_args->status = $change_args->status;
|
||||
break;
|
||||
}
|
||||
|
||||
if($change_args!==null) {
|
||||
|
||||
$change_args->target_srl = $target_srl;
|
||||
$output = executeQueryArray('issuetracker.updateIssue', $change_args);
|
||||
if(!$output->toBool()) return $output;
|
||||
$args->history = serialize($history);
|
||||
}
|
||||
}
|
||||
$args->issues_history_srl = getNextSequence();
|
||||
$args->module_srl = $this->module_srl;
|
||||
|
||||
$output = executeQueryArray('issuetracker.insertHistory', $args);
|
||||
if(!$output->toBool()) return $output;
|
||||
|
||||
// 전체 댓글 개수를 구함
|
||||
$cnt = $oIssuetrackerModel->getHistoryCount($target_srl);
|
||||
$oDocumentController = &getController('document');
|
||||
$oDocumentController->updateCommentCount($target_srl, $cnt, $logged_info->member_srl);
|
||||
|
||||
$this->add('document_srl', $target_srl);
|
||||
$this->add('mid', $this->module_info->mid);
|
||||
}
|
||||
|
||||
function procIssuetrackerVerificationPassword() {
|
||||
// 비밀번호와 문서 번호를 받음
|
||||
$password = Context::get('password');
|
||||
$document_srl = Context::get('document_srl');
|
||||
$comment_srl = Context::get('comment_srl');
|
||||
|
||||
$oMemberModel = &getModel('member');
|
||||
|
||||
// comment_srl이 있을 경우 댓글이 대상
|
||||
if($comment_srl) {
|
||||
// 문서번호에 해당하는 글이 있는지 확인
|
||||
$oCommentModel = &getModel('comment');
|
||||
$oComment = $oCommentModel->getComment($comment_srl);
|
||||
if(!$oComment->isExists()) return new Object(-1, 'msg_invalid_request');
|
||||
|
||||
// 문서의 비밀번호와 입력한 비밀번호의 비교
|
||||
if(!$oMemberModel->isValidPassword($oComment->get('password'),$password)) return new Object(-1, 'msg_invalid_password');
|
||||
|
||||
$oComment->setGrant();
|
||||
} else {
|
||||
// 문서번호에 해당하는 글이 있는지 확인
|
||||
$oDocumentModel = &getModel('document');
|
||||
$oDocument = $oDocumentModel->getDocument($document_srl);
|
||||
if(!$oDocument->isExists()) return new Object(-1, 'msg_invalid_request');
|
||||
|
||||
// 문서의 비밀번호와 입력한 비밀번호의 비교
|
||||
if(!$oMemberModel->isValidPassword($oDocument->get('password'),$password)) return new Object(-1, 'msg_invalid_password');
|
||||
|
||||
$oDocument->setGrant();
|
||||
}
|
||||
}
|
||||
|
||||
function procIssuetrackerDeleteTrackback() {
|
||||
$trackback_srl = Context::get('trackback_srl');
|
||||
|
||||
// trackback module의 controller 객체 생성
|
||||
$oTrackbackController = &getController('trackback');
|
||||
$output = $oTrackbackController->deleteTrackback($trackback_srl, $this->grant->manager);
|
||||
if(!$output->toBool()) return $output;
|
||||
|
||||
$this->add('mid', Context::get('mid'));
|
||||
$this->add('document_srl', $output->get('document_srl'));
|
||||
$this->setMessage('success_deleted');
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
144
modules/issuetracker/issuetracker.item.php
Normal file
|
|
@ -0,0 +1,144 @@
|
|||
<?php
|
||||
|
||||
require_once("./modules/document/document.item.php");
|
||||
|
||||
class issueItem extends documentItem {
|
||||
|
||||
var $milestone = null;
|
||||
var $priority = null;
|
||||
var $type = null;
|
||||
var $status = null;
|
||||
var $component = null;
|
||||
var $occured_version = null;
|
||||
|
||||
function issueItem($document_srl = 0) {
|
||||
parent::documentItem($document_srl);
|
||||
}
|
||||
|
||||
function setIssue($document_srl) {
|
||||
$this->document_srl = $document_srl;
|
||||
$this->_loadFromDB();
|
||||
}
|
||||
|
||||
function setProjectInfo($variables) {
|
||||
$this->adds($variables);
|
||||
|
||||
$oIssuetrackerModel = &getModel('issuetracker');
|
||||
$project = &$oIssuetrackerModel->getProjectInfo($this->get('module_srl'));
|
||||
|
||||
if($this->get('milestone_srl') && count($project->milestones)) {
|
||||
foreach($project->milestones as $val) {
|
||||
if($this->get('milestone_srl')==$val->milestone_srl) {
|
||||
$this->milestone = $val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($this->get('priority_srl') && count($project->priorities)) {
|
||||
foreach($project->priorities as $val) {
|
||||
if($this->get('priority_srl')==$val->priority_srl) {
|
||||
$this->priority = $val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($this->get('type_srl') && count($project->types)) {
|
||||
foreach($project->types as $val) {
|
||||
if($this->get('type_srl')==$val->type_srl) {
|
||||
$this->type = $val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->status = $this->get('status');
|
||||
|
||||
if($this->get('component_srl') && count($project->components)) {
|
||||
foreach($project->components as $val) {
|
||||
if($this->get('component_srl')==$val->component_srl) {
|
||||
$this->component = $val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($this->get('occured_version_srl') && count($project->releases)) {
|
||||
foreach($project->releases as $val) {
|
||||
if($this->get('occured_version_srl')==$val->release_srl) {
|
||||
$this->occured_version = $val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($this->occured_version) {
|
||||
foreach($project->packages as $val) {
|
||||
if($this->occured_version->package_srl==$val->package_srl) {
|
||||
$this->package = $val;
|
||||
$this->add('package_srl', $val->package_srl);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function _loadFromDB() {
|
||||
if(!$this->document_srl) return;
|
||||
parent::_loadFromDB();
|
||||
|
||||
$obj->target_srl = $this->document_srl;
|
||||
$output = executeQuery("issuetracker.getIssue", $obj);
|
||||
if(!$output->toBool()) return;
|
||||
|
||||
$this->setProjectInfo($output->data);
|
||||
}
|
||||
|
||||
function getMilestoneTitle() {
|
||||
if($this->milestone) return $this->milestone->title;
|
||||
}
|
||||
|
||||
function getTypeTitle() {
|
||||
if($this->type) return $this->type->title;
|
||||
}
|
||||
|
||||
function getPriorityTitle() {
|
||||
if($this->priority) return $this->priority->title;
|
||||
}
|
||||
|
||||
function getComponentTitle() {
|
||||
if($this->component) return $this->component->title;
|
||||
}
|
||||
|
||||
function getResolutionTitle() {
|
||||
if($this->resolution) return $this->resolution->title;
|
||||
}
|
||||
|
||||
function getStatus() {
|
||||
$status_lang = Context::getLang('status_list');
|
||||
return $status_lang[$this->status];
|
||||
}
|
||||
|
||||
function getOccuredVersionTitle() {
|
||||
if($this->occured_version) return $this->occured_version->title;
|
||||
}
|
||||
|
||||
function getReleaseTitle() {
|
||||
return $this->getOccuredVersionTitle();
|
||||
}
|
||||
|
||||
function getPackageTitle() {
|
||||
if($this->package) return $this->package->title;
|
||||
}
|
||||
|
||||
function getContent() {
|
||||
$content = parent::getContent();
|
||||
preg_match_all('/r([0-9]+)/',$content, $mat);
|
||||
for($k=0;$k<count($mat[1]);$k++) {
|
||||
$content = str_replace('r'.$mat[1][$k], sprintf('<a href="%s" onclick="window.open(this.href); return false;">%s</a>',getUrl('','mid',Context::get('mid'),'act','dispIssuetrackerViewSource','type','compare','erev',$mat[1][$k],'brev',''), 'r'.$mat[1][$k]), $content);
|
||||
}
|
||||
return $content;
|
||||
}
|
||||
}
|
||||
?>
|
||||
350
modules/issuetracker/issuetracker.model.php
Normal file
|
|
@ -0,0 +1,350 @@
|
|||
<?php
|
||||
/**
|
||||
* @class issuetrackerModel
|
||||
* @author haneul (zero@nzeo.com)
|
||||
* @brief issuetracker 모듈의 model class
|
||||
**/
|
||||
|
||||
require_once(_XE_PATH_.'modules/issuetracker/issuetracker.item.php');
|
||||
|
||||
class issuetrackerModel extends issuetracker {
|
||||
|
||||
function init()
|
||||
{
|
||||
}
|
||||
|
||||
function &getProjectInfo($module_srl) {
|
||||
static $projectInfo = array();
|
||||
if(!isset($projectInfo[$module_srl])) {
|
||||
$projectInfo[$module_srl]->milestones = $this->getList($module_srl, 'Milestones');
|
||||
$projectInfo[$module_srl]->priorities = $this->getList($module_srl, 'Priorities');
|
||||
$projectInfo[$module_srl]->types = $this->getList($module_srl, 'Types');
|
||||
$projectInfo[$module_srl]->components = $this->getList($module_srl, 'Components');
|
||||
$projectInfo[$module_srl]->packages = $this->getList($module_srl, 'Packages');
|
||||
$projectInfo[$module_srl]->releases = $this->getModuleReleases($module_srl);
|
||||
}
|
||||
return $projectInfo[$module_srl];
|
||||
}
|
||||
|
||||
function getIssue($document_srl=0, $is_admin = false) {
|
||||
if(!$document_srl) return new issueItem();
|
||||
|
||||
if(!$GLOBALS['__IssueItem__'][$document_srl]) {
|
||||
$oIssue = new issueItem($document_srl);
|
||||
if($is_admin) $oIssue->setGrant();
|
||||
$GLOBALS['__IssueItem__'][$document_srl] = $oIssue;
|
||||
}
|
||||
|
||||
return $GLOBALS['__IssueItem__'][$document_srl];
|
||||
}
|
||||
|
||||
function getIssuesCount($target, $value, $status = null) {
|
||||
$args->{$target} = $value;
|
||||
if($status !== null) $args->status = $status;
|
||||
$output = executeQuery('issuetracker.getIssuesCount', $args);
|
||||
if(!$output->toBool() || !$output->data) return -1;
|
||||
return $output->data->count;
|
||||
}
|
||||
|
||||
function getHistoryCount($target_srl) {
|
||||
$args->target_srl = $target_srl;
|
||||
$output = executeQuery('issuetracker.getHistoryCount', $args);
|
||||
if(!$output->toBool() || !$output->data) return 0;
|
||||
return $output->data->count;
|
||||
}
|
||||
|
||||
function getIssueList($args) {
|
||||
// 기본으로 사용할 query id 지정 (몇가지 검색 옵션에 따라 query id가 변경됨)
|
||||
$query_id = 'issuetracker.getIssueList';
|
||||
|
||||
// 검색 옵션 정리
|
||||
if($args->search_target && $args->search_keyword) {
|
||||
switch($args->search_target) {
|
||||
case 'title' :
|
||||
case 'content' :
|
||||
if($args->search_keyword) $args->search_keyword = str_replace(' ','%',$args->search_keyword);
|
||||
$args->{"s_".$args->search_target} = $args->search_keyword;
|
||||
break;
|
||||
case 'title_content' :
|
||||
if($args->search_keyword) $args->search_keyword = str_replace(' ','%',$args->search_keyword);
|
||||
$args->s_title = $args->search_keyword;
|
||||
$args->s_content = $args->search_keyword;
|
||||
break;
|
||||
case 'user_id' :
|
||||
if($args->search_keyword) $args->search_keyword = str_replace(' ','%',$args->search_keyword);
|
||||
$args->s_user_id = $args->search_keyword;
|
||||
break;
|
||||
case 'user_name' :
|
||||
case 'nick_name' :
|
||||
case 'member_srl' :
|
||||
$args->{"s_".$args->search_target} = (int)$args->search_keyword;
|
||||
break;
|
||||
case 'tag' :
|
||||
$args->s_tags = str_replace(' ','%',$args->search_keyword);
|
||||
$query_id = 'issuetracker.getIssueListWithinTag';
|
||||
break;
|
||||
default :
|
||||
preg_match('/^extra_vars([0-9]+)$/',$args->search_target,$matches);
|
||||
if($matches[1]) $args->{"s_extra_vars".$matches[1]} = $args->search_keyword;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(in_array($query_id, array('issuetracker.getIssueListWithinTag'))) {
|
||||
$group_args = clone($args);
|
||||
$group_output = executeQueryArray($query_id, $group_args);
|
||||
if(!$group_output->toBool()||!count($group_output->data)) return $output;
|
||||
|
||||
foreach($group_output->data as $key => $val) {
|
||||
if($val->document_srl) {
|
||||
$target_srls[$key] = $val->document_srl;
|
||||
$order_srls[$val->document_srl] = $key;
|
||||
}
|
||||
}
|
||||
|
||||
$target_args->target_srl = implode(',',$target_srls);
|
||||
$output = executeQueryArray('issuetracker.getIssues', $target_args);
|
||||
if($output->toBool() && count($output->data)) {
|
||||
$data = $output->data;
|
||||
$output->data = array();
|
||||
foreach($data as $key => $val) {
|
||||
$output->data[$order_srls[$val->document_srl]] = $val;
|
||||
}
|
||||
$output->total_count = $group_output->data->total_count;
|
||||
$output->total_page = $group_output->data->total_page;
|
||||
$output->page = $group_output->data->page;
|
||||
}
|
||||
} else {
|
||||
$output = executeQueryArray($query_id, $args);
|
||||
}
|
||||
|
||||
// 결과가 없거나 오류 발생시 그냥 return
|
||||
if(!$output->toBool()||!count($output->data)) return $output;
|
||||
|
||||
$idx = 0;
|
||||
$data = $output->data;
|
||||
unset($output->data);
|
||||
|
||||
$keys = array_keys($data);
|
||||
$virtual_number = $keys[0];
|
||||
|
||||
foreach($data as $key => $attribute) {
|
||||
$document_srl = $attribute->document_srl;
|
||||
$oIssue = null;
|
||||
$oIssue = new issueItem();
|
||||
$oIssue->setAttribute($attribute);
|
||||
$oIssue->setProjectInfo($attribute);
|
||||
if($is_admin) $oIssue->setGrant();
|
||||
|
||||
$output->data[$virtual_number] = $oIssue;
|
||||
$virtual_number --;
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
function getList($module_srl, $listname)
|
||||
{
|
||||
if(!$module_srl) return array();
|
||||
|
||||
$args->module_srl = $module_srl;
|
||||
$output = executeQueryArray("issuetracker.get".$listname, $args);
|
||||
if(!$output->toBool() || !$output->data) return array();
|
||||
return $output->data;
|
||||
}
|
||||
|
||||
function getHistories($target_srl) {
|
||||
$args->target_srl = $target_srl;
|
||||
$output = executeQueryArray('issuetracker.getHistories', $args);
|
||||
$histories = $output->data;
|
||||
$cnt = count($histories);
|
||||
for($i=0;$i<$cnt;$i++) {
|
||||
$history = unserialize($histories[$i]->history);
|
||||
if($history && count($history)) {
|
||||
$h = array();
|
||||
foreach($history as $key => $val) {
|
||||
if($val[0]) $str = Context::getLang('history_format');
|
||||
else $str = Context::getLang('history_format_not_source');
|
||||
$str = str_replace('[source]', $val[0], $str);
|
||||
$str = str_replace('[target]', $val[1], $str);
|
||||
$str = str_replace('[key]', Context::getLang($key), $str);
|
||||
$h[] = $str;
|
||||
}
|
||||
$histories[$i]->history = $h;
|
||||
} else {
|
||||
$histories[$i]->history = null;
|
||||
}
|
||||
|
||||
preg_match_all('/r([0-9]+)/',$histories[$i]->content, $mat);
|
||||
for($k=0;$k<count($mat[1]);$k++) {
|
||||
$histories[$i]->content = str_replace('r'.$mat[1][$k], sprintf('<a href="%s" onclick="window.open(this.href); return false;">%s</a>',getUrl('','mid',Context::get('mid'),'act','dispIssuetrackerViewSource','type','compare','erev',$mat[1][$k],'brev',''), 'r'.$mat[1][$k]), $histories[$i]->content);
|
||||
}
|
||||
}
|
||||
return $histories;
|
||||
}
|
||||
|
||||
function getPackageList($module_srl, $package_srl=0, $each_releases_count = 0)
|
||||
{
|
||||
if(!$module_srl) return array();
|
||||
|
||||
if(!$package_srl) {
|
||||
$args->module_srl = $module_srl;
|
||||
$output = executeQueryArray("issuetracker.getPackages", $args);
|
||||
} else {
|
||||
$args->package_srl = $package_srl;
|
||||
$output = executeQueryArray("issuetracker.getPackages", $args);
|
||||
}
|
||||
if(!$output->toBool() || !$output->data) return array();
|
||||
|
||||
$packages = array();
|
||||
foreach($output->data as $package) {
|
||||
$package->release_count = $this->getReleaseCount($package->package_srl);
|
||||
$package->releases = $this->getReleaseList($package->package_srl, $each_releases_count);
|
||||
$packages[$package->package_srl] = $package;
|
||||
}
|
||||
|
||||
return $packages;
|
||||
}
|
||||
|
||||
function getReleaseCount($package_srl) {
|
||||
if(!$package_srl) return 0;
|
||||
|
||||
$args->package_srl = $package_srl;
|
||||
$output = executeQuery("issuetracker.getReleaseCount", $args);
|
||||
return $output->data->count;
|
||||
}
|
||||
|
||||
function getModuleReleases($module_srl) {
|
||||
if(!$module_srl) return array();
|
||||
|
||||
$args->module_srl = $module_srl;
|
||||
$output = executeQueryArray("issuetracker.getReleases", $args);
|
||||
if(!$output->toBool() || !$output->data) return array();
|
||||
return $output->data;
|
||||
}
|
||||
|
||||
function getReleasesWithPackageTitle($module_srl) {
|
||||
if(!$module_srl) return array();
|
||||
$args->module_srl = $module_srl;
|
||||
$output = executeQueryArray("issuetracker.getReleasesWithPackage", $args);
|
||||
if(!$output->toBool() || !$output->data) return array();
|
||||
return $output->data;
|
||||
}
|
||||
|
||||
function getReleaseList($package_srl, $list_count =0) {
|
||||
if(!$package_srl) return array();
|
||||
|
||||
$args->package_srl = $package_srl;
|
||||
|
||||
if($list_count ) {
|
||||
$args->list_count = $list_count;
|
||||
$output = executeQueryArray("issuetracker.getReleaseList", $args);
|
||||
} else {
|
||||
$output = executeQueryArray("issuetracker.getReleases", $args);
|
||||
}
|
||||
if(!$output->toBool() || !$output->data) return array();
|
||||
|
||||
$list = $output->data;
|
||||
$output = array();
|
||||
$oFileModel = &getModel('file');
|
||||
foreach($list as $release) {
|
||||
$files = $oFileModel->getFiles($release->release_srl);
|
||||
$release->files = $files;
|
||||
$output[$release->release_srl] = $release;
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
|
||||
function getPriorityCount($module_srl)
|
||||
{
|
||||
if(!$module_srl) return -1;
|
||||
$args->module_srl = $module_srl;
|
||||
$output = executeQuery("issuetracker.getPriorityCount", $args);
|
||||
if(!$output->toBool()) return -1;
|
||||
else return $output->data->count;
|
||||
}
|
||||
|
||||
function getPriorityMaxListorder($module_srl)
|
||||
{
|
||||
if(!$module_srl) return -1;
|
||||
$args->module_srl = $module_srl;
|
||||
$output = executeQuery("issuetracker.getPriorityMaxListorder", $args);
|
||||
if(!$output->toBool()) return -1;
|
||||
else return $output->data->count;
|
||||
}
|
||||
|
||||
function getMilestone($milestone_srl)
|
||||
{
|
||||
$args->milestone_srl = $milestone_srl;
|
||||
$output = executeQuery("issuetracker.getMilestone", $args);
|
||||
return $output;
|
||||
}
|
||||
|
||||
function getCompletedMilestone($module_srl)
|
||||
{
|
||||
$args->module_srl = $module_srl;
|
||||
$args->is_completed = 'Y';
|
||||
$output = executeQueryArray("issuetracker.getMilestones", $args);
|
||||
if(!$output->toBool())
|
||||
{
|
||||
return array();
|
||||
}
|
||||
|
||||
if(!$output->data)
|
||||
{
|
||||
return array();
|
||||
}
|
||||
return $output->data;
|
||||
}
|
||||
|
||||
function getPriority($priority_srl)
|
||||
{
|
||||
$args->priority_srl = $priority_srl;
|
||||
$output = executeQuery("issuetracker.getPriority", $args);
|
||||
return $output;
|
||||
}
|
||||
|
||||
function getType($type_srl)
|
||||
{
|
||||
$args->type_srl = $type_srl;
|
||||
$output = executeQuery("issuetracker.getType", $args);
|
||||
return $output;
|
||||
}
|
||||
|
||||
function getComponent($component_srl)
|
||||
{
|
||||
$args->component_srl = $component_srl;
|
||||
$output = executeQuery("issuetracker.getComponent", $args);
|
||||
return $output;
|
||||
}
|
||||
|
||||
function getPackage($package_srl)
|
||||
{
|
||||
$args->package_srl = $package_srl;
|
||||
$output = executeQuery("issuetracker.getPackage", $args);
|
||||
if(!$output->toBool()||!$output->data) return;
|
||||
return $output->data;
|
||||
}
|
||||
|
||||
function getRelease($release_srl)
|
||||
{
|
||||
$args->release_srl = $release_srl;
|
||||
$output = executeQuery("issuetracker.getRelease", $args);
|
||||
if(!$output->toBool()||!$output->data) return;
|
||||
$release = $output->data;
|
||||
$oFileModel = &getModel('file');
|
||||
$files = $oFileModel->getFiles($release->release_srl);
|
||||
if($files) $release->files = $files;
|
||||
return $release;
|
||||
}
|
||||
|
||||
function getGroupMembers($group_srls) {
|
||||
if(!$group_srls) return;
|
||||
if(!is_array($group_srls)) $group_srls = array($group_srls);
|
||||
|
||||
$args->group_srls = implode(',',$group_srls);
|
||||
$output = executeQueryArray('issuetracker.getGroupMembers', $args);
|
||||
return $output->data;
|
||||
}
|
||||
}
|
||||
?>
|
||||
409
modules/issuetracker/issuetracker.view.php
Normal file
|
|
@ -0,0 +1,409 @@
|
|||
<?php
|
||||
/**
|
||||
* @class issuetrackerView
|
||||
* @author zero (zero@nzeo.com)
|
||||
* @brief issuetracker 모듈의 View class
|
||||
**/
|
||||
|
||||
|
||||
class issuetrackerView extends issuetracker {
|
||||
|
||||
/**
|
||||
* @brief 초기화
|
||||
*
|
||||
* issuetracker 모듈은 일반 사용과 관리자용으로 나누어진다.\n
|
||||
**/
|
||||
function init() {
|
||||
/**
|
||||
* 스킨등에서 사용될 module_srl이나 module_info등을 context set
|
||||
**/
|
||||
// 템플릿에서 사용할 변수를 Context::set()
|
||||
if($this->module_srl) Context::set('module_srl',$this->module_srl);
|
||||
|
||||
// 현재 호출된 게시판의 모듈 정보를 module_info 라는 이름으로 context setting
|
||||
Context::set('module_info',$this->module_info);
|
||||
|
||||
/**
|
||||
* 스킨 경로를 미리 template_path 라는 변수로 설정함
|
||||
**/
|
||||
$template_path = sprintf("%sskins/%s/",$this->module_path, $this->module_info->skin);
|
||||
|
||||
// 만약 스킨 경로가 없다면 xe_issuetracker로 변경
|
||||
if(!is_dir($template_path)) {
|
||||
$this->module_info->skin = 'xe_issuetracker';
|
||||
$template_path = sprintf("%sskins/%s/",$this->module_path, $this->module_info->skin);
|
||||
}
|
||||
|
||||
$this->setTemplatePath($template_path);
|
||||
|
||||
// 권한에 따른 메뉴 제한
|
||||
if(!$this->grant->manager) unset($GLOBALS['lang']->project_menus['dispIssuetrackerAdminProjectSetting']);
|
||||
|
||||
// 템플릿에서 사용할 검색옵션 세팅 (검색옵션 key값은 미리 선언되어 있는데 이에 대한 언어별 변경을 함)
|
||||
$search_option = array();
|
||||
foreach($this->search_option as $opt) {
|
||||
$search_option[$opt] = Context::getLang($opt);
|
||||
}
|
||||
|
||||
// 모듈정보를 확인하여 확장변수에서도 검색이 설정되어 있는지 확인
|
||||
for($i=1;$i<=20;$i++) {
|
||||
$ex_name = trim($this->module_info->extra_vars[$i]->name);
|
||||
if(!$ex_name) continue;
|
||||
|
||||
if($this->module_info->extra_vars[$i]->search == 'Y') $search_option['extra_vars'.$i] = $ex_name;
|
||||
}
|
||||
Context::set('search_option', $search_option);
|
||||
|
||||
// 템플릿에서 사용할 노출옵션 세팅
|
||||
foreach($this->display_option as $opt) {
|
||||
$obj = null;
|
||||
$obj->title = Context::getLang($opt);
|
||||
$checked = Context::get('d_'.$opt);
|
||||
if($opt == 'title' || $checked==1 || (Context::get('d')!=1&&in_array($opt,$this->default_enable))) $obj->checked = true;
|
||||
$display_option[$opt] = $obj;
|
||||
}
|
||||
Context::set('display_option', $display_option);
|
||||
|
||||
if(!Context::get('act')) Context::set('act','dispIssuetrackerViewIssue');
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 마일스톤과 그에 따른 통계 제공
|
||||
**/
|
||||
function dispIssuetrackerViewMilestone() {
|
||||
// 접근 권한 체크
|
||||
if(!$this->grant->access) return $this->dispIssuetrackerMessage('msg_not_permitted');
|
||||
|
||||
$oIssuetrackerModel = &getModel('issuetracker');
|
||||
$output = $oIssuetrackerModel->getList($this->module_info->module_srl, 'Milestones');
|
||||
|
||||
$milestones = array();
|
||||
$notassigned = null;
|
||||
$notassigned->milestone_srl = 0;
|
||||
$notassigned->is_completed = "N";
|
||||
array_unshift($output, $notassigned);
|
||||
|
||||
if($output) {
|
||||
foreach($output as $key => $milestone) {
|
||||
$issues = null;
|
||||
$issues['new'] = $oIssuetrackerModel->getIssuesCount('milestone_srl', $milestone->milestone_srl,'new');
|
||||
$issues['reviewing'] = $oIssuetrackerModel->getIssuesCount('milestone_srl', $milestone->milestone_srl,'reviewing');
|
||||
$issues['assign'] = $oIssuetrackerModel->getIssuesCount('milestone_srl', $milestone->milestone_srl,'assign');
|
||||
$issues['resolve'] = $oIssuetrackerModel->getIssuesCount('milestone_srl', $milestone->milestone_srl,'resolve');
|
||||
$issues['reopen'] = $oIssuetrackerModel->getIssuesCount('milestone_srl', $milestone->milestone_srl,'reopen');
|
||||
$issues['postponed'] = $oIssuetrackerModel->getIssuesCount('milestone_srl', $milestone->milestone_srl,'postponed');
|
||||
$issues['invalid'] = $oIssuetrackerModel->getIssuesCount('milestone_srl', $milestone->milestone_srl,'invalid');
|
||||
$issues['total'] = $issues['new']+$issues['assign']+$issues['resolve']+$issues['reopen']+$issues['reviewing'];
|
||||
$milestone->issues = $issues;
|
||||
$milestones[$milestone->milestone_srl] = $milestone;
|
||||
|
||||
}
|
||||
}
|
||||
Context::set('milestones',$milestones);
|
||||
|
||||
// 프로젝트 메인 페이지 출력
|
||||
$this->setTemplateFile('milestone');
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 소스 브라우징
|
||||
**/
|
||||
function dispIssuetrackerViewSource() {
|
||||
// 접근 권한 체크
|
||||
if(!$this->grant->browser_source || !$this->module_info->svn_url) return $this->dispIssuetrackerMessage('msg_not_permitted');
|
||||
require_once($this->module_path.'classes/svn.class.php');
|
||||
|
||||
$path = urldecode(Context::get('path'));
|
||||
if(!$path) $path = '/';
|
||||
Context::set('path', $path);
|
||||
|
||||
$revs = Context::get('revs');
|
||||
$erev = Context::get('erev');
|
||||
$brev = Context::get('brev');
|
||||
|
||||
$oSvn = new Svn($this->module_info->svn_url, $this->module_info->svn_cmd, $this->module_info->diff_cmd);
|
||||
$current = $oSvn->getStatus($path);
|
||||
Context::set('current', $current);
|
||||
|
||||
$type = Context::get('type');
|
||||
switch($type) {
|
||||
case 'diff' :
|
||||
$diff = $oSvn->getDiff($path, $brev, $erev);
|
||||
Context::set('diff', $diff);
|
||||
|
||||
$path_tree = Svn::explodePath($path, true);
|
||||
Context::set('path_tree', $path_tree);
|
||||
|
||||
$this->setTemplateFile('source_diff');
|
||||
break;
|
||||
case 'compare' :
|
||||
$comp = $oSvn->getComp($path, $brev, $erev);
|
||||
Context::set('comp', $comp);
|
||||
|
||||
$path_tree = Svn::explodePath($path, true);
|
||||
Context::set('path_tree', $path_tree);
|
||||
|
||||
$this->setTemplateFile('source_compare');
|
||||
break;
|
||||
case 'log' :
|
||||
if(!$erev) $erev = $current->revision;
|
||||
$logs = $oSvn->getLog($path, $erev, $brev, false, 50);
|
||||
Context::set('logs', $logs);
|
||||
|
||||
if(!$erev) $erev = $current->erev;
|
||||
context::set('erev', $erev);
|
||||
context::set('brev', $brev);
|
||||
|
||||
$path_tree = Svn::explodePath($path, true);
|
||||
Context::set('path_tree', $path_tree);
|
||||
|
||||
$this->setTemplateFile('source_log');
|
||||
break;
|
||||
case 'file' :
|
||||
if($revs) $erev = $revs;
|
||||
if(!$erev) $erev = $current->revision;
|
||||
$content = $oSvn->getFileContent($path, $erev);
|
||||
Context::set('content', $content);
|
||||
|
||||
$logs = $oSvn->getLog($path, $erev, $brev, false, 2);
|
||||
$erev = $logs[0]->revision;
|
||||
$brev = $logs[1]->revision;
|
||||
context::set('erev', $erev);
|
||||
context::set('brev', $brev);
|
||||
|
||||
$path_tree = Svn::explodePath($path, true);
|
||||
Context::set('path_tree', $path_tree);
|
||||
|
||||
$this->setTemplateFile('source_file_view');
|
||||
break;
|
||||
|
||||
default :
|
||||
$path_tree = Svn::explodePath($path, false);
|
||||
Context::set('path_tree', $path_tree);
|
||||
|
||||
$list = $oSvn->getList($path, $revs);
|
||||
Context::set('list', $list);
|
||||
$this->setTemplateFile('source_list');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 이슈 목록 및 내용 보기
|
||||
**/
|
||||
function dispIssuetrackerViewIssue() {
|
||||
// 접근 권한 체크
|
||||
if(!$this->grant->ticket_view) return $this->dispIssuetrackerMessage('msg_not_permitted');
|
||||
|
||||
// 프로젝트 관련 정보를 미리 구해서 project 라는 변수로 context setting
|
||||
$oIssuetrackerModel = &getModel('issuetracker');
|
||||
Context::set('project', $oIssuetrackerModel->getProjectInfo($this->module_info->module_srl));
|
||||
|
||||
// 선택된 이슈가 있는지 조사하여 있으면 context setting
|
||||
$document_srl = Context::get('document_srl');
|
||||
$oIssue = $oIssuetrackerModel->getIssue(0);
|
||||
|
||||
if($document_srl) {
|
||||
$oIssue->setIssue($document_srl);
|
||||
|
||||
if(!$oIssue->isExists()) {
|
||||
unset($document_srl);
|
||||
Context::set('document_srl','',true);
|
||||
$this->alertMessage('msg_not_founded');
|
||||
} else {
|
||||
if($oIssue->get('module_srl')!=Context::get('module_srl') ) return $this->stop('msg_invalid_request');
|
||||
if($this->grant->manager) $oIssue->setGrant();
|
||||
if(!$this->grant->ticket_view && !$oIssue->isGranted()) {
|
||||
$oIssue = null;
|
||||
$oIssue = $oIssuetrackerModel->getIssue(0);
|
||||
|
||||
Context::set('document_srl','',true);
|
||||
|
||||
$this->alertMessage('msg_not_permitted');
|
||||
} else {
|
||||
// 브라우저 타이틀에 글의 제목을 추가
|
||||
Context::addBrowserTitle($oIssue->getTitleText());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// issue가 존재하지 않으면 목록 출력을 위한 준비
|
||||
if(!$oIssue->isExists()) {
|
||||
|
||||
$args->module_srl = $this->module_srl;
|
||||
|
||||
// 목록을 구하기 위한 대상 모듈/ 페이지 수/ 목록 수/ 페이지 목록 수에 대한 옵션 설정
|
||||
$args->page = Context::get('page');
|
||||
$args->list_count = 50;
|
||||
$args->page_count = 10;
|
||||
|
||||
// issue 검색을 위한 변수
|
||||
$args->milestone_srl = Context::get('milestone_srl');
|
||||
$args->priority_srl = Context::get('priority_srl');
|
||||
$args->type_srl = Context::get('type_srl');
|
||||
$args->component_srl = Context::get('component_srl');
|
||||
$args->status = Context::get('status');
|
||||
$args->occured_version_srl = Context::get('release_srl');
|
||||
$args->resolution_srl = Context::get('resolution_srl');
|
||||
$args->assignee_srl = Context::get('assignee_srl');
|
||||
$args->member_srl = Context::get('member_srl');
|
||||
|
||||
// status 점검
|
||||
if(!is_array($args->status)||!count($args->status)) {
|
||||
$args->status = array('new','assign','reopen','reviewing');
|
||||
Context::set('status',$args->status);
|
||||
}
|
||||
$args->status = "'".implode("','",$args->status)."'";
|
||||
|
||||
// 키워드 검색을 위한 변수
|
||||
$args->search_target = Context::get('search_target'); ///< 검색 대상 (title, contents...)
|
||||
$args->search_keyword = Context::get('search_keyword'); ///< 검색어
|
||||
|
||||
// 커미터 목록 구함
|
||||
$commiters = $oIssuetrackerModel->getGroupMembers($this->module_info->grants['commiter']);
|
||||
Context::set('commiters', $commiters);
|
||||
|
||||
// 일반 글을 구해서 context set
|
||||
$output = $oIssuetrackerModel->getIssueList($args);
|
||||
Context::set('issue_list', $output->data);
|
||||
Context::set('total_count', $output->total_count);
|
||||
Context::set('total_page', $output->total_page);
|
||||
Context::set('page', $output->page);
|
||||
Context::set('page_navigation', $output->page_navigation);
|
||||
|
||||
// 스킨에서 사용하기 위해 context set
|
||||
Context::set('oIssue', $oIssue);
|
||||
|
||||
$this->setTemplateFile('issue_list');
|
||||
} else {
|
||||
// 히스토리를 가져옴
|
||||
$histories = $oIssuetrackerModel->getHistories($oIssue->get('document_srl'));
|
||||
$oIssue->add('histories', $histories);
|
||||
|
||||
// 스킨에서 사용하기 위해 context set
|
||||
Context::set('oIssue', $oIssue);
|
||||
|
||||
// 커미터 목록을 추출
|
||||
$commiters = $oIssuetrackerModel->getGroupMembers($this->module_info->grants['commiter']);
|
||||
Context::set('commiters', $commiters);
|
||||
|
||||
$this->setTemplateFile('view_issue');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Displaying form to write a issue
|
||||
*/
|
||||
function dispIssuetrackerNewIssue()
|
||||
{
|
||||
if(!$this->grant->ticket_write) return $this->dispIssuetrackerMessage('msg_not_permitted');
|
||||
|
||||
$oIssuetrackerModel = &getModel('issuetracker');
|
||||
$project = $oIssuetrackerModel->getProjectInfo($this->module_info->module_srl);
|
||||
Context::set('project', $project);
|
||||
|
||||
$document_srl = Context::get('document_srl');
|
||||
|
||||
$oIssue = $oIssuetrackerModel->getIssue(0, $this->grant->manager);
|
||||
$oIssue->setIssue($document_srl);
|
||||
|
||||
if(!$oIssue->isExists()) {
|
||||
$document_srl = getNextSequence();
|
||||
Context::set('document_srl',$document_srl);
|
||||
}
|
||||
|
||||
// 글을 수정하려고 할 경우 권한이 없는 경우 비밀번호 입력화면으로
|
||||
if($oIssue->isExists() && !$oIssue->isGranted()) return $this->setTemplateFile('input_password_form');
|
||||
|
||||
Context::set('document_srl',$document_srl);
|
||||
Context::set('oIssue', $oIssue);
|
||||
|
||||
// 확장변수처리를 위해 xml_js_filter를 직접 header에 적용
|
||||
$oDocumentController = &getController('document');
|
||||
$oDocumentController->addXmlJsFilter($this->module_info);
|
||||
|
||||
$this->setTemplateFile('newissue');
|
||||
}
|
||||
|
||||
function dispIssuetrackerDeleteIssue() {
|
||||
if(!$this->grant->ticket_write) return $this->dispIssuetrackerMessage('msg_not_permitted');
|
||||
|
||||
$document_srl = Context::get('document_srl');
|
||||
if(!$document_srl) return $this->dispIssuetrackerMessage('msg_invalid_request');
|
||||
|
||||
$oIssuetrackerModel = &getModel('issuetracker');
|
||||
$oIssue = $oIssuetrackerModel->getIssue(0);
|
||||
|
||||
$oIssue->setIssue($document_srl);
|
||||
|
||||
if(!$oIssue->isExists()) return $this->dispIssuetrackerMessage('msg_invalid_request');
|
||||
if($oIssue->get('module_srl')!=Context::get('module_srl') ) return $this->dispIssuetrackerMessage('msg_invalid_request');
|
||||
|
||||
if($this->grant->manager) $oIssue->setGrant();
|
||||
|
||||
if(!$oIssue->isGranted()) return $this->setTemplateFile('input_password_form');
|
||||
|
||||
Context::set('oIssue', $oIssue);
|
||||
|
||||
$this->setTemplateFile('delete_form');
|
||||
}
|
||||
|
||||
function dispIssuetrackerDownload() {
|
||||
// 접근 권한 체크
|
||||
if(!$this->grant->download) return $this->dispIssuetrackerMessage('msg_not_permitted');
|
||||
|
||||
$package_srl = Context::get('package_srl');
|
||||
$release_srl = Context::get('release_srl');
|
||||
|
||||
$oIssuetrackerModel = &getModel('issuetracker');
|
||||
|
||||
if($release_srl) {
|
||||
$release = $oIssuetrackerModel->getRelease($release_srl);
|
||||
if(!$release) return $this->dispIssuetrackerMessage("msg_invalid_request");
|
||||
Context::set('release', $release);
|
||||
|
||||
$package_srl = $release->package_srl;
|
||||
$package_list = $oIssuetrackerModel->getPackageList($this->module_srl, $package_srl, -1);
|
||||
unset($package_list[$release->package_srl]->releases);
|
||||
$package_list[$release->package_srl]->releases[$release->release_srl] = $release;
|
||||
} else {
|
||||
if(!$package_srl) {
|
||||
$package_list = $oIssuetrackerModel->getPackageList($this->module_srl, 0, 3);
|
||||
} else {
|
||||
$package_list = $oIssuetrackerModel->getPackageList($this->module_srl, $package_srl, 0);
|
||||
}
|
||||
}
|
||||
|
||||
Context::set('package_list', $package_list);
|
||||
|
||||
$this->setTemplateFile('download');
|
||||
}
|
||||
|
||||
function dispIssuetrackerMessage($msg_code) {
|
||||
$msg = Context::getLang($msg_code);
|
||||
if(!$msg) $msg = $msg_code;
|
||||
Context::set('message', $msg);
|
||||
$this->setTemplateFile('message');
|
||||
}
|
||||
|
||||
function alertMessage($message) {
|
||||
$script = sprintf('<script type="text/javascript"> xAddEventListener(window,"load", function() { alert("%s"); } );</script>', Context::getLang($message));
|
||||
Context::addHtmlHeader( $script );
|
||||
}
|
||||
|
||||
function dispIssuetrackerDeleteTrackback() {
|
||||
$trackback_srl = Context::get('trackback_srl');
|
||||
|
||||
$oTrackbackModel = &getModel('trackback');
|
||||
$output = $oTrackbackModel->getTrackback($trackback_srl);
|
||||
$trackback = $output->data;
|
||||
|
||||
if(!$trackback) return $this->dispIssuetrackerMessage('msg_invalid_request');
|
||||
|
||||
Context::set('trackback',$trackback);
|
||||
|
||||
$this->setTemplateFile('delete_trackback');
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
92
modules/issuetracker/lang/ko.lang.php
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
<?php
|
||||
/**
|
||||
* @file ko.lang.php
|
||||
* @author zero (zero@nzeo.com)
|
||||
* @brief 게시판(board) 모듈의 기본 언어팩
|
||||
**/
|
||||
|
||||
$lang->issuetracker = '이슈트래커';
|
||||
$lang->about_issuetracker = '프로젝트 관리를 위한 계획표, 코드열람, 문제관리와 배포판을 관리할 수 있는 모듈입니다';
|
||||
|
||||
$lang->cmd_project_list = '프로젝트 목록';
|
||||
$lang->cmd_view_info = '프로젝트 정보';
|
||||
$lang->cmd_project_setting = '프로젝트 설정';
|
||||
$lang->cmd_release_setting = '배포 설정';
|
||||
$lang->cmd_insert_package = '패키지 추가';
|
||||
$lang->cmd_insert_release = '배포 추가';
|
||||
$lang->cmd_attach_file = '파일 첨부';
|
||||
$lang->cmd_display_item = '대상 표시';
|
||||
|
||||
$lang->cmd_resolve_as = '상태 변경';
|
||||
$lang->cmd_reassign = '소유자 변경';
|
||||
$lang->cmd_accept = '수락하기';
|
||||
|
||||
$lang->svn_url = 'SVN 주소';
|
||||
$lang->about_svn_url = '프로젝트의 버전관리가 이루어지는 SVN 주소를 입력해주세요';
|
||||
$lang->svn_cmd = 'SVN 실행파일 위치';
|
||||
$lang->about_svn_cmd = 'SVN 연동을 위해 svn client 실행파일의 위치를 입력해주세요. (ex: /usr/bin/svn)';
|
||||
$lang->diff_cmd = 'DIFF 실행파일 위치';
|
||||
$lang->about_diff_cmd = 'SVN revision들의 비교를 위한 diff 실행파일의 위치를 입력해주세요. (ex: /usr/bin/diff)';
|
||||
|
||||
$lang->issue = '문제';
|
||||
$lang->total_issue = '전체 문제';
|
||||
$lang->milestone = $lang->milestone_srl = '계획';
|
||||
$lang->priority = $lang->priority_srl = '우선순위';
|
||||
$lang->type = $lang->type_srl = '종류';
|
||||
$lang->component = $lang->component_srl = '구성요소';
|
||||
$lang->assignee = '소유자';
|
||||
$lang->status = '상태';
|
||||
$lang->action = '동작';
|
||||
|
||||
$lang->history_format_not_source = '<span class="target">[target]</span> 으로 <span class="key">[key]</span> 변경';
|
||||
$lang->history_format = '<span class="source">[source]</span> 에서 <span class="target">[target]</span> 으로 <span class="key">[key]</span> 변경';
|
||||
|
||||
$lang->project = '프로젝트';
|
||||
|
||||
$lang->deadline = '완료기한';
|
||||
$lang->name = '이름';
|
||||
$lang->complete = '완료';
|
||||
$lang->completed_date = '완료일';
|
||||
$lang->order = '순서';
|
||||
$lang->package = $lang->package_srl = '패키지';
|
||||
$lang->release = $lang->release_srl = '배포판';
|
||||
$lang->release_note = '배포 기록';
|
||||
$lang->release_changes = '변경 사항';
|
||||
$lang->occured_version = $lang->occured_version_srl = '발생버전';
|
||||
$lang->attached_file = '첨부 파일';
|
||||
$lang->filename = '파일이름';
|
||||
$lang->filesize = '파일크기';
|
||||
|
||||
$lang->status_list = array(
|
||||
'new' => '신규',
|
||||
'reviewing' => '검토중',
|
||||
'assign' => '할당',
|
||||
'resolve' => '해결',
|
||||
'reopen' => '재발',
|
||||
'postponed' => '보류',
|
||||
'duplicated' => '중복',
|
||||
'invalid' => '문제아님',
|
||||
);
|
||||
|
||||
$lang->about_milestone = '개발계획을 설정합니다';
|
||||
$lang->about_priority = '우선순위를 설정합니다.';
|
||||
$lang->about_type = '문제의 종류를 설정합니다 (ex. 문제, 개선사항)';
|
||||
$lang->about_component = '문제의 대상 구성요소를 설정합니다';
|
||||
|
||||
$lang->project_menus = array(
|
||||
'dispIssuetrackerViewIssue' => '문제 열람',
|
||||
'dispIssuetrackerNewIssue' => '문제 작성',
|
||||
'dispIssuetrackerViewMilestone' => '개발계획',
|
||||
'dispIssuetrackerViewSource' => '코드 열람',
|
||||
'dispIssuetrackerDownload' => '다운로드',
|
||||
'dispIssuetrackerAdminProjectSetting' => '설정',
|
||||
);
|
||||
|
||||
$lang->msg_not_attched = '파일을 첨부해주세요';
|
||||
$lang->msg_attached = '파일이 등록되었습니다';
|
||||
$lang->msg_no_releases = '등록된 배포판이 없습니다';
|
||||
|
||||
$lang->cmd_document_do = '이 문제를.. ';
|
||||
$lang->not_assigned = '할당 안됨';
|
||||
$lang->not_assigned_description = '할당 안된 문제들의 목록입니다.';
|
||||
?>
|
||||
11
modules/issuetracker/queries/clearComponentsDefault.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="clearComponentsDefault" action="update">
|
||||
<tables>
|
||||
<table name="issue_components" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="is_default" default="N" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="module_srl" var="module_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
11
modules/issuetracker/queries/clearMilestoneDefault.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="clearMilestoneDefault" action="update">
|
||||
<tables>
|
||||
<table name="issue_milestones" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="is_default" default="N" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="module_srl" var="module_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
11
modules/issuetracker/queries/clearPrioritiesDefault.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="clearPrioritiesDefault" action="update">
|
||||
<tables>
|
||||
<table name="issue_priorities" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="is_default" default="N" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="module_srl" var="module_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
11
modules/issuetracker/queries/clearTypeDefault.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="clearTypeDefault" action="update">
|
||||
<tables>
|
||||
<table name="issue_types" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="is_default" default="N" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="module_srl" var="module_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
8
modules/issuetracker/queries/deleteComponent.xml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
<query id="deleteComponent" action="delete">
|
||||
<tables>
|
||||
<table name="issue_components" />
|
||||
</tables>
|
||||
<conditions>
|
||||
<condition operation="equal" column="component_srl" var="component_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
8
modules/issuetracker/queries/deleteComponents.xml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
<query id="deleteComponents" action="delete">
|
||||
<tables>
|
||||
<table name="issue_components" />
|
||||
</tables>
|
||||
<conditions>
|
||||
<condition operation="equal" column="module_srl" var="module_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
8
modules/issuetracker/queries/deleteIssue.xml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
<query id="deleteIssue" action="delete">
|
||||
<tables>
|
||||
<table name="issues" />
|
||||
</tables>
|
||||
<conditions>
|
||||
<condition operation="equal" column="target_srl" var="target_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
8
modules/issuetracker/queries/deleteMilestone.xml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
<query id="deleteMilestone" action="delete">
|
||||
<tables>
|
||||
<table name="issue_milestones" />
|
||||
</tables>
|
||||
<conditions>
|
||||
<condition operation="equal" column="milestone_srl" var="milestone_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
8
modules/issuetracker/queries/deleteMilestones.xml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
<query id="deleteMilestones" action="delete">
|
||||
<tables>
|
||||
<table name="issue_milestones" />
|
||||
</tables>
|
||||
<conditions>
|
||||
<condition operation="equal" column="module_srl" var="module_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
8
modules/issuetracker/queries/deletePackage.xml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
<query id="deletePackage" action="delete">
|
||||
<tables>
|
||||
<table name="issue_packages" />
|
||||
</tables>
|
||||
<conditions>
|
||||
<condition operation="equal" column="package_srl" var="package_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
8
modules/issuetracker/queries/deletePriorities.xml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
<query id="deletePriorities" action="delete">
|
||||
<tables>
|
||||
<table name="issue_priorities" />
|
||||
</tables>
|
||||
<conditions>
|
||||
<condition operation="equal" column="module_srl" var="module_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
8
modules/issuetracker/queries/deletePriority.xml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
<query id="deletePriority" action="delete">
|
||||
<tables>
|
||||
<table name="issue_priorities" />
|
||||
</tables>
|
||||
<conditions>
|
||||
<condition operation="equal" column="priority_srl" var="priority_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
8
modules/issuetracker/queries/deleteRelease.xml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
<query id="deleteRelease" action="delete">
|
||||
<tables>
|
||||
<table name="issue_releases" />
|
||||
</tables>
|
||||
<conditions>
|
||||
<condition operation="equal" column="release_srl" var="release_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
8
modules/issuetracker/queries/deleteType.xml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
<query id="deleteType" action="delete">
|
||||
<tables>
|
||||
<table name="issue_types" />
|
||||
</tables>
|
||||
<conditions>
|
||||
<condition operation="equal" column="type_srl" var="type_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
8
modules/issuetracker/queries/deleteTypes.xml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
<query id="deleteType" action="delete">
|
||||
<tables>
|
||||
<table name="issue_types" />
|
||||
</tables>
|
||||
<conditions>
|
||||
<condition operation="equal" column="module_srl" var="module_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
11
modules/issuetracker/queries/getComponent.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="getComponent" action="select">
|
||||
<tables>
|
||||
<table name="issue_components" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="component_srl" var="component_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
11
modules/issuetracker/queries/getComponents.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="getComponents" action="select">
|
||||
<tables>
|
||||
<table name="issue_components" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="module_srl" var="module_srl" />
|
||||
</conditions>
|
||||
</query>
|
||||
68
modules/issuetracker/queries/getDocumentList.xml
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
<query id="getDocumentList" action="select">
|
||||
<tables>
|
||||
<table name="documents" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="document_srl" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="in" column="module_srl" var="module_srl" filter="number" />
|
||||
<condition operation="in" column="category_srl" var="category_srl" pipe="and" />
|
||||
<condition operation="equal" column="is_notice" var="s_is_notice" pipe="and" />
|
||||
<condition operation="equal" column="member_srl" var="member_srl" filter="number" pipe="and" />
|
||||
<group pipe="and">
|
||||
<condition operation="more" column="list_order" var="division" pipe="and" />
|
||||
<condition operation="below" column="list_order" var="last_division" pipe="and" />
|
||||
</group>
|
||||
<group pipe="and">
|
||||
<condition operation="like" column="title" var="s_title" />
|
||||
<condition operation="like" column="content" var="s_content" pipe="or" />
|
||||
<condition operation="like" column="user_name" var="s_user_name" pipe="or" />
|
||||
<condition operation="like" column="user_id" var="s_user_id" pipe="or" />
|
||||
<condition operation="like" column="nick_name" var="s_nick_name" pipe="or" />
|
||||
<condition operation="like" column="email_address" var="s_email_addres" pipe="or" />
|
||||
<condition operation="like" column="homepage" var="s_homepage" pipe="or" />
|
||||
<condition operation="like" column="tags" var="s_tags" pipe="or" />
|
||||
<condition operation="equal" column="is_secret" var="s_is_secret" pipe="or" />
|
||||
<condition operation="equal" column="member_srl" var="s_member_srl" pipe="or" />
|
||||
<condition operation="more" column="readed_count" var="s_readed_count" pipe="or" />
|
||||
<condition operation="more" column="voted_count" var="s_voted_count" pipe="or" />
|
||||
<condition operation="more" column="comment_count" var="s_comment_count" pipe="or" />
|
||||
<condition operation="more" column="trackback_count" var="s_trackback_count" pipe="or" />
|
||||
<condition operation="more" column="uploaded_count" var="s_uploaded_count" pipe="or" />
|
||||
<condition operation="like_prefix" column="regdate" var="s_regdate" pipe="or" />
|
||||
<condition operation="like_prefix" column="last_update" var="s_last_update" pipe="or" />
|
||||
<condition operation="like_prefix" column="ipaddress" var="s_ipaddress" pipe="or" />
|
||||
<condition operation="like" column="extra_vars1" var="s_extra_vars1" pipe="or" />
|
||||
<condition operation="like" column="extra_vars2" var="s_extra_vars2" pipe="or" />
|
||||
<condition operation="like" column="extra_vars3" var="s_extra_vars3" pipe="or" />
|
||||
<condition operation="like" column="extra_vars4" var="s_extra_vars4" pipe="or" />
|
||||
<condition operation="like" column="extra_vars5" var="s_extra_vars5" pipe="or" />
|
||||
<condition operation="like" column="extra_vars6" var="s_extra_vars6" pipe="or" />
|
||||
<condition operation="like" column="extra_vars7" var="s_extra_vars7" pipe="or" />
|
||||
<condition operation="like" column="extra_vars8" var="s_extra_vars8" pipe="or" />
|
||||
<condition operation="like" column="extra_vars9" var="s_extra_vars9" pipe="or" />
|
||||
<condition operation="like" column="extra_vars10" var="s_extra_vars10" pipe="or" />
|
||||
<condition operation="like" column="extra_vars11" var="s_extra_vars11" pipe="or" />
|
||||
<condition operation="like" column="extra_vars12" var="s_extra_vars12" pipe="or" />
|
||||
<condition operation="like" column="extra_vars13" var="s_extra_vars13" pipe="or" />
|
||||
<condition operation="like" column="extra_vars14" var="s_extra_vars14" pipe="or" />
|
||||
<condition operation="like" column="extra_vars15" var="s_extra_vars15" pipe="or" />
|
||||
<condition operation="like" column="extra_vars16" var="s_extra_vars16" pipe="or" />
|
||||
<condition operation="like" column="extra_vars17" var="s_extra_vars17" pipe="or" />
|
||||
<condition operation="like" column="extra_vars18" var="s_extra_vars18" pipe="or" />
|
||||
<condition operation="like" column="extra_vars19" var="s_extra_vars19" pipe="or" />
|
||||
<condition operation="like" column="extra_vars20" var="s_extra_vars20" pipe="or" />
|
||||
</group>
|
||||
<group pipe="and">
|
||||
<condition operation="more" column="last_update" var="start_date" pipe="and" />
|
||||
<condition operation="less" column="last_update" var="end_date" pipe="and" />
|
||||
</group>
|
||||
</conditions>
|
||||
<navigation>
|
||||
<index var="sort_index" default="list_order" order="order_type" />
|
||||
<list_count var="list_count" default="20" />
|
||||
<page_count var="page_count" default="10" />
|
||||
<page var="page" default="1" />
|
||||
</navigation>
|
||||
</query>
|
||||
13
modules/issuetracker/queries/getGroupMembers.xml
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
<query id="getGroupMembers" action="select">
|
||||
<tables>
|
||||
<table name="member" alias="member"/>
|
||||
<table name="member_group_member" alias="group_member"/>
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="member.*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="in" column="group_member.group_srl" var="group_srls" />
|
||||
<condition operation="equal" column="group_member.member_srl" var="member.member_srl" pipe="and" />
|
||||
</conditions>
|
||||
</query>
|
||||
14
modules/issuetracker/queries/getHistories.xml
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<query id="getHistories" action="select">
|
||||
<tables>
|
||||
<table name="issues_history" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="target_srl" var="target_srl" />
|
||||
</conditions>
|
||||
<navigation>
|
||||
<index var="sort_index" default="issues_history_srl" order="asc" />
|
||||
</navigation>
|
||||
</query>
|
||||
11
modules/issuetracker/queries/getHistoryCount.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="getHistoryCount" action="select">
|
||||
<tables>
|
||||
<table name="issues_history" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="count(*)" alias="count" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="target_srl" var="target_srl" pipe="and"/>
|
||||
</conditions>
|
||||
</query>
|
||||
11
modules/issuetracker/queries/getIssue.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="getIssue" action="select">
|
||||
<tables>
|
||||
<table name="issues" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="target_srl" var="target_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
56
modules/issuetracker/queries/getIssueList.xml
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
<query id="getIssueList" action="select">
|
||||
<tables>
|
||||
<table name="documents" alias="documents" />
|
||||
<table name="issues" alias="issues" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="documents.module_srl" var="module_srl" filter="number" />
|
||||
<condition operation="less" column="documents.update_order" default="2100000000" pipe="and" />
|
||||
<condition operation="equal" column="documents.document_srl" default="issues.target_srl" pipe="and" />
|
||||
<condition operation="equal" column="documents.member_srl" var="member_srl" filter="number" pipe="and" />
|
||||
<condition operation="equal" column="issues.milestone_srl" var="milestone_srl" pipe="and" />
|
||||
<condition operation="equal" column="issues.priority_srl" var="priority_srl" pipe="and" />
|
||||
<condition operation="equal" column="issues.type_srl" var="type_srl" pipe="and" />
|
||||
<condition operation="equal" column="issues.component_srl" var="component_srl" pipe="and" />
|
||||
<condition operation="in" column="issues.status" var="status" pipe="and" />
|
||||
<condition operation="equal" column="issues.occured_version_srl" var="occured_version_srl" pipe="and" />
|
||||
<condition operation="equal" column="issues.resolution_srl" var="resolution_srl" pipe="and" />
|
||||
<condition operation="equal" column="issues.assignee_srl" var="assignee_srl" pipe="and" />
|
||||
<group pipe="and">
|
||||
<condition operation="like" column="documents.title" var="s_title" />
|
||||
<condition operation="like" column="documents.content" var="s_content" pipe="or" />
|
||||
<condition operation="like" column="documents.user_id" var="s_user_id" pipe="or" />
|
||||
<condition operation="like" column="documents.user_name" var="s_user_name" pipe="or" />
|
||||
<condition operation="like" column="documents.nick_name" var="s_nick_name" pipe="or" />
|
||||
<condition operation="like" column="documents.extra_vars1" var="s_extra_vars1" pipe="or" />
|
||||
<condition operation="like" column="documents.extra_vars2" var="s_extra_vars2" pipe="or" />
|
||||
<condition operation="like" column="documents.extra_vars3" var="s_extra_vars3" pipe="or" />
|
||||
<condition operation="like" column="documents.extra_vars4" var="s_extra_vars4" pipe="or" />
|
||||
<condition operation="like" column="documents.extra_vars5" var="s_extra_vars5" pipe="or" />
|
||||
<condition operation="like" column="documents.extra_vars6" var="s_extra_vars6" pipe="or" />
|
||||
<condition operation="like" column="documents.extra_vars7" var="s_extra_vars7" pipe="or" />
|
||||
<condition operation="like" column="documents.extra_vars8" var="s_extra_vars8" pipe="or" />
|
||||
<condition operation="like" column="documents.extra_vars9" var="s_extra_vars9" pipe="or" />
|
||||
<condition operation="like" column="documents.extra_vars10" var="s_extra_vars10" pipe="or" />
|
||||
<condition operation="like" column="documents.extra_vars11" var="s_extra_vars11" pipe="or" />
|
||||
<condition operation="like" column="documents.extra_vars12" var="s_extra_vars12" pipe="or" />
|
||||
<condition operation="like" column="documents.extra_vars13" var="s_extra_vars13" pipe="or" />
|
||||
<condition operation="like" column="documents.extra_vars14" var="s_extra_vars14" pipe="or" />
|
||||
<condition operation="like" column="documents.extra_vars15" var="s_extra_vars15" pipe="or" />
|
||||
<condition operation="like" column="documents.extra_vars16" var="s_extra_vars16" pipe="or" />
|
||||
<condition operation="like" column="documents.extra_vars17" var="s_extra_vars17" pipe="or" />
|
||||
<condition operation="like" column="documents.extra_vars18" var="s_extra_vars18" pipe="or" />
|
||||
<condition operation="like" column="documents.extra_vars19" var="s_extra_vars19" pipe="or" />
|
||||
<condition operation="like" column="documents.extra_vars20" var="s_extra_vars20" pipe="or" />
|
||||
</group>
|
||||
</conditions>
|
||||
<navigation>
|
||||
<index var="sort_index" default="documents.update_order" order="asc" />
|
||||
<list_count var="list_count" default="50" />
|
||||
<page_count var="page_count" default="10" />
|
||||
<page var="page" default="1" />
|
||||
</navigation>
|
||||
</query>
|
||||
35
modules/issuetracker/queries/getIssueListWithinTag.xml
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
<query id="getIssueListWithinTag" action="select">
|
||||
<tables>
|
||||
<table name="documents" alias="documents" />
|
||||
<table name="issues" alias="issues"/>
|
||||
<table name="tags" alias="tags"/>
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="documents.document_srl" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="documents.module_srl" var="module_srl" filter="number" />
|
||||
<condition operation="less" column="documents.update_order" default="2100000000" pipe="and" />
|
||||
<condition operation="equal" column="documents.document_srl" default="issues.target_srl" pipe="and" />
|
||||
<condition operation="equal" column="documents.document_srl" default="tags.document_srl" pipe="and" />
|
||||
<condition operation="equal" column="documents.member_srl" var="member_srl" filter="number" pipe="and" />
|
||||
<condition operation="equal" column="issues.milestone_srl" var="milestone_srl" pipe="and" />
|
||||
<condition operation="equal" column="issues.priority_srl" var="priority_srl" pipe="and" />
|
||||
<condition operation="equal" column="issues.type_srl" var="type_srl" pipe="and" />
|
||||
<condition operation="equal" column="issues.component_srl" var="component_srl" pipe="and" />
|
||||
<condition operation="in" column="issues.status" var="status" pipe="and" />
|
||||
<condition operation="equal" column="issues.occured_version_srl" var="occured_version_srl" pipe="and" />
|
||||
<condition operation="equal" column="issues.resolution_srl" var="resolution_srl" pipe="and" />
|
||||
<condition operation="equal" column="issues.assignee_srl" var="assignee_srl" pipe="and" />
|
||||
<condition operation="like" column="tags.tag" var="s_tags" notnull="notnull" pipe="and" />
|
||||
</conditions>
|
||||
<navigation>
|
||||
<index var="sort_index" default="documents.update_order" order="asc" />
|
||||
<list_count var="list_count" default="50" />
|
||||
<page_count var="page_count" default="10" />
|
||||
<page var="page" default="1" />
|
||||
</navigation>
|
||||
<groups>
|
||||
<group column="documents.document_srl" />
|
||||
</groups>
|
||||
</query>
|
||||
27
modules/issuetracker/queries/getIssues.xml
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
<query id="getIssues" action="select">
|
||||
<tables>
|
||||
<table name="documents" alias="documents"/>
|
||||
<table name="issues" alias="issues"/>
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<group>
|
||||
<condition operation="in" column="issues.target_srl" var="target_srl" />
|
||||
<condition operation="equal" column="issues.target_srl" default="documents.document_srl" pipe="and"/>
|
||||
<condition operation="equal" column="issues.module_srl" var="module_srl" pipe="and"/>
|
||||
<condition operation="equal" column="issues.assignee_srl" var="assignee_srl" pipe="and"/>
|
||||
<condition operation="equal" column="issues.milestone_srl" var="milestone_srl" pipe="and"/>
|
||||
<condition operation="equal" column="issues.type_srl" var="type_srl" pipe="and"/>
|
||||
<condition operation="equal" column="issues.priority_srl" var="priority_srl" pipe="and"/>
|
||||
<condition operation="equal" column="issues.component_srl" var="component_srl" pipe="and"/>
|
||||
<condition operation="equal" column="issues.resolution_srl" var="resolution_srl" pipe="and"/>
|
||||
<condition operation="equal" column="issues.occured_version_srl" var="occured_version_srl" pipe="and"/>
|
||||
</group>
|
||||
<condition operation="equal" column="status" var="status" pipe="and" />
|
||||
</conditions>
|
||||
<navigation>
|
||||
<index var="sort_index" default="documents.update_order" order="asc" />
|
||||
</navigation>
|
||||
</query>
|
||||
20
modules/issuetracker/queries/getIssuesCount.xml
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
<query id="getIssuesCount" action="select">
|
||||
<tables>
|
||||
<table name="issues" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="count(*)" alias="count" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="target_srl" var="target_srl" pipe="and"/>
|
||||
<condition operation="equal" column="module_srl" var="module_srl" pipe="and"/>
|
||||
<condition operation="equal" column="assignee_srl" var="assignee_srl" pipe="and"/>
|
||||
<condition operation="equal" column="milestone_srl" var="milestone_srl" pipe="and"/>
|
||||
<condition operation="equal" column="type_srl" var="type_srl" pipe="and"/>
|
||||
<condition operation="equal" column="priority_srl" var="priority_srl" pipe="and"/>
|
||||
<condition operation="equal" column="component_srl" var="component_srl" pipe="and"/>
|
||||
<condition operation="equal" column="resolution_srl" var="resolution_srl" pipe="and"/>
|
||||
<condition operation="equal" column="occured_version_srl" var="occured_version_srl" pipe="and"/>
|
||||
<condition operation="equal" column="status" var="status" pipe="and" />
|
||||
</conditions>
|
||||
</query>
|
||||
11
modules/issuetracker/queries/getMilestone.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="getMilestone" action="select">
|
||||
<tables>
|
||||
<table name="issue_milestones" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="milestone_srl" var="milestone_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
15
modules/issuetracker/queries/getMilestones.xml
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
<query id="getMilestones" action="select">
|
||||
<tables>
|
||||
<table name="issue_milestones" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="module_srl" var="module_srl" />
|
||||
<condition operation="equal" column="is_completed" var="is_completed" pipe="and"/>
|
||||
</conditions>
|
||||
<navigation>
|
||||
<index var="sort_index" default="deadline" order="asc" />
|
||||
</navigation>
|
||||
</query>
|
||||
11
modules/issuetracker/queries/getPackage.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="getPackage" action="select">
|
||||
<tables>
|
||||
<table name="issue_packages" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="package_srl" var="package_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
15
modules/issuetracker/queries/getPackages.xml
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
<query id="getPackages" action="select">
|
||||
<tables>
|
||||
<table name="issue_packages" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="module_srl" var="module_srl" />
|
||||
<condition operation="equal" column="package_srl" var="package_srl" />
|
||||
</conditions>
|
||||
<navigation>
|
||||
<index var="sort_index" default="regdate" order="asc" />
|
||||
</navigation>
|
||||
</query>
|
||||
14
modules/issuetracker/queries/getPriorities.xml
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<query id="getPriorities" action="select">
|
||||
<tables>
|
||||
<table name="issue_priorities" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="module_srl" var="module_srl" />
|
||||
</conditions>
|
||||
<navigation>
|
||||
<index var="sort_index" default="listorder" order="asc" />
|
||||
</navigation>
|
||||
</query>
|
||||
11
modules/issuetracker/queries/getPriority.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="getPriority" action="select">
|
||||
<tables>
|
||||
<table name="issue_priorities" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="priority_srl" var="priority_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
11
modules/issuetracker/queries/getPriorityCount.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="getPriorityCount" action="select">
|
||||
<tables>
|
||||
<table name="issue_priorities" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="count(*)" alias="count" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="module_srl" var="module_srl" />
|
||||
</conditions>
|
||||
</query>
|
||||
11
modules/issuetracker/queries/getPriorityMaxListorder.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="getPriorityMaxListorder" action="select">
|
||||
<tables>
|
||||
<table name="issue_priorities" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="max(listorder)" alias="count" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="module_srl" var="module_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
24
modules/issuetracker/queries/getProjectList.xml
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<query id="getProjectList" action="select">
|
||||
<tables>
|
||||
<table name="modules" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="module" default="issuetracker" />
|
||||
<group pipe="and">
|
||||
<condition operation="like" column="mid" var="s_mid" pipe="or" />
|
||||
<condition operation="like" column="title" var="s_title" pipe="or" />
|
||||
<condition operation="like" column="comment" var="s_comment" pipe="or" />
|
||||
<condition operation="equal" column="module" var="s_module" pipe="or" />
|
||||
<condition operation="equal" column="module_category_srl" var="s_module_category_srl" pipe="or" />
|
||||
</group>
|
||||
</conditions>
|
||||
<navigation>
|
||||
<index var="sort_index" default="module_srl" order="desc" />
|
||||
<list_count var="list_count" default="20" />
|
||||
<page_count var="page_count" default="10" />
|
||||
<page var="page" default="1" />
|
||||
</navigation>
|
||||
</query>
|
||||
11
modules/issuetracker/queries/getRelease.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="getRelease" action="select">
|
||||
<tables>
|
||||
<table name="issue_releases" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="release_srl" var="release_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
11
modules/issuetracker/queries/getReleaseCount.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="getReleaseCount" action="select">
|
||||
<tables>
|
||||
<table name="issue_releases" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="count(*)" alias="count" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="package_srl" var="package_srl" />
|
||||
</conditions>
|
||||
</query>
|
||||
17
modules/issuetracker/queries/getReleaseList.xml
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
<query id="getReleases" action="select">
|
||||
<tables>
|
||||
<table name="issue_releases" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="package_srl" var="package_srl" />
|
||||
</conditions>
|
||||
<navigation>
|
||||
<index var="sort_index" default="regdate" order="desc" />
|
||||
<list_count var="list_count" default="20" />
|
||||
<page_count var="page_count" default="10" />
|
||||
<page var="page" default="1" />
|
||||
</navigation>
|
||||
</query>
|
||||
15
modules/issuetracker/queries/getReleases.xml
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
<query id="getReleases" action="select">
|
||||
<tables>
|
||||
<table name="issue_releases" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="package_srl" var="package_srl" />
|
||||
<condition operation="equal" column="module_srl" var="module_srl" pipe="and"/>
|
||||
</conditions>
|
||||
<navigation>
|
||||
<index var="sort_index" default="regdate" order="desc" />
|
||||
</navigation>
|
||||
</query>
|
||||
15
modules/issuetracker/queries/getReleasesWithPackage.xml
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
<query id="getReleasesWithPackage" action="select">
|
||||
<tables>
|
||||
<table name="issue_releases" />
|
||||
<table name="issue_packages" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="issue_releases.title" alias = "title"/>
|
||||
<column name="issue_packages.title" alias = "package_title"/>
|
||||
<column name="release_srl" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="issue_releases.package_srl" var="issue_packages.package_srl" />
|
||||
<condition operation="equal" column="issue_releases.module_srl" var="module_srl" pipe="and" />
|
||||
</conditions>
|
||||
</query>
|
||||
11
modules/issuetracker/queries/getType.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="getType" action="select">
|
||||
<tables>
|
||||
<table name="issue_types" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="type_srl" var="type_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
11
modules/issuetracker/queries/getTypes.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="getTypes" action="select">
|
||||
<tables>
|
||||
<table name="issue_types" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="module_srl" var="module_srl" />
|
||||
</conditions>
|
||||
</query>
|
||||
11
modules/issuetracker/queries/insertComponent.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="insertComponent" action="insert">
|
||||
<tables>
|
||||
<table name="issue_components" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="component_srl" var="component_srl" notnull="notnull" />
|
||||
<column name="title" var="title" notnull="notnull" />
|
||||
<column name="module_srl" var="module_srl" notnull="notnull" />
|
||||
<column name="is_default" var="is_default" default="N" />
|
||||
</columns>
|
||||
</query>
|
||||
16
modules/issuetracker/queries/insertHistory.xml
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
<query id="insertHistory" action="insert">
|
||||
<tables>
|
||||
<table name="issues_history" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="issues_history_srl" var="issues_history_srl" notnull="notnull" />
|
||||
<column name="target_srl" var="target_srl" notnull="notnull" />
|
||||
<column name="module_srl" var="module_srl" notnull="notnull" />
|
||||
<column name="content" var="content" notnull="notnull" />
|
||||
<column name="history" var="history" />
|
||||
<column name="member_srl" var="member_srl" default="0" />
|
||||
<column name="nick_name" var="nick_name" notnull="notnull"/>
|
||||
<column name="password" var="password" />
|
||||
<column name="regdate" default="curdate()" />
|
||||
</columns>
|
||||
</query>
|
||||
14
modules/issuetracker/queries/insertIssue.xml
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<query id="insertIssue" action="insert">
|
||||
<tables>
|
||||
<table name="issues" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="target_srl" var="document_srl" notnull="notnull" />
|
||||
<column name="module_srl" var="module_srl" notnull="notnull" />
|
||||
<column name="milestone_srl" var="milestone_srl" />
|
||||
<column name="priority_srl" var="priority_srl" />
|
||||
<column name="type_srl" var="type_srl" />
|
||||
<column name="component_srl" var="component_srl" />
|
||||
<column name="occured_version_srl" var="occured_version_srl" />
|
||||
</columns>
|
||||
</query>
|
||||
14
modules/issuetracker/queries/insertMilestone.xml
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<query id="insertMilestone" action="insert">
|
||||
<tables>
|
||||
<table name="issue_milestones" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="milestone_srl" var="milestone_srl" notnull="notnull" />
|
||||
<column name="title" var="title" notnull="notnull" />
|
||||
<column name="description" var="description" />
|
||||
<column name="deadline" var="deadline" />
|
||||
<column name="is_completed" var="is_completed" />
|
||||
<column name="module_srl" var="module_srl" notnull="notnull" />
|
||||
<column name="is_default" var="is_default" />
|
||||
</columns>
|
||||
</query>
|
||||
12
modules/issuetracker/queries/insertPackage.xml
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<query id="insertPackage" action="insert">
|
||||
<tables>
|
||||
<table name="issue_packages" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="package_srl" var="package_srl" notnull="notnull" />
|
||||
<column name="module_srl" var="module_srl" notnull="notnull" />
|
||||
<column name="title" var="title" notnull="notnull" />
|
||||
<column name="description" var="description" />
|
||||
<column name="regdate" default="curdate()" />
|
||||
</columns>
|
||||
</query>
|
||||
12
modules/issuetracker/queries/insertPriority.xml
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<query id="insertPriority" action="insert">
|
||||
<tables>
|
||||
<table name="issue_priorities" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="priority_srl" var="priority_srl" notnull="notnull" />
|
||||
<column name="title" var="title" notnull="notnull" />
|
||||
<column name="listorder" var="listorder" notnull="notnull" />
|
||||
<column name="is_default" var="is_default" default="N" />
|
||||
<column name="module_srl" var="module_srl" notnull="notnull" />
|
||||
</columns>
|
||||
</query>
|
||||
14
modules/issuetracker/queries/insertRelease.xml
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<query id="insertRelease" action="insert">
|
||||
<tables>
|
||||
<table name="issue_releases" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="release_srl" var="release_srl" notnull="notnull" />
|
||||
<column name="module_srl" var="module_srl" notnull="notnull" />
|
||||
<column name="package_srl" var="package_srl" notnull="notnull" />
|
||||
<column name="title" var="title" notnull="notnull" />
|
||||
<column name="release_note" var="release_note" />
|
||||
<column name="release_changes" var="release_changes" />
|
||||
<column name="regdate" default="curdate()" />
|
||||
</columns>
|
||||
</query>
|
||||
11
modules/issuetracker/queries/insertType.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="insertType" action="insert">
|
||||
<tables>
|
||||
<table name="issue_types" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="type_srl" var="type_srl" notnull="notnull" />
|
||||
<column name="title" var="title" notnull="notnull" />
|
||||
<column name="is_default" var="is_default" default="N" />
|
||||
<column name="module_srl" var="module_srl" notnull="notnull" />
|
||||
</columns>
|
||||
</query>
|
||||
12
modules/issuetracker/queries/updateComponent.xml
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<query id="updateComponent" action="update">
|
||||
<tables>
|
||||
<table name="issue_components" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="title" var="title" notnull="notnull" />
|
||||
<column name="is_default" var="is_default" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="component_srl" var="component_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
19
modules/issuetracker/queries/updateIssue.xml
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<query id="updateIssue" action="update">
|
||||
<tables>
|
||||
<table name="issues" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="assignee_srl" var="assignee_srl" />
|
||||
<column name="assignee_name" var="assignee_name" />
|
||||
<column name="milestone_srl" var="milestone_srl" />
|
||||
<column name="type_srl" var="type_srl" />
|
||||
<column name="priority_srl" var="priority_srl" />
|
||||
<column name="component_srl" var="component_srl" />
|
||||
<column name="occured_version_srl" var="occured_version_srl" />
|
||||
<column name="resolution_srl" var="resolution_srl" />
|
||||
<column name="status" var="status" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="target_srl" var="target_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
16
modules/issuetracker/queries/updateMilestone.xml
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
<query id="updateMilestone" action="update">
|
||||
<tables>
|
||||
<table name="issue_milestones" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="title" var="title" notnull="notnull" />
|
||||
<column name="description" var="description" />
|
||||
<column name="deadline" var="deadline" />
|
||||
<column name="is_completed" var="is_completed" />
|
||||
<column name="is_default" var="is_default" />
|
||||
<column name="released_date" var="released_date" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="milestone_srl" var="milestone_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
12
modules/issuetracker/queries/updatePackage.xml
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<query id="updatePackage" action="update">
|
||||
<tables>
|
||||
<table name="issue_packages" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="title" var="title" notnull="notnull" />
|
||||
<column name="description" var="description" notnull="notnull" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="package_srl" var="package_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
13
modules/issuetracker/queries/updatePriority.xml
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
<query id="updatePriority" action="update">
|
||||
<tables>
|
||||
<table name="issue_priorities" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="title" var="title" notnull="notnull" />
|
||||
<column name="listorder" var="listorder" notnull="notnull" />
|
||||
<column name="is_default" var="is_default" default="N" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="priority_srl" var="priority_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
13
modules/issuetracker/queries/updateRelease.xml
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
<query id="updateRelease" action="update">
|
||||
<tables>
|
||||
<table name="issue_releases" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="title" var="title" notnull="notnull" />
|
||||
<column name="release_note" var="release_note" />
|
||||
<column name="release_changes" var="release_changes" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="release_srl" var="release_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
11
modules/issuetracker/queries/updateReleaseFile.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="updateReleaseFile" action="update">
|
||||
<tables>
|
||||
<table name="files" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="comment" var="comment" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="file_srl" var="file_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
12
modules/issuetracker/queries/updateType.xml
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<query id="updateType" action="update">
|
||||
<tables>
|
||||
<table name="issue_types" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="title" var="title" notnull="notnull" />
|
||||
<column name="is_default" var="is_default" default="N" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="type_srl" var="type_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
6
modules/issuetracker/schemas/issue_components.xml
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
<table name="issue_components">
|
||||
<column name="component_srl" type="number" size="11" notnull="notnull" primary_key="primary_key" />
|
||||
<column name="module_srl" type="number" size="11" notnull="notnull" index="idx_module_srl" />
|
||||
<column name="title" type="varchar" size="255" notnull="notnull" />
|
||||
<column name="is_default" type="char" size="1" default="N" />
|
||||
</table>
|
||||
10
modules/issuetracker/schemas/issue_milestones.xml
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
<table name="issue_milestones">
|
||||
<column name="milestone_srl" type="number" size="11" notnull="notnull" primary_key="primary_key" />
|
||||
<column name="module_srl" type="number" size="11" notnull="notnull" index="idx_module_srl" />
|
||||
<column name="deadline" type="date" index="idx_deadline" />
|
||||
<column name="released_date" type="date" index="idx_released_date" />
|
||||
<column name="title" type="varchar" size="255" notnull="notnull" />
|
||||
<column name="description" type="bigtext" />
|
||||
<column name="is_default" type="char" size="1" default="N" />
|
||||
<column name="is_completed" type="char" size="1" default="N" />
|
||||
</table>
|
||||
7
modules/issuetracker/schemas/issue_packages.xml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<table name="issue_packages">
|
||||
<column name="package_srl" type="number" size="11" notnull="notnull" primary_key="primary_key" />
|
||||
<column name="module_srl" type="number" size="11" notnull="notnull" index="idx_module_srl" />
|
||||
<column name="title" type="varchar" size="255" notnull="notnull" />
|
||||
<column name="description" type="text" />
|
||||
<column name="regdate" type="date" index="idx_regdate " />
|
||||
</table>
|
||||
7
modules/issuetracker/schemas/issue_priorities.xml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<table name="issue_priorities">
|
||||
<column name="priority_srl" type="number" size="11" notnull="notnull" primary_key="primary_key" />
|
||||
<column name="module_srl" type="number" size="11" notnull="notnull" index="idx_module_srl" />
|
||||
<column name="title" type="varchar" size="255" notnull="notnull" />
|
||||
<column name="is_default" type="char" size="1" default="N" />
|
||||
<column name="listorder" type="number" size="11" default="0" index="idx_listorder" />
|
||||
</table>
|
||||
9
modules/issuetracker/schemas/issue_releases.xml
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
<table name="issue_releases">
|
||||
<column name="release_srl" type="number" size="11" notnull="notnull" primary_key="primary_key" />
|
||||
<column name="module_srl" type="number" size="11" notnull="notnull" index="idx_module_srl" />
|
||||
<column name="package_srl" type="number" size="11" notnull="notnull" index="idx_package_srl" />
|
||||
<column name="title" type="varchar" size="255" notnull="notnull" />
|
||||
<column name="release_note" type="text" />
|
||||
<column name="release_changes" type="text" />
|
||||
<column name="regdate" type="date" index="idx_regdate " />
|
||||
</table>
|
||||
6
modules/issuetracker/schemas/issue_resolutions.xml
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
<table name="issue_resolutions">
|
||||
<column name="resolution_srl" type="number" size="11" notnull="notnull" primary_key="primary_key" />
|
||||
<column name="module_srl" type="number" size="11" notnull="notnull" index="idx_module_srl" />
|
||||
<column name="title" type="varchar" size="255" notnull="notnull" />
|
||||
<column name="is_default" type="char" size="1" default="N" />
|
||||
</table>
|
||||
6
modules/issuetracker/schemas/issue_types.xml
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
<table name="issue_types">
|
||||
<column name="type_srl" type="number" size="11" notnull="notnull" primary_key="primary_key" />
|
||||
<column name="module_srl" type="number" size="11" notnull="notnull" index="idx_module_srl" />
|
||||
<column name="title" type="varchar" size="255" notnull="notnull" />
|
||||
<column name="is_default" type="char" size="1" default="N" />
|
||||
</table>
|
||||
13
modules/issuetracker/schemas/issues.xml
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
<table name="issues">
|
||||
<column name="target_srl" type="number" size="11" notnull="notnull" primary_key="primary_key" />
|
||||
<column name="module_srl" type="number" size="11" notnull="notnull" index="idx_module_srl" />
|
||||
<column name="assignee_srl" type="number" size="11" default="0" index="idx_assignee_srl" />
|
||||
<column name="assignee_name" type="varchar" size="80" />
|
||||
<column name="milestone_srl" type="number" size="11" default="0" index="idx_milestone_srl" />
|
||||
<column name="type_srl" type="number" size="11" default="0" index="idx_type_srl" />
|
||||
<column name="priority_srl" type="number" size="11" default="0" index="idx_priority_srl" />
|
||||
<column name="component_srl" type="number" size="11" default="0" index="idx_component_srl" />
|
||||
<column name="resolution_srl" type="number" size="11" default="0" index="idx_resolution_srl" />
|
||||
<column name="status" type="char" size="20" default="new" index="idx_status" />
|
||||
<column name="occured_version_srl" type="number" size="11" default="0" index="idx_occured_version_srl" />
|
||||
</table>
|
||||
11
modules/issuetracker/schemas/issues_history.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<table name="issues_history">
|
||||
<column name="issues_history_srl" type="number" size="11" notnull="notnull" primary_key="primary_key" />
|
||||
<column name="target_srl" type="number" size="11" notnull="notnull" index="idx_target_srl" />
|
||||
<column name="module_srl" type="number" size="11" notnull="notnull" index="idx_module_srl" />
|
||||
<column name="content" type="bigtext" notnull="notnull" />
|
||||
<column name="history" type="bigtext" notnull="notnull" />
|
||||
<column name="regdate" type="date" index="idx_regdate " />
|
||||
<column name="member_srl" type="number" size="11" notnull="notnull" index="idx_member_srl" />
|
||||
<column name="nick_name" type="varchar" size="80" notnull="notnull" />
|
||||
<column name="password" type="varchar" size="60" />
|
||||
</table>
|
||||
210
modules/issuetracker/skins/xe_issuetracker/css/common.css
Normal file
|
|
@ -0,0 +1,210 @@
|
|||
@charset "utf-8";
|
||||
|
||||
td.vtop { vertical-align:top; }
|
||||
|
||||
/* skin Title */
|
||||
.skinTitle { border:3px solid #DDDDDD; background-color:#FEFFF0; padding:15px; margin-bottom:15px; color:#666666; font-weight:bold; }
|
||||
.skinTitle blockquote { margin:5px 0 0 0; padding:5px 0 0 0; font-weight:normal; border-top:1px solid #DDDDDD; }
|
||||
|
||||
/* main navigation */
|
||||
div.issueNav { clear:both; overflow:hidden; height:23px; margin-bottom:10px; position:relative;}
|
||||
.issueNav ul { position:absolute; top:0; right:0; height:23px; margin:0; padding:0;z-index:2;}
|
||||
.issueNav li { float:left; list-style:none; margin:0 0 0 10px; padding:5px 7px 0 7px; height:16px; border:1px solid #AAAAAA; border-bottom:none;}
|
||||
.issueNav li.unselected { border-bottom:1px solid #AAAAAA; background-color:#FFFCF0;}
|
||||
.issueNav li a { text-decoration:none; color:#7D6608; }
|
||||
.issueNav li a:hover { color:#544301;}
|
||||
.issueNav li.selected { font-weight:bold; color:#544301; border-bottom:1px solid #FFFFFF;}
|
||||
.issueNav li.selected a { font-weight:bold; }
|
||||
.issueNav .bottomLine { height:22px; position:absolute; top:0; left:0; width:100%; border-bottom:1px solid #AAAAAA; z-index:1;}
|
||||
|
||||
/* issue list */
|
||||
form.close { display:none; }
|
||||
|
||||
form.issueSearch { padding:0; margin:0 0 10px 0; overflow:hidden; }
|
||||
form.issueSearch ul { margin:0; padding: 0; }
|
||||
form.issueSearch ul li { list-style:none; float:left; padding:5px 10px 0 0; white-space:nowrap; }
|
||||
form.issueSearch ul li.displayOpt { clear:left; width:100%; }
|
||||
form.issueSearch ul li.keywordSearch { clear:left; }
|
||||
form.issueSearch select { width:130px; }
|
||||
form.issueSearch input.inputTypeText { width:124px; }
|
||||
form.issueSearch input.inputTypeSubmit { width:130px; border:1px solid; border-color:#d8d8d8 #a6a6a6 #a6a6a6 #d8d8d8; height:20px; background:#EFEFEF; font-size:1em; _font-size:9pt; }
|
||||
form.issueSearch ul li ol { margin:0 2px 0 0; padding:0; border-bottom:none; }
|
||||
form.issueSearch ul li ol li { list-style:none; white-space:nowrap; overflow:hidden; float:left; letter-spacing:-2px;}
|
||||
|
||||
table.issues { border:0; border-spacing:0; border:1px solid #333333; overflow:hidden; }
|
||||
table.issues thead tr { background:url("../images/tableHeader.gif") repeat left top; height:20px; color:#FFFFFF; }
|
||||
table.issues thead tr th { width:10px;}
|
||||
table.issues thead tr th div { white-space:nowrap; margin:0; }
|
||||
table.issues thead tr th.title { width:100%; }
|
||||
table.issues tbody td { white-space:nowrap; padding:5px 2px; text-align:center; border-bottom:1px solid #EEEEEE; }
|
||||
table.issues tbody td a { text-decoration:none; color:#555555; }
|
||||
table.issues tbody td.no { text-align:center; font-family:tahoma; font-size:8pt; }
|
||||
table.issues tbody td.title { white-space:normal; font-weight:bold; text-align:left; }
|
||||
table.issues tbody td.title strong.comment { background:url("../images/iconComment.gif") no-repeat left 1px; padding-left:15px; font-size:8pt; font-family:tahoma; font-weight:normal; }
|
||||
table.issues tbody td.title strong.trackback { background:url("../images/iconTrackback.gif") no-repeat left 1px; padding-left:15px; font-size:8pt; font-family:tahoma; font-weight:normal; color:#8CCF3C;}
|
||||
table.issues tbody td.regdate { text-align:center; font-family:tahoma; font-size:8pt; }
|
||||
table.issues tbody td.nick_name { text-align:left; }
|
||||
|
||||
div.pageNavigation { margin:10px 0 0 0; text-align:center; padding:5px 3px; height:30px; }
|
||||
div.pageNavigation span { padding:3px 5px; border:1px solid #DDDDDD; color:#888888; margin:0 3px; }
|
||||
div.pageNavigation span:hover { border-color:#888888; }
|
||||
div.pageNavigation span a { text-decoration:none; color:#888888; }
|
||||
div.pageNavigation span a:hover { color:#444444; }
|
||||
div.pageNavigation span.current { text-decoration:none; padding:3px; margin:0 3px; color:#888888; font-weight:bold; border:none; }
|
||||
|
||||
/* milestone */
|
||||
table.milestones { width:100%; clear:both; border:0; border-spacing:0; table-layout:fixed; border:1px solid #333333; border-bottom:none; }
|
||||
table.milestones thead tr { background:url("../images/tableHeader.gif") repeat left top; height:20px; color:#FFFFFF; }
|
||||
table.milestones thead tr th { white-space:nowrap; }
|
||||
table.milestones tbody tr.title td { background-color:#EFEFEF; }
|
||||
table.milestones tbody td { padding:5px; text-align:center; border-bottom:1px solid #EEEEEE; }
|
||||
table.milestones tbody td.title { font-weight:bold; text-align:left; }
|
||||
table.milestones tbody td.title a { text-decoration:none; color:#444444; }
|
||||
table.milestones tbody td.deadline { color:#0A6E03; font-family:tahoma; font-size:9pt; }
|
||||
table.milestones tbody td.status a { text-decoration:none; font-family:tahoma; font-size:8pt; font-weight:bold;}
|
||||
table.milestones tbody td.total a { text-decoration:none; color:#444444; font-family:tahoma; font-size:8pt; font-weight:bold;}
|
||||
table.milestones tbody td.description { text-align:left; padding-left:10px; border-bottom:1px solid #333333; }
|
||||
table.milestones tbody td.completed { text-decoration:line-through; }
|
||||
table.milestones tbody td.released_date { text-align:right; color:#EF4B18; font-family:tahoma; font-size:9pt; }
|
||||
|
||||
/* download */
|
||||
table.downloads { width:100%; clear:both; border:0; border-spacing:0; table-layout:fixed; border:1px solid #333333;}
|
||||
table.downloads thead tr { background:url("../images/tableHeader.gif") repeat left top; height:20px; color:#FFFFFF; }
|
||||
|
||||
table.downloads td.package { background-color:#EFEFEF; padding:3px 0 5px 5px; border-top:1px solid #333333; }
|
||||
table.downloads td.package h3 { color:#030C83; font-size:9pt; font-weight:bold; margin:0; padding:0; float:left; }
|
||||
table.downloads td.package blockquote { clear:both; padding:5px; border:1px dotted #AAAAAA; background-color:#F3F3F3; margin:5px 5px 5px 0; }
|
||||
table.downloads td.packageLeft { background-color:#EFEFEF; }
|
||||
table.downloads td.null { background-color:#EFEFEF; }
|
||||
table.downloads td.nullLine { background-color:#EFEFEF; border-top:1px solid #AAAAAA; }
|
||||
table.downloads td.moreRelease { background-color:#EFEFEF; border-top:1px solid #333333; text-align:right; padding:5px; }
|
||||
table.downloads td.moreRelease a { color:#4753EE; text-decoration:none; }
|
||||
|
||||
table.downloads td.release { padding:5px; border-left:1px solid #AAAAAA; border-top:1px solid #AAAAAA; background-color:#ECEDF5; }
|
||||
table.downloads td.release h3 { font-size:9pt; font-weight:bold; margin:0; padding:0; float:left; }
|
||||
table.downloads td.release h3 a { text-decoration:none; color:#444444; }
|
||||
table.downloads td.release h3 a:hover { text-decoration:underline; }
|
||||
table.downloads td.release span { float:left; margin:0 0 0 10px; font-size:8pt; font-family:tahoma; color:#AAAAAA; }
|
||||
table.downloads td.releaseLeft { border-left:1px solid #AAAAAA; }
|
||||
table.downloads td.none_release { padding:5px; border-left:1px solid #AAAAAA; border-top:1px solid #AAAAAA; background-color:#EEEEEE; color:#888888;}
|
||||
|
||||
table.downloads td.releaseNoteTitle { border-left:1px solid #AAAAAA; background-color:#EFEFEF; padding:5px; border-top:1px solid #DDDDDD; font-weight:bold; color:#058FC2;}
|
||||
table.downloads td.releaseNote { border-left:1px solid #AAAAAA; padding:5px; border-top:1px dotted #DDDDDD; }
|
||||
table.downloads td.releaseChangesTitle { border-left:1px solid #AAAAAA; background-color:#EFEFEF; padding:5px; border-top:1px solid #DDDDDD; font-weight:bold; color:#C24305;}
|
||||
table.downloads td.releaseChanges { border-left:1px solid #AAAAAA; padding:5px; border-top:1px dotted #DDDDDD; border-bottom:1px solid #DDDDDD;}
|
||||
table.downloads td.releaseFilesTitle { border-left:1px solid #AAAAAA; background-color:#EFEFEF; padding:5px; border-top:1px solid #DDDDDD; font-weight:bold; color:#444444;}
|
||||
|
||||
table.downloads td.filename { padding:5px 5px 5px 15px; background:url("../images/file.gif") no-repeat left 5px; }
|
||||
table.downloads td.filename a { padding:5px; color:#000000; text-decoration:none; }
|
||||
table.downloads td.filename a:hover { text-decoration:underline; }
|
||||
table.downloads td.filename a:visited { color:#AAAAAA; }
|
||||
table.downloads td.filesize { padding:5px; color:#999999; font-family:tahoma; font-size:8pt; text-align:center;}
|
||||
table.downloads td.download_count { padding:5px; color:#999999; font-family:tahoma; font-size:8pt; text-align:center;}
|
||||
|
||||
table td.summaryText div { line-height:20px; padding-left:20px; cursor:pointer;}
|
||||
table td.summaryText div.open { background:url("../images/opener.gif") no-repeat left 4px; overflow:visible; }
|
||||
table td.summaryText div.close { background:url("../images/closer.gif") no-repeat left 4px; height:20px; overflow:hidden; }
|
||||
|
||||
/* alertMessage */
|
||||
blockquote.alertMessage { margin:50px auto 20px auto; width:300px; border-bottom:1px solid #DDDDDD; padding:10px; color:#555555; }
|
||||
ul.alertNav { margin:0 auto; width:300px; padding:0; }
|
||||
ul.alertNav li { list-style:none; float:right; margin:0; padding:0; }
|
||||
|
||||
/* new Issue */
|
||||
|
||||
.newIssue table { border:0; border-spacing:0; overflow:hidden; width:100%; border-top:1px solid #EEEEEE; }
|
||||
.newIssue table tr th { text-align:right; border-bottom:1px solid #EEEEEE; padding:8px 0 5px 0; vertical-align:top; }
|
||||
.newIssue table tr td { border-bottom:1px solid #EEEEEE; padding:5px 0 5px 0; }
|
||||
.newIssue table tr th label { white-space:nowrap; font-weight:normal; color:#DB7201; margin:0 10px 0 10px; }
|
||||
.newIssue table tr td input.wide { width:98%; }
|
||||
.newIssue table tr td textarea.wide { width:98%; height:80px; }
|
||||
.newIssue table tr td ul { margin:0; padding:0; }
|
||||
.newIssue table tr td ol { margin:0; padding:0; }
|
||||
.newIssue table tr td li { list-style:none; border-bottom:1px solid #EFEFEF; padding-bottom:3px; }
|
||||
.newIssue table tr td p { margin:5px 0 0 0; padding:0; color:#888888; }
|
||||
|
||||
.newIssue dl.option { margin:0 !important; padding:0 !important; }
|
||||
.newIssue dl.option dd { margin:0 10px 0 0 !important; padding:0 !important; float:left; }
|
||||
|
||||
div.display_date { cursor:pointer; width:80px; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; height:1em; padding:3px; margin-right:10px;}
|
||||
|
||||
div.editor table { width:95%; }
|
||||
|
||||
/* view Issue */
|
||||
|
||||
.viewIssue { }
|
||||
.viewIssue table { border-spacing:0; overflow:hidden; width:100%; border:1px solid #AAAAAA; background-color:#FFFFF6;}
|
||||
.viewIssue table tr th { text-align:right; border-bottom:1px solid #EEEEEE; padding:8px 10px 5px 10px; vertical-align:top; color:#898700; font-weight:normal;}
|
||||
.viewIssue table tr th.title { color:#444444; font-size:13pt; text-align:left; font-weight:bold; }
|
||||
.viewIssue table tr th.title span { font-size:9pt; color:#4F86B0;}
|
||||
.viewIssue table tr td { border-bottom:1px solid #EEEEEE; padding:5px 0 5px 0; color:#3B3A00; }
|
||||
.viewIssue table tr td.description { color:#444444; text-align:left; padding:20px; }
|
||||
.viewIssue table tr td.description a { color:#3A945E; text-decoration:none; }
|
||||
.viewIssue table tr td.description a:hover { text-decoration:underline; }
|
||||
.viewIssue table tr td ul.tag { margin:0; padding:0; }
|
||||
.viewIssue table tr td ul.tag li { list-style:none; float:left; }
|
||||
.viewIssue table tr td ul.tag li a { text-decoration:none; color:#3B3A00; }
|
||||
.viewIssue table tr td.inputPassword { padding:20px; text-align:center; }
|
||||
.viewIssue table tr td.inputPassword form input.inputTypeText { height:15px; }
|
||||
.viewIssue table tr td.inputPassword form input.inputTypeSubmit { border:1px solid; border-color:#d8d8d8 #a6a6a6 #a6a6a6 #d8d8d8; height:20px; background:#EFEFEF; }
|
||||
.viewIssue div.button { clear:both; float:right; margin-top:10px; }
|
||||
.viewIssue div.button ul { margin:0; padding:0; }
|
||||
.viewIssue div.button ul li { list-style:none; color:#AAAAAA; float:left; margin-left:10px; }
|
||||
.viewIssue div.button ul li a { text-decoration:none; color:#666666; font-weight:bold; }
|
||||
|
||||
fieldset.history { border:1px solid #CCCCCC; margin-top:10px; }
|
||||
fieldset.history legend { padding:0 10px; }
|
||||
fieldset.history legend span.date { font-size:8pt; font-family:tahoma; color:#AAAAAA; margin-right:10px; }
|
||||
fieldset.history ul { margin:0; padding:0; }
|
||||
fieldset.history ul li { list-style:none; }
|
||||
fieldset.history ul li a { color:#3A945E; text-decoration:none; }
|
||||
fieldset.history ul li a:hover { text-decoration:underline; }
|
||||
fieldset.history ul li ol { margin:5px 0 0 0; padding:0; }
|
||||
fieldset.history ul li ol li { margin-left:10px; padding-left:14px; list-style:none; margin-bottom:8px; background:url("../images/bul.gif") no-repeat left 1px;}
|
||||
fieldset.history ul li ol li span.source { color:#B04F4F; }
|
||||
fieldset.history ul li ol li span.target { color:#4F86B0; font-weight:bold; }
|
||||
fieldset.history ul li ol li span.key { color:#888888; font-weight:bold; }
|
||||
fieldset.history ul li.content { padding:10px; color:#444444;}
|
||||
|
||||
.document_popup_menu { cursor:pointer; text-align:right; background:none; background:url(../images/document_menu.gif) no-repeat right top; padding:0 15px 0 0; height:18px; margin-top:20px; }
|
||||
|
||||
/* delete Issue */
|
||||
.deleteIssue { width:40%; margin:0 auto; }
|
||||
.deleteIssue h3 { text-align:center; margin:30px 0 10px 0; padding:0 0 10px 0; border-bottom:1px solid #DDDDDD; }
|
||||
.deleteIssue ul.button { margin:0 0 20px 0; padding:0; text-align:center; }
|
||||
.deleteIssue ul.button li { list-style:none; display:inline; margin-left:10px; }
|
||||
|
||||
/* view Trackback */
|
||||
.viewTrackback { border:1px solid #C3D5A5; margin-top:10px; padding:10px; }
|
||||
.viewTrackback h3 { margin:0; padding:0; font-size:9pt; font-weight:normal; color:#335000; }
|
||||
.viewTrackback h3 a { font-weight:bold; text-decoration:none; color:#335000; }
|
||||
.viewTrackback h3 address { display:inline; font-size:8pt; font-family:tahoma; color:#4A931D; }
|
||||
.viewTrackback ul { padding:5px 0; margin:5px 0; border-top:1px solid #C3D5A5; overflow:hidden;}
|
||||
.viewTrackback ul li { list-style:none; color:#558404; float:left; margin-right:10px; }
|
||||
.viewTrackback ul li address { margin-bottom:5px; }
|
||||
.viewTrackback ul li a { text-decoration:none; color:#558404; }
|
||||
.viewTrackback ul li.date { font-size:8pt; font-family:tahoma; }
|
||||
.viewTrackback ul li.excerpt { clear:both; color:#335000; }
|
||||
|
||||
/* histories */
|
||||
.issueHistories { border:1px solid #BABABA; padding:10px; margin-top:10px; }
|
||||
|
||||
.newHistory { border:1px solid #BABABA; padding:10px; margin-top:10px; }
|
||||
.newHistory table { border-top:none; }
|
||||
.newHistory table tr th { border-bottom:none; }
|
||||
.newHistory table tr td { border-bottom:none; }
|
||||
.newHistory table tr td ul li { border-bottom:none; margin-bottom:5px; }
|
||||
.newHistory table tr td ul li label { margin:0 10px 0 10px; color:#444444; }
|
||||
.newHistory table tr td ul li label { margin:0 10px 0 10px; color:#444444; }
|
||||
.newHistory table tr td textarea { height:200px !important; }
|
||||
|
||||
/* issue status color */
|
||||
.issue_new, .issue_new a { color:#333333 !important; }
|
||||
.issue_assign, .issue_assign a { color:#0A7DBE !important; }
|
||||
.issue_resolve, .issue_resolve a { color:#079B2D !important; }
|
||||
.issue_reopen, .issue_reopen a { color:#9B5A07 !important; }
|
||||
.issue_postponed, .issue_postponed a { color:#9E9425 !important; }
|
||||
.issue_invalid, .issue_invalid a { color:#949494 !important; }
|
||||
.issue_duplicated, .issue_duplicted a { color:#949494 !important; }
|
||||
.issue_reviewing, .issue_reviewing a { color:#DD075A !important; }
|
||||
|
||||
45
modules/issuetracker/skins/xe_issuetracker/css/svn.css
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
@charset "utf-8";
|
||||
|
||||
.sourceBrowser h3 { background:url("../images/tableHeader.gif") repeat left top; height:20px; font-size:10pt; font-family:tahoma; color:#FFFFFF; margin:0; padding:0 0 0 10px; clear:both; }
|
||||
.sourceBrowser h1 { background-color:#EEEEEE; padding:10px; font-size:11pt; font-family:tahoma; color:#444444; clear:both; margin:0 0 10px 0; text-decoration:underline; }
|
||||
|
||||
.sourceBrowser blockquote { border:1px solid #444444; background-color:#444444; margin:0 0 10px 0; padding:5px; font-size:9pt; color:#EFEFEF; clear:both; }
|
||||
.sourceBrowser blockquote strong { margin-bottom:10px; display:block;}
|
||||
|
||||
.sourceBrowser ul { border:1px solid #888888; background-color:#AAAAAA; margin:0 0 5px 0; padding:5px 0 0 5px; height:20px; overflow:hidden; }
|
||||
.sourceBrowser ul li { float:left; list-style:none; padding:0; margin:0 10px 0 0; color:#CCCCCC; }
|
||||
.sourceBrowser ul li a { font-weight:bold; color:green; text-decoration:none; color:#FFFFFF;}
|
||||
.sourceBrowser ul li.file a { float:left; list-style:none; padding:0; margin:0 10px 0 0; color:#B5FFC1;}
|
||||
|
||||
.sourceBrowser ol { margin:0; padding:0; float:right; overflow:hidden; height:30px; }
|
||||
.sourceBrowser ol li { float:left; list-style:none; padding:0; margin:0 10px 0 0; color:#AAAAAA; font-size:9pt; }
|
||||
.sourceBrowser ol li a { font-weight:normal; color:#555555;; text-decoration:none; }
|
||||
|
||||
.sourceBrowser table { width:100%; clear:both; border:0; border-spacing:0; table-layout:fixed; border:1px solid #333333; margin-bottom:10px; }
|
||||
.sourceBrowser table thead tr { background:url("../images/tableHeader.gif") repeat left top; height:20px; color:#FFFFFF; font-family:tahoma; font-size:8pt; font-weight:bold; }
|
||||
.sourceBrowser table tr th.filename {color:#ffffff; padding:4px; font-size:9pt; font-family:tahoma; text-align:left;}
|
||||
.sourceBrowser table tr.revision td { text-align:center; font-weight:bold; font-size:8pt; font-family:tahoma;}
|
||||
.sourceBrowser table tr.line td { font-size:8pt; font-family:tahoma;}
|
||||
.sourceBrowser table tr.line td.deleted { color:red; }
|
||||
.sourceBrowser table tr.line td.modified { color:green; }
|
||||
.sourceBrowser table tr.line td.added { color:blue; }
|
||||
.sourceBrowser table tr.code td { color:#222222; font-size:9pt; }
|
||||
.sourceBrowser table tr td { border-bottom:1px solid #EEEEEE; vertical-align:top; padding-top:3px; color:#888888; font-family:tahoma; font-size:9pt; background-color:#FFFFFF; }
|
||||
.sourceBrowser table tbody tr.revision td { background-color:#DDDDDD; }
|
||||
.sourceBrowser table tbody tr.line td { background-color:#F3F3F3; border-bottom:1px solid #EEEEEE; text-align:center;}
|
||||
.sourceBrowser table tr.over td { background-color:#EFEFEF; }
|
||||
.sourceBrowser table td a { text-decoration:none; }
|
||||
.sourceBrowser table td.before { color:red; }
|
||||
.sourceBrowser table td.after { color:blue; }
|
||||
.sourceBrowser table td.directory { background:url("../images/folder.gif") no-repeat 4px 3px; padding-left:22px;}
|
||||
.sourceBrowser table td.file { background:url("../images/fileItem.gif") no-repeat 4px 3px; padding-left:22px;}
|
||||
.sourceBrowser table td.directory a { color:#333333; }
|
||||
.sourceBrowser table td.file a { color:#222222; }
|
||||
.sourceBrowser table td.log { white-space:nowrap; color:red; text-align:center;}
|
||||
.sourceBrowser table td.age { white-space:nowrap; text-align:left;}
|
||||
.sourceBrowser table td.log a { color:red;}
|
||||
.sourceBrowser table td span.author { font-weight:bold; color:#000000; }
|
||||
|
||||
.sourceBrowser pre { clear:both; font-size:9pt; font-family:tahoma; border:1px dotted #DDDDDD; background-color:#F3F3F3; padding:5px; color:#444444; }
|
||||
|
||||
.sourceBrowser input.btnCompare { margin-bottom:10px; }
|
||||
2
modules/issuetracker/skins/xe_issuetracker/css/white.css
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
@charset "utf-8";
|
||||
|
||||
21
modules/issuetracker/skins/xe_issuetracker/delete_form.html
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
<!--%import("filter/delete_issue.xml")-->
|
||||
<!--#include("header.html")-->
|
||||
|
||||
<div class="deleteIssue">
|
||||
|
||||
<h3>{$lang->confirm_delete}</h3>
|
||||
|
||||
<form action="./" method="get" onsubmit="return procFilter(this, delete_issue)">
|
||||
<input type="hidden" name="mid" value="{$mid}" />
|
||||
<input type="hidden" name="page" value="{$page}" />
|
||||
<input type="hidden" name="document_srl" value="{$document_srl}" />
|
||||
|
||||
<ul class="button">
|
||||
<li><input type="submit" value="{$lang->cmd_delete}" accesskey="s" /></li>
|
||||
<li><input type="button" value="{$lang->cmd_cancel}" onclick="location.href='{getUrl('act','dispIssuetrackerViewIssue')}'; return false;" /></li>
|
||||
</ul>
|
||||
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!--#include("footer.html")-->
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
<!--%import("filter/delete_trackback.xml")-->
|
||||
<!--#include("header.html")-->
|
||||
|
||||
<div class="deleteIssue">
|
||||
|
||||
<h3>{$lang->confirm_delete}</h3>
|
||||
|
||||
<form action="./" method="get" onsubmit="return procFilter(this, delete_trackback)">
|
||||
<input type="hidden" name="mid" value="{$mid}" />
|
||||
<input type="hidden" name="page" value="{$page}" />
|
||||
<input type="hidden" name="document_srl" value="{$document_srl}" />
|
||||
<input type="hidden" name="trackback_srl" value="{$trackback_srl}" />
|
||||
|
||||
<ul class="button">
|
||||
<li><input type="submit" value="{$lang->cmd_delete}" accesskey="s" /></li>
|
||||
<li><input type="button" value="{$lang->cmd_cancel}" onclick="location.href='{getUrl('act','dispIssuetrackerViewIssue')}'; return false;" /></li>
|
||||
</ul>
|
||||
|
||||
</form>
|
||||
</div>
|
||||
|
||||
90
modules/issuetracker/skins/xe_issuetracker/download.html
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
<!--#include("header.html")-->
|
||||
|
||||
<table class="downloads" cellspacing="0">
|
||||
<col width="90" />
|
||||
<col width="50" />
|
||||
<col width="*" />
|
||||
<col width="90" />
|
||||
<col width="120" />
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{$lang->package}</th>
|
||||
<th>{$lang->release}</th>
|
||||
<th>{$lang->filename}</th>
|
||||
<th>{$lang->filesize}</th>
|
||||
<th>{$lang->download_count}</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
<!--@foreach($package_list as $key => $val)-->
|
||||
<tr>
|
||||
<td class="summaryText package" colspan="4">
|
||||
<div class="close">
|
||||
<h3>{$val->title} ({count($val->releases)}/{$val->release_count})</h3>
|
||||
<blockquote>{nl2br($val->description)}</blockquote>
|
||||
</div>
|
||||
</td>
|
||||
<td class="moreRelease vtop">
|
||||
<!--@if($release_srl && $release)-->
|
||||
<a href="{getUrl('release_srl','','package_srl',$release->package_srl)}">{$lang->cmd_back}</a>
|
||||
<!--@else if($package_srl)-->
|
||||
<a href="{getUrl('package_srl','')}">{$lang->cmd_back}</a>
|
||||
<!--@else if($val->release_count>0)-->
|
||||
<a href="{getUrl('package_srl',$val->package_srl)}">{$lang->cmd_view_all}</a>
|
||||
<!--@end-->
|
||||
</td>
|
||||
</tr>
|
||||
<!--@if(count($val->releases))-->
|
||||
<!--@foreach($val->releases as $k => $v)-->
|
||||
<tr>
|
||||
<td class="packageLeft"> </td>
|
||||
<td colspan="4" class="release"><h3><a href="{getUrl('package_srl',$v->package_srl,'release_srl',$v->release_srl)}">{$v->title}</a></h3> <span>({zdate($v->regdate, "Y-m-d H:i")})</span></td>
|
||||
</tr>
|
||||
<!--@if($release)-->
|
||||
<tr>
|
||||
<td class="packageLeft"> </td>
|
||||
<td colspan="4" class="releaseNoteTitle">{$lang->release_note}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="packageLeft"> </td>
|
||||
<td colspan="4" class="releaseNote">{str_replace(' ',' ',nl2br($release->release_note))} </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="packageLeft"> </td>
|
||||
<td colspan="4" class="releaseChangesTitle">{$lang->release_changes}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="packageLeft"> </td>
|
||||
<td colspan="4" class="releaseChanges">{str_replace(' ',' ',nl2br($release->release_changes))} </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="packageLeft"> </td>
|
||||
<td colspan="4" class="releaseFilesTitle">{$lang->attached_file}</td>
|
||||
</tr>
|
||||
<!--@end-->
|
||||
<!--@foreach($v->files as $file)-->
|
||||
<tr>
|
||||
<td class="packageLeft"> </td>
|
||||
<td class="releaseLeft"> </td>
|
||||
<td class="filename"><a href="{$file->download_url}" name="attach_{$file->file_srl}" <!--@if($file->comment)-->rel="{str_replace("\n","<br />",htmlspecialchars($file->comment))}"<!--@end-->>{$file->source_filename}</a></td>
|
||||
<td class="filesize">{FileHandler::filesize($file->file_size)}</td>
|
||||
<td class="download_count">{$file->download_count}</td>
|
||||
</tr>
|
||||
<!--@end-->
|
||||
<!--@end-->
|
||||
<tr>
|
||||
<td class="null"> </td>
|
||||
<td colspan="4" class="nullLine"> </td>
|
||||
</tr>
|
||||
<!--@else-->
|
||||
<tr>
|
||||
<td class="packageLeft"> </td>
|
||||
<td colspan="4" class="none_release">{$lang->msg_no_releases}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="null"> </td>
|
||||
<td colspan="4" class="nullLine"> </td>
|
||||
</tr>
|
||||
<!--@end-->
|
||||
<!--@end-->
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
@ -0,0 +1,86 @@
|
|||
<!--// 이 파일은 extra_vars의 form을 출력하는 파일이며 다른 스킨에서 그대로 가져가서 css만 바꾸어 주면 된다 -->
|
||||
|
||||
<!--// calendar -->
|
||||
<!--%import("../../../../common/js/calendar.min.js",optimized=false)-->
|
||||
<!--@if($lang_type == 'ko')-->
|
||||
<!--%import("../../../../common/js/calendar-ko.js",optimized=false)-->
|
||||
<!--@elseif($lang_type == 'es')-->
|
||||
<!--%import("../../../../common/js/calendar-es.js",optimized=false)-->
|
||||
<!--@elseif($lang_type == 'ge')-->
|
||||
<!--%import("../../../../common/js/calendar-ge.js",optimized=false)-->
|
||||
<!--@elseif($lang_type == 'ru')-->
|
||||
<!--%import("../../../../common/js/calendar-ru.js",optimized=false)-->
|
||||
<!--@elseif($lang_type == 'zh-CN')-->
|
||||
<!--%import("../../../../common/js/calendar-zh-CN.js",optimized=false)-->
|
||||
<!--@else-->
|
||||
<!--%import("../../../../common/js/calendar-en.js",optimized=false)-->
|
||||
<!--@end-->
|
||||
<!--%import("../../../../common/js/calendar-setup.js",optimized=false)-->
|
||||
<!--%import("../../../../common/css/calendar-system.css",optimized=false)-->
|
||||
|
||||
<!--// type=select,checkbox이고 기본값이 , 로 연결되어 있으면 , 를 기준으로 explode하여 배열로 만든다 -->
|
||||
<!--@if(in_array($val->type,array('select','checkbox'))&&strpos($val->default,",")!==false)-->
|
||||
{@ $val->default = explode(',',$val->default) }
|
||||
<!--@end-->
|
||||
|
||||
<!--// 확장변수의 이름을 지정 -->
|
||||
{@ $val->column_name = "extra_vars".$key}
|
||||
|
||||
<!--// 확장변수의 값을 documentItem::getExtraValue로 가져옴 -->
|
||||
{@ $val->value = $oIssue->getExtraValue($key)}
|
||||
|
||||
<!--// 일반 text -->
|
||||
<!--@if($val->type == 'text')-->
|
||||
<input type="text" name="{$val->column_name}" value="{htmlspecialchars($val->value)}" class="inputTypeText wide" />
|
||||
|
||||
<!--// 홈페이지 주소 -->
|
||||
<!--@elseif($val->type == 'homepage')-->
|
||||
<input type="text" name="{$val->column_name}" value="{htmlspecialchars($val->value)}" class="inputTypeText wide" />
|
||||
|
||||
<!-- Email 주소 -->
|
||||
<!--@elseif($val->type == 'email_address')-->
|
||||
<input type="text" name="{$val->column_name}" value="{htmlspecialchars($val->value)}" class="inputTypeText wide" />
|
||||
|
||||
<!--// 전화번호 -->
|
||||
<!--@elseif($val->type == 'tel')-->
|
||||
<input type="text" name="{$val->column_name}" value="{htmlspecialchars($val->value[0])}" size="4" class="inputTypeText" /> -
|
||||
<input type="text" name="{$val->column_name}" value="{htmlspecialchars($val->value[1])}" size="4" class="inputTypeText" /> -
|
||||
<input type="text" name="{$val->column_name}" value="{htmlspecialchars($val->value[2])}" size="4" class="inputTypeText" />
|
||||
|
||||
<!--// textarea -->
|
||||
<!--@elseif($val->type == 'textarea')-->
|
||||
<textarea name="{$val->column_name}" class="inputTypeTextArea wide">{htmlspecialchars($val->value)}</textarea>
|
||||
|
||||
<!--// 다중 선택 -->
|
||||
<!--@elseif($val->type == 'checkbox')-->
|
||||
<!--@if($val->default)-->
|
||||
<ul>
|
||||
<!--@foreach($val->default as $v)-->
|
||||
<li><input type="checkbox" name="{$val->column_name}" value="{$v}" <!--@if($v==$val->value||is_array($val->value)&&in_array($v, $val->value))-->checked="checked"<!--@end-->/> {$v}</li>
|
||||
<!--@end-->
|
||||
</ul>
|
||||
<!--@end-->
|
||||
|
||||
<!--// 단일 선택 -->
|
||||
<!--@elseif($val->type == 'select')-->
|
||||
<select name="{$val->column_name}">
|
||||
<!--@if($val->default)-->
|
||||
<!--@foreach($val->default as $v)-->
|
||||
<option value="{$v}" <!--@if($v == $val->value)-->selected="selected"<!--@end-->>{$v}</option>
|
||||
<!--@end-->
|
||||
<!--@end-->
|
||||
</select>
|
||||
|
||||
<!--// 날짜 입력 -->
|
||||
<!--@elseif($val->type == 'date')-->
|
||||
<input type="hidden" name="{$val->column_name}" id="date_{$val->column_name}" value="{$val->value}" />
|
||||
<div class="display_date" id="str_{$val->column_name}">{zdate($val->value,"Y-m-d")}</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
DyCalendar.setup( { firstDay : 0, inputField : "date_{$val->column_name}", ifFormat : "%Y%m%d", displayArea : "str_{$val->column_name}", daFormat : "%Y-%m-%d"});
|
||||
</script>
|
||||
<!--@end-->
|
||||
|
||||
<!--@if($val->desc)-->
|
||||
<p>{$val->desc}</p>
|
||||
<!--@end-->
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
<!--// 이 파일은 extra_vars의 결과값을 출력하는 파일이며 다른 스킨에서 그대로 가져가서 css만 바꾸어 주면 된다 -->
|
||||
|
||||
<!--// 확장변수의 이름을 지정 -->
|
||||
{@ $val->column_name = "extra_vars".$key}
|
||||
|
||||
<!--// 확장변수의 값을 documentItem::getExtraValue로 가져옴 -->
|
||||
{@ $val->value = $oIssue->getExtraValue($key)}
|
||||
{@ $_tmp_value = array(); }
|
||||
|
||||
<!--// 일반 text -->
|
||||
<!--@if($val->type == 'text')-->
|
||||
{htmlspecialchars($val->value)}
|
||||
|
||||
<!--// 홈페이지 주소 -->
|
||||
<!--@elseif($val->type == 'homepage')-->
|
||||
<!--@if($val->value)-->
|
||||
<a href="{htmlspecialchars($val->value)}" onclick="window.open(this.href);return false;">{$val->value}</a>
|
||||
<!--@else-->
|
||||
|
||||
<!--@end-->
|
||||
|
||||
<!--// Email 주소 -->
|
||||
<!--@elseif($val->type == 'email_address')-->
|
||||
<!--@if($val->value)-->
|
||||
<a href="mailto:{htmlspecialchars($val->value)}">{$val->value}</a>
|
||||
<!--@else-->
|
||||
|
||||
<!--@end-->
|
||||
|
||||
<!--// 전화번호 -->
|
||||
<!--@elseif($val->type == 'tel')-->
|
||||
{htmlspecialchars($val->value[0])}
|
||||
<!--@if($val->value[1])-->-<!--@end-->
|
||||
{htmlspecialchars($val->value[1])}
|
||||
<!--@if($val->value[2])-->-<!--@end-->
|
||||
{htmlspecialchars($val->value[2])}
|
||||
|
||||
|
||||
<!--// textarea -->
|
||||
<!--@elseif($val->type == 'textarea')-->
|
||||
{nl2br(htmlspecialchars($val->value))}
|
||||
|
||||
|
||||
<!--// 다중 선택 -->
|
||||
<!--@elseif($val->type == 'checkbox')-->
|
||||
<!--@if(!is_array($val->value))-->{@ $val->value = array($val->value) }<!--@end-->
|
||||
<!--@foreach($val->value as $v)-->
|
||||
{@ $_tmp_value[] = htmlspecialchars($v)}
|
||||
<!--@end-->
|
||||
{implode(",",$_tmp_value)}
|
||||
|
||||
|
||||
<!--// 단일 선택 -->
|
||||
<!--@elseif($val->type == 'select')-->
|
||||
{htmlspecialchars($val->value)}
|
||||
|
||||
|
||||
<!--// 날짜 입력 -->
|
||||
<!--@elseif($val->type == 'date')-->
|
||||
{zdate($val->value,"Y-m-d")}
|
||||
|
||||
<!--@end-->
|
||||
|
||||
<!--@if(!$val->value)--> <!--@end-->
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
<filter name="delete_issue" module="issuetracker" act="procIssuetrackerDeleteIssue">
|
||||
<form>
|
||||
<node target="document_srl" required="true" />
|
||||
</form>
|
||||
<parameter>
|
||||
<param name="mid" target="mid" />
|
||||
<param name="page" target="page" />
|
||||
<param name="document_srl" target="document_srl" />
|
||||
</parameter>
|
||||
<response callback_func="completeDeleteIssue">
|
||||
<tag name="error" />
|
||||
<tag name="message" />
|
||||
<tag name="mid" />
|
||||
<tag name="page" />
|
||||
</response>
|
||||
</filter>
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
<filter name="delete_trackback" module="issuetracker" act="procIssuetrackerDeleteTrackback">
|
||||
<form>
|
||||
<node target="trackback_srl" required="true" />
|
||||
</form>
|
||||
<parameter>
|
||||
<param name="mid" target="mid" />
|
||||
<param name="page" target="page" />
|
||||
<param name="document_srl" target="document_srl" />
|
||||
<param name="trackback_srl" target="trackback_srl" />
|
||||
</parameter>
|
||||
<response callback_func="completeDeleteTrackback">
|
||||
<tag name="error" />
|
||||
<tag name="message" />
|
||||
<tag name="mid" />
|
||||
<tag name="document_srl" />
|
||||
<tag name="page" />
|
||||
</response>
|
||||
</filter>
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
<filter name="input_password" module="issuetracker" act="procIssuetrackerVerificationPassword" >
|
||||
<form>
|
||||
<node target="document_srl" required="true" />
|
||||
<node target="password" required="true" />
|
||||
</form>
|
||||
<parameter>
|
||||
<param name="mid" target="mid" />
|
||||
<param name="document_srl" target="document_srl" />
|
||||
<param name="comment_srl" target="comment_srl" />
|
||||
<param name="password" target="password" />
|
||||
</parameter>
|
||||
<response>
|
||||
<tag name="error" />
|
||||
<tag name="message" />
|
||||
</response>
|
||||
</filter>
|
||||
20
modules/issuetracker/skins/xe_issuetracker/filter/insert.xml
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
<filter name="insert" module="issuetracker" act="procIssuetrackerInsertIssue" confirm_msg_code="confirm_submit">
|
||||
<form>
|
||||
<node target="title" required="true" minlength="1" maxlength="250" />
|
||||
<node target="type_srl" required="true" />
|
||||
<node target="component_srl" required="true" />
|
||||
<node target="package_srl" required="true" />
|
||||
<node target="occured_version_srl" required="true" />
|
||||
<node target="nick_name" required="true" />
|
||||
<node target="password" required="true" />
|
||||
<node target="email_address" maxlength="250" />
|
||||
<node target="homepage" maxlength="250"/>
|
||||
<node target="content" required="true" />
|
||||
</form>
|
||||
<response callback_func="completeIssueInserted">
|
||||
<tag name="error" />
|
||||
<tag name="message" />
|
||||
<tag name="mid" />
|
||||
<tag name="document_srl" />
|
||||
</response>
|
||||
</filter>
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
<filter name="insert_history" module="issuetracker" act="procIssuetrackerInsertHistory" confirm_msg_code="confirm_submit">
|
||||
<form>
|
||||
<node target="milestone_srl" />
|
||||
<node target="priority_srl" required="true" />
|
||||
<node target="type_srl" required="true" />
|
||||
<node target="component_srl" required="true" />
|
||||
<node target="package_srl" required="true" />
|
||||
<node target="occured_version_srl" required="true" />
|
||||
<node target="action" />
|
||||
<node target="status" />
|
||||
<node target="assignee_srl" />
|
||||
<node target="nick_name" required="true" />
|
||||
<node target="password" required="true" />
|
||||
<node target="content" />
|
||||
</form>
|
||||
<response callback_func="completeHistoryInserted">
|
||||
<tag name="error" />
|
||||
<tag name="message" />
|
||||
<tag name="mid" />
|
||||
<tag name="document_srl" />
|
||||
</response>
|
||||
</filter>
|
||||
33
modules/issuetracker/skins/xe_issuetracker/header.html
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
<!--// JS 파일 로드 -->
|
||||
<!--%import("js/issuetracker.js")-->
|
||||
|
||||
<!--// 컬러셋 체크 -->
|
||||
<!--@if(!$module_info->colorset)-->
|
||||
{@$module_info->colorset = "white"}
|
||||
<!--@end-->
|
||||
|
||||
<!--// CSS 파일 로드 (컬러셋에 따라서) -->
|
||||
<!--%import("css/common.css")-->
|
||||
|
||||
<!--@if($module_info->colorset == "white")--> <!--%import("css/white.css")--> <!--@end-->
|
||||
|
||||
<!--@if($module_info->projectTitle)-->
|
||||
<div class="skinTitle">
|
||||
{$module_info->projectTitle}
|
||||
<!--@if($module_info->projectDescription)-->
|
||||
<blockquote>{nl2br($module_info->projectDescription)}</blockquote>
|
||||
<!--@end-->
|
||||
</div>
|
||||
<!--@end-->
|
||||
|
||||
|
||||
<div class="issueNav">
|
||||
<ul class="issueNav">
|
||||
|
||||
<!--@foreach($lang->project_menus as $key => $value)-->
|
||||
<li class="<!--@if($act==$key)-->selected<!--@else-->unselected<!--@end-->"><a href="{getUrl('','mid',$mid,'act',$key)}">{$value}</a></li>
|
||||
<!--@end-->
|
||||
|
||||
</ul>
|
||||
<div class="bottomLine"></div>
|
||||
</div>
|
||||
BIN
modules/issuetracker/skins/xe_issuetracker/images/bul.gif
Normal file
|
After Width: | Height: | Size: 111 B |
|
After Width: | Height: | Size: 337 B |
BIN
modules/issuetracker/skins/xe_issuetracker/images/closer.gif
Normal file
|
After Width: | Height: | Size: 337 B |
|
After Width: | Height: | Size: 216 B |
BIN
modules/issuetracker/skins/xe_issuetracker/images/file.gif
Normal file
|
After Width: | Height: | Size: 157 B |
BIN
modules/issuetracker/skins/xe_issuetracker/images/fileItem.gif
Normal file
|
After Width: | Height: | Size: 353 B |
BIN
modules/issuetracker/skins/xe_issuetracker/images/folder.gif
Normal file
|
After Width: | Height: | Size: 616 B |
|
After Width: | Height: | Size: 101 B |