| }␊ | 
| ␊ | 
| /**␊ | 
| * View the issues watch list of a given user.␊ | 
| * Limited to a specified project␊ | 
| */␊ | 
| public $watchList_precond = array('IDF_Precondition::accessIssues',␊ | 
| 'Pluf_Precondition::loginRequired');␊ | 
| public function watchList($request, $match)␊ | 
| {␊ | 
| $prj = $request->project;␊ | 
| $otags = $prj->getTagIdsByStatus('open');␊ | 
| $ctags = $prj->getTagIdsByStatus('closed');␊ | 
| if (count($otags) == 0) $otags[] = 0;␊ | 
| if (count($ctags) == 0) $ctags[] = 0;␊ | 
| ␊ | 
| // Get the id list of issue in the user watch list (for all projects !)␊ | 
| $db =& Pluf::db();␊ | 
| $issues_id = $db->select('SELECT GROUP_CONCAT(idf_issue_id) as id FROM '.Pluf::f('db_table_prefix', '').'idf_issue_pluf_user_assoc WHERE pluf_user_id='.$request->user->id.' GROUP BY pluf_user_id');␊ | 
| if (empty ($issues_id)) $issues_id = "";␊ | 
| else                    $issues_id = $issues_id[0]['id'];␊ | 
| ␊ | 
| // Count open and close issues␊ | 
| $sql = new Pluf_SQL('project=%s AND id IN ('.$issues_id.') AND status IN ('.implode(', ', $otags).')', array($prj->id));␊ | 
| $nb_open = Pluf::factory('IDF_Issue')->getCount(array('filter'=>$sql->gen()));␊ | 
| $sql = new Pluf_SQL('project=%s AND id IN ('.$issues_id.') AND status IN ('.implode(', ', $ctags).')', array($prj->id));␊ | 
| $nb_closed = Pluf::factory('IDF_Issue')->getCount(array('filter'=>$sql->gen()));␊ | 
| ␊ | 
| // Generate a filter for the paginator␊ | 
| switch ($match[2]) {␊ | 
| case 'closed':␊ | 
| $title = sprintf(__('Watch List: Closed Issues for %s'), (string) $prj);␊ | 
| $summary = __('This table shows the closed issues in your watch list for %s project.', (string) $prj);␊ | 
| $f_sql = new Pluf_SQL('project=%s AND id IN ('.$issues_id.') AND status IN ('.implode(', ', $ctags).')', array($prj->id));   ␊ | 
| break; ␊ | 
| case 'open':␊ | 
| default:␊ | 
| $title = sprintf(__('Watch List: Open Issues for %s'), (string) $prj);␊ | 
| $summary = __('This table shows the open issues in your watch list for %s project.', (string) $prj);␊ | 
| $f_sql = new Pluf_SQL('project=%s AND id IN ('.$issues_id.') AND status IN ('.implode(', ', $otags).')', array($prj->id));␊ | 
| break;  ␊ | 
| }␊ | 
| ␊ | 
| // Paginator to paginate the issues␊ | 
| $pag = new Pluf_Paginator(new IDF_Issue());␊ | 
| $pag->class = 'recent-issues';␊ | 
| $pag->item_extra_props = array('project_m' => $prj,␊ | 
| 'shortname' => $prj->shortname,␊ | 
| 'current_user' => $request->user);␊ | 
| $pag->summary = $summary;␊ | 
| $pag->forced_where = $f_sql;␊ | 
| $pag->action = array('IDF_Views_Issue::watchList', array($prj->shortname, $match[1]));␊ | 
| $pag->sort_order = array('modif_dtime', 'ASC'); // will be reverted␊ | 
| $pag->sort_reverse_order = array('modif_dtime');␊ | 
| $pag->sort_link_title = true;␊ | 
| $pag->extra_classes = array('a-c', '', 'a-c', '');␊ | 
| $list_display = array(␊ | 
| 'id' => __('Id'),␊ | 
| array('summary', 'IDF_Views_Issue_SummaryAndLabels', __('Summary')),␊ | 
| array('status', 'IDF_Views_Issue_ShowStatus', __('Status')),␊ | 
| array('modif_dtime', 'Pluf_Paginator_DateAgo', __('Last Updated')),␊ | 
| );␊ | 
| $pag->configure($list_display, array(), array('id', 'status', 'modif_dtime'));␊ | 
| $pag->items_per_page = 10;␊ | 
| $pag->no_results_text = __('No issues were found.');␊ | 
| $pag->setFromRequest($request);␊ | 
| return Pluf_Shortcuts_RenderToResponse('idf/issues/project-watchlist.html',␊ | 
| array('project' => $prj,␊ | 
| 'page_title' => $title,␊ | 
| 'open' => $nb_open,␊ | 
| 'closed' => $nb_closed,␊ | 
| 'issues' => $pag,␊ | 
| ),␊ | 
| $request);␊ | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * View the issues watch list of a given user.␊ | 
| * For all projects␊ | 
| */␊ | 
| public $forgeWatchList_precond = array('Pluf_Precondition::loginRequired');␊ | 
| public function forgeWatchList($request, $match)␊ | 
| {␊ | 
| $otags = array();␊ | 
| $ctags = array();␊ | 
| // Note that this approach does not scale, we will need to add␊ | 
| // a table to cache the meaning of the tags for large forges.␊ | 
| foreach (IDF_Views::getProjects($request->user) as $project) {␊ | 
| $otags = array_merge($otags, $project->getTagIdsByStatus('open'));␊ | 
| }␊ | 
| foreach (IDF_Views::getProjects($request->user) as $project) {␊ | 
| $ctags = array_merge($ctags, $project->getTagIdsByStatus('closed'));␊ | 
| }       ␊ | 
| if (count($otags) == 0) $otags[] = 0;␊ | 
| if (count($ctags) == 0) $ctags[] = 0;␊ | 
| ␊ | 
| // Get the id list of issue in the user watch list (for all projects !)␊ | 
| $db =& Pluf::db();␊ | 
| $issues_id = $db->select('SELECT GROUP_CONCAT(idf_issue_id) as id FROM '.Pluf::f('db_table_prefix', '').'idf_issue_pluf_user_assoc WHERE pluf_user_id='.$request->user->id.' GROUP BY pluf_user_id');␊ | 
| if (empty ($issues_id)) $issues_id = "";␊ | 
| else                    $issues_id = $issues_id[0]['id'];   ␊ | 
| ␊ | 
| // Count open and close issues␊ | 
| $sql = new Pluf_SQL('id IN ('.$issues_id.') AND status IN ('.implode(', ', $otags).')', array());␊ | 
| $nb_open = Pluf::factory('IDF_Issue')->getCount(array('filter'=>$sql->gen()));␊ | 
| $sql = new Pluf_SQL('id IN ('.$issues_id.') AND status IN ('.implode(', ', $ctags).')', array());␊ | 
| $nb_closed = Pluf::factory('IDF_Issue')->getCount(array('filter'=>$sql->gen()));␊ | 
| ␊ | 
| // Generate a filter for the paginator␊ | 
| switch ($match[1]) {␊ | 
| case 'closed':␊ | 
| $title = sprintf(__('Watch List: Closed Issues'));␊ | 
| $summary = __('This table shows the closed issues in your watch list.');␊ | 
| $f_sql = new Pluf_SQL('id IN ('.$issues_id.') AND status IN ('.implode(', ', $ctags).')', array());   ␊ | 
| break; ␊ | 
| case 'open':␊ | 
| default:␊ | 
| $title = sprintf(__('Watch List: Open Issues'));␊ | 
| $summary = __('This table shows the open issues in your watch list.');␊ | 
| $f_sql = new Pluf_SQL('id IN ('.$issues_id.') AND status IN ('.implode(', ', $otags).')', array());␊ | 
| break;  ␊ | 
| }␊ | 
| ␊ | 
| // Paginator to paginate the issues␊ | 
| $pag = new Pluf_Paginator(new IDF_Issue());␊ | 
| $pag->class = 'recent-issues';␊ | 
| $pag->item_extra_props = array('current_user' => $request->user);␊ | 
| $pag->summary = $summary;␊ | 
| $pag->forced_where = $f_sql;␊ | 
| $pag->action = array('IDF_Views_Issue::forgeWatchList', array($match[1]));␊ | 
| $pag->sort_order = array('modif_dtime', 'ASC'); // will be reverted␊ | 
| $pag->sort_reverse_order = array('modif_dtime');␊ | 
| $pag->sort_link_title = true;␊ | 
| $pag->extra_classes = array('a-c', '', 'a-c', '');␊ | 
| $list_display = array(␊ | 
| 'id' => __('Id'),␊ | 
| array('summary', 'IDF_Views_Issue_SummaryAndLabelsUnknownProject', __('Summary')),␊ | 
| array('project', 'Pluf_Paginator_FkToString', __('Project')),␊ | 
| array('status', 'IDF_Views_Issue_ShowStatus', __('Status')),␊ | 
| array('modif_dtime', 'Pluf_Paginator_DateAgo', __('Last Updated')),␊ | 
| );␊ | 
| $pag->configure($list_display, array(), array('id', 'project', 'status', 'modif_dtime'));␊ | 
| $pag->items_per_page = 10;␊ | 
| $pag->no_results_text = __('No issues were found.');␊ | 
| $pag->setFromRequest($request);␊ | 
| return Pluf_Shortcuts_RenderToResponse('idf/issues/forge-watchlist.html',␊ | 
| array('page_title' => $title,␊ | 
| 'open' => $nb_open,␊ | 
| 'closed' => $nb_closed,␊ | 
| 'issues' => $pag,␊ | 
| ),␊ | 
| $request);␊ | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * View the issues of a given user.␊ | 
| *␊ | 
| * Only open issues are shown.␊ | 
|  | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * When you access to your forge watch list, issue don't known␊ | 
| * the project shortname.␊ | 
| */␊ | 
| function IDF_Views_Issue_SummaryAndLabelsUnknownProject($field, $issue, $extra='')␊ | 
| {␊ | 
| $shortname = $issue->get_project()->shortname;␊ | 
| $issue->__set('shortname', $shortname);␊ | 
| return IDF_Views_Issue_SummaryAndLabels ($field, $issue, $extra);␊ | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * Display the summary of an issue, then on a new line, display the␊ | 
| * list of labels with a link to a view "by label only".␊ | 
| *␊ | 
|  | 
| {␊ | 
| return Pluf_esc($issue->get_status()->name);␊ | 
| }␊ | 
| ␊ | 
| ␊ |