diff --git a/addons/userrights/userrightsmatrix.class.inc.php b/addons/userrights/userrightsmatrix.class.inc.php index 75becda13..8bbe15cc8 100644 --- a/addons/userrights/userrightsmatrix.class.inc.php +++ b/addons/userrights/userrightsmatrix.class.inc.php @@ -312,7 +312,7 @@ class UserRightsMatrix extends UserRightsAddOnAPI $oLogin = $oSet->Fetch(); if ($oLogin->Get('password') == $sPassword) { - return true; + return $oLogin->Get('userid'); } // todo: throw an exception? return false; @@ -324,7 +324,7 @@ class UserRightsMatrix extends UserRightsAddOnAPI return $oNullFilter; } - public function IsActionAllowed($sUserName, $sClass, $iActionCode, dbObjectSet $aInstances) + public function IsActionAllowed($iUserId, $sClass, $iActionCode, dbObjectSet $aInstances) { if (!array_key_exists($iActionCode, self::$m_aActionCodes)) { @@ -332,7 +332,7 @@ class UserRightsMatrix extends UserRightsAddOnAPI } $sAction = self::$m_aActionCodes[$iActionCode]; - $oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT UserRightsMatrixClassGrant WHERE class = '$sClass' AND action = '$sAction' AND login = '$sUserName'")); + $oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT UserRightsMatrixClassGrant WHERE class = '$sClass' AND action = '$sAction' AND userid = '$iUserId'")); if ($oSet->Count() < 1) { return UR_ALLOWED_NO; @@ -352,7 +352,7 @@ class UserRightsMatrix extends UserRightsAddOnAPI return $iRetCode; } - public function IsActionAllowedOnAttribute($sUserName, $sClass, $sAttCode, $iActionCode, dbObjectSet $aInstances) + public function IsActionAllowedOnAttribute($iUserId, $sClass, $sAttCode, $iActionCode, dbObjectSet $aInstances) { if (!array_key_exists($iActionCode, self::$m_aActionCodes)) { @@ -360,7 +360,7 @@ class UserRightsMatrix extends UserRightsAddOnAPI } $sAction = self::$m_aActionCodes[$iActionCode]; - $oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT UserRightsMatrixAttributeGrant WHERE UserRightsMatrixAttributeGrant.class = '$sClass' AND UserRightsMatrixAttributeGrant.attcode = '$sAttCode' AND UserRightsMatrixAttributeGrant.action = '$sAction' AND UserRightsMatrixAttributeGrant.login = '$sUserName'")); + $oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT UserRightsMatrixAttributeGrant WHERE class = '$sClass' AND attcode = '$sAttCode' AND action = '$sAction' AND userid = '$iUserId'")); if ($oSet->Count() < 1) { return UR_ALLOWED_NO; @@ -380,9 +380,9 @@ class UserRightsMatrix extends UserRightsAddOnAPI return $iRetCode; } - public function IsStimulusAllowed($sUserName, $sClass, $sStimulusCode, dbObjectSet $aInstances) + public function IsStimulusAllowed($iUserId, $sClass, $sStimulusCode, dbObjectSet $aInstances) { - $oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT UserRightsMatrixClassStimulusGrant WHERE class = '$sClass' AND stimulus = '$sStimulusCode' AND login = '$sUserName'")); + $oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT UserRightsMatrixClassStimulusGrant WHERE class = '$sClass' AND stimulus = '$sStimulusCode' AND userid = '$iUserId'")); if ($oSet->Count() < 1) { return UR_ALLOWED_NO; diff --git a/application/cmdbabstract.class.inc.php b/application/cmdbabstract.class.inc.php index d29008dd2..3bd6401a5 100644 --- a/application/cmdbabstract.class.inc.php +++ b/application/cmdbabstract.class.inc.php @@ -142,7 +142,7 @@ abstract class cmdbAbstractObject extends CMDBObject if (!empty($sTemplate)) { $oTemplate = new DisplayTemplate($sTemplate); - $oTemplate->Render($oPage, array('class'=> get_class($this),'pkey'=> $this->GetKey(), 'name' => $this->GetName())); + $oTemplate->Render($oPage, array('class_name'=> MetaModel::GetName(get_class($this)),'class'=> get_class($this),'pkey'=> $this->GetKey(), 'name' => $this->GetName())); } else { @@ -152,7 +152,7 @@ abstract class cmdbAbstractObject extends CMDBObject $oSingletonFilter->AddCondition('pkey', array($this->GetKey())); $oBlock = new MenuBlock($oSingletonFilter, 'popup', false); $oBlock->Display($oPage, -1); - $oPage->add("

".Metamodel::GetName(get_class($this)).": ".$this->GetDisplayName()."

\n"); + $oPage->add("

".Metamodel::GetName(MetaModel::GetName(get_class($this))).": ".$this->GetDisplayName()."

\n"); $oHistoryFilter = new DBObjectSearch('CMDBChangeOpSetAttribute'); $oHistoryFilter->AddCondition('objkey', $this->GetKey()); $oBlock = new HistoryBlock($oHistoryFilter, 'toggle', false); @@ -276,13 +276,15 @@ abstract class cmdbAbstractObject extends CMDBObject } $oMenuBlock = new MenuBlock($oSet->GetFilter()); $sHtml .= ''; + $sColspan = ''; if ($bDisplayMenu) { - $sHtml .= ''; } - $sHtml .= ''; $sHtml .= '
'; + $sColspan = 'colspan="2"'; + $sHtml .= '
 '.$oSet->Count().' object(s)'; $sHtml .= $oMenuBlock->GetRenderContent($oPage, $sLinkageAttribute); $sHtml .= '
'; + $sHtml .= "
"; $sHtml .= $oPage->GetTable($aAttribs, $aValues, array('class'=>$sClassName, 'filter'=>$oSet->GetFilter()->serialize(), 'preview' => true)); $sHtml .= '
'; @@ -519,14 +521,14 @@ abstract class cmdbAbstractObject extends CMDBObject { $sHTMLValue = ""; } - else if (count($aAllowedValues) > 20) + else if (count($aAllowedValues) > 50) { // too many choices, use an autocomplete // The input for the auto complete - $sHTMLValue = ""; + $sHTMLValue = ""; // another hidden input to store & pass the object's Id - $sHTMLValue .= "\n"; - $oPage->add_ready_script("\$('#$iInputId').autocomplete('./ajax.render.php', { minChars:3, onItemSelect:selectItem, onFindValue:findValue, formatItem:formatItem, autoFill:true, keyHolder:'#id_ac_$iInputId', extraParams:{operation:'autocomplete', sclass:'$sClass',attCode:'".$sAttCode."'}});"); + $sHTMLValue .= "\n"; + $oPage->add_ready_script("\$('#label_$iInputId').autocomplete('./ajax.render.php', { minChars:3, onItemSelect:selectItem, onFindValue:findValue, formatItem:formatItem, autoFill:true, keyHolder:'#$iInputId', extraParams:{operation:'autocomplete', sclass:'$sClass',attCode:'".$sAttCode."'}});"); } else { diff --git a/application/displayblock.class.inc.php b/application/displayblock.class.inc.php index d93cb7cd4..f41ab6a28 100644 --- a/application/displayblock.class.inc.php +++ b/application/displayblock.class.inc.php @@ -248,10 +248,6 @@ class DisplayBlock $bDashboardMode = isset($aExtraParams['dashboard']) ? ($aExtraParams['dashboard'] == 'true') : false; if ( ($this->m_oSet->Count()> 0) && (UserRights::IsActionAllowed($this->m_oSet->GetClass(), UR_ACTION_READ, $this->m_oSet) == UR_ALLOWED_YES) ) { - if (!$bDashboardMode) - { - $sHtml .= $oPage->GetP($this->m_oSet->Count()." object(s)."); - } $sLinkage = isset($aExtraParams['linkage']) ? $aExtraParams['linkage'] : ''; $sHtml .= cmdbAbstractObject::GetDisplaySet($oPage, $this->m_oSet, $sLinkage, !$bDashboardMode /* bDisplayMenu */); } @@ -616,7 +612,8 @@ class MenuBlock extends DisplayBlock } else { - $aActions[] = array ('label' => 'eMail', 'url' => "mailto:?subject=".$oSet->GetFilter()->__DescribeHTML()."&body=".urlencode("http://localhost:81/pages/UI.php?operation=search&filter=$sFilter&$sContext")); + $sUrl = self::GetAbsoluteUrl(); + $aActions[] = array ('label' => 'eMail', 'url' => "mailto:?subject=".$oSet->GetFilter()->__DescribeHTML()."&body=".urlencode("$sUrl?operation=search&filter=$sFilter&$sContext")); $aActions[] = array ('label' => 'CSV Export', 'url' => "../pages/$sUIPage?operation=search&filter=$sFilter&format=csv&$sContext"); $aActions[] = array ('label' => 'Bookmark...', 'url' => "../pages/ajax.render.php?operation=create&class=$sClass&filter=$sFilter", 'class' => 'jqmTrigger'); if ($bIsModifyAllowed) { $aActions[] = array ('label' => 'New...', 'url' => "../pages/$sUIPage?operation=new&class=$sClass&$sContext"); } @@ -663,7 +660,8 @@ class MenuBlock extends DisplayBlock else { // many objects in the set, possible actions are: new / modify all / delete all - $aActions[] = array ('label' => 'eMail', 'url' => "mailto:?subject=".$oSet->GetFilter()->__DescribeHTML()."&body=".urlencode("http://localhost:81/pages/UI.php?operation=search&filter=$sFilter&$sContext")); + $sUrl = self::GetAbsoluteUrl(); + $aActions[] = array ('label' => 'eMail', 'url' => "mailto:?subject=".$oSet->GetFilter()->__DescribeHTML()."&body=".urlencode("$sUrl?operation=search&filter=$sFilter&$sContext")); $aActions[] = array ('label' => 'CSV Export', 'url' => "../pages/$sUIPage?operation=search&filter=$sFilter&format=csv&$sContext"); $aActions[] = array ('label' => 'Bookmark...', 'url' => "../pages/ajax.render.php?operation=create&class=$sClass&filter=$sFilter", 'class' => 'jqmTrigger'); if ($bIsModifyAllowed) { $aActions[] = array ('label' => 'New...', 'url' => "../pages/$sUIPage?operation=new&class=$sClass&$sContext"); } @@ -680,7 +678,25 @@ class MenuBlock extends DisplayBlock $sHtml .= "\n\n\n"; $oPage->add_ready_script("$(\"ul.jd_menu\").jdMenu();\n"); return $sHtml; - } + } + static public function GetAbsoluteUrl() + { + // Build an absolute URL to this page on this server/port + $sServerName = $_SERVER['SERVER_NAME']; + $sProtocol = isset($_SERVER['HTTPS']) ? 'https' : 'http'; + if ($sProtocol == 'http') + { + $sPort = ($_SERVER['SERVER_PORT'] == 80) ? '' : ':'.$_SERVER['SERVER_PORT']; + } + else + { + $sPort = ($_SERVER['SERVER_PORT'] == 443) ? '' : ':'.$_SERVER['SERVER_PORT']; + } + $sPath = $_SERVER['REQUEST_URI']; + $sUrl = "$sProtocol://{$sServerName}{$sPort}{$sPath}"; + + return $sUrl; + } } ?> diff --git a/application/itopwebpage.class.inc.php b/application/itopwebpage.class.inc.php index de1cd14ca..0b69f6669 100644 --- a/application/itopwebpage.class.inc.php +++ b/application/itopwebpage.class.inc.php @@ -255,7 +255,8 @@ EOF $sText = "Your search"; $sOnClick = " onclick=\"this.value='';this.onclick=null;\""; } - echo "
"; + $sUserName = UserRights::GetUser(); + echo "
Logged as '$sUserName'   "; echo "
\n"; echo "
\n"; diff --git a/application/ui.linkswidget.class.inc.php b/application/ui.linkswidget.class.inc.php index f980adec1..31be4bef4 100644 --- a/application/ui.linkswidget.class.inc.php +++ b/application/ui.linkswidget.class.inc.php @@ -61,7 +61,7 @@ class UILinksWidget } // Many values (or even a unknown list) display an autocomplete - if ( (count($aAllowedValues) == 0) || (count($aAllowedValues) > 20) ) + if ( (count($aAllowedValues) == 0) || (count($aAllowedValues) > 50) ) { // too many choices, use an autocomplete // The input for the auto complete diff --git a/application/uiwizard.class.inc.php b/application/uiwizard.class.inc.php index 3c8a61192..53ef12a88 100644 --- a/application/uiwizard.class.inc.php +++ b/application/uiwizard.class.inc.php @@ -34,42 +34,45 @@ class UIWizard $sJSHandlerCode = ''; // Javascript code to be executed each time this step of the wizard is entered foreach($aStep as $sAttCode) { - $oAttDef = MetaModel::GetAttributeDef($this->m_sClass, $sAttCode); - $sAttLabel = $oAttDef->GetLabel(); - $iOptions = isset($aStates[$this->m_sTargetState]['attribute_list'][$sAttCode]) ? $aStates[$this->m_sTargetState]['attribute_list'][$sAttCode] : 0; - - $aPrerequisites = $oAttDef->GetPrerequisiteAttributes(); - if ($iOptions & (OPT_ATT_MANDATORY | OPT_ATT_MUSTCHANGE | OPT_ATT_MUSTPROMPT)) + if ($sAttCode != 'finalclass') // Do not displa the attribute that stores the actual class name { - $aFields[$sAttCode] = array(); - foreach($aPrerequisites as $sCode) + $oAttDef = MetaModel::GetAttributeDef($this->m_sClass, $sAttCode); + $sAttLabel = $oAttDef->GetLabel(); + $iOptions = isset($aStates[$this->m_sTargetState]['attribute_list'][$sAttCode]) ? $aStates[$this->m_sTargetState]['attribute_list'][$sAttCode] : 0; + + $aPrerequisites = $oAttDef->GetPrerequisiteAttributes(); + if ($iOptions & (OPT_ATT_MANDATORY | OPT_ATT_MUSTCHANGE | OPT_ATT_MUSTPROMPT)) { - $aFields[$sAttCode][$sCode] = ''; + $aFields[$sAttCode] = array(); + foreach($aPrerequisites as $sCode) + { + $aFields[$sAttCode][$sCode] = ''; + } } + if (count($aPrerequisites) > 0) + { + $aOptions[] = 'Prerequisites: '.implode(', ', $aPrerequisites); + } + + $sFieldFlag = ($iOptions & (OPT_ATT_MANDATORY | OPT_ATT_MUSTCHANGE)) ? ' *' : ''; + $oDefaultValuesSet = $oAttDef->GetDefaultValue(); // @@@ TO DO: get the object's current value if the object exists + $sHTMLValue = cmdbAbstractObject::GetFormElementForField($this->m_oPage, $this->m_sClass, $sAttCode, $oAttDef, $oDefaultValuesSet, '', "att_$iMaxInputId"); + $aFieldsMap[$iMaxInputId] = $sAttCode; + $aDetails[] = array('label' => $oAttDef->GetLabel().$sFieldFlag, 'value' => "
$sHTMLValue
"); + if ($oAttDef->GetValuesDef() != null) + { + $sJSHandlerCode .= "\toWizardHelper.RequestAllowedValues('$sAttCode');\n"; + } + if ($oAttDef->GetDefaultValue() != null) + { + $sJSHandlerCode .= "\toWizardHelper.RequestDefaultValue('$sAttCode');\n"; + } + if ($oAttDef->IsLinkSet()) + { + $sJSHandlerCode .= "\toLinkWidgetatt_$iMaxInputId.Init();"; + } + $iMaxInputId++; } - if (count($aPrerequisites) > 0) - { - $aOptions[] = 'Prerequisites: '.implode(', ', $aPrerequisites); - } - - $sFieldFlag = ($iOptions & (OPT_ATT_MANDATORY | OPT_ATT_MUSTCHANGE)) ? ' *' : ''; - $oDefaultValuesSet = $oAttDef->GetDefaultValue(); // @@@ TO DO: get the object's current value if the object exists - $sHTMLValue = cmdbAbstractObject::GetFormElementForField($this->m_oPage, $this->m_sClass, $sAttCode, $oAttDef, $oDefaultValuesSet, '', "att_$iMaxInputId"); - $aFieldsMap[$iMaxInputId] = $sAttCode; - $aDetails[] = array('label' => $oAttDef->GetLabel().$sFieldFlag, 'value' => "
$sHTMLValue
"); - if ($oAttDef->GetValuesDef() != null) - { - $sJSHandlerCode .= "\toWizardHelper.RequestAllowedValues('$sAttCode');\n"; - } - if ($oAttDef->GetDefaultValue() != null) - { - $sJSHandlerCode .= "\toWizardHelper.RequestDefaultValue('$sAttCode');\n"; - } - if ($oAttDef->IsLinkSet()) - { - $sJSHandlerCode .= "\toLinkWidgetatt_$iMaxInputId.Init();"; - } - $iMaxInputId++; } //$aDetails[] = array('label' => '', 'value' => ''); $this->m_oPage->details($aDetails); diff --git a/business/templates/Circuits.html b/business/templates/Circuits.html index c3de83c89..f04fe3a87 100644 --- a/business/templates/Circuits.html +++ b/business/templates/Circuits.html @@ -1,6 +1,6 @@ diff --git a/business/templates/application.html b/business/templates/application.html index 4e3c7575e..f934b7b48 100644 --- a/business/templates/application.html +++ b/business/templates/application.html @@ -1,6 +1,6 @@ diff --git a/business/templates/change.html b/business/templates/change.html index 694b26fd6..f2bcd67d7 100644 --- a/business/templates/change.html +++ b/business/templates/change.html @@ -1,6 +1,6 @@ diff --git a/business/templates/contract.html b/business/templates/contract.html index 574c6e37e..110fcdb0e 100644 --- a/business/templates/contract.html +++ b/business/templates/contract.html @@ -1,6 +1,6 @@ diff --git a/business/templates/default.html b/business/templates/default.html index 238a714d8..564b009b5 100644 --- a/business/templates/default.html +++ b/business/templates/default.html @@ -1,6 +1,6 @@ diff --git a/business/templates/document.html b/business/templates/document.html index 470559e8f..cd40cfe78 100644 --- a/business/templates/document.html +++ b/business/templates/document.html @@ -1,6 +1,6 @@ diff --git a/business/templates/group.html b/business/templates/group.html index 11bc83845..fca5fb154 100644 --- a/business/templates/group.html +++ b/business/templates/group.html @@ -1,6 +1,6 @@ diff --git a/business/templates/interface.html b/business/templates/interface.html index 3f1fe7f95..ffa8c7495 100644 --- a/business/templates/interface.html +++ b/business/templates/interface.html @@ -1,6 +1,6 @@ diff --git a/business/templates/knownError.html b/business/templates/knownError.html index 3c321384d..75bcc9eaf 100644 --- a/business/templates/knownError.html +++ b/business/templates/knownError.html @@ -1,6 +1,6 @@ bizKnownError: pkey = $pkey$ diff --git a/business/templates/location.html b/business/templates/location.html index af2df49e0..748ccd739 100644 --- a/business/templates/location.html +++ b/business/templates/location.html @@ -1,6 +1,6 @@ diff --git a/business/templates/network.device.html b/business/templates/network.device.html index cb3a32385..01085e2ec 100644 --- a/business/templates/network.device.html +++ b/business/templates/network.device.html @@ -1,6 +1,6 @@ diff --git a/business/templates/pc.html b/business/templates/pc.html index 55597a4ac..9323a913d 100644 --- a/business/templates/pc.html +++ b/business/templates/pc.html @@ -1,6 +1,6 @@ diff --git a/business/templates/person.html b/business/templates/person.html index 9bc09ad33..567f7b543 100644 --- a/business/templates/person.html +++ b/business/templates/person.html @@ -1,6 +1,6 @@ diff --git a/business/templates/server.html b/business/templates/server.html index f6f5793ed..98185836b 100644 --- a/business/templates/server.html +++ b/business/templates/server.html @@ -1,6 +1,6 @@ diff --git a/business/templates/service.html b/business/templates/service.html index 747ab187a..7e6443eba 100644 --- a/business/templates/service.html +++ b/business/templates/service.html @@ -1,6 +1,6 @@ diff --git a/business/templates/software.html b/business/templates/software.html index ee51b9651..3f690daad 100644 --- a/business/templates/software.html +++ b/business/templates/software.html @@ -1,6 +1,6 @@ diff --git a/business/templates/team.html b/business/templates/team.html index 05e0ec2d2..7e1e5cd6e 100644 --- a/business/templates/team.html +++ b/business/templates/team.html @@ -1,6 +1,6 @@ diff --git a/business/templates/ticket.html b/business/templates/ticket.html index 1c034cc7b..425c92840 100644 --- a/business/templates/ticket.html +++ b/business/templates/ticket.html @@ -1,6 +1,6 @@ diff --git a/core/userrights.class.inc.php b/core/userrights.class.inc.php index b62c8a042..01428ae73 100644 --- a/core/userrights.class.inc.php +++ b/core/userrights.class.inc.php @@ -176,7 +176,7 @@ class UserRights public static function GetFilter($sClass) { - if (!MetaModel::HasCategory($sClass, 'bizModel')) return new DBObjectSearch($sClass); + if (!MetaModel::HasCategory($sClass, 'bizmodel')) return new DBObjectSearch($sClass); if (!self::CheckLogin()) return false; return self::$m_oAddOn->GetFilter(self::$m_iUserId, $sClass); @@ -184,7 +184,7 @@ class UserRights public static function IsActionAllowed($sClass, $iActionCode, dbObjectSet $aInstances) { - if (!MetaModel::HasCategory($sClass, 'bizModel')) return true; + if (!MetaModel::HasCategory($sClass, 'bizmodel')) return true; if (!self::CheckLogin()) return false; return self::$m_oAddOn->IsActionAllowed(self::$m_iUserId, $sClass, $iActionCode, $aInstances); @@ -192,7 +192,7 @@ class UserRights public static function IsStimulusAllowed($sClass, $sStimulusCode, dbObjectSet $aInstances) { - if (!MetaModel::HasCategory($sClass, 'bizModel')) return true; + if (!MetaModel::HasCategory($sClass, 'bizmodel')) return true; if (!self::CheckLogin()) return false; return self::$m_oAddOn->IsStimulusAllowed(self::$m_iUserId, $sClass, $sStimulusCode, $aInstances); @@ -200,7 +200,7 @@ class UserRights public static function IsActionAllowedOnAttribute($sClass, $sAttCode, $iActionCode, dbObjectSet $aInstances) { - if (!MetaModel::HasCategory($sClass, 'bizModel')) return true; + if (!MetaModel::HasCategory($sClass, 'bizmodel')) return true; if (!self::CheckLogin()) return false; return self::$m_oAddOn->IsActionAllowedOnAttribute(self::$m_iUserId, $sClass, $sAttCode, $iActionCode, $aInstances); diff --git a/pages/UI.php b/pages/UI.php index 3b77f4ce7..48bd6081b 100644 --- a/pages/UI.php +++ b/pages/UI.php @@ -243,22 +243,17 @@ switch($operation) $oP->add_linked_script("../js/jquery.blockUI.js"); $oWizard = new UIWizard($oP, $sClass, $sStateCode); $sStateCode = $oWizard->GetTargetState(); // Will computes the default state if none was supplied + $sClassLabel = MetaModel::GetName($sClass); + $oP->p("

Creation of a new $sClassLabel

"); if (!empty($sStateCode)) { $aStates = MetaModel::EnumStates($sClass); $sStateLabel = $aStates[$sStateCode]['label']; - $oP->p("Wizard for creating an object of class '$sClass' in state '$sStateCode'."); - } - else - { - // Stateless object - $oP->p("Wizard for creating an object of class '$sClass'."); } $aWizardSteps = $oWizard->GetWizardStructure(); // Display the structure of the wizard $iStepIndex = 1; - $oP->p("

Wizard Steps for creating an object of class '$sClass' in state '$sStateCode'

\n"); $iMaxInputId = 0; $aFieldsMap = array(); foreach($aWizardSteps['mandatory'] as $aSteps) diff --git a/pages/opensearch.xml b/pages/opensearch.xml deleted file mode 100644 index 2620b2d1f..000000000 --- a/pages/opensearch.xml +++ /dev/null @@ -1,8 +0,0 @@ - -iTop -webmaster@itop.com -Recherche dans iTop -ISO-8859-1 - -http://localhost:81/pages/UI.php - \ No newline at end of file diff --git a/pages/schema.php b/pages/schema.php index ef06f230f..f3a4ba52e 100644 --- a/pages/schema.php +++ b/pages/schema.php @@ -160,7 +160,7 @@ function DisplayLifecycle($oPage, $sClass) { $aStates = MetaModel::EnumStates($sClass); $aStimuli = MetaModel::EnumStimuli($sClass); - $oPage->add("\n"); + $oPage->add("\n"); $oPage->add("

Transitions

\n"); $oPage->add("