summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/res/smw/util/ext.smw.util.autocomplete.property.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/res/smw/util/ext.smw.util.autocomplete.property.js')
-rw-r--r--www/wiki/extensions/SemanticMediaWiki/res/smw/util/ext.smw.util.autocomplete.property.js127
1 files changed, 127 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/res/smw/util/ext.smw.util.autocomplete.property.js b/www/wiki/extensions/SemanticMediaWiki/res/smw/util/ext.smw.util.autocomplete.property.js
new file mode 100644
index 00000000..7551a01b
--- /dev/null
+++ b/www/wiki/extensions/SemanticMediaWiki/res/smw/util/ext.smw.util.autocomplete.property.js
@@ -0,0 +1,127 @@
+/**
+ * JavaScript for property autocomplete function
+ *
+ * @license GNU GPL v2+
+ * @since 2.4
+ *
+ * @author mwjames
+ */
+
+( function( $, mw ) {
+ 'use strict';
+
+ var autocomplete = function( context ) {
+
+ var limit = 20;
+ var currentValue = context.val();
+
+ var indicator = context.hasClass( 'autocomplete-arrow' );
+ context.removeClass( 'is-disabled' );
+
+ // https://github.com/devbridge/jQuery-Autocomplete
+ context.autocomplete( {
+ serviceUrl: mw.util.wikiScript( 'api' ),
+ dataType: 'json',
+ minChars: 3,
+ maxHeight: 150,
+ paramName: 'search',
+ delimiter: "\n",
+ noCache: false,
+ triggerSelectOnValidInput: false,
+ params: {
+ 'action': 'smwbrowse',
+ 'format': 'json',
+ 'browse': 'property',
+ 'params': {
+ "search": '',
+ "limit": limit
+ }
+ },
+ onSearchStart: function( query ) {
+
+ // Avoid a search request on options or invalid characters
+ if (
+ query.search.indexOf( '#' ) > -1 ||
+ query.search.indexOf( '|' ) > -1 ) {
+ return false;
+ };
+
+ // Avoid a request for when the search term on the current
+ // selected value are the same
+ if ( currentValue !== '' && currentValue === query.search ) {
+ return false;
+ };
+
+ context.removeClass( 'autocomplete-arrow' );
+ context.addClass( 'is-disabled' );
+
+ if ( indicator ) {
+ context.addClass( 'autocomplete-loading' );
+ };
+
+ query.params = JSON.stringify( {
+ 'search': query.search.replace( "?", '' ),
+ 'limit': limit
+ } );
+
+ // Avoids {"warnings":{"main":{"*":"Unrecognized parameter: search."}
+ // from the API request
+ delete query.search;
+ },
+ onSelect: function( suggestion ) {
+
+ if ( suggestion ) {
+ currentValue = suggestion.value;
+ };
+
+ context.trigger( 'smw.autocomplete.property.select.complete', {
+ suggestion: suggestion,
+ context: context
+ } );
+ },
+ onSearchComplete: function( query ) {
+ context.removeClass( 'is-disabled' );
+
+ if ( indicator ) {
+ context.removeClass( 'autocomplete-loading' );
+ context.addClass( 'autocomplete-arrow' );
+ };
+ },
+ transformResult: function( response ) {
+
+ if ( !response.hasOwnProperty( 'query' ) ) {
+ return { suggestions: [] };
+ };
+
+ return {
+ suggestions: $.map( response.query, function( dataItem, key ) {
+ return { value: dataItem.label, data: key };
+ } )
+ };
+ }
+ } );
+
+ // https://github.com/devbridge/jQuery-Autocomplete/issues/498
+ context.off( 'focus.autocomplete' );
+ }
+
+ // Listen to an event (see Special:Ask)
+ $ ( document ).on( 'SMW::Property::Autocomplete', function( event, opts ) {
+ autocomplete( opts.context.find( '.smw-property-input' ) );
+ } );
+
+ // Listen to any event that requires a value autocomplete
+ // The trigger needs to set { context: ... } so we isolate the processing
+ // to a specific instance
+ $ ( document ).on( 'smw.autocomplete.property', function( event, opts ) {
+ autocomplete( opts.context.find( '.smw-property-input' ) );
+ } );
+
+ $( document ).ready( function() {
+ $( '#smw-property-input, .smw-property-input' ).each( function() {
+ autocomplete( $( this ) );
+ } );
+
+ } );
+
+} )( jQuery, mediaWiki );