mirror of
https://github.com/Combodo/iTop.git
synced 2026-02-13 15:34:12 +01:00
205 lines
5.6 KiB
PHP
205 lines
5.6 KiB
PHP
<?php
|
|
/**
|
|
* Copyright (C) 2013-2020 Combodo SARL
|
|
*
|
|
* This file is part of iTop.
|
|
*
|
|
* iTop is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* iTop is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Affero General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License
|
|
*/
|
|
|
|
namespace Combodo\iTop\Application\UI\Layout\ActivityPanel\ActivityEntry;
|
|
|
|
|
|
use DateTime;
|
|
use Dict;
|
|
use Exception;
|
|
use MetaModel;
|
|
|
|
/**
|
|
* Class EditsEntry
|
|
*
|
|
* @author Guillaume Lajarige <guillaume.lajarige@combodo.com>
|
|
* @package Combodo\iTop\Application\UI\Layout\ActivityPanel\ActivityEntry
|
|
* @internal
|
|
* @since 2.8.0
|
|
*/
|
|
class EditsEntry extends ActivityEntry
|
|
{
|
|
// Overloaded constants
|
|
const BLOCK_CODE = 'ibo-edits-entry';
|
|
const HTML_TEMPLATE_REL_PATH = 'layouts/activity-panel/activity-entry/edits-entry';
|
|
|
|
const DEFAULT_TYPE = 'edits';
|
|
const DEFAULT_DECORATION_CLASSES = 'fas fa-fw fa-pen';
|
|
|
|
/** @var string $sObjectClass */
|
|
protected $sObjectClass;
|
|
/** @var array $aAttributes Array of edited attributes with their code, label and description */
|
|
protected $aAttributes;
|
|
|
|
/**
|
|
* EditsEntry constructor.
|
|
*
|
|
* @param \DateTime $oDateTime
|
|
* @param \User $sAuthorLogin
|
|
* @param string $sObjectClass Class of the object concerned by the edits
|
|
* @param string $sId
|
|
*
|
|
* @throws \OQLException
|
|
*/
|
|
public function __construct(DateTime $oDateTime, $sAuthorLogin, $sObjectClass, $sId = null)
|
|
{
|
|
parent::__construct($oDateTime, $sAuthorLogin, null, $sId);
|
|
|
|
$this->sObjectClass = $sObjectClass;
|
|
$this->SetAttributes([]);
|
|
}
|
|
|
|
/**
|
|
* Return the class of the object concerned by the edits
|
|
*
|
|
* @return string
|
|
*/
|
|
public function GetObjectClass()
|
|
{
|
|
return $this->sObjectClass;
|
|
}
|
|
|
|
/**
|
|
* Set all attributes at once, replacing all existing.
|
|
*
|
|
* @param array $aAttributes
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function SetAttributes($aAttributes)
|
|
{
|
|
$this->aAttributes = $aAttributes;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Return an array of edited attributes with their code, label and description
|
|
*
|
|
* @return array
|
|
*/
|
|
public function GetAttributes()
|
|
{
|
|
return $this->aAttributes;
|
|
}
|
|
|
|
/**
|
|
* Add the attribute identified by $sAttCode to the edited attribute.
|
|
* Note that if an attribute with the same $sAttCode already exists, it will be replaced.
|
|
*
|
|
* @param string $sAttCode
|
|
* @param string $sEditDescriptionAsHtml The description of the edit already in HTML, it MUSt have been sanitized first (Already in HTML because most of the time it comes from CMDBChangeOp::GetDescription())
|
|
*
|
|
* @throws \Exception
|
|
*/
|
|
public function AddAttribute($sAttCode, $sEditDescriptionAsHtml)
|
|
{
|
|
$this->aAttributes[$sAttCode] = [
|
|
'code' => $sAttCode,
|
|
'label' => MetaModel::GetLabel($this->sObjectClass, $sAttCode),
|
|
'description' => $sEditDescriptionAsHtml,
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Remove the attribute of code $sAttCode from the edited attributes.
|
|
* Note that if there is no attribute with this code, it will proceed silently.
|
|
*
|
|
* @param string $sAttCode
|
|
*
|
|
* @return array
|
|
*/
|
|
public function RemoveAttribute($sAttCode)
|
|
{
|
|
if(array_key_exists($sAttCode, $this->aAttributes))
|
|
{
|
|
unset($this->aAttributes[$sAttCode]);
|
|
}
|
|
|
|
return $this->aAttributes;
|
|
}
|
|
|
|
/**
|
|
* Merge $oEntry into the current one ($this).
|
|
* Note that edits on any existing attribute codes will be replaced.
|
|
*
|
|
* @param \Combodo\iTop\Application\UI\Layout\ActivityPanel\ActivityEntry\EditsEntry $oEntry
|
|
*
|
|
* @return $this
|
|
* @throws \Exception
|
|
*/
|
|
public function Merge(EditsEntry $oEntry)
|
|
{
|
|
if($oEntry->GetObjectClass() !== $this->GetObjectClass())
|
|
{
|
|
throw new Exception("Cannot merge an entry from {$oEntry->GetObjectClass()} into {$this->GetObjectClass()}, they must be for the same class");
|
|
}
|
|
|
|
// Merging attributes
|
|
foreach($oEntry->GetAttributes() as $sAttCode => $aAttData)
|
|
{
|
|
$this->aAttributes[$sAttCode] = $aAttData;
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Return the short description of the edits entry in HTML
|
|
*
|
|
* @return string
|
|
*/
|
|
public function GetShortDescriptionAsHtml()
|
|
{
|
|
// We need the array to be indexed by numbers instead of being associative
|
|
$aAttributesData = array_values($this->GetAttributes());
|
|
$iAttributesCount = count($aAttributesData);
|
|
switch($iAttributesCount)
|
|
{
|
|
case 0:
|
|
$sDescriptionAsHtml = '';
|
|
break;
|
|
|
|
case 1:
|
|
$sDescriptionAsHtml = $aAttributesData[0]['description'];
|
|
break;
|
|
|
|
default:
|
|
$sFirstAttLabelAsHtml = '<span class="ibo-edits-entry--attribute-label" data-attribute-code="'.$aAttributesData[0]['code'].'">'.$aAttributesData[0]['label'].'</span>';
|
|
$sSecondAttLabelAsHtml = '<span class="ibo-edits-entry--attribute-label" data-attribute-code="'.$aAttributesData[1]['code'].'">'.$aAttributesData[1]['label'].'</span>';
|
|
|
|
switch($iAttributesCount)
|
|
{
|
|
case 2:
|
|
$sDescriptionAsHtml = Dict::Format('Change:TwoAttributesChanged', $sFirstAttLabelAsHtml, $sSecondAttLabelAsHtml);
|
|
break;
|
|
|
|
case 3:
|
|
$sDescriptionAsHtml = Dict::Format('Change:ThreeAttributesChanged', $sFirstAttLabelAsHtml, $sSecondAttLabelAsHtml);
|
|
break;
|
|
|
|
default:
|
|
$sDescriptionAsHtml = Dict::Format('Change:FourOrMoreAttributesChanged', $sFirstAttLabelAsHtml, $sSecondAttLabelAsHtml, count($aAttributesData) - 2);
|
|
break;
|
|
}
|
|
}
|
|
|
|
return $sDescriptionAsHtml;
|
|
}
|
|
} |