Remove code related to no-anonymous-editing mode of MobileFrontend
All of this would only be used with the configuration setting `$wgMFEditorOptions['anonymousEditing'] = false;`. Removed features: * Call-to-action popup in skins.minerva.editor (note that anonymous editors still get a CTA from MobileFrontend's EditorOverlay code) * Pointer towards the edit button shown after registering via the CTA (entire skins.minerva.newusers module) Bug: T205382 Change-Id: I66c7035f7a23581811dda87c911dea41d4a8e5da
This commit is contained in:
parent
cb30d47a99
commit
cada514ded
|
@ -5,17 +5,12 @@
|
||||||
"minerva-last-modified-date": "Last edited on $1, at $2",
|
"minerva-last-modified-date": "Last edited on $1, at $2",
|
||||||
"minerva-talk-add-topic": "Add discussion",
|
"minerva-talk-add-topic": "Add discussion",
|
||||||
"mobile-frontend-cookies-required": "Cookies are required to switch view modes. Please enable them and try again.",
|
"mobile-frontend-cookies-required": "Cookies are required to switch view modes. Please enable them and try again.",
|
||||||
"mobile-frontend-editor-cta": "Help improve this page!",
|
|
||||||
"minerva-pointer-dismiss": "Dismiss",
|
|
||||||
"mobile-frontend-editor-disabled": "This page is protected to prevent vandalism.",
|
"mobile-frontend-editor-disabled": "This page is protected to prevent vandalism.",
|
||||||
"mobile-frontend-editor-edit": "Edit",
|
"mobile-frontend-editor-edit": "Edit",
|
||||||
"minerva-download": "Download",
|
"minerva-download": "Download",
|
||||||
"mobile-frontend-editor-redlink-create": "Create page",
|
"mobile-frontend-editor-redlink-create": "Create page",
|
||||||
"mobile-frontend-editor-redlink-explain": "This page has not yet been created.",
|
"mobile-frontend-editor-redlink-explain": "This page has not yet been created.",
|
||||||
"mobile-frontend-editor-redlink-leave": "No, thanks.",
|
"mobile-frontend-editor-redlink-leave": "No, thanks.",
|
||||||
"mobile-frontend-editor-tutorial-cancel": "No, thanks",
|
|
||||||
"mobile-frontend-editor-tutorial-confirm": "Start editing",
|
|
||||||
"mobile-frontend-editor-tutorial-summary": "Try improving the $1 page.<br />Don't be scared of markup.",
|
|
||||||
"mobile-frontend-editor-uploadenable": "Please upload a photo first to enable editing.",
|
"mobile-frontend-editor-uploadenable": "Please upload a photo first to enable editing.",
|
||||||
"mobile-frontend-footer-sitename": "{{SITENAME}}",
|
"mobile-frontend-footer-sitename": "{{SITENAME}}",
|
||||||
"mobile-frontend-history": "View edit history of this page.",
|
"mobile-frontend-history": "View edit history of this page.",
|
||||||
|
|
|
@ -14,17 +14,12 @@
|
||||||
"minerva-last-modified-date": "Text that displays the date the page was last modified. Parameters:\n* $1 - date\n* $2 - time\n{{Related|Mobile-frontend-last-modified}}",
|
"minerva-last-modified-date": "Text that displays the date the page was last modified. Parameters:\n* $1 - date\n* $2 - time\n{{Related|Mobile-frontend-last-modified}}",
|
||||||
"minerva-talk-add-topic": "Label for button which shows at bottom of talk pages in mobile view prompting addition of topic",
|
"minerva-talk-add-topic": "Label for button which shows at bottom of talk pages in mobile view prompting addition of topic",
|
||||||
"mobile-frontend-cookies-required": "Error message shown when user attempts to switch site modes and cookies are not enabled.",
|
"mobile-frontend-cookies-required": "Error message shown when user attempts to switch site modes and cookies are not enabled.",
|
||||||
"mobile-frontend-editor-cta": "Caption for call to action when an anonymous user clicks on edit icon. (Note the mobile site currently doesn't allow anonymous editing.)\n{{Identical|Help improve this page}}",
|
|
||||||
"minerva-pointer-dismiss": "Label of button that dismisses overlay pointing at a particular new feature.",
|
|
||||||
"mobile-frontend-editor-disabled": "Toast message that appears when a user is unable to edit a page and clicks edit icon.",
|
"mobile-frontend-editor-disabled": "Toast message that appears when a user is unable to edit a page and clicks edit icon.",
|
||||||
"mobile-frontend-editor-edit": "Caption for the link showing edit form. (In the imperative mood)\n{{Identical|Edit}}",
|
"mobile-frontend-editor-edit": "Caption for the link showing edit form. (In the imperative mood)\n{{Identical|Edit}}",
|
||||||
"minerva-download": "Caption for the download button (in the imperative mood).\n{{Identical|Download}}",
|
"minerva-download": "Caption for the download button (in the imperative mood).\n{{Identical|Download}}",
|
||||||
"mobile-frontend-editor-redlink-create": "Label for a create page button.\n{{Identical|Create page}}",
|
"mobile-frontend-editor-redlink-create": "Label for a create page button.\n{{Identical|Create page}}",
|
||||||
"mobile-frontend-editor-redlink-explain": "Question for the user, if he want to edit a page, which link he clicked and that does not exist yet, or not.",
|
"mobile-frontend-editor-redlink-explain": "Question for the user, if he want to edit a page, which link he clicked and that does not exist yet, or not.",
|
||||||
"mobile-frontend-editor-redlink-leave": "Used as a label for a button which the user can click to avoid editing a page which does not exist yet (red link): the question/alternative button is {{msg-mw|mobile-frontend-editor-redlink-create}}\n----\n{{Identical|No thanks}}",
|
"mobile-frontend-editor-redlink-leave": "Used as a label for a button which the user can click to avoid editing a page which does not exist yet (red link): the question/alternative button is {{msg-mw|mobile-frontend-editor-redlink-create}}\n----\n{{Identical|No thanks}}",
|
||||||
"mobile-frontend-editor-tutorial-cancel": "Label for button that user can click if they do not want to edit.\n{{Identical|No thanks}}",
|
|
||||||
"mobile-frontend-editor-tutorial-confirm": "Text for the button a user clicks after they have read the editing tutorial and are ready to edit the page.\n\nSee also:\n* {{msg-mw|Mobile-frontend-editor-tutorial-summary}}",
|
|
||||||
"mobile-frontend-editor-tutorial-summary": "Text for tutorial overlay presented to a user the first time they try to edit a page.\n\nParameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Mobile-frontend-editor-tutorial-alt-summary}}",
|
|
||||||
"mobile-frontend-editor-uploadenable": "Shown when try to edit a new file page.",
|
"mobile-frontend-editor-uploadenable": "Shown when try to edit a new file page.",
|
||||||
"mobile-frontend-footer-sitename": "Name of site",
|
"mobile-frontend-footer-sitename": "Name of site",
|
||||||
"mobile-frontend-history": "Used as label for the link which points to the \"Edit history\" page.\n\nThis is shown on the Main Page in place of a last modified label to avoid confusion caused by transclusions.\n\nIf not the Main Page, the following message is used:\n* {{msg-mw|Mobile-frontend-last-modified-date}}",
|
"mobile-frontend-history": "Used as label for the link which points to the \"Edit history\" page.\n\nThis is shown on the Main Page in place of a last modified label to avoid confusion caused by transclusions.\n\nIf not the Main Page, the following message is used:\n* {{msg-mw|Mobile-frontend-last-modified-date}}",
|
||||||
|
|
|
@ -1217,21 +1217,6 @@ class SkinMinerva extends SkinTemplate {
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks to see if the current page is (probably) editable by the current user
|
|
||||||
*
|
|
||||||
* This is mostly the same check that sets wgIsProbablyEditable later in the page output
|
|
||||||
* process.
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
protected function isCurrentPageEditableByUser() {
|
|
||||||
$title = $this->getTitle();
|
|
||||||
$user = $this->getUser();
|
|
||||||
return $title->quickUserCan( 'edit', $user )
|
|
||||||
&& ( $title->exists() || $title->quickUserCan( 'create', $user ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks whether the editor can handle the existing content handler type.
|
* Checks whether the editor can handle the existing content handler type.
|
||||||
*
|
*
|
||||||
|
@ -1314,7 +1299,6 @@ class SkinMinerva extends SkinTemplate {
|
||||||
$modules = [];
|
$modules = [];
|
||||||
$user = $this->getUser();
|
$user = $this->getUser();
|
||||||
$req = $this->getRequest();
|
$req = $this->getRequest();
|
||||||
$action = $req->getVal( 'article_action' );
|
|
||||||
$title = $this->getTitle();
|
$title = $this->getTitle();
|
||||||
|
|
||||||
if ( !$title->isSpecialPage() ) {
|
if ( !$title->isSpecialPage() ) {
|
||||||
|
@ -1331,12 +1315,6 @@ class SkinMinerva extends SkinTemplate {
|
||||||
if ( $this->useEcho() ) {
|
if ( $this->useEcho() ) {
|
||||||
$modules[] = 'skins.minerva.notifications';
|
$modules[] = 'skins.minerva.notifications';
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( $this->isCurrentPageEditableByUser() ) {
|
|
||||||
if ( $action === 'signup-edit' ) {
|
|
||||||
$modules[] = 'skins.minerva.newusers';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TalkOverlay feature
|
// TalkOverlay feature
|
||||||
|
|
|
@ -1,16 +1,12 @@
|
||||||
( function ( M, $ ) {
|
( function ( M, $ ) {
|
||||||
|
|
||||||
var
|
var
|
||||||
// see: https://www.mediawiki.org/wiki/Manual:Interface/JavaScript#Page-specific
|
|
||||||
isReadOnly = mw.config.get( 'wgMinervaReadOnly' ),
|
|
||||||
isEditable = !isReadOnly && mw.config.get( 'wgIsProbablyEditable' ),
|
|
||||||
router = require( 'mediawiki.router' ),
|
router = require( 'mediawiki.router' ),
|
||||||
issues = M.require( 'skins.minerva.scripts/pageIssues' ),
|
issues = M.require( 'skins.minerva.scripts/pageIssues' ),
|
||||||
overlayManager = M.require( 'skins.minerva.scripts/overlayManager' ),
|
overlayManager = M.require( 'skins.minerva.scripts/overlayManager' ),
|
||||||
loader = M.require( 'mobile.startup/rlModuleLoader' ),
|
loader = M.require( 'mobile.startup/rlModuleLoader' ),
|
||||||
skin = M.require( 'skins.minerva.scripts/skin' ),
|
skin = M.require( 'skins.minerva.scripts/skin' ),
|
||||||
currentPage = M.getCurrentPage(),
|
currentPage = M.getCurrentPage(),
|
||||||
editErrorMessage = isReadOnly ? mw.msg( 'apierror-readonly' ) : mw.msg( 'mobile-frontend-editor-disabled' ),
|
|
||||||
// #ca-edit, .mw-editsection are standard MediaWiki elements
|
// #ca-edit, .mw-editsection are standard MediaWiki elements
|
||||||
// .edit-link comes from MobileFrontend user page creation CTA
|
// .edit-link comes from MobileFrontend user page creation CTA
|
||||||
$allEditLinks = $( '#ca-edit a, .mw-editsection a, .edit-link' ),
|
$allEditLinks = $( '#ca-edit a, .mw-editsection a, .edit-link' ),
|
||||||
|
@ -25,9 +21,7 @@
|
||||||
isNewFile = currentPage.inNamespace( 'file' ) && isNewPage,
|
isNewFile = currentPage.inNamespace( 'file' ) && isNewPage,
|
||||||
veConfig = mw.config.get( 'wgVisualEditorConfig' ),
|
veConfig = mw.config.get( 'wgVisualEditorConfig' ),
|
||||||
// FIXME: Should we consider default site options and user prefs?
|
// FIXME: Should we consider default site options and user prefs?
|
||||||
isVisualEditorEnabled = veConfig,
|
isVisualEditorEnabled = veConfig;
|
||||||
CtaDrawer = M.require( 'mobile.startup/CtaDrawer' ),
|
|
||||||
drawer;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Event handler for edit link clicks. Will prevent default link
|
* Event handler for edit link clicks. Will prevent default link
|
||||||
|
@ -44,42 +38,6 @@
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Make an element render a CTA when clicked
|
|
||||||
* @method
|
|
||||||
* @ignore
|
|
||||||
* @param {JQuery.Object} $el Element which will render a drawer on click
|
|
||||||
* @param {number} section number representing the section
|
|
||||||
*/
|
|
||||||
function makeCta( $el, section ) {
|
|
||||||
$el
|
|
||||||
.on( 'click', function ( ev ) {
|
|
||||||
ev.preventDefault();
|
|
||||||
// prevent folding section when clicking Edit
|
|
||||||
ev.stopPropagation();
|
|
||||||
// need to use toggle() because we do ev.stopPropagation() (in onEditLinkClick())
|
|
||||||
if ( !drawer ) {
|
|
||||||
drawer = new CtaDrawer( {
|
|
||||||
queryParams: {
|
|
||||||
returnto: mw.config.get( 'wgPageName' ),
|
|
||||||
returntoquery: 'action=edit§ion=' + section,
|
|
||||||
warning: 'mobile-frontend-edit-login-action',
|
|
||||||
campaign: 'mobile_editPageActionCta'
|
|
||||||
},
|
|
||||||
signupQueryParams: {
|
|
||||||
returntoquery: 'article_action=signup-edit',
|
|
||||||
warning: 'mobile-frontend-edit-signup-action'
|
|
||||||
},
|
|
||||||
content: mw.msg( 'mobile-frontend-editor-cta' )
|
|
||||||
} );
|
|
||||||
}
|
|
||||||
drawer
|
|
||||||
.toggle();
|
|
||||||
} )
|
|
||||||
// needed until we use tap everywhere to prevent the link from being followed
|
|
||||||
.on( 'click', false );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve the user's preferred editor setting. If none is set, return the default
|
* Retrieve the user's preferred editor setting. If none is set, return the default
|
||||||
* editor for this wiki.
|
* editor for this wiki.
|
||||||
|
@ -261,30 +219,17 @@
|
||||||
* @ignore
|
* @ignore
|
||||||
*/
|
*/
|
||||||
function init() {
|
function init() {
|
||||||
|
var isReadOnly, isEditable, editErrorMessage;
|
||||||
|
// see: https://www.mediawiki.org/wiki/Manual:Interface/JavaScript#Page-specific
|
||||||
|
isReadOnly = mw.config.get( 'wgMinervaReadOnly' );
|
||||||
|
isEditable = !isReadOnly && mw.config.get( 'wgIsProbablyEditable' );
|
||||||
|
|
||||||
if ( isEditable ) {
|
if ( isEditable ) {
|
||||||
// Edit button updated in setupEditor.
|
// Edit button updated in setupEditor.
|
||||||
setupEditor( currentPage );
|
setupEditor( currentPage );
|
||||||
} else {
|
} else {
|
||||||
hideSectionEditIcons();
|
hideSectionEditIcons();
|
||||||
showSorryToast( editErrorMessage );
|
editErrorMessage = isReadOnly ? mw.msg( 'apierror-readonly' ) : mw.msg( 'mobile-frontend-editor-disabled' );
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize the edit button so that it launches a login call-to-action when clicked.
|
|
||||||
* @method
|
|
||||||
* @ignore
|
|
||||||
*/
|
|
||||||
function initCta() {
|
|
||||||
// Initialize edit button links (to show Cta) only, if page is editable,
|
|
||||||
// otherwise show an error toast
|
|
||||||
if ( isEditable ) {
|
|
||||||
// Init all edit links (including lead section, if anonymous editing is enabled)
|
|
||||||
$allEditLinks.each( function () {
|
|
||||||
var section = ( new mw.Uri( this.href ) ).query.section || '';
|
|
||||||
makeCta( $( this ), section );
|
|
||||||
} );
|
|
||||||
} else {
|
|
||||||
showSorryToast( editErrorMessage );
|
showSorryToast( editErrorMessage );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -322,17 +267,7 @@
|
||||||
// Is a new file page (enable upload image only) Bug 58311
|
// Is a new file page (enable upload image only) Bug 58311
|
||||||
showSorryToast( mw.msg( 'mobile-frontend-editor-uploadenable' ) );
|
showSorryToast( mw.msg( 'mobile-frontend-editor-uploadenable' ) );
|
||||||
} else {
|
} else {
|
||||||
// Edit button is currently hidden. A call to init() / initCta() will update
|
// Edit button is currently hidden. A call to init() will update it as needed.
|
||||||
// it as needed.
|
init();
|
||||||
if ( user.isAnon() ) {
|
|
||||||
// Cta's will be rendered in EditorOverlay, if anonymous editing is enabled.
|
|
||||||
if ( mw.config.get( 'wgMFEditorOptions' ).anonymousEditing ) {
|
|
||||||
init();
|
|
||||||
} else {
|
|
||||||
initCta();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
init();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}( mw.mobileFrontend, jQuery ) );
|
}( mw.mobileFrontend, jQuery ) );
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
<p>{{{summary}}}</p>
|
|
||||||
<div class="button-bar">
|
|
||||||
{{#cancelMsg}}<button class="button cancel inline">{{cancelMsg}}</button>{{/cancelMsg}}
|
|
||||||
{{#confirmMsg}}<button class="button actionable">{{confirmMsg}}</button>{{/confirmMsg}}
|
|
||||||
</div>
|
|
|
@ -1,145 +0,0 @@
|
||||||
( function ( M, $ ) {
|
|
||||||
var msg = mw.msg,
|
|
||||||
template = mw.template,
|
|
||||||
Overlay = M.require( 'mobile.startup/Overlay' );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Page overlay prompting a user for given action
|
|
||||||
* @class PointerOverlay
|
|
||||||
*/
|
|
||||||
function PointerOverlay() {
|
|
||||||
Overlay.apply( this, arguments );
|
|
||||||
}
|
|
||||||
|
|
||||||
OO.mfExtend( PointerOverlay, Overlay, {
|
|
||||||
className: 'overlay pointer-overlay tutorial-overlay',
|
|
||||||
isBorderBox: false,
|
|
||||||
fullScreen: false,
|
|
||||||
closeOnContentTap: true,
|
|
||||||
template: template.get( 'skins.minerva.newusers', 'PointerOverlay.hogan' ),
|
|
||||||
/**
|
|
||||||
* @cfg {object} defaults Default options hash.
|
|
||||||
* @cfg {string} defaults.isCompact whether the pointer overlay should be compact
|
|
||||||
* @cfg {number} defaults.timeout in milliseconds. If not zero the pointer overlay will
|
|
||||||
* hide after this duration of time.
|
|
||||||
* @cfg {string} defaults.isTutorial whether the pointer overlay contains tutorial like
|
|
||||||
* instructions
|
|
||||||
* @cfg {string} defaults.summary Message describing thing being pointed to.
|
|
||||||
* @cfg {string} defaults.cancelMsg Cancel message.
|
|
||||||
* @cfg {string} defaults.appendToElement Where pointer overlay should be appended to.
|
|
||||||
* @cfg {string} defaults.target jQuery selector to point tutorial at
|
|
||||||
* @cfg {string} [defaults.alignment] Determines where the pointer should point to. Valid
|
|
||||||
* values 'left' or 'center'
|
|
||||||
* @cfg {string} [defaults.confirmMsg] Label for a confirm message.
|
|
||||||
* @memberof PointerOverlay
|
|
||||||
* @instance
|
|
||||||
*/
|
|
||||||
defaults: $.extend( {}, Overlay.prototype.defaults, {
|
|
||||||
summary: undefined,
|
|
||||||
isCompact: false,
|
|
||||||
isTutorial: false,
|
|
||||||
timeout: 0,
|
|
||||||
cancelMsg: msg( 'minerva-pointer-dismiss' ),
|
|
||||||
appendToElement: undefined,
|
|
||||||
target: undefined,
|
|
||||||
alignment: 'center',
|
|
||||||
confirmMsg: undefined
|
|
||||||
} ),
|
|
||||||
events: {
|
|
||||||
'click .cancel': 'hide'
|
|
||||||
},
|
|
||||||
postRender: function () {
|
|
||||||
var $target,
|
|
||||||
self = this;
|
|
||||||
|
|
||||||
Overlay.prototype.postRender.apply( this );
|
|
||||||
|
|
||||||
if ( this.options.isCompact ) {
|
|
||||||
this.$el.addClass( 'pointer-overlay-compact' );
|
|
||||||
}
|
|
||||||
if ( this.options.isTutorial ) {
|
|
||||||
this.$el.addClass( 'pointer-overlay-tutorial' );
|
|
||||||
}
|
|
||||||
if ( this.options.timeout ) {
|
|
||||||
setTimeout( function () {
|
|
||||||
self.hide();
|
|
||||||
}, this.options.timeout );
|
|
||||||
}
|
|
||||||
if ( self.options.target ) {
|
|
||||||
// FIXME: this option should be a jQuery object already. Avoid use of global $.
|
|
||||||
$target = $( self.options.target );
|
|
||||||
// Ensure we position the overlay correctly but do not show the arrow
|
|
||||||
self._position( $target );
|
|
||||||
this.addPointerArrow( $target );
|
|
||||||
}
|
|
||||||
},
|
|
||||||
/**
|
|
||||||
* Refreshes the pointer arrow.
|
|
||||||
* @method
|
|
||||||
* @param {string} target jQuery selector
|
|
||||||
* @memberof PointerOverlay
|
|
||||||
* @instance
|
|
||||||
*/
|
|
||||||
refreshPointerArrow: function ( target ) {
|
|
||||||
this.$pointer.remove();
|
|
||||||
this.addPointerArrow( $( target ) );
|
|
||||||
},
|
|
||||||
/**
|
|
||||||
* Position the overlay under a specified element
|
|
||||||
* @private
|
|
||||||
* @memberof PointerOverlay
|
|
||||||
* @instance
|
|
||||||
* @param {JQuery.Object} $pa An element that should be pointed at by the overlay
|
|
||||||
*/
|
|
||||||
_position: function ( $pa ) {
|
|
||||||
var left,
|
|
||||||
paOffset = $pa.offset(),
|
|
||||||
h = $pa.outerHeight( true ),
|
|
||||||
y = paOffset.top + h;
|
|
||||||
|
|
||||||
this.$el.css( 'top', y );
|
|
||||||
if ( this.options.autoHide ) {
|
|
||||||
left = paOffset.left;
|
|
||||||
this.$el.css( 'left', left );
|
|
||||||
}
|
|
||||||
},
|
|
||||||
/**
|
|
||||||
* Position overlay and add pointer arrow that points at specified element
|
|
||||||
*
|
|
||||||
* @memberof PointerOverlay
|
|
||||||
* @instance
|
|
||||||
* @param {JQuery.Object} $pa An element that should be pointed at by the overlay
|
|
||||||
*/
|
|
||||||
addPointerArrow: function ( $pa ) {
|
|
||||||
var left,
|
|
||||||
paOffset = $pa.offset(),
|
|
||||||
overlayOffset = this.$el.offset(),
|
|
||||||
center = $pa.width() / 2;
|
|
||||||
|
|
||||||
this._position( $pa );
|
|
||||||
// add the entire width of the pointer
|
|
||||||
left = 24;
|
|
||||||
if ( !this.options.autoHide ) {
|
|
||||||
left += paOffset.left - overlayOffset.left;
|
|
||||||
}
|
|
||||||
if ( this.alignment === 'center' ) {
|
|
||||||
left -= center;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.$pointer = $( '<div class="tutorial-pointer"></div>' ).css( {
|
|
||||||
top: -6,
|
|
||||||
left: left
|
|
||||||
} ).appendTo( this.$el );
|
|
||||||
|
|
||||||
// Since the positioning of this overlay is dependent on the current viewport it makes
|
|
||||||
// sense to use a global window event so that on resizes it is correctly positioned.
|
|
||||||
M.on(
|
|
||||||
'resize',
|
|
||||||
$.proxy( this, 'refreshPointerArrow', this.options.target )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} );
|
|
||||||
|
|
||||||
M.define( 'skins.minerva.newusers/PointerOverlay', PointerOverlay );
|
|
||||||
|
|
||||||
}( mw.mobileFrontend, jQuery ) );
|
|
|
@ -1,93 +0,0 @@
|
||||||
@import '../../minerva.less/minerva.variables';
|
|
||||||
|
|
||||||
@colorTutorial: #2e76ff;
|
|
||||||
|
|
||||||
@media all and ( min-width: @width-breakpoint-tablet ) {
|
|
||||||
// Take into account padding in width of pointer overlay so that it
|
|
||||||
// can point to anything in the containing content area and avoid
|
|
||||||
// padding issues such as https://phabricator.wikimedia.org/F287611
|
|
||||||
#mw-mf-page-center .pointer-overlay {
|
|
||||||
max-width: @width-breakpoint-desktop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.pointer-overlay {
|
|
||||||
width: auto;
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
line-height: 1.4;
|
|
||||||
font-size: 0.9em;
|
|
||||||
text-align: center;
|
|
||||||
border-radius: @borderRadius;
|
|
||||||
margin-top: 10px;
|
|
||||||
color: #fff;
|
|
||||||
padding: 1em 16px;
|
|
||||||
|
|
||||||
p {
|
|
||||||
line-height: 1.4;
|
|
||||||
margin: 0 0 1em;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button {
|
|
||||||
// FIXME: without this the cloaked input seems to interfere making cancel button start upload
|
|
||||||
position: relative;
|
|
||||||
padding: 12px;
|
|
||||||
font-weight: bold;
|
|
||||||
width: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic pointer definition
|
|
||||||
.tutorial-pointer {
|
|
||||||
position: absolute;
|
|
||||||
border-right: 6px solid transparent;
|
|
||||||
border-left: 6px solid transparent;
|
|
||||||
border-bottom: 6px solid transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.pointer-overlay-tutorial {
|
|
||||||
background: @colorTutorial;
|
|
||||||
box-shadow: none;
|
|
||||||
|
|
||||||
// Pointer color nested so it may be changed in other tutorials
|
|
||||||
.tutorial-pointer {
|
|
||||||
border-bottom-color: @colorTutorial;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button {
|
|
||||||
// use background to override gradient in other buttons
|
|
||||||
background: #fff;
|
|
||||||
border-radius: @borderRadius;
|
|
||||||
color: @colorTutorial;
|
|
||||||
padding: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cancel.inline {
|
|
||||||
background: none;
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button-bar {
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.pointer-overlay-compact {
|
|
||||||
background: @colorGray2;
|
|
||||||
width: auto;
|
|
||||||
/* @noflip */
|
|
||||||
right: auto;
|
|
||||||
padding: 0.6em;
|
|
||||||
|
|
||||||
// Pointer color nested so it may be changed in other tutorials
|
|
||||||
.tutorial-pointer {
|
|
||||||
border-bottom-color: @colorGray2;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,59 +0,0 @@
|
||||||
/* This code handles the editing tutorial/CTA:
|
|
||||||
|
|
||||||
EditTutorial - When an editor registers via the edit page action, upon returning to the
|
|
||||||
page, show a blue guider prompting them to continue editing. You can replicate this by
|
|
||||||
appending article_action=signup-edit to the URL of an editable page whilst logged in.
|
|
||||||
*/
|
|
||||||
( function ( M, $ ) {
|
|
||||||
var PointerOverlay = M.require( 'skins.minerva.newusers/PointerOverlay' ),
|
|
||||||
skin = M.require( 'skins.minerva.scripts/skin' ),
|
|
||||||
mainMenu = M.require( 'skins.minerva.scripts.top/mainMenu' ),
|
|
||||||
util = M.require( 'mobile.startup/util' ),
|
|
||||||
escapeHash = util.escapeHash,
|
|
||||||
inEditor = window.location.hash.indexOf( '#editor/' ) > -1,
|
|
||||||
hash = window.location.hash,
|
|
||||||
editOverlay, target;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If the user came from an edit button signup, show guider.
|
|
||||||
* @ignore
|
|
||||||
* @return {boolean}
|
|
||||||
*/
|
|
||||||
function shouldShowTutorial() {
|
|
||||||
var shouldShowEditTutorial = mw.util.getParamValue( 'article_action' ) === 'signup-edit' && !inEditor;
|
|
||||||
return shouldShowEditTutorial;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( hash && hash.indexOf( '/' ) === -1 ) {
|
|
||||||
target = escapeHash( hash ) + ' ~ .edit-page';
|
|
||||||
} else {
|
|
||||||
target = '#ca-edit .edit-page';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Note the element might have a new ID if the wikitext was changed so check it exists
|
|
||||||
if ( $( target ).length > 0 && shouldShowTutorial() ) {
|
|
||||||
editOverlay = new PointerOverlay( {
|
|
||||||
target: target,
|
|
||||||
skin: skin,
|
|
||||||
isTutorial: true,
|
|
||||||
className: 'slide active editing',
|
|
||||||
appendToElement: '#mw-mf-page-center',
|
|
||||||
summary: mw.msg( 'mobile-frontend-editor-tutorial-summary', mw.config.get( 'wgTitle' ) ),
|
|
||||||
confirmMsg: mw.msg( 'mobile-frontend-editor-tutorial-confirm' ),
|
|
||||||
cancelMsg: mw.msg( 'mobile-frontend-editor-tutorial-cancel' )
|
|
||||||
} );
|
|
||||||
mainMenu.on( 'open', function () {
|
|
||||||
editOverlay.hide();
|
|
||||||
} );
|
|
||||||
editOverlay.show();
|
|
||||||
$( '#ca-edit' ).on( 'mousedown', $.proxy( editOverlay, 'hide' ) );
|
|
||||||
// Initialize the 'Start editing' button
|
|
||||||
editOverlay.$( '.actionable' ).on( 'click', function () {
|
|
||||||
// Hide the tutorial
|
|
||||||
editOverlay.hide();
|
|
||||||
// Load the editing interface by changing the URL hash
|
|
||||||
window.location.href = $( target ).attr( 'href' );
|
|
||||||
} );
|
|
||||||
}
|
|
||||||
|
|
||||||
}( mw.mobileFrontend, jQuery ) );
|
|
28
skin.json
28
skin.json
|
@ -455,33 +455,6 @@
|
||||||
"resources/skins.minerva.scripts.top/init.js"
|
"resources/skins.minerva.scripts.top/init.js"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"skins.minerva.newusers": {
|
|
||||||
"targets": [
|
|
||||||
"mobile",
|
|
||||||
"desktop"
|
|
||||||
],
|
|
||||||
"styles": [
|
|
||||||
"resources/skins.minerva.newusers/PointerOverlay.less"
|
|
||||||
],
|
|
||||||
"templates": {
|
|
||||||
"PointerOverlay.hogan": "resources/skins.minerva.newusers/PointerOverlay.hogan"
|
|
||||||
},
|
|
||||||
"dependencies": [
|
|
||||||
"skins.minerva.editor",
|
|
||||||
"mediawiki.util",
|
|
||||||
"mobile.startup"
|
|
||||||
],
|
|
||||||
"scripts": [
|
|
||||||
"resources/skins.minerva.newusers/PointerOverlay.js",
|
|
||||||
"resources/skins.minerva.newusers/init.js"
|
|
||||||
],
|
|
||||||
"messages": [
|
|
||||||
"minerva-pointer-dismiss",
|
|
||||||
"mobile-frontend-editor-tutorial-summary",
|
|
||||||
"mobile-frontend-editor-tutorial-confirm",
|
|
||||||
"mobile-frontend-editor-tutorial-cancel"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"skins.minerva.notifications.badge": {
|
"skins.minerva.notifications.badge": {
|
||||||
"messages": [
|
"messages": [
|
||||||
"echo-badge-count"
|
"echo-badge-count"
|
||||||
|
@ -537,7 +510,6 @@
|
||||||
"messages": [
|
"messages": [
|
||||||
"mobile-frontend-editor-disabled",
|
"mobile-frontend-editor-disabled",
|
||||||
"mobile-frontend-editor-uploadenable",
|
"mobile-frontend-editor-uploadenable",
|
||||||
"mobile-frontend-editor-cta",
|
|
||||||
"apierror-readonly"
|
"apierror-readonly"
|
||||||
],
|
],
|
||||||
"scripts": [
|
"scripts": [
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
@chrome @en.m.wikipedia.beta.wmflabs.org @firefox @vagrant @login
|
|
||||||
Feature: Signup edit tutorial
|
|
||||||
|
|
||||||
Background:
|
|
||||||
Given I have just signed up after trying to edit as anonymous
|
|
||||||
|
|
||||||
Scenario: Signup edit tutorial shows up correctly and hides when main menu is opened
|
|
||||||
Then I should see the signup edit tutorial
|
|
||||||
When I click on the main navigation button
|
|
||||||
Then I should not see the signup edit tutorial
|
|
|
@ -1,14 +0,0 @@
|
||||||
Given(/^I have just signed up after trying to edit as anonymous$/) do
|
|
||||||
step 'I am logged into the mobile website'
|
|
||||||
api.create_page 'Selenium mobile signup edit tutorial test', 'signup edit tutorial test'
|
|
||||||
visit(ArticlePage, using_params: { article_name: 'Selenium_mobile_signup_edit_tutorial_test?article_action=signup-edit' })
|
|
||||||
on(ArticlePage).wait_until_rl_module_ready('skins.minerva.newusers')
|
|
||||||
end
|
|
||||||
|
|
||||||
Then(/^I should see the signup edit tutorial$/) do
|
|
||||||
expect(on(ArticlePage).signup_edit_tutorial_element).to be_visible
|
|
||||||
end
|
|
||||||
|
|
||||||
Then(/^I should not see the signup edit tutorial$/) do
|
|
||||||
expect(on(ArticlePage).signup_edit_tutorial_element).not_to be_visible
|
|
||||||
end
|
|
|
@ -31,8 +31,6 @@ class ArticlePage
|
||||||
end
|
end
|
||||||
li(:upload_page_action, id: 'ca-upload')
|
li(:upload_page_action, id: 'ca-upload')
|
||||||
|
|
||||||
div(:signup_edit_tutorial, class: 'pointer-overlay-tutorial')
|
|
||||||
|
|
||||||
a(:edit_link, text: 'Edit')
|
a(:edit_link, text: 'Edit')
|
||||||
div(:anon_editor_warning, css: '.anon-msg')
|
div(:anon_editor_warning, css: '.anon-msg')
|
||||||
div(:editor_overlay, class: 'editor-overlay')
|
div(:editor_overlay, class: 'editor-overlay')
|
||||||
|
|
Loading…
Reference in New Issue