diff --git a/application/ui.extkeywidget.class.inc.php b/application/ui.extkeywidget.class.inc.php index 9724b867f..493ba7bce 100644 --- a/application/ui.extkeywidget.class.inc.php +++ b/application/ui.extkeywidget.class.inc.php @@ -4,6 +4,8 @@ * @license http://opensource.org/licenses/AGPL-3.0 */ +use Combodo\iTop\Core\MetaModel\FriendlyNameType; + require_once(APPROOT.'/application/displayblock.class.inc.php'); /** @@ -200,42 +202,33 @@ class UIExtKeyWidget $sHelpText = ''; //$this->oAttDef->GetHelpOnEdition(); //$sHTMLValue .= "
\n"; $aOptions = []; - $sDisplayValue = ""; $aOption = []; $aOption['value'] = ""; $aOption['label'] = Dict::S('UI:SelectOne'); - array_push($aOptions,$aOption); + array_push($aOptions, $aOption); $oAllowedValues->Rewind(); - $bAddingValue=false; + $sClassAllowed = $oAllowedValues->GetClass(); + $bAddingValue = false; - $aComplementAttributeSpec = MetaModel::GetComplementAttributeSpec($oAllowedValues->GetClass()); + $aComplementAttributeSpec = MetaModel::GetNameSpec($oAllowedValues->GetClass(), FriendlyNameType::COMPLEMENTARY); $sFormatAdditionalField = $aComplementAttributeSpec[0]; $aAdditionalField = $aComplementAttributeSpec[1]; - if (count($aAdditionalField)>0) - { - $bAddingValue=true; + if (count($aAdditionalField) > 0) { + $bAddingValue = true; } - while($oObj = $oAllowedValues->Fetch()) - { - $aOption=[]; + $sObjectImageAttCode = MetaModel::GetImageAttributeCode($sClassAllowed); + while ($oObj = $oAllowedValues->Fetch()) { + $aOption = []; $aOption['value'] = $oObj->GetKey(); $aOption['label'] = $oObj->GetName();//.''; - if (($oAllowedValues->Count() == 1) && ($bMandatory == 'true') ) - { + if (($oAllowedValues->Count() == 1) && ($bMandatory == 'true')) { // When there is only once choice, select it by default - $sDisplayValue=$oObj->GetName(); - if($value != $oObj->GetKey()) - { - $value=$oObj->GetKey(); - } - } - else { - if ((is_array($value) && in_array($oObj->GetKey(), $value)) || ($value == $oObj->GetKey())) { - $sDisplayValue = $oObj->GetName(); + if ($value != $oObj->GetKey()) { + $value = $oObj->GetKey(); } } if ($oObj->IsObsolete()) { @@ -248,6 +241,17 @@ class UIExtKeyWidget } $aOption['additional_field'] = vsprintf($sFormatAdditionalField, $aArguments); } + if (!empty($sObjectImageAttCode)) { + // Try to retrieve image for contact + /** @var \ormDocument $oImage */ + $oImage = $oObj->Get($sObjectImageAttCode); + if (!$oImage->IsEmpty()) { + $aOption['picture_url'] = $oImage->GetDisplayURL($sClassAllowed, $oObj->GetKey(), $sObjectImageAttCode); + $aOption['initials'] = ''; + } else { + $aOption['initials'] = utils::ToAcronym($oObj->Get('friendlyname')); + } + } array_push($aOptions, $aOption); } $sInputType = CmdbAbstractObject::ENUM_INPUT_TYPE_DROPDOWN_DECORATED; @@ -811,21 +815,24 @@ JS { case static::ENUM_OUTPUT_FORMAT_JSON: - $aJsonMap = array(); - foreach ($aValues as $sKey => $aValue) - { - if ($aValue['additional_field'] != '') - { - $aJsonMap[] = array('value' => $sKey, 'label' => $aValue['label'], 'obsolescence_flag' => $aValue['obsolescence_flag'], 'additional_field' => $aValue['additional_field']); - } - else - { - $aJsonMap[] = array('value' => $sKey, 'label' => $aValue['label'], 'obsolescence_flag' => $aValue['obsolescence_flag']); - } - } + $aJsonMap = array(); + foreach ($aValues as $sKey => $aValue) { + $aElt = ['value' => $sKey, 'label' => $aValue['label'], 'obsolescence_flag' => $aValue['obsolescence_flag']]; + if ($aValue['additional_field'] != '') { + $aElt['additional_field'] = $aValue['additional_field']; + } - $oP->SetContentType('application/json'); - $oP->add(json_encode($aJsonMap)); + if (array_key_exists('initials', $aValue)) { + $aElt['initials'] = $aValue['initials']; + if (array_key_exists('picture_url', $aValue)) { + $aElt['picture_url'] = $aValue['picture_url']; + } + } + $aJsonMap[] = $aElt; + } + + $oP->SetContentType('application/json'); + $oP->add(json_encode($aJsonMap)); break; case static::ENUM_OUTPUT_FORMAT_CSV: diff --git a/core/dbobject.class.php b/core/dbobject.class.php index 942afe0f2..308800658 100644 --- a/core/dbobject.class.php +++ b/core/dbobject.class.php @@ -4,6 +4,8 @@ * @license http://opensource.org/licenses/AGPL-3.0 */ +use Combodo\iTop\Core\MetaModel\FriendlyNameType; + /** * All objects to be displayed in the application (either as a list or as details) * must implement this interface. @@ -1525,14 +1527,14 @@ abstract class DBObject implements iDisplay * Helper to get the friendly name in a safe manner for displaying inside a web page * * @internal - * @since 3.0.0 N°4106 This method is now internal. It will be set final in 3.1.0 (N°4107) - * * @return string * @throws \CoreException + * @since 3.0.0 N°4106 This method is now internal. It will be set final in 3.1.0 (N°4107) + * */ - public function GetName() + public function GetName($sType = FriendlyNameType::SHORT) { - return htmlentities($this->GetRawName(), ENT_QUOTES, 'UTF-8'); + return htmlentities($this->GetRawName($sType), ENT_QUOTES, 'UTF-8'); } /** @@ -1548,9 +1550,14 @@ abstract class DBObject implements iDisplay * @since 3.0.0 N°4106 This method is now internal. It will be set final in 3.1.0 (N°4107) * */ - public function GetRawName() + public function GetRawName($sType = FriendlyNameType::SHORT) { - return $this->Get('friendlyname'); + if ($sType == FriendlyNameType::SHORT) { + return $this->Get('friendlyname'); + } else { + $oExpression = MetaModel::GetNameExpression(get_class($this), $sType); + $this->EvaluateExpression($oExpression); + } } /** diff --git a/core/metamodel.class.php b/core/metamodel.class.php index 8aa876631..f80dfbc33 100644 --- a/core/metamodel.class.php +++ b/core/metamodel.class.php @@ -17,6 +17,8 @@ // along with iTop. If not, see // +use Combodo\iTop\Core\MetaModel\FriendlyNameType; + require_once APPROOT.'core/modulehandler.class.inc.php'; require_once APPROOT.'core/querymodifier.class.inc.php'; require_once APPROOT.'core/metamodelmodifier.inc.php'; @@ -24,6 +26,7 @@ require_once APPROOT.'core/computing.inc.php'; require_once APPROOT.'core/relationgraph.class.inc.php'; require_once APPROOT.'core/apc-compat.php'; require_once APPROOT.'core/expressioncache.class.inc.php'; +require_once APPROOT.'sources/Core/MetaModel/FriendlyNameType.php'; /** @@ -757,12 +760,48 @@ abstract class MetaModel * @throws \CoreException * @throws \DictExceptionMissingString */ - final public static function GetNameSpec($sClass) + final public static function GetNameSpec($sClass, $sType = FriendlyNameType::SHORT) { self::_check_subclass($sClass); - $nameRawSpec = self::$m_aClassParams[$sClass]["name_attcode"]; + + switch ($sType) { + case FriendlyNameType::COMPLEMENTARY: + if (!isset(self::$m_aClassParams[$sClass]["complementary_name_attcode"])) { + return [$sClass, []]; + } + $nameRawSpec = self::$m_aClassParams[$sClass]["complementary_name_attcode"]; + $sDictName = 'ComplementaryName'; + break; + case FriendlyNameType::LONG: + $nameRawSpec = self::$m_aClassParams[$sClass]["name_attcode"]; + if (!isset(self::$m_aClassParams[$sClass]["complementary_name_attcode"])) { + return self::GetNameSpec($sClass, FriendlyNameType::SHORT); + } + $complementaryNameRawSpec = self::$m_aClassParams[$sClass]["complementary_name_attcode"]; + if (is_array($nameRawSpec)) { + if (is_array($complementaryNameRawSpec)) { + $nameRawSpec = merge($nameRawSpec, $complementaryNameRawSpec); + } elseif (!empty($nameRawSpec)) { + $nameRawSpec = merge($nameRawSpec, [$complementaryNameRawSpec]); + } + } elseif (empty($nameRawSpec)) { + $nameRawSpec = $complementaryNameRawSpec; + } else { + if (is_array($complementaryNameRawSpec)) { + $nameRawSpec = merge([$nameRawSpec], $complementaryNameRawSpec); + } elseif (!empty($nameRawSpec)) { + $nameRawSpec = [$nameRawSpec, $complementaryNameRawSpec]; + } + } + $sDictName = 'LongName'; + break; + default: + $nameRawSpec = self::$m_aClassParams[$sClass]["name_attcode"]; + $sDictName = 'Name'; + } + if (is_array($nameRawSpec)) { - $sFormat = Dict::S("Class:$sClass/Name", ''); + $sFormat = Dict::S("Class:$sClass/$sDictName", ''); if (strlen($sFormat) == 0) { // Default to "%1$s %2$s..." for ($i = 1; $i <= count($nameRawSpec); $i++) { @@ -774,12 +813,12 @@ abstract class MetaModel } } - return array($sFormat, $nameRawSpec); + return [$sFormat, $nameRawSpec]; } elseif (empty($nameRawSpec)) { - return array($sClass, array()); + return [$sClass, []]; } else { // string -> attcode - return array('%1$s', array($nameRawSpec)); + return ['%1$s', [$nameRawSpec]]; } } @@ -792,19 +831,32 @@ abstract class MetaModel * @throws \CoreException * @since 3.0.0 */ - final public static function GetNameAttributes(string $sClass, $bWithAttributeDefinition = false): array + final public static function GetNameAttributes(string $sClass, $bWithAttributeDefinition = false, $sType = FriendlyNameType::SHORT): array { self::_check_subclass($sClass); - $rawNameAttCodes = self::$m_aClassParams[$sClass]["name_attcode"]; $aNameAttCodes = []; - if (!is_array($rawNameAttCodes)) { - if (self::IsValidAttCode($sClass, $rawNameAttCodes)) { - $aNameAttCodes[] = $rawNameAttCodes; + if ($sType == FriendlyNameType::SHORT || FriendlyNameType::LONG) { + $rawNameAttCodes = self::$m_aClassParams[$sClass]["name_attcode"]; + if (!is_array($rawNameAttCodes)) { + if (self::IsValidAttCode($sClass, $rawNameAttCodes)) { + $aNameAttCodes[] = $rawNameAttCodes; + } + } else { + $aNameAttCodes = $rawNameAttCodes; + } + } + if ($sType == FriendlyNameType::COMPLEMENTARY || FriendlyNameType::LONG) { + $rawNameAttCodes = self::$m_aClassParams[$sClass]["complementary_name_attcode"]; + if (!isEmpty($rawNameAttCodes)) { + if (!is_array($rawNameAttCodes)) { + if (self::IsValidAttCode($sClass, $rawNameAttCodes)) { + $aNameAttCodes[] = array_merge($aNameAttCodes, [$rawNameAttCodes]); + } + } else { + $aNameAttCodes = array_merge($rawNameAttCodes, $rawNameAttCodes); + } } - } else { - $aNameAttCodes = $rawNameAttCodes; } - if ($bWithAttributeDefinition) { $aResults = []; foreach ($aNameAttCodes as $sAttCode) { @@ -842,56 +894,6 @@ abstract class MetaModel return $aResults; } - /** - * @param string $sClass - * - * @return array - * @throws \CoreException - * @throws \DictExceptionMissingString - */ - final static public function GetComplementAttributeSpec($sClass) - { - self::_check_subclass($sClass); - if (!isset(self::$m_aClassParams[$sClass]["name_complement_for_select"])) - { - $sParentClass = static::GetParentClass($sClass); - if (is_null($sParentClass)) { - return array($sClass, array()); - } else { - return static::GetComplementAttributeSpec($sParentClass); - } - } - $nameRawSpec = self::$m_aClassParams[$sClass]["name_complement_for_select"]; - if (is_array($nameRawSpec)) - { - $sFormat = Dict::S("Class:$sClass/ComplementForSelect", ''); - if (strlen($sFormat) == 0) - { - // Default to "%1$s %2$s..." - for($i = 1; $i <= count($nameRawSpec); $i++) - { - if (empty($sFormat)) - { - $sFormat .= '%'.$i.'$s'; - } - else - { - $sFormat .= ' %'.$i.'$s'; - } - } - } - return array($sFormat, $nameRawSpec); - } - elseif (empty($nameRawSpec)) - { - return array($sClass, array()); - } - else - { - // string -> attcode - return array('%1$s', array($nameRawSpec)); - } - } /** * Get the friendly name expression for a given class * @@ -901,9 +903,9 @@ abstract class MetaModel * @throws \CoreException * @throws \DictExceptionMissingString */ - final public static function GetNameExpression($sClass) + final public static function GetNameExpression($sClass, $sType = FriendlyNameType::SHORT) { - $aNameSpec = self::GetNameSpec($sClass); + $aNameSpec = self::GetNameSpec($sClass, $sType); $sFormat = $aNameSpec[0]; $aAttributes = $aNameSpec[1]; @@ -940,9 +942,9 @@ abstract class MetaModel * @throws \CoreException * @throws \DictExceptionMissingString */ - final public static function GetFriendlyNameAttributeCode($sClass) + final public static function GetFriendlyNameAttributeCode($sClass, $sType = FriendlyNameType::SHORT) { - $aNameSpec = self::GetNameSpec($sClass); + $aNameSpec = self::GetNameSpec($sClass, $sType); $sFormat = trim($aNameSpec[0]); $aAttributes = $aNameSpec[1]; if (($sFormat != '') && ($sFormat != '%1$s')) { @@ -962,9 +964,9 @@ abstract class MetaModel * * @return array */ - final public static function GetFriendlyNameAttributeCodeList($sClass) + final public static function GetFriendlyNameAttributeCodeList($sClass, $sType = FriendlyNameType::SHORT) { - $aNameSpec = self::GetNameSpec($sClass); + $aNameSpec = self::GetNameSpec($sClass, $sType); $aAttributes = $aNameSpec[1]; return $aAttributes; diff --git a/core/valuesetdef.class.inc.php b/core/valuesetdef.class.inc.php index a9d553b72..99911c3de 100644 --- a/core/valuesetdef.class.inc.php +++ b/core/valuesetdef.class.inc.php @@ -24,6 +24,8 @@ * @license http://opensource.org/licenses/AGPL-3.0 */ +use Combodo\iTop\Core\MetaModel\FriendlyNameType; + require_once('MyHelpers.class.inc.php'); /** @@ -379,41 +381,35 @@ class ValueSetObjects extends ValueSetDefinition $this->m_aValues = array(); - if ($this->m_bAllowAllData) - { + if ($this->m_bAllowAllData) { $oFilter = DBObjectSearch::FromOQL_AllData($this->m_sFilterExpr); - } - else - { + } else { $oFilter = DBObjectSearch::FromOQL($this->m_sFilterExpr); $oFilter->SetShowObsoleteData(utils::ShowObsoleteData()); } - if (!$oFilter) return false; - if (!is_null($this->m_oExtraCondition)) - { + if (!$oFilter) { + return false; + } + if (!is_null($this->m_oExtraCondition)) { $oFilter = $oFilter->Intersect($this->m_oExtraCondition); } - foreach($this->m_aModifierProperties as $sPluginClass => $aProperties) - { - foreach ($aProperties as $sProperty => $value) - { + foreach ($this->m_aModifierProperties as $sPluginClass => $aProperties) { + foreach ($aProperties as $sProperty => $value) { $oFilter->SetModifierProperty($sPluginClass, $sProperty, $value); } } //$oExpression = DBObjectSearch::GetPolymorphicExpression($oFilter->GetClass(), 'friendlyname'); $sClass = $oFilter->GetClass(); + $sClassAlias = $oFilter->GetClassAlias(); - switch ($sOperation) - { + switch ($sOperation) { case 'equals': $aAttributes = MetaModel::GetFriendlyNameAttributeCodeList($sClass); - $sClassAlias = $oFilter->GetClassAlias(); $aFilters = array(); $oValueExpr = new ScalarExpression($sContains); - foreach($aAttributes as $sAttribute) - { + foreach ($aAttributes as $sAttribute) { $oNewFilter = $oFilter->DeepClone(); $oNameExpr = new FieldExpression($sAttribute, $sClassAlias); $oCondition = new BinaryExpression($oNameExpr, '=', $oValueExpr); @@ -425,7 +421,6 @@ class ValueSetObjects extends ValueSetDefinition break; case 'start_with': $aAttributes = MetaModel::GetFriendlyNameAttributeCodeList($sClass); - $sClassAlias = $oFilter->GetClassAlias(); $aFilters = array(); $oValueExpr = new ScalarExpression($sContains.'%'); foreach($aAttributes as $sAttribute) @@ -442,63 +437,67 @@ class ValueSetObjects extends ValueSetDefinition default: $oValueExpr = new ScalarExpression('%'.$sContains.'%'); - $oNameExpr = new FieldExpression('friendlyname', $oFilter->GetClassAlias()); + $oNameExpr = new FieldExpression('friendlyname', $sClassAlias); $oNewCondition = new BinaryExpression($oNameExpr, 'LIKE', $oValueExpr); $oFilter->AddConditionExpression($oNewCondition); break; } $oObjects = new DBObjectSet($oFilter, $this->m_aOrderBy, $aArgs, null, $this->m_iLimit, 0, $this->m_bSort); - if (empty($this->m_sValueAttCode)) - { - $aAttToLoad = array($oFilter->GetClassAlias() => array('friendlyname')); - } - else - { - $aAttToLoad = array($oFilter->GetClassAlias() => array($this->m_sValueAttCode)); + if (empty($this->m_sValueAttCode)) { + $aAttToLoad = ['friendlyname']; + } else { + $aAttToLoad = [$this->m_sValueAttCode]; } - $aComplementAttributeSpec = MetaModel::GetComplementAttributeSpec($sClass); + $sImageAttr = MetaModel::GetImageAttributeCode($sClass); + if (!empty($sImageAttr)) { + $aAttToLoad [] = $sImageAttr; + } + + $aComplementAttributeSpec = MetaModel::GetNameSpec($sClass, FriendlyNameType::COMPLEMENTARY); $sFormatAdditionalField = $aComplementAttributeSpec[0]; - $aAdditionalField = $aComplementAttributeSpec[1]; + $aAdditionalField = $aComplementAttributeSpec[1]; - if (count($aAdditionalField)>0) - { - $aAttToLoad = array_merge ($aAttToLoad, [$oFilter->GetClassAlias() => $aAdditionalField]); + if (count($aAdditionalField) > 0) { + if (is_array($aAdditionalField)) { + $aAttToLoad = array_merge($aAttToLoad, $aAdditionalField); + } else { + $aAttToLoad [] = $aAdditionalField; + } } - $oObjects->OptimizeColumnLoad($aAttToLoad); - while ($oObject = $oObjects->Fetch()) - { - $aData=[]; - if (empty($this->m_sValueAttCode)) - { + $oObjects->OptimizeColumnLoad([$sClassAlias => $aAttToLoad]); + while ($oObject = $oObjects->Fetch()) { + $aData = []; + if (empty($this->m_sValueAttCode)) { $aData['label'] = $oObject->GetName(); - } - else - { + } else { $aData['label'] = $oObject->Get($this->m_sValueAttCode); } - if($oObject->IsObsolete()) - { - $aData['obsolescence_flag']='1'; + if ($oObject->IsObsolete()) { + $aData['obsolescence_flag'] = '1'; + } else { + $aData['obsolescence_flag'] = '0'; } - else - { - $aData['obsolescence_flag']='0'; - } - if (count($aAdditionalField)>0) - { + if (count($aAdditionalField) > 0) { $aArguments = []; - foreach ($aAdditionalField as $sAdditionalField) - { - array_push ($aArguments,$oObject->Get($sAdditionalField)); + foreach ($aAdditionalField as $sAdditionalField) { + array_push($aArguments, $oObject->Get($sAdditionalField)); } $aData['additional_field'] = vsprintf($sFormatAdditionalField, $aArguments); + } else { + $aData['additional_field'] = ''; } - else - { - $aData['additional_field']=''; + if (!empty($sImageAttr)) { + /** @var \ormDocument $oImage */ + $oImage = $oObject->Get($sImageAttr); + if (!$oImage->IsEmpty()) { + $aData['picture_url'] = $oImage->GetDisplayURL($sClass, $oObject->GetKey(), $sImageAttr); + $aData['initials'] = ''; + } else { + $aData['initials'] = utils::ToAcronym($aData['label']); + } } $this->m_aValues[$oObject->GetKey()] = $aData; } diff --git a/css/backoffice/components/input/_input-select.scss b/css/backoffice/components/input/_input-select.scss index 0c832becd..2f7c7f503 100644 --- a/css/backoffice/components/input/_input-select.scss +++ b/css/backoffice/components/input/_input-select.scss @@ -34,6 +34,11 @@ $ibo-input-select--select-wrapper--action-button--margin-right: 20px !default; $ibo-input-select--action-button--padding-left: 6px !default; $ibo-input-select--action-button--padding-right: 2px !default; +$ibo-select--autocomplete-item-image--size: 25px !default; +$ibo-select--autocomplete-item-image--margin-right: 0.5rem !default; +$ibo-select--autocomplete-item-image--background-color: $ibo-color-blue-100 !default; +$ibo-select--autocomplete-item-image--border: 1px solid $ibo-color-grey-600 !default; + .ibo-input-select { display: inline-block; min-width: $ibo-input-select--value--min-midth; @@ -164,8 +169,35 @@ $ibo-input-select--action-button--padding-right: 2px !default; max-height: $ibo-input-select-selectize--dropdown--max-height; overflow-y: auto; } + .selectize-dropdown.ui-menu .ui-state-active { - margin: unset; - background-color: #f5fafd; - color: #495c68; + margin: unset; + background-color: #f5fafd; + color: #495c68; +} + +.ibo-select--autocomplete-item { + display: flex; + justify-content: left; + align-items: center; +} + +.ibo-select--autocomplete-item-image { + width: $ibo-select--autocomplete-item-image--size; + height: $ibo-select--autocomplete-item-image--size; + /* min-xxx are here to avoid medallion to be horizontally compressed when the title is to long */ + min-width: $ibo-select--autocomplete-item-image--size; + min-height: $ibo-select--autocomplete-item-image--size; + background-position: center center; + background-size: 100%; + border-radius: 100%; + margin-right: $ibo-select--autocomplete-item-image--margin-right; + background-color: $ibo-select--autocomplete-item-image--background-color; + border: $ibo-select--autocomplete-item-image--border; + + @extend %ibo-fully-centered-content; +} + +.ibo-select--autocomplete-item-txt { + white-space: nowrap; } diff --git a/js/extkeywidget.js b/js/extkeywidget.js index 632ac3f13..cc200fe28 100644 --- a/js/extkeywidget.js +++ b/js/extkeywidget.js @@ -137,15 +137,25 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper return $("
").append(val); }, option: function(item) { + val = ''; + if (item.initials != undefined) { + if (item.picture_url != undefined) { + val = ''+item.initials+''; + } else { + val = ''+item.initials+''; + } + } + val = val+''; if (item.obsolescence_flag == 1) { - val = ''+item.label; + val = val+''+item.label; } else { - val = item.label; + val = val+item.label; } if (item.additional_field != undefined) { val = val+'
'+item.additional_field+''; } - return $("
").append(val); + val = val+''; + return $("
").append(val); } }, valueField: 'value', @@ -238,19 +248,28 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper }) .autocomplete("instance")._renderItem = function (ul, item) { $(ul).addClass('selectize-dropdown'); - var term = this.term.replace("/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi", "\\$1"); - var val = $('
').text(item.label).html(); - val = val.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)("+term+")(?![^<>]*>)(?![^&;]+;)", "gi"), "$1"); - if (item.obsolescence_flag == '1') { - val = ' '+val; + let term = this.term.replace("/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi", "\\$1"); + let val = ''; + if (item.initials != undefined) { + if (item.picture_url != undefined) { + val = ''+item.initials+''; + } else { + val = ''+item.initials+''; + } } - if (item.additional_field != undefined ) - { + val = val+'
'; + if (item.obsolescence_flag == '1') { + val = val+' '; + } + let labelValue = $('
').text(item.label).html(); + labelValue = labelValue.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)("+term+")(?![^<>]*>)(?![^&;]+;)", "gi"), "$1"); + val = val+labelValue; + if (item.additional_field != undefined) { val = val+'
'+item.additional_field+''; } - + val = val+'
'; return $("
  • ") - .append("
    "+val+"
    ") + .append("
    "+val+"
    ") .appendTo(ul); }; diff --git a/setup/compiler.class.inc.php b/setup/compiler.class.inc.php index 1b5834935..6f31a5d58 100644 --- a/setup/compiler.class.inc.php +++ b/setup/compiler.class.inc.php @@ -1099,41 +1099,47 @@ EOF $oProperties = $oClass->GetUniqueElement('properties'); $sPHP = ''; $sCss = ''; // Contains dynamic CSS class definitions - + // Class caracteristics // $aClassParams = array(); $aClassParams['category'] = $this->GetPropString($oProperties, 'category', ''); $aClassParams['key_type'] = "'autoincrement'"; - if ((bool) $this->GetPropNumber($oProperties, 'is_link', 0)) - { + if ((bool)$this->GetPropNumber($oProperties, 'is_link', 0)) { $aClassParams['is_link'] = 'true'; } // Naming - if ($oNaming = $oProperties->GetOptionalElement('naming')) - { + $sComplementaryNameAttCode = ""; + if ($oNaming = $oProperties->GetOptionalElement('naming')) { $oNameAttributes = $oNaming->GetUniqueElement('attributes'); /** @var \DOMNodeList $oAttributes */ $oAttributes = $oNameAttributes->getElementsByTagName('attribute'); $aNameAttCodes = array(); /** @var \MFElement $oAttribute */ - foreach($oAttributes as $oAttribute) - { + foreach ($oAttributes as $oAttribute) { $aNameAttCodes[] = $oAttribute->getAttribute('id'); } - if (count($aNameAttCodes) > 0) - { + if (count($aNameAttCodes) > 0) { // New style... $sNameAttCode = "array('".implode("', '", $aNameAttCodes)."')"; - } - else - { + } else { $sNameAttCode = "''"; } - } - else - { + if ($oComplementaryNameAttributes = $oNaming->GetOptionalElement('complementary_attributes')) { + /** @var \DOMNodeList $oAttributes */ + $oComplementaryAttributes = $oComplementaryNameAttributes->getElementsByTagName('attribute'); + $aComplementaryNameAttCodes = array(); + /** @var \MFElement $oAttribute */ + foreach ($oComplementaryAttributes as $oComplementaryAttribute) { + $aComplementaryNameAttCodes[] = $oComplementaryAttribute->getAttribute('id'); + } + if (count($aComplementaryNameAttCodes) > 0) { + $sComplementaryNameAttCode = "array('".implode("', '", $aComplementaryNameAttCodes)."')"; + } + $aClassParams['complementary_name_attcode'] = $sComplementaryNameAttCode; + } + } else { $sNameAttCode = "''"; } $aClassParams['name_attcode'] = $sNameAttCode; @@ -1228,76 +1234,39 @@ EOF { $sIndexId = $oIndex->getAttribute('id'); $oAttributes = $oIndex->GetUniqueElement('attributes'); - foreach($oAttributes->getElementsByTagName('attribute') as $oAttribute) - { + foreach ($oAttributes->getElementsByTagName('attribute') as $oAttribute) { $aIndexes[$sIndexId][] = $oAttribute->getAttribute('id'); } } $aClassParams['indexes'] = var_export($aIndexes, true); } - if ($oArchive = $oProperties->GetOptionalElement('archive')) - { + if ($oArchive = $oProperties->GetOptionalElement('archive')) { $bEnabled = $this->GetPropBoolean($oArchive, 'enabled', false); $aClassParams['archive'] = $bEnabled; } - if ($oObsolescence = $oProperties->GetOptionalElement('obsolescence')) - { + if ($oObsolescence = $oProperties->GetOptionalElement('obsolescence')) { $sCondition = trim($this->GetPropString($oObsolescence, 'condition', '')); - if ($sCondition != "''") - { + if ($sCondition != "''") { $aClassParams['obsolescence_expression'] = $sCondition; } } - if ($oAdditionalValueForSelect = $oProperties->GetOptionalElement('complement_for_select')) - { - $oNameAttributes = $oAdditionalValueForSelect->GetUniqueElement('attributes'); - /** @var \DOMNodeList $oAttributes */ - $oAttributes = $oNameAttributes->getElementsByTagName('attribute'); - $aNameAttCodes = array(); - /** @var \MFElement $oAttribute */ - foreach($oAttributes as $oAttribute) - { - $aNameAttCodes[] = $oAttribute->getAttribute('id'); - } - if (count($aNameAttCodes) > 0) - { - // New style... - $sNameAttCode = "array('".implode("', '", $aNameAttCodes)."')"; - } - else - { - $sNameAttCode = "''"; - } - } - else - { - $sNameAttCode = "''"; - } - $aClassParams['name_complement_for_select'] = $sNameAttCode; - - if ($oUniquenessRules = $oProperties->GetOptionalElement('uniqueness_rules')) - { + if ($oUniquenessRules = $oProperties->GetOptionalElement('uniqueness_rules')) { $aUniquenessRules = array(); /** @var \MFElement $oUniquenessSingleRule */ - foreach ($oUniquenessRules->GetElementsByTagName('rule') as $oUniquenessSingleRule) - { + foreach ($oUniquenessRules->GetElementsByTagName('rule') as $oUniquenessSingleRule) { $sCurrentRuleId = $oUniquenessSingleRule->getAttribute('id'); $oAttributes = $oUniquenessSingleRule->GetUniqueElement('attributes', false); - if ($oAttributes) - { + if ($oAttributes) { $aUniquenessAttributes = array(); - foreach ($oAttributes->getElementsByTagName('attribute') as $oAttribute) - { + foreach ($oAttributes->getElementsByTagName('attribute') as $oAttribute) { $aUniquenessAttributes[] = $oAttribute->getAttribute('id'); } $aUniquenessRules[$sCurrentRuleId]['attributes'] = $aUniquenessAttributes; - } - else - { + } else { $aUniquenessRules[$sCurrentRuleId]['attributes'] = null; }