function _render_link($renderer, $data) { $bootstrap = False; if ($this->getConf('redissue.theme') == 8) { $bootstrap = True; } $apiKey = $this->getConf('redissue.API'); if (empty($apiKey)) { $this->_render_default_link($renderer, $data); } else { $url = $this->getConf('redissue.url'); $client = new Redmine\Client($url, $apiKey); // Get Id user of the Wiki if Impersonate $view = $this->getConf('redissue.view'); if ($view == self::RI_IMPERSONATE) { $redUser = $_SERVER['REMOTE_USER']; // Attempt to collect information with this user $client->setImpersonateUser($redUser); } $issue = $client->api('issue')->show($data['id']); if ($issue) { // ALL_INFO --- Get Info from the Issue $project = $issue['issue']['project']; $project_identifier = $this->_project_identifier($client, $project['name']); $tracker = $issue['issue']['tracker']; $status = $issue['issue']['status']['name']; $author = $issue['issue']['author']; $assigned = $issue['issue']['assigned_to']; $subject = $issue['issue']['subject']; $description = $issue['issue']['description']; $done_ratio = $issue['issue']['done_ratio']; // RENDERER_MAIN_LINK ---- Get the Id Status $myStatusId = $issue['issue']['status']['id']; $statuses = $client->api('issue_status')->all(); // Browse existing statuses for ($i = 0; $i < count($statuses['issue_statuses']); $i++) { $foundStatus = $statuses['issue_statuses'][$i]; if ($foundStatus['id'] == $myStatusId) { // Get is_closed value $isClosed = $foundStatus['is_closed']; } } // If isClosed not empty, change css $this->_render_custom_link($renderer, $data, "[#" . $data['id'] . "] " . $subject, $bootstrap); // PRIORITIES --- Get priority and define color $priority = $issue['issue']['priority']; $id_priority = $priority['id']; $color_prio = $this->_color_prio($client, $id_priority); if (!$isClosed) { if ($bootstrap) { $renderer->doc .= ' <span class="label label-success">' . $status . '</span>'; } else { $renderer->doc .= ' <span class="badge-prio color-' . $color_prio . '">' . $priority['name'] . '</span>'; $renderer->doc .= ' <span class="badge-prio tracker">' . $tracker['name'] . '</span>'; $renderer->doc .= ' <span class="badge-prio open">' . $status . '</span>'; } } else { if ($bootstrap) { $renderer->doc .= ' <span class="label label-default">' . $status . '</span>'; } else { $renderer->doc .= ' <span class="badge-prio closed">' . $status . '</span>'; } } // GENERAL_RENDERER --- If all is ok if ($bootstrap) { $renderer->doc .= ' <span class="label label-' . $color_prio . '">' . $priority['name'] . '</span>'; $renderer->doc .= ' <span class="label label-primary">' . $tracker['name'] . '</span>'; $renderer->doc .= '<div class="well">'; $renderer->doc .= '<div class="issue-info"><dl class="dl-horizontal">'; $renderer->doc .= '<dt><icon class="glyphicon glyphicon-info-sign"> </icon>Projet :</dt>'; $renderer->doc .= '<dd><a href="' . $url . '/projects/' . $project_identifier . '">' . $project['name'] . '</a></dd>'; $renderer->doc .= '<dt>Auteur :</dt>'; $renderer->doc .= '<dd>' . $author['name'] . ' </dd>'; $renderer->doc .= '<dt>Assigné à :</dt>'; $renderer->doc .= '<dd>' . $assigned['name'] . ' </dd>'; $renderer->doc .= '</dl></div>'; // ./ Issue-info $renderer->doc .= '<h4>Description</h4><p>' . $description . '</p>'; $renderer->doc .= '<div class="progress">'; $renderer->doc .= '<span class="progress-bar" role="progressbar" aria-valuenow="70" aria-valuemin="0" aria-valuemax="100" style="width:' . $done_ratio . '%">'; $renderer->doc .= '<span class="doku">' . $done_ratio . '% Complete</span>'; $renderer->doc .= '</span></div>'; // ./progress $renderer->doc .= '</div>'; // ./ well if ($data['state'] != DOKU_LEXER_SPECIAL) { $renderer->doc .= '<div class ="issue-doku">'; } } else { //Not Bootstrap $renderer->doc .= '<div '; if ($data['short'] > 0) { $renderer->doc .= 'style="display:none;"'; } $renderer->doc .= 'class="issue-doku border-' . $color_prio . '">'; $renderer->doc .= '<div>'; $renderer->doc .= '<span><b>' . $this->getLang('redissue.project') . ' : </b></span>'; $renderer->doc .= '<a href="' . $url . '/projects/' . $project_identifier . '"> ' . $project['name'] . '</a>'; $renderer->doc .= '<span><b> ' . $this->getLang('redissue.author') . ' : </b></span>'; $renderer->doc .= '' . $author['name'] . ''; $renderer->doc .= '<br>'; $renderer->doc .= '<span><b> ' . $this->getLang('redissue.assigned') . ' :</b></span>'; $renderer->doc .= '<a> ' . $assigned['name'] . ' </a>'; $renderer->doc .= '</span></div>'; // ./ Issue-info $renderer->doc .= '<div class="issue-description">'; $renderer->doc .= '<h4>' . $this->getLang('redissue.desc') . ' :</h4>'; $renderer->doc .= '<p>' . $description . '</p>'; $renderer->doc .= '</div>'; $renderer->doc .= '<div class="progress">'; $renderer->doc .= '<span class="doku">' . $done_ratio . '% Complete</span>'; $renderer->doc .= '</div>'; // ./progress if ($data['state'] != DOKU_LEXER_SPECIAL) { $renderer->doc .= '<div class="description">'; } } } else { // If the user has no Rights $this->_render_default_link($renderer, $data); if ($data['state'] == DOKU_LEXER_SPECIAL or $data['state'] == DOKU_LEXER_ENTER) { $renderer->doc .= '<div><div class="norights">'; } } } }
function _render_project($renderer, $data) { $apiKey = $this->getConf('redproject.API'); $url = $this->getConf('redproject.url'); $client = new Redmine\Client($url, $apiKey); // Get Id user of the Wiki if Impersonate $view = $this->getConf('redproject.view'); if ($view == self::RI_IMPERSONATE) { $redUser = $_SERVER['REMOTE_USER']; // Attempt to collect information with this user $client->setImpersonateUser($redUser); } // Get Project Info $proj = $client->api('project')->show($data['proj']); if ($proj) { $projId = $proj['project']['id']; $projIdent = $proj['project']['identifier']; $projName = $proj['project']['name']; $projParent = $proj['project']['parent']; $nameParent = $projParent['name']; $parentId = $client->api('project')->getIdByName($nameParent); $parent = $client->api('project')->show($parentId); $parentIdent = $parent['project']['identifier']; $projHome = $proj['project']['homepage']; $projDesc = $proj['project']['description']; // RENDERER PROJECT INFO // Title $renderer->doc .= '<h2 class="title">Projet Redmine</h2>'; if ($projHome) { $renderer->doc .= '<div class="title">'; $renderer->doc .= '<a href="' . $projHome . '"><div class="circle">HOME</div></a>'; $renderer->doc .= '<div class="title-droite">'; $renderer->doc .= '<span class="info-title">' . $projName . '</span>'; $renderer->doc .= '<div class="see-it">'; $renderer->doc .= '<a href="' . $url . '/projects/' . $projIdent . '">See it in redmine</a>'; $renderer->doc .= '</div>'; // /.see-it $renderer->doc .= '</div>'; // /.title-droite $renderer->doc .= '</div>'; // /.title } else { $renderer->doc .= '<div class="title">'; $renderer->doc .= '<a href="' . $projHome . '" title="Add Homepage"><div class="circle">+</div></a>'; $renderer->doc .= '<div class="title-droite">'; $renderer->doc .= '<span class="info-title">' . $projName . '</span>'; $renderer->doc .= '<div class="see-it">'; $renderer->doc .= '<a href="' . $url . '/projects/' . $projIdent . '">See it in redmine</a>'; $renderer->doc .= '</div>'; // /.see-it $renderer->doc .= '</div>'; // /.title-droite $renderer->doc .= '</div>'; // /.title } // DESCRIPTION if ($projDesc == '') { $renderer->doc .= '<div class="desc"><h4>Description</h4> <p>' . $this->getLang('description') . '</p></div>'; } else { $renderer->doc .= '<div class="desc"><h4>Description</h4> <p class="desc"> ' . $projDesc . '</p></div>'; } // VERSIONS $versions = $client->api('version')->all($data['proj']); // Parsing Version if ($versions) { $renderer->doc .= '<div class="version"><h3>Versions</h3>'; $renderer->doc .= '<div class="panel-group" id="version-accordion-nb" role="tablist">'; for ($i = 0; $i < count($versions['versions']); $i++) { // Begin Accordion $renderer->doc .= '<div class="panel panel-primary descver">'; $foundVersion = $versions['versions'][$i]; $versionId = $foundVersion['id']; $renderer->doc .= '<div class="version panel-heading">'; $renderer->doc .= '<h4 class="panel-title">'; $renderer->doc .= '<a class="version" data-toggle="collapse" data-parent="#version-accordion-nb" href="#collapse-version-nb-' . $versionId . '">'; $renderer->doc .= '<span class="version">Version ' . $foundVersion['name'] . '</span> '; $renderer->doc .= '</a>'; $statusClass = $foundVersion['status'] == 'open' ? 'statusop' : 'statuscl'; $renderer->doc .= '<span class="' . $statusClass . '"> ' . $foundVersion['status'] . ' </span>'; $renderer->doc .= '</h4>'; // /.panel-title $renderer->doc .= '</div>'; // /.panel-heading $renderer->doc .= '<div id="collapse-version-nb-' . $versionId . '" class="panel-collapse collapse">'; // PANEL BODY $renderer->doc .= '<div class="panel-body">'; // Time Entries $createdOn = DateTime::createFromFormat(DateTime::ISO8601, $foundVersion['created_on']); $updatedOn = DateTime::createFromFormat(DateTime::ISO8601, $foundVersion['updated_on']); $renderer->doc .= '<p><b>Description :</b> ' . $foundVersion['description'] . '</p>'; $renderer->doc .= '<p><a href="' . $url . '/versions/' . $versionId . '">See this version in redmine</a></p>'; $renderer->doc .= '<p><b>' . $this->getLang('createdon') . '</b>' . $createdOn->format(DateTime::RFC850) . '</p>'; $renderer->doc .= '<p><b>' . $this->getLang('updatedon') . '</b>' . $updatedOn->format(DateTime::RFC850) . '</p>'; // Issues of Versions $issueTotal = $client->api('issue')->all(array('project_id' => $projId, 'status_id' => '*', 'fixed_version_id' => $foundVersion['id'], 'limit' => 1)); // Total issues & open $issueOpen = $client->api('issue')->all(array('project_id' => $projId, 'status_id' => 'open', 'fixed_version_id' => $foundVersion['id'], 'limit' => 1)); // Get percent version $diffIssue = $issueTotal['total_count'] - $issueOpen['total_count']; $progress = $this->getPercent($diffIssue, $issueTotal['total_count']); // renderer Progressbar $renderer->doc .= '<span class="col-md-3">'; $renderer->doc .= '<a href="' . $url . '/projects/' . $projIdent . '/issues">' . $issueTotal['total_count'] . ' issues (' . $diffIssue . ' closed - ' . $issueOpen['total_count'] . ' open)</a>'; $renderer->doc .= '</span>'; // /.col-md-3 $renderer->doc .= '<span class="col-md-6">'; $renderer->doc .= '<div class="progress">'; $renderer->doc .= '<span class="progress-bar" role="progressbar" aria-valuenow="70" aria-valuemin="0" aria-valuemax="100" style="width:' . $progress . '%">'; $renderer->doc .= '<span class="doku">' . $progress . '% Complete</span>'; $renderer->doc .= '</span></div>'; // ./progress $renderer->doc .= '</span>'; // ./col-md-6 $renderer->doc .= '</div>'; // /.panel-body $renderer->doc .= '</div>'; // /#collapse-version-nb-'.$versionId.' .panel-collapse $renderer->doc .= '</div>'; // /.panel .panel-default $renderer->doc .= '<br>'; } $renderer->doc .= '</div>'; // /.panel-group } else { $renderer->doc .= '<div class="version"><h3>Versions</h3>'; $renderer->doc .= $nbVersion . ' versions'; $renderer->doc .= 'div class="descver"><p>' . $this->getLang('noversion') . '</p></div>'; } $renderer->doc .= '</div>'; // DETAILS // Get Number of Version for ($v = 0; $v < count($versions['versions']); $v++) { $nbVersion = $v + 1; } // Get number of Issues $issueTotal = $client->api('issue')->all(array('project_id' => $projId, 'status_id' => '*', 'limit' => 1)); $issueOpen = $client->api('issue')->all(array('project_id' => $projId, 'status_id' => 'open', 'limit' => 1)); // Initialize Array $usersByRole = array(); $members = $client->api('membership')->all($projId); // Found each Members for ($m = 0; $m < count($members['memberships']); $m++) { // $z++; $memberFound = $members['memberships'][$m]; $currentUser = $memberFound['user']; for ($r = 0; $r < count($memberFound['roles']); $r++) { $currentRole = $memberFound['roles'][$r]; $roleId = $currentRole['id']; // If doesn't exist in usersByRole, create it if (!$usersByRole[$roleId]) { $currentRole['members'] = array($currentUser); $usersByRole[$roleId] = $currentRole; } else { array_push($usersByRole[$roleId]['members'], $currentUser); } } } // Renderer Details $renderer->doc .= '<div class="details">'; $renderer->doc .= '<h3>' . $this->getlang('hdetail') . '</h3>'; // Stats $renderer->doc .= '<div class="stats">'; if ($projParent == '') { $renderer->doc .= '<p>' . $this->getLang('mainproj') . '</p>'; } else { $renderer->doc .= '<p>' . $this->getLang('subproject') . ' <a href="' . $url . '/projects/' . $parentIdent . '">' . $nameParent . '</a></p>'; } $renderer->doc .= '<p>' . $this->getLang('tversion') . '<span class="label label-info">' . $nbVersion . '</span>' . $this->getLang('vversion') . '</p>'; $renderer->doc .= '<p><span class="label label-success">' . $issueTotal['total_count'] . '</span>' . $this->getLang('issues') . '<span class="label label-warning">' . $issueOpen['total_count'] . '</span>' . $this->getLang('open') . '</p>'; $renderer->doc .= '<p><span class="label label-info">' . $m . '</span>' . $this->getLang('membdetail') . '</p>'; $renderer->doc .= '</div>'; // /.stats $renderer->doc .= '</div>'; // /.details // MEMBERSHIPS & ROLES $langMembers = $this->getLang('membres'); $renderer->doc .= '<h3 class="member">' . $langMembers . '</h3>'; // Display new array usersByRole $renderer->doc .= '<div class="member">'; foreach ($usersByRole as $role => $currentRole) { $renderer->doc .= '<p class="member">' . $currentRole['name'] . ' : '; foreach ($currentRole['members'] as $who => $currentUser) { $userId = $currentUser['id']; $mailCurrentUser = $client->api('user')->show($userId); $mailUser = $mailCurrentUser['user']['mail']; $renderer->doc .= '<a href="mailto:' . $mailUser . '?Subject=Project ' . $projName . '"target="_top"><span> ' . $currentUser['name'] . '</span></a>'; } $renderer->doc .= '</p>'; } $renderer->doc .= '</div>'; } else { $renderer->doc .= '<div class="title"><img class="title" src="lib/plugins/redproject/images/home.png">Projet Privé</div><br>'; $renderer->doc .= '<div class="desc"><h3>Information</h3>' . $this->getLang('norights') . ' </p></div>'; } }