23use InvalidArgumentException;
130 private const DEFAULT_PRIORITY = -100;
132 private const RESERVED_NAME_CHAR =
'_';
161 if ( strpos( $groupDefinition[
'name'], self::RESERVED_NAME_CHAR ) !==
false ) {
162 throw new InvalidArgumentException(
'Group names may not contain \'' .
163 self::RESERVED_NAME_CHAR .
164 '\'. Use the naming convention: \
'camelCase\''
168 $this->name = $groupDefinition[
'name'];
170 if ( isset( $groupDefinition[
'title'] ) ) {
171 $this->title = $groupDefinition[
'title'];
174 if ( isset( $groupDefinition[
'whatsThisHeader'] ) ) {
175 $this->whatsThisHeader = $groupDefinition[
'whatsThisHeader'];
176 $this->whatsThisBody = $groupDefinition[
'whatsThisBody'];
177 $this->whatsThisUrl = $groupDefinition[
'whatsThisUrl'];
178 $this->whatsThisLinkText = $groupDefinition[
'whatsThisLinkText'];
181 $this->type = $groupDefinition[
'type'];
182 $this->priority = $groupDefinition[
'priority'] ?? self::DEFAULT_PRIORITY;
184 $this->isFullCoverage = $groupDefinition[
'isFullCoverage'];
187 $lowestSpecifiedPriority = -1;
188 foreach ( $groupDefinition[
'filters'] as $filterDefinition ) {
189 if ( isset( $filterDefinition[
'priority'] ) ) {
190 $lowestSpecifiedPriority = min( $lowestSpecifiedPriority, $filterDefinition[
'priority'] );
198 $autoFillPriority = $lowestSpecifiedPriority - 1;
199 foreach ( $groupDefinition[
'filters'] as $filterDefinition ) {
200 if ( !isset( $filterDefinition[
'priority'] ) ) {
201 $filterDefinition[
'priority'] = $autoFillPriority;
204 $filterDefinition[
'group'] = $this;
207 $this->registerFilter( $filter );
233 public function conflictsWith( $other,
string $globalKey,
string $forwardKey,
string $backwardKey ) {
240 $other->setUnidirectionalConflict(
260 $this->conflictingGroups[] = [
261 'group' => $other->getName(),
262 'groupObject' => $other,
263 'globalDescription' => $globalDescription,
264 'contextDescription' => $contextDescription,
267 $this->conflictingFilters[] = [
268 'group' => $other->getGroup()->getName(),
269 'filter' => $other->getName(),
270 'filterObject' => $other,
271 'globalDescription' => $globalDescription,
272 'contextDescription' => $contextDescription,
275 throw new InvalidArgumentException(
276 'You can only pass in a ChangesListFilterGroup or a ChangesListFilter'
324 return $this->filters[
$name] ??
null;
345 if ( $this->whatsThisHeader !==
null ) {
352 $output[
'messageKeys'],
353 $output[
'whatsThisHeader'],
354 $output[
'whatsThisBody'],
355 $output[
'whatsThisLinkText']
363 foreach ( $this->filters as $filter ) {
364 if ( $filter->displaysOnStructuredUi() ) {
365 $filterData = $filter->getJsData();
366 $output[
'messageKeys'] = array_merge(
367 $output[
'messageKeys'],
368 $filterData[
'messageKeys']
370 unset( $filterData[
'messageKeys'] );
371 $output[
'filters'][] = $filterData;
375 if ( count( $output[
'filters'] ) === 0 ) {
381 $conflicts = array_merge(
382 $this->conflictingGroups,
383 $this->conflictingFilters
386 foreach ( $conflicts as $conflictInfo ) {
387 unset( $conflictInfo[
'filterObject'] );
388 unset( $conflictInfo[
'groupObject'] );
389 $output[
'conflicts'][] = $conflictInfo;
391 $output[
'messageKeys'],
392 $conflictInfo[
'globalDescription'],
393 $conflictInfo[
'contextDescription']
406 return array_column( $this->conflictingGroups,
'groupObject' );
415 return array_column( $this->conflictingFilters,
'filterObject' );
425 return (
bool)count( array_filter(
450 &$tables, &$fields, &$conds, &$query_options, &$join_conds,
461 $isStructuredFiltersEnabled );
465class_alias( ChangesListFilterGroup::class,
'ChangesListFilterGroup' );
Special page which uses a ChangesList to show query results.