%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/components/bitrix/report.view/templates/.default/ |
| Current File : //home/bitrix/www/bitrix/components/bitrix/report.view/templates/.default/template.php |
<?php
\Bitrix\Main\UI\Extension::load("ui.buttons");
\Bitrix\Main\UI\Extension::load("ui.buttons.icons");
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
/** @var CBitrixComponentTemplate $this */
/** @global CMain $APPLICATION */
global $APPLICATION;
$resultTableId = 'report-result-table';
/**
* @param CBitrixComponentTemplate &$component
* @param mixed &$arParams[]
* @param mixed &$arResult[]
*/
function reportViewShowTopButtons(&$component, &$arParams, &$arResult)
{
/** @global CMain $APPLICATION */
global $APPLICATION;
$isStExport = is_array($arResult['STEXPORT_PARAMS']);
$stExportManagerId = '';
if ($isStExport)
{
$stExportManagerId = $arResult['STEXPORT_PARAMS']['managerId'];
}
$component->SetViewTarget("pagetitle", 100);?>
<script>
(function ()
{
BX.ready(function ()
{
var element = document.body.querySelector('[data-role="action-report"]');
BX.bind(
element,
'click',
function ()
{
var isStExport = <? echo $isStExport ? 'true' : 'false'; ?>;
BX.PopupMenu.show(
element.getAttribute('data-role'),
element,
[
isStExport ?
{
text: '<?=GetMessage('REPORT_EXCEL_EXPORT')?>',
onclick: "BX.Report.StExportManager.items['<?= CUtil::JSEscape($stExportManagerId) ?>'].startExport('excel')",
className: 'reports-title-excel-icon'
} :
{
text: '<?=GetMessage('REPORT_EXCEL_EXPORT')?>',
href: '<?=CUtil::JSEscape($APPLICATION->GetCurPageParam("EXCEL=Y&ncc=1"));?>',
className: 'reports-title-excel-icon'
},
{
text: '<?=GetMessage('REPORT_COPY')?>',
href: '<?=CUtil::JSEscape(CComponentEngine::MakePathFromTemplate($arParams["PATH_TO_REPORT_CONSTRUCT"], array("report_id" => $arParams['REPORT_ID'], 'action' => 'copy')));?>',
className: 'reports-title-copy-icon'
}
<? if ($arResult['MARK_DEFAULT'] <= 0 && $arResult['AUTHOR']) : ?>
,{
text: '<?=GetMessage('REPORT_EDIT')?>',
href: '<?=CUtil::JSEscape(CComponentEngine::MakePathFromTemplate($arParams["PATH_TO_REPORT_CONSTRUCT"], array("report_id" => $arParams['REPORT_ID'], 'action' => 'edit')));?>',
className: 'reports-title-edit-icon'
}
<? endif; ?>
],
{
offsetLeft: 20,
angle: {
offset: 5
}
}
)
}
)
})
})();
</script>
<button class="ui-btn ui-btn-light-border ui-btn-icon-setting ui-btn-themes" data-role="action-report"></button>
<a class="ui-btn ui-btn-primary ui-btn-icon-back" href="<?=CComponentEngine::MakePathFromTemplate($arParams["PATH_TO_REPORT_LIST"], array());?>">
<?=GetMessage('REPORT_RETURN_TO_LIST')?></a>
<?php
$component->EndViewTarget();
}
if (!empty($arResult['ERROR']))
{
$GLOBALS['APPLICATION']->SetAdditionalCSS('/bitrix/js/report/css/report.css');
$APPLICATION->SetTitle($arResult['report']['TITLE']);
echo $arResult['ERROR'];
reportViewShowTopButtons($this, $arParams, $arResult);
return false;
}
if ($arParams['USE_CHART'] && $arResult['settings']['chart']['display'])
{
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/img.php');
// amCharts
$GLOBALS['APPLICATION']->AddHeadScript('/bitrix/js/main/amcharts/3.3/amcharts.js');
$GLOBALS['APPLICATION']->AddHeadScript('/bitrix/js/main/amcharts/3.3/serial.js');
$GLOBALS['APPLICATION']->AddHeadScript('/bitrix/js/main/amcharts/3.3/pie.js');
}
// calendar
CJSCore::Init(array('date'));
$arPeriodTypes = array(
"month" => GetMessage("TASKS_THIS_MONTH"),
"month_ago" => GetMessage("TASKS_PREVIOUS_MONTH"),
"week" => GetMessage("TASKS_THIS_WEEK"),
"week_ago" => GetMessage("TASKS_PREVIOUS_WEEK"),
"days" => GetMessage("TASKS_LAST_N_DAYS"),
"after" => GetMessage("TASKS_AFTER"),
"before" => GetMessage("TASKS_BEFORE"),
"interval" => GetMessage("TASKS_DATE_INTERVAL"),
"all" => GetMessage("TASKS_DATE_ALL")
);
$GLOBALS['APPLICATION']->SetAdditionalCSS('/bitrix/js/report/css/report.css');
$APPLICATION->SetTitle($arResult['report']['TITLE']);
// determine column data type
function getResultColumnDataType(&$viewColumnInfo, &$customColumnTypes, $helperClassName)
{
$dataType = null;
if (is_array($customColumnTypes) && array_key_exists($viewColumnInfo['fieldName'], $customColumnTypes))
{
$dataType = $customColumnTypes[$viewColumnInfo['fieldName']];
}
else
{
/** @var Bitrix\Main\Entity\Field[] $viewColumnInfo */
$dataType = call_user_func(array($helperClassName, 'getFieldDataType'), $viewColumnInfo['field']);
}
if (!empty($viewColumnInfo['prcnt']))
{
$dataType = 'float';
}
else if (!empty($viewColumnInfo['aggr']))
{
if ($viewColumnInfo['aggr'] == 'COUNT_DISTINCT') $dataType = 'integer';
else if ($viewColumnInfo['aggr'] == 'GROUP_CONCAT') $dataType = 'string';
else if ($dataType == 'boolean')
{
if ($viewColumnInfo['aggr'] == 'MIN' || $viewColumnInfo['aggr'] == 'AVG'
|| $viewColumnInfo['aggr'] == 'MAX' || $viewColumnInfo['aggr'] == 'SUM'
|| $viewColumnInfo['aggr'] == 'COUNT_DISTINCT')
{
$dataType = 'integer';
}
}
}
return $dataType;
}
?>
<div class="reports-result-list-wrap">
<?php if ($arParams['USE_CHART'] && $arResult['settings']['chart']['display']): ?>
<style type="text/css">
div.graph {
background-color: white;
border: 1px solid #D0D8D9;
box-shadow: 1px 1px 2px 0 rgba(88, 112, 118, 0.1);
border-radius: 2px;
color: gray;
font-size: 14px;
margin: 0 3px 23px;
overflow: auto;
padding: 0 16px;
}
a.report-chart-show:before {
background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAADCAIAAAA/Y+msAAAABnRSTlMA/wD/AP83WBt9AAAAJklEQVQImVXHwQ0AMAzCQKf7sSwMSH6R6td52gJJAEnAuz+Mbf4WzdgMSstcwD0AAAAASUVORK5CYII=") no-repeat;
}
a.report-chart-hide:before {
background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAADCAIAAAA/Y+msAAAABnRSTlMA/wD/AP83WBt9AAAAH0lEQVQImWPctGkTAypg8vX1Reb7+voyQSg4n4GBAQC4MgW4jUjKCwAAAABJRU5ErkJggg==") no-repeat;
}
a.report-chart-show:before,
a.report-chart-hide:before {
content: "";
height: 3px;
width: 6px;
display: inline-block;
margin: 0 4px 2px 0;
}
a.report-chart-show,
a.report-chart-hide {
font-size: 12px;
color: gray;
cursor: pointer;
border-bottom: 1px dashed gray;
margin-left: 4px;
text-decoration: none;
}
</style>
<?php
// data preparation for the chart
function prepareChartData(&$arResult, &$arGroupingResult = null)
{
$nMaxValues = 500;
$result = array('requestData' => array(), 'columnsNames' => array(), 'err' => 0);
// check
$chartSettings = $arResult['settings']['chart'];
if (!isset($chartSettings['x_column']))
{
$result['err'] = 49;
}
$xColumnIndex = $chartSettings['x_column'];
if (!is_array($arResult['viewColumns'][$xColumnIndex]))
{
$result['err'] = 49;
return $result;
}
if (!is_array($chartSettings['y_columns']))
{
$result['err'] = 49;
return $result;
}
$yColumnsCount = count($chartSettings['y_columns']);
if ($yColumnsCount === 0)
{
$result['err'] = 49;
return $result;
}
foreach ($chartSettings['y_columns'] as $yColumnIndex)
{
if (!is_array($arResult['viewColumns'][$yColumnIndex]))
{
$result['err'] = 49;
break;
}
}
if ($result['err'] !== 0)
{
return $result;
}
$chartTypeIds = array();
foreach ($arResult['chartTypes'] as $chartTypeInfo) $chartTypeIds[] = $chartTypeInfo['id'];
if (!is_set($chartSettings['type'])
|| empty($chartSettings['type'])
|| !in_array($chartSettings['type'], $chartTypeIds))
{
$result['err'] = 49;
return $result;
}
$chartType = $chartSettings['type'];
if ($chartType === 'pie') $yColumnsCount = 1; // pie chart has only one array of a values
$xColumnDataType = getResultColumnDataType($arResult['viewColumns'][$xColumnIndex],
$arResult['customColumnTypes'], $arResult['helperClassName']);
$xColumnResultName = $arResult['viewColumns'][$xColumnIndex]['resultName'];
$yColumnsIndexes = array();
$yColumnsResultNames = array();
$columnsHumanTitles = array();
$columnsHumanTitles[0] = $arResult['viewColumns'][$xColumnIndex]['humanTitle'];
$columnsTypes = array();
$columnsTypes[0] = $xColumnDataType;
for ($i = 0; $i < $yColumnsCount; $i++)
{
$yColumnsIndexes[] = $yColumnIndex = $chartSettings['y_columns'][$i];
$yColumnsResultNames[] = $arResult['viewColumns'][$yColumnIndex]['resultName'];
$columnsHumanTitles[] = $arResult['viewColumns'][$yColumnIndex]['humanTitle'];
$columnsTypes[$i + 1] = getResultColumnDataType($arResult['viewColumns'][$yColumnIndex],
$arResult['customColumnTypes'], $arResult['helperClassName']);
}
$requestData = array(
'type' => $chartType,
'columnTypes' => $columnsTypes
);
unset($columnsTypes);
if (!is_null($arGroupingResult) && is_array($arGroupingResult))
{
$n = count($arGroupingResult);
if ($chartType !== 'pie')
$n = min($nMaxValues, $n);
for ($i = 0; $i < $n; $i++)
{
$row = array();
$dataRow = $arGroupingResult[$i];
$row[0] = htmlspecialcharsback(str_replace(array(' ', '"'), array('', '"'), strip_tags($dataRow[$xColumnIndex])));
foreach ($yColumnsIndexes as $yColumnIndex)
$row[] = htmlspecialcharsback(str_replace(array(' ', '"'), array('', '"'), strip_tags($dataRow[$yColumnIndex])));
$requestData['data'][] = $row;
}
}
else
{
$n = count($arResult['data']);
if ($chartType !== 'pie')
$n = min($nMaxValues, $n);
for ($i = 0; $i < $n; $i++)
{
$row = array();
$dataRow = $arResult['data'][$i];
$bHasMultipleValues = false;
if (isset($arResult['customChartData'][$i][$xColumnResultName]['multiple']))
{
$customValueInfo = $arResult['customChartData'][$i][$xColumnResultName];
if ($customValueInfo['multiple'] === true)
{
$nValue = 0;
$dataValue = null;
foreach ($customValueInfo as $cvKey => $cvInfo)
{
if ($cvKey !== 'multiple')
{
/*switch ($xColumnDataType)
{
case 'boolean':
case 'float':
case 'integer':
if ($nValue === 0)
$dataValue = $cvInfo['value'];
else
$dataValue = $cvInfo['value'] + $dataValue;
break;
case 'date':
case 'datetime':
case 'string':
case 'text':
case 'enum':
case 'file':
case 'disk_file':
case 'employee':
case 'crm':
case 'crm_status':
case 'iblock_element':
case 'iblock_section':
if ($nValue === 0)
$dataValue = $cvInfo['value'];
else
$dataValue = $dataValue.' / '.$cvInfo['value'];
break;
}*/
if ($nValue === 0)
{
$dataValue = $cvInfo['value'];
}
else
{
$dataValue = $dataValue . ' / ' . $cvInfo['value'];
$bHasMultipleValues = true;
}
$nValue++;
}
}
}
else
{
$dataValue = $customValueInfo[0]['value'];
}
}
else
{
$dataValue = $dataRow[$xColumnResultName];
if (is_array($dataValue))
{
$dataValue = implode(' / ', $dataValue);
$bHasMultipleValues = true;
}
}
if ($bHasMultipleValues)
{
$requestData['columnTypes'][0] = $xColumnDataType = 'string';
}
unset($bHasMultipleValues);
$row[0] = htmlspecialcharsback(str_replace(array(' ', '"'), array('', '"'), strip_tags($dataValue)));
foreach ($yColumnsResultNames as $yColumnResultName)
{
if (isset($arResult['customChartData'][$i][$yColumnResultName]['multiple']))
{
$customValueInfo = $arResult['customChartData'][$i][$yColumnResultName];
if ($customValueInfo['multiple'] === true)
{
$dataValue = 0;
foreach ($customValueInfo as $cvKey => $cvInfo)
{
if ($cvKey !== 'multiple')
$dataValue = $cvInfo['value'] + $dataValue;
}
}
else
{
$dataValue = $customValueInfo[0]['value'];
}
}
else
{
$dataValue = $dataRow[$yColumnResultName];
}
$row[] = htmlspecialcharsback(str_replace(array(' ', '"'), array('', '"'), strip_tags($dataValue)));
}
$requestData['data'][] = $row;
}
}
$result['requestData'] = $requestData;
$result['columnsNames'] = $columnsHumanTitles;
return $result;
}
function validateChartData(&$chartInfo)
{
$err = 0;
$chartXValueTypes = array('boolean', 'date', 'datetime', 'float', 'integer', 'string', 'text', 'enum', 'file',
'disk_file', 'employee', 'crm', 'crm_status', 'iblock_element', 'iblock_section');
$chartTypes = array(
array('id' => 'line', 'name' => GetMessage('REPORT_CHART_TYPE_LINE1'), 'value_types' => array(
/*'boolean', 'date', 'datetime', */
'float', 'integer'/*, 'string', 'text', 'enum', 'file', 'disk_file', 'employee', 'crm', 'crm_status',
'iblock_element', 'iblock_section'*/)),
array('id' => 'bar', 'name' => GetMessage('REPORT_CHART_TYPE_BAR1'), 'value_types' => array(
/*'boolean', 'date', 'datetime', */
'float', 'integer'/*, 'string', 'text', 'enum', 'file', 'disk_file', 'employee', 'crm', 'crm_status',
'iblock_element', 'iblock_section'*/)),
array('id' => 'pie', 'name' => GetMessage('REPORT_CHART_TYPE_PIE'), 'value_types' => array(
/*'boolean', 'date', 'datetime', */
'float', 'integer'/*, 'string', 'text', 'enum', 'file', 'disk_file', 'employee', 'crm', 'crm_status',
'iblock_element', 'iblock_section'*/)),
);
// check meta
$columnYValueTypes = array();
$nColumns = 0;
if (is_array($chartInfo)
&& is_array($chartInfo['requestData']))
{
$chartTypeIds = array();
foreach ($chartTypes as &$chartTypeInfo) $chartTypeIds[] = $chartTypeInfo['id'];
$chartTypesIndexes = array_flip($chartTypeIds);
$columnYValueTypes = $chartTypes[$chartTypesIndexes[$chartInfo['requestData']['type']]]['value_types'];
if (isset($chartInfo['requestData']['type']) && in_array($chartInfo['requestData']['type'], $chartTypeIds))
{
if (isset($chartInfo['requestData']['columnTypes']) && is_array($chartInfo['requestData']['columnTypes']))
{
if (isset($chartInfo['columnsNames']) && is_array($chartInfo['columnsNames']))
{
$nColumnsNames = count($chartInfo['columnsNames']);
$nColumns = count($chartInfo['requestData']['columnTypes']);
if ($nColumns >= 2)
{
if ($nColumns === $nColumnsNames)
{
if ($chartInfo['requestData']['type'] == 'pie' && $nColumns != 2) $err = 5;
else
{
foreach ($chartInfo['requestData']['columnTypes'] as $columnIndex => $columnType)
{
if (is_int($columnIndex) && $columnIndex >= 0)
{
if ($columnIndex === 0)
{
if (!in_array($columnType, $chartXValueTypes)) $err = 7;
}
else
{
if (!in_array($columnType, $columnYValueTypes)) $err = 8;
}
}
else $err = 6;
if ($err !== 0) break;
}
}
}
else $err = 17;
}
else $err = 4;
}
else $err = 16;
}
else $err = 3;
}
else $err = 2;
}
else $err = 1;
// check data
if ($err === 0)
{
if (isset($chartInfo['requestData']['data']) && is_array($chartInfo['requestData']['data']))
{
foreach ($chartInfo['requestData']['data'] as $rowIndex => &$dataRow)
{
if (is_int($rowIndex) && $rowIndex >= 0)
{
if (is_array($dataRow))
{
$nDataColumns = count($dataRow);
if ($nDataColumns === $nColumns)
{
foreach ($dataRow as $columnIndex => &$dataValue)
{
if (is_int($columnIndex) && $columnIndex >= 0)
{
// convert type of value
switch ($chartInfo['requestData']['columnTypes'][$columnIndex])
{
case 'date':
case 'datetime':
if (!empty($dataValue))
{
if (!CheckDateTime($dataValue, CSite::GetDateFormat('SHORT'))) $err = 15;
}
break;
case 'float':
if (is_string($dataValue)) $dataValue = str_replace(' ', '', $dataValue);
$dataValue = (float)$dataValue;
break;
case 'integer':
if (is_string($dataValue)) $dataValue = str_replace(' ', '', $dataValue);
$dataValue = (int)$dataValue;
break;
case 'boolean':
case 'string':
case 'text':
case 'enum':
case 'file':
case 'disk_file':
case 'employee':
case 'crm':
case 'crm_status':
case 'iblock_element':
case 'iblock_section':
$dataValue = (string)$dataValue;
break;
default:
$err = 14;
}
}
else $err = 13;
if ($err !== 0) break;
}
}
else $err = 12;
}
else $err = 11;
}
else $err = 10;
if ($err !== 0) break;
}
}
else $err = 9;
}
return $err;
}
function prepareChartDataForAmCharts(&$chartInfo)
{
$type = $categoryField = $categoryType = '';
$width = $height = 0;
$data = $valueColors = $valueTypes = $valueFields = array();
$baseColor = '6699CC';
$err = validateChartData($chartInfo);
if ($err === 0)
{
switch ($chartInfo['requestData']['type'])
{
case 'line':
$type = 'line';
break;
case 'bar':
$type = 'column';
break;
case 'pie':
$type = 'pie';
break;
default:
$type = 'line';
}
$data = array();
// chart size
$minWidth = 192;
$minHeight = 120;
$maxWidth = 10000;
$maxHeight = 6250;
if (isset($chartInfo['requestData']['width']))
{
$width = intval($chartInfo['requestData']['width']);
if ($width < $minWidth) $width = $minWidth;
if ($width > $maxWidth) $width = $maxWidth;
}
else $width = 670;
if (isset($chartInfo['requestData']['height']))
{
$height = intval($chartInfo['requestData']['height']);
if ($height < $minHeight) $height = $minHeight;
if ($height > $maxHeight) $height = $maxHeight;
}
else $height = 420;
$categoryType = $chartInfo['requestData']['columnTypes'][0];
if ($type === 'line')
{
if (count($chartInfo['requestData']['data']) >= 1)
{
$bDateSort = false;
$arDateSort = array();
$tmpData = array();
foreach ($chartInfo['requestData']['data'] as $rowIndex => $row)
{
$dataRow = array();
foreach ($row as $k => $v)
{
$bSkipRow = false;
if ($k === 0)
{
if ($categoryType === 'date' || $categoryType === 'datetime')
{
if ($rowIndex === 0)
$bDateSort = true;
if (empty($v))
$bSkipRow = true;
$v = ConvertDateTime($v, 'YYYY-MM-DD HH:MI:SS');
$v[10] = 'T';
if ($bDateSort && !$bSkipRow)
$arDateSort[$rowIndex] = strtotime($v);
}
}
$dataRow[$chartInfo['columnsNames'][$k]] = $v;
}
if (!$bSkipRow)
$tmpData[] = $dataRow;
}
if (!$bDateSort)
{
$data = $tmpData;
}
else
{
if (count($arDateSort) >= 1)
{
asort($arDateSort);
foreach (array_keys($arDateSort) as $rowIndex)
$data[] = $tmpData[$rowIndex];
}
}
unset($tmpData);
if (count($data) >= 1)
{
$nColors = count($chartInfo['columnsNames']) - 1;
$color = $baseColor;
foreach ($chartInfo['columnsNames'] as $k => $v)
{
if ($k === 0)
{
$categoryField = $v;
}
else
{
$valueFields[] = $v;
$valueTypes[] = $chartInfo['requestData']['columnTypes'][$k];
$valueColors[] = '#'.$color;
$color = GetNextRGB($color, $nColors);
}
}
}
else $err = 48;
}
else $err = 47;//42;
}
else if ($type === 'column')
{
if (count($chartInfo['requestData']['data']) >= 1)
{
foreach ($chartInfo['requestData']['data'] as $row)
{
$dataRow = array();
foreach ($row as $k => $v)
$dataRow[$chartInfo['columnsNames'][$k]] = $v;
$data[] = $dataRow;
}
$nColors = count($chartInfo['columnsNames']) - 1;
$color = $baseColor;
foreach ($chartInfo['columnsNames'] as $k => $v)
{
if ($k === 0)
{
$categoryField = $v;
}
else
{
$valueFields[] = $v;
$valueTypes[] = $chartInfo['requestData']['columnTypes'][$k];
$valueColors[] = '#'.$color;
$color = GetNextRGB($color, $nColors);
}
}
}
else $err = 47;//43;
}
else if ($type === 'pie')
{
if (count($chartInfo['requestData']['data']) >= 1)
{
$arConsolidated = array();
foreach ($chartInfo['requestData']['data'] as $dataRow)
{
$index = $dataRow[0];
$arConsolidated[$index] += $dataRow[1];
}
$sumAll = 0.0;
foreach ($arConsolidated as $k => $v)
{
if ($v <= 0.0) unset($arConsolidated[$k]);
else $sumAll += $v;
}
$arCounting = $arConsolidated;
$nValues = count($arCounting);
if ($nValues > 0)
{
$sumAllPrcnt = 0;
foreach ($arCounting as $k => $v)
{
$arCounting[$k] = $v * 100 / $sumAll;
$sumAllPrcnt =+ $arCounting[$k];
}
if (arsort($arCounting, SORT_NUMERIC))
{
$averageValuePrcnt = $sumAllPrcnt/$nValues;
$trifleFactor = max($averageValuePrcnt/50, 1.0);
$i = 0; $prcntCount = 0.0; $offset = 0;
foreach ($arCounting as $k => $v)
{
if ($v < $trifleFactor)
{
$offset = $i;
break;
}
else $prcntCount += $v;
$i++;
}
$sumTrifle = 0;
if ($offset > 0)
{
$arTrifle = array_slice($arCounting, $offset, null, true);
$arCounting = array_slice($arCounting, 0, $offset, true);
foreach (array_keys($arTrifle) as $k) $sumTrifle += $arConsolidated[$k];
}
if (round($prcntCount,2) < 100.0)
{
$trifleName = GetMessage('REPORT_CHART_TRIFLE_LABEL_TEXT');
$arCounting[$trifleName] = 100.0 - $prcntCount;
$arConsolidated[$trifleName] = $sumTrifle;
$nValues++;
}
$nColors = count($arCounting);
$color = $baseColor;
foreach ($arCounting as $k => $v)
{
$dataRow = array(
$chartInfo['columnsNames'][0] => $k,
$chartInfo['columnsNames'][1] => round($arConsolidated[$k], 2)
);
$data[] = $dataRow;
$valueColors[] = '#'.$color;
$color = GetNextRGB($color, $nColors);
}
$categoryField = $chartInfo['columnsNames'][0];
$valueFields[] = $chartInfo['columnsNames'][1];
$valueTypes[] = $chartInfo['requestData']['columnTypes'][1];
}
else $err = 46;
}
else $err = 45;
}
else $err = 47;//44;
}
else $err = 41;
}
$amChartData = array('err' => $err);
if ($err === 0)
{
$amChartData['type'] = $type;
$amChartData['width'] = $width;
$amChartData['height'] = $height;
$amChartData['data'] = $data;
$amChartData['categoryField'] = $categoryField;
$amChartData['categoryType'] = $categoryType;
$amChartData['valueFields'] = $valueFields;
$amChartData['valueTypes'] = $valueTypes;
$amChartData['valueColors'] = $valueColors;
}
return $amChartData;
}
$chartInfo = prepareChartData($arResult);
if (is_array($chartInfo) && isset($chartInfo['err']) && $chartInfo['err'] !== 0)
{
$chartErrorCode = $chartInfo['err'];
}
else
{
$amChartData = prepareChartDataForAmCharts($chartInfo);
$chartErrorCode = $amChartData['err'];
}
unset($chartInfo);
$chartErrorMessage = '';
if ($chartErrorCode !== 0)
{
$chartErrorMessage = GetMessage('REPORT_CHART_ERR_'.sprintf('%02d', $chartErrorCode));
}
?>
<div style="margin-bottom: 14px;"><a id="report-chart-showhide" class="report-chart-show"><?= GetMessage('REPORT_CHART_HIDE') ?></a></div>
<div id="report-chart-container" class="graph"<?php echo ($chartErrorCode > 0) ? '' : ' style="height: 540px;"'; ?>><?= htmlspecialcharsbx($chartErrorMessage) ?></div>
<script type="text/javascript">
function reportChartShowHide()
{
var chartContainer = BX("report-chart-container");
if (chartContainer)
{
if (chartContainer.style.display === "none")
{
chartContainer.style.display = "";
this.innerHTML = BX.util.htmlspecialchars("<?= CUtil::JSEscape(GetMessage('REPORT_CHART_HIDE')) ?>");
this.className = "report-chart-show";
}
else
{
chartContainer.style.display = "none";
this.innerHTML = BX.util.htmlspecialchars("<?= CUtil::JSEscape(GetMessage('REPORT_CHART_SHOW')) ?>");
this.className = "report-chart-hide";
}
}
}
BX.ready(function(){
var chartLink = BX("report-chart-showhide");
if (chartLink)
{
BX.bind(chartLink, "click", reportChartShowHide);
}
});
<? if ($chartErrorCode === 0): ?>
function drawChart()
{
var amChartData = <?=CUtil::PhpToJSObject($amChartData)?>;
var chartType = amChartData["type"];
var valueFields = amChartData["valueFields"];
var valueColors = amChartData["valueColors"];
// CHART
var chart = null;
if (chartType === "pie")
{
chart = new AmCharts.AmPieChart();
}
else
{
chart = new AmCharts.AmSerialChart();
}
chart.dataProvider = amChartData["data"];
chart.numberFormatter = {
precision: -1,
decimalSeparator: '.',
thousandsSeparator:' '
};
chart.percentFormatter = {
precision: 2,
decimalSeparator: '.',
thousandsSeparator:' '
};
chart.zoomOutText = "<?=GetMessage('REPORT_CHART_SHOW_ALL_TEXT')?>";
if (chart.dataProvider !== null && BX.type.isArray(chart.dataProvider) && chart.dataProvider.length > 0)
{
for (var i = 0; i < chart.dataProvider.length; i++)
{
if (chart.dataProvider[i][amChartData["categoryField"]] !== "")
{
chart.dataProvider[i]["__BN__TITLE__"] =
BX.util.htmlspecialchars(chart.dataProvider[i][amChartData["categoryField"]]);
}
}
}
if (chartType === "pie")
{
chart.addTitle(amChartData["categoryField"] + ": " + valueFields[0]);
chart.titleField = amChartData["categoryField"];
chart.valueField = valueFields[0];
chart.outlineAlpha = 0.8;
chart.outlineThickness = 0;
chart.balloonText = "<div>[[__BN__TITLE__]]: [[percents]]%</div>" + BX.util.htmlspecialchars(valueFields[0]) +
": <b>[[value]]</b>";
chart.colors = valueColors;
chart.groupedTitle = "<?=GetMessage('REPORT_CHART_TRIFLE_LABEL_TEXT')?>";
}
else
{
chart.categoryField = amChartData["categoryField"];
}
chart.startDuration = 1;
if (chartType === "column" || chartType === "pie")
{
chart.depth3D = 15;
chart.angle = 30;
}
if (chartType === "line" || chartType === "column")
{
// AXES X
var categoryAxis = chart.categoryAxis;
var categoryType = "string";
categoryAxis.labelRotation = 45;
if (chartType === 'column')
{
categoryAxis.gridPosition = "start";
}
categoryAxis.title = amChartData["categoryField"];
if (chartType === "line"
&& (amChartData["categoryType"] === "date" || amChartData["categoryType"] === "datetime"))
{
categoryType = "date";
categoryAxis.dateFormats = [
{period:"fff", format:"JJ:NN:SS"},
{period:"ss", format:"JJ:NN:SS"},
{period:"mm", format:"JJ:NN"},
{period:"hh", format:"JJ:NN"},
{period:"DD", format:"DD.MM"},
{period:"WW", format:"DD.MM"},
{period:"MM", format:"MM.YYYY"},
{period:"YYYY", format:"MM.YYYY"}
];
categoryAxis.parseDates = true;
categoryAxis.minPeriod = "DD";
}
// VALUE
for (var i = 0; i < valueFields.length; i++)
{
// GRAPH
var graph = new AmCharts.AmGraph();
graph.title = valueFields[i];
graph.valueField = valueFields[i];
graph.balloonText = BX.util.htmlspecialchars(valueFields[i]) + ": <b>[[value]]</b>";
graph.type = chartType;
graph.lineAlpha = 0.8;
graph.lineColor = valueColors[i];
if (chartType === "column")
{
graph.fillAlphas = 0.8;
}
if (chartType === "line")
{
graph.bullet = "round";
graph.hideBulletsCount = 30;
graph.bulletBorderThickness = 1;
}
chart.addGraph(graph);
}
// CURSOR
var chartCursor = new AmCharts.ChartCursor();
//chartCursor.zoomable = false;
if (chartType === "line")
{
chartCursor.cursorAlpha = 0.8;
chartCursor.cursorPosition = "mouse";
if (categoryType === "string")
{
chartCursor.categoryBalloonFunction = function (value) {
if (BX.type.isNotEmptyString(value))
{
return BX.util.htmlspecialchars(value);
}
else
{
return value;
}
};
}
else if (categoryType === "date")
{
chartCursor.categoryBalloonDateFormat = "DD.MM.YYYY";
}
}
else if (chartType === 'column')
{
chartCursor.cursorAlpha = 0;
chartCursor.categoryBalloonEnabled = false;
}
chart.addChartCursor(chartCursor);
}
// LEGEND
var legend = new AmCharts.AmLegend();
legend.align = "left";
legend.markerType = "square";
legend.valueWidth = 120;
//legend.useMarkerColorForValues = true;
chart.addLegend(legend);
// WRITE
chart.write("report-chart-container");
}
<? if (\Bitrix\Main\Page\Frame::isAjaxRequest()):?>
drawChart();
<? else: ?>
AmCharts.ready(drawChart);
<? endif ?>
<? endif; // if ($chartErrorCode === 0) ?>
</script>
<?php endif; // if ($arParams['USE_CHART'] && $arResult['settings']['chart']['display']): ?>
<div class="report-table-wrap<? echo ($arResult['allowHorizontalScroll'] ? ' main-grid-fade' : ''); ?>"><?
if ($arResult['allowHorizontalScroll']) : ?><?
?><div class="main-grid-fade-shadow-left"></div><?
?><div class="main-grid-fade-shadow-right"></div><?
?><div class="main-grid-ear main-grid-ear-left"></div><?
?><div class="main-grid-ear main-grid-ear-right"></div><?
endif; ?>
<div class="main-grid-container">
<div class="reports-list-left-corner"></div>
<div class="reports-list-right-corner"></div>
<table cellspacing="0" class="reports-list-table" id="<?= $resultTableId ?>">
<thead>
<!-- head -->
<tr>
<? $i = 0; foreach($arResult['viewColumns'] as $colId => $col): ?>
<?
$i++;
if ($i == 1)
{
$th_class = 'reports-first-column';
}
else if ($i == count($arResult['viewColumns']))
{
$th_class = 'reports-last-column';
}
else
{
$th_class = 'reports-head-cell';
}
// sorting
//$defaultSort = 'DESC';
$defaultSort = $col['defaultSort'];
if ($colId == $arResult['sort_id'] && !empty($defaultSort))
{
$th_class .= ' reports-selected-column';
if($arResult['sort_type'] == 'ASC')
{
$th_class .= ' reports-head-cell-top';
}
}
else
{
if ($defaultSort == 'ASC')
{
$th_class .= ' reports-head-cell-top';
}
}
?>
<th class="<?=$th_class?>" colId="<?=$colId?>" defaultSort="<?=$defaultSort?>">
<div class="reports-head-cell"><?if($defaultSort):
?><span class="reports-table-arrow"></span><?
endif?><span class="reports-head-cell-title"><?=htmlspecialcharsbx($col['humanTitle'])?></span></div>
</th>
<? endforeach; ?>
</tr>
</thead>
<tbody>
<!-- data -->
<? $rowNum = 0; ?>
<? foreach ($arResult['data'] as $row): ?>
<tr class="reports-list-item">
<? $i = 0; foreach($arResult['viewColumns'] as $col): ?>
<?
$i++;
if ($i == 1)
{
$td_class = 'reports-first-column';
}
else if ($i == count($arResult['viewColumns']))
{
$td_class = 'reports-last-column';
}
else
{
$td_class = '';
}
if (CReport::isColumnPercentable($col, $arResult['helperClassName']))
{
$colType = getResultColumnDataType($col, $arResult['customColumnTypes'],
$arResult['helperClassName']);
if (!in_array($colType, array('string', 'datetime', 'date', 'boolean'), true))
$td_class .= ' reports-numeric-column';
}
$finalValue = $row[$col['resultName']];
// add link
if (!empty($col['href']) && !empty($row['__HREF_'.$col['resultName']]))
{
if (is_array($finalValue))
{
// grc
foreach ($finalValue as $grcIndex => $v)
{
$finalValue[$grcIndex] = '<a target="_blank" href="'
.$arResult['grcData'][$col['resultName']][$grcIndex]['__HREF_'.$col['resultName']]
.'">'.$v.'</a>';
}
}
elseif (strlen($row[$col['resultName']]))
{
$finalValue = '<a target="_blank" href="'.$row['__HREF_'.$col['resultName']].'">'.$row[$col['resultName']].'</a>';
}
}
$redSign = false;
if (isset($arResult['customChartData'][$rowNum][$col['resultName']]['multiple']))
{
$customValueInfo = &$arResult['customChartData'][$rowNum][$col['resultName']];
if ($customValueInfo['multiple'] === true)
{
$dataValue = 0;
foreach ($customValueInfo as $cvKey => $cvInfo)
{
if ($cvKey !== 'multiple' && isset($cvInfo['type'])
&& ($cvInfo['type'] === 'float' || $cvInfo['type'] === 'integer'))
{
if ($cvInfo['value'] < 0)
{
$redSign = true;
break;
}
}
}
unset($cvKey, $cvInfo);
}
else
{
$cvInfo = &$customValueInfo[0];
if (isset($cvInfo['type'])
&& ($cvInfo['type'] === 'float' || $cvInfo['type'] === 'integer'))
{
if ($cvInfo['value'] < 0)
$redSign = true;
}
unset($cvInfo);
}
unset($customValueInfo);
}
// magic glue
if (is_array($finalValue))
{
$finalValue = join(' / ', $finalValue);
}
if ($arResult['settings']['red_neg_vals'] === true)
{
if ($redSign || (is_numeric($finalValue) && $finalValue < 0))
$td_class .= ' report-red-neg-val';
}
?>
<td class="<?=$td_class?>"><?=$finalValue?></td>
<? endforeach; ?>
</tr>
<? $rowNum++; ?>
<? endforeach; ?>
<tr>
<td colspan="<?=count($arResult['viewColumns'])?>" class="reports-pretotal-column">
<?php echo $arResult["NAV_STRING"]?>
<br /><br />
<span style="font-size: 14px;"><?=GetMessage('REPORT_TOTAL')?></span>
</td>
</tr>
<tr>
<? $i = 0; foreach($arResult['viewColumns'] as $col): ?>
<?
$i++;
if ($i == 1)
{
$td_class = 'reports-first-column';
}
else if ($i == count($arResult['viewColumns']))
{
$td_class = 'reports-last-column';
}
else
{
$td_class = '';
}
?>
<td class="<?=$td_class?> reports-total-column" sstyle="background-color: #F0F0F0;"><?=htmlspecialcharsbx($col['humanTitle'])?></td>
<? endforeach; ?>
</tr>
<tr>
<? $i = 0; foreach($arResult['viewColumns'] as $col): ?>
<?
$i++;
if ($i == 1)
{
$td_class = 'reports-first-column';
}
else if ($i == count($arResult['viewColumns']))
{
$td_class = 'reports-last-column';
}
else
{
$td_class = '';
}
if (CReport::isColumnPercentable($col, $arResult['helperClassName']))
{
$colType = getResultColumnDataType($col, $arResult['customColumnTypes'], $arResult['helperClassName']);
if (!in_array($colType, array('string', 'datetime', 'date', 'boolean'), true))
$td_class .= ' reports-numeric-column';
}
?>
<td class="<?=$td_class?>"><?=array_key_exists('TOTAL_'.$col['resultName'], $arResult['total']) ? $arResult['total']['TOTAL_'.$col['resultName']] : '—'?></td>
<? endforeach; ?>
</tr>
</tbody>
</table>
</div>
<script type="text/javascript">
BX.ready(function(){
var rows = BX.findChildren(BX('<?= $resultTableId ?>'), {tag:'th'}, true);
for (i = 0 ; i < rows.length ; i++)
{
var ds = rows[i].getAttribute('defaultSort');
if (ds == '')
{
BX.addClass(rows[i], 'report-column-disabled-sort');
continue;
}
BX.bind(rows[i], 'click', function(){
var colId = this.getAttribute('colId');
var sortType = '';
var isCurrent = BX.hasClass(this, 'reports-selected-column');
if (isCurrent)
{
var currentSortType = BX.hasClass(this, 'reports-head-cell-top') ? 'ASC' : 'DESC';
sortType = currentSortType == 'ASC' ? 'DESC' : 'ASC';
}
else
{
sortType = this.getAttribute('defaultSort');
}
var idInp = BX.findChild(BX('report-rewrite-filter'), {attr:{name:'sort_id'}});
var typeInp = BX.findChild(BX('report-rewrite-filter'), {attr:{name:'sort_type'}});
idInp.value = colId;
typeInp.value = sortType;
BX.submit(BX('report-rewrite-filter'));
});
}
});
</script>
</div>
</div>
<?php $this->SetViewTarget("sidebar_tools_1", 100);?>
<!-- control examples -->
<div id="report-chfilter-examples" style="display: none;">
<div class="filter-field filter-field-user chfilter-field-\Bitrix\Main\User" callback="RTFilter_chooseUser">
<label for="user-email" class="filter-field-title">%TITLE% "%COMPARE%"</label>
<span class="webform-field-textbox-inner">
<input id="%ID%" type="text" class="webform-field-textbox" caller="true" />
<input type="hidden" name="%NAME%" value=""/>
<a href="" class="webform-field-textbox-clear"></a>
</span>
</div>
<div class="filter-field filter-field-crm chfilter-field-enum">
<label class="filter-field-title">%TITLE% "%COMPARE%"</label>
</div>
<div class="filter-field filter-field-crm chfilter-field-crm">
<label class="filter-field-title">%TITLE% "%COMPARE%"</label>
</div>
<div class="filter-field filter-field-crm_status chfilter-field-crm_status">
<label class="filter-field-title">%TITLE% "%COMPARE%"</label>
</div>
<div class="filter-field filter-field-iblock_element chfilter-field-iblock_element">
<label class="filter-field-title">%TITLE% "%COMPARE%"</label>
</div>
<div class="filter-field filter-field-iblock_section chfilter-field-iblock_section">
<label class="filter-field-title">%TITLE% "%COMPARE%"</label>
</div>
<div class="filter-field filter-field-employee chfilter-field-employee" callback="RTFilter_chooseUser">
<label for="user-email" class="filter-field-title">%TITLE% "%COMPARE%"</label>
<span class="webform-field-textbox-inner">
<input id="%ID%" type="text" class="webform-field-textbox" caller="true" />
<input type="hidden" name="%NAME%" value=""/>
<a href="" class="webform-field-textbox-clear"></a>
</span>
</div>
<div class="filter-field filter-field-user chfilter-field-\Bitrix\Socialnetwork\Workgroup" callback="RTFilter_chooseGroup">
<label for="user-email" class="filter-field-title">%TITLE% "%COMPARE%"</label>
<span class="webform-field-textbox-inner">
<input id="%ID%" type="text" class="webform-field-textbox" caller="true" />
<input type="hidden" name="%NAME%" value=""/>
<a href="" class="webform-field-textbox-clear"></a>
</span>
</div>
<div class="filter-field chfilter-field-datetime">
<label for="" class="filter-field-title">%TITLE% "%COMPARE%"</label>
<input type="text" value="%VALUE%" name="%NAME%" value="" class="filter-field-calendar" id="" /><a class="filter-date-interval-calendar" href="" title="<?=GetMessage('TASKS_PICK_DATE')?>"><img border="0" src="/bitrix/js/main/core/images/calendar-icon.gif" alt="<?=GetMessage('TASKS_PICK_DATE')?>"></a>
</div>
<div class="filter-field chfilter-field-string">
<label for="" class="filter-field-title">%TITLE% "%COMPARE%"</label>
<input type="text" value="%VALUE%" name="%NAME%" value="" class="filter-textbox" id="" />
</div>
<div class="filter-field chfilter-field-text">
<label for="" class="filter-field-title">%TITLE% "%COMPARE%"</label>
<input type="text" value="%VALUE%" name="%NAME%" value="" class="filter-textbox" id="" />
</div>
<div class="filter-field chfilter-field-integer">
<label for="" class="filter-field-title">%TITLE% "%COMPARE%"</label>
<input type="text" value="%VALUE%" name="%NAME%" value="" class="filter-textbox" id="" />
</div>
<div class="filter-field chfilter-field-float">
<label for="" class="filter-field-title">%TITLE% "%COMPARE%"</label>
<input type="text" value="%VALUE%" name="%NAME%" value="" class="filter-textbox" id="" />
</div>
<div class="filter-field chfilter-field-boolean" callback="RTFilter_chooseBoolean">
<label for="" class="filter-field-title">%TITLE% "%COMPARE%"</label>
<select name="%NAME%" class="filter-dropdown" id="%ID%" caller="true">
<option value=""><?=GetMessage('REPORT_IGNORE_FILTER_VALUE')?></option>
<option value="true"><?=GetMessage('REPORT_BOOLEAN_VALUE_TRUE')?></option>
<option value="false"><?=GetMessage('REPORT_BOOLEAN_VALUE_FALSE')?></option>
</select>
<script type="text/javascript">
function RTFilter_chooseBooleanCatch(value)
{
setSelectValue(RTFilter_chooseBoolean_LAST_CALLER, value);
}
</script>
</div>
</div>
<div class="sidebar-block">
<b class="r2"></b><b class="r1"></b><b class="r0"></b>
<div class="sidebar-block-inner">
<div class="filter-block-title report-filter-block-title"><?=GetMessage('REPORT_FILTER')?><!--<a class="filter-settings" href=""></a>--></div>
<div class="filter-block filter-field-date-combobox filter-field-date-combobox-interval">
<form id="report-rewrite-filter" action="<?=CComponentEngine::MakePathFromTemplate(
$arParams["PATH_TO_REPORT_VIEW"],
array('report_id' => $arParams['REPORT_ID'])
);?>" method="GET">
<input type="hidden" name="set_filter" value="Y" />
<input type="hidden" name="sort_id" value="<?=htmlspecialcharsbx($arResult['sort_id'])?>" />
<input type="hidden" name="sort_type" value="<?=htmlspecialcharsbx($arResult['sort_type'])?>" />
<?=$APPLICATION->GetViewContent("report_view_prefilter")?>
<!-- period -->
<div class="filter-field">
<label for="task-interval-filter" class="filter-field-title"><?=GetMessage('REPORT_PERIOD')?></label>
<select class="filter-dropdown" style="margin-bottom: 0;" onchange="OnTaskIntervalChange(this)" id="task-interval-filter" name="F_DATE_TYPE">
<?php foreach ($arPeriodTypes as $key => $type): ?>
<option value="<?php echo $key?>"<?=($key == $arResult['period']['type']) ? " selected" : ""?>><?php echo $type?></option>
<?php endforeach;?>
</select>
<span class="filter-date-interval<?php
if (isset($arResult["FILTER"]["F_DATE_TYPE"]))
{
switch ($arResult["FILTER"]["F_DATE_TYPE"])
{
case "interval":
echo " filter-date-interval-after filter-date-interval-before";
break;
case "before":
echo " filter-date-interval-before";
break;
case "after":
echo " filter-date-interval-after";
break;
}
}
?>"><span class="filter-date-interval-from"><input type="text" class="filter-date-interval-from" name="F_DATE_FROM" id="REPORT_INTERVAL_F_DATE_FROM"
value="<?=$arResult['form_date']['from']?>"/><a
class="filter-date-interval-calendar" href="" title="<?php echo GetMessage("TASKS_PICK_DATE")?>" id="filter-date-interval-calendar-from"><img border="0"
src="/bitrix/js/main/core/images/calendar-icon.gif"
alt="<?php echo GetMessage("TASKS_PICK_DATE")?>"></a></span><span
class="filter-date-interval-hellip">…</span><span class="filter-date-interval-to"><input type="text" class="filter-date-interval-to" name="F_DATE_TO"
id ="REPORT_INTERVAL_F_DATE_TO" value="<?=$arResult['form_date']['to']?>"/><a href=""
class="filter-date-interval-calendar"
title="<?php echo GetMessage("TASKS_PICK_DATE")?>"
id="filter-date-interval-calendar-to"><img
border="0" src="/bitrix/js/main/core/images/calendar-icon.gif"
alt="<?php echo GetMessage("TASKS_PICK_DATE")?>"></a></span>
</span>
<span class="filter-day-interval<?php
if ($arResult["FILTER"]["F_DATE_TYPE"] == "days"):
?> filter-day-interval-selected<?php
endif;
?>"><input type="text" size="5" class="filter-date-days"
value="<?= htmlspecialcharsbx($arResult['form_date']['days']) ?>"
name="F_DATE_DAYS"/> <?php echo GetMessage("TASKS_REPORT_DAYS"); ?></span>
<script type="text/javascript">
function OnTaskIntervalChange(select)
{
select.parentNode.className = "filter-field filter-field-date-combobox " + "filter-field-date-combobox-" + select.value;
var dateInterval = BX.findNextSibling(select, { "tag": "span", 'className': "filter-date-interval" });
var dayInterval = BX.findNextSibling(select, { "tag": "span", 'className': "filter-day-interval" });
BX.removeClass(dateInterval, "filter-date-interval-after filter-date-interval-before");
BX.removeClass(dayInterval, "filter-day-interval-selected");
if (select.value == "interval")
BX.addClass(dateInterval, "filter-date-interval-after filter-date-interval-before");
else if(select.value == "before")
BX.addClass(dateInterval, "filter-date-interval-before");
else if(select.value == "after")
BX.addClass(dateInterval, "filter-date-interval-after");
else if(select.value == "days")
BX.addClass(dayInterval, "filter-day-interval-selected");
}
BX.ready(function() {
BX.bind(BX("filter-date-interval-calendar-from"), "click", function(e) {
if (!e) e = window.event;
var curDate = new Date();
var curTimestamp = Math.round(curDate / 1000) - curDate.getTimezoneOffset()*60;
BX.calendar({
node: this,
field: BX('REPORT_INTERVAL_F_DATE_FROM'),
bTime: false
});
BX.PreventDefault(e);
});
BX.bind(BX("filter-date-interval-calendar-to"), "click", function(e) {
if (!e) e = window.event;
var curDate = new Date();
var curTimestamp = Math.round(curDate / 1000) - curDate.getTimezoneOffset()*60;
BX.calendar({
node: this,
field: BX('REPORT_INTERVAL_F_DATE_TO'),
bTime: false
});
BX.PreventDefault(e);
});
jsCalendar.InsertDate = function(value) {
BX.removeClass(this.field.parentNode.parentNode, "webform-field-textbox-empty");
var value = this.ValueToString(value);
this.field.value = value.substr(11, 8) == "00:00:00" ? value.substr(0, 10) : value.substr(0, 16);
this.Close();
}
OnTaskIntervalChange(BX('task-interval-filter'));
});
</script>
</div>
<div id="report-filter-chfilter">
<!-- insert changeable filters -->
<?
// prepare info
$info = array();
foreach($arResult['changeableFilters'] as $chFilter)
{
$field = isset($chFilter['field']) ? $chFilter['field'] : null;
// Try to obtain qualified field name (e.g. 'COMPANY_BY.COMPANY_TYPE_BY.STATUS_ID')
$name = isset($chFilter['name']) ? $chFilter['name'] : ($field ? $field->GetName() : '');
$info[] = array(
'TITLE' => $chFilter['title'],
'COMPARE' => ToLower(GetMessage('REPORT_FILTER_COMPARE_VAR_'.$chFilter['compare'])),
'NAME' =>$chFilter['formName'],
'ID' => $chFilter['formId'],
'VALUE' => $chFilter['value'],
'FIELD_NAME' => $name,
'FIELD_TYPE' => $chFilter['data_type'],
'IS_UF' => $chFilter['isUF'],
'UF_ID' => $chFilter['ufId'],
'UF_NAME' => $chFilter['ufName']
);
}
// filter fields selectors
$ufInfoUsed = array();
foreach ($arResult['changeableFilters'] as $chFilter)
{
if (isset($chFilter['isUF']) && $chFilter['isUF'] === true && isset($chFilter['data_type'])
&& ($chFilter['data_type'] === 'enum'
||$chFilter['data_type'] === 'crm'
|| $chFilter['data_type'] === 'crm_status'
|| $chFilter['data_type'] === 'iblock_element'
|| $chFilter['data_type'] === 'iblock_section')
&& isset($chFilter['ufId']) && isset($chFilter['ufName'])
&& is_array($arResult['ufInfo'][$chFilter['ufId']][$chFilter['ufName']]))
{
if (!isset($ufInfoUsed[$chFilter['ufId']][$chFilter['ufName']]))
$ufInfoUsed[$chFilter['ufId']][$chFilter['ufName']] =
&$arResult['ufInfo'][$chFilter['ufId']][$chFilter['ufName']];
}
}
if (!empty($ufInfoUsed))
{
$APPLICATION->IncludeComponent(
'bitrix:report.filter.field.selector',
'',
array('ufInfo' => $ufInfoUsed),
false,
array('HIDE_ICONS' => true)
);
}
?>
<script type="text/javascript">
BX.ready(function() {
var info = <?=CUtil::PhpToJSObject($info)?>;
var cpControl, fieldType, tipicalControl, isUF, ufId, ufName, cpSelector, selectorIndex;
for (var i in info)
{
if (!info.hasOwnProperty(i))
continue;
cpControl = null;
fieldType = info[i].FIELD_TYPE;
// insert value control
// search in `examples-custom` by name or type
// then search in `examples` by type
cpControl = BX.clone(
BX.findChild(
BX('report-chfilter-examples-custom'),
{className: 'chfilter-field-' + info[i].FIELD_NAME}
)
||
BX.findChild(
BX('report-chfilter-examples-custom'),
{className: 'chfilter-field-' + fieldType}
)
||
BX.findChild(
BX('report-chfilter-examples'),
{className: 'chfilter-field-' + fieldType}
),
true
);
//global replace %ID%, %NAME%, %TITLE% and etc.
cpControl.innerHTML = cpControl.innerHTML.replace(/%((?!VALUE)[A-Z]+)%/gi,
function(str, p1, offset, s)
{
var n = p1.toUpperCase();
return typeof(info[i][n]) != 'undefined' ? BX.util.htmlspecialchars(info[i][n]) : str;
});
tipicalControl = true;
isUF = !!info[i]["IS_UF"];
if (isUF)
{
ufId = info[i]["UF_ID"];
ufName = info[i]["UF_NAME"];
if (fieldType === 'enum' ||fieldType === 'crm' || fieldType === 'crm_status'
|| fieldType === 'iblock_element' || fieldType === 'iblock_section')
{
tipicalControl = false;
}
}
if (tipicalControl)
{
if (cpControl.getAttribute('callback') != null)
{
// set last caller
var callerName = cpControl.getAttribute('callback') + '_LAST_CALLER';
var callerObj = BX.findChild(cpControl, {attr:'caller'}, true);
window[callerName] = callerObj;
// set value
var cbFuncName = cpControl.getAttribute('callback') + 'Catch';
window[cbFuncName](info[i].VALUE);
}
else
{
cpControl.innerHTML = cpControl.innerHTML.replace('%VALUE%', BX.util.htmlspecialchars(info[i].VALUE));
}
BX('report-filter-chfilter').appendChild(cpControl);
}
else
{
BX('report-filter-chfilter').appendChild(cpControl);
var filterFieldSelector = BX.Report.FilterFieldSelectorManager.getSelector(ufId, ufName);
if (filterFieldSelector)
{
cpSelector = filterFieldSelector.makeFilterField(cpControl, null, info[i]["NAME"]);
if (cpSelector)
{
selectorIndex = cpSelector.getAttribute("ufSelectorIndex");
filterFieldSelector.setFilterValue(selectorIndex, info[i]["VALUE"]);
}
}
}
}
});
</script>
</div>
</form>
<form id="report-reset-filter" action="<?=CComponentEngine::MakePathFromTemplate(
$arParams["PATH_TO_REPORT_VIEW"],
array('report_id' => $arParams['REPORT_ID'])
);?>" method="GET">
<input type="hidden" name="sort_id" value="<?=htmlspecialcharsbx($arResult['sort_id'])?>" />
<input type="hidden" name="sort_type" value="<?=htmlspecialcharsbx($arResult['sort_type'])?>" />
</form>
<div class="filter-field-buttons">
<input id="report-rewrite-filter-button" type="submit" value="<?=GetMessage('REPORT_FILTER_APPLY')?>" class="filter-submit"> <input id="report-reset-filter-button" type="submit" name="del_filter_company_search" value="<?=GetMessage('REPORT_FILTER_CANCEL')?>" class="filter-submit">
</div>
<script type="text/javascript">
BX.ready(function(){
BX.bind(BX('report-reset-filter-button'), 'click', function(){
BX.submit(BX('report-reset-filter'));
});
BX.bind(BX('report-rewrite-filter-button'), 'click', function(){
BX.submit(BX('report-rewrite-filter'));
});
// User controls
var controls = BX.findChildren(BX('report-rewrite-filter'), {className: /chfilter-field-(\\Bitrix\\Main\\User|employee)/}, true);
if (controls != null)
{
for (i in controls)
{
var inp = BX.findChild(controls[i], {tag:'input', attr:{type:'text'}}, true);
var x = BX.findNextSibling(inp, {tag:'a'});
BX.bind(inp, 'click', RTFilter_chooseUser);
BX.bind(inp, 'blur', RTFilter_chooseUserCatchFix);
BX.bind(x, 'click', RTFilter_chooseUserClear);
}
}
// Group controls
var controls = BX.findChildren(BX('report-rewrite-filter'), {className:'chfilter-field-\\Bitrix\\Socialnetwork\\Workgroup'}, true);
if (controls != null)
{
for (i in controls)
{
var inp = BX.findChild(controls[i], {tag:'input', attr:{type:'text'}}, true);
var x = BX.findNextSibling(inp, {tag:'a'});
BX.bind(inp, 'click', RTFilter_chooseGroup);
//BX.bind(inp, 'blur', RTFilter_chooseGroupCatchFix);
BX.bind(x, 'click', RTFilter_chooseGroupClear);
}
}
// Date controls
var controls = BX.findChildren(BX('report-rewrite-filter'), {className:'chfilter-field-datetime'}, true);
if (controls != null)
{
for (i in controls)
{
var butt = BX.findChild(controls[i], {tag:'img'}, true);
BX.bind(butt, "click", function(e) {
BX.PreventDefault(e);
var valueInput = BX.findChild(this.parentNode.parentNode, {tag:'input'});
var curDate = new Date();
var curTimestamp = Math.round(curDate / 1000) - curDate.getTimezoneOffset()*60;
BX.calendar({
node: this,
field: valueInput,
bTime: false
});
});
}
}
});
function setSelectValue(select, value)
{
var i, j;
var bFirstSelected = false;
var bMultiple = !!(select.getAttribute('multiple'));
if (!(value instanceof Array)) value = new Array(value);
for (i=0; i<select.options.length; i++)
{
for (j in value)
{
if (select.options[i].value == value[j])
{
if (!bFirstSelected) {bFirstSelected = true; select.selectedIndex = i;}
select.options[i].selected = true;
break;
}
}
if (!bMultiple && bFirstSelected) break;
}
}
function RTFilter_chooseUser(control)
{
if (this.parentNode)
{
var elem = this;
}
else
{
var elem = BX.findChild(control, {tag:'input', attr: {type:'text'}}, true);
}
singlePopup = BX.PopupWindowManager.create("single-employee-popup-"+Math.random(), elem, {
offsetTop : 1,
autoHide : true,
content : BX("Single_"+elem.id+"_selector_content")
});
if (singlePopup.popupContainer.style.display != "block")
{
singlePopup.show();
}
RTFilter_chooseUser_LAST_CALLER = elem;
}
function RTFilter_chooseUserCatch(user)
{
var inp = RTFilter_chooseUser_LAST_CALLER;
var hid = BX.findNextSibling(inp, {tag:'input',attr:{type:'hidden'}});
var x = BX.findNextSibling(inp, {tag:'a'});
hid.value = user.id;
if (parseInt(user.id) > 0)
{
inp.value = user.name;
x.style.display = 'inline';
}
else
{
inp.value = '';
x.style.display = 'none';
}
try
{
singlePopup.close();
}
catch (e) {}
}
function RTFilter_chooseUserCatchFix()
{
var inp = RTFilter_chooseUser_LAST_CALLER;
var hid = BX.findNextSibling(inp, {tag:'input',attr:{type:'hidden'}});
if (inp.value.length < 1 && parseInt(hid.value) > 0)
{
var fobj = window['O_Single_' + inp.id];
inp.value = fobj.arSelected[hid.value].name;
}
}
function RTFilter_chooseUserClear(e)
{
RTFilter_chooseUser_LAST_CALLER = BX.findChild(this.parentNode, {tag:'input',attr:{type:'text'}});
BX.PreventDefault(e);
RTFilter_chooseUserCatch({id:''});
}
function RTFilter_chooseGroup(control)
{
if (this.parentNode)
{
var elem = this;
}
else
{
var elem = BX.findChild(control, {tag:'input', attr: {type:'text'}}, true);
}
var popup = window['filterGroupsPopup_'+elem.id];
popup.searchInput = elem;
popup.popupWindow.setBindElement(elem);
popup.show();
RTFilter_chooseGroup_LAST_CALLER = elem;
}
function RTFilter_chooseGroupCatch(group)
{
if (group.length < 1) return;
group = group[0];
var inp = RTFilter_chooseGroup_LAST_CALLER;
var hid = BX.findNextSibling(inp, {tag:'input',attr:{type:'hidden'}});
var x = BX.findNextSibling(inp, {tag:'a'});
hid.value = group.id;
if (parseInt(group.id) > 0)
{
inp.value = group.title;
x.style.display = 'inline';
}
else
{
inp.value = '';
x.style.display = 'none';
}
try
{
var popup = window['filterGroupsPopup_'+inp.id];
popup.popupWindow.close();
}
catch (e) {}
}
function RTFilter_chooseGroupClear(e)
{
RTFilter_chooseGroup_LAST_CALLER = BX.findChild(this.parentNode, {tag:'input',attr:{type:'text'}});
BX.PreventDefault(e);
RTFilter_chooseGroupCatch([{id:0}]);
}
</script>
<?
foreach ($arResult['changeableFilters'] as $chFilter)
{
/** @var \Bitrix\Main\Entity\ReferenceField[] $chFilter */
if (($chFilter['field'] && $chFilter['field'] instanceof \Bitrix\Main\Entity\ReferenceField
&& $chFilter['field']->getRefEntityName() == '\Bitrix\Main\User')
|| (isset($chFilter['isUF']) && $chFilter['isUF'] === true && isset($chFilter['data_type'])
&& $chFilter['data_type'] === 'employee'))
{
// user selector
$name = $APPLICATION->IncludeComponent(
"bitrix:intranet.user.selector.new",
".default",
array(
"MULTIPLE" => "N",
"NAME" => "Single_" . $chFilter['formId'],
"INPUT_NAME" => $chFilter['formId'],
"VALUE" => $chFilter['value']['id'],
"POPUP" => "Y",
"ON_SELECT" => "RTFilter_chooseUserCatch",
"NAME_TEMPLATE" => $arParams["USER_NAME_FORMAT"]
),
null,
array("HIDE_ICONS" => "Y")
);
}
else if ($chFilter['field'] && $chFilter['field'] instanceof \Bitrix\Main\Entity\ReferenceField
&& $chFilter['field']->getRefEntityName() == '\Bitrix\Socialnetwork\Workgroup')
{
// group selector
$name = $APPLICATION->IncludeComponent(
"bitrix:socialnetwork.group.selector",
".default",
array(
"ON_SELECT" => "RTFilter_chooseGroupCatch", //callback
"SEARCH_INPUT" => $chFilter['formId'],
"JS_OBJECT_NAME" => "filterGroupsPopup_" . $chFilter['formId'],
"SELECTED" => $chFilter['value'][0]['id']
),
null,
array("HIDE_ICONS" => "Y")
);
}
}
?>
</div>
</div>
<i class="r0"></i><i class="r1"></i><i class="r2"></i>
</div>
<? if (strlen($arResult['report']['DESCRIPTION'])): ?>
<div class="sidebar-block">
<b class="r2"></b><b class="r1"></b><b class="r0"></b>
<div class="sidebar-block-inner">
<div class="filter-block-title report-filter-block-title"><?=GetMessage('REPORT_DESCRIPTION')?></div>
<div class="reports-description-text">
<?=htmlspecialcharsbx($arResult['report']['DESCRIPTION'])?>
</div>
</div>
</div>
<? endif; ?>
<?php
if ($arResult['allowHorizontalScroll'])
{
Bitrix\Main\Page\Asset::getInstance()->addJs('/bitrix/components/bitrix/main.ui.grid/templates/.default/js/utils.js');
Bitrix\Main\Page\Asset::getInstance()->addJs('/bitrix/components/bitrix/main.ui.grid/templates/.default/js/fader.js');
$hScrollSettings = array(
'tableId' => $resultTableId,
'allowHorizontalScroll' => $arResult['allowHorizontalScroll'],
'allowPinHeader' => false,
'classHide' => 'main-grid-hide',
'classShow' => 'show',
'classEarLeft' => 'main-grid-ear-left',
'classEarRight' => 'main-grid-ear-right',
'classFadeContainerLeft' => 'main-grid-fade-left',
'classFadeContainerRight' => 'main-grid-fade-right',
'classFadeShadowLeft' => 'main-grid-fade-shadow-left',
'classFadeShadowRight' => 'main-grid-fade-shadow-right'
);
?>
<script type="text/javascript">
BX.ready(
function()
{
BX.Report.View.HScroll.create(
"<?=CUtil::JSEscape($resultTableId.'_hscroll')?>",
<?=CUtil::PhpToJSObject($hScrollSettings)?>
);
}
);
</script><?php
}
if (is_array($arResult['STEXPORT_PARAMS']))
{
Bitrix\Main\Page\Asset::getInstance()->addJs('/bitrix/js/report/lrpdialog.js');
Bitrix\Main\Page\Asset::getInstance()->addJs('/bitrix/js/report/stexport.js');
?>
<script type="text/javascript">
BX.ready(
function()
{
BX.Report.LongRunningProcessDialog.messages =
{
startButton: "<?=GetMessageJS('CRM_REPORT_LRP_DLG_BTN_START')?>",
stopButton: "<?=GetMessageJS('CRM_REPORT_LRP_DLG_BTN_STOP')?>",
closeButton: "<?=GetMessageJS('CRM_REPORT_LRP_DLG_BTN_CLOSE')?>",
wait: "<?=GetMessageJS('CRM_REPORT_LRP_DLG_WAIT')?>",
requestError: "<?=GetMessageJS('CRM_REPORT_LRP_DLG_REQUEST_ERR')?>"
};
BX.Report.StExportManager.create(
"<?=CUtil::JSEscape($arResult['STEXPORT_PARAMS']['managerId'])?>",
<?=CUtil::PhpToJSObject($arResult['STEXPORT_PARAMS'])?>
);
}
);
</script><?php
}
$this->EndViewTarget();
reportViewShowTopButtons($this, $arParams, $arResult);
?>