WMDE-leszek has uploaded a new change for review. https://gerrit.wikimedia.org/r/304016
Change subject: DNM Do not load RevisionSlider initially, add a button to show/hide it ...................................................................... DNM Do not load RevisionSlider initially, add a button to show/hide it Instead of loading RevisionSlider only add a little button to expand RevisionSlider on top of the diff page. This makes RevisionSlider only steal a bit of space over the diff, and only inserts quite a big slider to users that want to have it visible for the particular diff. API calls are only made once RevisionSlider has been expanded. This is re-submit of b0f229d75f905a9570497dc095b410f20f4b53ae that was reverted in I26427faaa00b38c2aa1377a66224c9062dcca302 Bug: T141871 Change-Id: I879de5774b2cce7b908e73cbbe869fd48d6afa23 --- M RevisionSlider.hooks.php M i18n/en.json M i18n/qqq.json M modules/ext.RevisionSlider.SliderView.js M modules/ext.RevisionSlider.css M modules/ext.RevisionSlider.init.js M tests/browser/features/betafeature.feature A tests/browser/features/expand.feature M tests/browser/features/help.feature M tests/browser/features/history.feature M tests/browser/features/pointers.feature M tests/browser/features/support/pages/diff_page.rb M tests/browser/features/support/step_definitions/common_steps.rb M tests/browser/features/timeline.feature M tests/browser/features/tooltips.feature 15 files changed, 185 insertions(+), 53 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/RevisionSlider refs/changes/16/304016/1 diff --git a/RevisionSlider.hooks.php b/RevisionSlider.hooks.php index 1938191..09f3328 100644 --- a/RevisionSlider.hooks.php +++ b/RevisionSlider.hooks.php @@ -48,20 +48,55 @@ $out->addJsConfigVars( 'extRevisionSliderOldRev', $oldRev->getId() ); $out->addJsConfigVars( 'extRevisionSliderNewRev', $newRev->getId() ); $out->addJsConfigVars( 'extRevisionSliderTimeOffset', intval( $timeOffset ) ); + $out->enableOOUI(); + + // FIXME: this really not nice to inject those elements to ButtonWidget like that + // but this is only done to have inline styles set for those elements, so they are + // rendered as intended before RL loads all CSS styles (avoid jumping after CSS is loaded). + // Some better solution and more future-proof (what if ButtonWidget switches to use other tags?) + // should be used if possible. + $button = new OOUI\Tag( 'a' ); + $label = new OOUI\Tag( 'span' ); + $icon = new OOUI\Tag( 'span' ); + $button->setAttributes( [ 'style' => 'width: 100%;' ] ); + $label->setAttributes( [ 'style' => 'line-height: 1.875em;' ] ); + $icon->setAttributes( [ 'style' => 'float: right;' ] ); + + $toggleButton = new OOUI\ButtonWidget( [ + 'label' => ( new Message( 'revisionslider-toggle-label' ) )->text(), + 'icon' => 'expand', + 'button' => $button, + 'labelElement' => $label, + 'iconElement' => $icon, + 'id' => 'mw-revslider-slider-toggle', + 'classes' => [ 'mw-revslider-toggle-button' ], + 'infusable' => true, + 'framed' => false, + ] ); + $toggleButton->setAttributes( [ 'style' => 'width: 100%; text-align: center;' ] ); + $out->addHTML( Html::rawElement( 'div', [ 'id' => 'mw-revslider-container', - 'style' => 'min-height: 150px;', + 'style' => 'border: 1px solid #cccccc;' ], - Html::element( - 'p', + $toggleButton . + Html::rawElement( + 'div', [ - 'id' => 'mw-revslider-placeholder', - 'style' => 'text-align: center', + 'id' => 'mw-revslider-slider-wrapper', + 'style' => 'min-height: 142px; display: none; border-top: 1px solid #cccccc;', ], - ( new Message( 'revisionslider-loading-placeholder' ) )->text() + Html::element( + 'p', + [ + 'id' => 'mw-revslider-placeholder', + 'style' => 'text-align: center', + ], + ( new Message( 'revisionslider-loading-placeholder' ) )->text() + ) ) ) ); diff --git a/i18n/en.json b/i18n/en.json index 264bb85..bbb59f6 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -8,6 +8,7 @@ "revisionslider-desc": "Shows a slider allowing selecting and comparing of revisions on a diff page", "revisionslider-beta-feature-message": "RevisionSlider", "revisionslider-beta-feature-description": "Show a revision slider when comparing two revisions of a page.", + "revisionslider-toggle-label": "RevisionSlider", "revisionslider-page-size": "$1 {{PLURAL:$2|byte|bytes}}", "revisionslider-change-size": "$1 {{PLURAL:$3|byte|bytes}}", "revisionslider-label-date": "Date", diff --git a/i18n/qqq.json b/i18n/qqq.json index 783d9b5..390731a 100644 --- a/i18n/qqq.json +++ b/i18n/qqq.json @@ -10,6 +10,7 @@ "revisionslider-desc": "{{desc|name=RevisionSlider|url=https://www.mediawiki.org/wiki/Extension:RevisionSlider}}", "revisionslider-beta-feature-message": "Label for the RevisionSlider Beta Feature.", "revisionslider-beta-feature-description": "Description for the RevisionSlider Beta Feature, describing the feature that will be enabled.", + "revisionslider-toggle-label": "Label of the button toggling the visibility of RevisionSlider", "revisionslider-page-size": "Page size after the revision.\n\nParameters:\n$1 - number of bytes formatted for output (with mw.language.converNumber)\n$2 - number of bytes, could be used with PLURAL\n{{Identical|Byte}}", "revisionslider-change-size": "Change size, ie. number of bytes added or removed in the revision.\n\nParameters:\n$1 - change size formatted for output (colour-coded HTML element, including plus or minus sign)\n$2 - change size (in bytes), can be negative\n$3 - change size (in bytes) without a sign\n{{Identical|Byte}}", "revisionslider-label-date": "Label for the creation date of the revision.\n{{Identical|Date}}", diff --git a/modules/ext.RevisionSlider.SliderView.js b/modules/ext.RevisionSlider.SliderView.js index 641ebf6..da69960 100644 --- a/modules/ext.RevisionSlider.SliderView.js +++ b/modules/ext.RevisionSlider.SliderView.js @@ -13,7 +13,7 @@ $.extend( SliderView.prototype, { revisionWidth: 16, - containerMargin: 140, + containerMargin: 160, /** * @type {jQuery} diff --git a/modules/ext.RevisionSlider.css b/modules/ext.RevisionSlider.css index cba7509..6c5f2f9 100644 --- a/modules/ext.RevisionSlider.css +++ b/modules/ext.RevisionSlider.css @@ -7,6 +7,27 @@ position: relative; } +#mw-revslider-slider-wrapper { + padding: 10px; +} + +.mw-revslider-toggle-button { + width: 100%; + text-align: center; +} + +.mw-revslider-toggle-button .oo-ui-buttonElement-button { + width: 100%; +} + +.mw-revslider-toggle-button .oo-ui-labelElement-label { + line-height: 1.875em; +} + +.mw-revslider-toggle-button .oo-ui-iconElement-icon { + float: right; +} + .mw-revslider-revision { position: relative; margin-top: 70px; diff --git a/modules/ext.RevisionSlider.init.js b/modules/ext.RevisionSlider.init.js index 03f7228..8803d48 100644 --- a/modules/ext.RevisionSlider.init.js +++ b/modules/ext.RevisionSlider.init.js @@ -1,53 +1,79 @@ ( function ( mw, $ ) { - var startTime = mw.now(), - api = new mw.libs.revisionSlider.Api( mw.util.wikiScript( 'api' ) ); + var expanded = false, + initialized = false, + /*jshint -W024 */ + toggleButton = OO.ui.ButtonWidget.static.infuse( 'mw-revslider-slider-toggle' ), + /*jshint +W024 */ + initialize = function () { + var startTime = mw.now(), + api = new mw.libs.revisionSlider.Api( mw.util.wikiScript( 'api' ) ); - mw.track( 'counter.MediaWiki.RevisionSlider.event.init' ); - mw.libs.revisionSlider.userOffset = mw.user.options.values.timecorrection ? mw.user.options.values.timecorrection.split( '|' )[ 1 ] : mw.config.values.extRevisionSliderTimeOffset; + mw.track( 'counter.MediaWiki.RevisionSlider.event.init' ); + mw.libs.revisionSlider.userOffset = mw.user.options.values.timecorrection ? mw.user.options.values.timecorrection.split( '|' )[ 1 ] : mw.config.values.extRevisionSliderTimeOffset; - api.fetchRevisionData( mw.config.get( 'wgPageName' ), { - startId: mw.config.values.extRevisionSliderNewRev, - limit: mw.libs.revisionSlider.calculateRevisionsPerWindow( 140, 16 ), + api.fetchRevisionData( mw.config.get( 'wgPageName' ), { + startId: mw.config.values.extRevisionSliderNewRev, + limit: mw.libs.revisionSlider.calculateRevisionsPerWindow( 160, 16 ), - success: function ( data ) { - var revs, - revisionList, - $container, - slider; + success: function ( data ) { + var revs, + revisionList, + $container, + slider; - mw.track( 'timing.MediaWiki.RevisionSlider.timing.initFetchRevisionData', mw.now() - startTime ); + mw.track( 'timing.MediaWiki.RevisionSlider.timing.initFetchRevisionData', mw.now() - startTime ); - try { - revs = data.revisions; - revs.reverse(); + try { + revs = data.revisions; + revs.reverse(); - revisionList = new mw.libs.revisionSlider.RevisionList( mw.libs.revisionSlider.makeRevisions( revs ) ); + revisionList = new mw.libs.revisionSlider.RevisionList( mw.libs.revisionSlider.makeRevisions( revs ) ); - $container = $( '#mw-revslider-container' ); - slider = new mw.libs.revisionSlider.Slider( revisionList ); - slider.getView().render( $container ); + $container = $( '#mw-revslider-slider-wrapper' ); + slider = new mw.libs.revisionSlider.Slider( revisionList ); + slider.getView().render( $container ); - if ( !mw.user.options.get( 'userjs-revslider-hidehelp' ) ) { - mw.libs.revisionSlider.HelpDialog.show(); - ( new mw.Api() ).saveOption( 'userjs-revslider-hidehelp', true ); + if ( !mw.user.options.get( 'userjs-revslider-hidehelp' ) ) { + mw.libs.revisionSlider.HelpDialog.show(); + ( new mw.Api() ).saveOption( 'userjs-revslider-hidehelp', true ); + } + + $( '#mw-revslider-placeholder' ).remove(); + mw.track( 'timing.MediaWiki.RevisionSlider.timing.init', mw.now() - startTime ); + } catch ( err ) { + $( '#mw-revslider-placeholder' ) + .text( mw.message( 'revisionslider-loading-failed' ).text() ); + console.log( err ); + mw.track( 'counter.MediaWiki.RevisionSlider.error.init' ); + } + + initialized = true; + }, + error: function ( err ) { + $( '#mw-revslider-placeholder' ) + .text( mw.message( 'revisionslider-loading-failed' ).text() ); + console.log( err ); + mw.track( 'counter.MediaWiki.RevisionSlider.error.init' ); } + } ); + }; - $( '#mw-revslider-placeholder' ).remove(); - mw.track( 'timing.MediaWiki.RevisionSlider.timing.init', mw.now() - startTime ); - } catch ( err ) { - $( '#mw-revslider-placeholder' ) - .text( mw.message( 'revisionslider-loading-failed' ).text() ); - console.log( err ); - mw.track( 'counter.MediaWiki.RevisionSlider.error.init' ); + mw.track( 'counter.MediaWiki.RevisionSlider.event.load' ); + + toggleButton.connect( this, { + click: function () { + expanded = !expanded; + toggleButton.setIcon( expanded ? 'collapse' : 'expand' ); + $( '#mw-revslider-slider-wrapper' ).toggle(); + if ( expanded ) { + mw.track( 'counter.MediaWiki.RevisionSlider.event.expand' ); + } else { + mw.track( 'counter.MediaWiki.RevisionSlider.event.collapse' ); } - - }, - error: function ( err ) { - $( '#mw-revslider-placeholder' ) - .text( mw.message( 'revisionslider-loading-failed' ).text() ); - console.log( err ); - mw.track( 'counter.MediaWiki.RevisionSlider.error.init' ); + if ( initialized ) { + return; + } + initialize(); } } ); - }( mediaWiki, jQuery ) ); diff --git a/tests/browser/features/betafeature.feature b/tests/browser/features/betafeature.feature index 1a026af..cee6bf5 100644 --- a/tests/browser/features/betafeature.feature +++ b/tests/browser/features/betafeature.feature @@ -7,10 +7,9 @@ Scenario: RevisionSlider is not loaded when feature disabled Given RevisionSlider is disabled as a beta feature And I am on the diff page - Then There should not be a RevisionSlider placeholder + Then There should not be a RevisionSlider expand button Scenario: RevisionSlider is loaded when feature enabled Given RevisionSlider is enabled as a beta feature And I am on the diff page - And The RevisionSlider has loaded - Then There should be a RevisionSlider container \ No newline at end of file + Then There should be a RevisionSlider expand button \ No newline at end of file diff --git a/tests/browser/features/expand.feature b/tests/browser/features/expand.feature new file mode 100644 index 0000000..c04185c --- /dev/null +++ b/tests/browser/features/expand.feature @@ -0,0 +1,28 @@ +@chrome @en.wikipedia.beta.wmflabs.org @firefox @integration +Feature: RevisionSlider expand + Background: + Given I am logged in + And I have reset my preferences + And RevisionSlider is enabled as a beta feature + And a page with 2 revision(s) exists + + Scenario: RevisionSlider is collapsed initially + Given I am on the diff page + Then There should be a RevisionSlider expand button + And RevisionSlider wrapper should be hidden + + Scenario: RevisionSlider loads after expanding + Given I am on the diff page + And I click on the expand button + Then RevisionSlider wrapper should be visible + And The RevisionSlider has loaded + + Scenario: RevisionSlider hides after collapsing + Given I am on the diff page + And I click on the expand button + Then RevisionSlider wrapper should be visible + And The RevisionSlider has loaded + And I have closed the help dialog at the start + And The help dialog is hidden + Given I click on the expand button + Then RevisionSlider wrapper should be hidden diff --git a/tests/browser/features/help.feature b/tests/browser/features/help.feature index f3a275b..ba5a0f5 100644 --- a/tests/browser/features/help.feature +++ b/tests/browser/features/help.feature @@ -6,12 +6,14 @@ And I have reset my preferences And RevisionSlider is enabled as a beta feature And I am on the diff page + And I click on the expand button Scenario: RevisionSlider tutorial is present on first load only Given The RevisionSlider has loaded Then The help dialog should be visible When I have closed the help dialog at the start And I refresh the page + And I click on the expand button And The RevisionSlider has loaded Then The help dialog should not be present @@ -23,5 +25,6 @@ And I have moved to the next step And I have closed the help dialog at the end And I refresh the page + And I click on the expand button And The RevisionSlider has loaded Then The help dialog should not be present \ No newline at end of file diff --git a/tests/browser/features/history.feature b/tests/browser/features/history.feature index 772fcd3..1ff0110 100644 --- a/tests/browser/features/history.feature +++ b/tests/browser/features/history.feature @@ -6,6 +6,7 @@ And RevisionSlider is enabled as a beta feature And a page with 4 revision(s) exists And I am on the diff page + And I click on the expand button And The RevisionSlider has loaded And I have closed the help dialog at the start And The help dialog is hidden diff --git a/tests/browser/features/pointers.feature b/tests/browser/features/pointers.feature index 581b495..35db425 100644 --- a/tests/browser/features/pointers.feature +++ b/tests/browser/features/pointers.feature @@ -6,6 +6,7 @@ And RevisionSlider is enabled as a beta feature And a page with 5 revision(s) exists And I am on the diff page + And I click on the expand button And The RevisionSlider has loaded And I have closed the help dialog at the start And The help dialog is hidden diff --git a/tests/browser/features/support/pages/diff_page.rb b/tests/browser/features/support/pages/diff_page.rb index 785175e..51b93d4 100644 --- a/tests/browser/features/support/pages/diff_page.rb +++ b/tests/browser/features/support/pages/diff_page.rb @@ -2,7 +2,8 @@ include PageObject p(:revisionslider_placeholder, id: 'mw-revslider-placeholder') - div(:revisionslider_container, id: 'mw-revslider-container') + div(:revisionslider_wrapper, id: 'mw-revslider-slider-wrapper') + div(:revisionslider_toggle_button, id: 'mw-revslider-slider-toggle') div(:revisionslider_darkness, id: 'mw-revslider-darkness') div(:revisionslider_help_dialog, id: 'revisionslider-help-dialog') diff --git a/tests/browser/features/support/step_definitions/common_steps.rb b/tests/browser/features/support/step_definitions/common_steps.rb index 8b6ea53..7594c58 100644 --- a/tests/browser/features/support/step_definitions/common_steps.rb +++ b/tests/browser/features/support/step_definitions/common_steps.rb @@ -42,10 +42,22 @@ visit(SpecialPreferencesPage).disable_revisionslider end -Then(/^There should be a RevisionSlider container/) do - expect{ on(DiffPage).revisionslider_container }.not_to raise_error +Then(/^There should be a RevisionSlider expand button/) do + expect{ on(DiffPage).revisionslider_toggle_button }.not_to raise_error end -Then(/^There should not be a RevisionSlider placeholder$/) do - expect{ on(DiffPage).revisionslider_placeholder }.to raise_error +Then(/^There should not be a RevisionSlider expand button/) do + expect{ on(DiffPage).revisionslider_toggle_button }.to raise_error +end + +Then(/^RevisionSlider wrapper should be hidden/) do + on(DiffPage).revisionslider_wrapper_element.visible?.should be_falsey +end + +Then(/^RevisionSlider wrapper should be visible/) do + on(DiffPage).revisionslider_wrapper_element.visible?.should be_truthy +end + +Given(/^I click on the expand button/) do + on(DiffPage).revisionslider_toggle_button_element.click end \ No newline at end of file diff --git a/tests/browser/features/timeline.feature b/tests/browser/features/timeline.feature index f43b4e6..aa50cb3 100644 --- a/tests/browser/features/timeline.feature +++ b/tests/browser/features/timeline.feature @@ -8,6 +8,7 @@ Scenario: RevisionSlider timeline arrows to be disabled with 3 revisions Given a page with 3 revision(s) exists And I am on the diff page + And I click on the expand button And The RevisionSlider has loaded And I have closed the help dialog at the start Then The backward arrow should be disabled @@ -17,6 +18,7 @@ Given a page with 30 revision(s) exists And The window size is 800 by 600 And I am on the diff page + And I click on the expand button And The RevisionSlider has loaded And I have closed the help dialog at the start And The help dialog is hidden diff --git a/tests/browser/features/tooltips.feature b/tests/browser/features/tooltips.feature index 494a827..bf14d71 100644 --- a/tests/browser/features/tooltips.feature +++ b/tests/browser/features/tooltips.feature @@ -6,6 +6,7 @@ And RevisionSlider is enabled as a beta feature And a page with 4 revision(s) exists And I am on the diff page + And I click on the expand button And The RevisionSlider has loaded And I have closed the help dialog at the start -- To view, visit https://gerrit.wikimedia.org/r/304016 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I879de5774b2cce7b908e73cbbe869fd48d6afa23 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/RevisionSlider Gerrit-Branch: master Gerrit-Owner: WMDE-leszek <leszek.mani...@wikimedia.de> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits