96 if ( $this->isStructuredFilterUiEnabled() ) {
100 $opts->consumeValue(
'translations' );
101 $default = $opts->getValue(
'translations' );
104 wfMessage(
'translate-rc-translation-filter' )->text(),
105 'mw-translation-filter'
107 $select =
new XmlSelect(
'translations',
'mw-translation-filter', $default );
109 wfMessage(
'translate-rc-translation-filter-no' )->text(),
112 $select->addOption( wfMessage(
'translate-rc-translation-filter-only' )->text(),
'only' );
114 wfMessage(
'translate-rc-translation-filter-filter' )->text(),
117 $select->addOption( wfMessage(
'translate-rc-translation-filter-site' )->text(),
'site' );
119 $extraOpts[
'translations'] = [ $label, $select->getHTML() ];
137 $translateRcFilterDefault = $this->config->get(
'TranslateRcFilterDefault' );
138 $defaultFilter = $translateRcFilterDefault !==
'noaction' ?
139 $translateRcFilterDefault :
140 ChangesListStringOptionsFilterGroup::NONE;
142 $translationsGroup =
new ChangesListStringOptionsFilterGroup(
144 'name' =>
'translations',
145 'title' =>
'translate-rcfilters-translations',
147 'default' => $defaultFilter,
148 'isFullCoverage' =>
true,
152 'label' =>
'translate-rcfilters-translations-only-label',
153 'description' =>
'translate-rcfilters-translations-only-desc',
154 'cssClassSuffix' =>
'only',
155 'isRowApplicableCallable' =>
function ( IContextSource $ctx, RecentChange $rc ) {
156 $namespaces = $this->getTranslateNamespaces();
158 return in_array( $rc->getAttribute(
'rc_namespace' ), $namespaces ) &&
159 !str_contains( $rc->getAttribute(
'rc_title' ),
'/' );
164 'label' =>
'translate-rcfilters-translations-site-label',
165 'description' =>
'translate-rcfilters-translations-site-desc',
166 'cssClassSuffix' =>
'site',
167 'isRowApplicableCallable' =>
function ( IContextSource $ctx, RecentChange $rc ) {
168 $namespaces = $this->getTranslateNamespaces();
170 return in_array( $rc->getAttribute(
'rc_namespace' ), $namespaces ) &&
171 !str_contains( $rc->getAttribute(
'rc_title' ),
'/' );
176 'label' =>
'translate-rcfilters-translations-filter-label',
177 'description' =>
'translate-rcfilters-translations-filter-desc',
178 'cssClassSuffix' =>
'filter',
179 'isRowApplicableCallable' =>
function ( IContextSource $ctx, RecentChange $rc ) {
180 $namespaces = $this->getTranslateNamespaces();
182 return !in_array( $rc->getAttribute(
'rc_namespace' ), $namespaces );
186 'name' =>
'filter-translation-pages',
187 'label' =>
'translate-rcfilters-translations-filter-translation-pages-label',
188 'description' =>
'translate-rcfilters-translations-filter-translation-pages-desc',
189 'cssClassSuffix' =>
'filter-translation-pages',
190 'isRowApplicableCallable' =>
static function ( IContextSource $ctx, RecentChange $rc ) {
191 $tags = explode(
', ', $rc->getAttribute(
'ts_tags' ) ??
'' );
192 return !in_array(
'translate-filter-translation-pages', $tags );
197 'queryCallable' =>
function (
198 string $specialClassName,
200 IReadableDatabase $dbr,
204 array &$query_options,
206 array $selectedValues
208 $fields = array_merge( $fields, [
'rc_title',
'rc_namespace' ] );
211 $filterRenderedIndex = array_search(
'filter-translation-pages', $selectedValues );
212 if ( $filterRenderedIndex !==
false ) {
213 unset( $selectedValues[$filterRenderedIndex] );
214 $selectedValues = array_values( $selectedValues );
216 $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
218 $renderedPage = $changeTagDefStore->getId(
'translate-translation-pages' );
221 $tables[
'translatetags'] = ChangeTags::getDisplayTableName();
222 $join_conds[
'translatetags'] = [
224 [
'translatetags.ct_rc_id=rc_id',
'translatetags.ct_tag_id' => $renderedPage ]
226 $conds[
'translatetags.ct_tag_id'] =
null;
227 }
catch ( NameTableAccessException $exception ) {
232 $namespaces = $this->getTranslateNamespaces();
233 $inNamespaceCond =
'rc_namespace IN (' .
234 $dbr->makeList( $namespaces ) .
')';
235 $notInNamespaceCond =
'rc_namespace NOT IN (' .
236 $dbr->makeList( $namespaces ) .
')';
238 $onlyCond = $dbr->makeList( [
241 $dbr->buildLike( $dbr->anyString(),
'/', $dbr->anyString() )
243 $siteCond = $dbr->makeList( [
246 $dbr->buildLike( $dbr->anyString(),
'/', $dbr->anyString() )
249 if ( count( $selectedValues ) === 3 ) {
254 if ( $selectedValues === [
'filter',
'only' ] ) {
255 $conds[] = $dbr->makeList( [
262 if ( $selectedValues === [
'filter',
'site' ] ) {
263 $conds[] = $dbr->makeList( [
270 if ( $selectedValues === [
'only',
'site' ] ) {
271 $conds[] = $inNamespaceCond;
275 if ( $selectedValues === [
'filter' ] ) {
276 $conds[] = $notInNamespaceCond;
280 if ( $selectedValues === [
'only' ] ) {
281 $conds[] = $onlyCond;
285 if ( $selectedValues === [
'site' ] ) {
286 $conds[] = $siteCond;
292 $special->registerFilterGroup( $translationsGroup );