diff --git a/pages/audit.php b/pages/audit.php
index ed952ebbff..72109d1649 100644
--- a/pages/audit.php
+++ b/pages/audit.php
@@ -9,14 +9,22 @@ use Combodo\iTop\Application\UI\Base\Component\Button\ButtonUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Dashlet\DashletContainer;
use Combodo\iTop\Application\UI\Base\Component\Dashlet\DashletFactory;
use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableUIBlockFactory;
+use Combodo\iTop\Application\UI\Base\Component\Field\FieldUIBlockFactory;
+use Combodo\iTop\Application\UI\Base\Component\Html\Html;
+use Combodo\iTop\Application\UI\Base\Component\Input\InputUIBlockFactory;
+use Combodo\iTop\Application\UI\Base\Component\Input\Select\SelectOptionUIBlockFactory;
+use Combodo\iTop\Application\UI\Base\Component\Input\Select\SelectUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Panel\Panel;
use Combodo\iTop\Application\UI\Base\Component\Text\Text;
use Combodo\iTop\Application\UI\Base\Component\Title\TitleUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardColumn;
use Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardRow;
+use Combodo\iTop\Application\UI\Base\Layout\UIContentBlockUIBlockFactory;
use Combodo\iTop\Application\WebPage\CSVPage;
use Combodo\iTop\Application\WebPage\ErrorPage;
use Combodo\iTop\Application\WebPage\iTopWebPage;
+use Combodo\iTop\Core\MetaModel\FriendlyNameType;
+use Combodo\iTop\Form\Field\SelectObjectField;
/**
* Adds the context parameters to the audit rule query
@@ -97,11 +105,11 @@ function FilterByContext(DBSearch &$oFilter, ApplicationContext $oAppContext)
* @throws \CoreException
* @throws \OQLException
*/
-function GetRuleResultFilter($iRuleId, $oDefinitionFilter, $oAppContext)
+function GetRuleResultFilter($iRuleId, $oDefinitionFilter, $oAppContext, $aParams = [])
{
$oRule = MetaModel::GetObject('AuditRule', $iRuleId);
$sOql = $oRule->Get('query');
- $oRuleFilter = DBObjectSearch::FromOQL($sOql);
+ $oRuleFilter = DBObjectSearch::FromOQL($sOql, $aParams);
$oRuleFilter->UpdateContextFromUser();
FilterByContext($oRuleFilter, $oAppContext); // Not needed since this filter is a subset of the definition filter, but may speedup things
@@ -143,6 +151,322 @@ function GetRuleResultFilter($iRuleId, $oDefinitionFilter, $oAppContext)
return $oFilter;
}
+function MakeSelectField($oPage, string $sLabel, string $sFieldName, string $sOql, string $sCurrentValue)
+{
+ $oSearch = DBObjectSearch::FromOQL($sOql);
+ $oAllowedValues = new DBObjectSet($oSearch);
+ $oAllowedValues->SetShowObsoleteData(utils::ShowObsoleteData());
+ $iMaxComboLength = MetaModel::GetConfig()->Get('max_combo_length');
+
+ $bIsAutocomplete = $oAllowedValues->CountExceeds($iMaxComboLength);
+ $sWrapperCssClass = $bIsAutocomplete ? 'ibo-input-select-autocomplete-wrapper' : 'ibo-input-select-wrapper';
+ $sHTMLValue = "
";
+
+ return new Html( $sHTMLValue);
+}
try
{
require_once('../approot.inc.php');
@@ -152,6 +476,11 @@ try
$bSelectionAuditRulesByDefault = utils::GetConfig()->Get('audit.enable_selection_landing_page');
$operation = utils::ReadParam('operation', $bSelectionAuditRulesByDefault ? 'selection' : 'audit');
+ $aAuditFilter = utils::GetConfig()->Get('audit.filter');
+ if ($aAuditFilter == null){
+ $aAuditFilter = [];
+ }
+
$oAppContext = new ApplicationContext();
require_once(APPROOT.'/application/loginwebpage.class.inc.php');
@@ -267,7 +596,38 @@ try
$oP->AddUiBlock($oButton);
}
$oP->AddUiBlock(TitleUIBlockFactory::MakeForPage(Dict::S('UI:Audit:Interactive:Selection:Title')));
- $oP->AddUiBlock(new Text(Dict::S('UI:Audit:Interactive:Selection:SubTitle')));
+
+ if($aAuditFilter !=[] ){
+
+ $oP->AddUiBlock(new Text(Dict::S('UI:Audit:Interactive:Selection:SubTitleParams')));
+ foreach ($aAuditFilter as $sFieldName => $aFieldParam) {
+
+ $oBlock = FieldUIBlockFactory::MakeStandard($aFieldParam['label']);
+ $oBlock->SetAttLabel($aFieldParam['label'])
+ ->AddDataAttribute("input-id", $sFieldName)
+ ->AddDataAttribute("input-type", 'input-type');
+ $oValue = UIContentBlockUIBlockFactory::MakeStandard("", ["form-field-content", "ibo-input-field-wrapper"]);
+
+ $sCurrentValue = utils::ReadParam($sFieldName, '');
+
+ if (array_key_exists('oql', $aFieldParam) && utils::IsNotNullOrEmptyString($aFieldParam['oql'])) {
+ $oValue->AddSubBlock(MakeSelectField( $oP, $aFieldParam['label'], $sFieldName, $aFieldParam['oql'], $sCurrentValue));
+ } else {//this is a list of values
+ $aListValues = $aFieldParam['values'];
+ $oSelect = SelectUIBlockFactory::MakeForSelect($sFieldName, $sFieldName);
+ $oSelect->AddCSSClass('ibo-input-field-wrapper');
+
+ foreach($aListValues as $sKey => $sValue) {
+ $oSelect->AddOption(SelectOptionUIBlockFactory::MakeForSelectOption($sKey, $sValue, ($sCurrentValue == $sKey)));
+ }
+
+ $oValue->AddSubBlock($oSelect);
+ }
+ $oBlock->AddSubBlock($oValue);
+ $oP->AddUiBlock($oBlock);
+ }
+ }
+ $oP->AddUiBlock(new Text(Dict::S('UI:Audit:Interactive:Selection:SubTitle')));
// Header block to select all audit categories
$oCategoriesSet = new DBObjectSet(new DBObjectSearch('AuditCategory'));
@@ -278,11 +638,23 @@ try
$oDashboardColumn = new DashboardColumn(false, true);
$oDashboardRow->AddDashboardColumn($oDashboardColumn);
$oAllCategoriesDashlet = new DashletContainer();
+
+ $sDomainUrl = utils::GetAbsoluteUrlAppRoot()."pages/audit.php?operation=audit";
+ if($aAuditFilter !=[] ) {
+ //modif URLLink In order to send params
+ $sGetParams = '';
+ foreach ($aAuditFilter as $sFieldName => $aFieldParam) {
+ $sGetParams .= $sFieldName."=$('[name=$sFieldName]').val();";
+ $sDomainUrl .= "&".$sFieldName."='+$sFieldName+'";
+ }
+ $sDomainUrl = 'javascript:'.$sGetParams.' window.location = \''.$sDomainUrl.'\'';
+ }
+
$oAllCategoriesDashlet
->AddCSSClasses(['ibo-dashlet--is-inline', 'ibo-dashlet-badge'])
->AddSubBlock(DashletFactory::MakeForDashletBadge(
utils::GetAbsoluteUrlAppRoot().'images/icons/icons8-audit.svg',
- utils::GetAbsoluteUrlAppRoot()."pages/audit.php?operation=audit",
+ $sDomainUrl,
$iCategoryCount,
Dict::S('UI:Audit:Interactive:Selection:BadgeAll')
));
@@ -311,6 +683,17 @@ try
$sIconUrl = $oImage->GetDisplayURL(get_class($oAuditDomain), $oAuditDomain->GetKey(), 'icon');
}
$iCategoryCount = $oAuditDomain->Get('categories_list')->Count();
+
+ if($aAuditFilter !=[] ) {
+ //modif URLLink In order to send params
+ $sGetParams = '';
+ foreach ($aAuditFilter as $sFieldName => $aFieldParam) {
+ $sGetParams .= $sFieldName."=$('[name=$sFieldName]').val();";
+ $sDomainUrl .= "&".$sFieldName."=$sFieldName'+'";
+ }
+ $sDomainUrl = 'javascript:'.$sGetParams.' window.location = \''.$sDomainUrl.'\'';
+ }
+
$oDomainBlock = DashletFactory::MakeForDashletBadge($sIconUrl, $sDomainUrl, $iCategoryCount, $oAuditDomain->Get('name'));
$oDomainDashlet = new DashletContainer();
$oDomainDashlet->AddSubBlock($oDomainBlock)->AddCSSClasses(['ibo-dashlet--is-inline', 'ibo-dashlet-badge']);
@@ -355,6 +738,32 @@ try
$oBackButton = ButtonUIBlockFactory::MakeLinkNeutral("./audit.php?".$oAppContext->GetForLink(), Dict::S('UI:Audit:Interactive:Button:Back'), 'fas fa-chevron-left');
$oP->AddUiBlock($oBackButton);
$oP->AddUiBlock(TitleUIBlockFactory::MakeForPage($sTitle));
+
+
+ $aFilterParams = [];
+ if($aAuditFilter !=[] ){
+ $sFilterText = Dict::S('UI:Audit:Interactive:FilterList') .'';
+
+ foreach ($aAuditFilter as $sFieldName => $aFieldParam) {
+ $sCurrentValue = utils::ReadParam($sFieldName, '');
+ $aFilterParams[$sFieldName] = $sCurrentValue;
+ IssueLog::Error($sFieldName.':'.$sCurrentValue);
+ $sName = '';
+ if (array_key_exists('oql', $aFieldParam) && utils::IsNotNullOrEmptyString($aFieldParam['oql'])) {
+ $oSearch = new DBObjectSet(DBObjectSearch::FromOQL($aFieldParam['oql']));
+ $sClass = $oSearch->GetClass();
+ $oObject = MetaModel::GetObject($sClass, $sCurrentValue);
+ $sName = $oObject->GetName();
+ } else {//this is a list of values
+ $sName = $aFieldParam['values'][$sCurrentValue];
+ }
+
+ $sFilterText .= '- '.$aFieldParam['label'].': '.$sName.'
';
+ }
+ $oP->AddUiBlock(new Html($sFilterText.'
'));
+ }
+
+
$oP->AddUiBlock(new Text($sSubTitle));
$oTotalBlock = DashletFactory::MakeForDashletBadge(utils::GetAbsoluteUrlAppRoot().'images/icons/icons8-audit.svg', '#', 0, Dict::S('UI:Audit:Dashboard:ObjectsAudited'));
@@ -405,7 +814,8 @@ try
$aResults = array();
try {
$iCount = 0;
- $oDefinitionFilter = DBObjectSearch::FromOQL($oAuditCategory->Get('definition_set'));
+ IssueLog::Error('$aFilterParams'.json_encode($aFilterParams));
+ $oDefinitionFilter = DBObjectSearch::FromOQL($oAuditCategory->Get('definition_set'),$aFilterParams);
$oDefinitionFilter->UpdateContextFromUser();
FilterByContext($oDefinitionFilter, $oAppContext);
@@ -415,10 +825,16 @@ try
$oDefinitionFilter->AddCondition('org_id', $currentOrganization, '=');
}
}
+ IssueLog::Error('Filtre: '.$oDefinitionFilter->ToOQL(true));
$oDefinitionSet = new CMDBObjectSet($oDefinitionFilter);
$iCount = $oDefinitionSet->Count();
$oRulesFilter = new DBObjectSearch('AuditRule');
$oRulesFilter->AddCondition('category_id', $oAuditCategory->GetKey(), '=');
+ foreach ($aFilterParams as $sFieldName => $sCurrentValue) {
+ $oRulesFilter->AddInternalParam($sFieldName, $sCurrentValue);
+ }
+
+ IssueLog::Error('2Filtre: '.$oRulesFilter->ToOQL(true));
$oRulesSet = new DBObjectSet($oRulesFilter);
while ($oAuditRule = $oRulesSet->fetch()) {
$aRow = array();
@@ -430,8 +846,9 @@ try
$aRow['class'] = $oAuditCategory->GetReportColor($iCount, 0);
} else {
try {
- $oFilter = GetRuleResultFilter($oAuditRule->GetKey(), $oDefinitionFilter, $oAppContext);
- $aErrors = $oFilter->SelectAttributeToArray('id');
+ $oFilter = GetRuleResultFilter($oAuditRule->GetKey(), $oDefinitionFilter, $oAppContext, $aFilterParams);
+ IssueLog::Error('3Filtre: '.$oFilter->ToOQL(true));
+ $aErrors = $oFilter->SelectAttributeToArray('id');
$iErrorsCount = count($aErrors);
foreach ($aErrors as $aErrorRow) {
$aObjectsWithErrors[$aErrorRow['id']] = true;