From: Chris Sharp Date: Mon, 8 May 2017 16:15:49 +0000 (-0400) Subject: Adding Chris DeBellis's feature additions: X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=02fee93ec8f085c5a06af23687cc7253e4c1d6ae;p=contrib%2Fpines%2Freport-creator.git Adding Chris DeBellis's feature additions: - the user can now import report templates that use Year and Year-Month dates instead of actual dates - The user can import report templates with 'contains matching substring'. --- diff --git a/config/production.config.php b/config/production.config.php index e0ceac0..f332fcb 100644 --- a/config/production.config.php +++ b/config/production.config.php @@ -6,6 +6,7 @@ define ('QR_REPORT_OUTPUT_URL_PREFIX', 'https://next.gapines.org/reporter/'); define ('QR_SITE_ROOT', '/report-creator/'); //define ('QR_REPORT_OUTPUT_URL_PREFIX', 'https://reports-dev.gapines.org/reporter/'); define ('QR_REPORT_OUTPUT_URL_SUFFIX', '/report-data.html'); +define ('QR_REPORT_TRANSFORM_START_YEAR', '2006'); //page headings define ('QR_DEFAULT_LOGO_TEXT', 'Quick Reports'); diff --git a/controllers/report.controller.php b/controllers/report.controller.php index ee1af8f..0457d73 100644 --- a/controllers/report.controller.php +++ b/controllers/report.controller.php @@ -131,7 +131,7 @@ class reportController { public function editQueuedReport($params) { //edit a queued report using data from reporter.schedule and reporter.report - + $defaultValues = new stdClass(); if (NULL == $params) { @@ -251,9 +251,8 @@ class reportController { $newParamName = $paramName; do { - if (strtolower($param->dataType) == 'timestamp') { - $dateField=$defaultValues->paramsDecoded->$paramName; + $dateField=$defaultValues->paramsDecoded->$paramName; if (isset($dateField[$passes]->transform)) { $field = $newParamName.'_type'; $defaultValues->paramsDecoded->$field = 'relative'; @@ -263,19 +262,29 @@ class reportController { else { $field = $newParamName.'_type'; $defaultValues->paramsDecoded->$field = 'real'; - $field = $newParamName.'_date'; - $defaultValues->paramsDecoded->$field = $dateField[$passes]; - $defaultValues->paramsDecoded->$field = substr($dateField[$passes],5,2).'/'.substr($dateField[$passes],8,2).'/'.substr($dateField[$passes],0,4); + + switch (strtolower($param->transform)) { + case 'date': + $field = $newParamName.'_date'; + $defaultValues->paramsDecoded->$field = substr($dateField[$passes],5,2).'/'.substr($dateField[$passes],8,2).'/'.substr($dateField[$passes],0,4); + break; + case 'month_trunc': + $field = $newParamName.'_date_year'; + $defaultValues->paramsDecoded->$field = substr($dateField[$passes],0,4); + $field = $newParamName.'_date_month'; + $defaultValues->paramsDecoded->$field = substr($dateField[$passes],5,2); + break; + case 'year_trunc': + $field = $newParamName.'_date_year'; + $defaultValues->paramsDecoded->$field = substr($dateField[$passes],0,4); + break; + } } } - if (strtolower($param->op) != 'between') break; //op is not 'between' so no second pass needed - - //set up the range. - $newParamName.='_end'; - + $newParamName.='_end'; //set up for a range. } - while (++$passes < 2); + while (++$passes < 2 && strtolower($param->op) == 'between'); if (strtolower($param->dataType) == 'timestamp') unset($defaultValues->paramsDecoded->$unsetName); } diff --git a/controllers/schedule.controller.php b/controllers/schedule.controller.php index bd284b6..15129d2 100644 --- a/controllers/schedule.controller.php +++ b/controllers/schedule.controller.php @@ -199,14 +199,15 @@ class scheduleController { $lowerDataType = strtolower($userParam->dataType); $lowerTransform = strtolower($userParam->transform); - if ($lowerTransform == 'date') { + if ($lowerTransform == 'date' || $lowerTransform == 'month_trunc' || $lowerTransform == 'year_trunc') { //process date field $range=false; $paramsOK = true; - $paramsErrorMessage = NULL; $dateParamString=NULL; $dateEndParamString=NULL; + $paramsErrorMessage = NULL; + $lowerTransformLabel=str_replace('_trunc', '', $lowerTransform); if (!isset($_POST[$paramName.'_type'])) { $paramsOK = false; @@ -216,28 +217,58 @@ class scheduleController { if ($_POST[$paramName.'_type'] == 'relative') { if (!isset($_POST[$paramName.'_relative_value'])) { $paramsOK = false; - $paramsErrorMessage = "Missing date parameter $paramName"; + $paramsErrorMessage = "Missing relative date value $paramName"; break; } - $dateParam['transform'] = 'relative_'.$lowerTransform; + $dateParam['transform'] = 'relative_'.$lowerTransformLabel; $dateParam['params'] = (array)$_POST[$paramName.'_relative_value']; } else { - if (!isset($_POST[$paramName.'_date'])) { - $paramsOK = false; - $paramsErrorMessage = "Missing date parameter $paramName"; + switch ($lowerTransform) { + case 'date': + if (!isset($_POST[$paramName.'_date'])) { + $paramsOK = false; + $paramsErrorMessage = "Missing date value $paramName"; + break; + } + $dateParamString = $this->convertDateFormat($_POST[$paramName.'_date']); + if (NULL == $dateParamString) { + $paramsOK = false; + $paramsErrorMessage = 'Date is not valid.'; + } + break; + + case 'month_trunc': + if (!isset($_POST[$paramName.'_date_month']) || !isset($_POST[$paramName.'_date_year'])) { + $paramsOK = false; + $paramsErrorMessage = "Missing date year+month value $paramName"; + break; + } + $dateParamString = $_POST[$paramName.'_date_year'].'-'.$_POST[$paramName.'_date_month']; + if (NULL == $dateParamString) { + $paramsOK = false; + $paramsErrorMessage = 'Year+Month is not valid.'; + } + break; + + case 'year_trunc': + if (!isset($_POST[$paramName.'_date_year'])) { + $paramsOK = false; + $paramsErrorMessage = "Missing date year value $paramName"; + break; + } + $dateParamString = $_POST[$paramName.'_date_year']; + if (NULL == $dateParamString) { + $paramsOK = false; + $paramsErrorMessage = 'Year is not valid.'; + } break; - } - $dateParamString = $this->convertDateFormat($_POST[$paramName.'_date']); - if (NULL == $dateParamString) { - $paramsOK = false; - $paramsErrorMessage = 'Date is not valid.'; } } if ($lowerOp == 'between') { //process between range - + $range = true; if (!isset($_POST[$paramName.'_end_type'])) { $paramsOK = false; @@ -251,7 +282,7 @@ class scheduleController { break; } $dateEndParam['transform'] = 'relative_'.$userParam->transform; - $dateEndParam['params'] = (array)$_POST[$paramName.'_end_relative_value']; + $dateEndParam['params'] = (array)$_POST[$paramName.'_end_relative_value']; } else { if (!isset($_POST[$paramName.'_end_date'])) { @@ -267,6 +298,8 @@ class scheduleController { } } + + if (NULL != $dateParamString) $startDate = $dateParamString; //real date string else @@ -309,7 +342,7 @@ class scheduleController { } } - + if (isset($_POST['pivotLabelColumn']) && isset($_POST['pivotDataColumn'])) { $userParams['__pivot_label'] = $_POST['pivotLabelColumn']; $userParams['__pivot_data'] = $_POST['pivotDataColumn']; @@ -318,6 +351,7 @@ class scheduleController { if ($paramsOK) { $reportParams = new stdClass(); $reportParams->data = json_encode($userParams); + if (NULL == $reportParams->data) { new displayMessageView('JSON format error encoding report data.'); exit; @@ -344,7 +378,7 @@ class scheduleController { $scheduleObj = new schedule(); $result = $scheduleObj->submitReport($reportParams, $scheduleParams, $updateIDs); - + if ($result->success) { if (NULL == $updateIDs) new displayMessageView('The report was sent to the scheduler.', true); diff --git a/lib/site_v1.4.js b/lib/site_v1.4.js deleted file mode 100644 index 95538df..0000000 --- a/lib/site_v1.4.js +++ /dev/null @@ -1,328 +0,0 @@ -var lastExpandedGroupName; -var lastSelectAll = false; -var lastSelectAllBills = false; -var lastSelectAllHolds = false; -var lastSelectAllPatrons = false; -var lastSelectAllCollections = false; -var lastSelectAllCirculations = false; - -function toggleReportShowHide(className, labelName) { - var list = document.getElementsByClassName(className); - if (list.length>0) { - for (var i = 0; i < list.length; i++) { - if (reportFiltersState[className]) { - list[i].style.display="table-row"; - } - else { - list[i].style.display="none"; - } - } - } - reportFiltersState[className]=!reportFiltersState[className]; //toggle - if (reportFiltersState[className]) - document.getElementById(labelName).innerHTML="+Show"; - else - document.getElementById(labelName).innerHTML="-Hide"; -} - -function toggleRealRelativeDate(dateTypeElement, spanTagReal, spanTagRelative) { - if (dateTypeElement.value == "real") { - document.getElementById(spanTagReal).style.display = ""; - document.getElementById(spanTagRelative).style.display = "none"; - } - else { - document.getElementById(spanTagReal).style.display = "none"; - document.getElementById(spanTagRelative).style.display = ""; - } -} - -function toggleCollapsibleSection(group) { - var rows; - var hide; - var spanPlusMinus = group + "_plus"; - var rowName = group + "_row"; - - rows = document.getElementsByClassName(rowName); - if (!rows[0].className.match(/(?:^|\s)hideRow(?!\S)/) ) { - hide = true; - lastExpandedGroupName = undefined; - document.getElementById(spanPlusMinus).innerHTML = "+"; - } - else { - hide = false; - if (typeof lastExpandedGroupName != 'undefined' && lastExpandedGroupName != group) toggleCollapsibleSection(lastExpandedGroupName); - lastExpandedGroupName = group; - document.getElementById(spanPlusMinus).innerHTML = "-"; - } - for(var i=0; i"; - } - document.getElementById(span).innerHTML=html; -} - -function selectAllMultiselect(listName) { - var list = document.getElementById(listName); - for(var i=0; i thisMonth-1 && reportYearIndex == 0) return; - if (reportMonth > 11) { - reportMonth = 0; - reportYearIndex -= 1; - } - else if (reportMonth < 0) { - reportMonth = 11; - reportYearIndex += 1; - } - } - document.getElementById("reportMonth").selectedIndex = reportMonth; - document.getElementById("reportYear").selectedIndex = reportYearIndex; -} - -function submitReport(action) { - - var userInputs; - var dateTypeName; - var colName; - - if (document.getElementById("name").value.length==0) { - alert("Please enter a report name."); - return false; - } - - if (action == 'save') { - return true; - } - - userInputs = document.getElementsByClassName('userInput'); - for (var i=0; i 12) return false; - if (d < 1 || d > 31) return false; - if ((m == 4 || m == 6 || m == 9 || m == 11) && d > 30) return false; - if (m ==2) { - if ((y % 400) == 0 || ((y % 4) == 0 && (y % 100) != 0)) { //leap year - if (d > 29) return false; - } - else { //not leap year - if (d > 28) return false; - } - } - return true; -} - -var win1=null; -function openWindow(html) { - if (win1 != null && win1.open) win1.close(); - win1=window.open('','win1','height=250,width=800,toolbar=no,location=no,menubar=no,titlebar=no,status=no,scrollbars=yes,resizable=yes,modal=yes'); - win1.document.write("
"+html+"
"); -} diff --git a/lib/site_v1.5.js b/lib/site_v1.5.js deleted file mode 100644 index 4cd3f26..0000000 --- a/lib/site_v1.5.js +++ /dev/null @@ -1,297 +0,0 @@ -var lastExpandedGroupName; -var lastSelectAll = false; -var lastSelectAllState = []; - -function toggleReportShowHide(className, labelName) { - var list = document.getElementsByClassName(className); - if (list.length>0) { - for (var i = 0; i < list.length; i++) { - if (reportFiltersState[className]) { - list[i].style.display="table-row"; - } - else { - list[i].style.display="none"; - } - } - } - reportFiltersState[className]=!reportFiltersState[className]; //toggle - if (reportFiltersState[className]) - document.getElementById(labelName).innerHTML="+Show"; - else - document.getElementById(labelName).innerHTML="-Hide"; -} - -function toggleRealRelativeDate(dateTypeElement, spanTagReal, spanTagRelative) { - if (dateTypeElement.value == "real") { - document.getElementById(spanTagReal).style.display = ""; - document.getElementById(spanTagRelative).style.display = "none"; - } - else { - document.getElementById(spanTagReal).style.display = "none"; - document.getElementById(spanTagRelative).style.display = ""; - } -} - -function toggleCollapsibleSection(group) { - var rows; - var hide; - var spanPlusMinus = group + "_plus"; - var rowName = group + "_row"; - - rows = document.getElementsByClassName(rowName); - if (!rows[0].className.match(/(?:^|\s)hideRow(?!\S)/) ) { - hide = true; - lastExpandedGroupName = undefined; - document.getElementById(spanPlusMinus).innerHTML = "+"; - } - else { - hide = false; - if (typeof lastExpandedGroupName != 'undefined' && lastExpandedGroupName != group) toggleCollapsibleSection(lastExpandedGroupName); - lastExpandedGroupName = group; - document.getElementById(spanPlusMinus).innerHTML = "-"; - } - for(var i=0; i"; - } - document.getElementById(span).innerHTML=html; -} - -function selectAllMultiselect(listName) { - var list = document.getElementById(listName); - for(var i=0; i thisMonth-1 && reportYearIndex == 0) return; - if (reportMonth > 11) { - reportMonth = 0; - reportYearIndex -= 1; - } - else if (reportMonth < 0) { - reportMonth = 11; - reportYearIndex += 1; - } - } - document.getElementById("reportMonth").selectedIndex = reportMonth; - document.getElementById("reportYear").selectedIndex = reportYearIndex; -} - -function submitReport(action) { - - var userInputs; - var dateTypeName; - var colName; - - if (document.getElementById("name").value.length==0) { - alert("Please enter a report name."); - return false; - } - - if (action == 'save') { - return true; - } - - userInputs = document.getElementsByClassName('userInput'); - for (var i=0; i 12) return false; - if (d < 1 || d > 31) return false; - if ((m == 4 || m == 6 || m == 9 || m == 11) && d > 30) return false; - if (m ==2) { - if ((y % 400) == 0 || ((y % 4) == 0 && (y % 100) != 0)) { //leap year - if (d > 29) return false; - } - else { //not leap year - if (d > 28) return false; - } - } - return true; -} - -var win1=null; -function openWindow(html) { - if (win1 != null && win1.open) win1.close(); - win1=window.open('','win1','height=250,width=800,toolbar=no,location=no,menubar=no,titlebar=no,status=no,scrollbars=yes,resizable=yes,modal=yes'); - win1.document.write("
"+html+"
"); -} - diff --git a/lib/site_v1.6.js b/lib/site_v1.6.js new file mode 100644 index 0000000..b13f0f5 --- /dev/null +++ b/lib/site_v1.6.js @@ -0,0 +1,310 @@ +var lastExpandedGroupName; +var lastSelectAll = false; +var lastSelectAllState = []; + +function toggleReportShowHide(className, labelName) { + var list = document.getElementsByClassName(className); + if (list.length>0) { + for (var i = 0; i < list.length; i++) { + if (reportFiltersState[className]) { + list[i].style.display="table-row"; + } + else { + list[i].style.display="none"; + } + } + } + reportFiltersState[className]=!reportFiltersState[className]; //toggle + if (reportFiltersState[className]) + document.getElementById(labelName).innerHTML="+Show"; + else + document.getElementById(labelName).innerHTML="-Hide"; +} + +function toggleRealRelativeDate(dateTypeElement, spanTagReal, spanTagRelative) { + if (dateTypeElement.value == "real") { + document.getElementById(spanTagReal).style.display = ""; + document.getElementById(spanTagRelative).style.display = "none"; + } + else { + document.getElementById(spanTagReal).style.display = "none"; + document.getElementById(spanTagRelative).style.display = ""; + } +} + +function toggleCollapsibleSection(group) { + var rows; + var hide; + var spanPlusMinus = group + "_plus"; + var rowName = group + "_row"; + + rows = document.getElementsByClassName(rowName); + if (!rows[0].className.match(/(?:^|\s)hideRow(?!\S)/) ) { + hide = true; + lastExpandedGroupName = undefined; + document.getElementById(spanPlusMinus).innerHTML = "+"; + } + else { + hide = false; + if (typeof lastExpandedGroupName != 'undefined' && lastExpandedGroupName != group) toggleCollapsibleSection(lastExpandedGroupName); + lastExpandedGroupName = group; + document.getElementById(spanPlusMinus).innerHTML = "-"; + } + for(var i=0; i"; + } + document.getElementById(span).innerHTML=html; +} + +function selectAllMultiselect(listName) { + var list = document.getElementById(listName); + for(var i=0; i thisMonth-1 && reportYearIndex == 0) return; + if (reportMonth > 11) { + reportMonth = 0; + reportYearIndex -= 1; + } + else if (reportMonth < 0) { + reportMonth = 11; + reportYearIndex += 1; + } + } + document.getElementById("reportMonth").selectedIndex = reportMonth; + document.getElementById("reportYear").selectedIndex = reportYearIndex; +} + +function submitReport(action) { + + var userInputs; + var dateTypeName; + var colName; + + if (document.getElementById("name").value.length==0) { + alert("Please enter a report name."); + return false; + } + + if (action == 'save') { + return true; + } + + userInputs = document.getElementsByClassName('userInput'); + for (var i=0; i 12) return false; + if (d < 1 || d > 31) return false; + if ((m == 4 || m == 6 || m == 9 || m == 11) && d > 30) return false; + if (m ==2) { + if ((y % 400) == 0 || ((y % 4) == 0 && (y % 100) != 0)) { //leap year + if (d > 29) return false; + } + else { //not leap year + if (d > 28) return false; + } + } + return true; +} + +var win1=null; +function openWindow(html) { + if (win1 != null && win1.open) win1.close(); + win1=window.open('','win1','height=250,width=800,toolbar=no,location=no,menubar=no,titlebar=no,status=no,scrollbars=yes,resizable=yes,modal=yes'); + win1.document.write("
"+html+"
"); +} diff --git a/views/page.view.php b/views/page.view.php index 0bcb3c1..0153385 100644 --- a/views/page.view.php +++ b/views/page.view.php @@ -17,8 +17,8 @@ class pageView { '; ?> - - + +
@@ -94,9 +94,8 @@ class pageView { diff --git a/views/report.view.php b/views/report.view.php index 4bc66e1..abec704 100644 --- a/views/report.view.php +++ b/views/report.view.php @@ -313,95 +313,98 @@ class reportView extends baseReportView { private function parseColumns($param) { - $p = $param; - if (is_array($p->param)) $p->param = implode(',', $p->param); //if array convert it back to a string + if (is_array($param->param)) $param->param = implode(',', $param->param); //if array convert it back to a string - $userParam = (substr($p->param,0,3) == '::P'); //user entered field or static - $lowerOp = strtolower($p->op); - $lowerParam = strtolower($p->param); - $lowerOpLabel = strtolower($p->opLabel); - $lowerDataType = strtolower($p->dataType); - $lowerTransform = strtolower($p->transform); + $userParam = (substr($param->param,0,3) == '::P'); //user entered field or static + $lowerOp = strtolower($param->op); + $lowerParam = strtolower($param->param); + $lowerOpLabel = strtolower($param->opLabel); + $lowerDataType = strtolower($param->dataType); + $lowerTransform = strtolower($param->transform); switch ($lowerOp) { case '=': - $p->opLabel='Equals'; + $param->opLabel='Equals'; break; case 'between': - $p->opLabel='Between'; + $param->opLabel='Between'; break; case '<': if ($lowerDataType == 'timestamp') - $p->opLabel='Before'; + $param->opLabel='Before'; else - $p->opLabel='Less than'; + $param->opLabel='Less than'; break; case '<=': if ($lowerDataType == 'timestamp') - $p->opLabel='On or before'; + $param->opLabel='On or before'; else - $p->opLabel='Less than or equal to'; + $param->opLabel='Less than or equal to'; break; case '>': if ($lowerDataType == 'timestamp') - $p->opLabel='After'; + $param->opLabel='After'; else - $p->opLabel='Greater than'; + $param->opLabel='Greater than'; break; case '>=': if ($lowerDataType == 'timestamp') - $p->opLabel='On or after'; + $param->opLabel='On or after'; else - $p->opLabel='Greater than or equal to'; + $param->opLabel='Greater than or equal to'; + break; + case 'ilike': + $param->opLabel='Substring Match
(ignore case)'; + break; + case 'like': + $param->opLabel='Substring Match
(case sensitive)'; break; case 'in': - $p->opLabel='In List'; + $param->opLabel='In List'; break; case 'not in': - $p->opLabel='Not In List'; + $param->opLabel='Not In List'; break; case 'is': - if (!$userParam && $lowerOpLabel == 'is null') { - $param->param = 'Null'; - } - $p->opLabel='Is'; + if (!$userParam && $lowerOpLabel == 'is null') $param->param = 'Null'; //set displayed value + $param->opLabel='Is'; break; case 'is not': - if (!$userParam && $lowerOpLabel == 'is not null') { - $param->param = 'Null'; - } - $p->opLabel='Is Not'; + if (!$userParam && $lowerOpLabel == 'is not null') $param->param = 'Null'; //set displayed value + $param->opLabel='Is Not'; break; default: - $p->opLabel='unknown action -'.$param->op; + //Use opLabel - do not show error message + if (substr($lowerOpLabel,0,3) == 'is ') { + $param->param = substr($param->opLabel,3); //set displayed value + $param->opLabel='Is'; + } break; } switch ($lowerTransform) { case 'bare': - $p->transformLabel = NULL; + $param->transformLabel = NULL; break; case 'date': - $p->transformLabel = NULL; + $param->transformLabel = NULL; break; } if (!$userParam && $lowerDataType == 'bool') { - if ($lowerOp == '=') $p->opLabel='Is'; + if ($lowerOp == '=') $param->opLabel='Is'; if ($lowerParam == 't') { - $p->param = 'True'; + $param->param = 'True'; } else { - $p->param = 'False'; + $param->param = 'False'; } } - if ($userParam) { - //generate user input fields - $p->param = $this->generateUserInputFields($param); - } + //generate user input fields + if ($userParam) $param->param = $this->generateUserInputFields($param); - return $p; + return $param; } private function generateUserInputFields($param) { @@ -444,22 +447,75 @@ class reportView extends baseReportView { case 'timestamp': $paramNameDate = $paramName.'_type'; //::Px_type - relative or real $dateType = (isset($this->defaultValues->paramsDecoded->$paramNameDate)?$this->defaultValues->paramsDecoded->$paramNameDate:'real'); - $cell .= ''; $cell .= ' '; - $paramNameDate = $paramName.'_date'; //::Px_date value - $value = (isset($this->defaultValues->paramsDecoded->$paramNameDate)?$this->defaultValues->paramsDecoded->$paramNameDate:''); - $cell .= ' - '; + switch ($lowerTransform) { + case 'date': + $paramNameDate = $paramName.'_date'; //::Px_date value + $value = (isset($this->defaultValues->paramsDecoded->$paramNameDate)?$this->defaultValues->paramsDecoded->$paramNameDate:''); + $cell .= ' + '; + + $paramNameDate = $paramName.'_relative_value'; //::Px_relative_value (days) + $value = (isset($this->defaultValues->paramsDecoded->$paramNameDate)?$this->defaultValues->paramsDecoded->$paramNameDate:''); + $cell .= ''; + break; + + case 'month_trunc': + $paramNameDate = $paramName.'_date_month'; //::Px_date_month value + $value = (isset($this->defaultValues->paramsDecoded->$paramNameDate)?$this->defaultValues->paramsDecoded->$paramNameDate:date('m')); + $cell .= ''; + + //setup realtive values + $paramNameDate = $paramName.'_relative_value'; //::Px_relative_value (months) + $value = (isset($this->defaultValues->paramsDecoded->$paramNameDate)?$this->defaultValues->paramsDecoded->$paramNameDate:''); + $cell .= ''; + break; + + case 'year_trunc': + $paramNameDate = $paramName.'_date_year'; //::Px_date_year value + $value = (isset($this->defaultValues->paramsDecoded->$paramNameDate)?$this->defaultValues->paramsDecoded->$paramNameDate:date('Y')); + $cell .= ''; - $paramNameDate = $paramName.'_relative_value'; //::Px_relative_value - $value = (isset($this->defaultValues->paramsDecoded->$paramNameDate)?$this->defaultValues->paramsDecoded->$paramNameDate:''); - $cell .= ''; + //setup realtive values + $paramNameDate = $paramName.'_relative_value'; //::Px_relative_value (years) + $value = (isset($this->defaultValues->paramsDecoded->$paramNameDate)?$this->defaultValues->paramsDecoded->$paramNameDate:''); + $cell .= ''; + break; + } break; case 'text':