%PDF- %PDF-
| Direktori : /www/loslex_o/tracker/plugins/MantisGraph/ |
| Current File : /www/loslex_o/tracker/plugins/MantisGraph/MantisGraph.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/>.
*
* @copyright Copyright 2002 MantisBT Team - mantisbt-dev@lists.sourceforge.net
*/
/**
* Mantis Graph plugin
*/
class MantisGraphPlugin extends MantisPlugin {
/**
* Chart JS
* @see https://www.chartjs.org/ Home page
* @see https://www.jsdelivr.com/package/npm/chart.js CDN
*
* Not using the bundled build anymore, as MantisBT Layout API already
* includes Moment.js, and per documentation this could cause issues.
* @see https://www.chartjs.org/docs/latest/getting-started/installation.html#bundled-build
*/
const CHARTJS_VERSION = '2.9.4';
const CHARTJS_HASH = 'sha256-t9UJPrESBeG2ojKTIcFLPGF7nHi2vEc7f5A2KpH/UBU=';
/**
* ChartJS colorschemes plugin
* @see https://nagix.github.io/chartjs-plugin-colorschemes/ Home page
* @see https://www.jsdelivr.com/package/npm/chartjs-plugin-colorschemes CDN
*/
const CHARTJS_COLORSCHEMES_VERSION = '0.4.0';
const CHARTJS_COLORSCHEMES_HASH = 'sha256-Ctym065YsaugUvysT5nHayKynbiDGVpgNBqUePRAL+0=';
/**
* CDN for Chart.JS libraries
*/
const CHARTJS_CDN = 'https://cdn.jsdelivr.net';
/**
* A method that populates the plugin information and minimum requirements.
* @return void
*/
function register() {
$this->name = plugin_lang_get( 'title' );
$this->description = plugin_lang_get( 'description' );
$this->page = '';
$this->version = MANTIS_VERSION;
$this->requires = array(
'MantisCore' => '2.25.0',
);
$this->author = 'MantisBT Team';
$this->contact = 'mantisbt-dev@lists.sourceforge.net';
$this->url = 'http://www.mantisbt.org';
}
/**
* Plugin initialization
* @return void
*/
function init() {
plugin_require_api( 'core/graph_api.php' );
plugin_require_api( 'core/Period.php' );
require_api( 'summary_api.php' );
}
/**
* Default plugin configuration.
* @return array
*/
function config() {
return array();
}
/**
* Plugin events
* @return array
*/
function events() {
return array(
'EVENT_MANTISGRAPH_SUBMENU'=> EVENT_TYPE_DEFAULT,
);
}
/**
* plugin hooks
* @return array
*/
function hooks() {
$t_hooks = array(
'EVENT_REST_API_ROUTES' => 'routes',
'EVENT_LAYOUT_RESOURCES' => 'resources',
'EVENT_CORE_HEADERS' => 'csp_headers',
'EVENT_MENU_SUMMARY' => 'summary_menu',
'EVENT_MENU_FILTER' => 'graph_filter_menu'
);
return $t_hooks;
}
/**
* Add the RESTful routes that are handled by this plugin.
*
* @param string $p_event_name The event name
* @param array $p_event_args The event arguments
* @return void
*/
function routes( $p_event_name, $p_event_args ) {
$t_app = $p_event_args['app'];
$t_app->group( plugin_route_group(), function() use ( $t_app ) {
$t_app->get( '/reporters', function( $req, $res, $args ) {
if( access_has_project_level( config_get( 'view_summary_threshold' ) ) ) {
$t_report_associative = create_reporter_summary();
$t_report = array();
foreach( $t_report_associative as $t_name => $t_count ) {
$t_report[] = array( "name" => $t_name, "count" => $t_count );
}
return $res->withStatus( HTTP_STATUS_SUCCESS )->withJson( $t_report );
}
return $res->withStatus( HTTP_STATUS_FORBIDDEN );
} );
} );
}
/**
* Add Content-Security-Policy directives that are needed to load scripts for CDN.
* @return void
*/
function csp_headers() {
if( config_get_global( 'cdn_enabled' ) == ON ) {
http_csp_add( 'script-src', self::CHARTJS_CDN );
}
}
/**
* generate graph filter menu
* @return array
*/
function graph_filter_menu() {
if( access_has_project_level( config_get( 'view_summary_threshold' ) ) ) {
return array( '<a class="btn btn-sm btn-primary btn-white btn-round" href="' .
plugin_page( 'issues_trend_page.php' ) . '">' . plugin_lang_get( 'issue_trends_link' ) . '</a>', );
} else {
return array();
}
}
/**
* Include Chart.js and plugins.
*
* This function can be called by other plugins that may need to use
* Chart.js.
*
* @return void
*/
function include_chartjs() {
if( config_get_global( 'cdn_enabled' ) == ON ) {
$t_cdn_url = self::CHARTJS_CDN . '/npm/%s@%s/dist/';
# Chart.js library
$t_link = sprintf( $t_cdn_url, 'chart.js', self::CHARTJS_VERSION );
html_javascript_cdn_link( $t_link . 'Chart.min.js', self::CHARTJS_HASH );
# Chart.js color schemes plugin
$t_link = sprintf( $t_cdn_url, 'chartjs-plugin-colorschemes', self::CHARTJS_COLORSCHEMES_VERSION );
html_javascript_cdn_link( $t_link . 'chartjs-plugin-colorschemes.min.js', self::CHARTJS_COLORSCHEMES_HASH );
} else {
$t_scripts = array(
'Chart-' . self::CHARTJS_VERSION . '.min.js',
'chartjs-plugin-colorschemes-' . self::CHARTJS_COLORSCHEMES_VERSION . '.min.js',
);
foreach( $t_scripts as $t_script ) {
printf( "\t<script src=\"%s\"></script>\n",
plugin_file( $t_script, false, $this->basename )
);
}
}
}
/**
* Include javascript files for chart.js
* @return void
*/
function resources() {
if( current( explode( '/', gpc_get_string( 'page', '' ) ) ) === $this->basename ) {
$this->include_chartjs();
printf( "\t<script src=\"%s\"></script>\n",
plugin_file( 'MantisGraph.js' )
);
}
}
/**
* Retrieve a link to a plugin page with temporary filter parameter.
* @param string $p_page Plugin page name
* @return string
*/
private function get_url_with_filter( $p_page ) {
static $s_filter_param;
if( $s_filter_param === null ) {
$t_filter = summary_get_filter();
$s_filter_param = filter_get_temporary_key_param( $t_filter );
}
return helper_url_combine( plugin_page( $p_page ), $s_filter_param );
}
/**
* Event hook to add the plugin's tab to the Summary page menu.
* @return array
*/
function summary_menu() {
$t_menu_items[] = '<a href="'
. $this->get_url_with_filter( 'developer_graph.php' )
. '">'
. plugin_lang_get( 'tab_label' )
. '</a>';
return $t_menu_items;
}
/**
* Print the plugin's submenu
*/
function print_submenu() {
$t_menu_items = array(
'developer_graph.php' => array(
'icon' => 'fa-bar-chart',
'label' => lang_get( 'by_developer' ),
'url' => $this->get_url_with_filter( 'developer_graph.php' ),
),
'reporter_graph.php' => array(
'icon' => 'fa-bar-chart',
'label' => lang_get( 'by_reporter' ),
'url' => $this->get_url_with_filter( 'reporter_graph.php' ),
),
'status_graph.php' => array(
'icon' => 'fa-bar-chart',
'label' => plugin_lang_get( 'status_link' ),
'url' => $this->get_url_with_filter( 'status_graph.php' ),
),
'resolution_graph.php' => array(
'icon' => 'fa-bar-chart',
'label' => plugin_lang_get( 'resolution_link' ),
'url' => $this->get_url_with_filter( 'resolution_graph.php' ),
),
'priority_graph.php' => array(
'icon' => 'fa-bar-chart',
'label' => plugin_lang_get( 'priority_link' ),
'url' => $this->get_url_with_filter( 'priority_graph.php' ),
),
'severity_graph.php' => array(
'icon' => 'fa-bar-chart',
'label' => plugin_lang_get( 'severity_link' ),
'url' => $this->get_url_with_filter( 'severity_graph.php' ),
),
'category_graph.php' => array(
'icon' => 'fa-bar-chart',
'label' => plugin_lang_get( 'category_link' ),
'url' => $this->get_url_with_filter( 'category_graph.php' ),
),
'issues_trend_graph.php' => array(
'icon' => 'fa-bar-chart',
'label' => plugin_lang_get( 'issue_trends_link' ),
'url' => $this->get_url_with_filter( 'issues_trend_graph.php' ),
),
);
# Retrieve current page
$t_param_page = explode( '/', gpc_get_string( 'page', '' ) );
$t_plugin_page_current = end( $t_param_page );
print_submenu( $t_menu_items, $t_plugin_page_current, 'EVENT_MANTISGRAPH_SUBMENU' );
}
}