diff --git a/application/cmdbabstract.class.inc.php b/application/cmdbabstract.class.inc.php
index 1608d8877..fb5a4987a 100644
--- a/application/cmdbabstract.class.inc.php
+++ b/application/cmdbabstract.class.inc.php
@@ -632,7 +632,7 @@ HTML
.'&attcode='.$oAttDef->GetCode()
.$sHostContainerInEditionUrlParam,
true,
- 'Class:'.$sClass.'/Attribute:'.$sAttCode,
+ $oAttDef->GetLabel(),
AjaxTab::ENUM_TAB_PLACEHOLDER_DASHBOARD
);
// Add graphs dependencies
diff --git a/application/utils.inc.php b/application/utils.inc.php
index 1cf3c15bb..556d6ffde 100644
--- a/application/utils.inc.php
+++ b/application/utils.inc.php
@@ -2108,11 +2108,21 @@ class utils
}
/**
- * Returns the relative (to MODULESROOT) path of the root directory of the module containing the file where the call to
- * this function is made
- * or an empty string if no such module is found (or not called within a module file)
- * @param number $iCallDepth The depth of the module in the callstack. Zero when called directly from within the module
- * @return string
+ * **Warning** : returned result can be invalid as we're using backtrace to find the module dir name
+ *
+ * @param int $iCallDepth The depth of the module in the callstack. Zero when called directly from within the module
+ *
+ * @return string the relative (to MODULESROOT) path of the root directory of the module containing the file where the call to
+ * this function is made
+ * or an empty string if no such module is found (or not called within a module file)
+ *
+ * @uses \debug_backtrace()
+ *
+ * @since 3.0.0 Before writing model.*.php file, compiler will now always delete it.
+ * If you have symlinks enabled, base dir will be original module dir, but since this behavior change this won't be true anymore for model.*.php
+ * In consequence the backtrace analysis won't be possible for this file
+ * See N°4854
+ * @link https://www.itophub.io/wiki/page?id=3_0_0%3Arelease%3A3_0_whats_new#compiler_always_generate_new_model_php compiler behavior change documentation
*/
public static function GetCurrentModuleDir($iCallDepth)
{
@@ -2137,9 +2147,14 @@ class utils
}
/**
+ * **Warning** : as this method uses {@see GetCurrentModuleDir} it produces hazardous results.
+ * You should better uses directly {@see GetAbsoluteUrlModulesRoot} and add the module dir name yourself ! See N°4573
+ *
* @return string the base URL for all files in the current module from which this method is called
* or an empty string if no such module is found (or not called within a module file)
* @throws \Exception
+ *
+ * @uses GetCurrentModuleDir
*/
public static function GetCurrentModuleUrl()
{
diff --git a/core/dbobject.class.php b/core/dbobject.class.php
index 67d02e390..21704fd4f 100644
--- a/core/dbobject.class.php
+++ b/core/dbobject.class.php
@@ -2934,6 +2934,54 @@ abstract class DBObject implements iDisplay
utils::EnrichRaisedException($oTrigger, $e);
}
}
+
+ // - TriggerOnObjectMention
+ // 1 - Check if any caselog updated
+ $aChanges = $this->m_aOrigValues;
+ $aUpdatedLogAttCodes = array();
+ foreach($aChanges as $sAttCode => $value)
+ {
+ $oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
+ if($oAttDef instanceof AttributeCaseLog && $value->GetModifiedEntry() !== '')
+ {
+ $aUpdatedLogAttCodes[] = $sAttCode;
+ }
+ }
+ // 2 - Find mentioned objects
+ $aMentionedObjects = array();
+ foreach ($aUpdatedLogAttCodes as $sAttCode) {
+ /** @var \ormCaseLog $oUpdatedCaseLog */
+ $oUpdatedCaseLog = $this->Get($sAttCode);
+ $aMentionedObjects = array_merge_recursive($aMentionedObjects, utils::GetMentionedObjectsFromText($oUpdatedCaseLog->GetModifiedEntry()));
+ }
+ // 3 - Trigger for those objects
+ // TODO: This should be refactored and moved into the caselogs loop, otherwise, we won't be able to know which case log triggered the action.
+ foreach ($aMentionedObjects as $sMentionedClass => $aMentionedIds) {
+ foreach ($aMentionedIds as $sMentionedId) {
+ /** @var \DBObject $oMentionedObject */
+ $oMentionedObject = MetaModel::GetObject($sMentionedClass, $sMentionedId);
+ $aTriggerArgs = $this->ToArgs('this') + array('mentioned->object()' => $oMentionedObject);
+
+ $aParams = array('class_list' => MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL));
+ $oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnObjectMention AS t WHERE t.target_class IN (:class_list)"), array(), $aParams);
+ while ($oTrigger = $oSet->Fetch())
+ {
+ /** @var \TriggerOnObjectMention $oTrigger */
+ try {
+ // Ensure to handle only mentioned object in the trigger's scope
+ if ($oTrigger->IsMentionedObjectInScope($oMentionedObject) === false) {
+ continue;
+ }
+
+ $oTrigger->DoActivate($aTriggerArgs);
+ }
+ catch (Exception $e) {
+ utils::EnrichRaisedException($oTrigger, $e);
+ }
+ }
+ }
+ }
+
return $this->m_iKey;
}
diff --git a/core/ownershiplock.class.inc.php b/core/ownershiplock.class.inc.php
index ad1f34d34..ddc8762e7 100644
--- a/core/ownershiplock.class.inc.php
+++ b/core/ownershiplock.class.inc.php
@@ -31,13 +31,13 @@ class iTopOwnershipToken extends DBObject
{
$aParams = array
(
- 'category' => 'application',
- 'key_type' => 'autoincrement',
- 'name_attcode' => array('obj_class', 'obj_key'),
- 'state_attcode' => '',
- 'reconc_keys' => array(''),
- 'db_table' => 'priv_ownership_token',
- 'db_key_field' => 'id',
+ 'category' => '',
+ 'key_type' => 'autoincrement',
+ 'name_attcode' => array('obj_class', 'obj_key'),
+ 'state_attcode' => '',
+ 'reconc_keys' => array(''),
+ 'db_table' => 'priv_ownership_token',
+ 'db_key_field' => 'id',
'db_finalclass_field' => '',
);
MetaModel::Init_Params($aParams);
diff --git a/css/backoffice/components/input/_input-select.scss b/css/backoffice/components/input/_input-select.scss
index 223f1cad3..b21158340 100644
--- a/css/backoffice/components/input/_input-select.scss
+++ b/css/backoffice/components/input/_input-select.scss
@@ -64,6 +64,8 @@ $ibo-input-select--autocomplete-item-image--border: 1px solid $ibo-color-grey-60
color: inherit;
border-color: $ibo-color-white-100;
padding-left: $ibo-input-select--padding-x;
+
+ @extend %ibo-font-ral-nor-150;
}
> [data-value] {
diff --git a/css/backoffice/pages/_all.scss b/css/backoffice/pages/_all.scss
index c5f9aa004..11f5a7599 100644
--- a/css/backoffice/pages/_all.scss
+++ b/css/backoffice/pages/_all.scss
@@ -12,4 +12,5 @@
@import "datamodel-viewer";
@import "csv-import";
@import "global-search";
+@import "run-query";
@import "welcome-popup";
\ No newline at end of file
diff --git a/css/backoffice/pages/_run-query.scss b/css/backoffice/pages/_run-query.scss
new file mode 100644
index 000000000..efe4674dc
--- /dev/null
+++ b/css/backoffice/pages/_run-query.scss
@@ -0,0 +1,10 @@
+/*
+ * @copyright Copyright (C) 2010-2021 Combodo SARL
+ * @license http://opensource.org/licenses/AGPL-3.0
+ */
+
+$ibo-run-query--highlight--background-color: $ibo-color-primary-300 !default;
+
+.ibo-run-query--highlight{
+ background-color: $ibo-run-query--highlight--background-color;
+}
\ No newline at end of file
diff --git a/datamodels/2.x/authent-cas/src/CASLoginExtension.php b/datamodels/2.x/authent-cas/src/CASLoginExtension.php
index 71a8e1277..9d8d6e6c0 100644
--- a/datamodels/2.x/authent-cas/src/CASLoginExtension.php
+++ b/datamodels/2.x/authent-cas/src/CASLoginExtension.php
@@ -29,6 +29,8 @@ use utils;
*/
class CASLoginExtension extends AbstractLoginFSMExtension implements iLogoutExtension, iLoginUIExtension
{
+ const LOGIN_MODE = 'cas';
+
/**
* Return the list of supported login modes for this plugin
*
@@ -36,7 +38,7 @@ class CASLoginExtension extends AbstractLoginFSMExtension implements iLogoutExte
*/
public function ListSupportedLoginModes()
{
- return array('cas');
+ return array(static::LOGIN_MODE);
}
protected function OnStart(&$iErrorCode)
@@ -47,12 +49,12 @@ class CASLoginExtension extends AbstractLoginFSMExtension implements iLogoutExte
protected function OnReadCredentials(&$iErrorCode)
{
- if (Session::Get('login_mode') == 'cas')
+ if (empty(Session::Get('login_mode')) || Session::Get('login_mode') == static::LOGIN_MODE)
{
static::InitCASClient();
if (phpCAS::isAuthenticated())
{
- Session::Set('login_mode', 'cas');
+ Session::Set('login_mode', static::LOGIN_MODE);
Session::Set('auth_user', phpCAS::getUser());
Session::Unset('login_will_redirect');
}
@@ -68,7 +70,7 @@ class CASLoginExtension extends AbstractLoginFSMExtension implements iLogoutExte
$iErrorCode = LoginWebPage::EXIT_CODE_MISSINGLOGIN;
return LoginWebPage::LOGIN_FSM_ERROR;
}
- Session::Set('login_mode', 'cas');
+ Session::Set('login_mode', static::LOGIN_MODE);
phpCAS::forceAuthentication(); // Redirect to CAS and exit
}
}
@@ -77,7 +79,7 @@ class CASLoginExtension extends AbstractLoginFSMExtension implements iLogoutExte
protected function OnCheckCredentials(&$iErrorCode)
{
- if (Session::Get('login_mode') == 'cas')
+ if (Session::Get('login_mode') == static::LOGIN_MODE)
{
if (!Session::IsSet('auth_user'))
{
@@ -94,7 +96,7 @@ class CASLoginExtension extends AbstractLoginFSMExtension implements iLogoutExte
protected function OnCredentialsOK(&$iErrorCode)
{
- if (Session::Get('login_mode') == 'cas')
+ if (Session::Get('login_mode') == static::LOGIN_MODE)
{
$sAuthUser = Session::Get('auth_user');
if (!LoginWebPage::CheckUser($sAuthUser))
@@ -109,7 +111,7 @@ class CASLoginExtension extends AbstractLoginFSMExtension implements iLogoutExte
protected function OnError(&$iErrorCode)
{
- if (Session::Get('login_mode') == 'cas')
+ if (Session::Get('login_mode') == static::LOGIN_MODE)
{
Session::Unset('phpCAS');
if ($iErrorCode != LoginWebPage::EXIT_CODE_MISSINGLOGIN)
@@ -124,7 +126,7 @@ class CASLoginExtension extends AbstractLoginFSMExtension implements iLogoutExte
protected function OnConnected(&$iErrorCode)
{
- if (Session::Get('login_mode') == 'cas')
+ if (Session::Get('login_mode') == static::LOGIN_MODE)
{
Session::Set('can_logoff', true);
return LoginWebPage::CheckLoggedUser($iErrorCode);
@@ -205,7 +207,7 @@ class CASLoginExtension extends AbstractLoginFSMExtension implements iLogoutExte
$oLoginContext->SetLoaderPath(APPROOT.'env-'.utils::GetCurrentEnvironment().'/authent-cas/view');
$aData = array(
- 'sLoginMode' => 'cas',
+ 'sLoginMode' => static::LOGIN_MODE,
'sLabel' => Dict::S('CAS:Login:SignIn'),
'sTooltip' => Dict::S('CAS:Login:SignInTooltip'),
);
diff --git a/datamodels/2.x/combodo-backoffice-darkmoon-theme/scss/scss-variables.scss b/datamodels/2.x/combodo-backoffice-darkmoon-theme/scss/scss-variables.scss
index f2e504844..a8b2e550b 100644
--- a/datamodels/2.x/combodo-backoffice-darkmoon-theme/scss/scss-variables.scss
+++ b/datamodels/2.x/combodo-backoffice-darkmoon-theme/scss/scss-variables.scss
@@ -247,3 +247,5 @@ $ibo-vendors-c3--legend--fill: $ibo-color-white-200;
$ibo-vendors-c3--legend--background-color: $ibo-color-white-100;
$ibo-vendors-c3--legend-item--fill: $ibo-color-grey-100;
$ibo-vendors-c3--axis--fill: $ibo-color-grey-200;
+
+$ibo-run-query--highlight--background-color: $ibo-color-primary-700;
\ No newline at end of file
diff --git a/datamodels/2.x/installation.xml b/datamodels/2.x/installation.xml
index 5f1048422..330736741 100755
--- a/datamodels/2.x/installation.xml
+++ b/datamodels/2.x/installation.xml
@@ -21,7 +21,8 @@
combodo-db-tools
itop-core-update
itop-hub-connector
- combodo-backoffice-darkmoon-theme
+ combodo-backoffice-darkmoon-theme
+ itop-themes-compat
true
diff --git a/datamodels/2.x/itop-themes-compat/README.md b/datamodels/2.x/itop-themes-compat/README.md
new file mode 100644
index 000000000..3d0e44fb5
--- /dev/null
+++ b/datamodels/2.x/itop-themes-compat/README.md
@@ -0,0 +1,2 @@
+# Extension Light grey and Test red themes compatibility
+
diff --git a/datamodels/2.x/itop-themes-compat/assets/css/compat.scss b/datamodels/2.x/itop-themes-compat/assets/css/compat.scss
new file mode 100644
index 000000000..e69de29bb
diff --git a/datamodels/2.x/itop-themes-compat/assets/css/css-variables.scss b/datamodels/2.x/itop-themes-compat/assets/css/css-variables.scss
new file mode 100644
index 000000000..e69de29bb
diff --git a/datamodels/2.x/itop-themes-compat/cs.dict.itop-themes-compat.php b/datamodels/2.x/itop-themes-compat/cs.dict.itop-themes-compat.php
new file mode 100644
index 000000000..acd662ebe
--- /dev/null
+++ b/datamodels/2.x/itop-themes-compat/cs.dict.itop-themes-compat.php
@@ -0,0 +1,11 @@
+ 'Light Grey (deprecated)~~',
+));
diff --git a/datamodels/2.x/itop-themes-compat/da.dict.itop-themes-compat.php b/datamodels/2.x/itop-themes-compat/da.dict.itop-themes-compat.php
new file mode 100644
index 000000000..6a30e8cb6
--- /dev/null
+++ b/datamodels/2.x/itop-themes-compat/da.dict.itop-themes-compat.php
@@ -0,0 +1,11 @@
+ 'Light Grey (deprecated)~~',
+));
diff --git a/datamodels/2.x/itop-themes-compat/datamodel.itop-themes-compat.xml b/datamodels/2.x/itop-themes-compat/datamodel.itop-themes-compat.xml
new file mode 100644
index 000000000..492c47447
--- /dev/null
+++ b/datamodels/2.x/itop-themes-compat/datamodel.itop-themes-compat.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+ itop-themes-compat/assets/css/css-variables.scss
+
+
+ itop-themes-compat/assets/css/compat.scss
+ itop-themes-compat/assets/css/compat.scss
+ ../css/backoffice/main.scss
+
+
+
+
+ #C53030
+ #F7FAFC
+ "THIS IS A TEST INSTANCE"
+
+
+ itop-themes-compat/assets/css/css-variables.scss
+
+
+ itop-themes-compat/assets/css/compat.scss
+ itop-themes-compat/assets/css/compat.scss
+
+
+
+
+
diff --git a/datamodels/2.x/itop-themes-compat/de.dict.itop-themes-compat.php b/datamodels/2.x/itop-themes-compat/de.dict.itop-themes-compat.php
new file mode 100644
index 000000000..94b8fbfed
--- /dev/null
+++ b/datamodels/2.x/itop-themes-compat/de.dict.itop-themes-compat.php
@@ -0,0 +1,11 @@
+ 'Light Grey (deprecated)~~',
+));
diff --git a/datamodels/2.x/itop-themes-compat/en.dict.itop-themes-compat.php b/datamodels/2.x/itop-themes-compat/en.dict.itop-themes-compat.php
new file mode 100644
index 000000000..49f12deeb
--- /dev/null
+++ b/datamodels/2.x/itop-themes-compat/en.dict.itop-themes-compat.php
@@ -0,0 +1,11 @@
+ 'Light Grey (deprecated)',
+));
diff --git a/datamodels/2.x/itop-themes-compat/es_cr.dict.itop-themes-compat.php b/datamodels/2.x/itop-themes-compat/es_cr.dict.itop-themes-compat.php
new file mode 100644
index 000000000..7b89eabc9
--- /dev/null
+++ b/datamodels/2.x/itop-themes-compat/es_cr.dict.itop-themes-compat.php
@@ -0,0 +1,11 @@
+ 'Light Grey (deprecated)~~',
+));
diff --git a/datamodels/2.x/itop-themes-compat/fr.dict.itop-themes-compat.php b/datamodels/2.x/itop-themes-compat/fr.dict.itop-themes-compat.php
new file mode 100644
index 000000000..1ca71525c
--- /dev/null
+++ b/datamodels/2.x/itop-themes-compat/fr.dict.itop-themes-compat.php
@@ -0,0 +1,11 @@
+ 'Light Grey (obsolète)',
+));
diff --git a/datamodels/2.x/itop-themes-compat/hu.dict.itop-themes-compat.php b/datamodels/2.x/itop-themes-compat/hu.dict.itop-themes-compat.php
new file mode 100644
index 000000000..c59a9b0b2
--- /dev/null
+++ b/datamodels/2.x/itop-themes-compat/hu.dict.itop-themes-compat.php
@@ -0,0 +1,11 @@
+ 'Light Grey (deprecated)~~',
+));
diff --git a/datamodels/2.x/itop-themes-compat/it.dict.itop-themes-compat.php b/datamodels/2.x/itop-themes-compat/it.dict.itop-themes-compat.php
new file mode 100644
index 000000000..890c74572
--- /dev/null
+++ b/datamodels/2.x/itop-themes-compat/it.dict.itop-themes-compat.php
@@ -0,0 +1,11 @@
+ 'Light Grey (deprecated)~~',
+));
diff --git a/datamodels/2.x/itop-themes-compat/ja.dict.itop-themes-compat.php b/datamodels/2.x/itop-themes-compat/ja.dict.itop-themes-compat.php
new file mode 100644
index 000000000..eb29e6616
--- /dev/null
+++ b/datamodels/2.x/itop-themes-compat/ja.dict.itop-themes-compat.php
@@ -0,0 +1,11 @@
+ 'Light Grey (deprecated)~~',
+));
diff --git a/datamodels/2.x/itop-themes-compat/model.itop-themes-compat.php b/datamodels/2.x/itop-themes-compat/model.itop-themes-compat.php
new file mode 100644
index 000000000..ccc1b539e
--- /dev/null
+++ b/datamodels/2.x/itop-themes-compat/model.itop-themes-compat.php
@@ -0,0 +1,17 @@
+ 'Light grey and Test red themes compatibility',
+ 'category' => 'business',
+
+ // Setup
+ //
+ 'dependencies' => array(
+ 'itop-structure/3.0.1',
+ ),
+ 'mandatory' => false,
+ 'visible' => true,
+
+ // Components
+ //
+ 'datamodel' => array(
+ 'model.itop-themes-compat.php', // Contains the PHP code generated by the "compilation" of datamodel.itop-themes-compat.xml
+ ),
+ 'webservice' => array(
+
+ ),
+ 'data.struct' => array(
+ // add your 'structure' definition XML files here,
+ ),
+ 'data.sample' => array(
+ // add your sample data XML files here,
+ ),
+
+ // Documentation
+ //
+ 'doc.manual_setup' => '', // hyperlink to manual setup documentation, if any
+ 'doc.more_information' => '', // hyperlink to more information, if any
+
+ // Default settings
+ //
+ 'settings' => array(
+ // Module specific settings go here, if any
+ ),
+ )
+);
+
+
+?>
diff --git a/datamodels/2.x/itop-themes-compat/nl.dict.itop-themes-compat.php b/datamodels/2.x/itop-themes-compat/nl.dict.itop-themes-compat.php
new file mode 100644
index 000000000..9c9027691
--- /dev/null
+++ b/datamodels/2.x/itop-themes-compat/nl.dict.itop-themes-compat.php
@@ -0,0 +1,11 @@
+ 'Light Grey (deprecated)~~',
+));
diff --git a/datamodels/2.x/itop-themes-compat/pt_br.dict.itop-themes-compat.php b/datamodels/2.x/itop-themes-compat/pt_br.dict.itop-themes-compat.php
new file mode 100644
index 000000000..37ba9bb8e
--- /dev/null
+++ b/datamodels/2.x/itop-themes-compat/pt_br.dict.itop-themes-compat.php
@@ -0,0 +1,11 @@
+ 'Light Grey (deprecated)~~',
+));
diff --git a/datamodels/2.x/itop-themes-compat/ru.dict.itop-themes-compat.php b/datamodels/2.x/itop-themes-compat/ru.dict.itop-themes-compat.php
new file mode 100644
index 000000000..623b5b8e1
--- /dev/null
+++ b/datamodels/2.x/itop-themes-compat/ru.dict.itop-themes-compat.php
@@ -0,0 +1,11 @@
+ 'Light Grey (deprecated)~~',
+));
diff --git a/datamodels/2.x/itop-themes-compat/sk.dict.itop-themes-compat.php b/datamodels/2.x/itop-themes-compat/sk.dict.itop-themes-compat.php
new file mode 100644
index 000000000..c6a188ce6
--- /dev/null
+++ b/datamodels/2.x/itop-themes-compat/sk.dict.itop-themes-compat.php
@@ -0,0 +1,11 @@
+ 'Light Grey (deprecated)~~',
+));
diff --git a/datamodels/2.x/itop-themes-compat/tr.dict.itop-themes-compat.php b/datamodels/2.x/itop-themes-compat/tr.dict.itop-themes-compat.php
new file mode 100644
index 000000000..a0f70571b
--- /dev/null
+++ b/datamodels/2.x/itop-themes-compat/tr.dict.itop-themes-compat.php
@@ -0,0 +1,11 @@
+ 'Light Grey (deprecated)~~',
+));
diff --git a/datamodels/2.x/itop-themes-compat/zh_cn.dict.itop-themes-compat.php b/datamodels/2.x/itop-themes-compat/zh_cn.dict.itop-themes-compat.php
new file mode 100644
index 000000000..3bdecb074
--- /dev/null
+++ b/datamodels/2.x/itop-themes-compat/zh_cn.dict.itop-themes-compat.php
@@ -0,0 +1,11 @@
+ 'Light Grey (deprecated)~~',
+));
diff --git a/js/extkeywidget.js b/js/extkeywidget.js
index 713a40e0c..6014debc5 100644
--- a/js/extkeywidget.js
+++ b/js/extkeywidget.js
@@ -25,8 +25,10 @@ Selectize.define('custom_itop', function(aOptions) {
if (this.$control_input.val() === '' && !this.$activeItems.length) {
iIndex = this.caretPos-1;
if (iIndex >= 0 && iIndex < this.items.length) {
+ let sPreviousValue = this.options[this.items[iIndex]].search_label;
this.clear(true);
e.preventDefault();
+ this.setTextboxValue(sPreviousValue.slice(0, -1));
return;
}
}
diff --git a/js/pages/backoffice/toolbox.js b/js/pages/backoffice/toolbox.js
index 8cd8d2a5f..2f4b3251d 100644
--- a/js/pages/backoffice/toolbox.js
+++ b/js/pages/backoffice/toolbox.js
@@ -17,10 +17,16 @@
*/
// Helpers
-function ShowAboutBox()
+function ShowAboutBox(sTitle)
{
+ var loadingDialog = $('
');
+ loadingDialog.dialog( {title:sTitle,autoOpen: true, modal: true});
$.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php', {operation: 'about_box'}, function(data){
+
$('body').append(data);
+ }).always(function() {
+ loadingDialog.empty();
+ loadingDialog.remove();
});
return false;
}
diff --git a/pages/ajax.render.php b/pages/ajax.render.php
index 56c272584..62d6767d2 100644
--- a/pages/ajax.render.php
+++ b/pages/ajax.render.php
@@ -1060,7 +1060,8 @@ EOF
$iCol = utils::ReadParam("iCol");
$sDashletIdOrig = utils::ReadParam("dashletid");
$sFinalDashletId = Dashboard::GetDashletUniqueId($bIsCustomized, $sDashboardDivId, $iRow, $iCol, $sDashletIdOrig);
- $oPage = new DownloadPage('');
+ $oPage = new AjaxPage('');
+ $oPage->SetOutputDataOnly(true);
$oPage->add($sFinalDashletId);
break;
diff --git a/pages/run_query.php b/pages/run_query.php
index 5010ef1f0..e930ceeb6 100644
--- a/pages/run_query.php
+++ b/pages/run_query.php
@@ -66,7 +66,7 @@ function ShowExamples($oP, $sExpression)
$sDisable = '';
if ($sOql == $sExpression) {
// this one is currently being tested, highlight it
- $sHighlight = "background-color:yellow;";
+ $sHighlight = "ibo-run-query--highlight";
$sDisable = 'disabled';
// and remember we are testing a query of the list
$bUsingExample = true;
@@ -79,8 +79,8 @@ function ShowExamples($oP, $sExpression)
$oFormButton->AddSubBlock(new Html($sContext));
//$aDisplayData[$sTopic][] = array(
$aDisplayData[Dict::S('UI:RunQuery:QueryExamples')][] = array(
- 'desc' => "".utils::EscapeHtml($sDescription)."
",
- 'oql' => "".utils::EscapeHtml($sOql)."
",
+ 'desc' => "".utils::EscapeHtml($sDescription)."
",
+ 'oql' => "".utils::EscapeHtml($sOql)."
",
'go' => BlockRenderer::RenderBlockTemplates($oFormButton),
);
}
@@ -313,7 +313,7 @@ EOF
$sBefore = substr($sExpression, 0, $e->GetColumn());
$sAfter = substr($sExpression, $e->GetColumn() + strlen($sWrongWord));
$sFixedExpression = $sBefore.$sSuggestedWord.$sAfter;
- $sFixedExpressionHtml = $sBefore.''.$sSuggestedWord.''.$sAfter;
+ $sFixedExpressionHtml = $sBefore.''.$sSuggestedWord.''.$sAfter;
$sSyntaxErrorText .= "Suggesting: $sFixedExpressionHtml
";
$oSyntaxErrorPanel->AddSubBlock(new Html($sSyntaxErrorText));
diff --git a/setup/compiler.class.inc.php b/setup/compiler.class.inc.php
index 572fd5fad..89b1e5088 100644
--- a/setup/compiler.class.inc.php
+++ b/setup/compiler.class.inc.php
@@ -3542,12 +3542,22 @@ EOF;
/**
* Write a file only if not exists
- * Also add some informations in case of a write failleure
- * @param $sFilename
- * @param $sContent
+ * Also add some informations when write failure occurs
+ *
+ * @param string $sFilename
+ * @param string $sContent
+ * @param int $flags
*
* @return bool|int
* @throws \Exception
+ *
+ * @uses \unlink()
+ * @uses \file_put_contents()
+ *
+ * @since 3.0.0 The file is removed before writing (commit c5d265f6)
+ * For now this causes model.*.php files to always be located in env-* dir, even if symlinks are enabled
+ * See N°4854
+ * @link https://www.itophub.io/wiki/page?id=3_0_0%3Arelease%3A3_0_whats_new#compiler_always_generate_new_model_php compiler behavior change documentation
*/
protected function WriteFile($sFilename, $sContent, $flags = null)
{
diff --git a/setup/itopdesignformat.class.inc.php b/setup/itopdesignformat.class.inc.php
index b4f3b372c..524a7af8d 100644
--- a/setup/itopdesignformat.class.inc.php
+++ b/setup/itopdesignformat.class.inc.php
@@ -17,8 +17,6 @@
* You should have received a copy of the GNU Affero General Public License
*/
-use Combodo\iTop\DesignDocument;
-
/**
* Utility to upgrade the format of a given XML datamodel to the latest version
@@ -117,8 +115,6 @@ class iTopDesignFormat
*/
protected $aLog;
protected $bStatus;
- protected $bKeepObsoleteNodes;
- protected $sKeepVersion;
/**
* Creation from a loaded DOMDocument
@@ -220,20 +216,6 @@ class iTopDesignFormat
return self::GetItopNodePath($oNode->parentNode).'/'.$sNodeDesc;
}
- /**
- * Compute a real xpath from iTop one
- *
- * @param \Combodo\iTop\DesignElement $oNode
- *
- * @return string
- */
- public static function GetNodeXPath($oNode)
- {
- $sITopXPath = DesignDocument::GetItopNodePath($oNode);
-
- return preg_replace(["@\[@", "@]@"], ["[@id=\"", "\"]"], $sITopXPath);
- }
-
/**
* Test the conversion without altering the DOM
*
@@ -251,21 +233,19 @@ class iTopDesignFormat
}
/**
- * Make adjustments to the DOM to migrate it to the specified version (default is latest)
+ * Make adjustements to the DOM to migrate it to the specified version (default is latest)
* For now only the conversion from version 1.0 to 1.1 is supported.
*
* @param string $sTargetVersion The desired version (or the latest possible version if not specified)
- * @param \ModelFactory|null $oFactory Full data model (not yet used, aimed at allowing conversion that could not be performed without knowing the
+ * @param object $oFactory Full data model (not yet used, aimed at allowing conversion that could not be performed without knowing the
* whole data model)
- * @param bool $bKeepObsoleteNodes
*
* @return bool True on success, False if errors have been encountered (still the DOM may be altered!)
*/
- public function Convert($sTargetVersion = ITOP_DESIGN_LATEST_VERSION, $oFactory = null, $bKeepObsoleteNodes = true)
+ public function Convert($sTargetVersion = ITOP_DESIGN_LATEST_VERSION, $oFactory = null)
{
$this->aLog = array();
$this->bStatus = true;
- $this->bKeepObsoleteNodes = $bKeepObsoleteNodes;
$oXPath = new DOMXPath($this->oDocument);
// Retrieve the version number
@@ -328,7 +308,6 @@ class iTopDesignFormat
$sIntermediate = self::$aVersions[$sFrom]['next'];
$sTransform = self::$aVersions[$sFrom]['go_to_next'];
$this->LogInfo("Upgrading from $sFrom to $sIntermediate ($sTransform)");
- $this->sKeepVersion = $sFrom;
}
else
{
@@ -336,16 +315,12 @@ class iTopDesignFormat
$sIntermediate = self::$aVersions[$sFrom]['previous'];
$sTransform = self::$aVersions[$sFrom]['go_to_previous'];
$this->LogInfo("Downgrading from $sFrom to $sIntermediate ($sTransform)");
- $this->sKeepVersion = null;
}
// Transform to the intermediate format
$aCallSpec = array($this, $sTransform);
try
{
call_user_func($aCallSpec, $oFactory);
- if ($iFrom > $iTo && $this->bKeepObsoleteNodes) {
- $this->RestorePreviousNodes($sIntermediate);
- }
// Recurse
$this->DoConvert($sIntermediate, $sTo, $oFactory);
@@ -698,8 +673,6 @@ class iTopDesignFormat
*/
protected function From16To15($oFactory)
{
- $oXPath = new DOMXPath($this->oDocument);
-
// Remove AttributeTagSet nodes
//
$sPath = "/itop_design/classes/class/fields/field[@xsi:type='AttributeTagSet']";
@@ -836,15 +809,7 @@ class iTopDesignFormat
$oNode->appendChild($oCodeNode);
}
- // N°3516 Remove legacy backoffice theme
- // Remove completely light-grey theme
- $this->RemoveNodeFromXPath('/itop_design/branding/themes/theme[@id="light-grey"]');
-
// Update test-red theme
- $this->RemoveNodeFromXPath('/itop_design/branding/themes/theme[@id="test-red"]/imports/import[@id="css-variables"]');
- $this->RemoveNodeFromXPath('/itop_design/branding/themes/theme[@id="test-red"]/stylesheets/stylesheet[@id="jqueryui"]');
- $this->RemoveNodeFromXPath('/itop_design/branding/themes/theme[@id="test-red"]/stylesheets/stylesheet[@id="main"]');
-
$oNodeList = $oXPath->query('/itop_design/branding/themes/theme[@id="test-red"]/variables/variable[@id="backoffice-environment-banner-background-color"]');
foreach ($oNodeList as $oNode) {
$oNode->setAttribute('id', 'ibo-page-banner--background-color');
@@ -860,21 +825,6 @@ class iTopDesignFormat
$oNode->setAttribute('id', 'ibo-page-banner--text-content');
}
- $this->RemoveNodeFromXPath('/itop_design/branding/themes/theme[@id="test-red"]/stylesheets/stylesheet[@id="environment-banner"]');
- // Add new stylesheets
- $oStyleSheetsNode = $oXPath->query('/itop_design/branding/themes/theme[@id="test-red"]/stylesheets')->item(0);
- if ($oStyleSheetsNode) {
- $oStyleSheetNode = $oStyleSheetsNode->ownerDocument->createElement("stylesheet");
- $oStyleSheetNode->setAttribute('id', 'environment-banner');
- $oStyleSheetNode->appendChild(new DOMText('../css/backoffice/themes/page-banner.scss'));
- $oStyleSheetsNode->appendChild($oStyleSheetNode);
-
- $oStyleSheetNode = $oStyleSheetsNode->ownerDocument->createElement("stylesheet");
- $oStyleSheetNode->setAttribute('id', 'fullmoon');
- $oStyleSheetNode->appendChild(new DOMText('../css/backoffice/main.scss'));
- $oStyleSheetsNode->appendChild($oStyleSheetNode);
- }
-
// Add new attribute to theme import nodes
$oNodeList = $oXPath->query('/itop_design/branding/themes/theme/imports/import');
foreach ($oNodeList as $oNode) {
@@ -954,24 +904,27 @@ class iTopDesignFormat
// N°3516 Bring back legacy themes
// Update test-red theme
- $oNodeList = $oXPath->query('/itop_design/branding/themes/theme[@id="test-red"]/variables/variable[@id="ibo-page-banner--background-color"]');
- foreach ($oNodeList as $oNode) {
- $oNode->setAttribute('id', 'backoffice-environment-banner-background-color');
+ if (!$oXPath->query('/itop_design/branding/themes/theme[@id="test-red"]/variables/variable[@id="backoffice-environment-banner-background-color"]')->item(0)) {
+ $oNodeList = $oXPath->query('/itop_design/branding/themes/theme[@id="test-red"]/variables/variable[@id="ibo-page-banner--background-color"]');
+ foreach ($oNodeList as $oNode) {
+ $oNode->setAttribute('id', 'backoffice-environment-banner-background-color');
+ }
}
- $oNodeList = $oXPath->query('/itop_design/branding/themes/theme[@id="test-red"]/variables/variable[@id="ibo-page-banner--text-color"]');
- foreach ($oNodeList as $oNode) {
- $oNode->setAttribute('id', 'backoffice-environment-banner-text-color');
+ if (!$oXPath->query('/itop_design/branding/themes/theme[@id="test-red"]/variables/variable[@id="backoffice-environment-banner-text-color"]')->item(0)) {
+ $oNodeList = $oXPath->query('/itop_design/branding/themes/theme[@id="test-red"]/variables/variable[@id="ibo-page-banner--text-color"]');
+ foreach ($oNodeList as $oNode) {
+ $oNode->setAttribute('id', 'backoffice-environment-banner-text-color');
+ }
}
- $oNodeList = $oXPath->query( '/itop_design/branding/themes/theme[@id="test-red"]/variables/variable[@id="ibo-page-banner--text-content"]');
- foreach ($oNodeList as $oNode) {
- $oNode->setAttribute('id', 'backoffice-environment-banner-text-content');
+ if (!$oXPath->query('/itop_design/branding/themes/theme[@id="test-red"]/variables/variable[@id="backoffice-environment-banner-text-content"]')->item(0)) {
+ $oNodeList = $oXPath->query('/itop_design/branding/themes/theme[@id="test-red"]/variables/variable[@id="ibo-page-banner--text-content"]');
+ foreach ($oNodeList as $oNode) {
+ $oNode->setAttribute('id', 'backoffice-environment-banner-text-content');
+ }
}
- $this->RemoveNodeFromXPath('/itop_design/branding/themes/theme[@id="test-red"]/stylesheets/stylesheet[@id="environment-banner"]');
- $this->RemoveNodeFromXPath('/itop_design/branding/themes/theme[@id="test-red"]/stylesheets/stylesheet[@id="fullmoon"]');
-
// Add new attribute to theme import nodes
$oNodeList = $oXPath->query('/itop_design/branding/themes/theme/imports/import');
@@ -1012,88 +965,12 @@ class iTopDesignFormat
//nothing
}
- /**
- * @param string $sNodeMetaVersion
- *
- * @return void
- * @throws \Exception
- */
- private function RestorePreviousNodes($sNodeMetaVersion)
- {
- $oXPath = new DOMXPath($this->oDocument);
- $sVersion = str_replace('.', '_', $sNodeMetaVersion);
- $oTrashedNodes = $oXPath->query("/itop_design/meta/previous_versions/previous_version_$sVersion/trashed_nodes/trashed_node");
- foreach ($oTrashedNodes as $oTrashedNode) {
- if ($oTrashedNode->nodeType == XML_ELEMENT_NODE) {
- $oXPathNode = $oXPath->query('parent_xpath', $oTrashedNode)->item(0);
- $oNodeTreeNode = $oXPath->query('node_tree', $oTrashedNode)->item(0);
- if (!is_null($oXPathNode) && !is_null($oNodeTreeNode)) {
- $sXPath = $this->GetText($oXPathNode, '');
- $oParentNode = $oXPath->query($sXPath)->item(0);
- if ($oParentNode) {
- $oNode = $oNodeTreeNode->firstChild;
- while ($oNode) {
- $oNextNode = $oNode->nextSibling;
- if ($oNode->nodeType == XML_ELEMENT_NODE) {
- // Check for collision
- $sId = $oNode->getAttribute('id');
- $sNodeXPath = ($sId != '') ? $oNode->nodeName.'[@id="'.$sId.'"]' : $oNode->nodeName;
- $sNodeXPath = $sXPath.'/'.$sNodeXPath;
- $oTarget = $oXPath->query($sNodeXPath)->item(0);
- if ($oTarget) {
- // Do not continue migration
- throw new Exception("Trying to restore an existing node $sNodeXPath from version $sNodeMetaVersion");
- }
- // Restore the modification flags
- $oModifiedNodeList = $oXPath->query('descendant-or-self::*[@_disabled_delta or @_disabled_rename_from]', $oNode);
- foreach ($oModifiedNodeList as $oModifiedNode) {
- foreach (['_delta', '_rename_from'] as $sModificationFlag) {
- $sCurrentFlag = $oNode->getAttribute('_disabled'.$sModificationFlag);
- if (!empty($sCurrentFlag)) {
- $oModifiedNode->setAttribute($sModificationFlag, $sCurrentFlag);
- $oModifiedNode->removeAttribute('_disabled'.$sModificationFlag);
- }
- }
- }
- // Move the node back in place
- $oParentNode->appendChild($oNode);
- }
- $oNode = $oNextNode;
- }
- }
- }
- }
- }
- // Clean up the mess
- $this->RemoveNodeFromXPath("/itop_design/meta/previous_versions/previous_version_$sVersion", false);
- $this->RemoveEmptyNodeFromXPath("/itop_design/meta/previous_versions");
- $this->RemoveEmptyNodeFromXPath("/itop_design/meta");
- }
-
- private function RemoveEmptyNodeFromXPath($sXPath, $bStoreThisNodeInMetaVersion = false)
- {
- $oXPath = new DOMXPath($this->oDocument);
- $oNodeToRemove = $oXPath->query($sXPath)->item(0);
- if (is_null($oNodeToRemove)) {
- return;
- }
- $oNode = $oNodeToRemove->firstChild;
- while ($oNode) {
- if ($oNode->nodeType == XML_ELEMENT_NODE) {
- return;
- }
- $oNode = $oNode->nextSibling;
- }
- $this->RemoveNodeFromXPath($sXPath, $bStoreThisNodeInMetaVersion);
- }
-
/**
* @param string $sPath
- * @param bool $bStoreThisNodeInMetaVersion
*
* @return void
*/
- private function RemoveNodeFromXPath($sPath, $bStoreThisNodeInMetaVersion = true)
+ private function RemoveNodeFromXPath($sPath)
{
$oXPath = new DOMXPath($this->oDocument);
@@ -1101,56 +978,9 @@ class iTopDesignFormat
foreach ($oNodeList as $oNode)
{
$this->LogWarning('Node '.self::GetItopNodePath($oNode).' is irrelevant in this version, it will be removed.');
- if ($bStoreThisNodeInMetaVersion && $this->bKeepObsoleteNodes && $this->sKeepVersion) {
- // Move the node to to keep it safe for backward migration
- $oItopDesignNode = $this->GetOrCreateNode('/itop_design', 'itop_design', null);
- $oMetaNode = $this->GetOrCreateNode('meta', 'meta', $oItopDesignNode);
- $oPreviousVersionsNode = $this->GetOrCreateNode('previous_versions', 'previous_versions', $oMetaNode);
- $sVersion = str_replace('.', '_', $this->sKeepVersion);
- $oPreviousVersionNode = $this->GetOrCreateNode("previous_version_$sVersion", "previous_version_$sVersion", $oPreviousVersionsNode);
- $oTrashedNodeList = $this->GetOrCreateNode('trashed_nodes', 'trashed_nodes', $oPreviousVersionNode);
-
- $iNextId = str_replace('.', '', uniqid('', true));
- $oTrashedNode = $this->GetOrCreateNode("trashed_node[@id='$iNextId']", 'trashed_node', $oTrashedNodeList);
- $oTrashedNode->setAttribute('id', $iNextId);
- $oTrashedNode->setAttribute('_delta', 'define');
- $oXPathNode = $this->GetOrCreateNode('parent_xpath', 'parent_xpath', $oTrashedNode);
- $oParentNode = $oNode->parentNode;
- if ($oParentNode instanceof DOMElement) {
- $sParentXPath = static::GetNodeXPath($oParentNode);
- $oXPathNode->appendChild(new DOMText($sParentXPath));
- }
- $oNodeTreeNode = $this->GetOrCreateNode('node_tree', 'node_tree', $oTrashedNode);
-
- // Store the modification flags
- $oModifiedNodeList = $oXPath->query('descendant-or-self::*[@_delta or @_rename_from]', $oNode);
- foreach ($oModifiedNodeList as $oModifiedNode) {
- foreach (['_delta', '_rename_from'] as $sModificationFlag) {
- $sCurrentFlag = $oNode->getAttribute($sModificationFlag);
- if (!empty($sCurrentFlag)) {
- $oModifiedNode->setAttribute('_disabled'.$sModificationFlag, $sCurrentFlag);
- $oModifiedNode->removeAttribute($sModificationFlag);
- }
- }
- }
-
- $oNodeTreeNode->appendChild($oNode);
- } else {
$this->DeleteNode($oNode);
}
}
- }
-
- private function GetOrCreateNode($sXPath, $sName, $oRootNode)
- {
- $oXPath = new DOMXPath($this->oDocument);
- $oNode = $oXPath->query($sXPath, $oRootNode)->item(0);
- if (is_null($oNode)) {
- $oNode = $oRootNode->ownerDocument->createElement($sName);
- $oRootNode->appendChild($oNode);
- }
- return $oNode;
- }
/**
* Clean a collection node by removing the _delta="define" on it and moving it to the item nodes.
@@ -1338,31 +1168,4 @@ class iTopDesignFormat
return null;
}
-
- /**
- * Returns the TEXT of the current node (possibly from several child nodes)
- * @param null $sDefault
- * @return null|string
- */
- protected function GetText($oNode, $sDefault = null)
- {
- $sText = null;
- foreach($oNode->childNodes as $oChildNode)
- {
- if ($oChildNode instanceof \DOMText)
- {
- if (is_null($sText)) $sText = '';
- $sText .= $oChildNode->wholeText;
- }
- }
- if (is_null($sText))
- {
- return $sDefault;
- }
- else
- {
- return $sText;
- }
- }
-
}
diff --git a/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenuFactory.php b/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenuFactory.php
index 762e73933..6bb2b0ed9 100644
--- a/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenuFactory.php
+++ b/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenuFactory.php
@@ -220,7 +220,7 @@ class PopoverMenuFactory
new JSPopupMenuItem(
'UI:AboutBox',
Dict::S('UI:AboutBox'),
- 'return ShowAboutBox();'
+ 'return ShowAboutBox("'.Dict::S('UI:AboutBox').'");'
)
);
diff --git a/sources/Application/WebPage/AjaxPage.php b/sources/Application/WebPage/AjaxPage.php
index 778a269b2..e046765d7 100644
--- a/sources/Application/WebPage/AjaxPage.php
+++ b/sources/Application/WebPage/AjaxPage.php
@@ -25,10 +25,17 @@ class AjaxPage extends WebPage implements iTabbedPage
/** @var string */
private $sPromiseId;
+ /**
+ * @var bool if false will also output extra JS & CSS
+ * @since 3.0.1 3.1.0 N°4836 Introduce this new option to AjaxPage, as sometimes we only need to return a simple string
+ */
+ protected $bOutputDataOnly = false;
+
/**
* constructor for the web page
*
* @param string $s_title Not used
+ * @param bool $bOutputExtraResources if true will output also JS & CSS resources
*/
function __construct($s_title)
{
@@ -50,6 +57,21 @@ class AjaxPage extends WebPage implements iTabbedPage
$oKpi->ComputeStats(get_class($this).' creation', 'AjaxPage');
}
+ /**
+ * @see static::$bOutputDataOnly
+ * @param bool $bFlag
+ *
+ * @return $this
+ *
+ * @since 3.0.1 3.1.0 N°4836 Method creation : sometimes we only want to output a simple string
+ */
+ public function SetOutputDataOnly(bool $bFlag)
+ {
+ $this->bOutputDataOnly = $bFlag;
+
+ return $this;
+ }
+
/**
* @inheritDoc
* @throws \Exception
@@ -162,18 +184,19 @@ class AjaxPage extends WebPage implements iTabbedPage
header($s_header);
}
- // Prepare internal parts (js files, css files, js snippets, css snippets, ...)
- // - Generate necessary dict. files
- if ($this->bAddJSDict) {
- $this->output_dict_entries();
+ if (false === $this->bOutputDataOnly) {
+ // Prepare internal parts (js files, css files, js snippets, css snippets, ...)
+ // - Generate necessary dict. files
+ if ($this->bAddJSDict) {
+ $this->output_dict_entries();
+ }
+
+ ConsoleBlockRenderer::AddCssJsToPage($this, $this->oContentLayout);
+
+ $this->outputCollapsibleSectionInit();
}
- ConsoleBlockRenderer::AddCssJsToPage($this, $this->oContentLayout);
-
// Render the blocks
-
- $this->outputCollapsibleSectionInit();
-
$aData = [];
$aData['oLayout'] = $this->oContentLayout;
$aData['aDeferredBlocks'] = $this->GetDeferredBlocks($this->oContentLayout);
diff --git a/sources/Controller/AjaxRenderController.php b/sources/Controller/AjaxRenderController.php
index ef0b74bc1..e1a0b822c 100644
--- a/sources/Controller/AjaxRenderController.php
+++ b/sources/Controller/AjaxRenderController.php
@@ -873,7 +873,7 @@ EOF
$oPage->add('.') | ');
$oPage->add('');
$oPage->add($sVersionString.' ');
- $oPage->add(Dict::S('UI:About:DataModel').': '.$sDataModelVersion.' ');
+ //$oPage->add(Dict::S('UI:About:DataModel').': '.$sDataModelVersion.' ');
$oPage->add('MySQL: '.$sMySQLVersion.' ');
$oPage->add('PHP: '.$sPHPVersion.' ');
$oPage->add(' | ');
diff --git a/test/setup/iTopDesignFormat/Convert-samples/1.6_to_1.7_2.expected.xml b/test/setup/iTopDesignFormat/Convert-samples/1.6_to_1.7_2.expected.xml
index 217ab6703..b13de9037 100644
--- a/test/setup/iTopDesignFormat/Convert-samples/1.6_to_1.7_2.expected.xml
+++ b/test/setup/iTopDesignFormat/Convert-samples/1.6_to_1.7_2.expected.xml
@@ -14,24 +14,4 @@
service_id AND child.id= :this->org_id AND slt.request_type = :request_type AND slt.priority = :this->priority]]>
-
-
-
-
-
- /itop_design/constants
-
-
-
-
-
- /itop_design/constants
-
-
-
-
-
-
-
-
diff --git a/test/setup/iTopDesignFormat/Convert-samples/1.7_to_1.6_2.expected.xml b/test/setup/iTopDesignFormat/Convert-samples/1.7_to_1.6_2.expected.xml
index 673f9865b..f283afe4a 100644
--- a/test/setup/iTopDesignFormat/Convert-samples/1.7_to_1.6_2.expected.xml
+++ b/test/setup/iTopDesignFormat/Convert-samples/1.7_to_1.6_2.expected.xml
@@ -13,7 +13,5 @@
service_id AND child.id= :this->org_id AND slt.request_type = :request_type AND slt.priority = :this->priority]]>
-
-
diff --git a/test/setup/iTopDesignFormat/Convert-samples/1.7_to_1.6_2.input.xml b/test/setup/iTopDesignFormat/Convert-samples/1.7_to_1.6_2.input.xml
index 9437b2f80..b13de9037 100644
--- a/test/setup/iTopDesignFormat/Convert-samples/1.7_to_1.6_2.input.xml
+++ b/test/setup/iTopDesignFormat/Convert-samples/1.7_to_1.6_2.input.xml
@@ -14,24 +14,4 @@
service_id AND child.id= :this->org_id AND slt.request_type = :request_type AND slt.priority = :this->priority]]>
-
-
-
-
-
- /itop_design/constants
-
-
-
-
-
- /itop_design/constants
-
-
-
-
-
-
-
-
diff --git a/test/setup/iTopDesignFormat/Convert-samples/1.7_to_3.0.expected.xml b/test/setup/iTopDesignFormat/Convert-samples/1.7_to_3.0.expected.xml
index 2cfa47187..b11e6ed7d 100644
--- a/test/setup/iTopDesignFormat/Convert-samples/1.7_to_3.0.expected.xml
+++ b/test/setup/iTopDesignFormat/Convert-samples/1.7_to_3.0.expected.xml
@@ -8,12 +8,23 @@
#C53030
+ ../css/css-variables.scss
../css/scss-variables.scss
+ ../css/ui-lightness/jqueryui.scss
+ ../css/main.scss
../css/custom.scss
- ../css/backoffice/themes/page-banner.scss
- ../css/backoffice/main.scss
+
+
+
+
+
+ ../css/css-variables.scss
+
+
+ ../css/ui-lightness/jqueryui.scss
+ ../css/light-grey.scss
@@ -108,45 +119,4 @@
-
-
-
-
-
- /itop_design/branding/themes
-
-
-
-
- ../css/css-variables.scss
-
-
- ../css/ui-lightness/jqueryui.scss
- ../css/light-grey.scss
-
-
-
-
-
- /itop_design/branding/themes/theme[@id="test-red"]/imports
-
- ../css/css-variables.scss
-
-
-
- /itop_design/branding/themes/theme[@id="test-red"]/stylesheets
-
- ../css/ui-lightness/jqueryui.scss
-
-
-
- /itop_design/branding/themes/theme[@id="test-red"]/stylesheets
-
- ../css/main.scss
-
-
-
-
-
-
diff --git a/test/setup/iTopDesignFormat/Convert-samples/3.0_to_1.7.expected.xml b/test/setup/iTopDesignFormat/Convert-samples/3.0_to_1.7.expected.xml
index 68499ba8c..06929f52a 100644
--- a/test/setup/iTopDesignFormat/Convert-samples/3.0_to_1.7.expected.xml
+++ b/test/setup/iTopDesignFormat/Convert-samples/3.0_to_1.7.expected.xml
@@ -9,22 +9,9 @@
../css/scss-variables.scss
- ../css/css-variables.scss
../css/custom.scss
- ../css/ui-lightness/jqueryui.scss
- ../css/main.scss
-
-
-
-
-
- ../css/css-variables.scss
-
-
- ../css/ui-lightness/jqueryui.scss
- ../css/light-grey.scss
@@ -91,4 +78,45 @@
images/itop-logo.png
+
+
+
+
+
+ /itop_design/branding/themes
+
+
+
+
+ ../css/css-variables.scss
+
+
+ ../css/ui-lightness/jqueryui.scss
+ ../css/light-grey.scss
+
+
+
+
+
+ /itop_design/branding/themes/theme[@id="test-red"]/imports
+
+ ../css/css-variables.scss
+
+
+
+ /itop_design/branding/themes/theme[@id="test-red"]/stylesheets
+
+ ../css/ui-lightness/jqueryui.scss
+
+
+
+ /itop_design/branding/themes/theme[@id="test-red"]/stylesheets
+
+ ../css/main.scss
+
+
+
+
+
+
diff --git a/test/setup/iTopDesignFormat/Convert-samples/3.0_to_1.7_collision.expected.xml b/test/setup/iTopDesignFormat/Convert-samples/3.0_to_1.7_collision.expected.xml
deleted file mode 100644
index 641be65ab..000000000
--- a/test/setup/iTopDesignFormat/Convert-samples/3.0_to_1.7_collision.expected.xml
+++ /dev/null
@@ -1,127 +0,0 @@
-
-
-
-
-
-
- #C53030
- #C53030
-
-
- ../css/scss-variables.scss
-
-
- ../css/custom.scss
-
-
-
-
- bla bla bla
-
-
-
-
-
-
-
- images/class-with-lifecycle.png
-
-
-
-
- images/class-with-lifecycle.png
-
-
- foo
-
-
-
-
- images/class-with-lifecycle.png
-
-
-
-
- images/class-with-lifecycle.png
-
-
-
-
-
-
-
-
-
-
- true
-
- new
- waiting_for_approval
-
-
-
-
- ongoing
- resolved
-
-
-
-
-
-
-
-
-
-
- images/itop-logo.png
-
-
-
-
-
-
- /itop_design/branding/themes
-
-
-
-
- ../css/css-variables.scss
-
-
- ../css/ui-lightness/jqueryui.scss
- ../css/light-grey.scss
-
-
-
-
-
- /itop_design/branding/themes/theme[@id="test-red"]/imports
-
- ../css/css-variables.scss
-
-
-
- /itop_design/branding/themes/theme[@id="test-red"]/stylesheets
-
- ../css/ui-lightness/jqueryui.scss
-
-
-
- /itop_design/branding/themes/theme[@id="test-red"]/stylesheets
-
- ../css/main.scss
-
-
-
-
-
-
-
diff --git a/test/setup/iTopDesignFormat/Convert-samples/3.0_to_1.7_collision.input.xml b/test/setup/iTopDesignFormat/Convert-samples/3.0_to_1.7_collision.input.xml
deleted file mode 100644
index 1e185acab..000000000
--- a/test/setup/iTopDesignFormat/Convert-samples/3.0_to_1.7_collision.input.xml
+++ /dev/null
@@ -1,182 +0,0 @@
-
-
-
-
-
-
- #C53030
- #C53030
-
-
- ../css/scss-variables.scss
-
-
- ../css/custom.scss
-
-
-
-
- bla bla bla
-
-
-
-
-
-
-
-
-
- foo
-
-
-
-
-
-
-
- foo
-
-
-
-
-
-
-
-
- foo
- bar
-
-
-
-
-
-
-
- bar
-
-
-
-
-
-
-
-
-
- true
-
-
- new
-
-
-
- waiting_for_approval
-
-
-
- #2B6CB0
- #FFFFFF
-
-
-
-
-
-
- ongoing
-
-
-
- resolved
-
-
-
- #2B6CB0
- #FFFFFF
-
-
-
-
-
-
-
-
-
-
-
- images/itop-logo.png
- images/itop-logo-square.png
-
-
-
-
-
-
- /itop_design/branding/themes
-
-
-
-
- ../css/css-variables.scss
-
-
- ../css/ui-lightness/jqueryui.scss
- ../css/light-grey.scss
-
-
-
-
-
- /itop_design/branding/themes/theme[@id="test-red"]/imports
-
- ../css/css-variables.scss
-
-
-
- /itop_design/branding/themes/theme[@id="test-red"]/stylesheets
-
- ../css/ui-lightness/jqueryui.scss
-
-
-
- /itop_design/branding/themes/theme[@id="test-red"]/stylesheets
-
- ../css/main.scss
-
-
-
-
-
-
-
diff --git a/test/setup/iTopDesignFormat/Convert-samples/3.0_to_1.7_no_previous.expected.xml b/test/setup/iTopDesignFormat/Convert-samples/3.0_to_1.7_no_previous.expected.xml
deleted file mode 100644
index 9ced4254b..000000000
--- a/test/setup/iTopDesignFormat/Convert-samples/3.0_to_1.7_no_previous.expected.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-
-
-
-
-
-
- #C53030
- #C53030
-
-
- ../css/scss-variables.scss
-
-
- ../css/custom.scss
-
-
-
-
-
-
-
- images/class-with-lifecycle.png
-
-
-
-
- images/class-with-lifecycle.png
-
-
- foo
-
-
-
-
- images/class-with-lifecycle.png
-
-
-
-
- images/class-with-lifecycle.png
-
-
-
-
-
-
-
-
-
-
- true
-
- new
- waiting_for_approval
-
-
-
-
- ongoing
- resolved
-
-
-
-
-
-
-
-
-
-
- images/itop-logo.png
-
-
diff --git a/test/setup/iTopDesignFormat/Convert-samples/3.0_to_1.7_no_previous.input.xml b/test/setup/iTopDesignFormat/Convert-samples/3.0_to_1.7_no_previous.input.xml
deleted file mode 100644
index 56bc62c19..000000000
--- a/test/setup/iTopDesignFormat/Convert-samples/3.0_to_1.7_no_previous.input.xml
+++ /dev/null
@@ -1,136 +0,0 @@
-
-
-
-
-
-
- #C53030
- #C53030
-
-
- ../css/scss-variables.scss
-
-
- ../css/custom.scss
-
-
-
-
-
-
-
-
-
- foo
-
-
-
-
-
-
-
- foo
-
-
-
-
-
-
-
-
- foo
- bar
-
-
-
-
-
-
-
- bar
-
-
-
-
-
-
-
-
-
- true
-
-
- new
-
-
-
- waiting_for_approval
-
-
-
- #2B6CB0
- #FFFFFF
-
-
-
-
-
-
- ongoing
-
-
-
- resolved
-
-
-
- #2B6CB0
- #FFFFFF
-
-
-
-
-
-
-
-
-
-
-
- images/itop-logo.png
- images/itop-logo-square.png
-
-
diff --git a/test/setup/iTopDesignFormat/Convert-samples/Bug_4569.expected.xml b/test/setup/iTopDesignFormat/Convert-samples/Bug_4569.expected.xml
new file mode 100644
index 000000000..a23ab66e0
--- /dev/null
+++ b/test/setup/iTopDesignFormat/Convert-samples/Bug_4569.expected.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+ SELECT Person WHERE
+ (org_id=:this->org_id
+ AND
+ (:current_user->id NOT IN (SELECT User AS u
+ JOIN URP_UserProfile AS uup ON uup.userid=u.id
+ JOIN URP_Profiles AS up ON uup.profileid=up.id
+ WHERE up.name='Portal user' AND u.id = :current_user->id
+ )
+ OR :current_user->id IN (SELECT User AS u
+ JOIN URP_UserProfile AS uup ON uup.userid=u.id
+ JOIN URP_Profiles AS up ON uup.profileid=up.id
+ WHERE up.name='Portal power user' AND u.id = :current_user->id
+ )
+ )
+ )
+ OR (org_id=:this->org_id AND id=:current_contact_id)
+
+
+
+
+
+
+ Vincent5.png
+ image/png
+ 180
+ 54
+ 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
+
+
+
+
+
+
+
+
+
+ #8a765c
+ lighten($brand-primary,50%)
+ $frame-background-color
+ #996633
+ darken($complement-color,15%)
+ darken($complement-color,15%)
+ darken($complement-color,15%)
+ lighten(#dac292,15%)
+ $complement-light
+ hue-rotate(42deg)
+
+
+
+
+
diff --git a/test/setup/iTopDesignFormat/Convert-samples/Bug_4569.input.xml b/test/setup/iTopDesignFormat/Convert-samples/Bug_4569.input.xml
new file mode 100644
index 000000000..e968b8677
--- /dev/null
+++ b/test/setup/iTopDesignFormat/Convert-samples/Bug_4569.input.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+ SELECT Person WHERE
+ (org_id=:this->org_id
+ AND
+ (:current_user->id NOT IN (SELECT User AS u
+ JOIN URP_UserProfile AS uup ON uup.userid=u.id
+ JOIN URP_Profiles AS up ON uup.profileid=up.id
+ WHERE up.name='Portal user' AND u.id = :current_user->id
+ )
+ OR :current_user->id IN (SELECT User AS u
+ JOIN URP_UserProfile AS uup ON uup.userid=u.id
+ JOIN URP_Profiles AS up ON uup.profileid=up.id
+ WHERE up.name='Portal power user' AND u.id = :current_user->id
+ )
+ )
+ )
+ OR (org_id=:this->org_id AND id=:current_contact_id)
+
+
+
+
+
+
+ Vincent5.png
+ image/png
+ 180
+ 54
+ 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
+
+
+
+
+
+
+
+
+
+ #8a765c
+ lighten($brand-primary,50%)
+ $frame-background-color
+ #996633
+ darken($complement-color,15%)
+ darken($complement-color,15%)
+ darken($complement-color,15%)
+ lighten(#dac292,15%)
+ $complement-light
+ hue-rotate(42deg)
+
+
+
+
+
diff --git a/test/setup/iTopDesignFormat/iTopDesignFormatTest.php b/test/setup/iTopDesignFormat/iTopDesignFormatTest.php
index 3de9988b2..d302dd2fd 100644
--- a/test/setup/iTopDesignFormat/iTopDesignFormatTest.php
+++ b/test/setup/iTopDesignFormat/iTopDesignFormatTest.php
@@ -64,13 +64,12 @@ class TestForITopDesignFormatClass extends ItopTestCase
public function ConvertProvider()
{
return [
+ 'Bug_4569' => ['1.7', 'Bug_4569'],
'1.7 to 1.6' => ['1.6', '1.7_to_1.6'],
'1.6 to 1.7 2' => ['1.7', '1.6_to_1.7_2'],
'1.7 to 1.6 2' => ['1.6', '1.7_to_1.6_2'],
'1.7 to 3.0' => ['3.0', '1.7_to_3.0'],
'3.0 to 1.7' => ['1.7', '3.0_to_1.7'],
- '3.0 to 1.7 no previous' => ['1.7', '3.0_to_1.7_no_previous'],
- '3.0 to 1.7 collision' => ['1.7', '3.0_to_1.7_collision', 1, 'Trying to restore an existing node /itop_design/branding/themes/theme[@id="light-grey"] from version 1.7'],
];
}
@@ -120,11 +119,9 @@ class TestForITopDesignFormatClass extends ItopTestCase
public function ConvertBackAndForthProvider()
{
- return array(
- '1.6 to 1.7' => array('1.7', '1.6_to_1.7_2'),
- '1.6 to 3.0' => array('3.0', '1.6_to_1.7_2'),
- '1.7 to 3.0' => array('3.0', '1.7'),
- );
+ return [
+ '1.7 to 3.0' => ['3.0', '1.7'],
+ ];
}
/**
diff --git a/test/status/StatusTest.php b/test/status/StatusTest.php
index 351a3e38d..9823d93f9 100644
--- a/test/status/StatusTest.php
+++ b/test/status/StatusTest.php
@@ -49,20 +49,14 @@ class StatusTest extends ItopTestCase
$aResponseDecoded = json_decode($aOutput[0], true);
//Check status
- $this->assertArrayHasKey('status', $aResponseDecoded, 'JSON does not have a status\' field. '.$sAdditionalInfo);
+ $this->assertArrayHasKey('status', $aResponseDecoded, 'JSON does not have a \'status\' field. '.$sAdditionalInfo);
$this->assertEquals('RUNNING', $aResponseDecoded['status'], 'Status is not \'RUNNING\'. '.$sAdditionalInfo);
//Check code
- $this->assertArrayHasKey('code', $aResponseDecoded, 'JSON does not have a code\' field. '.$sAdditionalInfo);
+ $this->assertArrayHasKey('code', $aResponseDecoded, 'JSON does not have a \'code\' field. '.$sAdditionalInfo);
$this->assertEquals(0, $aResponseDecoded['code'], 'Code is not 0. '.$sAdditionalInfo);
//Check message
- $this->assertArrayHasKey('message', $aResponseDecoded, 'JSON does not have a message\' field. '.$sAdditionalInfo);
+ $this->assertArrayHasKey('message', $aResponseDecoded, 'JSON does not have a \'message\' field. '.$sAdditionalInfo);
$this->assertEmpty($aResponseDecoded['message'], 'Message is not empty. '.$sAdditionalInfo);
- //Check product
- $this->assertArrayHasKey('product', $aResponseDecoded, 'JSON does not have a product\' field. '.$sAdditionalInfo);
- $this->assertEquals(ITOP_APPLICATION, $aResponseDecoded['product'], 'Bad product (should be: '.ITOP_APPLICATION.') '.$sAdditionalInfo);
- //Check version
- $this->assertArrayHasKey('version', $aResponseDecoded, 'JSON does not have a version\' field. '.$sAdditionalInfo);
- $this->assertEquals(ITOP_VERSION, $aResponseDecoded['version'], 'Bad version (should be: '.ITOP_VERSION.') '.$sAdditionalInfo);
}
}
diff --git a/webservices/status.php b/webservices/status.php
index 69432370b..636ab4ec6 100644
--- a/webservices/status.php
+++ b/webservices/status.php
@@ -9,12 +9,12 @@ use Combodo\iTop\Application\Status\Status;
try
{
new Status();
- $aResult = ['status' => STATUS_RUNNING, 'code' => RestResult::OK, 'message' => '', 'product' => ITOP_APPLICATION, 'version' => ITOP_VERSION];
+ $aResult = ['status' => STATUS_RUNNING, 'code' => RestResult::OK, 'message' => ''];
}
catch (Exception $e)
{
$iCode = (defined('\RestResult::INTERNAL_ERROR')) ? RestResult::INTERNAL_ERROR : 100;
- $aResult = ['status' => STATUS_ERROR, 'code' => $iCode, 'message' => $e->getMessage(), 'product' => ITOP_APPLICATION, 'version' => ITOP_VERSION];
+ $aResult = ['status' => STATUS_ERROR, 'code' => $iCode, 'message' => $e->getMessage()];
http_response_code(500);
}