diff --git a/application/loginwebpage.class.inc.php b/application/loginwebpage.class.inc.php index 09eaa9073..8361a8904 100644 --- a/application/loginwebpage.class.inc.php +++ b/application/loginwebpage.class.inc.php @@ -790,12 +790,13 @@ class LoginWebPage extends NiceWebPage $oPerson = null; try { - $sOrigin = 'External User provisioning'; + CMDBObject::SetTrackOrigin('custom-extension'); + $sInfo = 'External User provisioning'; if (isset($_SESSION['login_mode'])) { - $sOrigin .= " ({$_SESSION['login_mode']})"; + $sInfo .= " ({$_SESSION['login_mode']})"; } - CMDBObject::SetTrackOrigin($sOrigin); + CMDBObject::SetTrackInfo($sInfo); $oPerson = MetaModel::NewObject('Person'); $oPerson->Set('first_name', $sFirstName); @@ -843,6 +844,14 @@ class LoginWebPage extends NiceWebPage $oUser = null; try { + CMDBObject::SetTrackOrigin('custom-extension'); + $sInfo = 'External User provisioning'; + if (isset($_SESSION['login_mode'])) + { + $sInfo .= " ({$_SESSION['login_mode']})"; + } + CMDBObject::SetTrackInfo($sInfo); + $oUser = MetaModel::GetObjectByName('UserExternal', $sAuthUser, false); if (is_null($oUser)) { diff --git a/core/dbobjectsearch.class.php b/core/dbobjectsearch.class.php index 8a3d06a82..9e769e1ea 100644 --- a/core/dbobjectsearch.class.php +++ b/core/dbobjectsearch.class.php @@ -223,9 +223,9 @@ class DBObjectSearch extends DBSearch public function RenameAlias($sOldName, $sNewName) { $bFound = false; - if (array_key_exists($sOldName, $this->m_aClasses)) + if (!array_key_exists($sOldName, $this->m_aClasses)) { - $bFound = true; + return false; } if (array_key_exists($sNewName, $this->m_aClasses)) { diff --git a/css/css-variables.scss b/css/css-variables.scss index 524c792b0..76e3f6183 100644 --- a/css/css-variables.scss +++ b/css/css-variables.scss @@ -17,7 +17,7 @@ */ // Beware the version number MUST be enclosed with quotes otherwise v2.3.0 becomes v2 0.3 .0 -$version: "v2.7.0-1"; +$version: "v2.7.0-2"; $approot-relative: "../../../../../" !default; // relative to env-***/branding/themes/***/main.css // Base colors diff --git a/datamodels/2.x/itop-attachments/ajax.itop-attachment.php b/datamodels/2.x/itop-attachments/ajax.itop-attachment.php index cdcace1cb..b603773f1 100644 --- a/datamodels/2.x/itop-attachments/ajax.itop-attachment.php +++ b/datamodels/2.x/itop-attachments/ajax.itop-attachment.php @@ -46,7 +46,7 @@ function RenderAttachments(ajax_page $oPage, $iTransactionId) : AttachmentPlugIn::IsReadonlyState($oObject, $oObject->GetState(), AttachmentPlugIn::ENUM_GUI_BACKOFFICE); if ($bEditMode && !$bIsReadOnlyState) { - $oAttachmentsRenderer->RenderEditAttachmentsList($aAttachmentsDeleted); + $oAttachmentsRenderer->AddAttachmentsListContent(true, $aAttachmentsDeleted); } else { diff --git a/datamodels/2.x/itop-attachments/renderers.itop-attachments.php b/datamodels/2.x/itop-attachments/renderers.itop-attachments.php index b91f59670..16c848fbd 100644 --- a/datamodels/2.x/itop-attachments/renderers.itop-attachments.php +++ b/datamodels/2.x/itop-attachments/renderers.itop-attachments.php @@ -69,6 +69,14 @@ abstract class AbstractAttachmentsRenderer */ const MAX_SIZE_FOR_PREVIEW = 500000; + /** + * Attachments list container HTML id, that must be generated in {@link RenderEditAttachmentsList} + * + * @since 2.7.0-2 N°2968 ajax buttons (on especially the #attachment_plugin hidden input) should not be refreshed + * so we are refreshing only the content of this container + */ + const ATTACHMENTS_LIST_CONTAINER_ID = 'AttachmentsListContainer'; + /** @var \WebPage */ protected $oPage; /** @@ -129,13 +137,38 @@ abstract class AbstractAttachmentsRenderer } /** + * Can be overriden to change display order, but must generate an HTML container of ID {@link ATTACHMENTS_LIST_CONTAINER_ID} for JS refresh. + * * @param int[] $aAttachmentsDeleted Attachments id that should be deleted after form submission * - * @return string + * @return void will print using {@link oPage} */ - abstract public function RenderEditAttachmentsList($aAttachmentsDeleted = array()); + public function RenderEditAttachmentsList($aAttachmentsDeleted = array()) + { + $this->AddUploadButton(); - abstract public function RenderViewAttachmentsList(); + $this->oPage->add('
'); + $this->AddAttachmentsListContent(true, $aAttachmentsDeleted); + $this->oPage->add('
'); + } + + /** + * Generates the attachments list content + * + * @param bool $bWithDeleteButton + * @param array $aAttachmentsDeleted + * + * @throws \ArchivedObjectException + * @throws \CoreException + * @throws \CoreUnexpectedValue + * @throws \MySQLException + */ + abstract public function AddAttachmentsListContent($bWithDeleteButton, $aAttachmentsDeleted = array()); + + public function RenderViewAttachmentsList() + { + $this->AddAttachmentsListContent(false, array()); + } protected function AddUploadButton() { @@ -154,9 +187,9 @@ abstract class AbstractAttachmentsRenderer $this->oPage->add_ready_script( <<tbody>tr[id^="display_attachment_"]>td input[name="removed_attachments[]"]'), aAttachmentsDeletedIds = aAttachmentsDeletedHiddenInputs.map(function() { return $(this).val() }).toArray(); $(sContentNode).block(); @@ -172,6 +205,8 @@ abstract class AbstractAttachmentsRenderer function(data) { $(sContentNode).html(data); $(sContentNode).unblock(); + + $('#attachment_plugin').trigger('add_attachment', [dataUpload.result.att_id, dataUpload.result.msg, false]); } ) } @@ -181,20 +216,18 @@ abstract class AbstractAttachmentsRenderer formData: { operation: 'add', temp_id: '$this->sTransactionId', obj_class: '$sClass' }, dataType: 'json', pasteZone: null, // Don't accept files via Chrome's copy/paste - done: function (e, data) { + done: function(e, data) { if(typeof(data.result.error) != 'undefined') { if(data.result.error !== '') { alert(data.result.error); - } - else - { - RefreshAttachmentsDisplay(); + return; } } + RefreshAttachmentsDisplay(data); }, - send: function(e, data){ + send: function(e, data){ // Don't send attachment if size is greater than PHP post_max_size, otherwise it will break the request and all its parameters (\$_REQUEST, \$_POST, ...) // Note: We loop on the files as the data structures is an array but in this case, we only upload 1 file at a time. var iTotalSizeInBytes = 0; @@ -337,16 +370,7 @@ JS; */ class TableDetailsAttachmentsRenderer extends AbstractAttachmentsRenderer { - /** - * @param bool $bWithDeleteButton - * @param array $aAttachmentsDeleted - * - * @throws \ArchivedObjectException - * @throws \CoreException - * @throws \CoreUnexpectedValue - * @throws \MySQLException - */ - private function AddAttachmentsTable($bWithDeleteButton, $aAttachmentsDeleted = array()) + public function AddAttachmentsListContent($bWithDeleteButton, $aAttachmentsDeleted = array()) { if ($this->GetAttachmentsCount() === 0) { @@ -534,22 +558,4 @@ JS HTML ); } - - /** - * @inheritDoc - */ - public function RenderEditAttachmentsList($aAttachmentsDeleted = array()) - { - $this->AddUploadButton(); - - $this->AddAttachmentsTable(true, $aAttachmentsDeleted); - } - - /** - * @inheritDoc - */ - public function RenderViewAttachmentsList() - { - $this->AddAttachmentsTable(false); - } } diff --git a/pages/ajax.render.php b/pages/ajax.render.php index 77b5e0dd2..f10099aa1 100644 --- a/pages/ajax.render.php +++ b/pages/ajax.render.php @@ -1196,7 +1196,7 @@ EOF break; case 'dashboard_editor': - $sId = utils::ReadParam('id', '', false, 'element_identifier'); + $sId = utils::ReadParam('id', '', false, 'context_param'); $aExtraParams = utils::ReadParam('extra_params', array(), false, 'raw_data'); $aExtraParams['dashboard_div_id'] = utils::Sanitize($sId, '', 'element_identifier'); $sDashboardFile = utils::ReadParam('file', '', false, 'raw_data'); diff --git a/test/OQL/OQLToSQLTest.php b/test/OQL/OQLToSQLTest.php index d12b03f39..dec00c31e 100644 --- a/test/OQL/OQLToSQLTest.php +++ b/test/OQL/OQLToSQLTest.php @@ -341,6 +341,7 @@ class OQLToSQLTest extends ItopDataTestCase ); $aData = array( + "SELECT UNION 5.6" => array("SELECT `Organization` AS `Organization` WHERE ((`Organization`.`status` != 'inactive') AND (`Organization`.`id` = '1')) UNION SELECT `Organization` AS `Organization` WHERE ((`Organization`.`id` = '1') AND (`Organization`.`id` = '1'))", array(), array(), array(), null, null, 3, 0), "SELECT WebServer 150" => array("SELECT `WebServer` FROM WebServer AS `WebServer` WHERE 1", array(), array(), $aAttToLoad150, null, null, 3, 0), "SELECT WebServer 151" => array("SELECT `WebServer` FROM WebServer AS `WebServer` WHERE 1", array(), array(), array(), null, null, 3, 0), "SELECT L JOIN 176" => array("SELECT `L` FROM Location AS `L` JOIN Person AS `P` ON `P`.location_id = `L`.id WHERE 1", unserialize('a:1:{s:14:"L.friendlyname";b:1;}'), array(), null, null, 3, 0),