'cssClassSuffix' => 'watchedunseen',
'isRowApplicableCallable' => function ( $ctx, RecentChange $rc ) {
$changeTs = $rc->getAttribute( 'rc_timestamp' );
- $lastVisitTs = $this->watchStore->getLatestNotificationTimestamp(
- $rc->getAttribute( 'wl_notificationtimestamp' ),
- $rc->getPerformer(),
- $rc->getTitle()
- );
+ $lastVisitTs = $this->getLatestSeenTimestamp( $rc );
+
return $lastVisitTs !== null && $changeTs >= $lastVisitTs;
},
],
'label' => 'rcfilters-filter-watchlistactivity-seen-label',
'description' => 'rcfilters-filter-watchlistactivity-seen-description',
'cssClassSuffix' => 'watchedseen',
- 'isRowApplicableCallable' => function ( $ctx, $rc ) {
+ 'isRowApplicableCallable' => function ( $ctx, RecentChange $rc ) {
$changeTs = $rc->getAttribute( 'rc_timestamp' );
- $lastVisitTs = $rc->getAttribute( 'wl_notificationtimestamp' );
+ $lastVisitTs = $this->getLatestSeenTimestamp( $rc );
+
return $lastVisitTs === null || $changeTs < $lastVisitTs;
}
],
],
'default' => ChangesListStringOptionsFilterGroup::NONE,
- 'queryCallable' => function ( $specialPageClassName, $context, $dbr,
- &$tables, &$fields, &$conds, &$query_options, &$join_conds, $selectedValues ) {
+ 'queryCallable' => function (
+ $specialPageClassName,
+ $context,
+ IDatabase $dbr,
+ &$tables,
+ &$fields,
+ &$conds,
+ &$query_options,
+ &$join_conds,
+ $selectedValues
+ ) {
if ( $selectedValues === [ 'seen' ] ) {
$conds[] = $dbr->makeList( [
'wl_notificationtimestamp IS NULL',
$rc->counter = $counter++;
if ( $this->getConfig()->get( 'ShowUpdatedMarker' ) ) {
- $updated = $obj->wl_notificationtimestamp;
+ $lastVisitTs = $this->getLatestSeenTimestamp( $rc );
+ $updated = ( $lastVisitTs > $rc->getAttribute( 'timestamp' ) );
} else {
$updated = false;
}
$lang = $this->getLanguage();
$timestamp = wfTimestampNow();
+ $now = $lang->userTimeAndDate( $timestamp, $user );
$wlInfo = Html::rawElement(
'span',
[
'class' => 'wlinfo',
- 'data-params' => json_encode( [ 'from' => $timestamp ] ),
+ 'data-params' => json_encode( [ 'from' => $timestamp, 'fromFormatted' => $now ] ),
],
$this->msg( 'wlnote' )->numParams( $numRows, round( $opts['days'] * 24 ) )->params(
$lang->userDate( $timestamp, $user ), $lang->userTime( $timestamp, $user )
if ( $this->isStructuredFilterUiEnabled() ) {
$rcfilterContainer = Html::element(
'div',
- [ 'class' => 'rcfilters-container' ]
+ // TODO: Remove deprecated rcfilters-container class
+ [ 'class' => 'rcfilters-container mw-rcfilters-container' ]
);
$loadingContainer = Html::rawElement(
'div',
- [ 'class' => 'rcfilters-spinner' ],
+ [ 'class' => 'mw-rcfilters-spinner' ],
Html::element(
'div',
- [ 'class' => 'rcfilters-spinner-bounce' ]
+ [ 'class' => 'mw-rcfilters-spinner-bounce' ]
)
);
$this->getOutput()->addHTML(
Html::rawElement(
'div',
- [ 'class' => 'rcfilters-head' ],
+ // TODO: Remove deprecated rcfilters-head class
+ [ 'class' => 'rcfilters-head mw-rcfilters-head' ],
$rcfilterContainer . $form
)
);
$count = $store->countWatchedItems( $this->getUser() );
return floor( $count / 2 );
}
+
+ /**
+ * @param RecentChange $rc
+ * @return string TS_MW timestamp
+ */
+ protected function getLatestSeenTimestamp( RecentChange $rc ) {
+ return $this->watchStore->getLatestNotificationTimestamp(
+ $rc->getAttribute( 'wl_notificationtimestamp' ),
+ $rc->getPerformer(),
+ $rc->getTitle()
+ );
+ }
}