13 private ?
string $showHidePrefix;
16 $this->showHidePrefix = $config[
'showHidePrefix'] ??
null;
58 foreach ( $definitions as $groupDefinition ) {
59 if ( !$this->isConfigSatisfied( $groupDefinition ) ) {
62 $this->transformGroupDefinition( $container, $groupDefinition );
63 $group = $this->createGroup( $groupDefinition );
64 $this->registerSupersets( $group, $groupDefinition );
66 $this->registerConflicts( $container, $group, $groupDefinition );
67 $this->handlePendingConflicts( $container, $group );
79 private function isConfigSatisfied( array $def ) {
80 foreach ( $def[
'requireConfig'] ?? [] as $name => $value ) {
81 if ( !array_key_exists( $name, $this->config ) || $this->config[$name] !== $value ) {
88 private function transformGroupDefinition(
89 ChangesListFilterGroupContainer $container,
90 array &$groupDefinition
92 $groupDefinition[
'priority'] =
93 $container->fillPriority( $groupDefinition[
'priority'] ??
null );
96 foreach ( $groupDefinition[
'filters'] as $def ) {
97 if ( !$this->isConfigSatisfied( $def ) ) {
100 $def = $this->transformFilterDefinition( $def );
101 $filterDefs[] = $def;
103 $groupDefinition[
'filters'] = $filterDefs;
115 private function transformFilterDefinition( array $filterDefinition ) {
116 if ( $this->showHidePrefix !==
null && isset( $filterDefinition[
'showHideSuffix'] ) ) {
117 $filterDefinition[
'showHide'] = $this->showHidePrefix . $filterDefinition[
'showHideSuffix'];
120 return $filterDefinition;
123 private function createGroup( array $groupDefinition ): ChangesListFilterGroup {
124 $className = $groupDefinition[
'class'];
125 unset( $groupDefinition[
'class'] );
127 $group =
new $className( $groupDefinition );
128 if ( !( $group instanceof ChangesListFilterGroup ) ) {
129 throw new UnexpectedValueException(
130 "$className was expected to be an instance of ChangesListFilterGroup" );
142 private function registerSupersets( ChangesListFilterGroup $group, array $groupDefinition ) {
143 foreach ( $groupDefinition[
'filters'] as $def ) {
144 foreach ( $def[
'subsets'] ?? [] as $subsetName ) {
145 $filter = $group->getFilter( $def[
'name'] );
146 $subset = $group->getFilter( $subsetName );
147 if ( $filter && $subset ) {
148 $filter->setAsSupersetOf( $subset );
163 private function registerConflicts(
164 ChangesListFilterGroupContainer $container,
165 ChangesListFilterGroup $group,
166 array $groupDefinition
168 foreach ( $groupDefinition[
'filters'] as $def ) {
169 $filter = $group->getFilter( $def[
'name'] );
170 foreach ( $def[
'conflictsWith'] ?? [] as $conflictingGroupName => $conflictingFilters ) {
171 foreach ( $conflictingFilters as $conflictingFilterName => $opts ) {
172 '@phan-var array $opts';
173 $opts += $def[
'conflictOptions'] ?? [];
174 $missing = array_diff(
175 [
'globalKey',
'forwardKey',
'backwardKey' ],
179 throw new InvalidArgumentException(
180 "The conflict option(s) " . implode(
', ', $missing ) .
181 " must be present in either conflictsWith or conflictOptions in " .
182 "the definition of filter {$group->getName()}/{$def['name']}"
185 $conflictingGroup = $container->getGroup( $conflictingGroupName );
186 $conflictingFilter = $conflictingGroup?->getFilter( $conflictingFilterName );
187 if ( $conflictingFilter ) {
188 $filter->conflictsWith(
195 $container->addPendingConflict(
197 $conflictingGroupName,
198 $conflictingFilterName,
215 private function handlePendingConflicts(
216 ChangesListFilterGroupContainer $container,
217 ChangesListFilterGroup $group
219 foreach ( $group->getFilters() as $filter ) {
220 $conflicts = $container->popPendingConflicts( $group, $filter );
221 foreach ( $conflicts as [ $sourceFilter, $opts ] ) {
222 $sourceFilter->conflictsWith(