diff --git a/application/displayblock.class.inc.php b/application/displayblock.class.inc.php index 4114ead00..76a433470 100644 --- a/application/displayblock.class.inc.php +++ b/application/displayblock.class.inc.php @@ -307,7 +307,7 @@ class DisplayBlock } } } - + public function GetFilter() { return $this->m_oFilter; @@ -1579,6 +1579,8 @@ JS $iTotalCount = 0; $aURLs = array(); + $iMaxNbCharsInLabel = 0; + foreach ($aRes as $iRow => $aRow) { $sValue = $aRow['grouped_by_1']; $sHtmlValue = $oGroupByExp->MakeValueLabel($this->m_oFilter, $sValue, $sValue); @@ -1589,6 +1591,10 @@ JS 'value' => (float)$aRow[$sFctVar], ); + if ($iMaxNbCharsInLabel < mb_strlen($sValue)) { + $iMaxNbCharsInLabel = mb_strlen($sValue); + } + // Build the search for this subset $oSubsetSearch = $this->m_oFilter->DeepClone(); $oCondition = new BinaryExpression($oGroupByExp, '=', new ScalarExpression($sValue)); diff --git a/core/config.class.inc.php b/core/config.class.inc.php index e1e0fcf57..0a2fb3d64 100644 --- a/core/config.class.inc.php +++ b/core/config.class.inc.php @@ -512,6 +512,14 @@ class Config 'source_of_value' => '', 'show_in_conf_sample' => true, ], + 'link_set_max_edit_ext_key' => [ + 'type' => 'integer', + 'description' => 'Maximum number of items in the link that allow editing the remote external key. Above that limit, remote external key cannot be edited. Mind that setting this limit too high can have a negative impact on performances.', + 'default' => 50, + 'value' => 50, + 'source_of_value' => '', + 'show_in_conf_sample' => true, + ], 'tag_set_item_separator' => [ 'type' => 'string', 'description' => 'Tag set from string: tag label separator', diff --git a/css/backoffice/pages/_attachments.scss b/css/backoffice/pages/_attachments.scss index 66289fa2e..ff4ec9163 100644 --- a/css/backoffice/pages/_attachments.scss +++ b/css/backoffice/pages/_attachments.scss @@ -6,10 +6,6 @@ $ibo-attachment--datatable--icon-preview--max-height: 44px !default; $ibo-attachment--datatable--icon-preview--max-width: $ibo-attachment--datatable--icon-preview--max-height !default; -$ibo-attachment--datatable--line-height: $ibo-attachment--datatable--icon-preview--max-height !default; - -$ibo-attachment--datatable--first-column--line-height: 0px !default; - $ibo-attachment--drag-in--border: 2px $ibo-color-grey-400 dashed !default; $ibo-attachment--upload-file--drop-zone-hint--max-height: 200px !default; $ibo-attachment--upload-file--drop-zone-hint--margin: 22px $ibo-spacing-0 !default; @@ -33,10 +29,7 @@ $ibo-attachment--tab-header--drop-in--icon--color: $ibo-color-blue-600 !default; max-width: $ibo-attachment--datatable--icon-preview--max-width; } .ibo-attachment--datatable tbody tr td { - line-height: $ibo-attachment--datatable--line-height; -} -.ibo-attachment--datatable tbody tr td:nth-child(1){ - line-height: $ibo-attachment--datatable--first-column--line-height; + vertical-align: middle; } .ibo-attachment--upload-file--drop-zone-hint{ diff --git a/sources/Application/UI/Links/Indirect/BlockIndirectLinkSetEditTable.php b/sources/Application/UI/Links/Indirect/BlockIndirectLinkSetEditTable.php index 0ecaec819..69c7cafe6 100644 --- a/sources/Application/UI/Links/Indirect/BlockIndirectLinkSetEditTable.php +++ b/sources/Application/UI/Links/Indirect/BlockIndirectLinkSetEditTable.php @@ -7,6 +7,7 @@ namespace Combodo\iTop\Application\UI\Links\Indirect; use AttributeLinkedSetIndirect; +use cmdbAbstractObject; use Combodo\iTop\Application\UI\Base\Component\Alert\AlertUIBlockFactory; use Combodo\iTop\Application\UI\Base\Component\Button\ButtonUIBlockFactory; use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableUIBlockFactory; @@ -134,6 +135,7 @@ class BlockIndirectLinkSetEditTable extends UIContentBlock { $this->sWizHelper = 'oWizardHelper'.$sFormPrefix; $oValue->Rewind(); + $bAllowRemoteExtKeyEdit = $oValue->Count() <= utils::GetConfig()->Get('link_set_max_edit_ext_key'); $aForm = array(); $iMaxAddedId = 0; $iAddedId = -1; // Unique id for new links @@ -158,7 +160,7 @@ class BlockIndirectLinkSetEditTable extends UIContentBlock } $iMaxAddedId = max($iMaxAddedId, $key); - $aForm[$key] = $this->GetFormRow($oPage, $oLinkedObj, $oCurrentLink, $aArgs, $oCurrentObj, $key, $bReadOnly); + $aForm[$key] = $this->GetFormRow($oPage, $oLinkedObj, $oCurrentLink, $aArgs, $oCurrentObj, $key, $bReadOnly, $bAllowRemoteExtKeyEdit); } } $this->iMaxAddedId = (int)$iMaxAddedId; @@ -215,15 +217,17 @@ class BlockIndirectLinkSetEditTable extends UIContentBlock * @param array $aArgs Extra context arguments * @param DBObject $oCurrentObj The object to which all the elements of the linked set refer to * @param int $iUniqueId A unique identifier of new links - * @param boolean $bReadOnly Display link as editable or read-only. Default is false (editable) + * @param bool $bReadOnly Display link as editable or read-only. Default is false (editable) + * @param bool $bAllowRemoteExtKeyEdit If true, the ext. key to the remote object can be edited, otherwise it will be read-only * * @return array The HTML fragment of the one-row form * @throws \ArchivedObjectException * @throws \CoreException * @throws \CoreUnexpectedValue * @throws \Exception + * @since 3.1.0 3.0.4 3.0.3-1 N°6124 - Workaround performance problem on the modification of an object with an n:n relation having a large volume */ - public function GetFormRow(WebPage $oP, DBObject $oLinkedObj, $linkObjOrId, $aArgs, $oCurrentObj, $iUniqueId, $bReadOnly = false) + public function GetFormRow(WebPage $oP, DBObject $oLinkedObj, $linkObjOrId, $aArgs, $oCurrentObj, $iUniqueId, $bReadOnly = false, $bAllowRemoteExtKeyEdit = true) { $sPrefix = "{$this->oUILinksWidget->GetAttCode()}{$this->oUILinksWidget->GetNameSuffix()}"; $aRow = array(); @@ -248,8 +252,11 @@ class BlockIndirectLinkSetEditTable extends UIContentBlock } else { $aRow['form::checkbox'] = "oUILinksWidget->GetInputId()}.OnSelectChange();\" value=\"$iKey\">"; foreach ($this->oUILinksWidget->GetEditableFields() as $sFieldCode) { + // N°6124 - Force remote ext. key as read-only if too many items in the linkset + $bReadOnlyField = ($sFieldCode === $this->oUILinksWidget->GetExternalKeyToRemote()) && (false === $bAllowRemoteExtKeyEdit); + $sSafeFieldId = $this->GetFieldId($linkObjOrId->GetKey(), $sFieldCode); - $this->AddRowForFieldCode($aRow, $sFieldCode, $aArgs, $linkObjOrId, $oP, $sNameSuffix, $sSafeFieldId); + $this->AddRowForFieldCode($aRow, $sFieldCode, $aArgs, $linkObjOrId, $oP, $sNameSuffix, $sSafeFieldId, $bReadOnlyField); $aFieldsMap[$sFieldCode] = $sSafeFieldId; } } @@ -352,10 +359,23 @@ JS return $aRow; } - private function AddRowForFieldCode(&$aRow, $sFieldCode, &$aArgs, $oLnk, $oP, $sNameSuffix, $sSafeFieldId): void + /** + * @param $aRow + * @param $sFieldCode + * @param $aArgs + * @param $oLnk + * @param $oP + * @param $sNameSuffix + * @param $sSafeFieldId + * @param bool $bReadOnlyField If true, the field will be read-only, otherwise it can be edited + * + * @return void + * @since 3.1.0 3.0.4 3.0.3-1 N°6124 - Workaround performance problem on the modification of an object with an n:n relation having a large volume + */ + private function AddRowForFieldCode(&$aRow, $sFieldCode, &$aArgs, $oLnk, $oP, $sNameSuffix, $sSafeFieldId, $bReadOnlyField = false): void { if (($sFieldCode === $this->oUILinksWidget->GetExternalKeyToRemote())) { - // current field is the lnk extkey to the remote class + // Current field is the lnk extkey to the remote class $aArgs['replaceDependenciesByRemoteClassFields'] = true; $sRowFieldCode = 'static::key'; $aArgs['wizHelperRemote'] = $aArgs['wizHelper'].'_remote'; @@ -375,20 +395,31 @@ JS $sDisplayValue = $oLnk->GetEditValue($sFieldCode); $oAttDef = MetaModel::GetAttributeDef($this->oUILinksWidget->GetLinkedClass(), $sFieldCode); - $aRow[$sRowFieldCode] = '
' - .\cmdbAbstractObject::GetFormElementForField( - $oP, - $this->oUILinksWidget->GetLinkedClass(), - $sFieldCode, - $oAttDef, - $sValue, - $sDisplayValue, - $sSafeFieldId, - $sNameSuffix, - 0, - $aArgs - ) - .'
'; + if ($bReadOnlyField) { + $sFieldForHtml = $sDisplayValue; + } else { + $sFieldForHtml = cmdbAbstractObject::GetFormElementForField( + $oP, + $this->oUILinksWidget->GetLinkedClass(), + $sFieldCode, + $oAttDef, + $sValue, + $sDisplayValue, + $sSafeFieldId, + $sNameSuffix, + 0, + $aArgs + ); + } + + $aRow[$sRowFieldCode] = << +
+
$sFieldForHtml
+
+ +HTML + ; } private function GetFieldId($iLnkId, $sFieldCode, $bSafe = true)