9use InvalidArgumentException;
117 private const DEFAULT_PRIORITY = -100;
119 private const RESERVED_NAME_CHAR =
'_';
148 if ( str_contains( $groupDefinition[
'name'], self::RESERVED_NAME_CHAR ) ) {
149 throw new InvalidArgumentException(
'Group names may not contain \'' .
150 self::RESERVED_NAME_CHAR .
151 '\'. Use the naming convention: \
'camelCase\''
155 $this->name = $groupDefinition[
'name'];
157 if ( isset( $groupDefinition[
'title'] ) ) {
158 $this->title = $groupDefinition[
'title'];
161 if ( isset( $groupDefinition[
'whatsThisHeader'] ) ) {
162 $this->whatsThisHeader = $groupDefinition[
'whatsThisHeader'];
163 $this->whatsThisBody = $groupDefinition[
'whatsThisBody'];
164 $this->whatsThisUrl = $groupDefinition[
'whatsThisUrl'];
165 $this->whatsThisLinkText = $groupDefinition[
'whatsThisLinkText'];
168 $this->type = $groupDefinition[
'type'];
169 $this->priority = $groupDefinition[
'priority'] ?? self::DEFAULT_PRIORITY;
171 $this->isFullCoverage = $groupDefinition[
'isFullCoverage'];
174 $lowestSpecifiedPriority = -1;
175 foreach ( $groupDefinition[
'filters'] as $filterDefinition ) {
176 if ( isset( $filterDefinition[
'priority'] ) ) {
177 $lowestSpecifiedPriority = min( $lowestSpecifiedPriority, $filterDefinition[
'priority'] );
185 $autoFillPriority = $lowestSpecifiedPriority - 1;
186 foreach ( $groupDefinition[
'filters'] as $filterDefinition ) {
187 if ( !isset( $filterDefinition[
'priority'] ) ) {
188 $filterDefinition[
'priority'] = $autoFillPriority;
191 $filterDefinition[
'group'] = $this;
194 $this->registerFilter( $filter );
228 public function conflictsWith( $other,
string $globalKey,
string $forwardKey,
string $backwardKey ) {
235 $other->setUnidirectionalConflict(
255 $this->conflictingGroups[] = [
256 'group' => $other->getName(),
257 'groupObject' => $other,
258 'globalDescription' => $globalDescription,
259 'contextDescription' => $contextDescription,
262 $this->conflictingFilters[] = [
263 'group' => $other->getGroup()->getName(),
264 'filter' => $other->getName(),
265 'filterObject' => $other,
266 'globalDescription' => $globalDescription,
267 'contextDescription' => $contextDescription,
270 throw new InvalidArgumentException(
271 'You can only pass in a ChangesListFilterGroup or a ChangesListFilter'
319 return $this->filters[
$name] ??
null;
340 if ( $this->whatsThisHeader !==
null ) {
347 $output[
'messageKeys'],
348 $output[
'whatsThisHeader'],
349 $output[
'whatsThisBody'],
350 $output[
'whatsThisLinkText']
358 foreach ( $this->filters as $filter ) {
359 if ( $filter->displaysOnStructuredUi() ) {
360 $filterData = $filter->getJsData();
361 $output[
'messageKeys'] = array_merge(
362 $output[
'messageKeys'],
363 $filterData[
'messageKeys']
365 unset( $filterData[
'messageKeys'] );
366 $output[
'filters'][] = $filterData;
370 if ( count( $output[
'filters'] ) === 0 ) {
376 $conflicts = array_merge(
377 $this->conflictingGroups,
378 $this->conflictingFilters
381 foreach ( $conflicts as $conflictInfo ) {
382 unset( $conflictInfo[
'filterObject'] );
383 unset( $conflictInfo[
'groupObject'] );
384 $output[
'conflicts'][] = $conflictInfo;
386 $output[
'messageKeys'],
387 $conflictInfo[
'globalDescription'],
388 $conflictInfo[
'contextDescription']
401 return array_column( $this->conflictingGroups,
'groupObject' );
410 return array_column( $this->conflictingFilters,
'filterObject' );
420 return (
bool)count( array_filter(
445 &$tables, &$fields, &$conds, &$query_options, &$join_conds,
460 $isStructuredFiltersEnabled
463 $action = $filter->getAction();
464 if ( $action !==
null ) {
465 if ( $filter->isActive( $opts, $isStructuredFiltersEnabled ) ) {
466 if ( is_array( $action[0] ) ) {
467 foreach ( $action as $singleAction ) {
476 $highlightAction = $filter->getHighlightAction();
477 if ( $filter->getCssClass() !==
null && $highlightAction ) {
479 if ( is_array( $highlightAction[0] ) ) {
480 foreach ( $highlightAction as $singleAction ) {
501 $isStructuredFiltersEnabled );
505class_alias( ChangesListFilterGroup::class,
'ChangesListFilterGroup' );
Special page which uses a ChangesList to show query results.