summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/res/smw/util/ext.smw.util.autocomplete.propertyvalue.js
blob: 631f84ccd8815d05d1d807674dff2c0f903fb2bc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/**
 * JavaScript for property value autocomplete function
 *
 * @license GNU GPL v2+
 * @since 3.0
 *
 * @author mwjames
 */
( function( $, mw ) {
	'use strict';

	var autocomplete = function( context ) {

		// Keep the list small to minimize straining the DB
		var limit = 10;
		var currentValue = context.val();

		// There is no reason for the field to be enabled as long as their is no
		// property
		if ( context.data( 'property' ) === '' || context.data( 'property' ) === undefined ) {
			return context.addClass( 'is-disabled' );;
		};

		context.removeClass( 'is-disabled' );

		var params = {
			'action': 'smwbrowse',
			'format': 'json',
			'browse': 'pvalue',
			'params': {
				"search": '',
				'property': context.data( 'property' ),
				"limit": limit
			}
		};

		// https://github.com/devbridge/jQuery-Autocomplete
		context.autocomplete( {
			serviceUrl: mw.util.wikiScript( 'api' ),
			dataType: 'json',
			minChars: 0,
			maxHeight: 150,
			paramName: 'search',
			delimiter: "\n",
			noCache: false,
			triggerSelectOnValidInput: false,
			params: params,
			onSearchStart: function( query ) {

				// Avoid a search request on options or invalid characters
				if (
					query.search.indexOf( '#' ) > -1 ||
					query.search.indexOf( '|' ) > -1 ||
					query.search.indexOf( '*' ) > -1 ||
					query.search.indexOf( '+' ) > -1 ||
					query.search.indexOf( '!' ) > -1 ||
					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' );
				context.addClass( 'autocomplete-loading' );

				query.params = JSON.stringify( {
					'search': query.search.replace( "?", '' ),
					'property': context.data( 'property' ),
					'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.propertyvalue.select.complete', {
					suggestion: suggestion,
					context : context
				} );
			},
			onSearchComplete: function( query ) {
				context.removeClass( 'is-disabled' );
				context.removeClass( 'autocomplete-loading' );
				context.addClass( 'autocomplete-arrow' );
			},
			transformResult: function( response ) {

				if ( !response.hasOwnProperty( 'query' ) ) {
					return { suggestions: [] };
				};

				return {
					suggestions: $.map( response.query, function( key ) {
						
						if ( key === null ) {
							return [];
						};

						return { value: key, data: key };
					} )
				};
			}
		} );

		// https://github.com/devbridge/jQuery-Autocomplete/issues/498
		// context.off( 'focus.autocomplete' );
	}

	// 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.propertyvalue', function( event, opts ) {
		autocomplete( opts.context.find( '.smw-propertyvalue-input' ) );
	} );

	$( document ).ready( function() {
		$( '.smw-propertyvalue-input' ).each( function() {
			autocomplete( $( this ) );
		} );
	} );

} )( jQuery, mediaWiki );