diff --git a/application/ui.linkswidget.class.inc.php b/application/ui.linkswidget.class.inc.php
index 820f8e74e..7ba5745c8 100644
--- a/application/ui.linkswidget.class.inc.php
+++ b/application/ui.linkswidget.class.inc.php
@@ -402,11 +402,10 @@ EOF
{
$oFilter->AddCondition('id', $aAlreadyLinkedIds, 'NOTIN');
}
- //$this->SetSearchDefaultFromContext($oCurrentObj, $oFilter);
+ $this->SetSearchDefaultFromContext($oCurrentObj, $oFilter);
$oBlock = new DisplayBlock($oFilter, 'search', false);
$sHtml .= $oBlock->GetDisplay($oPage, "SearchFormToAdd_{$this->m_sAttCode}{$this->m_sNameSuffix}",
array(
- 'menu' => false,
'open' => $bOpen,
'table_id' => "SearchResultsToAdd_{$this->m_sAttCode}{$this->m_sNameSuffix}",
'table_id2' => 'add_'.$this->m_sAttCode,
@@ -415,14 +414,14 @@ EOF
'json' => $sJson,
'cssCount' => '#count_'.$this->m_sAttCode.$this->m_sNameSuffix
));
- $sHtml .= "
\n";
- $sHtml .= "\n";
+ $sHtml .= "\n";
$oPage->add($sHtml);
$oPage->add_ready_script("$('#dlg_{$this->m_sAttCode}{$this->m_sNameSuffix}').dialog({ width: $(window).width()*0.8, height: $(window).height()*0.8, autoOpen: false, modal: true, resizeStop: oWidget{$this->m_iInputId}.UpdateSizes });");
$oPage->add_ready_script("$('#dlg_{$this->m_sAttCode}{$this->m_sNameSuffix}').dialog('option', {title:'".addslashes(Dict::Format('UI:AddObjectsOf_Class_LinkedWith_Class', MetaModel::GetName($this->m_sLinkedClass), MetaModel::GetName($this->m_sClass)))."'});");
@@ -436,7 +435,7 @@ EOF
* @param string $sRemoteClass Name of the "remote" class to perform the search on, must be a derived class of m_sRemoteClass
* @param Array $aAlreadyLinkedIds List of IDs of objects of "remote" class already linked, to be filtered out of the search
*/
- public function SearchObjectsToAdd(WebPage $oP, $sRemoteClass = '', $aAlreadyLinkedIds = array())
+ public function SearchObjectsToAdd(WebPage $oP, $sRemoteClass = '', $aAlreadyLinkedIds = array(), $oCurrentObj = null)
{
if ($sRemoteClass != '')
{
@@ -452,6 +451,7 @@ EOF
{
$oFilter->AddCondition('id', $aAlreadyLinkedIds, 'NOTIN');
}
+ $this->SetSearchDefaultFromContext($oCurrentObj, $oFilter);
$oBlock = new DisplayBlock($oFilter, 'list', false);
$oBlock->Display($oP, "ResultsToAdd_{$this->m_sAttCode}", array('menu' => false, 'cssCount'=> '#count_'.$this->m_sAttCode.$this->m_sNameSuffix , 'selection_mode' => true, 'table_id' => 'add_'.$this->m_sAttCode)); // Don't display the 'Actions' menu on the results
}
diff --git a/js/linkswidget.js b/js/linkswidget.js
index 4eb277aaa..c84121ad2 100644
--- a/js/linkswidget.js
+++ b/js/linkswidget.js
@@ -101,17 +101,28 @@ function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix, bDuplicates, oWizH
operation: 'addObjects',
json: me.oWizardHelper.ToJSON()
};
- $.post( GetAbsoluteUrlAppRoot()+'pages/ajax.render.php', theMap,
- function(data)
- {
- $('#dlg_'+me.id).html(data);
- $('#dlg_'+me.id).dialog('open');
- me.UpdateSizes(null, null);
- me.SearchObjectsToAdd();
- $('#'+me.id+'_indicatorAdd').html('');
- },
- 'html'
- );
+
+ // Gather the already linked target objects
+ theMap.aAlreadyLinked = [];
+ $('#linkedset_'+me.id+' .selection:input').each(function (i) {
+ var iRemote = $(this).attr('data-remote-id');
+ theMap.aAlreadyLinked.push(iRemote);
+ });
+
+ $.ajax({
+ "url": GetAbsoluteUrlAppRoot()+'pages/ajax.render.php',
+ "method": "POST",
+ "data": theMap,
+ "dataType": "html"
+ })
+ .done(function (data) {
+ $('#dlg_'+me.id).html(data);
+ $('#dlg_'+me.id).dialog('open');
+ me.UpdateSizes(null, null);
+ me.SearchObjectsToAdd();
+ $('#'+me.id+'_indicatorAdd').html('');
+ })
+ ;
};
this.SearchObjectsToAdd = function()
diff --git a/pages/ajax.searchform.php b/pages/ajax.searchform.php
index 92ea6071f..113f21f66 100644
--- a/pages/ajax.searchform.php
+++ b/pages/ajax.searchform.php
@@ -40,7 +40,7 @@ try
throw new SecurityException('You must be logged in');
}
- $sParams = stripslashes(utils::ReadParam('params', '', false, 'raw_data'));
+ $sParams = utils::ReadParam('params', '', false, 'raw_data');
if (!$sParams)
{
throw new AjaxSearchException("Invalid query (empty filter)", 400);
@@ -54,7 +54,7 @@ try
$oFilter = CriterionParser::Parse($aParams['base_oql'], $aParams['criterion']);
$oDisplayBlock = new DisplayBlock($oFilter, 'list', false);
- $sListParams = stripslashes(utils::ReadParam('list_params', '{}', false, 'raw_data'));
+ $sListParams = utils::ReadParam('list_params', '{}', false, 'raw_data');
$aListParams = (array) json_decode($sListParams, true);
foreach($aListParams as $key => $value)
diff --git a/sources/application/search/criterionconversion/criteriontosearchform.class.inc.php b/sources/application/search/criterionconversion/criteriontosearchform.class.inc.php
index 5389f3d2e..24ce40b57 100644
--- a/sources/application/search/criterionconversion/criteriontosearchform.class.inc.php
+++ b/sources/application/search/criterionconversion/criteriontosearchform.class.inc.php
@@ -68,13 +68,30 @@ class CriterionToSearchForm extends CriterionConversionAbstract
}
}
- // Regroup criterion by variable name
+ // Regroup criterion by variable name (no ref first)
usort($aAndCriterion, function ($a, $b) {
- $iRefCmp = strcmp($a['ref'], $b['ref']);
- if ($iRefCmp != 0) return $iRefCmp;
- $iOpCmp = strcmp($a['operator'], $b['operator']);
+ if (array_key_exists('ref', $a) || array_key_exists('ref', $b))
+ {
+ if (array_key_exists('ref', $a) && array_key_exists('ref', $b))
+ {
+ $iRefCmp = strcmp($a['ref'], $b['ref']);
+ if ($iRefCmp != 0) return $iRefCmp;
- return $iOpCmp;
+ return strcmp($a['operator'], $b['operator']);
+ }
+ if (array_key_exists('ref', $a))
+ {
+ return 1;
+ }
+
+ return -1;
+ }
+ if (array_key_exists('oql', $a) && array_key_exists('oql', $b))
+ {
+ return strcmp($a['oql'], $b['oql']);
+ }
+
+ return 0;
});
$aMergeFctByWidget = array(
@@ -88,16 +105,20 @@ class CriterionToSearchForm extends CriterionConversionAbstract
{
if (!is_null($aPrevCriterion))
{
- if (strcmp($aPrevCriterion['ref'], $aCurrCriterion['ref']) == 0)
+ if (array_key_exists('ref', $aPrevCriterion))
{
- // Same attribute, try to merge
- if (array_key_exists('widget', $aCurrCriterion))
+ // If previous has ref, the current has ref as the array is sorted with all without ref first
+ if (strcmp($aPrevCriterion['ref'], $aCurrCriterion['ref']) == 0)
{
- if (array_key_exists($aCurrCriterion['widget'], $aMergeFctByWidget))
+ // Same attribute, try to merge
+ if (array_key_exists('widget', $aCurrCriterion))
{
- $sFct = $aMergeFctByWidget[$aCurrCriterion['widget']];
- $aPrevCriterion = self::$sFct($aPrevCriterion, $aCurrCriterion, $aMergedCriterion);
- continue;
+ if (array_key_exists($aCurrCriterion['widget'], $aMergeFctByWidget))
+ {
+ $sFct = $aMergeFctByWidget[$aCurrCriterion['widget']];
+ $aPrevCriterion = self::$sFct($aPrevCriterion, $aCurrCriterion, $aMergedCriterion);
+ continue;
+ }
}
}
}
diff --git a/sources/application/search/searchform.class.inc.php b/sources/application/search/searchform.class.inc.php
index 96f8c903f..a62a3ddd2 100644
--- a/sources/application/search/searchform.class.inc.php
+++ b/sources/application/search/searchform.class.inc.php
@@ -88,7 +88,7 @@ class SearchForm
$sRootClass = $sClassName;
}
- $sJson = stripslashes(utils::ReadParam('json', '', false, 'raw_data'));
+ $sJson = utils::ReadParam('json', '', false, 'raw_data');
if (!empty($sJson))
{
$aListParams['json'] = json_decode($sJson, true);
@@ -119,7 +119,7 @@ class SearchForm
$sHtml .= "\n";
$aFields = $this->GetFields($oSet);
$oSearch = $oSet->GetFilter();