%PDF- %PDF-
Direktori : /www/loslex_o/tracker/ |
Current File : /www/loslex_o/tracker/bug_view_inc.php |
<?php # MantisBT - A PHP based bugtracking system # MantisBT is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # MantisBT is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with MantisBT. If not, see <http://www.gnu.org/licenses/>. /** * This include file prints out the bug information * * @package MantisBT * @copyright Copyright 2000 - 2002 Kenzaburo Ito - kenito@300baud.org * @copyright Copyright 2002 MantisBT Team - mantisbt-dev@lists.sourceforge.net * @link http://www.mantisbt.org * * @uses access_api.php * @uses authentication_api.php * @uses bug_api.php * @uses category_api.php * @uses columns_api.php * @uses compress_api.php * @uses config_api.php * @uses constant_inc.php * @uses current_user_api.php * @uses custom_field_api.php * @uses date_api.php * @uses event_api.php * @uses gpc_api.php * @uses helper_api.php * @uses html_api.php * @uses lang_api.php * @uses prepare_api.php * @uses print_api.php * @uses project_api.php * @uses string_api.php * @uses tag_api.php * @uses utility_api.php * @uses version_api.php */ if( !defined( 'BUG_VIEW_INC_ALLOW' ) ) { return; } require_api( 'access_api.php' ); require_api( 'authentication_api.php' ); require_api( 'bug_api.php' ); require_api( 'category_api.php' ); require_api( 'columns_api.php' ); require_api( 'compress_api.php' ); require_api( 'config_api.php' ); require_api( 'constant_inc.php' ); require_api( 'current_user_api.php' ); require_api( 'custom_field_api.php' ); require_api( 'date_api.php' ); require_api( 'event_api.php' ); require_api( 'gpc_api.php' ); require_api( 'helper_api.php' ); require_api( 'html_api.php' ); require_api( 'lang_api.php' ); require_api( 'prepare_api.php' ); require_api( 'print_api.php' ); require_api( 'project_api.php' ); require_api( 'string_api.php' ); require_api( 'tag_api.php' ); require_api( 'utility_api.php' ); require_api( 'version_api.php' ); require_css( 'status_config.php' ); $f_issue_id = gpc_get_int( 'id' ); $f_history = gpc_get_bool( 'history', config_get( 'history_default_visible' ) ); # compat variables for included pages $f_bug_id = $f_issue_id; $t_bug = $t_bug = bug_get( $f_bug_id, true ); $t_data = array( 'query' => array( 'id' => $f_issue_id ), 'options' => array( 'force_readonly' => $t_force_readonly ) ); $t_cmd = new IssueViewPageCommand( $t_data ); $t_result = $t_cmd->execute(); $t_issue = $t_result['issue']; $t_issue_view = $t_result['issue_view']; $t_flags = $t_result['flags']; compress_enable(); if( $t_show_page_header ) { layout_page_header( bug_format_summary( $f_issue_id, SUMMARY_CAPTION ), null, 'view-issue-page' ); layout_page_begin( 'view_all_bug_page.php' ); } $t_action_button_position = config_get( 'action_button_position' ); $t_bugslist = gpc_get_cookie( config_get_global( 'bug_list_cookie' ), false ); $t_top_buttons_enabled = !$t_force_readonly && ( $t_action_button_position == POSITION_TOP || $t_action_button_position == POSITION_BOTH ); $t_bottom_buttons_enabled = !$t_force_readonly && ( $t_action_button_position == POSITION_BOTTOM || $t_action_button_position == POSITION_BOTH ); # # Start of Template # echo '<div class="col-md-12 col-xs-12">'; echo '<div class="widget-box widget-color-blue2">'; echo '<div class="widget-header widget-header-small">'; echo '<h4 class="widget-title lighter">'; print_icon( 'fa-bars', 'ace-icon' ); echo string_display_line( $t_issue_view['form_title'] ); echo '</h4>'; echo '</div>'; echo '<div class="widget-body">'; echo '<div class="widget-toolbox padding-8 clearfix noprint">'; echo '<div class="btn-group pull-left">'; # Send Bug Reminder if( $t_flags['reminder_can_add'] ) { print_small_button( 'bug_reminder_page.php?bug_id=' . $f_issue_id, lang_get( 'bug_reminder' ) ); } if( isset( $t_issue_view['wiki_link'] ) ) { print_small_button( $t_issue_view['wiki_link'], lang_get( 'wiki' ) ); } # TODO: should be moved to command foreach ( $t_issue_view['links'] as $t_plugin => $t_hooks ) { foreach( $t_hooks as $t_hook ) { if( is_array( $t_hook ) ) { foreach( $t_hook as $t_label => $t_href ) { if( is_numeric( $t_label ) ) { print_bracket_link_prepared( $t_href ); } else { print_small_button( $t_href, $t_label ); } } } elseif( !empty( $t_hook ) ) { print_bracket_link_prepared( $t_hook ); } } } # Jump to Bugnotes print_small_button( '#bugnotes', lang_get( 'jump_to_bugnotes' ) ); # Display or Jump to History if( $t_flags['history_show'] ) { if( $f_history ) { $t_history_link = '#history'; $t_history_label = lang_get( 'jump_to_history' ); } else { $t_history_link = 'view.php?id=' . $f_issue_id . '&history=1#history'; $t_history_label = lang_get( 'display_history' ); } print_small_button( $t_history_link, $t_history_label ); } echo '</div>'; # prev/next links echo '<div class="btn-group pull-right">'; if( $t_bugslist ) { $t_bugslist = explode( ',', $t_bugslist ); $t_index = array_search( $f_issue_id, $t_bugslist ); if( false !== $t_index ) { if( isset( $t_bugslist[$t_index-1] ) ) { print_small_button( 'view.php?id='.$t_bugslist[$t_index-1], '<<' ); } if( isset( $t_bugslist[$t_index+1] ) ) { print_small_button( 'view.php?id='.$t_bugslist[$t_index+1], '>>' ); } } } echo '</div>'; echo '</div>'; echo '<div class="widget-main no-padding">'; echo '<div class="table-responsive">'; echo '<table class="table table-bordered table-condensed">'; if( $t_top_buttons_enabled ) { echo '<thead><tr class="bug-nav">'; echo '<tr class="top-buttons noprint">'; echo '<td colspan="6">'; bug_view_action_buttons( $f_issue_id, $t_flags ); echo '</td>'; echo '</tr>'; echo '</thead>'; } if( $t_bottom_buttons_enabled ) { echo '<tfoot>'; echo '<tr class="noprint"><td colspan="6">'; bug_view_action_buttons( $f_issue_id, $t_flags ); echo '</td></tr>'; echo '</tfoot>'; } echo '<tbody>'; if( $t_flags['id_show'] || $t_flags['project_show'] || $t_flags['category_show'] || $t_flags['view_state_show'] || $t_flags['created_at_show'] || $t_flags['updated_at_show'] ) { # Labels echo '<tr class="bug-header">'; echo '<th class="bug-id category" width="15%">', $t_flags['id_show'] ? lang_get( 'id' ) : '', '</th>'; echo '<th class="bug-project category" width="20%">', $t_flags['project_show'] ? lang_get( 'email_project' ) : '', '</th>'; echo '<th class="bug-category category" width="15%">', $t_flags['category_show'] ? lang_get( 'category' ) : '', '</th>'; echo '<th class="bug-view-status category" width="15%">', $t_flags['view_state_show'] ? lang_get( 'view_status' ) : '', '</th>'; echo '<th class="bug-date-submitted category" width="15%">', $t_flags['created_at_show'] ? lang_get( 'date_submitted' ) : '', '</th>'; echo '<th class="bug-last-modified category" width="20%">', $t_flags['updated_at_show'] ? lang_get( 'last_update' ) : '','</th>'; echo '</tr>'; echo '<tr class="bug-header-data">'; # Bug ID echo '<td class="bug-id">', $t_flags['id_show'] ? $t_issue_view['id_formatted'] : '', '</td>'; # Project echo '<td class="bug-project">', $t_flags['project_show'] && isset( $t_issue['project']['name'] ) ? string_display_line( $t_issue['project']['name'] ) : '', '</td>'; # Category echo '<td class="bug-category">', $t_flags['category_show'] && isset( $t_issue['category']['name'] ) ? string_display_line( $t_issue['category']['name'] ) : '', '</td>'; # View Status echo '<td class="bug-view-status">', $t_flags['view_state_show'] && isset( $t_issue['view_state']['label'] ) ? string_display_line( $t_issue['view_state']['label'] ) : '', '</td>'; # Date Submitted echo '<td class="bug-date-submitted">', $t_flags['created_at_show'] ? $t_issue_view['created_at'] : '', '</td>'; # Date Updated echo '<td class="bug-last-modified">', $t_flags['updated_at_show'] ? $t_issue_view['updated_at'] : '', '</td>'; echo '</tr>'; # spacer echo '<tr class="spacer"><td colspan="6"></td></tr>'; echo '<tr class="hidden"></tr>'; } # # Reporter, Handler, Due Date # if( $t_flags['reporter_show'] || $t_flags['handler_show'] || $t_flags['due_date_show'] ) { echo '<tr>'; $t_spacer = 0; # Reporter if( $t_flags['reporter_show'] ) { echo '<th class="bug-reporter category">', lang_get( 'reporter' ), '</th>'; echo '<td class="bug-reporter">'; print_user_with_subject( $t_issue['reporter']['id'], $f_issue_id ); echo '</td>'; } else { $t_spacer += 2; } # Handler if( $t_flags['handler_show'] ) { echo '<th class="bug-assigned-to category">', lang_get( 'assigned_to' ), '</th>'; echo '<td class="bug-assigned-to">'; if( isset( $t_issue['handler'] ) ) { print_user_with_subject( $t_issue['handler']['id'], $f_issue_id ); } echo '</td>'; } else { $t_spacer += 2; } # Due Date if( $t_flags['due_date_show'] ) { echo '<th class="bug-due-date category">', lang_get( 'due_date' ), '</th>'; $t_css = 'bug-due-date'; if( $t_issue_view['overdue'] !== false ) { $t_css .= ' due-' . $t_issue_view['overdue']; } echo '<td class="' . $t_css . '">', $t_issue_view['due_date'], '</td>'; } else { $t_spacer += 2; } if( $t_spacer > 0 ) { echo '<td colspan="', $t_spacer, '"> </td>'; } echo '</tr>'; } # # Priority, Severity, Reproducibility # if( $t_flags['priority_show'] || $t_flags['severity_show'] || $t_flags['reproducibility_show'] ) { echo '<tr>'; $t_spacer = 0; # Priority if( $t_flags['priority_show'] ) { echo '<th class="bug-priority category">', lang_get( 'priority' ), '</th>'; echo '<td class="bug-priority">', string_display_line( $t_issue['priority']['label'] ), '</td>'; } else { $t_spacer += 2; } # Severity if( $t_flags['severity_show'] ) { echo '<th class="bug-severity category">', lang_get( 'severity' ), '</th>'; echo '<td class="bug-severity">', string_display_line( $t_issue['severity']['label'] ), '</td>'; } else { $t_spacer += 2; } # Reproducibility if( $t_flags['reproducibility_show'] ) { echo '<th class="bug-reproducibility category">', lang_get( 'reproducibility' ), '</th>'; echo '<td class="bug-reproducibility">', string_display_line( $t_issue['reproducibility']['label'] ), '</td>'; } else { $t_spacer += 2; } # spacer if( $t_spacer > 0 ) { echo '<td colspan="', $t_spacer, '"> </td>'; } echo '</tr>'; } # # Status, Resolution # if( $t_flags['status_show'] || $t_flags['resolution_show'] ) { echo '<tr>'; $t_spacer = 2; # Status if( $t_flags['status_show'] ) { echo '<th class="bug-status category">', lang_get( 'status' ), '</th>'; # choose color based on status $t_status_css = html_get_status_css_fg( $t_issue['status']['id'] ); echo '<td class="bug-status">'; print_icon( 'fa-square', 'fa-status-box ' . $t_status_css ); echo ' ' . string_display_line( $t_issue['status']['label'] ), '</td>'; } else { $t_spacer += 2; } # Resolution if( $t_flags['resolution_show'] ) { echo '<th class="bug-resolution category">', lang_get( 'resolution' ), '</th>'; echo '<td class="bug-resolution">', string_display_line( $t_issue['resolution']['label'] ), '</td>'; } else { $t_spacer += 2; } # spacer if( $t_spacer > 0 ) { echo '<td colspan="', $t_spacer, '"> </td>'; } echo '</tr>'; } # # Projection, ETA # if( $t_flags['projection_show'] || $t_flags['eta_show'] ) { echo '<tr>'; $t_spacer = 2; if( $t_flags['projection_show'] ) { # Projection echo '<th class="bug-projection category">', lang_get( 'projection' ), '</th>'; echo '<td class="bug-projection">', string_display_line( $t_issue['projection']['label'] ), '</td>'; } else { $t_spacer += 2; } # ETA if( $t_flags['eta_show'] ) { echo '<th class="bug-eta category">', lang_get( 'eta' ), '</th>'; echo '<td class="bug-eta">', string_display_line( $t_issue['eta']['label'] ), '</td>'; } else { $t_spacer += 2; } echo '<td colspan="', $t_spacer, '"> </td>'; echo '</tr>'; } # # Platform, OS, OS Version # if( ( $t_flags['profiles_platform_show'] && isset( $t_issue['platform'] ) && !is_blank( $t_issue['platform'] ) ) || ( $t_flags['profiles_os_show'] && isset( $t_issue['os'] ) && !is_blank( $t_issue['os'] ) ) || ( $t_flags['profiles_os_build_show'] && isset( $t_issue['os_build'] ) && !is_blank( $t_issue['os_build'] ) ) ) { $t_spacer = 0; echo '<tr>'; # Platform if( $t_flags['profiles_platform_show'] && isset( $t_issue['platform'] ) && !is_blank( $t_issue['platform'] ) ) { echo '<th class="bug-platform category">', lang_get( 'platform' ), '</th>'; echo '<td class="bug-platform">', string_display_line( $t_issue['platform'] ), '</td>'; } else { $t_spacer += 2; } # Operating System if( $t_flags['profiles_os_show'] && isset( $t_issue['os'] ) && !is_blank( $t_issue['os'] ) ) { echo '<th class="bug-os category">', lang_get( 'os' ), '</th>'; echo '<td class="bug-os">', string_display_line( $t_issue['os'] ), '</td>'; } else { $t_spacer += 2; } # OS Version if( $t_flags['profiles_os_build_show'] && isset( $t_issue['os_build'] ) && !is_blank( $t_issue['os_build'] ) ) { echo '<th class="bug-os-build category">', lang_get( 'os_build' ), '</th>'; echo '<td class="bug-os-build">', string_display_line( $t_issue['os_build'] ), '</td>'; } else { $t_spacer += 2; } if( $t_spacer > 0 ) { echo '<td colspan="', $t_spacer, '"> </td>'; } echo '</tr>'; } # # Product Version, Product Build # if( ( $t_flags['versions_product_version_show'] && isset( $t_issue['version'] ) ) || ( $t_flags['versions_product_build_show'] && isset( $t_issue['build'] ) ) ) { $t_spacer = 2; echo '<tr>'; # Product Version if( $t_flags['versions_product_version_show'] && isset( $t_issue['version'] ) ) { echo '<th class="bug-product-version category">', lang_get( 'product_version' ), '</th>'; echo '<td class="bug-product-version">', string_display_line( $t_issue_view['product_version'] ), '</td>'; } else { $t_spacer += 2; } # Product Build if( $t_flags['versions_product_build_show'] && isset( $t_issue['build'] ) ) { echo '<th class="bug-product-build category">', lang_get( 'product_build' ), '</th>'; echo '<td class="bug-product-build">', string_display_line( $t_issue['build'] ), '</td>'; } else { $t_spacer += 2; } # spacer echo '<td colspan="', $t_spacer, '"> </td>'; echo '</tr>'; } # # Target Version, Fixed In Version # if( ( $t_flags['versions_target_version_show'] && isset( $t_issue['target_version'] ) ) || ( $t_flags['versions_fixed_in_version_show'] && isset( $t_issue['fixed_in_version'] ) ) ) { $t_spacer = 2; echo '<tr>'; # target version if( $t_flags['versions_target_version_show'] && isset( $t_issue['target_version'] ) ) { # Target Version echo '<th class="bug-target-version category">', lang_get( 'target_version' ), '</th>'; echo '<td class="bug-target-version">', string_display_line( $t_issue_view['target_version'] ), '</td>'; } else { $t_spacer += 2; } # fixed in version if( $t_flags['versions_fixed_in_version_show'] && isset( $t_issue['fixed_in_version'] ) ) { echo '<th class="bug-fixed-in-version category">', lang_get( 'fixed_in_version' ), '</th>'; echo '<td class="bug-fixed-in-version">', string_display_line( $t_issue_view['fixed_in_version'] ), '</td>'; } else { $t_spacer += 2; } # spacer echo '<td colspan="', $t_spacer, '"> </td>'; echo '</tr>'; } # # Bug Details Event Signal # event_signal( 'EVENT_VIEW_BUG_DETAILS', array( $f_issue_id ) ); # spacer echo '<tr class="spacer"><td colspan="6"></td></tr>'; echo '<tr class="hidden"></tr>'; # # Bug Details (screen wide fields) # # Summary if( $t_flags['summary_show'] && isset( $t_issue['summary'] ) ) { echo '<tr>'; echo '<th class="bug-summary category">', lang_get( 'summary' ), '</th>'; echo '<td class="bug-summary" colspan="5">', bug_format_summary( $f_issue_id, SUMMARY_FIELD ), '</td>'; echo '</tr>'; } # Description if( $t_flags['description_show'] && isset( $t_issue['description'] ) ) { echo '<tr>'; echo '<th class="bug-description category">', lang_get( 'description' ), '</th>'; echo '<td class="bug-description" colspan="5">', string_display_links( $t_issue['description'] ), '</td>'; echo '</tr>'; } # Steps to Reproduce if( $t_flags['steps_to_reproduce_show'] && isset( $t_issue['steps_to_reproduce'] ) ) { echo '<tr>'; echo '<th class="bug-steps-to-reproduce category">', lang_get( 'steps_to_reproduce' ), '</th>'; echo '<td class="bug-steps-to-reproduce" colspan="5">', string_display_links( $t_issue['steps_to_reproduce'] ), '</td>'; echo '</tr>'; } # Additional Information if( $t_flags['additional_information_show'] && isset( $t_issue['additional_information'] ) ) { echo '<tr>'; echo '<th class="bug-additional-information category">', lang_get( 'additional_information' ), '</th>'; echo '<td class="bug-additional-information" colspan="5">', string_display_links( $t_issue['additional_information'] ), '</td>'; echo '</tr>'; } # Tagging if( $t_flags['tags_show'] ) { echo '<tr>'; echo '<th class="bug-tags category">', lang_get( 'tags' ), '</th>'; echo '<td class="bug-tags" colspan="5">'; tag_display_attached( $f_issue_id ); echo '</td></tr>'; } # Attach Tags if( $t_flags['tags_can_attach'] ) { echo '<tr class="noprint">'; echo '<th class="bug-attach-tags category">', lang_get( 'tag_attach_long' ), '</th>'; echo '<td class="bug-attach-tags" colspan="5">'; print_tag_attach_form( $f_issue_id ); echo '</td></tr>'; } # spacer echo '<tr class="spacer"><td colspan="6"></td></tr>'; echo '<tr class="hidden"></tr>'; # Custom Fields if( isset( $t_issue['custom_fields'] ) ) { foreach( $t_issue['custom_fields'] as $t_custom_field ) { $t_def = custom_field_get_definition( $t_custom_field['field']['id'] ); echo '<tr>'; echo '<th class="bug-custom-field category">', string_display_line( lang_get_defaulted( $t_def['name'] ) ), '</th>'; echo '<td class="bug-custom-field" colspan="5">'; print_custom_field_value( $t_def, $t_custom_field['field']['id'], $f_issue_id ); echo '</td></tr>'; } # spacer echo '<tr class="spacer"><td colspan="6"></td></tr>'; echo '<tr class="hidden"></tr>'; } echo '</tbody></table>'; echo '</div></div></div></div></div>'; # User list sponsoring the bug if( $t_flags['sponsorships_show'] ) { define( 'BUG_SPONSORSHIP_LIST_VIEW_INC_ALLOW', true ); include( $t_mantis_dir . 'bug_sponsorship_list_view_inc.php' ); } # Bug Relationships if( $t_flags['relationships_show'] ) { bug_view_relationship_view_box( $f_issue_id, /* can_update */ $t_flags['relationships_can_update'] ); } # User list monitoring the bug if( $t_flags['monitor_show'] ) { echo '<div class="col-md-12 col-xs-12">'; echo '<a id="monitors"></a>'; echo '<div class="space-10"></div>'; $t_collapse_block = is_collapsed( 'monitoring' ); $t_block_css = $t_collapse_block ? 'collapsed' : ''; $t_block_icon = $t_collapse_block ? 'fa-chevron-down' : 'fa-chevron-up'; ?> <div id="monitoring" class="widget-box widget-color-blue2 <?php echo $t_block_css ?>"> <div class="widget-header widget-header-small"> <h4 class="widget-title lighter"> <?php print_icon( 'fa-users', 'ace-icon' ); ?> <?php echo lang_get( 'users_monitoring_bug' ) ?> </h4> <div class="widget-toolbar"> <a data-action="collapse" href="#"> <?php print_icon( $t_block_icon, '1 ace-icon bigger-125' ); ?> </a> </div> </div> <div class="widget-body"> <div class="widget-main no-padding"> <div class="table-responsive"> <table class="table table-bordered table-condensed table-striped"> <tr> <th class="category" width="15%"> <?php echo lang_get( 'monitoring_user_list' ); ?> </th> <td> <?php if( !isset( $t_issue['monitors'] ) || count( $t_issue['monitors'] ) == 0 ) { echo lang_get( 'no_users_monitoring_bug' ); } else { $t_first_user = true; foreach( $t_issue['monitors'] as $t_monitor_user ) { if( $t_first_user ) { $t_first_user = false; } else { echo ', '; } print_user( $t_monitor_user['id'] ); if( $t_flags['monitor_can_delete'] ) { echo ' <a class="btn btn-xs btn-primary btn-white btn-round" ' . 'href="' . helper_mantis_url( 'bug_monitor_delete.php' ) . '?bug_id=' . $f_issue_id . '&user_id=' . $t_monitor_user['id'] . htmlspecialchars(form_security_param( 'bug_monitor_delete' )) . '">' . icon_get( 'fa-times' ) . '</a>'; } } } if( $t_flags['monitor_can_add'] ) { ?> <br /><br /> <form method="post" action="bug_monitor_add.php" class="form-inline noprint"> <?php echo form_security_field( 'bug_monitor_add' ) ?> <input type="hidden" name="bug_id" value="<?php echo (integer)$f_issue_id; ?>" /> <input type="text" class="input-sm" id="bug_monitor_list_user_to_add" name="user_to_add" /> <input type="submit" class="btn btn-primary btn-sm btn-white btn-round" value="<?php echo lang_get( 'add' ) ?>" /> </form> <?php } ?> </td> </tr> </table> </div> </div> </div> </div> </div> <?php } # Bugnotes and "Add Note" box if( 'ASC' == current_user_get_pref( 'bugnote_order' ) ) { define( 'BUGNOTE_VIEW_INC_ALLOW', true ); include( $t_mantis_dir . 'bugnote_view_inc.php' ); if( !$t_force_readonly ) { define( 'BUGNOTE_ADD_INC_ALLOW', true ); include( $t_mantis_dir . 'bugnote_add_inc.php' ); } } else { if( !$t_force_readonly ) { define( 'BUGNOTE_ADD_INC_ALLOW', true ); include( $t_mantis_dir . 'bugnote_add_inc.php' ); } define( 'BUGNOTE_VIEW_INC_ALLOW', true ); include( $t_mantis_dir . 'bugnote_view_inc.php' ); } # Allow plugins to display stuff after notes event_signal( 'EVENT_VIEW_BUG_EXTRA', array( $f_issue_id ) ); # Time tracking statistics if( config_get( 'time_tracking_enabled' ) && access_has_bug_level( config_get( 'time_tracking_view_threshold' ), $f_issue_id ) ) { define( 'BUGNOTE_STATS_INC_ALLOW', true ); include( $t_mantis_dir . 'bugnote_stats_inc.php' ); } # History if( $t_flags['history_show'] && $f_history ) { ?> <div class="col-md-12 col-xs-12"> <a id="history"></a> <div class="space-10"></div> <?php $t_collapse_block = is_collapsed( 'history' ); $t_block_css = $t_collapse_block ? 'collapsed' : ''; $t_block_icon = $t_collapse_block ? 'fa-chevron-down' : 'fa-chevron-up'; $t_history = history_get_events_array( $f_issue_id ); ?> <div id="history" class="widget-box widget-color-blue2 <?php echo $t_block_css ?>"> <div class="widget-header widget-header-small"> <h4 class="widget-title lighter"> <?php print_icon( 'fa-history', 'ace-icon' ); ?> <?php echo lang_get( 'bug_history' ) ?> </h4> <div class="widget-toolbar"> <a data-action="collapse" href="#"> <?php print_icon( $t_block_icon, '1 ace-icon bigger-125' ); ?> </a> </div> </div> <div class="widget-body"> <div class="widget-main no-padding"> <div class="table-responsive"> <table class="table table-bordered table-condensed table-hover table-striped"> <thead> <tr> <th class="small-caption"> <?php echo lang_get( 'date_modified' ) ?> </th> <th class="small-caption"> <?php echo lang_get( 'username' ) ?> </th> <th class="small-caption"> <?php echo lang_get( 'field' ) ?> </th> <th class="small-caption"> <?php echo lang_get( 'change' ) ?> </th> </tr> </thead> <tbody> <?php foreach( $t_history as $t_item ) { ?> <tr> <td class="small-caption"> <?php echo $t_item['date'] ?> </td> <td class="small-caption"> <?php print_user( $t_item['userid'] ) ?> </td> <td class="small-caption"> <?php echo string_display_line( $t_item['note'] ) ?> </td> <td class="small-caption"> <?php echo ( $t_item['raw'] ? string_display_line_links( $t_item['change'] ) : $t_item['change'] ) ?> </td> </tr> <?php } # end for loop ?> </tbody> </table> </div> </div> </div> </div> </div> <?php } layout_page_end(); /** * return formatted string with all the details on the requested relationship * @param integer $p_bug_id A bug identifier. * @param BugRelationshipData $p_relationship A bug relationship object. * @param boolean $p_html_preview Whether to include style/hyperlinks - if preview is false, we prettify the output. * @param boolean $p_show_project Show Project details. * @return string */ function bug_view_relationship_get_details( $p_bug_id, BugRelationshipData $p_relationship, $p_html_preview = false, $p_show_project = false ) { if( $p_bug_id == $p_relationship->src_bug_id ) { # root bug is in the source side, related bug in the destination side $t_related_project_id = $p_relationship->dest_bug_id; $t_related_project_name = project_get_name( $p_relationship->dest_project_id ); $t_related_bug_id = $p_relationship->dest_bug_id; $t_relationship_descr = relationship_get_description_src_side( $p_relationship->type ); } else { # root bug is in the dest side, related bug in the source side $t_related_project_id = $p_relationship->src_bug_id; $t_related_bug_id = $p_relationship->src_bug_id; $t_related_project_name = project_get_name( $p_relationship->src_project_id ); $t_relationship_descr = relationship_get_description_dest_side( $p_relationship->type ); } # related bug not existing... if( !bug_exists( $t_related_bug_id ) ) { return ''; } # user can access to the related bug at least as a viewer if( !access_has_bug_level( config_get( 'view_bug_threshold', null, null, $t_related_project_id ), $t_related_bug_id ) ) { return ''; } if( $p_html_preview == false ) { $t_td = '<td>'; } else { $t_td = '<td class="print">'; } # get the information from the related bug and prepare the link $t_bug = bug_get( $t_related_bug_id, false ); $t_status_string = get_enum_element( 'status', $t_bug->status, auth_get_current_user_id(), $t_bug->project_id ); $t_resolution_string = get_enum_element( 'resolution', $t_bug->resolution, auth_get_current_user_id(), $t_bug->project_id ); $t_relationship_info_html = $t_td . string_no_break( $t_relationship_descr ) . ' </td>'; if( $p_html_preview == false ) { # choose color based on status $t_status_css = html_get_status_css_fg( $t_bug->status, auth_get_current_user_id(), $t_bug->project_id ); $t_relationship_info_html .= '<td><a href="' . string_get_bug_view_url( $t_related_bug_id ) . '">' . string_display_line( bug_format_id( $t_related_bug_id ) ) . '</a></td>'; $t_relationship_info_html .= '<td>' . icon_get( 'fa-square', 'fa-status-box ' . $t_status_css ); $t_relationship_info_html .= ' <span class="issue-status" title="' . string_attribute( $t_resolution_string ) . '">' . string_display_line( $t_status_string ) . '</span></td>'; } else { $t_relationship_info_html .= $t_td . string_display_line( bug_format_id( $t_related_bug_id ) ) . '</td>'; $t_relationship_info_html .= $t_td . string_display_line( $t_status_string ) . ' </td>'; } # get the handler name of the related bug $t_relationship_info_html .= $t_td; if( $t_bug->handler_id > 0 ) { $t_relationship_info_html .= string_no_break( prepare_user_name( $t_bug->handler_id ) ); } $t_relationship_info_html .= ' </td>'; # add project name if( $p_show_project ) { $t_relationship_info_html .= $t_td . string_display_line( $t_related_project_name ) . ' </td>'; } # add summary $t_relationship_info_html .= $t_td . string_display_line_links( $t_bug->summary ); if( VS_PRIVATE == $t_bug->view_state ) { $t_relationship_info_html .= icon_get( 'fa-lock', '', lang_get( 'private' ) ); } # add delete link if bug not read only and user has access level if( !bug_is_readonly( $p_bug_id ) && !current_user_is_anonymous() && ( $p_html_preview == false ) ) { if( access_has_bug_level( config_get( 'update_bug_threshold' ), $p_bug_id ) ) { $t_relationship_info_html .= ' <a class="red noprint zoom-130"' . 'href="bug_relationship_delete.php?bug_id=' . $p_bug_id . '&rel_id=' . $p_relationship->id . htmlspecialchars( form_security_param( 'bug_relationship_delete' ) ) . '">' . icon_get( 'fa-trash-o', 'ace-icon bigger-115' ) . '</a>'; } } $t_relationship_info_html .= ' </td>'; $t_relationship_info_html = '<tr>' . $t_relationship_info_html . '</tr>'; return $t_relationship_info_html; } /** * print ALL the RELATIONSHIPS OF A SPECIFIC BUG * @param integer $p_bug_id A bug identifier. * @return string */ function bug_view_relationship_get_summary_html( $p_bug_id ) { $t_summary = ''; # A variable that will be set by the following call to indicate if relationships belong # to multiple projects. $t_show_project = false; $t_relationship_all = relationship_get_all( $p_bug_id, $t_show_project ); $t_relationship_all_count = count( $t_relationship_all ); # prepare the relationships table for( $i = 0; $i < $t_relationship_all_count; $i++ ) { $t_summary .= bug_view_relationship_get_details( $p_bug_id, $t_relationship_all[$i], /* html_preview */ false, $t_show_project ); } if( !is_blank( $t_summary ) ) { if( relationship_can_resolve_bug( $p_bug_id ) == false ) { $t_summary .= '<tr><td colspan="' . ( 5 + $t_show_project ) . '"><strong>' . lang_get( 'relationship_warning_blocking_bugs_not_resolved' ) . '</strong></td></tr>'; } $t_summary = '<table class="table table-bordered table-condensed table-hover">' . $t_summary . '</table>'; } return $t_summary; } /** * print HTML relationship form * @param integer $p_bug_id A bug identifier. * @param bool $p_can_update Can update relationships? * @return void */ function bug_view_relationship_view_box( $p_bug_id, $p_can_update ) { $t_relationships_html = bug_view_relationship_get_summary_html( $p_bug_id ); if( !$p_can_update && empty( $t_relationships_html ) ) { return; } $t_relationship_graph = ON == config_get( 'relationship_graph_enable' ); $t_event_buttons = event_signal( 'EVENT_MENU_ISSUE_RELATIONSHIP', $p_bug_id ); $t_show_top_div = $p_can_update || $t_relationship_graph || !empty( $t_event_buttons ); ?> <div class="col-md-12 col-xs-12"> <div class="space-10"></div> <?php $t_collapse_block = is_collapsed( 'relationships' ); $t_block_css = $t_collapse_block ? 'collapsed' : ''; $t_block_icon = $t_collapse_block ? 'fa-chevron-down' : 'fa-chevron-up'; ?> <div id="relationships" class="widget-box widget-color-blue2 <?php echo $t_block_css ?>"> <div class="widget-header widget-header-small"> <h4 class="widget-title lighter"> <?php print_icon( 'fa-sitemap', 'ace-icon' ); ?> <?php echo lang_get( 'bug_relationships' ) ?> </h4> <div class="widget-toolbar"> <a data-action="collapse" href="#"> <?php print_icon( $t_block_icon, '1 ace-icon bigger-125' ); ?> </a> </div> </div> <div class="widget-body"> <?php if( $t_show_top_div ) { ?> <div class="widget-toolbox padding-8 clearfix"> <?php # Default relationship buttons $t_buttons = array(); if( $t_relationship_graph ) { $t_buttons[lang_get( 'relation_graph' )] = 'bug_relationship_graph.php?bug_id=' . $p_bug_id . '&graph=relation'; $t_buttons[lang_get( 'dependency_graph' )] = 'bug_relationship_graph.php?bug_id=' . $p_bug_id . '&graph=dependency'; } # Plugin-added buttons foreach( $t_event_buttons as $t_plugin => $t_plugin_buttons ) { foreach( $t_plugin_buttons as $t_callback => $t_callback_buttons ) { if( is_array( $t_callback_buttons ) ) { $t_buttons = array_merge( $t_buttons, $t_callback_buttons ); } } } ?> <div class="btn-group pull-right noprint"> <?php # Print the buttons, if any foreach( $t_buttons as $t_label => $t_url ) { print_small_button( $t_url, $t_label ); } ?> </div> <?php if( $p_can_update ) { ?> <form method="post" action="bug_relationship_add.php" class="form-inline noprint"> <?php echo form_security_field( 'bug_relationship_add' ) ?> <input type="hidden" name="src_bug_id" value="<?php echo $p_bug_id?>" /> <label class="inline"><?php echo lang_get( 'this_bug' ) ?>  </label> <?php print_relationship_list_box( config_get( 'default_bug_relationship' ) )?> <input type="text" class="input-sm" name="dest_bug_id" value="" /> <input type="submit" class="btn btn-primary btn-sm btn-white btn-round" name="add_relationship" value="<?php echo lang_get( 'add' )?>" /> </form> <?php } # can update ?> </div> <?php } # show top div ?> <div class="widget-main no-padding"> <div class="table-responsive"> <?php echo $t_relationships_html; ?> </div> </div> </div> </div> </div> <?php } /** * Print Change Status to: button * This code is similar to print_status_option_list except * there is no masking, except for the current state * * @param BugData $p_bug A valid bug object. * @return void */ function bug_view_button_bug_change_status( BugData $p_bug ) { $t_current_access = access_get_project_level( $p_bug->project_id ); $t_enum_list = get_status_option_list( $t_current_access, $p_bug->status, false, # Add close if user is bug's reporter, still has rights to report issues # (to prevent users downgraded to viewers from updating issues) and # reporters are allowed to close their own issues ( bug_is_user_reporter( $p_bug->id, auth_get_current_user_id() ) && access_has_bug_level( config_get( 'report_bug_threshold' ), $p_bug->id ) && ON == config_get( 'allow_reporter_close' ) ), $p_bug->project_id ); if( count( $t_enum_list ) > 0 ) { # resort the list into ascending order after noting the key from the first element (the default) $t_default = key( $t_enum_list ); ksort( $t_enum_list ); echo '<form method="post" action="bug_change_status_page.php" class="form-inline">'; # CSRF protection not required here - form does not result in modifications $t_button_text = lang_get( 'bug_status_to_button' ); echo '<input type="submit" class="btn btn-primary btn-sm btn-white btn-round" value="' . $t_button_text . '" />'; echo ' <select name="new_status" class="input-sm">'; # space at beginning of line is important foreach( $t_enum_list as $t_key => $t_val ) { echo '<option value="' . $t_key . '" '; check_selected( $t_key, $t_default ); echo '>' . $t_val . '</option>'; } echo '</select>'; $t_bug_id = string_attribute( $p_bug->id ); echo '<input type="hidden" name="id" value="' . $t_bug_id . '" />' . "\n"; echo '<input type="hidden" name="change_type" value="' . BUG_UPDATE_TYPE_CHANGE_STATUS . '" />' . "\n"; echo '</form>' . "\n"; } } /** * Print Assign To: combo box of possible handlers * @param BugData $p_bug Bug object. * @return void */ function bug_view_button_bug_assign_to( BugData $p_bug ) { $t_current_user_id = auth_get_current_user_id(); $t_options = array(); $t_default_assign_to = null; if( ( $p_bug->handler_id != $t_current_user_id ) && access_has_bug_level( config_get( 'handle_bug_threshold' ), $p_bug->id, $t_current_user_id ) ) { $t_options[] = array( $t_current_user_id, '[' . lang_get( 'myself' ) . ']', ); $t_default_assign_to = $t_current_user_id; } if( ( $p_bug->handler_id != $p_bug->reporter_id ) && user_exists( $p_bug->reporter_id ) && access_has_bug_level( config_get( 'handle_bug_threshold' ), $p_bug->id, $p_bug->reporter_id ) ) { $t_options[] = array( $p_bug->reporter_id, '[' . lang_get( 'reporter' ) . ']', ); if( $t_default_assign_to === null ) { $t_default_assign_to = $p_bug->reporter_id; } } echo '<form method="post" action="bug_update.php" class="form-inline">'; echo form_security_field( 'bug_update' ); echo '<input type="hidden" name="last_updated" value="' . $p_bug->last_updated . '" />'; echo '<input type="hidden" name="action_type" value="' . BUG_UPDATE_TYPE_ASSIGN . '" />'; $t_button_text = lang_get( 'bug_assign_to_button' ); echo '<input type="submit" class="btn btn-primary btn-sm btn-white btn-round" value="' . $t_button_text . '" />'; echo ' <select class="input-sm" name="handler_id">'; # space at beginning of line is important $t_already_selected = false; foreach( $t_options as $t_entry ) { $t_id = (int)$t_entry[0]; $t_caption = string_attribute( $t_entry[1] ); # if current user and reporter can't be selected, then select the first # user in the list. if( $t_default_assign_to === null ) { $t_default_assign_to = $t_id; } echo '<option value="' . $t_id . '" '; if( ( $t_id == $t_default_assign_to ) && !$t_already_selected ) { check_selected( $t_id, $t_default_assign_to ); $t_already_selected = true; } echo '>' . $t_caption . '</option>'; } # allow un-assigning if already assigned. if( $p_bug->handler_id != 0 ) { echo '<option value="0"></option>'; } # 0 means currently selected print_assign_to_option_list( 0, $p_bug->project_id ); echo '</select>'; $t_bug_id = string_attribute( $p_bug->id ); echo '<input type="hidden" name="bug_id" value="' . $t_bug_id . '" />' . "\n"; echo '</form>' . "\n"; } /** * Print all buttons for view bug pages * @param integer $p_bug_id A valid bug identifier. * @param array $p_flags Flags from issue view command * @return void */ function bug_view_action_buttons( $p_bug_id, $p_flags ) { $t_bug = bug_get( $p_bug_id ); echo '<div class="btn-group">'; # UPDATE button if( $p_flags['can_update'] ) { echo '<div class="pull-left padding-right-8">'; html_button( string_get_bug_update_page(), lang_get( 'edit' ), array( 'bug_id' => $p_bug_id ) ); echo '</div>'; } # ASSIGN button if( $p_flags['can_assign'] ) { echo '<div class="pull-left padding-right-8">'; bug_view_button_bug_assign_to( $t_bug ); echo '</div>'; } # Change status button/dropdown if( $p_flags['can_change_status'] ) { echo '<div class="pull-left padding-right-8">'; bug_view_button_bug_change_status( $t_bug ); echo '</div>'; } # Unmonitor if( $p_flags['can_unmonitor'] ) { echo '<div class="pull-left padding-right-2">'; html_button( 'bug_monitor_delete.php', lang_get( 'unmonitor_bug_button' ), array( 'bug_id' => $p_bug_id ) ); echo '</div>'; } # Monitor if( $p_flags['can_monitor'] ) { echo '<div class="pull-left padding-right-2">'; html_button( 'bug_monitor_add.php', lang_get( 'monitor_bug_button' ), array( 'bug_id' => $p_bug_id ) ); echo '</div>'; } # Stick if( $p_flags['can_sticky'] ) { echo '<div class="pull-left padding-right-2">'; html_button( 'bug_stick.php', lang_get( 'stick_bug_button' ), array( 'bug_id' => $p_bug_id, 'action' => 'stick' ) ); echo '</div>'; } # Unstick if( $p_flags['can_unsticky'] ) { echo '<div class="pull-left padding-right-2">'; html_button( 'bug_stick.php', lang_get( 'unstick_bug_button' ), array( 'bug_id' => $p_bug_id, 'action' => 'unstick' ) ); echo '</div>'; } # CLONE button if( $p_flags['can_clone'] ) { echo '<div class="pull-left padding-right-2">'; html_button( string_get_bug_report_url(), lang_get( 'create_child_bug_button' ), array( 'm_id' => $p_bug_id ) ); echo '</div>'; } # REOPEN button if( $p_flags['can_reopen'] ) { echo '<div class="pull-left padding-right-2">'; $t_reopen_status = config_get( 'bug_reopen_status', null, null, $t_bug->project_id ); html_button( 'bug_change_status_page.php', lang_get( 'reopen_bug_button' ), array( 'id' => $t_bug->id, 'new_status' => $t_reopen_status, 'change_type' => BUG_UPDATE_TYPE_REOPEN ) ); echo '</div>'; } # CLOSE button if( $p_flags['can_close'] ) { $t_closed_status = config_get( 'bug_closed_status_threshold', null, null, $t_bug->project_id ); echo '<div class="pull-left padding-right-2">'; html_button( 'bug_change_status_page.php', lang_get( 'close' ), array( 'id' => $t_bug->id, 'new_status' => $t_closed_status, 'change_type' => BUG_UPDATE_TYPE_CLOSE ) ); echo '</div>'; } # MOVE button if( $p_flags['can_move'] ) { echo '<div class="pull-left padding-right-2">'; html_button( 'bug_actiongroup_page.php', lang_get( 'move' ), array( 'bug_arr[]' => $p_bug_id, 'action' => 'MOVE' ) ); echo '</div>'; } # DELETE button if( $p_flags['can_delete'] ) { echo '<div class="pull-left padding-right-2">'; html_button( 'bug_actiongroup_page.php', lang_get( 'delete' ), array( 'bug_arr[]' => $p_bug_id, 'action' => 'DELETE' ) ); echo '</div>'; } helper_call_custom_function( 'print_bug_view_page_custom_buttons', array( $p_bug_id ) ); echo '</div>'; }