N°1000 - Portal: filter BrowseBrick result varies if in list or tree (#673)

* N°1000 - Portal: filter BrowseBrick result varies if in list or tree

* N°1000 - Portal: filter BrowseBrick result varies if in list or tree
- replace html separators by css class

* N°1000 - Portal: filter BrowseBrick result varies if in list or tree
- replace html separators by css class

* N°1000 - Portal: filter BrowseBrick result varies if in list or tree
- add alteration comment to Tree List Filter jQuery plugin 1.0
- remove display none to tree-item-filter-data
This commit is contained in:
Benjamin Dalsass
2024-11-12 11:02:43 +01:00
committed by GitHub
parent 9b1e854bf7
commit 6b5273fa1c
5 changed files with 78 additions and 1 deletions

File diff suppressed because one or more lines are too long

View File

@@ -821,6 +821,23 @@ table .group-actions .item-action-wrapper .panel-body > p:last-child{
font-size: 1em;
}
/* tree list filter data */
.list-group-item .tree-item-wrapper .tree-item-filter-data{
padding-top: 8px;
color: $gray;
font-size: .9em;
}
/* tree list filter data span items */
.list-group-item .tree-item-wrapper .tree-item-filter-data span:not(:last-child):after{
content: '';
margin: 0 5px;
}
/* tree list filter data label span items */
.list-group-item .tree-item-wrapper .tree-item-filter-data .tree-item-filter-data-label{
font-weight: bold;
}
/****************************************************************/
/* - Mosaic mode */
/* */

View File

@@ -6,6 +6,11 @@
* Project Website: http://wiki.aiwsolutions.net/dOQKO
**/
/**
* Altered to allow filtering tree list with extra data.
* Add an attribute data-tree-additional-search to tree-item-wrapper element with extra data you want the search to include.
*/
jQuery.fn.treeListFilter = function(list, timeout, callback) {
var list = jQuery(list);
var input = this;
@@ -41,6 +46,7 @@ jQuery.fn.treeListFilter = function(list, timeout, callback) {
// Modified the search so it looks for each parts of the search and not the entire sentance
// Modified the text to remove accents (latinise())
var text = liObject.find('.tree-item-wrapper').text();
text+= liObject.find('.tree-item-wrapper').attr('data-tree-additional-search');
var textLC = text.toLowerCase().latinise();
var filterValues = filterValue.split(' ');
var display = true;

View File

@@ -26,11 +26,13 @@ use AttributeImage;
use AttributeSet;
use AttributeTagSet;
use Combodo\iTop\Portal\Brick\BrowseBrick;
use DBObject;
use DBSearch;
use Dict;
use MetaModel;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use UserRights;
use utils;
/**
* Class BrowseBrickHelper
@@ -514,6 +516,7 @@ class BrowseBrickHelper
'name' => $aCurrentRowValues[0]->Get($aLevelsProperties[$aCurrentRowKeys[0]]['name_att']),
'class' => get_class($aCurrentRowValues[0]),
'subitems' => array(),
'filter_data' => $this->GetFilterData($aLevelsProperties[$aCurrentRowKeys[0]], $aCurrentRowKeys[0], $aCurrentRowValues[0]),
'action_rules_token' => $this->PrepareActionRulesForItems($aCurrentRowObjects, $aCurrentRowKeys[0], $aLevelsProperties),
);
@@ -564,4 +567,49 @@ class BrowseBrickHelper
$this->AddToTreeItems($aItems[$sCurrentIndex]['subitems'], $aCurrentRowSliced, $aLevelsProperties, $aCurrentRowObjects);
}
}
/**
* Get data to allow filtering tree with invisible fields.
*
* @param array $aLevelProperties tree level properties
* @param string $sRowKey row key
* @param \DBObject $oRowValue row value
*
* @return string[]
* @throws \ArchivedObjectException
* @throws \CoreException
* @throws \Exception
*/
private function GetFilterData(array $aLevelProperties, string $sRowKey, DBObject $oRowValue) : array
{
// result
$sValues = "";
$sValuesAndCodes = "";
// iterate throw level properties fields...
foreach ($aLevelProperties['fields'] as $aField) {
// retrieve the object class
$sFieldObjectClass = get_class($oRowValue);
// retrieve the field object attribute definition
$oAttDef = MetaModel::GetAttributeDef($sFieldObjectClass, $aField['code']);
// get field value (HTML representation)
$sValue = $oAttDef->GetAsHTML($oRowValue->Get($aField['code']));
// do not print empty fields
if(!utils::IsNullOrEmptyString($sValue)){
// append to result
$sValues .= $sValue;
$sValuesAndCodes .= '<span><span class="tree-item-filter-data-label">' . $aField['label'] . ':</span> ' . $sValue . '</span>';
}
}
return [
'values' => $sValues,
'values_and_codes' => $sValuesAndCodes
];
}
}

View File

@@ -149,6 +149,9 @@
}
}
// hide/show tree items filter data when search input is empty/notEmpty
$('.tree-item-filter-data').toggle($('#brick_search_field').val() !== '');
expandAll();
};
// Load current node childnodes throught AJAX
@@ -197,10 +200,12 @@
var liElem = $('<li></li>').addClass('list-group-item');
var spanElem = $('<span></span>').addClass('tree-item-wrapper').attr('data-item-id', item.id).attr('data-level-alias', item.level_alias);
spanElem.attr('data-tree-additional-search', item['filter_data']['values']);
var nameElem = $('<a></a>').addClass('tree-item').text(item.name);
// Building node
$('ul[data-level-id="'+nodeId+'"]').append(liElem);
spanElem.append(nameElem);
spanElem.append('<div class="tree-item-filter-data">' + item['filter_data']['values_and_codes'] + '</div>');
liElem.append(spanElem);
// Delegating a click on <span> to its child <a> element