.
/**
* @package CoreAPI
* @subpackage ColumnsAPI
* @copyright Copyright (C) 2000 - 2002 Kenzaburo Ito - kenito@300baud.org
* @copyright Copyright (C) 2002 - 2014 MantisBT Team - mantisbt-dev@lists.sourceforge.net
* @link http://www.mantisbt.org
*/
/**
* Filters an array of columns based on configuration options. The filtering can remove
* columns whose features are disabled.
*
* @param array(string) $p_columns The columns proposed for display.
* @return array(string) The columns array after removing the disabled features.
*/
function columns_filter_disabled( $p_columns ) {
$t_columns = array();
$t_enable_profiles = ( config_get( 'enable_profiles' ) == ON );
foreach ( $p_columns as $t_column ) {
switch( $t_column ) {
case 'os':
case 'os_build':
case 'platform':
if( ! $t_enable_profiles ) {
continue 2;
}
/* don't filter */
break;
case 'eta':
if( config_get( 'enable_eta' ) == OFF ) {
continue 2;
}
break;
case 'projection':
if( config_get( 'enable_projection' ) == OFF ) {
continue 2;
}
break;
case 'build':
if( config_get( 'enable_product_build' ) == OFF ) {
continue 2;
}
break;
default:
/* don't filter */
break;
}
$t_columns[] = $t_column;
} /* continued 2 */
return $t_columns;
}
/**
* Get a list of standard columns.
* @param bool $p_enabled_columns_only default true, if false returns all columns regardless of config settings
* @return array of column names
*/
function columns_get_standard( $p_enabled_columns_only = true ) {
$t_reflection = new ReflectionClass('BugData');
$t_columns = $t_reflection->getDefaultProperties();
$t_columns['selection'] = null;
$t_columns['edit'] = null;
# Overdue icon column (icons appears if an issue is beyond due_date)
$t_columns['overdue'] = null;
if( $p_enabled_columns_only && OFF == config_get( 'enable_profiles' ) ) {
unset( $t_columns['os'] );
unset( $t_columns['os_build'] );
unset( $t_columns['platform'] );
}
if( $p_enabled_columns_only && config_get( 'enable_eta' ) == OFF ) {
unset( $t_columns['eta'] );
}
if( $p_enabled_columns_only && config_get( 'enable_projection' ) == OFF ) {
unset( $t_columns['projection'] );
}
if( $p_enabled_columns_only && config_get( 'enable_product_build' ) == OFF ) {
unset( $t_columns['build'] );
}
# The following fields are used internally and don't make sense as columns
unset( $t_columns['_stats'] );
unset( $t_columns['profile_id'] );
unset( $t_columns['sticky'] );
unset( $t_columns['loading'] );
return array_keys( $t_columns );
}
/**
* Allow plugins to define a set of class-based columns, and register/load
* them here to be used by columns_api.
* @return array Mapping of column name to column object
*/
function columns_get_plugin_columns() {
static $s_column_array = null;
if ( is_null( $s_column_array ) ) {
$s_column_array = array();
$t_all_plugin_columns = event_signal( 'EVENT_FILTER_COLUMNS' );
foreach( $t_all_plugin_columns as $t_plugin => $t_plugin_columns ) {
foreach( $t_plugin_columns as $t_callback => $t_plugin_column_array ) {
if ( is_array( $t_plugin_column_array ) ) {
foreach( $t_plugin_column_array as $t_column_class ) {
if ( class_exists( $t_column_class ) && is_subclass_of( $t_column_class, 'MantisColumn' ) ) {
$t_column_object = new $t_column_class();
$t_column_name = utf8_strtolower( $t_plugin . '_' . $t_column_object->column );
$s_column_array[ $t_column_name ] = $t_column_object;
}
}
}
}
}
}
return $s_column_array;
}
/**
* Returns true if the specified $p_column is a plugin column.
* @param string $p_column A column name.
*/
function column_is_plugin_column( $p_column ) {
$t_plugin_columns = columns_get_plugin_columns();
return isset( $t_plugin_columns[ $p_column ] );
}
/**
* Allow plugin columns to pre-cache data for a set of issues
* rather than requiring repeated queries for each issue.
* @param array Bug objects
*/
function columns_plugin_cache_issue_data( $p_bugs ) {
$t_columns = columns_get_plugin_columns();
foreach( $t_columns as $t_column_object ) {
$t_column_object->cache( $p_bugs );
}
}
/**
* Get all accessible columns for the current project / current user..
* @param int $p_project_id project id
* @return array array of columns
* @access public
*/
function columns_get_all( $p_project_id = null ) {
$t_columns = columns_get_standard();
# add plugin columns
$t_columns = array_merge( $t_columns, array_keys( columns_get_plugin_columns() ) );
# Add project custom fields to the array. Only add the ones for which the current user has at least read access.
if( $p_project_id === null ) {
$t_project_id = helper_get_current_project();
} else {
$t_project_id = $p_project_id;
}
$t_related_custom_field_ids = custom_field_get_linked_ids( $t_project_id );
foreach( $t_related_custom_field_ids as $t_id ) {
if( !custom_field_has_read_access_by_project_id( $t_id, $t_project_id ) ) {
continue;
}
$t_def = custom_field_get_definition( $t_id );
$t_columns[] = 'custom_' . $t_def['name'];
}
return $t_columns;
}
/**
* Checks if the specified column is an extended column. Extended columns are native columns that are
* associated with the issue but are saved in mantis_bug_text_table.
* @param string $p_column The column name
* @return bool true for extended; false otherwise.
* @access public
*/
function column_is_extended( $p_column ) {
switch( $p_column ) {
case 'description':
case 'steps_to_reproduce':
case 'additional_information':
return true;
default:
return false;
}
}
/**
* Given a column name from the array of columns to be included in a view, this method checks if
* the column is a custom column and if so returns its name. Note that for custom fields, then
* provided names will have the "custom_" prefix, where the returned ones won't have the prefix.
*
* @param string $p_column Column name.
* @return string The custom field column name or null if the specific column is not a custom field or invalid column.
* @access public
*/
function column_get_custom_field_name( $p_column ) {
if( strncmp( $p_column, 'custom_', 7 ) === 0 ) {
return utf8_substr( $p_column, 7 );
}
return null;
}
/**
* Converts a string of comma separate column names to an array.
* @param string $p_string - Comma separate column name (not case sensitive)
* @return array The array with all column names lower case.
* @access public
*/
function columns_string_to_array( $p_string ) {
$t_string = utf8_strtolower( $p_string );
$t_columns = explode( ',', $t_string );
$t_count = count($t_columns);
for($i = 0; $i < $t_count; $i++) {
$t_columns[$i] = trim($t_columns[$i]);
}
return $t_columns;
}
/**
* Gets the localized title for the specified column. The column can be native or custom.
* The custom fields must contain the 'custom_' prefix.
* @param string $p_column - The column name.
* @return string The column localized name.
* @access public
*/
function column_get_title( $p_column ) {
$t_custom_field = column_get_custom_field_name( $p_column );
if( $t_custom_field !== null ) {
$t_field_id = custom_field_get_id_from_name( $t_custom_field );
if( $t_field_id === false ) {
$t_custom_field = '@' . $t_custom_field . '@';
} else {
$t_def = custom_field_get_definition( $t_field_id );
$t_custom_field = lang_get_defaulted( $t_def['name'] );
}
return $t_custom_field;
}
$t_plugin_columns = columns_get_plugin_columns();
if ( isset( $t_plugin_columns[ $p_column ] ) ) {
$t_column_object = $t_plugin_columns[ $p_column ];
return $t_column_object->title;
}
switch( $p_column ) {
case 'attachment_count':
return lang_get( 'attachments' );
case 'bugnotes_count':
return '#';
case 'category_id':
return lang_get( 'category' );
case 'edit':
return '';
case 'handler_id':
return lang_get( 'assigned_to' );
case 'last_updated':
return lang_get( 'updated' );
case 'os_build':
return lang_get( 'os_version' );
case 'project_id':
return lang_get( 'email_project' );
case 'reporter_id':
return lang_get( 'reporter' );
case 'selection':
return '';
case 'sponsorship_total':
return sponsorship_get_currency();
case 'version':
return lang_get( 'product_version' );
case 'view_state':
return lang_get( 'view_status' );
default:
return lang_get_defaulted( $p_column );
}
}
/**
* Checks an array of columns for duplicate or invalid fields.
* @param string $p_field_name - The logic name of the array being validated. Used when triggering errors.
* @param array $p_columns_to_validate - The array of columns to validate.
* @param array $p_columns_all - The list of all valid columns.
* @return bool
* @access public
*/
function columns_ensure_valid( $p_field_name, $p_columns_to_validate, $p_columns_all ) {
$t_columns_all_lower = array_map( 'utf8_strtolower', $p_columns_all );
# Check for invalid fields
foreach( $p_columns_to_validate as $t_column ) {
if( !in_array( utf8_strtolower( $t_column ), $t_columns_all_lower ) ) {
error_parameters( $p_field_name, $t_column );
trigger_error( ERROR_COLUMNS_INVALID, ERROR );
return false;
}
}
# Check for duplicate fields
$t_columns_no_duplicates = array();
foreach( $p_columns_to_validate as $t_column ) {
$t_column_lower = utf8_strtolower( $t_column );
if( in_array( $t_column, $t_columns_no_duplicates ) ) {
error_parameters( $p_field_name, $t_column );
trigger_error( ERROR_COLUMNS_DUPLICATE, ERROR );
} else {
$t_columns_no_duplicates[] = $t_column_lower;
}
}
return true;
}
/**
* Validates an array of column names and removes ones that are not valid. The validation
* is not case sensitive.
*
* @param array $p_columns - The array of column names to be validated.
* @param array $p_columns_all - The array of all valid column names.
* @return array The array of valid column names found in $p_columns.
* @access public
*/
function columns_remove_invalid( $p_columns, $p_columns_all ) {
$t_columns_all_lower = array_values( array_map( 'utf8_strtolower', $p_columns_all ) );
$t_columns = array();
foreach( $p_columns as $t_column ) {
if( in_array( utf8_strtolower( $t_column ), $t_columns_all_lower ) ) {
$t_columns[] = $t_column;
}
}
return $t_columns;
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_selection( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '
';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_edit( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_id( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'id' ), 'id', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'id' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_project_id( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'email_project' ), 'project_id', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'project_id' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_reporter_id( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'reporter' ), 'reporter_id', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'reporter_id' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_handler_id( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'assigned_to' ), 'handler_id', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'handler_id' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_priority( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'priority_abbreviation' ), 'priority', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'priority' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_reproducibility( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'reproducibility' ), 'reproducibility', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'reproducibility' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_projection( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'projection' ), 'projection', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'projection' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_eta( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'eta' ), 'eta', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'eta' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_resolution( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'resolution' ), 'resolution', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'resolution' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_fixed_in_version( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'fixed_in_version' ), 'fixed_in_version', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'fixed_in_version' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_target_version( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'target_version' ), 'target_version', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'target_version' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_view_state( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
global $t_icon_path;
echo '';
$t_view_state_text = lang_get( 'view_status' );
$t_view_state_icon = ' ';
print_view_bug_sort_link( $t_view_state_icon, 'view_state', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'view_state' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_os( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'os' ), 'os', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'os' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_os_build( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'os_version' ), 'os_build', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'os_build' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_build( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
if( $p_columns_target != COLUMNS_TARGET_CSV_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'build' ), 'build', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'build' );
echo ' ';
} else {
echo lang_get( 'build' );
}
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_platform( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'platform' ), 'platform', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'platform' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_version( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'product_version' ), 'version', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'version' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_date_submitted( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'date_submitted' ), 'date_submitted', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'date_submitted' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_attachment_count( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
global $t_icon_path;
$t_attachment_count_text = lang_get( 'attachment_count' );
$t_attachment_count_icon = " ";
echo "\t$t_attachment_count_icon \n";
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_category( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'category' ), 'category', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'category' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_sponsorship_total( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo "\t";
print_view_bug_sort_link( sponsorship_get_currency(), 'sponsorship_total', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'sponsorship_total' );
echo " \n";
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_severity( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'severity' ), 'severity', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'severity' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_status( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'status' ), 'status', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'status' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_last_updated( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'updated' ), 'last_updated', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'last_updated' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_summary( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_view_bug_sort_link( lang_get( 'summary' ), 'summary', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'summary' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_bugnotes_count( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo ' # ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_description( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
echo lang_get( 'description' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_steps_to_reproduce( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
echo lang_get( 'steps_to_reproduce' );
echo ' ';
}
/**
*
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_title_additional_information( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
echo lang_get( 'additional_information' );
echo ' ';
}
function print_column_title_overdue( $p_sort, $p_dir, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
global $t_icon_path;
echo '';
$t_overdue_text = lang_get( 'overdue' );
$t_overdue_icon = ' ';
print_view_bug_sort_link( $t_overdue_icon, 'due_date', $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, 'due_date' );
echo ' ';
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_selection( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
global $g_checkboxes_exist;
echo '';
if( access_has_any_project( config_get( 'report_bug_threshold', null, null, $p_bug->project_id ) ) ||
# !TODO: check if any other projects actually exist for the bug to be moved to
access_has_project_level( config_get( 'move_bug_threshold', null, null, $p_bug->project_id ), $p_bug->project_id ) ||
# !TODO: factor in $g_auto_set_status_to_assigned == ON
access_has_project_level( config_get( 'update_bug_assign_threshold', null, null, $p_bug->project_id ), $p_bug->project_id ) ||
access_has_project_level( config_get( 'update_bug_threshold', null, null, $p_bug->project_id ), $p_bug->project_id ) ||
access_has_project_level( config_get( 'delete_bug_threshold', null, null, $p_bug->project_id ), $p_bug->project_id ) ||
# !TODO: check to see if the bug actually has any different selectable workflow states
access_has_project_level( config_get( 'update_bug_status_threshold', null, null, $p_bug->project_id ), $p_bug->project_id ) ||
access_has_project_level( config_get( 'set_bug_sticky_threshold', null, null, $p_bug->project_id ), $p_bug->project_id ) ||
access_has_project_level( config_get( 'change_view_status_threshold', null, null, $p_bug->project_id ), $p_bug->project_id ) ||
access_has_project_level( config_get( 'add_bugnote_threshold', null, null, $p_bug->project_id ), $p_bug->project_id ) ||
access_has_project_level( config_get( 'tag_attach_threshold', null, null, $p_bug->project_id ), $p_bug->project_id ) ||
access_has_project_level( config_get( 'roadmap_update_threshold', null, null, $p_bug->project_id ), $p_bug->project_id ) ) {
$g_checkboxes_exist = true;
printf( " ", $p_bug->id );
} else {
echo " ";
}
echo ' ';
}
/**
* Print column title for a specific custom column.
* @param object Column object
* @param string sort
* @param string direction
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @access public
*/
function print_column_title_plugin( $p_column, $p_column_object, $p_sort, $p_dir, $p_columns_target=COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
if ( $p_column_object->sortable ) {
print_view_bug_sort_link( string_display_line( $p_column_object->title ), $p_column, $p_sort, $p_dir, $p_columns_target );
print_sort_icon( $p_dir, $p_sort, $p_column );
} else {
echo string_display_line( $p_column_object->title );
}
echo ' ';
}
/**
* Print custom column content for a specific bug.
* @param object Column object
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @access public
*/
function print_column_plugin( $p_column_object, $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
if ( $p_columns_target != COLUMNS_TARGET_CSV_PAGE ) {
echo '';
$p_column_object->display( $p_bug, $p_columns_target );
echo ' ';
} else {
$p_column_object->display( $p_bug, $p_columns_target );
}
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_edit( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
global $t_icon_path, $t_update_bug_threshold;
echo '';
if( !bug_is_readonly( $p_bug->id ) && access_has_bug_level( config_get( 'update_bug_threshold' ), $p_bug->id ) ) {
echo '';
echo ' ';
} else {
echo ' ';
}
echo ' ';
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_priority( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
if( ON == config_get( 'show_priority_text' ) ) {
print_formatted_priority_string( $p_bug );
} else {
print_status_icon( $p_bug->priority );
}
echo ' ';
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_id( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_bug_link( $p_bug->id, false );
echo ' ';
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_sponsorship_total( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo "\t";
if( $p_bug->sponsorship_total > 0 ) {
$t_sponsorship_amount = sponsorship_format_amount( $p_bug->sponsorship_total );
echo string_no_break( $t_sponsorship_amount );
}
echo " \n";
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_bugnotes_count( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
global $t_filter;
# grab the bugnote count
$t_bugnote_stats = bug_get_bugnote_stats( $p_bug->id );
if( NULL !== $t_bugnote_stats ) {
$bugnote_count = $t_bugnote_stats['count'];
$v_bugnote_updated = $t_bugnote_stats['last_modified'];
} else {
$bugnote_count = 0;
}
echo '';
if( $bugnote_count > 0 ) {
$t_show_in_bold = $v_bugnote_updated > strtotime( '-' . $t_filter['highlight_changed'] . ' hours' );
if( $t_show_in_bold ) {
echo '';
}
print_link( string_get_bug_view_url( $p_bug->id ) . "&nbn=$bugnote_count#bugnotes", $bugnote_count );
if( $t_show_in_bold ) {
echo ' ';
}
} else {
echo ' ';
}
echo ' ';
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_attachment_count( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
global $t_icon_path;
# Check for attachments
$t_attachment_count = 0;
if( file_can_view_bug_attachments( $p_bug->id, null ) ) {
$t_attachment_count = file_bug_attachment_count( $p_bug->id );
}
echo '';
if ( $t_attachment_count > 0 ) {
$t_href = string_get_bug_view_url( $p_bug->id ) . '#attachments';
$t_href_title = sprintf( lang_get( 'view_attachments_for_issue' ), $t_attachment_count, $p_bug->id );
echo "$t_attachment_count ";
} else {
echo ' ';
}
echo " \n";
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_category_id( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
global $t_sort, $t_dir;
# grab the project name
$t_project_name = project_get_field( $p_bug->project_id, 'name' );
echo '';
# type project name if viewing 'all projects' or if issue is in a subproject
if( ON == config_get( 'show_bug_project_links' ) && helper_get_current_project() != $p_bug->project_id ) {
echo '[';
print_view_bug_sort_link( string_display_line( $t_project_name ), 'project_id', $t_sort, $t_dir, $p_columns_target );
echo '] ';
}
echo string_display_line( category_full_name( $p_bug->category_id, false ) );
echo ' ';
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_severity( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
print_formatted_severity_string( $p_bug );
echo ' ';
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_eta( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '', get_enum_element( 'eta', $p_bug->eta, auth_get_current_user_id(), $p_bug->project_id ), ' ';
}
/**
*
* @param BugData $p_bug bug object
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_projection( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '', get_enum_element( 'projection', $p_bug->projection, auth_get_current_user_id(), $p_bug->project_id ), ' ';
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_reproducibility( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '', get_enum_element( 'reproducibility', $p_bug->reproducibility, auth_get_current_user_id(), $p_bug->project_id ), ' ';
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_resolution( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '',
get_enum_element( 'resolution', $p_bug->resolution, auth_get_current_user_id(), $p_bug->project_id ),
' ';
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_status( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
printf( '%s ',
get_enum_element( 'resolution', $p_bug->resolution, auth_get_current_user_id(), $p_bug->project_id ),
get_enum_element( 'status', $p_bug->status, auth_get_current_user_id(), $p_bug->project_id )
);
# print username instead of status
if(( ON == config_get( 'show_assigned_names' ) ) && ( $p_bug->handler_id > 0 ) && ( access_has_project_level( config_get( 'view_handler_threshold' ), $p_bug->project_id ) ) ) {
printf( ' (%s)', prepare_user_name( $p_bug->handler_id ) );
}
echo ' ';
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_handler_id( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
# In case of a specific project, if the current user has no access to the field, then it would have been excluded from the
# list of columns to view. In case of ALL_PROJECTS, then we need to check the access per row.
if( $p_bug->handler_id > 0 && ( helper_get_current_project() != ALL_PROJECTS || access_has_project_level( config_get( 'view_handler_threshold' ), $p_bug->project_id ) ) ) {
echo prepare_user_name( $p_bug->handler_id );
}
echo ' ';
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_reporter_id( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
echo prepare_user_name( $p_bug->reporter_id );
echo ' ';
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_project_id( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
echo string_display_line( project_get_name( $p_bug->project_id ) );
echo ' ';
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_last_updated( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
global $t_filter;
$t_last_updated = string_display_line( date( config_get( 'short_date_format' ), $p_bug->last_updated ) );
echo '';
if( $p_bug->last_updated > strtotime( '-' . $t_filter['highlight_changed'] . ' hours' ) ) {
printf( '%s ', $t_last_updated );
} else {
echo $t_last_updated;
}
echo ' ';
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_date_submitted( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
$t_date_submitted = string_display_line( date( config_get( 'short_date_format' ), $p_bug->date_submitted ) );
echo '', $t_date_submitted, ' ';
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_summary( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
if( $p_columns_target == COLUMNS_TARGET_CSV_PAGE ) {
$t_summary = string_attribute( $p_bug->summary );
} else {
$t_summary = string_display_line_links( $p_bug->summary );
}
echo '' . $t_summary . ' ';
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_description( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
$t_description = string_display_links( $p_bug->description );
echo '', $t_description, ' ';
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_steps_to_reproduce( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
$t_steps_to_reproduce = string_display_links( $p_bug->steps_to_reproduce );
echo '', $t_steps_to_reproduce, ' ';
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_additional_information( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
$t_additional_information = string_display_links( $p_bug->additional_information );
echo '', $t_additional_information, ' ';
}
/**
*
* @param BugData $p_bug bug obect
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_target_version( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
echo '';
# In case of a specific project, if the current user has no access to the field, then it would have been excluded from the
# list of columns to view. In case of ALL_PROJECTS, then we need to check the access per row.
if( helper_get_current_project() != ALL_PROJECTS || access_has_project_level( config_get( 'roadmap_view_threshold' ), $p_bug->project_id ) ) {
echo string_display_line( $p_bug->target_version );
}
echo ' ';
}
/**
*
* @param BugData $p_bug bug object
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_view_state( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
global $t_icon_path;
echo '';
if( VS_PRIVATE == $p_bug->view_state ) {
$t_view_state_text = lang_get( 'private' );
echo ' ';
} else {
echo ' ';
}
echo ' ';
}
/**
*
* @param BugData $p_bug bug object
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_due_date( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
if ( !access_has_bug_level( config_get( 'due_date_view_threshold' ), $p_bug->id ) ||
date_is_null( $p_bug->due_date ) ) {
echo ' ';
return;
}
if ( bug_is_overdue( $p_bug->id ) ) {
echo '';
} else {
echo ' ';
}
echo string_display_line( date( config_get( 'short_date_format' ), $p_bug->due_date ) );
echo ' ';
}
/**
*
* @param BugData $p_bug bug object
* @param int $p_columns_target: see COLUMNS_TARGET_* in constant_inc.php
* @return null
* @access public
*/
function print_column_overdue( $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE ) {
global $t_icon_path;
echo '';
if ( access_has_bug_level( config_get( 'due_date_view_threshold' ), $p_bug->id ) &&
!date_is_null( $p_bug->due_date ) &&
bug_is_overdue( $p_bug->id ) ) {
$t_overdue_text = lang_get( 'overdue' );
$t_overdue_text_hover = $t_overdue_text . '. Due date was: ' . string_display_line( date( config_get( 'short_date_format' ), $p_bug->due_date ) );
echo ' ';
} else {
echo ' ';
}
echo ' ';
}