N°4232 - Order By error on query with two classes

This commit is contained in:
acognet
2021-08-16 09:53:19 +02:00
parent 8e3cc471df
commit 9d28e43804
3 changed files with 34 additions and 26 deletions

View File

@@ -217,7 +217,7 @@ EOF
$oP->AddSubBlock(TitleUIBlockFactory::MakeNeutral(Dict::S('UI:RunQuery:QueryResults'), 2));
$oResultBlock = new DisplayBlock($oFilter, 'list', false);
$oResultBlock->Display($oP, 'runquery');
$oP->AddSubBlock($oResultBlock->GetDisplay($oP, 'runquery'));
// Breadcrumb
//$iCount = $oResultBlock->GetDisplayedCount();
@@ -235,8 +235,7 @@ EOF
}
}
$sUrl = utils::GetAbsoluteUrlAppRoot().'pages/run_query.php?'.implode('&', $aArgs);
$oP->SetBreadCrumbEntry($sPageId, $sLabel, $oFilter->ToOQL(true), $sUrl, 'fas fa-terminal',
iTopWebPage::ENUM_BREADCRUMB_ENTRY_ICON_TYPE_CSS_CLASSES);
$oP->SetBreadCrumbEntry($sPageId, $sLabel, $oFilter->ToOQL(true), $sUrl, 'fas fa-terminal', iTopWebPage::ENUM_BREADCRUMB_ENTRY_ICON_TYPE_CSS_CLASSES);
//--- More info
@@ -319,12 +318,7 @@ EOF
$sEscapedExpression = utils::EscapeHtml(addslashes($sFixedExpression));
$oUseSuggestedQueryButton = ButtonUIBlockFactory::MakeForDestructiveAction('Use this query');
$oUseSuggestedQueryButton->SetOnClickJsCode(<<<JS
let \$oQueryTextarea = $('textarea[name=expression]');
\$oQueryTextarea.val('$sEscapedExpression').focus();
\$oQueryTextarea.closest('form').submit();
JS
);
$oUseSuggestedQueryButton->SetOnClickJsCode("let \$oQueryTextarea = $('textarea[name=expression]');\$oQueryTextarea.val('$sEscapedExpression').focus();\$oQueryTextarea.closest('form').submit();");
$oSyntaxErrorPanel->AddSubBlock($oUseSuggestedQueryButton);
} else {
$oSyntaxErrorPanel->AddSubBlock(HtmlFactory::MakeParagraph($e->getHtmlDesc()));

View File

@@ -343,8 +343,8 @@ class AjaxRenderController
$sIdName = $sAlias."/_key_";
}
if ($iSortCol == $iSortIndex) {
if (!MetaModel::HasChildrenClasses($oFilter->GetClass())) {
$aNameSpec = MetaModel::GetNameSpec($oFilter->GetClass());
if (!MetaModel::HasChildrenClasses($sClassName)) {
$aNameSpec = MetaModel::GetNameSpec($sClassName);
if ($aNameSpec[0] == '%1$s') {
// The name is made of a single column, let's sort according to the sort algorithm for this column
$aOrderBy[$sAlias.'.'.$aNameSpec[1][0]] = ($sSortOrder == 'asc');

View File

@@ -574,28 +574,22 @@ class DataTableUIBlockFactory extends AbstractUIBlockFactory
foreach ($aAuthorizedClasses as $sClassAlias => $sClassName) {
if (isset($oCustomSettings->aColumns[$sClassAlias])) {
foreach ($oCustomSettings->aColumns[$sClassAlias] as $sAttCode => $aData) {
if ($aData['sort'] != 'none') {
$sCode = ($aData['code'] == '_key_') ? 'friendlyname' : $aData['code'];
$aSortOrder[$sAlias.$sCode] = ($aData['sort'] == 'asc'); // true for ascending, false for descending
$aSortDatable = [$iIndexColumn, $aData['sort']];
if ($aData['sort'] != 'none' && $aSortDatable == []) {
$aSortDatable = [$index, $aData['sort']];
}
if ($aData['checked']) {
if ($sAttCode == '_key_') {
if ($bViewLink) {
if (MetaModel::IsValidAttCode($sClassName, 'obsolescence_flag')) {
$sRender = "let displayField = '<span class=\"object-ref\" title=\"".$sClassAlias."::'+data+'\"><a class=\'object-ref-link\' href=\'".$oAppRoot."/pages/UI.php?operation=details&class=".$sClassName."&id='+data+'\'>'+row['".$sClassAlias."/friendlyname']+'</a></span>'; if (row['".$sClassAlias."/obsolescence_flag'].indexOf('no') == -1){displayField = '<span class=\"object-ref obsolete\" title=\"obsolete\"><span class=\"object-ref-icon text_decoration\"><span class=\"fas fa-eye-slash object-obsolete fa-1x fa-fw\"></span></span><a class=\'object-ref-link\' href=\'UI.php?operation=details&class=".$sClassName."&id='+data+'\'>'+row['".$sClassAlias."/friendlyname']+'</a></span>';} return displayField;";
} else {
$sRender = "let displayField = '<span class=\"object-ref\" title=\"".$sClassAlias."::'+data+'\"><a class=\'object-ref-link\' href=\'".$oAppRoot."/pages/UI.php?operation=details&class=".$sClassName."&id='+data+'\'>'+row['".$sClassAlias."/friendlyname']+'</a></span>'; return displayField;";
}
$sAttLabel = MetaModel::GetName($sClassName);
$aColumnDefinition[] = [
'description' => $aData['label'],
'object_class' => $sClassName,
'class_alias' => $sClassAlias,
'attribute_code' => $sAttCode,
'attribute_type' => '_key_',
'description' => $aData['label'],
'object_class' => $sClassName,
'class_alias' => $sClassAlias,
'attribute_code' => $sAttCode,
'attribute_type' => '_key_',
'attribute_label' => $sAttLabel,
"render" => "return row['".$sClassAlias."/hyperlink'];",
"render" => "return row['".$sClassAlias."/hyperlink'];",
];
}
} else {
@@ -825,6 +819,23 @@ class DataTableUIBlockFactory extends AbstractUIBlockFactory
return $aOptions;
}
/**
* @param string $sTitle
* @param array $aColumns
* @param array $aData
* @param string|null $sId
* @param array $aExtraParams
* @param string $sFilter
* @param array $aOptions
* *
* $aColumns =[
* 'nameField1' => ['label' => labelFIeld1, 'description' => descriptionField1],
* 'nameField2' => ['label' => labelFIeld2, 'description' => descriptionField2],
* 'nameField3' => ['label' => labelFIeld3, 'description' => descriptionField3]];
* $aData = [['nameField1' => valueField1, 'nameField2' => valueField2, 'nameField3' => valueField3],...]
*
* @return \Combodo\iTop\Application\UI\Base\Layout\UIContentBlock
*/
public static function MakeForStaticData(string $sTitle, array $aColumns, array $aData, ?string $sId = null, array $aExtraParams = [], string $sFilter = "", array $aOptions = [])
{
$oBlock = new UIContentBlock();
@@ -872,6 +883,9 @@ class DataTableUIBlockFactory extends AbstractUIBlockFactory
return $oTable;
}
/**
* @return array
*/
public static function GetAllowedParams(): array
{
return [