mirror of
https://github.com/Combodo/iTop.git
synced 2026-04-24 11:08:45 +02:00
Merge remote-tracking branch 'origin/support/3.1' into support/3.2
This commit is contained in:
@@ -72,15 +72,16 @@ class UIHTMLEditorWidget
|
|||||||
// To change the default settings of the editor,
|
// To change the default settings of the editor,
|
||||||
// a) edit the file /js/ckeditor/config.js
|
// a) edit the file /js/ckeditor/config.js
|
||||||
// b) or override some of the configuration settings, using the second parameter of ckeditor()
|
// b) or override some of the configuration settings, using the second parameter of ckeditor()
|
||||||
|
$sJSDefineWidth = '';
|
||||||
$aConfig = utils::GetCkeditorPref();
|
$aConfig = utils::GetCkeditorPref();
|
||||||
$sWidthSpec = addslashes(trim($this->m_oAttDef->GetWidth()));
|
$sWidthSpec = addslashes(trim($this->m_oAttDef->GetWidth()));
|
||||||
if ($sWidthSpec != '')
|
if ($sWidthSpec != '') {
|
||||||
{
|
/*N°6543 - the function min allow to keep text inside the column when width is defined*/
|
||||||
$aConfig['width'] = $sWidthSpec;
|
$aConfig['width'] = "min($sWidthSpec,100%)";
|
||||||
|
$sJSDefineWidth = '$("#cke_'.$iId.' iframe").contents().find("body").css("width", "'.$sWidthSpec.'")';
|
||||||
}
|
}
|
||||||
$sHeightSpec = addslashes(trim($this->m_oAttDef->GetHeight()));
|
$sHeightSpec = addslashes(trim($this->m_oAttDef->GetHeight()));
|
||||||
if ($sHeightSpec != '')
|
if ($sHeightSpec != '') {
|
||||||
{
|
|
||||||
$aConfig['height'] = $sHeightSpec;
|
$aConfig['height'] = $sHeightSpec;
|
||||||
}
|
}
|
||||||
$sConfigJS = json_encode($aConfig);
|
$sConfigJS = json_encode($aConfig);
|
||||||
@@ -111,6 +112,7 @@ $('#$iId').on('update', function(evt){
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
oMe.data('ckeditorInstance').setReadOnly(oMe.prop('disabled'));
|
oMe.data('ckeditorInstance').setReadOnly(oMe.prop('disabled'));
|
||||||
|
$sJSDefineWidth
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
setTimeout(delayedSetReadOnly, 50);
|
setTimeout(delayedSetReadOnly, 50);
|
||||||
|
|||||||
@@ -4535,7 +4535,6 @@ class AttributeText extends AttributeString
|
|||||||
$sStyle = '';
|
$sStyle = '';
|
||||||
if (count($aStyles) > 0)
|
if (count($aStyles) > 0)
|
||||||
{
|
{
|
||||||
$aStyles[] = 'overflow:auto';
|
|
||||||
$sStyle = 'style="'.implode(';', $aStyles).'"';
|
$sStyle = 'style="'.implode(';', $aStyles).'"';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -335,7 +335,7 @@ abstract class CMDBObject extends DBObject
|
|||||||
$oMyChangeOp->Set("objclass", MetaModel::GetRootClass(get_class($this)));
|
$oMyChangeOp->Set("objclass", MetaModel::GetRootClass(get_class($this)));
|
||||||
$oMyChangeOp->Set("objkey", $objkey);
|
$oMyChangeOp->Set("objkey", $objkey);
|
||||||
$oMyChangeOp->Set("fclass", get_class($this));
|
$oMyChangeOp->Set("fclass", get_class($this));
|
||||||
$oMyChangeOp->Set("fname", substr($this->GetRawName(), 0, 255)); // Protect against very long friendly names
|
$oMyChangeOp->SetTrim("fname", $this->GetRawName()); // Protect against very long friendly names
|
||||||
$iId = $oMyChangeOp->DBInsertNoReload();
|
$iId = $oMyChangeOp->DBInsertNoReload();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -80,16 +80,29 @@ $ibo-field--enable-bulk--checkbox--margin-left: $ibo-spacing-300 !default;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*N°6543 - We need the rule to keep text inside the column when width is defined*/
|
||||||
|
&[data-attribute-type="AttributeHtml"],
|
||||||
|
&[data-attribute-type="AttributeText"] {
|
||||||
|
&[data-attribute-flag-read-only="true"] {
|
||||||
|
display: grid;
|
||||||
|
|
||||||
|
> .ibo-field--value {
|
||||||
|
max-width: 100%;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Large field = Label on top, value below */
|
/* Large field = Label on top, value below */
|
||||||
.ibo-field-large {
|
.ibo-field-large {
|
||||||
display: block;
|
display: block;
|
||||||
|
|
||||||
.ibo-field--label {
|
.ibo-field--label {
|
||||||
position: relative; /* Necessary for fullscreen toggler */
|
position: relative; /* Necessary for fullscreen toggler */
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
max-width: initial;
|
max-width: initial;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,6 +123,13 @@ $ibo-fieldsorter--selected--background-color: $ibo-color-blue-200 !default;
|
|||||||
.ibo-datatable--row-actions-toolbar{
|
.ibo-datatable--row-actions-toolbar{
|
||||||
justify-content: end;
|
justify-content: end;
|
||||||
}
|
}
|
||||||
|
/* N°6543 - We need the rule to keep text inside the column when width is defined */
|
||||||
|
> [data-attribute-type="AttributeHtml"],
|
||||||
|
> [data-attribute-type="AttributeText"] {
|
||||||
|
max-width: 100%;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -269,16 +269,15 @@
|
|||||||
<description>An attachment has been added to an object</description>
|
<description>An attachment has been added to an object</description>
|
||||||
<replaces>Attachment::AfterUpdate</replaces>
|
<replaces>Attachment::AfterUpdate</replaces>
|
||||||
<sources>
|
<sources>
|
||||||
<source id="Attachment">Attachment</source>
|
|
||||||
<source id="cmdbAbstractObject">cmdbAbstractObject</source>
|
<source id="cmdbAbstractObject">cmdbAbstractObject</source>
|
||||||
</sources>
|
</sources>
|
||||||
<event_data>
|
<event_data>
|
||||||
<event_datum id="object">
|
<event_datum id="object">
|
||||||
<description>The attachment updated</description>
|
<description>The object where the attachment is added</description>
|
||||||
<type>DBObject</type>
|
<type>DBObject</type>
|
||||||
</event_datum>
|
</event_datum>
|
||||||
<event_datum id="target_object">
|
<event_datum id="attachment">
|
||||||
<description>The object to which the attachment is linked</description>
|
<description>The attachment added to the objet</description>
|
||||||
<type>DBObject</type>
|
<type>DBObject</type>
|
||||||
</event_datum>
|
</event_datum>
|
||||||
<event_datum id="debug_info">
|
<event_datum id="debug_info">
|
||||||
@@ -291,16 +290,15 @@
|
|||||||
<description>An attachment has been removed from an object</description>
|
<description>An attachment has been removed from an object</description>
|
||||||
<replaces>Attachment::AfterUpdate</replaces>
|
<replaces>Attachment::AfterUpdate</replaces>
|
||||||
<sources>
|
<sources>
|
||||||
<source id="Attachment">Attachment</source>
|
|
||||||
<source id="cmdbAbstractObject">cmdbAbstractObject</source>
|
<source id="cmdbAbstractObject">cmdbAbstractObject</source>
|
||||||
</sources>
|
</sources>
|
||||||
<event_data>
|
<event_data>
|
||||||
<event_datum id="object">
|
<event_datum id="object">
|
||||||
<description>The attachment updated</description>
|
<description>The object where the attachment is removed</description>
|
||||||
<type>DBObject</type>
|
<type>DBObject</type>
|
||||||
</event_datum>
|
</event_datum>
|
||||||
<event_datum id="target_object">
|
<event_datum id="attachment">
|
||||||
<description>The object to which the attachment is linked</description>
|
<description>The attachment removed</description>
|
||||||
<type>DBObject</type>
|
<type>DBObject</type>
|
||||||
</event_datum>
|
</event_datum>
|
||||||
<event_datum id="debug_info">
|
<event_datum id="debug_info">
|
||||||
|
|||||||
@@ -264,7 +264,6 @@ class AttachmentPlugIn implements iApplicationUIExtension, iApplicationObjectExt
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
$oAttachmentsRenderer->RenderViewAttachmentsList();
|
$oAttachmentsRenderer->RenderViewAttachmentsList();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -293,8 +292,8 @@ class AttachmentPlugIn implements iApplicationUIExtension, iApplicationObjectExt
|
|||||||
// Remove attachments that are no longer attached to the current object
|
// Remove attachments that are no longer attached to the current object
|
||||||
if (in_array($oAttachment->GetKey(), $aRemovedAttachmentIds))
|
if (in_array($oAttachment->GetKey(), $aRemovedAttachmentIds))
|
||||||
{
|
{
|
||||||
$aData = ['target_object' => $oObject];
|
$aData = ['attachment' => $oAttachment];
|
||||||
$oAttachment->FireEvent(EVENT_REMOVE_ATTACHMENT_FROM_OBJECT, $aData);
|
$oObject->FireEvent(EVENT_REMOVE_ATTACHMENT_FROM_OBJECT, $aData);
|
||||||
$oAttachment->DBDelete();
|
$oAttachment->DBDelete();
|
||||||
$aActions[] = self::GetActionChangeOp($oAttachment, false /* false => deletion */);
|
$aActions[] = self::GetActionChangeOp($oAttachment, false /* false => deletion */);
|
||||||
}
|
}
|
||||||
@@ -322,8 +321,8 @@ class AttachmentPlugIn implements iApplicationUIExtension, iApplicationObjectExt
|
|||||||
$oAttachment->DBUpdate();
|
$oAttachment->DBUpdate();
|
||||||
// temporary attachment confirmed, list it in the history
|
// temporary attachment confirmed, list it in the history
|
||||||
$aActions[] = self::GetActionChangeOp($oAttachment, true /* true => creation */);
|
$aActions[] = self::GetActionChangeOp($oAttachment, true /* true => creation */);
|
||||||
$aData = ['target_object' => $oObject];
|
$aData = ['attachment' => $oAttachment];
|
||||||
$oAttachment->FireEvent(EVENT_ADD_ATTACHMENT_TO_OBJECT, $aData);
|
$oObject->FireEvent(EVENT_ADD_ATTACHMENT_TO_OBJECT, $aData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (count($aActions) > 0)
|
if (count($aActions) > 0)
|
||||||
|
|||||||
@@ -23,16 +23,16 @@
|
|||||||
{% if aAction.confirmation is defined %}
|
{% if aAction.confirmation is defined %}
|
||||||
|
|
||||||
// Prepare confirmation title
|
// Prepare confirmation title
|
||||||
let sTitle = '{{ 'UI:Datatables:RowActions:ConfirmationDialog'|dict_s }}';
|
let sTitle = `{{ 'UI:Datatables:RowActions:ConfirmationDialog'|dict_s|escape('js') }}`;
|
||||||
{% if aAction.confirmation.title is defined %}
|
{% if aAction.confirmation.title is defined %}
|
||||||
sTitle = '{{ aAction.confirmation.title|dict_s }}';
|
sTitle = `{{ aAction.confirmation.title|dict_s|escape('js') }}`;
|
||||||
{% endif %}
|
{% endif %}
|
||||||
sTitle = sTitle.replaceAll('{item}', aRowData['{{ aAction.confirmation.row_data }}']);
|
sTitle = sTitle.replaceAll('{item}', aRowData['{{ aAction.confirmation.row_data }}']);
|
||||||
|
|
||||||
// Prepare confirmation message
|
// Prepare confirmation message
|
||||||
let sMessage = '{{ 'UI:Datatables:RowActions:ConfirmationMessage'|dict_s }}';
|
let sMessage = `{{ 'UI:Datatables:RowActions:ConfirmationMessage'|dict_s|escape('js') }}`;
|
||||||
{% if aAction.confirmation.message is defined %}
|
{% if aAction.confirmation.message is defined %}
|
||||||
sMessage = '{{ aAction.confirmation.message|dict_s }}';
|
sMessage = `{{ aAction.confirmation.message|dict_s|escape('js') }}`;
|
||||||
{% endif %}
|
{% endif %}
|
||||||
sMessage = sMessage.replaceAll('{item}', aRowData['{{ aAction.confirmation.row_data }}']);
|
sMessage = sMessage.replaceAll('{item}', aRowData['{{ aAction.confirmation.row_data }}']);
|
||||||
|
|
||||||
|
|||||||
@@ -5,9 +5,11 @@ namespace Combodo\iTop\Test\UnitTest\Core;
|
|||||||
|
|
||||||
use CMDBObject;
|
use CMDBObject;
|
||||||
use Combodo\iTop\Test\UnitTest\ItopDataTestCase;
|
use Combodo\iTop\Test\UnitTest\ItopDataTestCase;
|
||||||
|
use CoreException;
|
||||||
use Exception;
|
use Exception;
|
||||||
use MetaModel;
|
use MetaModel;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 2.7.7 3.0.2 3.1.0 N°3717 tests history objects creation
|
* @since 2.7.7 3.0.2 3.1.0 N°3717 tests history objects creation
|
||||||
*
|
*
|
||||||
@@ -168,6 +170,53 @@ class CMDBObjectTest extends ItopDataTestCase
|
|||||||
CMDBObject::SetTrackInfo($sInitialTrackInfo);
|
CMDBObject::SetTrackInfo($sInitialTrackInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data provider for test deletion
|
||||||
|
* N°5547 - Object deletion fails if friendlyname too long
|
||||||
|
*
|
||||||
|
* @return array data
|
||||||
|
*/
|
||||||
|
public function RecordObjDeletionProvider()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'friendlyname longer than 255 characters which will be truncated on a multi-bytes characters' => [
|
||||||
|
str_repeat('e', 250),
|
||||||
|
'😁😂🤣😃😄😅😆😗🥰😘😍😎😋😊😉😙😚',
|
||||||
|
],
|
||||||
|
'friendlyname longer than 255 characters which will be truncated after a single byte characters' => [
|
||||||
|
'😁😂🤣😃😄😅😆😗🥰😘😍😎😋😊😉😙😚',
|
||||||
|
str_repeat('e', 250),
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* N°5547 - Object deletion fails if friendlyname too long
|
||||||
|
*
|
||||||
|
* @dataProvider RecordObjDeletionProvider
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function testRecordObjDeletion( string $sFirstName, string $sName)
|
||||||
|
{
|
||||||
|
$oPerson = MetaModel::NewObject('Person', [
|
||||||
|
'first_name' => $sFirstName,
|
||||||
|
'name' => $sName,
|
||||||
|
'org_id' => 1,
|
||||||
|
]);
|
||||||
|
$oPerson->DBWrite();
|
||||||
|
|
||||||
|
$bDeletionOK = true;
|
||||||
|
try {
|
||||||
|
$oDeletionPlan = $this->InvokeNonPublicMethod(CMDBObject::class, 'RecordObjDeletion', $oPerson, [$oPerson->GetKey()]);
|
||||||
|
}
|
||||||
|
catch (CoreException $e) {
|
||||||
|
$bDeletionOK = false;
|
||||||
|
}
|
||||||
|
// We don't need to test the result (truncated string), it's already done in \DBObject::SetTrim() with N°3448
|
||||||
|
$this->assertTrue($bDeletionOK);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private function ReplaceByFriendlyNames($sMessage, $oAdminUser, $oImpersonatedUser) : string {
|
private function ReplaceByFriendlyNames($sMessage, $oAdminUser, $oImpersonatedUser) : string {
|
||||||
$sNewMessage = str_replace('AdminSurName AdminName', $oAdminUser->GetFriendlyName(), $sMessage);
|
$sNewMessage = str_replace('AdminSurName AdminName', $oAdminUser->GetFriendlyName(), $sMessage);
|
||||||
$sNewMessage = str_replace('ImpersonatedSurName ImpersonatedName', $oImpersonatedUser->GetFriendlyName(), $sNewMessage);
|
$sNewMessage = str_replace('ImpersonatedSurName ImpersonatedName', $oImpersonatedUser->GetFriendlyName(), $sNewMessage);
|
||||||
|
|||||||
@@ -1133,6 +1133,54 @@ class DBObjectTest extends ItopDataTestCase
|
|||||||
return $oPerson;
|
return $oPerson;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data provider for test deletion
|
||||||
|
* N°5547 - Object deletion fails if friendlyname too long
|
||||||
|
*
|
||||||
|
* @return array data
|
||||||
|
*/
|
||||||
|
public function getDeletionLongValueProvider()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'friendlyname longer than 255 chracters with smiley' => [
|
||||||
|
'0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789-ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopq',
|
||||||
|
'😁😂🤣😃😄😅😆😗🥰😘😍😎😋😊😉😙😚',
|
||||||
|
],
|
||||||
|
'the same friendlyname in other order with error before fix 5547 ' => [
|
||||||
|
'😁😂🤣😃😄😅😆😗🥰😘😍😎😋😊😉😙😚',
|
||||||
|
'0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789-ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopq',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* N°5547 - Object deletion fails if friendlyname too long
|
||||||
|
*
|
||||||
|
* @covers DBObject::DBIncrement
|
||||||
|
*
|
||||||
|
* @dataProvider getDeletionLongValueProvider
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function testDeletionLongValue(string $sName, string $sFirstName)
|
||||||
|
{
|
||||||
|
// Create a UserRequest with 2 contacts
|
||||||
|
$oPerson = MetaModel::NewObject('Person', [
|
||||||
|
'name' => $sName,
|
||||||
|
'first_name' => $sFirstName,
|
||||||
|
'org_id' => 1,
|
||||||
|
]);
|
||||||
|
$oPerson->DBWrite();
|
||||||
|
|
||||||
|
$bDeletionOK = true;
|
||||||
|
try {
|
||||||
|
$oDeletionPlan = $oPerson->DBDelete();
|
||||||
|
}
|
||||||
|
catch (CoreException $e) {
|
||||||
|
$bDeletionOK = false;
|
||||||
|
}
|
||||||
|
$this->assertTrue($bDeletionOK);
|
||||||
|
}
|
||||||
|
|
||||||
public function ResetReloadCount()
|
public function ResetReloadCount()
|
||||||
{
|
{
|
||||||
$this->aReloadCount = [];
|
$this->aReloadCount = [];
|
||||||
@@ -1211,8 +1259,14 @@ class DBObjectTest extends ItopDataTestCase
|
|||||||
$fTotalDuration = microtime(true) - $fStart;
|
$fTotalDuration = microtime(true) - $fStart;
|
||||||
echo 'Total duration: '.sprintf('%.3f s', $fTotalDuration)."\n\n";
|
echo 'Total duration: '.sprintf('%.3f s', $fTotalDuration)."\n\n";
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
public function CheckLongValueInAttributeProvider() {
|
* Data provider for test deletion
|
||||||
|
* N°5547 - Object deletion fails if friendlyname too long
|
||||||
|
*
|
||||||
|
* @return array data
|
||||||
|
*/
|
||||||
|
public function DeletionLongValueProvider()
|
||||||
|
{
|
||||||
return [
|
return [
|
||||||
// UserRequest.title is an AttributeString (maxsize = 255)
|
// UserRequest.title is an AttributeString (maxsize = 255)
|
||||||
'title 250 chars' => ['title', 250],
|
'title 250 chars' => ['title', 250],
|
||||||
@@ -1234,11 +1288,9 @@ class DBObjectTest extends ItopDataTestCase
|
|||||||
/**
|
/**
|
||||||
* Test check long field with non ascii characters
|
* Test check long field with non ascii characters
|
||||||
*
|
*
|
||||||
* @covers DBObject::Set
|
* @covers DBObject::DBDelete
|
||||||
* @covers DBObject::CheckToWrite
|
|
||||||
* @covers DBObject::SetTrim
|
|
||||||
*
|
*
|
||||||
* @dataProvider CheckLongValueInAttributeProvider
|
* @dataProvider DeletionLongValueProvider
|
||||||
*
|
*
|
||||||
* @since 3.1.2 N°3448 - Framework field size check not correctly implemented for multi-bytes languages/strings
|
* @since 3.1.2 N°3448 - Framework field size check not correctly implemented for multi-bytes languages/strings
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -0,0 +1,72 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @copyright Copyright (C) 2010-2024 Combodo SARL
|
||||||
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
|
*/
|
||||||
|
namespace Combodo\iTop\Test\UnitTest\Module\ItopAttachment;
|
||||||
|
|
||||||
|
use Combodo\iTop\Service\Events\EventData;
|
||||||
|
use Combodo\iTop\Test\UnitTest\ItopDataTestCase;
|
||||||
|
use MetaModel;
|
||||||
|
|
||||||
|
class TestAttachment extends ItopDataTestCase
|
||||||
|
{
|
||||||
|
private string $sAddAttachmentName;
|
||||||
|
private string $sRemoveAttachmentName;
|
||||||
|
const CREATE_TEST_ORG = true;
|
||||||
|
|
||||||
|
public function setUp(): void
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
//static::$DEBUG_UNIT_TEST = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testAddAttachment()
|
||||||
|
{
|
||||||
|
$this->sAddAttachmentName = '';
|
||||||
|
$this->sRemoveAttachmentName = '';
|
||||||
|
|
||||||
|
$_REQUEST['transaction_id'] = 'test_transaction';
|
||||||
|
$_REQUEST['attachment_plugin'] = 'in_form';
|
||||||
|
|
||||||
|
$oDocument = new \ormDocument('Test', 'text/plain', 'test.txt');
|
||||||
|
|
||||||
|
$this->EventService_RegisterListener(EVENT_ADD_ATTACHMENT_TO_OBJECT, [$this, 'OnAddAttachment']);
|
||||||
|
$this->EventService_RegisterListener(EVENT_REMOVE_ATTACHMENT_FROM_OBJECT, [$this, 'OnRemoveAttachment']);
|
||||||
|
|
||||||
|
$oAttachment = MetaModel::NewObject('Attachment', [
|
||||||
|
'item_class' => 'UserRequest',
|
||||||
|
'temp_id' => 'test_transaction',
|
||||||
|
'contents' => $oDocument,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$oAttachment->DBInsert();
|
||||||
|
$oTicket = $this->CreateTicket(1);
|
||||||
|
|
||||||
|
$_REQUEST['removed_attachments'] = [$oAttachment->GetKey()];
|
||||||
|
$this->InvokeNonPublicStaticMethod(\AttachmentPlugIn::class, 'UpdateAttachments', [$oTicket]);
|
||||||
|
|
||||||
|
$this->assertEquals('test.txt', $this->sAddAttachmentName);
|
||||||
|
$this->assertEquals('test.txt', $this->sRemoveAttachmentName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function OnAddAttachment(EventData $oData)
|
||||||
|
{
|
||||||
|
$this->debug('OnAddAttachment');
|
||||||
|
$this->assertEquals('UserRequest', get_class($oData->Get('object')));
|
||||||
|
$oAttachment = $oData->Get('attachment');
|
||||||
|
/** @var \ormDocument $oDocument */
|
||||||
|
$oDocument = $oAttachment->Get('contents');
|
||||||
|
$this->sAddAttachmentName = $oDocument->GetFileName();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function OnRemoveAttachment(EventData $oData)
|
||||||
|
{
|
||||||
|
$this->debug('OnRemoveAttachment');
|
||||||
|
$this->assertEquals('UserRequest', get_class($oData->Get('object')));
|
||||||
|
$oAttachment = $oData->Get('attachment');
|
||||||
|
/** @var \ormDocument $oDocument */
|
||||||
|
$oDocument = $oAttachment->Get('contents');
|
||||||
|
$this->sRemoveAttachmentName = $oDocument->GetFileName();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user