/**
* @license GNU GPL v2+
* @since 2.5
*
* @author mwjames
*/
/*global jQuery, mediaWiki, mw, smw */
( function ( $, mw ) {
'use strict';
/**
* @since 2.5.0
* @constructor
*
* @param {Object} mwApi
* @param {Object} util
*
* @return {this}
*/
var browse = function ( mwApi ) {
this.VERSION = "3.0.0";
this.api = mwApi;
return this;
};
/**
* @since 2.5
* @method
*
* @param {Object} context
*/
browse.prototype.setContext = function( context ) {
this.context = context;
this.options = context.data( 'mw-smw-browse-options' );
return this;
}
/**
* @since 2.5
* @method
*/
browse.prototype.requestHTML = function() {
var self = this,
subject = self.context.data( 'mw-smw-browse-subject' );
self.api.post( {
action: "smwbrowse",
browse: "subject",
params: JSON.stringify( {
subject: subject.dbkey,
ns: subject.ns,
iw: subject.iw,
subobject: subject.subobject,
options: self.options,
type: 'html'
} )
} ).done( function( data ) {
self.context.find( '.smw-browse-content' ).replaceWith( data.query );
self.triggerEvents();
} ).fail ( function( xhr, status, error ) {
self.reportError( xhr, status, error );
} );
}
/**
* @since 3.0
* @method
*/
browse.prototype.doUpdate = function( opts ) {
var self = this,
subject = self.context.data( 'mw-smw-browse-subject' );
subject = subject.split( "#" );
self.api.post( {
action: "smwbrowse",
browse: "subject",
params: JSON.stringify( {
subject: subject[0],
ns: subject[1],
iw: subject[2],
subobject: subject[3],
options: $.extend( self.options, opts ),
type: 'html'
} )
} ).done( function( data ) {
self.context.find( '.smw-browse-search' ).remove();
self.context.find( '.smw-browse-modules' ).remove();
self.context.find( '.smw-factbox' ).replaceWith( data.query );
self.triggerEvents();
} ).fail ( function( xhr, status, error ) {
self.reportError( xhr, status, error );
} );
}
/**
* @since 2.5
* @method
*
* @param {object} xhr
* @param {object} status
* @param {object} error
*/
browse.prototype.reportError = function( xhr, status, error ) {
var text = 'The API encountered an unknown error';
if ( status.hasOwnProperty( 'xhr' ) ) {
var xhr = status.xhr;
if ( xhr.hasOwnProperty( 'statusText' ) ) {
text = 'The API returned with: ' + xhr.statusText.replace(/\
/g," " );
};
if ( xhr.hasOwnProperty( 'responseText' ) ) {
text = xhr.responseText.replace(/\
/g," " ).replace(/#/g, "
#" );
};
}
if ( status.hasOwnProperty( 'error' ) ) {
text = '' + status.error.code + '
' + status.error.info.replace(/#/g, "
#" );
}
this.context.find( '.smw-browse-content' ).prepend( text ).addClass( 'error' );
}
/**
* @since 2.5
* @method
*/
browse.prototype.triggerEvents = function() {
var self = this;
var form = self.context.find( '.smw-browse-search' );
form.trigger( 'smw.page.autocomplete' , {
'context': form
} );
mw.loader.load(
self.context.find( '.smw-browse-modules' ).data( 'modules' )
);
// Re-apply JS-component instances on new content
// Trigger an event
mw.hook( 'smw.browse.apiparsecomplete' ).fire( self.context );
$( document ).trigger( 'SMW::Browse::ApiParseComplete' , {
'context': self.context
} );
}
var instance = new browse(
new mw.Api()
);
$( document ).ready( function() {
/**
* Group related actions
*/
$( document ).on( 'click', '.smw-browse-hide-group', function( event ) {
instance.doUpdate( { "group": "hide" } );
event.preventDefault();
} );
$( document ).on( 'click', '.smw-browse-show-group', function( event ) {
instance.doUpdate( { "group": "show" } );
event.preventDefault();
} );
/**
* Incoming, outgoing related actions
*/
$( document ).on( 'click', '.smw_browse_hide_incoming', function( event ) {
instance.doUpdate( { "dir": "out" } );
event.preventDefault();
} );
$( document ).on( 'click', '.smw_browse_show_incoming', function( event ) {
instance.doUpdate( { "dir": "both" } );
event.preventDefault();
} );
$( '.smw-browse' ).each( function() {
if ( !$( this )[0].dataset.mwSmwBrowseSubject ) {
return;
}
instance.setContext( $( this ) ).requestHTML();
} );
var form = $( this ).find( '.smw-browse-search' );
mw.loader.using( [ 'ext.smw.browse', 'ext.smw.browse.autocomplete' ] ).done( function () {
form.trigger( 'smw.page.autocomplete' , {
'context': form
} );
} );
} );
}( jQuery, mediaWiki ) );