Explorar el Código

Support edition of the "latest modified" entry of a case log

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@2155 a333f486-631f-4898-b8df-5754b55c2be0
dflaven hace 13 años
padre
commit
5df003ed4e
Se han modificado 2 ficheros con 94 adiciones y 25 borrados
  1. 10 1
      core/attributedef.class.inc.php
  2. 84 24
      core/ormcaselog.class.inc.php

+ 10 - 1
core/attributedef.class.inc.php

@@ -1724,7 +1724,16 @@ class AttributeCaseLog extends AttributeLongText
 		return $value;
 	}
 	public function GetEditClass() {return "CaseLog";}
-	public function GetEditValue($sValue, $oHostObj = null) { return ''; } // New 'edit' value is always blank since it will be appended to the existing log	
+
+	public function GetEditValue($sValue, $oHostObj = null)
+	{
+		if (!($sValue instanceOf ormCaseLog))
+		{
+			return '';
+		}
+		return $sValue->GetModifiedEntry();
+	}
+	
 	public function GetDefaultValue() {return new ormCaseLog();}
 	public function Equals($val1, $val2) {return ($val1->GetText() == $val2->GetText());}
 	

+ 84 - 24
core/ormcaselog.class.inc.php

@@ -1,5 +1,5 @@
 <?php
-// Copyright (C) 2011 Combodo SARL
+// Copyright (C) 2011-2012 Combodo SARL
 //
 //   This program is free software; you can redistribute it and/or modify
 //   it under the terms of the GNU General Public License as published by
@@ -26,6 +26,7 @@ define('CASELOG_SEPARATOR', "\n".'========== %1$s : %2$s (%3$d) ============'."\
 class ormCaseLog {
 	protected $m_sLog;
 	protected $m_aIndex;
+	protected $m_bModified;
 	
 	/**
 	 * Initializes the log with the first (initial) entry
@@ -36,6 +37,7 @@ class ormCaseLog {
 	{
 		$this->m_sLog = $sLog;
 		$this->m_aIndex = $aIndex;
+		$this->m_bModified = false;
 	}
 	
 	public function GetText()
@@ -53,13 +55,25 @@ class ormCaseLog {
 		return $this->m_sLog;
 	}
 	
+	public function ClearModifiedFlag()
+	{
+		$this->m_bModified = false;
+	}
+	
 	public function GetAsHTML(WebPage $oP = null, $bEditMode = false, $aTransfoHandler = null)
 	{
 		$sHtml = '<table style="width:100%;table-layout:fixed"><tr><td>'; // Use table-layout:fixed to force the with to be independent from the actual content
 		$iPos = 0;
-		for($index=count($this->m_aIndex)-1 ; $index >= 0 ; $index--)
+		$aIndex = $this->m_aIndex;
+		if (($bEditMode) && (count($aIndex) > 0) && $this->m_bModified)
 		{
-			if ($index < count($this->m_aIndex) - CASELOG_VISIBLE_ITEMS)
+			// Don't display the first element, that is still considered as editable
+			$iPos = $aIndex[0]['separator_length'] + $aIndex[0]['separator_length'];
+			array_shift($aIndex); 
+		}
+		for($index=count($aIndex)-1 ; $index >= 0 ; $index--)
+		{
+			if ($index < count($aIndex) - CASELOG_VISIBLE_ITEMS)
 			{
 				$sOpen = '';
 				$sDisplay = 'style="display:none;"';
@@ -69,31 +83,31 @@ class ormCaseLog {
 				$sOpen = ' open';
 				$sDisplay = '';
 			}
-			$iPos += $this->m_aIndex[$index]['separator_length'];
-			$sTextEntry = substr($this->m_sLog, $iPos, $this->m_aIndex[$index]['text_length']);
+			$iPos += $aIndex[$index]['separator_length'];
+			$sTextEntry = substr($this->m_sLog, $iPos, $aIndex[$index]['text_length']);
 			$sTextEntry = str_replace(array("\r\n", "\n", "\r"), "<br/>", htmlentities($sTextEntry, ENT_QUOTES, 'UTF-8'));
 			if (!is_null($aTransfoHandler))
 			{
 				$sTextEntry = call_user_func($aTransfoHandler, $sTextEntry);
 			}
-			$iPos += $this->m_aIndex[$index]['text_length'];
+			$iPos += $aIndex[$index]['text_length'];
 
 			$sEntry = '<div class="caselog_header'.$sOpen.'">';
 			// Workaround: PHP < 5.3 cannot unserialize correctly DateTime objects,
 			// therefore we have changed the format. To preserve the compatibility with existing
 			// installations of iTop, both format are allowed:
 			//     the 'date' item is either a DateTime object, or a unix timestamp
-			if (is_int($this->m_aIndex[$index]['date']))
+			if (is_int($aIndex[$index]['date']))
 			{
 				// Unix timestamp
-				$sDate = date(Dict::S('UI:CaseLog:DateFormat'), $this->m_aIndex[$index]['date']);
+				$sDate = date(Dict::S('UI:CaseLog:DateFormat'),$aIndex[$index]['date']);
 			}
-			elseif (is_object($this->m_aIndex[$index]['date']))
+			elseif (is_object($aIndex[$index]['date']))
 			{
 				if (version_compare(phpversion(), '5.3.0', '>='))
 				{
 					// DateTime
-					$sDate = $this->m_aIndex[$index]['date']->format(Dict::S('UI:CaseLog:DateFormat'));
+					$sDate = $aIndex[$index]['date']->format(Dict::S('UI:CaseLog:DateFormat'));
 				}
 				else
 				{
@@ -101,7 +115,7 @@ class ormCaseLog {
 					$sDate = '';
 				}
 			}
-			$sEntry .= sprintf(Dict::S('UI:CaseLog:Header_Date_UserName'), $sDate, $this->m_aIndex[$index]['user_name']);
+			$sEntry .= sprintf(Dict::S('UI:CaseLog:Header_Date_UserName'), $sDate, $aIndex[$index]['user_name']);
 			$sEntry .= '</div>';
 			$sEntry .= '<div class="caselog_entry"'.$sDisplay.'>';
 			$sEntry .= $sTextEntry;
@@ -150,11 +164,13 @@ class ormCaseLog {
 	}
 	
 	/**
-	 * Add a new entry to the log and updates the internal index
+	 * Add a new entry to the log or merge the given text into the currently modified entry 
+	 * and updates the internal index
 	 * @param $sText string The text of the new entry 
 	 */
 	public function AddLogEntry($sText, $sOnBehalfOf = '')
 	{
+		$bMergeEntries = false;
 		$sDate = date(Dict::S('UI:CaseLog:DateFormat'));
 		if ($sOnBehalfOf == '')
 		{
@@ -165,17 +181,61 @@ class ormCaseLog {
 		{
 			$iUserId = null;
 		}
-		$sSeparator = sprintf(CASELOG_SEPARATOR, $sDate, $sOnBehalfOf, $iUserId);
-		$iSepLength = strlen($sSeparator);
-		$iTextlength = strlen($sText);
-		$this->m_sLog = $sSeparator.$sText.$this->m_sLog; // Latest entry printed first
-		$this->m_aIndex[] = array(
-			'user_name' => $sOnBehalfOf,	
-			'user_id' => $iUserId,	
-			'date' => time(),	
-			'text_length' => $iTextlength,	
-			'separator_length' => $iSepLength,	
-		);
+		if ($this->m_bModified)
+		{
+			$aLatestEntry = end($this->m_aIndex);
+			if ($aLatestEntry['user_name'] != $sOnBehalfOf)
+			{
+				$bMergeEntries = false;
+			}
+			else
+			{
+				$bMergeEntries = true;
+			}
+		}
+		
+		if ($bMergeEntries)
+		{
+			$aLatestEntry = end($this->m_aIndex);
+			$this->m_sLog = substr($this->m_sLog, $aLatestEntry['separator_length']);
+			$sSeparator = sprintf(CASELOG_SEPARATOR, $sDate, $sOnBehalfOf, $iUserId);
+			$iSepLength = strlen($sSeparator);
+			$iTextlength = strlen($sText."\n");
+			$this->m_sLog = $sSeparator.$sText.$this->m_sLog; // Latest entry printed first
+			$this->m_aIndex[] = array(
+				'user_name' => $sOnBehalfOf,	
+				'user_id' => $iUserId,	
+				'date' => time(),	
+				'text_length' => $aLatestEntry['text_length'] + $iTextlength,	
+				'separator_length' => $iSepLength,	
+			);
+			
+		}
+		else
+		{
+			$sSeparator = sprintf(CASELOG_SEPARATOR, $sDate, $sOnBehalfOf, $iUserId);
+			$iSepLength = strlen($sSeparator);
+			$iTextlength = strlen($sText);
+			$this->m_sLog = $sSeparator.$sText.$this->m_sLog; // Latest entry printed first
+			$this->m_aIndex[] = array(
+				'user_name' => $sOnBehalfOf,	
+				'user_id' => $iUserId,	
+				'date' => time(),	
+				'text_length' => $iTextlength,	
+				'separator_length' => $iSepLength,	
+			);
+		}
+		$this->m_bModified = true;
+	}
+	
+	public function GetModifiedEntry()
+	{
+		$sModifiedEntry = '';
+		if ($this->m_bModified)
+		{
+			$sModifiedEntry = $this->GetLatestEntry();
+		}
+		return $sModifiedEntry;
 	}
 
 	/**
@@ -200,4 +260,4 @@ class ormCaseLog {
 		return $iLast;
 	}
 }
-?>
+?>