* Infolog - Exclude current entry from parent select/search results to avoid loop

This commit is contained in:
nathangray 2018-10-24 11:10:48 -06:00
parent 908ee59d1a
commit 2fc4caec71
3 changed files with 30 additions and 2 deletions

View File

@ -755,7 +755,7 @@ class Link extends Link\Storage
*
* @param string $app app to search
* @param string $pattern pattern to search
* @param array& $options passed to callback: type, start, num_rows, filter; on return value for "total"
* @param array& $options passed to callback: type, start, num_rows, filter, exclude; on return value for "total"
* @return array with $id => $title pairs of matching entries of app
*/
static function query($app, $pattern, &$options = array())
@ -778,6 +778,10 @@ class Link extends Link\Storage
{
$options['total'] = count($result);
}
if (isset($options['exclude']))
{
$result = array_diff_key($result, array_flip($options['exclude']));
}
if (is_array($result) && (isset($options['start']) || (isset($options['num_rows']) && count($result) > $options['num_rows'])))
{
$result = array_slice($result, $options['start'], (isset($options['num_rows']) ? $options['num_rows'] : count($result)), true);

View File

@ -648,6 +648,30 @@ app.classes.infolog = AppJS.extend(
}
},
/**
* Mess with the query for parent widget to exclude self
*
* @param {Object} request
* @param {et2_link_entry} widget
* @returns {boolean}
*/
parent_query: function(request, widget)
{
// No ID yet, no need to filter
if(!widget.getRoot().getArrayMgr('content').getEntry('info_id'))
{
return true;
}
if(!request.options)
{
request.options = {};
}
// Exclude self from results - no app needed since it's just one app
request.options.exclude = [widget.getRoot().getArrayMgr('content').getEntry('info_id')];
return true;
},
/**
* View a list of timesheets for the linked infolog entry
*

View File

@ -113,7 +113,7 @@
</row>
<row >
<description value="Parent" font_style="1"/>
<link-entry id="info_id_parent" onchange="if(egw &amp;&amp; widget) { if(widget._oldValue) window.opener.egw.dataStoreUID(egw.appName+&quot;::&quot;+widget._oldValue,false);window.opener.egw.dataStoreUID(egw.appName+&quot;::&quot;+widget.getValue(),false);}" options="infolog" class="et2_fullWidth"/>
<link-entry id="info_id_parent" onchange="if(egw &amp;&amp; widget) { if(widget._oldValue) window.opener.egw.dataStoreUID(egw.appName+&quot;::&quot;+widget._oldValue,false);window.opener.egw.dataStoreUID(egw.appName+&quot;::&quot;+widget.getValue(),false);}" options="infolog" class="et2_fullWidth" query="app.infolog.parent_query" />
</row>
<row class="row">
<description value="Priority" for="info_priority"/>