Compare commits

...

6 Commits

Author SHA1 Message Date
Anne-Catherine
eb00253363 Update datamodels/2.x/itop-portal-base/portal/src/Controller/ObjectController.php
Co-authored-by: Thomas Casteleyn <thomas.casteleyn@super-visions.com>
2024-07-24 16:57:58 +02:00
Anne-Cath
908fd72c1f Add new markup 2024-07-24 16:57:58 +02:00
Anne-Cath
29d77f8092 Fix link on external Key 2024-07-24 16:57:58 +02:00
Anne-Cath
994ee4ffad WIP 2024-07-24 16:57:57 +02:00
Anne-Cath
974eafbf4a N°7146 - Fix style not applied in list in the end-users portal in iTop 3.0+ 2024-07-24 16:57:57 +02:00
Anne-Cath
1bb3fe5e0a N°7146 - Fix style not applied in list in the end-users portal in iTop 3.0+ - Add Markup in search list in order to use style 2024-07-24 16:57:57 +02:00
3 changed files with 105 additions and 36 deletions

View File

@@ -1408,14 +1408,14 @@ class ObjectController extends BrickController
protected function PrepareObjectInformation(DBObject $oObject, $aAttCodes = array()) protected function PrepareObjectInformation(DBObject $oObject, $aAttCodes = array())
{ {
$sObjectClass = get_class($oObject); $sObjectClass = get_class($oObject);
$aObjectData = array( $aObjectData = [
'id' => $oObject->GetKey(), 'id' => $oObject->GetKey(),
'name' => $oObject->GetName(), 'name' => $oObject->GetName(),
'attributes' => array(), 'attributes' => [],
); ];
// Retrieving attributes definitions // Retrieving attributes definitions
$aAttDefs = array(); $aAttDefs = [];
foreach ($aAttCodes as $sAttCode) foreach ($aAttCodes as $sAttCode)
{ {
if ($sAttCode === 'id') if ($sAttCode === 'id')
@@ -1429,13 +1429,30 @@ class ObjectController extends BrickController
// Preparing attribute data // Preparing attribute data
foreach ($aAttDefs as $oAttDef) foreach ($aAttDefs as $oAttDef)
{ {
$aAttData = array( $aAttData = [
'att_code' => $oAttDef->GetCode(), 'object_class' => $sObjectClass,
); 'object_id' => $oObject->GetKey(),
'attribute_code' => $oAttDef->GetCode(),
'attribute_type' => get_class($oAttDef),
];
// - Value raw
// For simple fields, we get the raw (stored) value as well
$bExcludeRawValue = false;
foreach (ApplicationHelper::GetAttDefClassesToExcludeFromMarkupMetadataRawValue() as $sAttDefClassToExclude)
{
if (is_a($oAttDef, $sAttDefClassToExclude, true))
{
$bExcludeRawValue = true;
break;
}
}
$aAttData['value_raw'] = ($bExcludeRawValue === false) ? $oObject->Get($oAttDef->GetCode()) : null;
if ($oAttDef->IsExternalKey()) if ($oAttDef->IsExternalKey())
{ {
$aAttData['value'] = $oObject->GetAsHTML($oAttDef->GetCode().'_friendlyname'); $aAttData['value_html'] = $oObject->GetAsHTML($oAttDef->GetCode().'_friendlyname');
// Checking if user can access object's external key // Checking if user can access object's external key
if ($this->oSecurityHelper->IsActionAllowed(UR_ACTION_READ, $oAttDef->GetTargetClass())) if ($this->oSecurityHelper->IsActionAllowed(UR_ACTION_READ, $oAttDef->GetTargetClass()))
@@ -1467,14 +1484,14 @@ class ObjectController extends BrickController
{ {
$sUrl = $oAttDef->Get('default_image'); $sUrl = $oAttDef->Get('default_image');
} }
$aAttData['value'] = '<img src="'.$sUrl.'" />'; $aAttData['value_html'] = '<img src="'.$sUrl.'" />';
} }
elseif ($oAttDef instanceof AttributeEnum) { elseif ($oAttDef instanceof AttributeEnum) {
$aAttData['value'] = $oAttDef->GetAsPlainText($oObject->Get($oAttDef->GetCode())); $aAttData['value_html'] = $oAttDef->GetAsPlainText($oObject->Get($oAttDef->GetCode()));
} }
else else
{ {
$aAttData['value'] = $oAttDef->GetAsHTML($oObject->Get($oAttDef->GetCode())); $aAttData['value_html'] = $oAttDef->GetAsHTML($oObject->Get($oAttDef->GetCode()));
if ($oAttDef instanceof AttributeFriendlyName) if ($oAttDef instanceof AttributeFriendlyName)
{ {

View File

@@ -9,7 +9,7 @@
<div id="{{ sFormId }}"> <div id="{{ sFormId }}">
{#<div class="form_alerts"></div>#} {#<div class="form_alerts"></div>#}
<div class="form_fields"> <div class="form_fields">
<table id="{{ sTableId }}" class="table table-striped table-bordered responsive" cellspacing="0" width="100%"> <table id="{{ sTableId }}" class="object-list table table-striped table-bordered responsive" cellspacing="0" width="100%">
<tbody> <tbody>
</tbody> </tbody>
</table> </table>
@@ -66,22 +66,35 @@
"title": oColumnProperties[sKey].title, "title": oColumnProperties[sKey].title,
"defaultContent": "", "defaultContent": "",
"type": "html", "type": "html",
"data": "attributes."+sKey+".att_code", "data": "attributes."+sKey+".attribute_code",
"render": function(data, type, row){ "render": function(attribute_code, type, row){
var cellElem; var cellElem;
var metadataNames = ['object_class', 'object_id', 'attribute_code', 'attribute_type', 'value_raw'];
// Preparing the cell data // Preparing the cell data
if(row.attributes[data].url !== undefined) if(row.attributes[attribute_code].url !== undefined)
{ {
cellElem = $('<a></a>'); cellElem = $('<a></a>');
cellElem.attr('target', '_blank').attr('href', row.attributes[data].url); cellElem.attr('target', '_blank').attr('href', row.attributes[attribute_code].url);
} }
else else
{ {
cellElem = $('<span></span>'); cellElem = $('<span></span>');
} }
cellElem.attr('data-object-id', row.id).html('<span>' + row.attributes[data].value + '</span>'); //Add markup
for(var sPropName in row.attributes[attribute_code])
{
var propValue = row.attributes[attribute_code][sPropName];
if(sPropName === 'value_html')
{
cellElem.html(propValue);
}
else if(metadataNames.indexOf(sPropName) > -1)
{
cellElem.attr('data-'+sPropName.replace('_', '-'), propValue)
}
}
return cellElem.prop('outerHTML'); return cellElem.prop('outerHTML');
}, },
}); });
@@ -92,7 +105,6 @@
$(document).ready(function(){ $(document).ready(function(){
showTableLoader(); showTableLoader();
// Note : Those options should be externalized in an library so we can use them on any DataTables for the portal. // Note : Those options should be externalized in an library so we can use them on any DataTables for the portal.
// We would just have to override / complete the necessary elements // We would just have to override / complete the necessary elements
oTable = $('#{{ sTableId }}').DataTable({ oTable = $('#{{ sTableId }}').DataTable({

View File

@@ -24,6 +24,7 @@ use ApplicationContext;
use AttributeFriendlyName; use AttributeFriendlyName;
use Combodo\iTop\Form\Field\DateTimeField; use Combodo\iTop\Form\Field\DateTimeField;
use Combodo\iTop\Form\Field\Field; use Combodo\iTop\Form\Field\Field;
use Combodo\iTop\Portal\Helper\ApplicationHelper;
use Combodo\iTop\Renderer\Bootstrap\BsFieldRendererMappings; use Combodo\iTop\Renderer\Bootstrap\BsFieldRendererMappings;
use Combodo\iTop\Renderer\FieldRenderer; use Combodo\iTop\Renderer\FieldRenderer;
use Combodo\iTop\Renderer\RenderingOutput; use Combodo\iTop\Renderer\RenderingOutput;
@@ -192,7 +193,7 @@ EOF
"render": function(data, type, row) "render": function(data, type, row)
{ {
var oCheckboxElem = $('{$sSelectionInputHtml}'); var oCheckboxElem = $('{$sSelectionInputHtml}');
if(row.limited_access) if(row.limited_access)
{ {
oCheckboxElem.html('-'); oCheckboxElem.html('-');
} }
@@ -221,7 +222,8 @@ EOF
"className": {$sIsEditable} && aColumnProperties.mandatory ? 'mandatory' : '', "className": {$sIsEditable} && aColumnProperties.mandatory ? 'mandatory' : '',
"render": function(data, type, row){ "render": function(data, type, row){
var cellElem; var cellElem;
var metadataNames = ['object_class', 'object_id', 'attribute_code', 'attribute_type', 'value_raw'];
// Preparing the cell data // Preparing the cell data
if(data.url !== undefined) if(data.url !== undefined)
{ {
@@ -232,8 +234,19 @@ EOF
{ {
cellElem = $('<span></span>'); cellElem = $('<span></span>');
} }
cellElem.html('<span>' + data.value + '</span>'); for(var sPropName in row.attributes[data.prefix+data.attribute_code])
{
var propValue = row.attributes[data.prefix+data.attribute_code][sPropName];
if(sPropName === 'value_html')
{
cellElem.html(propValue);
}
else if(metadataNames.indexOf(sPropName) > -1)
{
cellElem.attr('data-'+sPropName.replace('_', '-'), propValue)
}
}
return cellElem.prop('outerHTML'); return cellElem.prop('outerHTML');
}, },
}); });
@@ -242,7 +255,6 @@ EOF
for(sKey in oColumnProperties_{$this->oField->GetGlobalId()}) for(sKey in oColumnProperties_{$this->oField->GetGlobalId()})
{ {
aColumnProperties = oColumnProperties_{$this->oField->GetGlobalId()}[sKey]; aColumnProperties = oColumnProperties_{$this->oField->GetGlobalId()}[sKey];
// Level main column // Level main column
aColumnsDefinition.push({ aColumnsDefinition.push({
"width": "auto", "width": "auto",
@@ -254,7 +266,8 @@ EOF
"data": "attributes." + sKey, "data": "attributes." + sKey,
"className": aColumnProperties.mandatory ? 'mandatory' : '', "className": aColumnProperties.mandatory ? 'mandatory' : '',
"render": function(data, type, row){ "render": function(data, type, row){
var cellElem; var cellElem;
var metadataNames = ['object_class', 'object_id', 'attribute_code', 'attribute_type', 'value_raw'];
// Preparing the cell data // Preparing the cell data
if(data.url !== undefined) if(data.url !== undefined)
@@ -266,7 +279,19 @@ EOF
{ {
cellElem = $('<span></span>'); cellElem = $('<span></span>');
} }
cellElem.html('<span>' + data.value + '</span>');
for(var sPropName in row.attributes[data.attribute_code])
{
var propValue = row.attributes[data.attribute_code][sPropName];
if(sPropName === 'value_html')
{
cellElem.html(propValue);
}
else if(metadataNames.indexOf(sPropName) > -1)
{
cellElem.attr('data-'+sPropName.replace('_', '-'), propValue)
}
}
return cellElem.prop('outerHTML'); return cellElem.prop('outerHTML');
}, },
@@ -799,7 +824,6 @@ JS
static::TransferFieldRendererGlobalOutput($oFieldOutput, $oOutput); static::TransferFieldRendererGlobalOutput($oFieldOutput, $oOutput);
} }
} }
} }
/** /**
@@ -821,14 +845,30 @@ JS
if ($sAttCode !== 'id') { if ($sAttCode !== 'id') {
// Prepare attribute properties
$aAttProperties = array(
'att_code' => $sAttCode,
);
// Retrieve attribute definition // Retrieve attribute definition
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode); $oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
// Prepare attribute properties
$aAttProperties = [
'prefix'=> $sAttribueKeyPrefix,
'object_class' => $sClass,
'object_id' => $oItem->GetKey(),
'attribute_code' => $sAttCode,
'attribute_type' => get_class($oAttDef),
];
// - Value raw
// For simple fields, we get the raw (stored) value as well
$bExcludeRawValue = false;
foreach (ApplicationHelper::GetAttDefClassesToExcludeFromMarkupMetadataRawValue() as $sAttDefClassToExclude)
{
if (is_a($oAttDef, $sAttDefClassToExclude, true))
{
$bExcludeRawValue = true;
break;
}
}
$aAttProperties['value_raw'] = ($bExcludeRawValue === false) ? $oItem->Get($sAttCode) : null;
// External key specific // External key specific
if ($bIsEditable) { if ($bIsEditable) {
@@ -847,23 +887,23 @@ JS
$oFieldOutput = $oFieldRenderer->Render(); $oFieldOutput = $oFieldRenderer->Render();
$aAttProperties['js_inline'] = $oFieldOutput->GetJs(); $aAttProperties['js_inline'] = $oFieldOutput->GetJs();
$aAttProperties['css_inline'] = $oFieldOutput->GetCss(); $aAttProperties['css_inline'] = $oFieldOutput->GetCss();
$aAttProperties['value'] = $oFieldOutput->GetHtml(); $aAttProperties['value_html'] = $oFieldOutput->GetHtml();
} }
} else if ($oAttDef->IsExternalKey()) { } else if ($oAttDef->IsExternalKey()) {
/** @var \AttributeExternalKey $oAttDef */ /** @var \AttributeExternalKey $oAttDef */
$aAttProperties['value'] = $oItem->Get($sAttCode.'_friendlyname'); $aAttProperties['value_html'] = $oItem->Get($sAttCode.'_friendlyname');
// Checking if user can access object's external key // Checking if user can access object's external key
$sObjectUrl = ApplicationContext::MakeObjectUrl($sClass, $oItem->Get($sAttCode)); $sObjectUrl = ApplicationContext::MakeObjectUrl($oAttDef->GetTargetClass(), $oItem->Get($sAttCode));
if (!empty($sObjectUrl)) { if (!empty($sObjectUrl)) {
$aAttProperties['url'] = $sObjectUrl; $aAttProperties['url'] = $sObjectUrl;
} }
} else { // Others attributes } else { // Others attributes
$aAttProperties['value'] = $oAttDef->GetAsHTML($oItem->Get($sAttCode)); $aAttProperties['value_html'] = $oAttDef->GetAsHTML($oItem->Get($sAttCode));
if ($oAttDef instanceof AttributeFriendlyName) { if ($oAttDef instanceof AttributeFriendlyName) {
// Checking if user can access object // Checking if user can access object