mirror of
https://github.com/Combodo/iTop.git
synced 2026-02-13 07:24:13 +01:00
N°1408 - Dashboard Printer friendly page + user edit rights
This commit is contained in:
@@ -438,10 +438,11 @@ EOF
|
||||
continue;
|
||||
}
|
||||
|
||||
$bCanEdit = UserRights::IsAdministrator() || $oAttDef->IsUserEditable();
|
||||
$sDivId = $oDashboard->GetId();
|
||||
$oPage->add('<div class="dashboard_contents" id="'.$sDivId.'">');
|
||||
$aExtraParams = array('query_params' => $this->ToArgsForQuery());
|
||||
$oDashboard->Render($oPage, false, $aExtraParams);
|
||||
$oDashboard->Render($oPage, false, $aExtraParams, $bCanEdit);
|
||||
$oPage->add('</div>');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -451,8 +451,9 @@ EOF
|
||||
* @param \iTopWebPage $oPage
|
||||
* @param bool $bEditMode
|
||||
* @param array $aExtraParams
|
||||
* @param bool $bCanEdit
|
||||
*/
|
||||
public function Render($oPage, $bEditMode = false, $aExtraParams = array())
|
||||
public function Render($oPage, $bEditMode = false, $aExtraParams = array(), $bCanEdit = true)
|
||||
{
|
||||
$oPage->add('<div class="dashboard-title">'.htmlentities(Dict::S($this->sTitle), ENT_QUOTES, 'UTF-8', false).'</div>');
|
||||
|
||||
@@ -582,6 +583,7 @@ class RuntimeDashboard extends Dashboard
|
||||
{
|
||||
protected $bCustomized;
|
||||
private $sDefinitionFile = '';
|
||||
private $sReloadURL = null;
|
||||
|
||||
|
||||
public function __construct($sId)
|
||||
@@ -599,6 +601,8 @@ class RuntimeDashboard extends Dashboard
|
||||
/**
|
||||
* @param \DesignerForm $oForm
|
||||
*
|
||||
* @param array $aExtraParams
|
||||
*
|
||||
* @throws \Exception
|
||||
*/
|
||||
protected function SetFormParams($oForm, $aExtraParams = array())
|
||||
@@ -708,7 +712,7 @@ class RuntimeDashboard extends Dashboard
|
||||
*
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function Render($oPage, $bEditMode = false, $aExtraParams = array())
|
||||
public function Render($oPage, $bEditMode = false, $aExtraParams = array(), $bCanEdit = true)
|
||||
{
|
||||
if (!isset($aExtraParams['query_params']) && isset($aExtraParams['this->class']))
|
||||
{
|
||||
@@ -754,7 +758,7 @@ class RuntimeDashboard extends Dashboard
|
||||
function ReloadDashboard$sDivId()
|
||||
{
|
||||
// Do not reload when a dialog box is active
|
||||
if (!($('.ui-dialog:visible').length > 0))
|
||||
if (!($('.ui-dialog:visible').length > 0) && $('.dashboard_contents#$sDivId').is(':visible'))
|
||||
{
|
||||
$('.dashboard_contents#$sDivId').block();
|
||||
$.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php',
|
||||
@@ -782,9 +786,11 @@ EOF
|
||||
);
|
||||
}
|
||||
|
||||
$this->RenderDashboardSelector($oPage);
|
||||
|
||||
$this->RenderEditionTools($oPage, $aAjaxParams);
|
||||
if ($bCanEdit)
|
||||
{
|
||||
$this->RenderDashboardSelector($oPage);
|
||||
$this->RenderEditionTools($oPage, $aAjaxParams);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -852,7 +858,7 @@ EOF
|
||||
utils::GetPopupMenuItems($oPage, iPopupMenuExtension::MENU_DASHBOARD_ACTIONS, $this, $aActions);
|
||||
$sEditMenu .= $oPage->RenderPopupMenuItems($aActions);
|
||||
$sEditMenu = addslashes($sEditMenu);
|
||||
|
||||
$sReloadURL = $this->GetReloadURL();
|
||||
$oPage->add_ready_script(
|
||||
<<<EOF
|
||||
$('.dashboard-selector').after('$sEditMenu');
|
||||
@@ -864,7 +870,7 @@ EOF
|
||||
<<<EOF
|
||||
function EditDashboard(sId, sDashboardFile, aExtraParams)
|
||||
{
|
||||
$.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php', {operation: 'dashboard_editor', id: sId, file: sDashboardFile, extra_params: aExtraParams},
|
||||
$.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php', {operation: 'dashboard_editor', id: sId, file: sDashboardFile, extra_params: aExtraParams, reload_url: '$sReloadURL'},
|
||||
function(data)
|
||||
{
|
||||
$('body').append(data);
|
||||
@@ -874,7 +880,7 @@ function EditDashboard(sId, sDashboardFile, aExtraParams)
|
||||
}
|
||||
function RevertDashboard(sId, aExtraParams)
|
||||
{
|
||||
$.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php', {operation: 'revert_dashboard', dashboard_id: sId, extra_params: aExtraParams},
|
||||
$.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php', {operation: 'revert_dashboard', dashboard_id: sId, extra_params: aExtraParams, reload_url: '$sReloadURL'},
|
||||
function(data)
|
||||
{
|
||||
location.reload();
|
||||
@@ -968,6 +974,7 @@ EOF
|
||||
$sAutoReloadSec = (string) $this->iAutoReloadSec;
|
||||
$sTitle = addslashes($this->sTitle);
|
||||
$sUrl = utils::GetAbsoluteUrlAppRoot().'pages/ajax.render.php';
|
||||
$sReloadURL = $this->GetReloadURL();
|
||||
|
||||
$sExitConfirmationMessage = addslashes(Dict::S('UI:NavigateAwayConfirmationMessage'));
|
||||
$sCancelConfirmationMessage = addslashes(Dict::S('UI:CancelConfirmationMessage'));
|
||||
@@ -1019,8 +1026,8 @@ $('#dashboard_editor').dialog({
|
||||
$('#dashboard_editor .ui-layout-center').runtimedashboard({
|
||||
dashboard_id: '$sId', layout_class: '$sLayoutClass', title: '$sTitle',
|
||||
auto_reload: $sAutoReload, auto_reload_sec: $sAutoReloadSec,
|
||||
submit_to: '$sUrl', submit_parameters: {operation: 'save_dashboard', extra_params: $sJSExtraParams},
|
||||
render_to: '$sUrl', render_parameters: {operation: 'render_dashboard', extra_params: $sJSExtraParams},
|
||||
submit_to: '$sUrl', submit_parameters: {operation: 'save_dashboard', extra_params: $sJSExtraParams, reload_url: '$sReloadURL'},
|
||||
render_to: '$sUrl', render_parameters: {operation: 'render_dashboard', extra_params: $sJSExtraParams, reload_url: '$sReloadURL'},
|
||||
new_dashlet_parameters: {operation: 'new_dashlet'}
|
||||
});
|
||||
|
||||
@@ -1237,4 +1244,14 @@ EOF
|
||||
{
|
||||
$this->sDefinitionFile = $sDefinitionFile;
|
||||
}
|
||||
|
||||
public function GetReloadURL()
|
||||
{
|
||||
return $this->sReloadURL;
|
||||
}
|
||||
|
||||
public function SetReloadURL($sReloadURL)
|
||||
{
|
||||
$this->sReloadURL = $sReloadURL;
|
||||
}
|
||||
}
|
||||
@@ -928,7 +928,7 @@ class DisplayBlock
|
||||
|
||||
$sChartType = isset($aExtraParams['chart_type']) ? $aExtraParams['chart_type'] : 'pie';
|
||||
$sTitle = isset($aExtraParams['chart_title']) ? '<h1 style="text-align:center">'.htmlentities(Dict::S($aExtraParams['chart_title']), ENT_QUOTES, 'UTF-8').'</h1>' : '';
|
||||
$sHtml = "$sTitle<div style=\"height:200px;width:100%\" id=\"my_chart_$sId{$iChartCounter}\"><div style=\"height:200px;line-height:200px;vertical-align:center;text-align:center;width:100%\"><img src=\"../images/indicator.gif\"></div></div>\n";
|
||||
$sHtml = "$sTitle<div style=\"height:200px;width:100%\" class=\"dashboard_chart\" id=\"my_chart_$sId{$iChartCounter}\"><div style=\"height:200px;line-height:200px;vertical-align:center;text-align:center;width:100%\"><img src=\"../images/indicator.gif\"></div></div>\n";
|
||||
$sGroupBy = isset($aExtraParams['group_by']) ? $aExtraParams['group_by'] : '';
|
||||
$sGroupByExpr = isset($aExtraParams['group_by_expr']) ? '¶ms[group_by_expr]='.$aExtraParams['group_by_expr'] : '';
|
||||
$sFilter = $this->m_oFilter->serialize();
|
||||
@@ -1004,6 +1004,7 @@ EOF
|
||||
$sJson = json_encode($aValues);
|
||||
$oPage->add_ready_script(
|
||||
<<<EOF
|
||||
|
||||
var chart = c3.generate({
|
||||
bindto: d3.select('#my_chart_$sId'),
|
||||
data: {
|
||||
@@ -1051,6 +1052,12 @@ var chart = c3.generate({
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (typeof(charts) === "undefined")
|
||||
{
|
||||
charts = [];
|
||||
}
|
||||
charts.push(chart);
|
||||
EOF
|
||||
);
|
||||
break;
|
||||
@@ -1089,6 +1096,12 @@ var chart = c3.generate({
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (typeof(charts) === "undefined")
|
||||
{
|
||||
charts = [];
|
||||
}
|
||||
charts.push(chart);
|
||||
EOF
|
||||
);
|
||||
break;
|
||||
|
||||
@@ -956,9 +956,31 @@ EOF
|
||||
$sHtml .= '<p>' . Dict::Format('UI:ExplainPrintable', '<img src="../images/eye-open-555.png" style="vertical-align:middle">') . '</p>';
|
||||
$sHtml .= "<div id=\"hiddeable_chapters\"></div>";
|
||||
$sHtml .= '<button onclick="window.print()">' . htmlentities(Dict::S('UI:Button:GoPrint'), ENT_QUOTES, 'UTF-8') . '</button>';
|
||||
$sHtml .= ' ';
|
||||
$sHtml .= '<button onclick="window.close()">' . htmlentities(Dict::S('UI:Button:Cancel'), ENT_QUOTES, 'UTF-8') . '</button>';
|
||||
$sHtml .= ' ';
|
||||
$sHtml .= '<button onclick="window.close()">' . htmlentities(Dict::S('UI:Button:Cancel'), ENT_QUOTES, 'UTF-8') . '</button>';
|
||||
$sHtml .= ' ';
|
||||
|
||||
$aResolutionChoices = array('100%' => Dict::S('UI:PrintResolution:FullSize'),
|
||||
'19cm' => Dict::S('UI:PrintResolution:A4Portrait'),
|
||||
'27.7cm' => Dict::S('UI:PrintResolution:A4Landscape'),
|
||||
'19.6cm' => Dict::S('UI:PrintResolution:LetterPortrait'),
|
||||
'25.9cm' => Dict::S('UI:PrintResolution:LetterLandscape'),
|
||||
);
|
||||
$sHtml .=
|
||||
<<<EOF
|
||||
<select name="text" onchange='$(".printable-content").width(this.value); $(charts).each(function(i, chart) { $(chart).trigger("resize"); });'>
|
||||
EOF
|
||||
;
|
||||
$bIsSelected = true;
|
||||
foreach ($aResolutionChoices as $sValue => $sText)
|
||||
{
|
||||
$sHtml .= '<option value="'.$sValue.'" '.($bIsSelected ? 'selected' : '').'>'.$sText.'</option>';
|
||||
$bIsSelected = false;
|
||||
}
|
||||
$sHtml .= "</select>";
|
||||
|
||||
$sHtml .= "</div>";
|
||||
$sHtml .= "<div class=\"printable-content\">";
|
||||
}
|
||||
|
||||
// Render the revision number
|
||||
@@ -979,7 +1001,9 @@ EOF
|
||||
$sHtml .= ' <!-- Beginning of page content -->';
|
||||
$sHtml .= self::FilterXSS($this->s_content);
|
||||
$sHtml .= ' <!-- End of page content -->';
|
||||
} elseif ($this->GetOutputFormat() == 'html') {
|
||||
}
|
||||
elseif ($this->GetOutputFormat() == 'html')
|
||||
{
|
||||
$oAppContext = new ApplicationContext();
|
||||
|
||||
$sUserName = UserRights::GetUser();
|
||||
@@ -1171,6 +1195,10 @@ EOF;
|
||||
$sHtml .= self::FilterXSS($this->s_content);
|
||||
}
|
||||
|
||||
if ($this->IsPrintableVersion()) {
|
||||
$sHtml .= '</div>';
|
||||
}
|
||||
|
||||
$sHtml .= "</body>\n";
|
||||
$sHtml .= "</html>\n";
|
||||
|
||||
|
||||
@@ -1166,6 +1166,7 @@ class DashboardMenuNode extends MenuNode
|
||||
{
|
||||
$sDivId = preg_replace('/[^a-zA-Z0-9_]/', '', $this->sMenuId);
|
||||
$oPage->add('<div class="dashboard_contents" id="'.$sDivId.'">');
|
||||
$oDashboard->SetReloadURL($this->GetHyperlink($aExtraParams));
|
||||
$oDashboard->Render($oPage, false, $aExtraParams);
|
||||
$oPage->add('</div>');
|
||||
|
||||
|
||||
@@ -1114,6 +1114,12 @@ class utils
|
||||
new URLPopupMenuItem('UI:ExportDashboard', Dict::S('UI:ExportDashBoard'), utils::GetAbsoluteUrlAppRoot().'pages/ajax.render.php?operation=export_dashboard&id='.$sDashboardId.'&file='.$sDashboardFileURL),
|
||||
new JSPopupMenuItem('UI:ImportDashboard', Dict::S('UI:ImportDashBoard'), "UploadDashboard({dashboard_id: '$sDashboardId', file: '$sDashboardFileJS', title: '$sDlgTitle', text: '$sDlgText', close_btn: '$sCloseBtn' })"),
|
||||
);
|
||||
if ($oDashboard->GetReloadURL())
|
||||
{
|
||||
$aResult[] = new SeparatorPopupMenuItem();
|
||||
$aResult[] = new URLPopupMenuItem('UI:Menu:PrintableVersion', Dict::S('UI:Menu:PrintableVersion'), $oDashboard->GetReloadURL().'&printable=1', '_blank');
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -1254,7 +1254,7 @@ class AttributeDashboard extends AttributeDefinition
|
||||
static public function ListExpectedParams()
|
||||
{
|
||||
return array_merge(parent::ListExpectedParams(),
|
||||
array("definition_file"));
|
||||
array("definition_file", "is_user_editable"));
|
||||
}
|
||||
|
||||
public function GetDashboard()
|
||||
@@ -1265,6 +1265,11 @@ class AttributeDashboard extends AttributeDefinition
|
||||
return RuntimeDashboard::GetDashboard($sFilePath, $sClass.'__'.$sAttCode);
|
||||
}
|
||||
|
||||
public function IsUserEditable()
|
||||
{
|
||||
return $this->Get('is_user_editable');
|
||||
}
|
||||
|
||||
public function IsWritable()
|
||||
{
|
||||
return false;
|
||||
|
||||
@@ -16,12 +16,20 @@ div.graph_config { display:none; }
|
||||
h2.printable-tab-title {
|
||||
page-break-after: avoid;
|
||||
}
|
||||
h1 {
|
||||
page-break-after: avoid;
|
||||
}
|
||||
div#tabbedContent_0 { border:none; }
|
||||
p a, .ui-widget-content td a, p a:hover, .ui-widget-content td a:hover, p a:visited, .ui-widget-content td a:visited, td a, td a:visited, td a:hover {
|
||||
padding-left: 0;
|
||||
background: transparent;
|
||||
}
|
||||
body { margin:0; }
|
||||
body {
|
||||
margin:10px;
|
||||
}
|
||||
@page {
|
||||
margin: 1cm;
|
||||
}
|
||||
|
||||
.printable-tab {
|
||||
-webkit-region-break-inside: avoid;
|
||||
|
||||
@@ -1132,6 +1132,13 @@ When associated with a trigger, each action is given an "order" number, specifyi
|
||||
'UI:Button:Refresh' => 'Refresh',
|
||||
'UI:Button:GoPrint' => 'Print...',
|
||||
'UI:ExplainPrintable' => 'Click onto the %1$s icon to hide items from the print.<br/>Use the "print preview" feature of your browser to preview before printing.<br/>Note: this header and the other tuning controls will not be printed.',
|
||||
'UI:PrintResolution:FullSize' => 'Full size',
|
||||
'UI:PrintResolution:A4Portrait' => 'A4 Portrait',
|
||||
'UI:PrintResolution:A4Landscape' => 'A4 Landscape',
|
||||
'UI:PrintResolution:LetterPortrait' => 'Letter Portrait',
|
||||
'UI:PrintResolution:LetterLandscape' => 'Letter Landscape',
|
||||
'UI:Toggle:StandardDashboard' => 'Standard',
|
||||
'UI:Toggle:CustomDashboard' => 'Custom',
|
||||
|
||||
'UI:ConfigureThisList' => 'Configure This List...',
|
||||
'UI:ListConfigurationTitle' => 'List Configuration',
|
||||
|
||||
@@ -955,10 +955,15 @@ try
|
||||
$sDashboardId = utils::ReadParam('dashboard_id', '', false, 'raw_data');
|
||||
$aExtraParams = utils::ReadParam('extra_params', array(), false, 'raw_data');
|
||||
$sDashboardFile = utils::ReadParam('file', '', false, 'raw_data');
|
||||
$sReloadURL = utils::ReadParam('reload_url', '', false, 'raw_data');
|
||||
$oDashboard = RuntimeDashboard::GetDashboard($sDashboardFile, $sDashboardId);
|
||||
$aResult = array('error' => '');
|
||||
if (!is_null($oDashboard))
|
||||
{
|
||||
if (!empty($sReloadURL))
|
||||
{
|
||||
$oDashboard->SetReloadURL($sReloadURL);
|
||||
}
|
||||
$oDashboard->Render($oPage, false, $aExtraParams);
|
||||
}
|
||||
$oPage->add_ready_script("$('.dashboard_contents table.listResults').tableHover(); $('.dashboard_contents table.listResults').tablesorter( { widgets: ['myZebra', 'truncatedList']} );");
|
||||
@@ -967,6 +972,7 @@ try
|
||||
case 'save_dashboard':
|
||||
$sDashboardId = utils::ReadParam('dashboard_id', '', false, 'raw_data');
|
||||
$aExtraParams = utils::ReadParam('extra_params', array(), false, 'raw_data');
|
||||
$sReloadURL = utils::ReadParam('reload_url', '', false, 'raw_data');
|
||||
$sJSExtraParams = json_encode($aExtraParams);
|
||||
$aParams = array();
|
||||
$aParams['layout_class'] = utils::ReadParam('layout_class', '');
|
||||
@@ -984,7 +990,7 @@ try
|
||||
<<<EOF
|
||||
$('.dashboard_contents#$sDivId').block();
|
||||
$.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php',
|
||||
{ operation: 'reload_dashboard', dashboard_id: '$sDashboardId', file: '$sFile', extra_params: $sJSExtraParams},
|
||||
{ operation: 'reload_dashboard', dashboard_id: '$sDashboardId', file: '$sFile', extra_params: $sJSExtraParams, reload_url: '$sReloadURL'},
|
||||
function(data){
|
||||
$('.dashboard_contents#$sDivId').html(data);
|
||||
$('.dashboard_contents#$sDivId').unblock();
|
||||
@@ -1005,7 +1011,7 @@ EOF
|
||||
<<<EOF
|
||||
$('.dashboard_contents#$sDivId').block();
|
||||
$.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php',
|
||||
{ operation: 'reload_dashboard', dashboard_id: '$sDashboardId', file: '$sFile'},
|
||||
{ operation: 'reload_dashboard', dashboard_id: '$sDashboardId', file: '$sFile', reload_url: '$sReloadURL'},
|
||||
function(data){
|
||||
$('.dashboard_contents#$sDivId').html(data);
|
||||
$('.dashboard_contents#$sDivId').unblock();
|
||||
@@ -1024,8 +1030,10 @@ EOF
|
||||
$aParams['cells'] = utils::ReadParam('cells', array(), false, 'raw_data');
|
||||
$aParams['auto_reload'] = utils::ReadParam('auto_reload', false);
|
||||
$aParams['auto_reload_sec'] = utils::ReadParam('auto_reload_sec', 300);
|
||||
$sReloadURL = utils::ReadParam('reload_url', '', false, 'raw_data');
|
||||
$oDashboard = new RuntimeDashboard($sDashboardId);
|
||||
$oDashboard->FromParams($aParams);
|
||||
$oDashboard->SetReloadURL($sReloadURL);
|
||||
$oDashboard->Render($oPage, true /* bEditMode */, $aExtraParams);
|
||||
break;
|
||||
|
||||
@@ -1033,9 +1041,14 @@ EOF
|
||||
$sId = utils::ReadParam('id', '', false, 'raw_data');
|
||||
$aExtraParams = utils::ReadParam('extra_params', array(), false, 'raw_data');
|
||||
$sDashboardFile = utils::ReadParam('file', '', false, 'raw_data');
|
||||
$sReloadURL = utils::ReadParam('reload_url', '', false, 'raw_data');
|
||||
$oDashboard = RuntimeDashboard::GetDashboard($sDashboardFile, $sId);
|
||||
if (!is_null($oDashboard))
|
||||
{
|
||||
if (!empty($sReloadURL))
|
||||
{
|
||||
$oDashboard->SetReloadURL($sReloadURL);
|
||||
}
|
||||
$oDashboard->RenderEditor($oPage, $aExtraParams);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1436,6 +1436,7 @@ EOF
|
||||
elseif ($sAttType == 'AttributeDashboard')
|
||||
{
|
||||
$aTagFieldsInfo[] = $sAttCode;
|
||||
$aParameters['is_user_editable'] = $this->GetPropBoolean($oField, 'is_user_editable', true);
|
||||
$aParameters['definition_file'] = $this->GetPropString($oField, 'definition_file');
|
||||
|
||||
if ($aParameters['definition_file'] == null)
|
||||
|
||||
Reference in New Issue
Block a user