mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-11-21 15:33:23 +01:00
new about page from Sebastian Ebeling
This commit is contained in:
parent
7010efc75c
commit
233a414efe
364
about.php
364
about.php
@ -1,343 +1,37 @@
|
||||
<?php
|
||||
/**************************************************************************\
|
||||
* eGroupWare *
|
||||
* http://www.egroupware.org *
|
||||
* -------------------------------------------- *
|
||||
* This program 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. *
|
||||
\**************************************************************************/
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
/**
|
||||
* eGroupWare: About informations
|
||||
*
|
||||
* rewrite of the old PHPLib based about page
|
||||
* it now uses eTemplate
|
||||
* new class about ist stored at phpgwapi/inc/class.about.inc.php
|
||||
*
|
||||
* This is NO typical eTemplate application as it is not stored in the
|
||||
* correct namespace
|
||||
*
|
||||
* LICENSE: GPL.
|
||||
*
|
||||
* @package api
|
||||
* @subpackage about
|
||||
* @author Sebastian Ebling <hudeldudel@php.net>
|
||||
* @author Ralf Becker <RalfBecker@outdoor-training.de>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html
|
||||
* @link http://www.egroupware.org
|
||||
* @version SVN: $Id$
|
||||
*/
|
||||
|
||||
$GLOBALS['egw_info'] = array(
|
||||
'flags' => array(
|
||||
'currentapp' => isset($_GET['app']) && $_GET['app'] != 'eGroupWare' ? $_GET['app'] : 'about',
|
||||
'disable_Template_class' => True,
|
||||
'noheader' => True,
|
||||
'currentapp' => 'home', //'about',
|
||||
'disable_Template_class' => true,
|
||||
'noheader' => true,
|
||||
'nonavbar' => true
|
||||
)
|
||||
);
|
||||
|
||||
include('header.inc.php');
|
||||
|
||||
|
||||
// create the about page
|
||||
require_once(EGW_API_INC.'/class.about.inc.php');
|
||||
|
||||
$aboutPage = new about();
|
||||
|
||||
|
||||
class about
|
||||
{
|
||||
/**
|
||||
* template object
|
||||
*/
|
||||
var $tpl;
|
||||
|
||||
/**
|
||||
* constructor of class about
|
||||
* sets template and calls list or detail view
|
||||
*/
|
||||
function about()
|
||||
{
|
||||
// create template object
|
||||
$this->tpl =& CreateObject('phpgwapi.Template', $GLOBALS['egw']->common->get_tpl_dir('phpgwapi'));
|
||||
$this->tpl->set_file(array(
|
||||
'phpgw_about' => 'about.tpl',
|
||||
'phpgw_about_unknown' => 'about_unknown.tpl'
|
||||
));
|
||||
|
||||
$title = isset($GLOBALS['egw_info']['apps'][$_GET['app']]) ? $GLOBALS['egw_info']['apps'][$_GET['app']]['title'] : 'eGroupWare';
|
||||
$GLOBALS['egw_info']['flags']['app_header'] = lang('About %1',$title);
|
||||
$GLOBALS['egw']->common->egw_header();
|
||||
|
||||
// list or detail view
|
||||
$app = isset($_GET['app']) && $_GET['app'] != 'eGroupWare' ? basename($_GET['app']) : 'about';
|
||||
if ($app) {
|
||||
if (!($included = $GLOBALS['egw']->hooks->single('about',$app))) {
|
||||
$detail = $included = file_exists(EGW_INCLUDE_ROOT . "/$app/setup/setup.inc.php");
|
||||
}
|
||||
} else {
|
||||
$detail = false;
|
||||
}
|
||||
if ($detail) {
|
||||
$this->_detailView();
|
||||
} else {
|
||||
$this->_listView();
|
||||
}
|
||||
|
||||
$GLOBALS['egw']->common->egw_footer();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* output of list view
|
||||
*/
|
||||
function _listView()
|
||||
{
|
||||
// eGW info
|
||||
$this->tpl->set_block('phpgw_about', 'egroupware','egroupware');
|
||||
$this->tpl->set_var('phpgw_logo',$GLOBALS['egw']->common->image('phpgwapi','logo.gif'));
|
||||
$this->tpl->set_var('phpgw_version',lang('eGroupWare API version %1',$GLOBALS['egw_info']['server']['versions']['phpgwapi']));
|
||||
$this->tpl->set_var('phpgw_message',lang('%1eGroupWare%2 is a multi-user, web-based groupware suite written in %3PHP%4.',
|
||||
'<a href="http://www.eGroupWare.org" target="_blank">','</a>','<a href="http://www.php.net" target="_blank">','</a>'));
|
||||
$this->tpl->pparse('overview', 'egroupware');
|
||||
|
||||
// app_list_tablestart
|
||||
$this->tpl->set_block('phpgw_about', 'app_list_tablestart','app_list_tablestart');
|
||||
$this->tpl->set_var('phpgw_app_listinfo', lang('List of your available applications'));
|
||||
$this->tpl->set_var('phpgw_about_th_name', lang('name'));
|
||||
$this->tpl->set_var('phpgw_about_th_author', lang('author'));
|
||||
$this->tpl->set_var('phpgw_about_th_maintainer', lang('maintainer'));
|
||||
$this->tpl->set_var('phpgw_about_th_version', lang('version'));
|
||||
$this->tpl->set_var('phpgw_about_th_license', lang('license'));
|
||||
$this->tpl->set_var('phpgw_about_th_details', lang('details'));
|
||||
$this->tpl->pparse('phpgw_about', 'app_list_tablestart', true);
|
||||
|
||||
// app_list_tablerows
|
||||
$this->tpl->set_block('phpgw_about', 'app_list_tablerow', 'app_list_tablerow');
|
||||
foreach ($GLOBALS['egw_info']['user']['apps'] as $app => $appinfo) {
|
||||
// get additional information about the application
|
||||
$info = $this->_getParsedAppInfo($app);
|
||||
|
||||
$this->tpl->set_var('phpgw_about_td_image', $GLOBALS['egw']->common->image($app,array('navbar','nonav')));
|
||||
$this->tpl->set_var('phpgw_about_td_title', $appinfo['title']);
|
||||
$this->tpl->set_var('phpgw_about_td_author', $info['author']);
|
||||
$this->tpl->set_var('phpgw_about_td_maintainer', $info['maintainer']);
|
||||
$this->tpl->set_var('phpgw_about_td_version', $info['version']);
|
||||
$this->tpl->set_var('phpgw_about_td_license', $info['license']);
|
||||
$this->tpl->set_var('phpgw_about_td_details_img', $GLOBALS['egw']->common->image('phpgwapi','view.png'));
|
||||
$this->tpl->set_var('phpgw_about_td_details_url', $GLOBALS['egw_info']['server']['webserver_url'].'/about.php?app='.$app);
|
||||
$this->tpl->pparse('phpgw_about', 'app_list_tablerow', true);
|
||||
}
|
||||
|
||||
// app_list_table_stop
|
||||
$this->tpl->set_block('phpgw_about', 'app_list_tablestop','app_list_tablestop');
|
||||
$this->tpl->pparse('phpgw_about', 'app_list_tablestop');
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* output of detail view
|
||||
*/
|
||||
function _detailView()
|
||||
{
|
||||
echo '<!-- _detailView -->';
|
||||
$app = basename($_GET['app']);
|
||||
include(EGW_INCLUDE_ROOT . "/$app/setup/setup.inc.php");
|
||||
$info = $setup_info[$app];
|
||||
$info['icon'] = $GLOBALS['egw']->common->image($app,array('navbar','nonav'));
|
||||
$info['title'] = $GLOBALS['egw_info']['apps'][$app]['title'];
|
||||
|
||||
$other_infos = array(
|
||||
'author' => lang('Author'),
|
||||
'maintainer' => lang('Maintainer'),
|
||||
'version' => lang('Version'),
|
||||
'license' => lang('License'),
|
||||
);
|
||||
if($info[icon])
|
||||
{
|
||||
$icon = $info[icon];
|
||||
}
|
||||
$s = "<table width='70%' cellpadding='4'>\n";
|
||||
if(trim($icon) != "")
|
||||
{
|
||||
$s.= "<tr>
|
||||
<td align='left'><img src='$icon' alt=\"$info[title]\" /></td><td align='left'><h2>$info[title]</h2></td></tr>";
|
||||
}
|
||||
else
|
||||
{
|
||||
$s .= "<tr>
|
||||
<td align='left'></td><td align='left'><h2>$info[title]</h2></td></tr>";
|
||||
}
|
||||
if ($info['description'])
|
||||
{
|
||||
$info['description'] = lang($info['description']);
|
||||
$s .= "<tr><td colspan='2' align='left'>$info[description]</td></tr>\n";
|
||||
if ($info['note'])
|
||||
{
|
||||
$info['note'] = lang($info['note']);
|
||||
$s .= "<tr><td colspan='2' align='left'><i>$info[note]</i></td></tr>\n";
|
||||
}
|
||||
|
||||
}
|
||||
foreach ($other_infos as $key => $val)
|
||||
{
|
||||
if (isset($info[$key]))
|
||||
{
|
||||
$s .= "<tr><td width='1%' align='left'>$val</td><td>";
|
||||
$infos = $info[$key];
|
||||
for ($n = 0; is_array($info[$key][$n]) && ($infos = $info[$key][$n]) || !$n; ++$n)
|
||||
{
|
||||
if (!is_array($infos) && isset($info[$key.'_email']))
|
||||
{
|
||||
$infos = array('email' => $info[$key.'_email'],'name' => $infos);
|
||||
}
|
||||
elseif(!is_array($infos) && isset($info[$key.'_url']))
|
||||
{
|
||||
$infos = array('url' => $info[$key.'_url'],'name' => $infos);
|
||||
}
|
||||
if (is_array($infos))
|
||||
{
|
||||
if ($infos['email'])
|
||||
{
|
||||
$names = explode('<br>',$infos['name']);
|
||||
$emails = split('@|<br>',$infos['email']);
|
||||
if (count($names) < count($emails)/2)
|
||||
{
|
||||
$names = '';
|
||||
}
|
||||
$infos = '';
|
||||
while (list($user,$domain) = $emails)
|
||||
{
|
||||
if ($infos) $infos .= '<br>';
|
||||
$name = $names ? array_shift($names) : $user;
|
||||
$infos .= "<a href='mailto:$user at $domain'><span onClick=\"document.location='mailto:$user'+'@'+'$domain'; return false;\">$name</span></a>";
|
||||
array_shift($emails); array_shift($emails);
|
||||
}
|
||||
}
|
||||
elseif($infos['url'])
|
||||
{
|
||||
$img = $info[$key.'_img'];
|
||||
if ($img)
|
||||
{
|
||||
$img_url = $GLOBALS['egw']->common->image('phpgwapi',$img);
|
||||
if (!$img_url)
|
||||
{
|
||||
$img_url = $GLOBALS['egw']->common->image($info['name'],$img);
|
||||
}
|
||||
$infos = '<table border="0"><tr><td style="text-align:center;"><a href="'.$infos['url'].'"><img src="'.$img_url.'" border="0"><br>'.$infos['name'].'</a></td></tr></table>';
|
||||
}
|
||||
else
|
||||
{
|
||||
$infos = '<a href="'.$infos['url'].'">'.$infos['name'].'</a>';
|
||||
}
|
||||
}
|
||||
}
|
||||
$s .= ($n ? '<br>' : '') . $infos;
|
||||
}
|
||||
$s .= "</td></tr>\n";
|
||||
}
|
||||
}
|
||||
|
||||
if ($info['extra_untranslated'])
|
||||
{
|
||||
$s .= "<tr><td colspan='2' align='left'>$info[extra_untranslated]</td></tr>\n";
|
||||
}
|
||||
|
||||
$s .= "</table>\n";
|
||||
|
||||
|
||||
$this->tpl->set_block('phpgw_about', 'application','application');
|
||||
$this->tpl->set_var('phpgw_app_about', $s);
|
||||
$this->tpl->pparse('phpgw_about', 'application', True);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* parse informations from setup.inc.php file
|
||||
*
|
||||
* @param string app application name
|
||||
* @return array html formated informations about author(s),
|
||||
* maintainer(s), version, license of the
|
||||
* given application
|
||||
*/
|
||||
function _getParsedAppInfo($app)
|
||||
{
|
||||
// define the return array
|
||||
$ret = array(
|
||||
'author' => '',
|
||||
'maintainer' => '',
|
||||
'version' => '',
|
||||
'license' => ''
|
||||
);
|
||||
|
||||
if (!file_exists(EGW_INCLUDE_ROOT . "/$app/setup/setup.inc.php")) {
|
||||
return $ret;
|
||||
}
|
||||
|
||||
include(EGW_INCLUDE_ROOT . "/$app/setup/setup.inc.php");
|
||||
|
||||
$ret['license'] = $setup_info[$app]['license'];
|
||||
$ret['version'] = $setup_info[$app]['version'];
|
||||
$ret['author'] = $this->_getHtmlPersonalInfo($setup_info, $app, 'author');
|
||||
$ret['maintainer'] = $this->_getHtmlPersonalInfo($setup_info, $app, 'maintainer');
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* helper to parse author and maintainer info
|
||||
*
|
||||
* @param array setup_info setup_info[$app] array
|
||||
* @param string app application name
|
||||
* @param string f 'author' or 'maintainer'
|
||||
*
|
||||
* @return string html formated informations of s
|
||||
*/
|
||||
function _getHtmlPersonalInfo($setup_info, $app, $f = 'author')
|
||||
{
|
||||
$authors = array();
|
||||
// get the author(s)
|
||||
if ($setup_info[$app][$f]) {
|
||||
// author is set
|
||||
if (!is_array($setup_info[$app][$f])) {
|
||||
// author is no array
|
||||
$authors[0]['name'] = $setup_info[$app][$f];
|
||||
if ($setup_info[$app][$f.'_email']) {
|
||||
$authors[0]['email'] = $setup_info[$app][$f.'_email'];
|
||||
}
|
||||
if ($setup_info[$app][$f.'_url']) {
|
||||
$authors[0]['url'] = $setup_info[$app][$f.'_url'];
|
||||
}
|
||||
|
||||
} else {
|
||||
// author is array
|
||||
if ($setup_info[$app][$f]['name']) {
|
||||
// only one author
|
||||
$authors[0]['name'] = $setup_info[$app][$f]['name'];
|
||||
if ($setup_info[$app][$f]['email']) {
|
||||
$authors[0]['email'] = $setup_info[$app][$f]['email'];
|
||||
}
|
||||
if ($setup_info[$app][$f]['url']) {
|
||||
$authors[0]['url'] = $setup_info[$app][$f]['url'];
|
||||
}
|
||||
} else {
|
||||
// may be more authors
|
||||
foreach ($setup_info[$app][$f] as $number => $values) {
|
||||
if ($setup_info[$app][$f][$number]['name']) {
|
||||
$authors[$number]['name'] = $setup_info[$app][$f][$number]['name'];
|
||||
}
|
||||
if ($setup_info[$app][$f][$number]['email']) {
|
||||
$authors[$number]['email'] = $setup_info[$app][$f][$number]['email'];
|
||||
}
|
||||
if ($setup_info[$app][$f][$number]['url']) {
|
||||
$authors[$number]['url'] = $setup_info[$app][$f][$number]['url'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// html format authors
|
||||
$s = '';
|
||||
foreach ($authors as $author) {
|
||||
if ($s != '') {
|
||||
$s .= '<br />';
|
||||
}
|
||||
$s .= lang('name').': '.$author['name'];
|
||||
if ($author['email']) {
|
||||
$s .= '<br />'.lang('email').': <a href="mailto:'.$author['email'].'">'.$author['email'].'</a>';
|
||||
}
|
||||
if ($author['url']) {
|
||||
$s .= '<br />'.lang('url').': <a href="'.$author['url'].'" target="_blank">'.$author['url'].'</a>';
|
||||
}
|
||||
}
|
||||
return $s;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
384
phpgwapi/inc/class.about.inc.php
Normal file
384
phpgwapi/inc/class.about.inc.php
Normal file
@ -0,0 +1,384 @@
|
||||
<?php
|
||||
/**
|
||||
* eGroupWare: About informations
|
||||
*
|
||||
* rewrite of the old PHPLib based about page
|
||||
* it now uses eTemplate
|
||||
*
|
||||
* This is NO typical eTemplate application as it is not stored in the
|
||||
* correct namespace
|
||||
*
|
||||
* LICENSE: GPL.
|
||||
*
|
||||
* @package api
|
||||
* @subpackage about
|
||||
* @author Sebastian Ebling <hudeldudel@php.net>
|
||||
* @author Ralf Becker <RalfBecker@outdoor-training.de>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html
|
||||
* @link http://www.egroupware.org
|
||||
* @version SVN: $Id$
|
||||
*/
|
||||
|
||||
/**
|
||||
* Shows informations about eGroupWare
|
||||
* - general information
|
||||
* - installed applications
|
||||
* - installed templates
|
||||
* - installed languages
|
||||
*
|
||||
* Usage:
|
||||
* <code>
|
||||
* $aboutPage = new about();
|
||||
* </code>
|
||||
* The constuctor will do all
|
||||
*
|
||||
* There is no typical so, bo ui structure, this class is all in one
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
class about
|
||||
{
|
||||
/**
|
||||
* constructor of about class
|
||||
* decides to show tab- or detail view
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
function about()
|
||||
{
|
||||
// list or detail view
|
||||
$name = 'eGroupWare';
|
||||
$detail = false;
|
||||
$nonavbar = false;
|
||||
|
||||
// application detail?
|
||||
if (isset($_GET['app']) && $_GET['app'] != 'eGroupWare') {
|
||||
$name = basename($_GET['app']);
|
||||
$type = 'application';
|
||||
$detail = true;
|
||||
}
|
||||
|
||||
// template detail?
|
||||
if (isset($_GET['template']) && $_GET['template'] != 'eGroupWare') {
|
||||
$name = basename($_GET['template']);
|
||||
$type = 'template';
|
||||
$detail = true;
|
||||
}
|
||||
|
||||
// navbar or not
|
||||
if (isset($_GET['nonavbar'])) {
|
||||
$nonavbar = $_GET['nonavbar'];
|
||||
}
|
||||
|
||||
|
||||
if ($detail) {
|
||||
$this->_detailView($name, $type, $nonavbar);
|
||||
} else {
|
||||
$this->_listView();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* output of list view
|
||||
* collects data and shows a tabbed view that lists
|
||||
* - general informations
|
||||
* - installed applications
|
||||
* - installed templates
|
||||
* - installed languages
|
||||
*
|
||||
* @return nothing
|
||||
*
|
||||
* @access private
|
||||
* @since 1.4
|
||||
*/
|
||||
function _listView()
|
||||
{
|
||||
// get informations about the applications
|
||||
$apps = array();
|
||||
$apps[] = ''; // first empty row for eTemplate
|
||||
foreach ($GLOBALS['egw_info']['user']['apps'] as $app => $appinfo) {
|
||||
$info = $this->_getParsedAppInfo($app);
|
||||
$apps[] = array(
|
||||
'appImage' => '<img src="'.$info['image'].'" />',
|
||||
'appName' => $appinfo['title'],
|
||||
'appAuthor' => $info['author'],
|
||||
'appMaintainer' => $info['maintainer'],
|
||||
'appVersion' => $info['version'],
|
||||
'appLicense' => $this->_linkLicense($info['license']),
|
||||
'appDetails' => '<a href="'.$GLOBALS['egw_info']['server']['webserver_url'].'/about.php?app='.$app.'&nonavbar=true" onclick="egw_openWindowCentered2(this.href,this.target,750,410,'."'yes'".'); return false;"><img src="'.$GLOBALS['egw']->common->image('phpgwapi','view.png').'" /></a>'
|
||||
);
|
||||
}
|
||||
|
||||
// get informations about the templates
|
||||
$templates = array();
|
||||
$templates[] = ''; // first empty row for eTemplate
|
||||
foreach($GLOBALS['egw']->common->list_templates() as $template => $templateinfo) {
|
||||
$info = $this->_getParsedTemplateInfo($template);
|
||||
$templates[] = array(
|
||||
'templateImage' => '<img src="'.$info['image'].'" />',
|
||||
'templateName' => $templateinfo['name'],
|
||||
'templateAuthor' => $info['author'],
|
||||
'templateMaintainer'=> $info['maintainer'],
|
||||
'templateVersion' => $info['version'],
|
||||
'templateLicense' => $this->_linkLicense($info['license']),
|
||||
'templateDetails' => '<a href="'.$GLOBALS['egw_info']['server']['webserver_url'].'/about.php?template='.$template.'&nonavbar=true" onclick="egw_openWindowCentered2(this.href,this.target,750,410,'."'yes'".'); return false;"><img src="'.$GLOBALS['egw']->common->image('phpgwapi','view.png').'" /></a>'
|
||||
);
|
||||
}
|
||||
|
||||
// get informations about installed languages
|
||||
$translations = array();
|
||||
$translations[] = ''; // first empty row for eTemplate
|
||||
$langs = $GLOBALS['egw']->translation->get_installed_langs();
|
||||
foreach($GLOBALS['egw']->translation->get_installed_langs() as $translation => $translationinfo) {
|
||||
$translations[] = array(
|
||||
'langName' => $translationinfo.' ('.$translation.')'
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// fill content array for eTemplate
|
||||
$content = array(
|
||||
'apiVersion' => '<p>'.lang('eGroupWare API version').' '.$GLOBALS['egw_info']['server']['versions']['phpgwapi'].'</p>',
|
||||
'applications' => $apps,
|
||||
'templates' => $templates,
|
||||
'translations' => $translations
|
||||
);
|
||||
|
||||
$tmpl =& CreateObject('etemplate.etemplate', 'phpgwapi.about.index');
|
||||
$tmpl->exec('phpgwapi.about.index', $content);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* output of detail view for applications or templates
|
||||
*
|
||||
* @param string $name application/template name
|
||||
* @param string $type can be 'application' or 'template' :default $type='application'
|
||||
* @param string $nonavbar don't show navbar :default $nonavbar=false
|
||||
* @return nothing
|
||||
*
|
||||
* @access private
|
||||
* @since 1.4
|
||||
*/
|
||||
function _detailView($name, $type='application', $nonavbar=false)
|
||||
{
|
||||
// get the informations
|
||||
switch ($type) {
|
||||
case 'application':
|
||||
$info = $this->_getParsedAppInfo($name);
|
||||
break;
|
||||
case 'template':
|
||||
$info = $this->_getParsedTemplateInfo($name);
|
||||
break;
|
||||
}
|
||||
|
||||
// app names are translated, template names not...
|
||||
if ($type == 'application') {
|
||||
$translatedName = lang($name);
|
||||
} else {
|
||||
$translatedName = $name;
|
||||
}
|
||||
|
||||
// fill content array
|
||||
$content = array(
|
||||
'image' => '<img src="'.$info['image'].'" />',
|
||||
'name' => '<h2>'.$translatedName.'</h2>',
|
||||
'description' => '<p>'.$info['description'].'</p>',
|
||||
'note' => $info['note'],
|
||||
'author' => $info['author'],
|
||||
'maintainer' => $info['maintainer'],
|
||||
'version' => $info['version'],
|
||||
'license' => $this->_linkLicense($info['license'])
|
||||
);
|
||||
|
||||
$tmpl =& CreateObject('etemplate.etemplate', 'phpgwapi.about.detail');
|
||||
if ($nonavbar) {
|
||||
$tmpl->exec('phpgwapi.about.detail', $content, array(), array(), array(), 2);
|
||||
} else {
|
||||
$GLOBALS['egw_info']['flags']['app_header'] = lang('About %1', $translatedName);
|
||||
$tmpl->exec('phpgwapi.about.detail', $content);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* parse template informations from setup.inc.php file
|
||||
*
|
||||
* @param string $template template template name
|
||||
* @return array html formated informations about author(s),
|
||||
* maintainer(s), version, license of the
|
||||
* given application
|
||||
*
|
||||
* @access private
|
||||
* @since 1.4
|
||||
*/
|
||||
function _getParsedTemplateInfo($template)
|
||||
{
|
||||
// define the return array
|
||||
$ret = array(
|
||||
'image' => (file_exists($GLOBALS['egw_info']['template'][$template]['icon'])) ? $GLOBALS['egw_info']['template'][$template]['icon'] : $GLOBALS['egw']->common->image('thisdoesnotexist',array('navbar','nonav')),
|
||||
'author' => '',
|
||||
'maintainer' => '',
|
||||
'version' => '',
|
||||
'license' => '',
|
||||
'description' => '',
|
||||
'note' => ''
|
||||
);
|
||||
|
||||
if (!file_exists(EGW_INCLUDE_ROOT . "/phpgwapi/templates/$template/setup/setup.inc.php")) {
|
||||
return $ret;
|
||||
}
|
||||
|
||||
include(EGW_INCLUDE_ROOT . "/phpgwapi/templates/$template/setup/setup.inc.php");
|
||||
|
||||
$ret['author'] = $this->_getHtmlPersonalInfo($GLOBALS['egw_info']['template'][$template], 'author');
|
||||
$ret['maintainer'] = $this->_getHtmlPersonalInfo($GLOBALS['egw_info']['template'][$template], 'maintainer');
|
||||
$ret['version'] = $GLOBALS['egw_info']['template'][$template]['version'];
|
||||
$ret['license'] = $GLOBALS['egw_info']['template'][$template]['license'];
|
||||
$ret['description'] = $GLOBALS['egw_info']['template'][$template]['description'];
|
||||
$ret['note'] = $GLOBALS['egw_info']['template'][$template]['note'];
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* parse application informations from setup.inc.php file
|
||||
*
|
||||
* @param string $app application name
|
||||
* @return array html formated informations about author(s),
|
||||
* maintainer(s), version, license of the
|
||||
* given application
|
||||
*
|
||||
* @access private
|
||||
* @since 1.4
|
||||
*/
|
||||
function _getParsedAppInfo($app)
|
||||
{
|
||||
// define the return array
|
||||
$ret = array(
|
||||
'image' => $GLOBALS['egw']->common->image($app,array('navbar','nonav')),
|
||||
'author' => '',
|
||||
'maintainer' => '',
|
||||
'version' => '',
|
||||
'license' => '',
|
||||
'description' => '',
|
||||
'note' => ''
|
||||
);
|
||||
|
||||
if (!file_exists(EGW_INCLUDE_ROOT . "/$app/setup/setup.inc.php")) {
|
||||
return $ret;
|
||||
}
|
||||
|
||||
include(EGW_INCLUDE_ROOT . "/$app/setup/setup.inc.php");
|
||||
|
||||
$ret['author'] = $this->_getHtmlPersonalInfo($setup_info[$app], 'author');
|
||||
$ret['maintainer'] = $this->_getHtmlPersonalInfo($setup_info[$app], 'maintainer');
|
||||
$ret['version'] = $setup_info[$app]['version'];
|
||||
$ret['license'] = $setup_info[$app]['license'];
|
||||
$ret['description'] = $setup_info[$app]['description'];
|
||||
$ret['note'] = $setup_info[$app]['note'];
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* helper to parse author and maintainer info from setup_info array
|
||||
*
|
||||
* @param array $setup_info setup_info[$app] array
|
||||
* ($GLOBALS['egw_info']['template'][$template] array for template informations)
|
||||
* @param string $f 'author' or 'maintainer', default='author'
|
||||
* @return string html formated informations about author/maintainer
|
||||
*
|
||||
* @access private
|
||||
* @since 1.4
|
||||
*/
|
||||
function _getHtmlPersonalInfo($setup_info, $f = 'author')
|
||||
{
|
||||
$authors = array();
|
||||
// get the author(s)
|
||||
if ($setup_info[$f]) {
|
||||
// author is set
|
||||
if (!is_array($setup_info[$f])) {
|
||||
// author is no array
|
||||
$authors[0]['name'] = $setup_info[$f];
|
||||
if ($setup_info[$f.'_email']) {
|
||||
$authors[0]['email'] = $setup_info[$f.'_email'];
|
||||
}
|
||||
if ($setup_info[$f.'_url']) {
|
||||
$authors[0]['url'] = $setup_info[$f.'_url'];
|
||||
}
|
||||
|
||||
} else {
|
||||
// author is array
|
||||
if ($setup_info[$f]['name']) {
|
||||
// only one author
|
||||
$authors[0]['name'] = $setup_info[$f]['name'];
|
||||
if ($setup_info[$f]['email']) {
|
||||
$authors[0]['email'] = $setup_info[$f]['email'];
|
||||
}
|
||||
if ($setup_info[$f]['url']) {
|
||||
$authors[0]['url'] = $setup_info[$f]['url'];
|
||||
}
|
||||
} else {
|
||||
// may be more authors
|
||||
foreach ($setup_info[$f] as $number => $values) {
|
||||
if ($setup_info[$f][$number]['name']) {
|
||||
$authors[$number]['name'] = $setup_info[$f][$number]['name'];
|
||||
}
|
||||
if ($setup_info[$f][$number]['email']) {
|
||||
$authors[$number]['email'] = $setup_info[$f][$number]['email'];
|
||||
}
|
||||
if ($setup_info[$f][$number]['url']) {
|
||||
$authors[$number]['url'] = $setup_info[$f][$number]['url'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// html format authors
|
||||
$s = '';
|
||||
foreach ($authors as $author) {
|
||||
if ($s != '') {
|
||||
$s .= '<br />';
|
||||
}
|
||||
$s .= lang('name').': '.$author['name'];
|
||||
if ($author['email']) {
|
||||
$s .= '<br />'.lang('email').': <a href="mailto:'.$author['email'].'">'.$author['email'].'</a>';
|
||||
}
|
||||
if ($author['url']) {
|
||||
$s .= '<br />'.lang('url').': <a href="'.$author['url'].'" target="_blank">'.$author['url'].'</a>';
|
||||
}
|
||||
}
|
||||
return $s;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* surround license string with link to license if it is known
|
||||
*
|
||||
* @param string $license the license to surround with link
|
||||
* @return string linked licence if known, $licence if not known
|
||||
*
|
||||
* @access private
|
||||
* @since 1.4
|
||||
*/
|
||||
function _linkLicense($license)
|
||||
{
|
||||
// toupper known licenses
|
||||
$knownLicenses = array(
|
||||
'GPL' => 'http://www.gnu.org/copyleft/gpl.html'
|
||||
);
|
||||
|
||||
if (array_key_exists(strtoupper($license), $knownLicenses)) {
|
||||
$license = '<a href="'.$knownLicenses[strtoupper($license)].'" target="_blank">'.$license.'</a>';
|
||||
}
|
||||
|
||||
return $license;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
26
phpgwapi/setup/etemplates.inc.php
Normal file
26
phpgwapi/setup/etemplates.inc.php
Normal file
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
/**
|
||||
* eGroupWare - eTemplates for Application phpgwapi
|
||||
* http://www.egroupware.org
|
||||
* generated by soetemplate::dump4setup() 2007-04-07 14:58
|
||||
*
|
||||
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
|
||||
* @package phpgwapi
|
||||
* @subpackage setup
|
||||
* @version $Id$
|
||||
*/
|
||||
|
||||
$templ_version=1;
|
||||
|
||||
$templ_data[] = array('name' => 'phpgwapi.about.detail','template' => '','lang' => '','group' => '0','version' => '1.4.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:7:{s:4:"type";s:4:"grid";s:7:"no_lang";s:1:"1";s:4:"size";s:9:"70%,,,,,4";s:4:"data";a:5:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:4:"html";s:4:"name";s:5:"image";}s:1:"B";a:3:{s:4:"type";s:4:"html";s:4:"name";s:4:"name";s:7:"no_lang";s:1:"1";}}}s:4:"rows";i:1;s:4:"cols";i:2;s:4:"size";s:6:",,,,,4";s:7:"options";a:1:{i:5;s:1:"4";}}}i:2;a:1:{s:1:"A";a:2:{s:4:"type";s:4:"html";s:4:"name";s:11:"description";}}i:3;a:1:{s:1:"A";a:3:{s:4:"type";s:4:"html";s:4:"name";s:4:"note";s:7:"no_lang";s:1:"1";}}i:4;a:1:{s:1:"A";a:6:{s:4:"type";s:4:"grid";s:4:"data";a:5:{i:0;a:4:{s:2:"c1";s:7:"row,top";s:2:"c2";s:7:"row,top";s:2:"c3";s:7:"row,top";s:2:"c4";s:7:"row,top";}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:6:"author";s:4:"span";s:2:"th";}s:1:"B";a:3:{s:4:"type";s:4:"html";s:4:"name";s:6:"author";s:7:"no_lang";s:1:"1";}}i:2;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:10:"maintainer";s:4:"span";s:2:"th";}s:1:"B";a:3:{s:4:"type";s:4:"html";s:7:"no_lang";s:1:"1";s:4:"name";s:10:"maintainer";}}i:3;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"version";}s:1:"B";a:3:{s:4:"type";s:5:"label";s:4:"name";s:7:"version";s:7:"no_lang";s:1:"1";}}i:4;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"license";}s:1:"B";a:3:{s:4:"type";s:4:"html";s:7:"no_lang";s:1:"1";s:4:"name";s:7:"license";}}}s:4:"rows";i:4;s:4:"cols";i:2;s:4:"size";s:6:",,,,,3";s:7:"options";a:1:{i:5;s:1:"3";}}}}s:4:"rows";i:4;s:4:"cols";i:1;s:7:"options";a:2:{i:0;s:3:"70%";i:5;s:1:"4";}}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"size";s:5:",,,,5";s:7:"options";a:1:{i:4;s:1:"5";}}}','size' => ',,,,5','style' => '','modified' => '1175950403',);
|
||||
|
||||
$templ_data[] = array('name' => 'phpgwapi.about.index','template' => '','lang' => '','group' => '0','version' => '1.4.001','data' => 'a:2:{i:0;a:3:{s:4:"type";s:3:"tab";s:4:"name";s:40:"general|applications|templates|languages";s:5:"label";s:40:"general|applications|templates|languages";}i:1;a:7:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:2:{s:2:"c1";s:2:"th";s:2:"c2";s:3:"row";}i:1;a:7:{s:1:"A";a:1:{s:4:"type";s:5:"label";}s:1:"B";a:2:{s:4:"type";s:5:"label";s:5:"label";s:4:"name";}s:1:"C";a:2:{s:4:"type";s:5:"label";s:5:"label";s:6:"author";}s:1:"D";a:2:{s:4:"type";s:5:"label";s:5:"label";s:10:"maintainer";}s:1:"E";a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"version";}s:1:"F";a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"license";}s:1:"G";a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"details";}}i:2;a:7:{s:1:"A";a:3:{s:4:"type";s:4:"html";s:4:"name";s:16:"${row}[appImage]";s:7:"no_lang";s:1:"1";}s:1:"B";a:3:{s:4:"type";s:5:"label";s:4:"name";s:15:"${row}[appName]";s:7:"no_lang";s:1:"1";}s:1:"C";a:3:{s:4:"type";s:4:"html";s:4:"name";s:17:"${row}[appAuthor]";s:7:"no_lang";s:1:"1";}s:1:"D";a:3:{s:4:"type";s:4:"html";s:4:"name";s:21:"${row}[appMaintainer]";s:7:"no_lang";s:1:"1";}s:1:"E";a:3:{s:4:"type";s:5:"label";s:4:"name";s:18:"${row}[appVersion]";s:7:"no_lang";s:1:"1";}s:1:"F";a:3:{s:4:"type";s:4:"text";s:4:"name";s:18:"${row}[appLicense]";s:7:"no_lang";s:1:"1";}s:1:"G";a:4:{s:4:"type";s:4:"html";s:5:"align";s:6:"center";s:4:"name";s:17:"${row}[appDetail]";s:7:"no_lang";s:1:"1";}}}s:4:"rows";i:2;s:4:"cols";i:7;s:4:"name";s:4:"rows";s:8:"disabled";s:1:"1";s:7:"options";a:0:{}}}','size' => '','style' => '','modified' => '1175950383',);
|
||||
|
||||
$templ_data[] = array('name' => 'phpgwapi.about.index.applications','template' => '','lang' => '','group' => '0','version' => '1.4.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:236:"<strong>This is a list of your available applications.</strong><br />For a complete list of applications available for eGroupWare visit <a href="http://www.egroupware.org/applications" target="_blank">www.egroupware.org/applications</a>";}}i:2;a:1:{s:1:"A";a:6:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:2:{s:2:"c1";s:2:"th";s:2:"c2";s:7:"row,top";}i:1;a:7:{s:1:"A";a:5:{s:4:"type";s:5:"label";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:7:{s:4:"type";s:4:"grid";s:4:"size";s:3:",,1";s:4:"name";s:12:"applications";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:1;s:4:"cols";i:1;s:7:"options";a:1:{i:2;s:1:"1";}}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"name";s:12:"applications";}s:1:"B";a:2:{s:4:"type";s:5:"label";s:5:"label";s:4:"name";}s:1:"C";a:2:{s:4:"type";s:5:"label";s:5:"label";s:6:"author";}s:1:"D";a:2:{s:4:"type";s:5:"label";s:5:"label";s:10:"maintainer";}s:1:"E";a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"version";}s:1:"F";a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"license";}s:1:"G";a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"details";}}i:2;a:7:{s:1:"A";a:4:{s:4:"type";s:4:"html";s:7:"no_lang";s:1:"1";s:4:"name";s:16:"${row}[appImage]";s:5:"align";s:6:"center";}s:1:"B";a:3:{s:4:"type";s:4:"html";s:7:"no_lang";s:1:"1";s:4:"name";s:15:"${row}[appName]";}s:1:"C";a:3:{s:4:"type";s:4:"html";s:7:"no_lang";s:1:"1";s:4:"name";s:17:"${row}[appAuthor]";}s:1:"D";a:3:{s:4:"type";s:4:"html";s:7:"no_lang";s:1:"1";s:4:"name";s:21:"${row}[appMaintainer]";}s:1:"E";a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:18:"${row}[appVersion]";}s:1:"F";a:4:{s:4:"type";s:4:"html";s:7:"no_lang";s:1:"1";s:4:"name";s:18:"${row}[appLicense]";s:5:"align";s:6:"center";}s:1:"G";a:4:{s:4:"type";s:4:"html";s:7:"no_lang";s:1:"1";s:5:"align";s:6:"center";s:4:"name";s:18:"${row}[appDetails]";}}}s:4:"rows";i:2;s:4:"cols";i:7;s:4:"name";s:12:"applications";s:7:"options";a:0:{}}}}s:4:"rows";i:2;s:4:"cols";i:1;s:4:"size";s:6:",,0,,5";s:7:"options";a:2:{i:4;s:1:"5";i:2;s:1:"0";}}}','size' => ',,0,,5','style' => '','modified' => '1175950363',);
|
||||
|
||||
$templ_data[] = array('name' => 'phpgwapi.about.index.general','template' => '','lang' => '','group' => '0','version' => '1.4.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:5:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:2:{s:4:"type";s:5:"image";s:4:"name";s:4:"logo";}}i:2;a:1:{s:1:"A";a:2:{s:4:"type";s:4:"html";s:4:"name";s:10:"apiVersion";}}i:3;a:1:{s:1:"A";a:1:{s:4:"type";s:5:"hrule";}}i:4;a:1:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:1208:"<p><b>eGroupWare is a <a href="http://www.egroupware.org/philosophy" title="read more about open source and the GPL" target="_blank">free</a> enterprise ready groupware software</b> for your network. It enables you to manage contacts, appointments, todos and many more for your whole business.<br /> <br /> <b>eGroupWare is a groupware server.</b> It comes with a native web-interface which allowes to access your data from any platform all over the planet. Moreover you also have the choice to access the eGroupWare server with your favorite groupware client (Kontact, Evolution, Outlook) and also with your mobile or PDA via SyncML.<br /> <br /> <b>eGroupWare is international.</b> At the time, it supports more than <a href="http://www.egroupware.org/languages" target="_blank">25 languages</a> including rtl support.<br /> <br /> <b>eGroupWare is platform independent.</b> The server runs on Linux, Mac, Windows and many more other operating systems. On the client side, all you need is a internetbrowser such as Firefox, Konqueror, Internet Explorer and many more.</p><br /><p>For more informations visit the <a href="http://www.egroupware.org" target="_blank">eGroupWare Website</a></p>";}}}s:4:"rows";i:4;s:4:"cols";i:1;s:4:"size";s:8:"600,,,,5";s:7:"options";a:2:{i:0;s:3:"600";i:4;s:1:"5";}}}','size' => '600,,,,5','style' => '','modified' => '1175950348',);
|
||||
|
||||
$templ_data[] = array('name' => 'phpgwapi.about.index.languages','template' => '','lang' => '','group' => '0','version' => '1.4.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:213:"<b>This is a list of your available languages</b><br />For a complete list of languages available for eGroupWare visit <a href="http://www.egroupware.org/languages" target="_blank">www.egroupware.org/languages</a>";}}i:2;a:1:{s:1:"A";a:7:{s:4:"type";s:4:"grid";s:4:"size";s:3:",,0";s:4:"data";a:3:{i:0;a:2:{s:2:"c1";s:2:"th";s:2:"c2";s:3:"row";}i:1;a:1:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:8:"language";}}i:2;a:1:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:16:"${row}[langName]";}}}s:4:"rows";i:2;s:4:"cols";i:1;s:4:"name";s:12:"translations";s:7:"options";a:1:{i:2;s:1:"0";}}}}s:4:"rows";i:2;s:4:"cols";i:1;s:4:"size";s:5:",,,,5";s:7:"options";a:1:{i:4;s:1:"5";}}}','size' => ',,,,5','style' => '','modified' => '1175950333',);
|
||||
|
||||
$templ_data[] = array('name' => 'phpgwapi.about.index.templates','template' => '','lang' => '','group' => '0','version' => '1.4.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:223:"<strong>This is a list of your available templates</strong><br />For a complete list of templates available for eGroupWare visit <a href="http://www.egroupware.org/templates" target="_blank">www.egroupware.org/templates</a>";}}i:2;a:1:{s:1:"A";a:6:{s:4:"type";s:4:"grid";s:4:"name";s:9:"templates";s:4:"data";a:3:{i:0;a:2:{s:2:"c1";s:2:"th";s:2:"c2";s:7:"row,top";}i:1;a:7:{s:1:"A";a:1:{s:4:"type";s:5:"label";}s:1:"B";a:2:{s:4:"type";s:5:"label";s:5:"label";s:4:"name";}s:1:"C";a:2:{s:4:"type";s:5:"label";s:5:"label";s:6:"author";}s:1:"D";a:2:{s:4:"type";s:5:"label";s:5:"label";s:10:"maintainer";}s:1:"E";a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"version";}s:1:"F";a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"license";}s:1:"G";a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"details";}}i:2;a:7:{s:1:"A";a:3:{s:4:"type";s:4:"html";s:7:"no_lang";s:1:"1";s:4:"name";s:21:"${row}[templateImage]";}s:1:"B";a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:20:"${row}[templateName]";}s:1:"C";a:3:{s:4:"type";s:4:"html";s:7:"no_lang";s:1:"1";s:4:"name";s:22:"${row}[templateAuthor]";}s:1:"D";a:3:{s:4:"type";s:4:"html";s:7:"no_lang";s:1:"1";s:4:"name";s:26:"${row}[templateMaintainer]";}s:1:"E";a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:23:"${row}[templateVersion]";}s:1:"F";a:4:{s:4:"type";s:4:"html";s:7:"no_lang";s:1:"1";s:4:"name";s:23:"${row}[templateLicense]";s:5:"align";s:6:"center";}s:1:"G";a:3:{s:4:"type";s:4:"html";s:4:"name";s:23:"${row}[templateDetails]";s:5:"align";s:6:"center";}}}s:4:"rows";i:2;s:4:"cols";i:7;s:7:"options";a:0:{}}}}s:4:"rows";i:2;s:4:"cols";i:1;s:4:"size";s:5:",,,,5";s:7:"options";a:1:{i:4;s:1:"5";}}}','size' => ',,,,5','style' => '','modified' => '1175950302',);
|
||||
|
Loading…
Reference in New Issue
Block a user