diff --git a/extension.json b/extension.json index bfbbe1d38..0621fc8c0 100644 --- a/extension.json +++ b/extension.json @@ -193,10 +193,12 @@ ], "messages": [ "popups-settings-title", + "popups-settings-unified-title", "popups-settings-option-simple", "popups-settings-option-simple-description", "popups-settings-option-advanced", "popups-settings-option-advanced-description", + "popups-settings-option-unified-description", "popups-settings-option-off", "popups-settings-save", "popups-settings-cancel", diff --git a/i18n/en.json b/i18n/en.json index 313d27603..2d9a95cff 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -5,10 +5,12 @@ "popups-message": "Previews", "popups-desc": "Displays preview popups when the user hovers over a link", "popups-settings-title": "Page preview", + "popups-settings-unified-title": "Previews", "popups-settings-option-simple": "Enable", "popups-settings-option-simple-description": "Get quick previews of a topic while reading a page.", "popups-settings-option-advanced": "Advanced", "popups-settings-option-advanced-description": "See link previews and access editing function menus. This is used by many editors.", + "popups-settings-option-unified-description": "Get quick previews of a topic or reference while reading.", "popups-settings-option-off": "Disable", "popups-settings-save": "Save", "popups-settings-help-ok": "Done", @@ -23,6 +25,10 @@ "popups-prefs-optin": "Enable page previews (quick previews of a topic while reading a page)", "popups-prefs-disable-nav-gadgets-info": "You have to [[$1 | disable Navigation Popups Gadget]] from Gadgets tab to enable Page Previews", "popups-prefs-conflicting-gadgets-info": "Certain gadgets and other customizations may affect the performance of this feature. If you experience problems please review your gadgets and user scripts, including global ones.", + "popups-prefs-optin-all": "Enable previews (get quick previews of a topic or a reference while reading a page)", + "popups-prefs-navpopups-gadget-conflict-info": "You have the [[$1 | Navigation popups]] gadget enabled, so you won't see previews provided by this feature. Depending on your wiki, the gadget may have a slightly different name. If you continue to experience issues, please review your global gadget settings and user scripts.", + "popups-prefs-reftooltips-gadget-conflict-info": "You have the [[$1 | Reference Tooltips]] gadget enabled, so you won’t see reference previews but will still see page previews. Depending on your wiki, the gadget may have a slightly different name. If you continue to experience issues, please review your global gadget settings and user scripts.", + "popups-prefs-reftooltips-and-navpopups-gadget-conflict-info": "You have the [[$1 | Navigation popups]] and [[$1 | Reference Tooltips]] gadgets enabled, so you won't see previews provided by this feature. Depending on your wiki, the gadget may have a slightly different name. If you continue to experience issues, please review your global gadget settings and user scripts.", "popups-refpreview-reference": "Reference", "popups-refpreview-book": "Book reference", "popups-refpreview-journal": "Journal reference", @@ -30,7 +36,6 @@ "popups-refpreview-note": "Note", "popups-refpreview-web": "Web reference", "popups-refpreview-collapsible-placeholder": "This reference includes a graphic which does not fit in the preview.", - "popups-refpreview-user-preference-label": "Reference previews (get quick previews of footnotes)", "popups-refpreview-beta-feature-message": "Reference Previews", "popups-refpreview-beta-feature-description": "Show a preview of a reference by hovering over its footnote marker.\n\nPlease note: If you’re using the [https://en.wikipedia.org/wiki/Wikipedia:Tools/Navigation_popups Navigation popups] gadget or the [[mw:Special:MyLanguage/Reference Tooltips|Reference Tooltips]] gadget, you won’t see Reference Previews." } diff --git a/i18n/qqq.json b/i18n/qqq.json index 3006fa8a0..daccf9ca3 100644 --- a/i18n/qqq.json +++ b/i18n/qqq.json @@ -15,10 +15,12 @@ "popups-message": "Name shown in user preference for this extension\n{{name}}", "popups-desc": "{{desc|name=Popups|url=https://www.mediawiki.org/wiki/Extension:Popups}}", "popups-settings-title": "Title used for the setting's dialog", + "popups-settings-unified-title": "Title used for the setting's dialog enabling page and reference previews", "popups-settings-option-simple": "Title for the reader popup option\n{{Identical|Enable}}", "popups-settings-option-simple-description": "Description for the reader popup option", "popups-settings-option-advanced": "Title for the editor or Navigation Popups gadget option\n{{Identical|Advanced}}", "popups-settings-option-advanced-description": "Description for the editor or Navigation Popups gadget option", + "popups-settings-option-unified-description": "Description for the reader popup option for page and reference previews", "popups-settings-option-off": "Title to turn off popups option.\n\nSee also:\n* {{msg-mw|Popups-settings-enable}}\n{{Identical|Disable}}", "popups-settings-save": "Save button for the setting's dialog\n{{Identical|Save}}", "popups-settings-help-ok": "Confirmation button after showing how to re-enable page previews.\n{{Identical|Done}}", @@ -33,6 +35,10 @@ "popups-prefs-optin": "Label for Page Previews option (description for Page Previews option)", "popups-prefs-disable-nav-gadgets-info": "Help message telling to disable Navigation Popups gadget in order to enable page previews.\n\nParameters:\n* $1 – Link to the Gadgets tab of Preferences", "popups-prefs-conflicting-gadgets-info": "Help message informing about possible conflicts with other gadgets/customizations", + "popups-prefs-optin-all": "Label for the merged Page and Reference Previews option (description for Page and Reference Previews option)", + "popups-prefs-navpopups-gadget-conflict-info": "Help message telling to disable Navigation Popups gadget in order to allow page and reference previews.\n\nParameters:\n* $1 – Link to the Gadgets tab of Preferences", + "popups-prefs-reftooltips-gadget-conflict-info": "Help message telling to disable Reference Tooltips gadget in order to allow page and reference previews.\n\nParameters:\n* $1 – Link to the Gadgets tab of Preferences", + "popups-prefs-reftooltips-and-navpopups-gadget-conflict-info": "Help message telling to disable Navigation Popups and Reference Tooltips gadgets in order to allow page and reference previews.\n\nParameters:\n* $1 – Link to the Gadgets tab of Preferences", "popups-refpreview-reference": "Default heading for popups that show previews of references as provided by the Cite extension's tags (also known as footnotes).\n{{Identical|Reference}}", "popups-refpreview-book": "Heading for a popup previewing a citation from a book.\n{{Identical|Book}}", "popups-refpreview-journal": "Heading for a popup previewing a citation from a journal.\n{{Identical|Journal}}", @@ -40,7 +46,6 @@ "popups-refpreview-note": "Heading for a popup previewing a footnote.\n{{Identical|Note}}", "popups-refpreview-web": "Heading for a popup previewing a citation from a website.\n{{Identical|Website}}", "popups-refpreview-collapsible-placeholder": "Placeholder text for collapsible tables, templates, or other large elements inside of a reference.", - "popups-refpreview-user-preference-label": "Label for the user option to enable or disable reference preview popups", "popups-refpreview-beta-feature-message": "Label for the Reference Previews Beta feature.", "popups-refpreview-beta-feature-description": "Description for the Reference Previews Beta feature, describing the feature that will be enabled." } diff --git a/includes/PopupsContext.php b/includes/PopupsContext.php index 896ed67c8..f85161067 100644 --- a/includes/PopupsContext.php +++ b/includes/PopupsContext.php @@ -57,9 +57,9 @@ class PopupsContext { public const PREVIEWS_OPTIN_PREFERENCE_NAME = 'popups'; /** - * User preference key to enable/disable Reference Previews + * Beta feature key to enable/disable Reference Previews */ - public const REFERENCE_PREVIEWS_PREFERENCE_NAME = 'popupsreferencepreviews'; + public const REFERENCE_PREVIEWS_BETA_FEATURE_KEY = 'popupsreferencepreviews'; /** * @var \Config @@ -138,16 +138,22 @@ class PopupsContext { } // TODO: Remove when not in Beta any more - if ( $this->config->get( 'PopupsReferencePreviewsBetaFeature' ) && - \ExtensionRegistry::getInstance()->isLoaded( 'BetaFeatures' ) - ) { + if ( $this->isReferencePreviewsInBeta() ) { return BetaFeatures::isFeatureEnabled( $user, - self::REFERENCE_PREVIEWS_PREFERENCE_NAME + self::REFERENCE_PREVIEWS_BETA_FEATURE_KEY ); } + return $user->getBoolOption( self::PREVIEWS_OPTIN_PREFERENCE_NAME ); + } - return $user->getBoolOption( self::REFERENCE_PREVIEWS_PREFERENCE_NAME ); + /** + * @return bool whether or not reference previews are a beta feature + */ + public function isReferencePreviewsInBeta() { + // TODO: Remove when not in Beta any more + return $this->config->get( 'PopupsReferencePreviewsBetaFeature' ) && + \ExtensionRegistry::getInstance()->isLoaded( 'BetaFeatures' ); } /** diff --git a/includes/PopupsHooks.php b/includes/PopupsHooks.php index c8088b1bd..1fa7cc99a 100644 --- a/includes/PopupsHooks.php +++ b/includes/PopupsHooks.php @@ -51,14 +51,36 @@ class PopupsHooks { $option = [ 'type' => 'toggle', - 'label-message' => 'popups-prefs-optin', + 'label-message' => 'popups-prefs-optin-all', 'help-message' => 'popups-prefs-conflicting-gadgets-info', 'section' => self::PREVIEWS_PREFERENCES_SECTION ]; - if ( $context->conflictsWithNavPopupsGadget( $user ) ) { - $option[ 'disabled' ] = true; - $option[ 'help-message' ] = [ 'popups-prefs-disable-nav-gadgets-info', - 'Special:Preferences#mw-prefsection-gadgets' ]; + + // TODO: Remove when not in Beta any more + if ( $context->isReferencePreviewsInBeta() ) { + $option[ 'label-message' ] = 'popups-prefs-optin'; + + if ( $context->conflictsWithNavPopupsGadget( $user ) ) { + $option[ 'disabled' ] = true; + $option[ 'help-message' ] = [ 'popups-prefs-disable-nav-gadgets-info', + 'Special:Preferences#mw-prefsection-gadgets' ]; + } + } else { + $isNavPopupsGadgetEnabled = $context->conflictsWithNavPopupsGadget( $user ); + $isRefTooltipsGadgetEnabled = $context->conflictsWithRefTooltipsGadget( $user ); + + if ( $isNavPopupsGadgetEnabled && $isRefTooltipsGadgetEnabled ) { + $option[ 'disabled' ] = true; + $option[ 'help-message' ] = [ 'popups-prefs-reftooltips-and-navpopups-gadget-conflict-info', + 'Special:Preferences#mw-prefsection-gadgets' ]; + } elseif ( $isNavPopupsGadgetEnabled ) { + $option[ 'disabled' ] = true; + $option[ 'help-message' ] = [ 'popups-prefs-navpopups-gadget-conflict-info', + 'Special:Preferences#mw-prefsection-gadgets' ]; + } elseif ( $isRefTooltipsGadgetEnabled ) { + $option[ 'help-message' ] = [ 'popups-prefs-reftooltips-gadget-conflict-info', + 'Special:Preferences#mw-prefsection-gadgets' ]; + } } $skinPosition = array_search( 'skin', array_keys( $prefs ) ); @@ -66,18 +88,6 @@ class PopupsHooks { PopupsContext::PREVIEWS_OPTIN_PREFERENCE_NAME => $option, ]; - $config = MediaWikiServices::getInstance()->getService( 'Popups.Config' ); - if ( $config->get( 'PopupsReferencePreviews' ) && - !$config->get( 'PopupsReferencePreviewsBetaFeature' ) - ) { - $readingOptions[PopupsContext::REFERENCE_PREVIEWS_PREFERENCE_NAME] = [ - 'type' => 'toggle', - 'label-message' => 'popups-refpreview-user-preference-label', - 'section' => self::PREVIEWS_PREFERENCES_SECTION, - 'disabled' => $option['disabled'] ?? false, - ]; - } - if ( $skinPosition !== false ) { $injectIntoIndex = $skinPosition + 1; $prefs = array_slice( $prefs, 0, $injectIntoIndex, true ) @@ -165,6 +175,9 @@ class PopupsHooks { // TODO: Move checks and tests from isReferencePreviewsEnabled.js here $vars['wgPopupsReferencePreviews'] = $context->isReferencePreviewsEnabled( $user ); + // TODO: Remove when not in Beta any more + $vars['wgPopupsReferencePreviewsBeta'] = $context->isReferencePreviewsInBeta( $user ); + $vars['wgPopupsConflictsWithNavPopupGadget'] = $context->conflictsWithNavPopupsGadget( $user ); $vars['wgPopupsConflictsWithRefTooltipsGadget'] = $context->conflictsWithRefTooltipsGadget( $user ); } @@ -179,14 +192,6 @@ class PopupsHooks { $config = MediaWikiServices::getInstance()->getService( 'Popups.Config' ); $default = $config->get( 'PopupsOptInDefaultState' ); $defaultOptions[PopupsContext::PREVIEWS_OPTIN_PREFERENCE_NAME] = $default; - - // As long as in Beta, don't set a default for Reference Previews. Rely on it either being - // null (= disabled), or follow what the "betafeatures-auto-enroll" flag says. - if ( $config->get( 'PopupsReferencePreviews' ) && - !$config->get( 'PopupsReferencePreviewsBetaFeature' ) - ) { - $defaultOptions[PopupsContext::REFERENCE_PREVIEWS_PREFERENCE_NAME] = $default; - } } /** @@ -200,14 +205,6 @@ class PopupsHooks { $config = MediaWikiServices::getInstance()->getService( 'Popups.Config' ); $default = $config->get( 'PopupsOptInStateForNewAccounts' ); $user->setOption( PopupsContext::PREVIEWS_OPTIN_PREFERENCE_NAME, $default ); - - // As long as in Beta, don't set a default for Reference Previews. Rely on it either being - // null (= disabled), or follow what the "betafeatures-auto-enroll" flag says. - if ( $config->get( 'PopupsReferencePreviews' ) && - !$config->get( 'PopupsReferencePreviewsBetaFeature' ) - ) { - $user->setOption( PopupsContext::REFERENCE_PREVIEWS_PREFERENCE_NAME, $default ); - } } /** @@ -224,7 +221,7 @@ class PopupsHooks { if ( $config->get( 'PopupsReferencePreviewsBetaFeature' ) && $config->get( 'PopupsReferencePreviews' ) ) { - $prefs[PopupsContext::REFERENCE_PREVIEWS_PREFERENCE_NAME] = [ + $prefs[PopupsContext::REFERENCE_PREVIEWS_BETA_FEATURE_KEY] = [ 'label-message' => 'popups-refpreview-beta-feature-message', 'desc-message' => 'popups-refpreview-beta-feature-description', 'screenshot' => [ diff --git a/resources/dist/index.js b/resources/dist/index.js index 9c97ba545..aa25da8e3 100644 Binary files a/resources/dist/index.js and b/resources/dist/index.js differ diff --git a/resources/dist/index.js.map.json b/resources/dist/index.js.map.json index ad99b7058..1902081c4 100644 Binary files a/resources/dist/index.js.map.json and b/resources/dist/index.js.map.json differ diff --git a/src/index.js b/src/index.js index cb4406216..41d0a6f2b 100644 --- a/src/index.js +++ b/src/index.js @@ -168,7 +168,7 @@ function registerChangeListeners( pagePreviewGateway = createPagePreviewGateway( mw.config ), referenceGateway = createReferenceGateway(), userSettings = createUserSettings( mw.storage ), - settingsDialog = createSettingsDialogRenderer(), + settingsDialog = createSettingsDialogRenderer( mw.config ), experiments = createExperiments( mw.experiments ), statsvTracker = getStatsvTracker( mw.user, mw.config, experiments ), // Virtual pageviews are always tracked. diff --git a/src/ui/settingsDialog.js b/src/ui/settingsDialog.js index 073a33fe9..e5c7d6e77 100644 --- a/src/ui/settingsDialog.js +++ b/src/ui/settingsDialog.js @@ -8,14 +8,20 @@ import { renderSettingsDialog } from './templates/settingsDialog/settingsDialog' * Create the settings dialog shown to anonymous users. * * @param {boolean} navPopupsEnabled + * @param {boolean} isReferencePreviewsInBeta * @return {JQuery} settings dialog */ -export function createSettingsDialog( navPopupsEnabled ) { +export function createSettingsDialog( navPopupsEnabled, isReferencePreviewsInBeta ) { const choices = [ { id: 'simple', name: mw.msg( 'popups-settings-option-simple' ), - description: mw.msg( 'popups-settings-option-simple-description' ), + description: mw.msg( + // TODO: Remove when not in Beta any more + isReferencePreviewsInBeta ? + 'popups-settings-option-simple-description' : + 'popups-settings-option-unified-description' + ), isChecked: true }, { @@ -35,7 +41,12 @@ export function createSettingsDialog( navPopupsEnabled ) { } return renderSettingsDialog( { - heading: mw.msg( 'popups-settings-title' ), + heading: mw.msg( + // TODO: Remove when not in Beta any more + isReferencePreviewsInBeta ? + 'popups-settings-title' : + 'popups-settings-unified-title' + ), closeLabel: mw.msg( 'popups-settings-cancel' ), saveLabel: mw.msg( 'popups-settings-save' ), helpText: mw.msg( 'popups-settings-help' ), diff --git a/src/ui/settingsDialogRenderer.js b/src/ui/settingsDialogRenderer.js index 84abf2e26..39b859131 100644 --- a/src/ui/settingsDialogRenderer.js +++ b/src/ui/settingsDialogRenderer.js @@ -8,9 +8,10 @@ import { createSettingsDialog } from './settingsDialog'; * Creates a render function that will create the settings dialog and return * a set of methods to operate on it * + * @param {mw.Map} config * @return {Function} render function */ -export default function createSettingsDialogRenderer() { +export default function createSettingsDialogRenderer( config ) { /** * Cached settings dialog * @@ -32,7 +33,7 @@ export default function createSettingsDialogRenderer() { */ return ( boundActions ) => { if ( !$dialog ) { - $dialog = createSettingsDialog( isNavPopupsEnabled() ); + $dialog = createSettingsDialog( isNavPopupsEnabled(), config.get( 'wgPopupsReferencePreviewsBeta' ) ); $overlay = $( '
' ).addClass( 'mwe-popups-overlay' ); // Setup event bindings diff --git a/tests/node-qunit/ui/settingsDialogRenderer.test.js b/tests/node-qunit/ui/settingsDialogRenderer.test.js index 8746e8367..95b99b1d9 100644 --- a/tests/node-qunit/ui/settingsDialogRenderer.test.js +++ b/tests/node-qunit/ui/settingsDialogRenderer.test.js @@ -34,7 +34,7 @@ QUnit.test( '#render', ( assert ) => { toggleHelp() {}, setEnabled() {} }, - result = createSettingsDialogRenderer()( boundActions ); + result = createSettingsDialogRenderer( mw.config )( boundActions ); // Specifically NOT a deep equal. Only structure. assert.propEqual( diff --git a/tests/phpunit/PopupsHooksTest.php b/tests/phpunit/PopupsHooksTest.php index eb835f9d9..149a160a1 100644 --- a/tests/phpunit/PopupsHooksTest.php +++ b/tests/phpunit/PopupsHooksTest.php @@ -267,16 +267,15 @@ class PopupsHooksTest extends MediaWikiTestCase { $vars = []; PopupsHooks::onMakeGlobalVariablesScript( $vars, $outputPage ); - $this->assertCount( 3, $vars, 'Number of added variables.' ); + $this->assertCount( 4, $vars, 'Number of added variables.' ); $this->assertFalse( $vars[ 'wgPopupsConflictsWithNavPopupGadget' ], 'The PopupsConflictsWithNavPopupGadget global is present and false.' ); } /** * @covers ::onUserGetDefaultOptions - * @dataProvider provideReferencePreviewsBetaFlag */ - public function testOnUserGetDefaultOptions( $beta ) { + public function testOnUserGetDefaultOptions() { $userOptions = [ 'test' => 'not_empty' ]; @@ -284,23 +283,20 @@ class PopupsHooksTest extends MediaWikiTestCase { $this->setMwGlobals( [ 'wgPopupsOptInDefaultState' => '1', 'wgPopupsReferencePreviews' => true, - 'wgPopupsReferencePreviewsBetaFeature' => $beta, ] ); PopupsHooks::onUserGetDefaultOptions( $userOptions ); - $this->assertCount( 3 - $beta, $userOptions ); - $this->assertSame( '1', $userOptions[ PopupsContext::PREVIEWS_OPTIN_PREFERENCE_NAME ] ); + $this->assertCount( 2, $userOptions ); } /** * @covers ::onUserGetDefaultOptions - * @dataProvider provideReferencePreviewsBetaFlag */ - public function testOnLocalUserCreatedForNewlyCreatedUser( $beta ) { + public function testOnLocalUserCreatedForNewlyCreatedUser() { $expectedState = '1'; $userMock = $this->createMock( User::class ); - $userMock->expects( $this->exactly( 2 - $beta ) ) + $userMock->expects( $this->exactly( 1 ) ) ->method( 'setOption' ) ->withConsecutive( [ 'popups', $expectedState ], @@ -310,16 +306,8 @@ class PopupsHooksTest extends MediaWikiTestCase { $this->setMwGlobals( [ 'wgPopupsOptInStateForNewAccounts' => $expectedState, 'wgPopupsReferencePreviews' => true, - 'wgPopupsReferencePreviewsBetaFeature' => $beta, ] ); PopupsHooks::onLocalUserCreated( $userMock, false ); } - public function provideReferencePreviewsBetaFlag() { - return [ - [ false ], - [ true ], - ]; - } - }