N°1408 - Dashboard Printer friendly page + user edit rights

This commit is contained in:
Eric
2018-10-11 15:51:24 +02:00
parent 256d4e2cb3
commit f3f70d6296
11 changed files with 120 additions and 20 deletions

View File

@@ -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>');
}
}

View File

@@ -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;
}
}

View File

@@ -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']) ? '&params[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;

View File

@@ -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 .= '&nbsp;';
$sHtml .= '<button onclick="window.close()">' . htmlentities(Dict::S('UI:Button:Cancel'), ENT_QUOTES, 'UTF-8') . '</button>';
$sHtml .= '&nbsp;';
$sHtml .= '<button onclick="window.close()">' . htmlentities(Dict::S('UI:Button:Cancel'), ENT_QUOTES, 'UTF-8') . '</button>';
$sHtml .= '&nbsp;';
$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";

View File

@@ -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>');

View File

@@ -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:

View File

@@ -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;

View File

@@ -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;

View File

@@ -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',

View File

@@ -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;

View File

@@ -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)