JGonera has uploaded a new change for review.
https://gerrit.wikimedia.org/r/94078
Change subject: [WIP] Separate stable and beta search JS code
......................................................................
[WIP] Separate stable and beta search JS code
Use a global search-results event rather than a write-results event of a
SearchOverlay.
Change-Id: Ia8d61ffcc4e4eb936380c5cd1493a3070f2131b4
---
M includes/Resources.php
M includes/skins/SkinMinerva.php
M javascripts/modules/lazyload.js
M javascripts/modules/mf-watchstar.js
M javascripts/modules/nearby/PagePreviewOverlay.js
M javascripts/modules/search/search.js
R javascripts/modules/searchNew/pageImages.js
A javascripts/modules/searchNew/search.js
8 files changed, 173 insertions(+), 25 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/MobileFrontend
refs/changes/78/94078/1
diff --git a/includes/Resources.php b/includes/Resources.php
index fd13321..61f0f25 100644
--- a/includes/Resources.php
+++ b/includes/Resources.php
@@ -411,19 +411,22 @@
'styles' => array(
'less/common/OverlayNew.less',
'less/modules/talk.less',
+ 'less/modules/search.less',
),
'scripts' => array(
'javascripts/common/OverlayNew.js',
'javascripts/common/LoadingOverlayNew.js',
'javascripts/modules/mf-toggle-dynamic.js',
'javascripts/modules/talk/talk.js',
- 'javascripts/modules/search/pageImages.js',
+ 'javascripts/modules/searchNew/search.js',
+ 'javascripts/modules/searchNew/pageImages.js',
'javascripts/modules/languages/preferred.js',
'javascripts/modules/lastEdited/lastEditedBeta.js',
'javascripts/modules/keepgoing/keepgoing.js',
),
'templates' => array(
'OverlayNew',
+ 'overlays/search/search',
),
'position' => 'bottom',
'messages' => array(
@@ -442,6 +445,10 @@
'mobile-frontend-last-modified-with-user-months',
'mobile-frontend-last-modified-with-user-years',
'mobile-frontend-last-modified-with-user-just-now',
+
+ // for search.js
+ 'mobile-frontend-search-help',
+ 'mobile-frontend-search-noresults',
),
),
@@ -522,7 +529,6 @@
'styles' => array(
'less/common/common-js.less',
'less/modules/languages.less',
- 'less/modules/search.less',
'less/modules/issues.less',
'less/modules/watchstar.less',
'less/modules/tutorials.less',
@@ -548,9 +554,8 @@
'overlays/languages',
'overlay',
'overlays/cleanup',
- // search-2.js
+ // search.js and Nearby.js
'articleList',
- 'overlays/search/search',
// page.js
'page',
'languageSection',
@@ -635,7 +640,6 @@
'javascripts/modules/lastEdited/time.js',
'javascripts/modules/uploads/lead-photo-init.js',
'javascripts/modules/mainmenutweaks.js',
- 'javascripts/modules/search/search.js',
'javascripts/modules/mf-watchstar.js',
'javascripts/modules/mf-references.js',
'javascripts/common/ContentOverlay.js',
@@ -675,16 +679,34 @@
'mobile-frontend-watchlist-removed',
'mobile-frontend-watchlist-cta',
- // for search.js
- 'mobile-frontend-search-help',
- 'mobile-frontend-search-noresults',
-
// newbieEditor.js
'mobile-frontend-editor-tutorial-summary',
'mobile-frontend-editor-tutorial-confirm',
),
),
+ // FIXME: remove when new search overlay in stable
+ 'mobile.search.stable' => $wgMFMobileResourceBoilerplate + array(
+ 'dependencies' => array(
+ 'mobile.stable',
+ 'mobile.templates',
+ ),
+ 'scripts' => array(
+ 'javascripts/modules/search/search.js',
+ ),
+ 'styles' => array(
+ 'less/modules/search.less',
+ ),
+ 'templates' => array(
+ 'overlays/search/search',
+ ),
+ 'messages' => array(
+ // for search.js
+ 'mobile-frontend-search-help',
+ 'mobile-frontend-search-noresults',
+ ),
+ ),
+
'mobile.site' => array(
'dependencies' => array( 'mobile.startup' ),
'class' => 'MobileSiteModule',
diff --git a/includes/skins/SkinMinerva.php b/includes/skins/SkinMinerva.php
index 006f6c7..63353f4 100644
--- a/includes/skins/SkinMinerva.php
+++ b/includes/skins/SkinMinerva.php
@@ -425,7 +425,10 @@
$modules['watch'] = array();
$modules['search'] = array();
- $modules['stableonly'] = array( 'mobile.lastEdited.stable' );
+ $modules['stableonly'] = array(
+ 'mobile.search.stable',
+ 'mobile.lastEdited.stable',
+ );
$title = $this->getTitle();
diff --git a/javascripts/modules/lazyload.js b/javascripts/modules/lazyload.js
index dd1baaa..2ce1c8b 100644
--- a/javascripts/modules/lazyload.js
+++ b/javascripts/modules/lazyload.js
@@ -1,7 +1,6 @@
( function( M, $ ) {
- var searchOverlay = M.require( 'search' ).overlay,
- history = M.history,
+ var history = M.history,
// FIXME: use fuzzy link hijacking in the main namespace - core
should be updated to make links more explicit
useFuzzyLinkHijacking = M.inNamespace( '' );
@@ -23,11 +22,11 @@
history.hijackLinks( M.getLeadSection(),
useFuzzyLinkHijacking );
} );
- searchOverlay.on( 'write-results', function() {
- var $results = searchOverlay.$( 'ul' );
+ M.on( 'search-results', function( overlay ) {
+ var $results = overlay.$( 'ul' );
history.hijackLinks( $results );
$results.find( 'a' ).on( 'click', function() {
- searchOverlay.hide();
+ overlay.hide();
} );
} );
}
diff --git a/javascripts/modules/mf-watchstar.js
b/javascripts/modules/mf-watchstar.js
index 6224d1b..43fbb86 100644
--- a/javascripts/modules/mf-watchstar.js
+++ b/javascripts/modules/mf-watchstar.js
@@ -3,7 +3,6 @@
var api = M.require( 'api' ), w = ( function() {
var popup = M.require( 'notifications' ),
- searchOverlay = M.require( 'search' ).overlay,
CtaDrawer = M.require( 'CtaDrawer' ),
drawer = new CtaDrawer( {
content: mw.msg( 'mobile-frontend-watchlist-cta' ),
@@ -217,8 +216,8 @@
}
function upgradeUI() {
- searchOverlay.on( 'write-results', function() {
- initWatchListIconList( searchOverlay.$( 'ul' ) );
+ M.on( 'search-results', function( overlay ) {
+ initWatchListIconList( overlay.$( 'ul' ) );
} );
}
diff --git a/javascripts/modules/nearby/PagePreviewOverlay.js
b/javascripts/modules/nearby/PagePreviewOverlay.js
index e77cd94..afbf0b9 100644
--- a/javascripts/modules/nearby/PagePreviewOverlay.js
+++ b/javascripts/modules/nearby/PagePreviewOverlay.js
@@ -28,6 +28,7 @@
M.pageApi.getPage( options.title,
options.endpoint, true ).done( function( page ) {
options.page = new Page( page );
// FIXME [API]: This additional ajax
request should be unnecessary.
+ // FIXME: and if necessary, reuse
PageImageApi that search uses
api.get( {
action : 'query',
prop: 'pageimages',
diff --git a/javascripts/modules/search/search.js
b/javascripts/modules/search/search.js
index 1d22270..6e1dd41 100644
--- a/javascripts/modules/search/search.js
+++ b/javascripts/modules/search/search.js
@@ -72,7 +72,7 @@
};
}
$content.html( M.template.get( 'articleList' ).render( data ) );
- this.emit( 'write-results', results );
+ M.emit( 'search-results', this, results );
},
performSearch: function() {
@@ -125,7 +125,6 @@
M.define( 'search', {
SearchOverlay: SearchOverlay,
- overlay: searchOverlay,
highlightSearchTerm: highlightSearchTerm
} );
diff --git a/javascripts/modules/search/pageImages.js
b/javascripts/modules/searchNew/pageImages.js
similarity index 90%
rename from javascripts/modules/search/pageImages.js
rename to javascripts/modules/searchNew/pageImages.js
index b4066b9..cddb23c 100644
--- a/javascripts/modules/search/pageImages.js
+++ b/javascripts/modules/searchNew/pageImages.js
@@ -37,10 +37,9 @@
return result;
}
} ),
- piApi = new PageImageApi(),
- overlay = M.require( 'search' ).overlay;
+ piApi = new PageImageApi();
- function renderPageImages( results ) {
+ function renderPageImages( overlay, results ) {
var titles = $.map( results, function( r ) { return r.title; }
);
piApi.getPageImages( titles ).done( function( pages ) {
@@ -61,9 +60,9 @@
// Add event to retrieve page images when images not disabled
if ( !mw.config.get( 'wgImagesDisabled' ) ) {
- overlay.on( 'write-results', function( results ) {
+ M.on( 'search-results', function( overlay, results ) {
window.setTimeout( function() {
- renderPageImages( results );
+ renderPageImages( overlay, results );
}, delay );
} );
}
diff --git a/javascripts/modules/searchNew/search.js
b/javascripts/modules/searchNew/search.js
new file mode 100644
index 0000000..30d0a95
--- /dev/null
+++ b/javascripts/modules/searchNew/search.js
@@ -0,0 +1,126 @@
+( function( M, $ ) {
+
+var Overlay = M.require( 'Overlay' ), SearchOverlay,
+ api = M.require( 'api' ),
+ searchOverlay;
+
+/**
+ * Escapes regular expression wildcards (metacharacters) by adding a \\ prefix
+ * @param {String} str a string
+ * @return {String} a regular expression that can be used to search for that
str
+ */
+function createSearchRegEx( str ) {
+ str = str.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&' );
+ return new RegExp( '^(' + str + ')' , 'ig' );
+}
+
+/**
+ * Takes a label potentially beginning with term
+ * and highlights term if it is present with strong
+ *
+ * @param {String} label a piece of text
+ * @param {String} term a string to search for from the start
+ * @return {String} safe html string with matched terms encapsulated in strong
tags
+ */
+function highlightSearchTerm( label, term ) {
+ label = $( '<span>' ).text( label ).html();
+ term = $( '<span>' ).text( term ).html();
+
+ return label.replace( createSearchRegEx( term ),'<strong>$1</strong>' );
+}
+
+SearchOverlay = Overlay.extend( {
+ template: M.template.get( 'overlays/search/search' ),
+ defaults: {
+ explanation: mw.msg( 'mobile-frontend-search-help' ),
+ noresults: mw.msg( 'mobile-frontend-search-noresults' ),
+ action: mw.config.get( 'wgScript' )
+ },
+ className: 'mw-mf-overlay',
+ postRender: function( options ) {
+ var self = this;
+
+ this._super( options );
+
+ this.data = this.defaults;
+
+ this.$( 'input' ).on( 'keyup', function( ev ) {
+ if ( ev.keyCode && ev.keyCode === 13 ) {
+ $( this ).parents( 'form' ).submit();
+ } else {
+ self.performSearch();
+ }
+ } );
+ this.results = [];
+ this.$( '.clear' ).on( 'click', function() {
+ self.$( 'input' ).val( '' ).focus();
+ } );
+ },
+ /**
+ * Renders a list of results
+ *
+ * @param {Array} results list of search results with label and url
properties set
+ */
+ writeResults: function( results ) {
+ var $content = this.$( 'div.suggestions-results' ),
+ data = {
+ pages: results || []
+ };
+ if ( results.length === 0 ) {
+ data.error = {
+ guidance: mw.msg(
'mobile-frontend-search-noresults' )
+ };
+ }
+ $content.html( M.template.get( 'articleList' ).render( data ) );
+ M.emit( 'search-results', this, results );
+ },
+
+ performSearch: function() {
+ var self = this,
+ term = this.$( 'input' ).val();
+
+ function completeSearch( data ) {
+ data = $.map( data[ 1 ], function( item ) {
+ return {
+ heading: highlightSearchTerm( item,
term ),
+ title: item,
+ url: mw.util.wikiGetlink( item )
+ };
+ } );
+
+ self.writeResults( data );
+
+ self.$( 'input' ).removeClass( 'searching' );
+ }
+
+ clearTimeout( this.timer );
+ if ( term.length > 0 ) {
+ this.timer = setTimeout( function () {
+ self.$( 'input' ).addClass( 'searching' );
+ api.get( {
+ search: term,
+ action: 'opensearch',
+ namespace: 0,
+ limit: 15
+ } ).done( completeSearch );
+ }, 500 );
+ }
+ },
+ showAndFocus: function() {
+ this.show();
+ this.$( 'input' ).focus().select();
+ }
+} );
+
+searchOverlay = new SearchOverlay();
+
+function init() {
+ // FIXME change when micro.tap.js in stable
+ // don't use focus event
(https://bugzilla.wikimedia.org/show_bug.cgi?id=47499)
+ $( '#searchInput' ).on( M.tapEvent( 'touchend mouseup' ), function() {
+ searchOverlay.showAndFocus();
+ } );
+}
+init();
+
+}( mw.mobileFrontend, jQuery ));
--
To view, visit https://gerrit.wikimedia.org/r/94078
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia8d61ffcc4e4eb936380c5cd1493a3070f2131b4
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/MobileFrontend
Gerrit-Branch: master
Gerrit-Owner: JGonera <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits