Henning Snater has uploaded a new change for review. https://gerrit.wikimedia.org/r/180438
Change subject: Renamed fingerprintview widgets ...................................................................... Renamed fingerprintview widgets fingerprintview widgets were named incorrectly. As "Fingerprint" is the aggregation of labels, descriptions and aliases in all languages, fingerprintview should have been what was labeled fingerprintgroupview. While there is no fictitious term for the aggregation of label, description and aliases of a single language and the term "Fingerprint" does not pursue a solid concept, the UI components have been renamed in a more obvious fashion. "entitytermsview" aggregates all term related objects of an entity. (Fingerprint is actually an aggregation of wikibase.datamodel.Term(Map) and wikibase.datamodel.MultiTerm(Map) objects.) This change advances the effort of renaming/removing the term "Fingerprint". ->75655 Change-Id: I084b6a11f8ddb7930b145e7852b7a5e66daa0a32 --- M lib/resources/Resources.php R lib/resources/jquery.wikibase/jquery.wikibase.entitytermsforlanguage.js R lib/resources/jquery.wikibase/jquery.wikibase.entitytermsforlanguagelistview.js A lib/resources/jquery.wikibase/jquery.wikibase.entitytermsview.js M lib/resources/jquery.wikibase/jquery.wikibase.entityview.js D lib/resources/jquery.wikibase/jquery.wikibase.fingerprintgroupview.js M lib/resources/jquery.wikibase/resources.php A lib/resources/jquery.wikibase/themes/default/jquery.wikibase.entitytermsforlanguage.css A lib/resources/jquery.wikibase/themes/default/jquery.wikibase.entitytermsforlanguagelistview.css A lib/resources/jquery.wikibase/themes/default/jquery.wikibase.entitytermsview.css D lib/resources/jquery.wikibase/themes/default/jquery.wikibase.fingerprintgroupview.css D lib/resources/jquery.wikibase/themes/default/jquery.wikibase.fingerprintlistview.css D lib/resources/jquery.wikibase/themes/default/jquery.wikibase.fingerprintview.css A lib/tests/qunit/jquery.wikibase/jquery.wikibase.entitytermsforlanguage.tests.js A lib/tests/qunit/jquery.wikibase/jquery.wikibase.entitytermsforlanguagelistview.tests.js A lib/tests/qunit/jquery.wikibase/jquery.wikibase.entitytermsview.tests.js D lib/tests/qunit/jquery.wikibase/jquery.wikibase.fingerprintgroupview.tests.js D lib/tests/qunit/jquery.wikibase/jquery.wikibase.fingerprintlistview.tests.js D lib/tests/qunit/jquery.wikibase/jquery.wikibase.fingerprintview.tests.js M lib/tests/qunit/jquery.wikibase/resources.php M repo/includes/View/TermBoxView.php M repo/resources/templates.php M repo/resources/wikibase.ui.entityViewInit.js 23 files changed, 1,226 insertions(+), 1,205 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase refs/changes/38/180438/1 diff --git a/lib/resources/Resources.php b/lib/resources/Resources.php index fd3e2ec..610ef89 100644 --- a/lib/resources/Resources.php +++ b/lib/resources/Resources.php @@ -34,9 +34,9 @@ 'jquery.wikibase/themes/default/jquery.wikibase.aliasesview.css', 'jquery.wikibase/themes/default/jquery.wikibase.descriptionview.css', 'jquery.wikibase/themes/default/jquery.wikibase.entityview.css', - 'jquery.wikibase/themes/default/jquery.wikibase.fingerprintgroupview.css', - 'jquery.wikibase/themes/default/jquery.wikibase.fingerprintlistview.css', - 'jquery.wikibase/themes/default/jquery.wikibase.fingerprintview.css', + 'jquery.wikibase/themes/default/jquery.wikibase.entitytermsview.css', + 'jquery.wikibase/themes/default/jquery.wikibase.entitytermsforlanguagelistview.css', + 'jquery.wikibase/themes/default/jquery.wikibase.entitytermsforlanguage.css', 'jquery.wikibase/themes/default/jquery.wikibase.labelview.css', 'jquery.wikibase/themes/default/jquery.wikibase.sitelinkgrouplistview.css', 'jquery.wikibase/themes/default/jquery.wikibase.sitelinkgroupview.css', diff --git a/lib/resources/jquery.wikibase/jquery.wikibase.fingerprintview.js b/lib/resources/jquery.wikibase/jquery.wikibase.entitytermsforlanguage.js similarity index 94% rename from lib/resources/jquery.wikibase/jquery.wikibase.fingerprintview.js rename to lib/resources/jquery.wikibase/jquery.wikibase.entitytermsforlanguage.js index 889bb40..435c96c 100644 --- a/lib/resources/jquery.wikibase/jquery.wikibase.fingerprintview.js +++ b/lib/resources/jquery.wikibase/jquery.wikibase.entitytermsforlanguage.js @@ -47,9 +47,9 @@ * - {jQuery.Event} * - {Error|null} */ -$.widget( 'wikibase.fingerprintview', PARENT, { +$.widget( 'wikibase.entitytermsforlanguage', PARENT, { options: { - template: 'wikibase-fingerprintview', + template: 'wikibase-entitytermsforlanguage', templateParams: [ function() { return this.options.value.language; @@ -69,10 +69,10 @@ '' // aliases ], templateShortCuts: { - $language: '.wikibase-fingerprintview-language', - $label: '.wikibase-fingerprintview-label', - $description : '.wikibase-fingerprintview-description', - $aliases : '.wikibase-fingerprintview-aliases' + $language: '.wikibase-entitytermsforlanguage-language', + $label: '.wikibase-entitytermsforlanguage-label', + $description : '.wikibase-entitytermsforlanguage-description', + $aliases : '.wikibase-entitytermsforlanguage-aliases' }, value: null, helpMessage: mw.msg( 'wikibase-fingerprintview-input-help-message' ), @@ -277,16 +277,16 @@ $queue.queue( 'stopediting', function( next ) { widget.element .one( - widget.widgetEventPrefix + 'afterstopediting.fingerprintviewstopediting', + widget.widgetEventPrefix + 'afterstopediting.entitytermsforlanguagestopediting', function( event ) { - widget.element.off( '.fingerprintviewstopediting' ); + widget.element.off( '.entitytermsforlanguagestopediting' ); setTimeout( next, 0 ); } ) .one( - widget.widgetEventPrefix + 'toggleerror.fingerprintviewstopediting', + widget.widgetEventPrefix + 'toggleerror.entitytermsforlanguagestopediting', function( event ) { - widget.element.off( '.fingerprintviewstopediting' ); + widget.element.off( '.entitytermsforlanguagestopediting' ); $queue.clearQueue(); self._resetEditMode(); } diff --git a/lib/resources/jquery.wikibase/jquery.wikibase.fingerprintlistview.js b/lib/resources/jquery.wikibase/jquery.wikibase.entitytermsforlanguagelistview.js similarity index 83% rename from lib/resources/jquery.wikibase/jquery.wikibase.fingerprintlistview.js rename to lib/resources/jquery.wikibase/jquery.wikibase.entitytermsforlanguagelistview.js index 842162f..d713f3e 100644 --- a/lib/resources/jquery.wikibase/jquery.wikibase.fingerprintlistview.js +++ b/lib/resources/jquery.wikibase/jquery.wikibase.entitytermsforlanguagelistview.js @@ -8,7 +8,7 @@ var PARENT = $.ui.TemplatedWidget; /** - * Displays multiple fingerprints (see jQuery.wikibase.fingerprintview). + * Displays multiple fingerprints (see jQuery.wikibase.entitytermsforlanguage). * @since 0.5 * @extends jQuery.ui.TemplatedWidget * @@ -46,9 +46,9 @@ * - {jQuery.Event} * - {Error|null} */ -$.widget( 'wikibase.fingerprintlistview', PARENT, { +$.widget( 'wikibase.entitytermsforlanguagelistview', PARENT, { options: { - template: 'wikibase-fingerprintlistview', + template: 'wikibase-entitytermsforlanguagelistview', templateParams: [ '' // tbodys ], @@ -79,7 +79,7 @@ this._createListView(); - this.element.addClass( 'wikibase-fingerprintlistview' ); + this.element.addClass( 'wikibase-entitytermsforlanguagelistview' ); }, /** @@ -93,16 +93,16 @@ listview.destroy(); } - this.element.removeClass( 'wikibase-fingerprintlistview' ); + this.element.removeClass( 'wikibase-entitytermsforlanguagelistview' ); PARENT.prototype.destroy.call( this ); }, /** - * Creates the listview widget managing the fingerprintview widgets + * Creates the listview widget managing the entitytermsforlanguage widgets */ _createListView: function() { var self = this, - listItemWidget = $.wikibase.fingerprintview, + listItemWidget = $.wikibase.entitytermsforlanguage, prefix = listItemWidget.prototype.widgetEventPrefix; // Fully encapsulate child widgets by suppressing their events: @@ -138,7 +138,7 @@ entityId: self.options.entityId, entityChangersFactory: self.options.entityChangersFactory, helpMessage: mw.msg( - 'wikibase-fingerprintview-input-help-message', + 'wikibase-entitytermsforlanguage-input-help-message', wb.getLanguageNameByCode( value.language ) ) }; @@ -174,8 +174,8 @@ currentValue = []; listview.items().each( function() { - var fingerprintview = lia.liInstance( $( this ) ); - currentValue.push( fingerprintview.value() ); + var entitytermsforlanguage = lia.liInstance( $( this ) ); + currentValue.push( entitytermsforlanguage.value() ); } ); if( currentValue.length !== this.options.value.length ) { @@ -209,8 +209,8 @@ lia = listview.listItemAdapter(); listview.items().each( function() { - var fingerprintview = lia.liInstance( $( this ) ); - fingerprintview.startEditing(); + var entitytermsforlanguage = lia.liInstance( $( this ) ); + entitytermsforlanguage.startEditing(); } ); this._trigger( 'afterstartediting' ); @@ -238,39 +238,40 @@ // TODO: This widget should not need to queue the requests of its encapsulated widgets. // However, the back-end produces edit conflicts when issuing multiple requests at once. // Remove queueing as soon as the back-end is fixed; see bug #72020. - var $queue = $( {} ); + var $queue = $( {} ), + eventNamespace = 'entitytermsforlanguagelistviewstopediting'; /** * @param {jQuery} $queue - * @param {jQuery.wikibase.fingerprintview} fingerprintview + * @param {jQuery.wikibase.entitytermsforlanguage} entitytermsforlanguage * @param {boolean} dropValue */ - function addStopEditToQueue( $queue, fingerprintview, dropValue ) { + function addStopEditToQueue( $queue, entitytermsforlanguage, dropValue ) { $queue.queue( 'stopediting', function( next ) { - fingerprintview.element - .one( 'fingerprintviewafterstopediting.fingerprintlistviewstopediting', + entitytermsforlanguage.element + .one( 'entitytermsforlanguageafterstopediting.' + eventNamespace, function( event ) { - fingerprintview.element.off( '.fingerprintlistviewstopediting' ); + entitytermsforlanguage.element.off( '.' + eventNamespace ); setTimeout( next, 0 ); } ) - .one( 'fingerprintviewtoggleerror.fingerprintlistviewstopediting', + .one( 'entitytermsforlanguagetoggleerror.' + eventNamespace, function( event ) { - fingerprintview.element.off( '.fingerprintlistviewstopediting' ); + entitytermsforlanguage.element.off( '.' + eventNamespace ); $queue.clearQueue(); self._resetEditMode(); } ); - fingerprintview.stopEditing( dropValue ); + entitytermsforlanguage.stopEditing( dropValue ); } ); } listview.items().each( function() { - var fingerprintview = lia.liInstance( $( this ) ); + var entitytermsforlanguage = lia.liInstance( $( this ) ); addStopEditToQueue( $queue, - fingerprintview, - dropValue || fingerprintview.isInitialValue() + entitytermsforlanguage, + dropValue || entitytermsforlanguage.isInitialValue() ); } ); @@ -364,8 +365,8 @@ value = []; listview.items().each( function() { - var fingerprintview = lia.liInstance( $( this ) ); - value.push( fingerprintview.value() ); + var entitytermsforlanguage = lia.liInstance( $( this ) ); + value.push( entitytermsforlanguage.value() ); } ); return value; diff --git a/lib/resources/jquery.wikibase/jquery.wikibase.entitytermsview.js b/lib/resources/jquery.wikibase/jquery.wikibase.entitytermsview.js new file mode 100644 index 0000000..90c1add --- /dev/null +++ b/lib/resources/jquery.wikibase/jquery.wikibase.entitytermsview.js @@ -0,0 +1,371 @@ +/** + * @licence GNU GPL v2+ + * @author H. Snater < mediaw...@snater.com > + */ +( function( mw, $ ) { + 'use strict'; + + var PARENT = $.ui.TemplatedWidget; + +/** + * Encapsulates a entitytermsforlanguagelistview widget. + * @since 0.5 + * @extends jQuery.ui.TemplatedWidget + * + * @option {Object[]} value + * Object representing the widget's value. + * Structure: [ + * { + * language: <{string]>, + * label: <{wikibase.datamodel.Term}>, + * description: <{wikibase.datamodel.Term}> + * aliases: <{wikibase.datamodel.MultiTerm}> + * }[, ...] + * ] + * + * @option {string} entityId + * + * @option {wikibase.entityChangers.EntityChangersFactory} entityChangersFactory + * + * @option {string} [helpMessage] + * Default: 'Edit label, description and aliases per language.' + * + * @event change + * - {jQuery.Event} + * + * @event afterstartediting + * - {jQuery.Event} + * + * @event stopediting + * - {jQuery.Event} + * - {boolean} Whether to drop the value. + * - {Function} Callback function. + * + * @event afterstopediting + * - {jQuery.Event} + * - {boolean} Whether to drop the value. + * + * @event toggleerror + * - {jQuery.Event} + * - {Error|null} + */ +$.widget( 'wikibase.entitytermsview', PARENT, { + options: { + template: 'wikibase-entitytermsview', + templateParams: [ + function() { + return mw.msg( 'wikibase-terms' ); + }, + '', // entitytermsforlanguagelistview + '' // edit section + ], + templateShortCuts: { + $h: 'h2' + }, + value: [], + entityId: null, + entityChangersFactory: null, + helpMessage: 'Edit label, description and aliases per language.' + }, + + /** + * @type {boolean} + */ + _isInEditMode: false, + + /** + * @type {jQuery} + */ + $entitytermsforlanguagelistview: null, + + /** + * @see jQuery.ui.TemplatedWidget._create + */ + _create: function() { + if( + !$.isArray( this.options.value ) + || !this.options.entityId + || !this.options.entityChangersFactory + ) { + throw new Error( 'Required option(s) missing' ); + } + + PARENT.prototype._create.call( this ); + + this.element.addClass( 'wikibase-entitytermsview' ); + + this.$entitytermsforlanguagelistview + = this.element.find( '.wikibase-entitytermsforlanguagelistview' ); + + if( !this.$entitytermsforlanguagelistview.length ) { + this.$entitytermsforlanguagelistview = $( '<table/>' ).appendTo( this.element ); + } + + this._createEntitytermsforlanguagelistview(); + }, + + /** + * @see jQuery.ui.TemplatedWidget.destroy + */ + destroy: function() { + // When destroying a widget not initialized properly, entitytermsforlanguagelistview will + // not have been created. + if( this.$entitytermsforlanguagelistview ) { + var entitytermsforlanguagelistview = this._getEntitytermsforlanguagelistview(); + + if( entitytermsforlanguagelistview ) { + entitytermsforlanguagelistview.destroy(); + } + + this.$entitytermsforlanguagelistview.remove(); + } + + this.element.removeClass( 'wikibase-entitytermsview' ); + PARENT.prototype.destroy.call( this ); + }, + + /** + * @return {jQuery.wikibase.entitytermsforlanguagelistview} + * @private + */ + _getEntitytermsforlanguagelistview: function() { + return this.$entitytermsforlanguagelistview.data( 'entitytermsforlanguagelistview' ); + }, + + /** + * Creates and initializes the entitytermsforlanguagelistview widget. + */ + _createEntitytermsforlanguagelistview: function() { + var self = this, + prefix = $.wikibase.entitytermsforlanguagelistview.prototype.widgetEventPrefix; + + this.$entitytermsforlanguagelistview + .on( prefix + 'change.' + this.widgetName, function( event ) { + event.stopPropagation(); + self._trigger( 'change' ); + } ) + .on( prefix + 'toggleerror.' + this.widgetName, function( event, error ) { + event.stopPropagation(); + self.setError( error ); + } ) + .on( + [ + prefix + 'create.' + this.widgetName, + prefix + 'afterstartediting.' + this.widgetName, + prefix + 'stopediting.' + this.widgetName, + prefix + 'afterstopediting.' + this.widgetName, + prefix + 'disable.' + this.widgetName + ].join( ' ' ), + function( event ) { + event.stopPropagation(); + } + ) + .entitytermsforlanguagelistview( { + value: this.options.value, + entityId: this.options.entityId, + entityChangersFactory: this.options.entityChangersFactory + } ); + }, + + /** + * @return {boolean} + */ + isValid: function() { + return this._getEntitytermsforlanguagelistview().isValid(); + }, + + /** + * @return {boolean} + */ + isInitialValue: function() { + return this._getEntitytermsforlanguagelistview().isInitialValue(); + }, + + startEditing: function() { + if( this._isInEditMode ) { + return; + } + + this._isInEditMode = true; + this.element.addClass( 'wb-edit' ); + + this._getEntitytermsforlanguagelistview().startEditing(); + + this._trigger( 'afterstartediting' ); + }, + + /** + * @param {boolean} [dropValue] + */ + stopEditing: function( dropValue ) { + var self = this; + + if( !this._isInEditMode || ( !this.isValid() || this.isInitialValue() ) && !dropValue ) { + return; + } + + dropValue = !!dropValue; + + this._trigger( 'stopediting', null, [dropValue] ); + + this.disable(); + + this.$entitytermsforlanguagelistview + .one( + 'entitytermsforlanguagelistviewafterstopediting.entitytermsviewstopediting', + function( event, dropValue ) { + self._afterStopEditing( dropValue ); + self.$entitytermsforlanguagelistview.off( '.entitytermsviewstopediting' ); + } + ) + .one( + 'entitytermsforlanguagelistviewtoggleerror.entitytermsviewstopediting', + function( event, dropValue ) { + self.enable(); + self.$entitytermsforlanguagelistview.off( '.entitytermsviewstopediting' ); + } + ); + + this._getEntitytermsforlanguagelistview().stopEditing( dropValue ); + }, + + /** + * @param {boolean} dropValue + */ + _afterStopEditing: function( dropValue ) { + if( !dropValue ) { + this.options.value = this.value(); + } + this._isInEditMode = false; + this.enable(); + this.element.removeClass( 'wb-edit' ); + this._trigger( 'afterstopediting', null, [dropValue] ); + }, + + cancelEditing: function() { + this.stopEditing( true ); + }, + + /** + * @see jQuery.ui.TemplatedWidget.focus + */ + focus: function() { + this._getEntitytermsforlanguagelistview().focus(); + }, + + /** + * Applies/Removes error state. + * + * @param {Error} [error] + */ + setError: function( error ) { + if( error ) { + this.element.addClass( 'wb-error' ); + this._trigger( 'toggleerror', null, [error] ); + } else { + this.removeError(); + this._trigger( 'toggleerror' ); + } + }, + + removeError: function() { + this.element.removeClass( 'wb-error' ); + this._getEntitytermsforlanguagelistview().removeError(); + }, + + /** + * @param {Object[]} [value] + * @return {Object[]|*} + */ + value: function( value ) { + if( value !== undefined ) { + return this.option( 'value', value ); + } + + return this._getEntitytermsforlanguagelistview().value(); + }, + + /** + * @see jQuery.ui.TemplatedWidget._setOption + */ + _setOption: function( key, value ) { + if( key === 'value' ) { + throw new Error( 'Impossible to set value after initialization' ); + } + + var response = PARENT.prototype._setOption.apply( this, arguments ); + + if( key === 'disabled' ) { + this._getEntitytermsforlanguagelistview().option( key, value ); + } + + return response; + } +} ); + +$.wikibase.toolbarcontroller.definition( 'edittoolbar', { + id: 'entitytermsview', + selector: ':' + $.wikibase.entitytermsview.prototype.namespace + + '-' + $.wikibase.entitytermsview.prototype.widgetName, + events: { + entitytermsviewcreate: function( event, toolbarcontroller ) { + var $entitytermsview = $( event.target ), + entitytermsview = $entitytermsview.data( 'entitytermsview' ), + $headingContainer = $entitytermsview.find( + '.wikibase-entitytermsview-heading-container' + ), + $container = $headingContainer.children( '.wikibase-toolbar-container' ); + + if( !$container.length ) { + $container = $( '<div/>' ).appendTo( $headingContainer ); + } + + $entitytermsview.edittoolbar( { + $container: $container, + interactionWidget: entitytermsview + } ); + + $entitytermsview.on( 'keyup.edittoolbar', function( event ) { + if( entitytermsview.option( 'disabled' ) ) { + return; + } + if( event.keyCode === $.ui.keyCode.ESCAPE ) { + entitytermsview.stopEditing( true ); + } else if( event.keyCode === $.ui.keyCode.ENTER ) { + entitytermsview.stopEditing( false ); + } + } ); + }, + 'entitytermsviewchange entitytermsviewafterstartediting': function( event ) { + var $entitytermsview = $( event.target ), + entitytermsview = $entitytermsview.data( 'entitytermsview' ), + edittoolbar = $entitytermsview.data( 'edittoolbar' ), + btnSave = edittoolbar.getButton( 'save' ), + enable = entitytermsview.isValid() && !entitytermsview.isInitialValue(); + + btnSave[enable ? 'enable' : 'disable'](); + }, + entitytermsviewdisable: function( event ) { + var $entitytermsview = $( event.target ), + entitytermsview = $entitytermsview.data( 'entitytermsview' ), + edittoolbar = $entitytermsview.data( 'edittoolbar' ), + btnSave = edittoolbar.getButton( 'save' ), + enable = entitytermsview.isValid() && !entitytermsview.isInitialValue(); + + btnSave[enable ? 'enable' : 'disable'](); + }, + toolbareditgroupedit: function( event, toolbarcontroller ) { + var $entitytermsview = $( event.target ), + entitytermsview = $entitytermsview.data( 'entitytermsview' ); + + if( !entitytermsview ) { + return; + } + + entitytermsview.focus(); + } + } +} ); + + +}( mediaWiki, jQuery ) ); diff --git a/lib/resources/jquery.wikibase/jquery.wikibase.entityview.js b/lib/resources/jquery.wikibase/jquery.wikibase.entityview.js index 65f4b81..57942b8 100644 --- a/lib/resources/jquery.wikibase/jquery.wikibase.entityview.js +++ b/lib/resources/jquery.wikibase/jquery.wikibase.entityview.js @@ -222,7 +222,7 @@ return; } - this.$fingerprints = $( '.wikibase-fingerprintgroupview', this.element ); + this.$fingerprints = $( '.wikibase-entitytermsview', this.element ); if( !this.$fingerprints.length ) { var $precedingNode = this.$toc; @@ -242,11 +242,11 @@ // Scrape languages from static HTML: // FIXME: Currently, this simply overrules the languages options. self.options.languages = []; - this.$fingerprints.find( '.wikibase-fingerprintview' ).each( function() { + this.$fingerprints.find( '.wikibase-entitytermsforlanguage' ).each( function() { $.each( $( this ).attr( 'class' ).split( ' ' ), function() { - if( this.indexOf( 'wikibase-fingerprintview-' ) === 0 ) { + if( this.indexOf( 'wikibase-entitytermsforlanguage-' ) === 0 ) { self.options.languages.push( - this.split( 'wikibase-fingerprintview-' )[1] + this.split( 'wikibase-entitytermsforlanguage-' )[1] ); return false; } @@ -269,7 +269,7 @@ } ); } - this.$fingerprints.fingerprintgroupview( { + this.$fingerprints.entitytermsview( { value: value, entityId: this.options.value.getId(), entityChangersFactory: this.options.entityChangersFactory, @@ -288,7 +288,7 @@ 'labelviewafterstartediting.' + this.widgetName, 'descriptionviewafterstartediting.' + this.widgetName, 'aliasesviewafterstartediting.' + this.widgetName, - 'fingerprintgroupviewafterstartediting.' + this.widgetName + 'entitytermsviewafterstartediting.' + this.widgetName ].join( ' ' ), function( event ) { self._trigger( 'afterstartediting' ); @@ -299,7 +299,7 @@ 'labelviewafterstopediting.' + this.widgetName, 'descriptionviewafterstopediting.' + this.widgetName, 'aliasesviewafterstopediting.' + this.widgetName, - 'fingerprintgroupviewafterstopediting.' + this.widgetName + 'entitytermsviewafterstopediting.' + this.widgetName ].join( ' ' ), function( event, dropValue ) { self._trigger( 'afterstopediting', null, [dropValue] ); @@ -329,7 +329,7 @@ this.$description.data( 'descriptionview' )[state](); this.$aliases.data( 'aliasesview' )[state](); if( this.$fingerprints ) { - this.$fingerprints.data( 'fingerprintgroupview' )[state](); + this.$fingerprints.data( 'entitytermsview' )[state](); } }, diff --git a/lib/resources/jquery.wikibase/jquery.wikibase.fingerprintgroupview.js b/lib/resources/jquery.wikibase/jquery.wikibase.fingerprintgroupview.js deleted file mode 100644 index 54cc65b..0000000 --- a/lib/resources/jquery.wikibase/jquery.wikibase.fingerprintgroupview.js +++ /dev/null @@ -1,362 +0,0 @@ -/** - * @licence GNU GPL v2+ - * @author H. Snater < mediaw...@snater.com > - */ -( function( mw, $ ) { - 'use strict'; - - var PARENT = $.ui.TemplatedWidget; - -/** - * Encapsulates a fingerprintlistview widget. - * @since 0.5 - * @extends jQuery.ui.TemplatedWidget - * - * @option {Object[]} value - * Object representing the widget's value. - * Structure: [ - * { - * language: <{string]>, - * label: <{wikibase.datamodel.Term}>, - * description: <{wikibase.datamodel.Term}> - * aliases: <{wikibase.datamodel.MultiTerm}> - * }[, ...] - * ] - * - * @option {string} entityId - * - * @option {wikibase.entityChangers.EntityChangersFactory} entityChangersFactory - * - * @option {string} [helpMessage] - * Default: 'Edit label, description and aliases per language.' - * - * @event change - * - {jQuery.Event} - * - * @event afterstartediting - * - {jQuery.Event} - * - * @event stopediting - * - {jQuery.Event} - * - {boolean} Whether to drop the value. - * - {Function} Callback function. - * - * @event afterstopediting - * - {jQuery.Event} - * - {boolean} Whether to drop the value. - * - * @event toggleerror - * - {jQuery.Event} - * - {Error|null} - */ -$.widget( 'wikibase.fingerprintgroupview', PARENT, { - options: { - template: 'wikibase-fingerprintgroupview', - templateParams: [ - function() { - return mw.msg( 'wikibase-terms' ); - }, - '', // fingerprintlistview - '' // edit section - ], - templateShortCuts: { - $h: 'h2' - }, - value: [], - entityId: null, - entityChangersFactory: null, - helpMessage: 'Edit label, description and aliases per language.' - }, - - /** - * @type {boolean} - */ - _isInEditMode: false, - - /** - * @type {jQuery} - */ - $fingerprintlistview: null, - - /** - * @see jQuery.ui.TemplatedWidget._create - */ - _create: function() { - if( - !$.isArray( this.options.value ) - || !this.options.entityId - || !this.options.entityChangersFactory - ) { - throw new Error( 'Required option(s) missing' ); - } - - PARENT.prototype._create.call( this ); - - this.element.addClass( 'wikibase-fingerprintgroupview' ); - - this.$fingerprintlistview = this.element.find( '.wikibase-fingerprintlistview' ); - - if( !this.$fingerprintlistview.length ) { - this.$fingerprintlistview = $( '<table/>' ).appendTo( this.element ); - } - - this._createFingerprintlistview(); - }, - - /** - * @see jQuery.ui.TemplatedWidget.destroy - */ - destroy: function() { - // When destroying a widget not initialized properly, fingerprintlistview will not have been - // created. - if( this.$fingerprintlistview ) { - var fingerprintlistview = this.$fingerprintlistview.data( 'fingerprintlistview' ); - - if( fingerprintlistview ) { - fingerprintlistview.destroy(); - } - - this.$fingerprintlistview.remove(); - } - - this.element.removeClass( 'wikibase-fingerprintgroupview' ); - PARENT.prototype.destroy.call( this ); - }, - - /** - * Creates and initializes the fingerprintlistview widget. - */ - _createFingerprintlistview: function() { - var self = this, - prefix = $.wikibase.fingerprintlistview.prototype.widgetEventPrefix; - - this.$fingerprintlistview - .on( prefix + 'change.' + this.widgetName, function( event ) { - event.stopPropagation(); - self._trigger( 'change' ); - } ) - .on( prefix + 'toggleerror.' + this.widgetName, function( event, error ) { - event.stopPropagation(); - self.setError( error ); - } ) - .on( - [ - prefix + 'create.' + this.widgetName, - prefix + 'afterstartediting.' + this.widgetName, - prefix + 'stopediting.' + this.widgetName, - prefix + 'afterstopediting.' + this.widgetName, - prefix + 'disable.' + this.widgetName - ].join( ' ' ), - function( event ) { - event.stopPropagation(); - } - ) - .fingerprintlistview( { - value: this.options.value, - entityId: this.options.entityId, - entityChangersFactory: this.options.entityChangersFactory - } ); - }, - - /** - * @return {boolean} - */ - isValid: function() { - return this.$fingerprintlistview.data( 'fingerprintlistview' ).isValid(); - }, - - /** - * @return {boolean} - */ - isInitialValue: function() { - return this.$fingerprintlistview.data( 'fingerprintlistview' ).isInitialValue(); - }, - - startEditing: function() { - if( this._isInEditMode ) { - return; - } - - this._isInEditMode = true; - this.element.addClass( 'wb-edit' ); - - this.$fingerprintlistview.data( 'fingerprintlistview' ).startEditing(); - - this._trigger( 'afterstartediting' ); - }, - - /** - * @param {boolean} [dropValue] - */ - stopEditing: function( dropValue ) { - var self = this; - - if( !this._isInEditMode || ( !this.isValid() || this.isInitialValue() ) && !dropValue ) { - return; - } - - dropValue = !!dropValue; - - this._trigger( 'stopediting', null, [dropValue] ); - - this.disable(); - - this.$fingerprintlistview - .one( - 'fingerprintlistviewafterstopediting.fingerprintgroupviewstopediting', - function( event, dropValue ) { - self._afterStopEditing( dropValue ); - self.$fingerprintlistview.off( '.fingerprintgroupviewstopediting' ); - } - ) - .one( - 'fingerprintlistviewtoggleerror.fingerprintgroupviewstopediting', - function( event, dropValue ) { - self.enable(); - self.$fingerprintlistview.off( '.fingerprintgroupviewstopediting' ); - } - ); - - this.$fingerprintlistview.data( 'fingerprintlistview' ).stopEditing( dropValue ); - }, - - /** - * @param {boolean} dropValue - */ - _afterStopEditing: function( dropValue ) { - if( !dropValue ) { - this.options.value = this.value(); - } - this._isInEditMode = false; - this.enable(); - this.element.removeClass( 'wb-edit' ); - this._trigger( 'afterstopediting', null, [dropValue] ); - }, - - cancelEditing: function() { - this.stopEditing( true ); - }, - - /** - * @see jQuery.ui.TemplatedWidget.focus - */ - focus: function() { - this.$fingerprintlistview.data( 'fingerprintlistview' ).focus(); - }, - - /** - * Applies/Removes error state. - * - * @param {Error} [error] - */ - setError: function( error ) { - if( error ) { - this.element.addClass( 'wb-error' ); - this._trigger( 'toggleerror', null, [error] ); - } else { - this.removeError(); - this._trigger( 'toggleerror' ); - } - }, - - removeError: function() { - this.element.removeClass( 'wb-error' ); - this.$fingerprintlistview.data( 'fingerprintlistview' ).removeError(); - }, - - /** - * @param {Object[]} [value] - * @return {Object[]|*} - */ - value: function( value ) { - if( value !== undefined ) { - return this.option( 'value', value ); - } - - return this.$fingerprintlistview.data( 'fingerprintlistview' ).value(); - }, - - /** - * @see jQuery.ui.TemplatedWidget._setOption - */ - _setOption: function( key, value ) { - if( key === 'value' ) { - throw new Error( 'Impossible to set value after initialization' ); - } - - var response = PARENT.prototype._setOption.apply( this, arguments ); - - if( key === 'disabled' ) { - this.$fingerprintlistview.data( 'fingerprintlistview' ).option( key, value ); - } - - return response; - } -} ); - -$.wikibase.toolbarcontroller.definition( 'edittoolbar', { - id: 'fingerprintgroupview', - selector: ':' + $.wikibase.fingerprintgroupview.prototype.namespace - + '-' + $.wikibase.fingerprintgroupview.prototype.widgetName, - events: { - fingerprintgroupviewcreate: function( event, toolbarcontroller ) { - var $fingerprintgroupview = $( event.target ), - fingerprintgroupview = $fingerprintgroupview.data( 'fingerprintgroupview' ), - $headingContainer = $fingerprintgroupview.find( - '.wikibase-fingerprintgroupview-heading-container' - ), - $container = $headingContainer.children( '.wikibase-toolbar-container' ); - - if( !$container.length ) { - $container = $( '<div/>' ).appendTo( $headingContainer ); - } - - $fingerprintgroupview.edittoolbar( { - $container: $container, - interactionWidget: fingerprintgroupview - } ); - - $fingerprintgroupview.on( 'keyup.edittoolbar', function( event ) { - if( fingerprintgroupview.option( 'disabled' ) ) { - return; - } - if( event.keyCode === $.ui.keyCode.ESCAPE ) { - fingerprintgroupview.stopEditing( true ); - } else if( event.keyCode === $.ui.keyCode.ENTER ) { - fingerprintgroupview.stopEditing( false ); - } - } ); - }, - 'fingerprintgroupviewchange fingerprintgroupviewafterstartediting': function( event ) { - var $fingerprintgroupview = $( event.target ), - fingerprintgroupview = $fingerprintgroupview.data( 'fingerprintgroupview' ), - edittoolbar = $fingerprintgroupview.data( 'edittoolbar' ), - btnSave = edittoolbar.getButton( 'save' ), - enable = fingerprintgroupview.isValid() && !fingerprintgroupview.isInitialValue(); - - btnSave[enable ? 'enable' : 'disable'](); - }, - fingerprintgroupviewdisable: function( event ) { - var $fingerprintgroupview = $( event.target ), - fingerprintgroupview = $fingerprintgroupview.data( 'fingerprintgroupview' ), - edittoolbar = $fingerprintgroupview.data( 'edittoolbar' ), - btnSave = edittoolbar.getButton( 'save' ), - enable = fingerprintgroupview.isValid() && !fingerprintgroupview.isInitialValue(); - - btnSave[enable ? 'enable' : 'disable'](); - }, - toolbareditgroupedit: function( event, toolbarcontroller ) { - var $fingerprintgroupview = $( event.target ), - fingerprintgroupview = $fingerprintgroupview.data( 'fingerprintgroupview' ); - - if( !fingerprintgroupview ) { - return; - } - - fingerprintgroupview.focus(); - } - } -} ); - - -}( mediaWiki, jQuery ) ); diff --git a/lib/resources/jquery.wikibase/resources.php b/lib/resources/jquery.wikibase/resources.php index 485447c..569625b 100644 --- a/lib/resources/jquery.wikibase/resources.php +++ b/lib/resources/jquery.wikibase/resources.php @@ -169,7 +169,7 @@ 'jquery.ui.TemplatedWidget', 'jquery.wikibase.aliasesview', 'jquery.wikibase.descriptionview', - 'jquery.wikibase.fingerprintgroupview', + 'jquery.wikibase.entitytermsview', 'jquery.wikibase.labelview', 'wikibase.datamodel.MultiTerm', 'wikibase.datamodel.Term', @@ -182,32 +182,32 @@ ), ), - 'jquery.wikibase.fingerprintgroupview' => $moduleTemplate + array( + 'jquery.wikibase.entitytermsview' => $moduleTemplate + array( 'scripts' => array( - 'jquery.wikibase.fingerprintgroupview.js', + 'jquery.wikibase.entitytermsview.js', ), 'styles' => array( - 'themes/default/jquery.wikibase.fingerprintgroupview.css', + 'themes/default/jquery.wikibase.entitytermsview.css', ), 'dependencies' => array( 'jquery.ui.TemplatedWidget', - 'jquery.wikibase.fingerprintlistview', + 'jquery.wikibase.entitytermsforlanguagelistview', ), 'messages' => array( 'wikibase-terms', ), ), - 'jquery.wikibase.fingerprintlistview' => $moduleTemplate + array( + 'jquery.wikibase.entitytermsforlanguagelistview' => $moduleTemplate + array( 'scripts' => array( - 'jquery.wikibase.fingerprintlistview.js', + 'jquery.wikibase.entitytermsforlanguagelistview.js', ), 'styles' => array( - 'themes/default/jquery.wikibase.fingerprintlistview.css', + 'themes/default/jquery.wikibase.entitytermsforlanguagelistview.css', ), 'dependencies' => array( 'jquery.ui.TemplatedWidget', - 'jquery.wikibase.fingerprintview', + 'jquery.wikibase.entitytermsforlanguage', 'wikibase.getLanguageNameByCode', ), 'messages' => array( @@ -215,12 +215,12 @@ ), ), - 'jquery.wikibase.fingerprintview' => $moduleTemplate + array( + 'jquery.wikibase.entitytermsforlanguage' => $moduleTemplate + array( 'scripts' => array( - 'jquery.wikibase.fingerprintview.js', + 'jquery.wikibase.entitytermsforlanguage.js', ), 'styles' => array( - 'themes/default/jquery.wikibase.fingerprintview.css', + 'themes/default/jquery.wikibase.entitytermsforlanguage.css', ), 'dependencies' => array( 'jquery.ui.TemplatedWidget', diff --git a/lib/resources/jquery.wikibase/themes/default/jquery.wikibase.entitytermsforlanguage.css b/lib/resources/jquery.wikibase/themes/default/jquery.wikibase.entitytermsforlanguage.css new file mode 100644 index 0000000..dd1952a --- /dev/null +++ b/lib/resources/jquery.wikibase/themes/default/jquery.wikibase.entitytermsforlanguage.css @@ -0,0 +1,106 @@ +/** + * @licence GNU GPL v2+ + * @author H. Snater < mediaw...@snater.com > + */ +.wikibase-entitytermsforlanguage-language { + width: 25%; + word-wrap: break-word; + padding-left: 10px; + border-left: 1px solid #C9C9C9; +} + +.wikibase-entitytermsforlanguage-label, +.wikibase-entitytermsforlanguage-description, +.wikibase-entitytermsforlanguage-aliases { + width: 75%; + word-wrap: break-word; + padding-left: 10px; +} + +.wikibase-entitytermsforlanguage tr td:first-child + td + td { + width: 25%; +} + +.wikibase-entitytermsforlanguage td { + border-top: 1px solid #C9C9C9; +} + +.wikibase-entitytermsforlanguage td:last-child { + padding-left: 10px; +} + +.wikibase-entitytermsforlanguage-label { + padding: 10px; +} + +.wikibase-entitytermsforlanguage .wikibase-entitytermsforlanguage-label input, +.wikibase-entitytermsforlanguage .wikibase-entitytermsforlanguage-description input { + font-family: inherit; + width: 100%; +} + +.wikibase-entitytermsforlanguage .wikibase-descriptionview .wikibase-descriptionview-container { + padding-left: 0; +} + +.wikibase-entitytermsforlanguage .wikibase-descriptionview .wikibase-descriptionview-text { + line-height: 1.4; + padding-right: 0; +} + +.wikibase-entitytermsforlanguage .wikibase-labelview, +.wikibase-entitytermsforlanguage .wikibase-descriptionview, +.wikibase-entitytermsforlanguage .wikibase-aliasesview { + display: block; + float: none; + margin-top: 0; + padding: 10px; + width: auto; +} + +.wikibase-entitytermsforlanguage .wikibase-aliasesview .wikibase-aliasesview-container { + display: inline-block !important; + padding-left: 0; + padding-right: 0; + width: 100%; +} + +.wikibase-entitytermsforlanguage.wb-edit .wikibase-aliasesview-list { + font-size: 84%; +} + +.wikibase-entitytermsforlanguage.wb-edit .wikibase-aliasesview-list * { + font-size: 100%; +} + +.wikibase-entitytermsforlanguage.wb-edit .wikibase-labelview, +.wikibase-entitytermsforlanguage.wb-edit .wikibase-descriptionview, +.wikibase-entitytermsforlanguage.wb-edit .wikibase-aliasesview { + padding: 9px 8px 9px 7px; +} + +.wikibase-entitytermsforlanguage .wb-error { + background-color: #FFDFC9; +} + +/* the right column of the site links table (...-toolbarparent) should be treated as "action" column */ +.wikibase-entitytermsforlanguage .wb-editsection { + width: 18em; + position: static; /* clear absolute positioning */ + float: none; /* overwrite edit section's float: right */ + padding: 0; + margin-left: 0; /* reset edit section's margin which is set in the toolbar group instead; + applying margin to the edit section cell should not have any effect at all */ +} + +.wikibase-entitytermsforlanguage .wb-editsection .wikibase-toolbar { + width: 18em; /* additionally assign width to toolbar to enforce width in no-JS version */ +} + +.wikibase-entitytermsforlanguage .wb-editsection .wikibase-toolbar .wikibase-toolbar { + margin-left: 1px; /* even out table cell's right border */ +} + +.wikibase-entitytermsforlanguage .wb-editsection .wikibase-toolbar .wikibase-toolbar { + margin-left: 0; /* do not apply margin to nested toolbar groups */ +} diff --git a/lib/resources/jquery.wikibase/themes/default/jquery.wikibase.entitytermsforlanguagelistview.css b/lib/resources/jquery.wikibase/themes/default/jquery.wikibase.entitytermsforlanguagelistview.css new file mode 100644 index 0000000..d4d84cb --- /dev/null +++ b/lib/resources/jquery.wikibase/themes/default/jquery.wikibase.entitytermsforlanguagelistview.css @@ -0,0 +1,23 @@ +/** + * @licence GNU GPL v2+ + * @author H. Snater < mediaw...@snater.com > + */ +.wikibase-entitytermsforlanguagelistview { + border-bottom: 1px solid #C9C9C9; + border-right: 1px solid #C9C9C9; + border-spacing: 0; + clear: both; + width: 100%; +} + +.wikibase-entitytermsforlanguagelistview tr td { + background: #F8F8F8; +} + +.wikibase-entitytermsforlanguagelistview tbody:nth-child(even) td { + background: #F0F0F0; +} + +.wikibase-entitytermsforlanguagelistview .wb-edit tr td { + background: #D6F3FF; +} diff --git a/lib/resources/jquery.wikibase/themes/default/jquery.wikibase.entitytermsview.css b/lib/resources/jquery.wikibase/themes/default/jquery.wikibase.entitytermsview.css new file mode 100644 index 0000000..30e7168 --- /dev/null +++ b/lib/resources/jquery.wikibase/themes/default/jquery.wikibase.entitytermsview.css @@ -0,0 +1,22 @@ +/** + * @licence GNU GPL v2+ + * @author H. Snater < mediaw...@snater.com > + */ +.wikibase-entitytermsview { + float: left; + width: 100%; +} + +.wikibase-entitytermsview h2 { + width: auto; +} + +.wikibase-entitytermsview .wikibase-toolbar-container .wikibase-toolbar-container { + position: relative; +} + +.wikibase-entitytermsview .wikibase-entitytermsview-heading-container > .wikibase-toolbar-container { + float: right; + margin-top: 1.9em; + position: static; +} diff --git a/lib/resources/jquery.wikibase/themes/default/jquery.wikibase.fingerprintgroupview.css b/lib/resources/jquery.wikibase/themes/default/jquery.wikibase.fingerprintgroupview.css deleted file mode 100644 index ff46399..0000000 --- a/lib/resources/jquery.wikibase/themes/default/jquery.wikibase.fingerprintgroupview.css +++ /dev/null @@ -1,22 +0,0 @@ -/** - * @licence GNU GPL v2+ - * @author H. Snater < mediaw...@snater.com > - */ -.wikibase-fingerprintgroupview { - float: left; - width: 100%; -} - -.wikibase-fingerprintgroupview h2 { - width: auto; -} - -.wikibase-fingerprintgroupview .wikibase-toolbar-container .wikibase-toolbar-container { - position: relative; -} - -.wikibase-fingerprintgroupview .wikibase-fingerprintgroupview-heading-container > .wikibase-toolbar-container { - float: right; - margin-top: 1.9em; - position: static; -} diff --git a/lib/resources/jquery.wikibase/themes/default/jquery.wikibase.fingerprintlistview.css b/lib/resources/jquery.wikibase/themes/default/jquery.wikibase.fingerprintlistview.css deleted file mode 100644 index 6689867..0000000 --- a/lib/resources/jquery.wikibase/themes/default/jquery.wikibase.fingerprintlistview.css +++ /dev/null @@ -1,23 +0,0 @@ -/** - * @licence GNU GPL v2+ - * @author H. Snater < mediaw...@snater.com > - */ -.wikibase-fingerprintlistview { - border-bottom: 1px solid #C9C9C9; - border-right: 1px solid #C9C9C9; - border-spacing: 0; - clear: both; - width: 100%; -} - -.wikibase-fingerprintlistview tr td { - background: #F8F8F8; -} - -.wikibase-fingerprintlistview tbody:nth-child(even) td { - background: #F0F0F0; -} - -.wikibase-fingerprintlistview .wb-edit tr td { - background: #D6F3FF; -} diff --git a/lib/resources/jquery.wikibase/themes/default/jquery.wikibase.fingerprintview.css b/lib/resources/jquery.wikibase/themes/default/jquery.wikibase.fingerprintview.css deleted file mode 100644 index 5462cde..0000000 --- a/lib/resources/jquery.wikibase/themes/default/jquery.wikibase.fingerprintview.css +++ /dev/null @@ -1,106 +0,0 @@ -/** - * @licence GNU GPL v2+ - * @author H. Snater < mediaw...@snater.com > - */ -.wikibase-fingerprintview-language { - width: 25%; - word-wrap: break-word; - padding-left: 10px; - border-left: 1px solid #C9C9C9; -} - -.wikibase-fingerprintview-label, -.wikibase-fingerprintview-description, -.wikibase-fingerprintview-aliases { - width: 75%; - word-wrap: break-word; - padding-left: 10px; -} - -.wikibase-fingerprintview tr td:first-child + td + td { - width: 25%; -} - -.wikibase-fingerprintview td { - border-top: 1px solid #C9C9C9; -} - -.wikibase-fingerprintview td:last-child { - padding-left: 10px; -} - -.wikibase-fingerprintview-label { - padding: 10px; -} - -.wikibase-fingerprintview .wikibase-fingerprintview-label input, -.wikibase-fingerprintview .wikibase-fingerprintview-description input { - font-family: inherit; - width: 100%; -} - -.wikibase-fingerprintview .wikibase-descriptionview .wikibase-descriptionview-container { - padding-left: 0; -} - -.wikibase-fingerprintview .wikibase-descriptionview .wikibase-descriptionview-text { - line-height: 1.4; - padding-right: 0; -} - -.wikibase-fingerprintview .wikibase-labelview, -.wikibase-fingerprintview .wikibase-descriptionview, -.wikibase-fingerprintview .wikibase-aliasesview { - display: block; - float: none; - margin-top: 0; - padding: 10px; - width: auto; -} - -.wikibase-fingerprintview .wikibase-aliasesview .wikibase-aliasesview-container { - display: inline-block !important; - padding-left: 0; - padding-right: 0; - width: 100%; -} - -.wikibase-fingerprintview.wb-edit .wikibase-aliasesview-list { - font-size: 84%; -} - -.wikibase-fingerprintview.wb-edit .wikibase-aliasesview-list * { - font-size: 100%; -} - -.wikibase-fingerprintview.wb-edit .wikibase-labelview, -.wikibase-fingerprintview.wb-edit .wikibase-descriptionview, -.wikibase-fingerprintview.wb-edit .wikibase-aliasesview { - padding: 9px 8px 9px 7px; -} - -.wikibase-fingerprintview .wb-error { - background-color: #FFDFC9; -} - -/* the right column of the site links table (...-toolbarparent) should be treated as "action" column */ -.wikibase-fingerprintview .wb-editsection { - width: 18em; - position: static; /* clear absolute positioning */ - float: none; /* overwrite edit section's float: right */ - padding: 0; - margin-left: 0; /* reset edit section's margin which is set in the toolbar group instead; - applying margin to the edit section cell should not have any effect at all */ -} - -.wikibase-fingerprintview .wb-editsection .wikibase-toolbar { - width: 18em; /* additionally assign width to toolbar to enforce width in no-JS version */ -} - -.wikibase-fingerprintview .wb-editsection .wikibase-toolbar .wikibase-toolbar { - margin-left: 1px; /* even out table cell's right border */ -} - -.wikibase-fingerprintview .wb-editsection .wikibase-toolbar .wikibase-toolbar { - margin-left: 0; /* do not apply margin to nested toolbar groups */ -} diff --git a/lib/tests/qunit/jquery.wikibase/jquery.wikibase.entitytermsforlanguage.tests.js b/lib/tests/qunit/jquery.wikibase/jquery.wikibase.entitytermsforlanguage.tests.js new file mode 100644 index 0000000..56315b1 --- /dev/null +++ b/lib/tests/qunit/jquery.wikibase/jquery.wikibase.entitytermsforlanguage.tests.js @@ -0,0 +1,344 @@ +/** + * @licence GNU GPL v2+ + * @author H. Snater < mediaw...@snater.com > + */ +( function( $, wb, QUnit ) { +'use strict'; + +/** + * @param {Object} [options] + * @param {jQuery} [$node] + * @return {jQuery} + */ +var createEntitytermsforlanguage = function( options, $node ) { + options = $.extend( { + entityId: 'i am an EntityId', + entityChangersFactory: { + getAliasesChanger: function() { return 'i am an AliasesChanger'; }, + getDescriptionsChanger: function() { + return { + setDescription: function() { return $.Deferred().resolve(); } + }; + }, + getLabelsChanger: function() { + return { + setLabel: function() { return $.Deferred().resolve(); } + }; + } + }, + value: { + language: 'en', + label: new wb.datamodel.Term( 'en', 'test label' ), + description: new wb.datamodel.Term( 'en', 'test description' ), + aliases: new wb.datamodel.MultiTerm( 'en', ['alias1', 'alias2'] ) + } + }, options || {} ); + + $node = $node || $( '<tbody/>' ).appendTo( $( '<table/>' ) ); + + var $entitytermsforlanguage = $node + .addClass( 'test_entitytermsforlanguage' ) + .entitytermsforlanguage( options ); + + var entitytermsforlanguage = $entitytermsforlanguage.data( 'entitytermsforlanguage' ); + + entitytermsforlanguage.$labelview.data( 'labelview' )._save + = entitytermsforlanguage.$descriptionview.data( 'descriptionview' )._save + = entitytermsforlanguage.$aliasesview.data( 'aliasesview' )._save + = function() { + return $.Deferred().resolve( { + entity: { + lastrevid: 'i am a revision id' + } + } ).promise(); + }; + + return $entitytermsforlanguage; +}; + +QUnit.module( 'jquery.wikibase.entitytermsforlanguage', QUnit.newMwEnvironment( { + teardown: function() { + $( '.test_entitytermsforlanguage' ).each( function() { + var $entitytermsforlanguage = $( this ), + entitytermsforlanguage = $entitytermsforlanguage.data( 'entitytermsforlanguage' ); + + if( entitytermsforlanguage ) { + entitytermsforlanguage.destroy(); + } + + $entitytermsforlanguage.remove(); + } ); + } +} ) ); + +QUnit.test( 'Create & destroy', function( assert ) { + assert.throws( + function() { + createEntitytermsforlanguage( { value: null } ); + }, + 'Throwing error when trying to initialize widget without a value.' + ); + + var $entitytermsforlanguage = createEntitytermsforlanguage(), + entitytermsforlanguage = $entitytermsforlanguage.data( 'entitytermsforlanguage' ); + + assert.ok( + entitytermsforlanguage !== undefined, + 'Created widget.' + ); + + entitytermsforlanguage.destroy(); + + assert.ok( + $entitytermsforlanguage.data( 'entitytermsforlanguage' ) === undefined, + 'Destroyed widget.' + ); +} ); + +QUnit.test( 'startEditing() & stopEditing()', 6, function( assert ) { + var $entitytermsforlanguage = createEntitytermsforlanguage(), + entitytermsforlanguage = $entitytermsforlanguage.data( 'entitytermsforlanguage' ); + + $entitytermsforlanguage + .on( 'entitytermsforlanguageafterstartediting', function( event ) { + assert.ok( + true, + 'Started edit mode.' + ); + } ) + .on( 'entitytermsforlanguageafterstopediting', function( event, dropValue ) { + assert.ok( + true, + 'Stopped edit mode.' + ); + } ); + + /** + * @param {Function} func + * @param {boolean} expectingEvent + * @return {jQuery.Promise} + */ + function testEditModeChange( func, expectingEvent ) { + var deferred = $.Deferred(); + + if( !expectingEvent ) { + func(); + return deferred.resolve().promise(); + } + + $entitytermsforlanguage + .one( + 'entitytermsforlanguageafterstartediting.entitytermsforlanguagetest', + function( event ) { + $entitytermsforlanguage.off( '.entitytermsforlanguagetest' ); + deferred.resolve(); + } + ) + .one( + 'entitytermsforlanguageafterstopediting.entitytermsforlanguagetest', + function( event, dropValue ) { + $entitytermsforlanguage.off( '.entitytermsforlanguagetest' ); + deferred.resolve(); + } + ); + + func(); + + return deferred.promise(); + } + + var $queue = $( {} ); + + /** + * @param {jQuery} $queue + * @param {Function} func + * @param {boolean} [expectingEvent] + */ + function addToQueue( $queue, func, expectingEvent ) { + if( expectingEvent === undefined ) { + expectingEvent = true; + } + $queue.queue( 'tests', function( next ) { + QUnit.stop(); + testEditModeChange( func, expectingEvent ).always( function() { + QUnit.start(); + next(); + } ); + } ); + } + + addToQueue( $queue, function() { + entitytermsforlanguage.startEditing(); + } ); + + addToQueue( $queue, function() { + entitytermsforlanguage.startEditing(); + }, false ); + + addToQueue( $queue, function() { + entitytermsforlanguage.stopEditing( true ); + } ); + + addToQueue( $queue, function() { + entitytermsforlanguage.stopEditing( true ); + }, false ); + + addToQueue( $queue, function() { + entitytermsforlanguage.stopEditing(); + }, false ); + + addToQueue( $queue, function() { + entitytermsforlanguage.startEditing(); + } ); + + addToQueue( $queue, function() { + entitytermsforlanguage.$label.find( 'input' ).val( '' ); + entitytermsforlanguage.stopEditing(); + } ); + + addToQueue( $queue, function() { + entitytermsforlanguage.startEditing(); + } ); + + addToQueue( $queue, function() { + entitytermsforlanguage.$description.find( 'input' ).val( 'changed description' ); + entitytermsforlanguage.stopEditing(); + } ); + + $queue.dequeue( 'tests' ); +} ); + +QUnit.test( 'isInitialValue()', function( assert ) { + var $entitytermsforlanguage = createEntitytermsforlanguage(), + entitytermsforlanguage = $entitytermsforlanguage.data( 'entitytermsforlanguage' ); + + entitytermsforlanguage.startEditing(); + + assert.ok( + entitytermsforlanguage.isInitialValue(), + 'Verified isInitialValue() returning true.' + ); + + entitytermsforlanguage.$label.find( 'input' ).val( 'changed' ); + + assert.ok( + !entitytermsforlanguage.isInitialValue(), + 'Verified isInitialValue() returning false after changing value.' + ); + + entitytermsforlanguage.$label.find( 'input' ).val( 'test label' ); + + assert.ok( + entitytermsforlanguage.isInitialValue(), + 'Verified isInitialValue() returning true after resetting to initial value.' + ); +} ); + +QUnit.test( 'setError()', function( assert ) { + var $entitytermsforlanguage = createEntitytermsforlanguage(), + entitytermsforlanguage = $entitytermsforlanguage.data( 'entitytermsforlanguage' ); + + $entitytermsforlanguage + .on( 'entitytermsforlanguagetoggleerror', function( event, error ) { + assert.ok( + true, + 'Triggered "toggleerror" event.' + ); + } ); + + entitytermsforlanguage.setError(); +} ); + +QUnit.test( 'value()', function( assert ) { + var $entitytermsforlanguage = createEntitytermsforlanguage(), + entitytermsforlanguage = $entitytermsforlanguage.data( 'entitytermsforlanguage' ), + label = new wb.datamodel.Term( 'en', 'changed label' ), + description = new wb.datamodel.Term( 'en', 'test description' ), + aliases = new wb.datamodel.MultiTerm( 'en', ['alias1', 'alias2'] ); + + assert.throws( + function() { + entitytermsforlanguage.value( null ); + }, + 'Trying to set no value fails.' + ); + + entitytermsforlanguage.value( { + language: 'en', + label: label, + description: description, + aliases: aliases + } ); + + assert.ok( + entitytermsforlanguage.value().label.equals( label ), + 'Set new label.' + ); + + assert.ok( + entitytermsforlanguage.value().description.equals( description ), + 'Did not change description.' + ); + + label = new wb.datamodel.Term( 'en', 'test label' ); + description = new wb.datamodel.Term( 'en', '' ); + + entitytermsforlanguage.value( { + language: 'en', + label: label, + description: description, + aliases: aliases + } ); + + assert.ok( + entitytermsforlanguage.value().label.equals( label ), + 'Reset label.' + ); + + assert.ok( + entitytermsforlanguage.value().description.equals( description ), + 'Removed description.' + ); + + aliases = new wb.datamodel.MultiTerm( 'en', ['alias1', 'alias2', 'alias3'] ); + + entitytermsforlanguage.value( { + language: 'en', + label: label, + description: description, + aliases: aliases + } ); + + assert.ok( + entitytermsforlanguage.value().aliases.equals( aliases ), + 'Added alias.' + ); + + aliases = new wb.datamodel.MultiTerm( 'en', [] ); + + entitytermsforlanguage.value( { + language: 'en', + label: label, + description: description, + aliases: aliases + } ); + + assert.ok( + entitytermsforlanguage.value().aliases.equals( aliases ), + 'Removed aliases.' + ); + + assert.throws( + function() { + entitytermsforlanguage.value( { + language: 'de', + label: label, + description: description, + aliases: aliases + } ); + }, + 'Trying to change language fails.' + ); +} ); + +}( jQuery, wikibase, QUnit ) ); diff --git a/lib/tests/qunit/jquery.wikibase/jquery.wikibase.entitytermsforlanguagelistview.tests.js b/lib/tests/qunit/jquery.wikibase/jquery.wikibase.entitytermsforlanguagelistview.tests.js new file mode 100644 index 0000000..cf32842 --- /dev/null +++ b/lib/tests/qunit/jquery.wikibase/jquery.wikibase.entitytermsforlanguagelistview.tests.js @@ -0,0 +1,157 @@ +/** + * @licence GNU GPL v2+ + * @author H. Snater < mediaw...@snater.com > + */ +( function( $, wb, QUnit ) { +'use strict'; + +/** + * @param {Object} [options] + * @return {jQuery} + */ +var createEntitytermsforlanguagelistview = function( options ) { + options = $.extend( { + entityId: 'i am an EntityId', + entityChangersFactory: { + getAliasesChanger: function() { return 'i am an AliasesChanger'; }, + getDescriptionsChanger: function() { return 'i am a DescriptionsChanger'; }, + getLabelsChanger: function() { return 'i am a LabelsChanger'; } + }, + value: [ + { + language: 'de', + label: new wb.datamodel.Term( 'de', 'de-label' ), + description: new wb.datamodel.Term( 'de', 'de-description' ), + aliases: new wb.datamodel.MultiTerm( 'de', [] ) + }, { + language: 'en', + label: new wb.datamodel.Term( 'en', 'en-label' ), + description: new wb.datamodel.Term( 'en', 'en-description' ), + aliases: new wb.datamodel.MultiTerm( 'en', [] ) + } + ] + }, options || {} ); + + return $( '<table/>' ) + .appendTo( 'body' ) + .addClass( 'test_entitytermsforlanguagelistview' ) + .entitytermsforlanguagelistview( options ); +}; + +QUnit.module( 'jquery.wikibase.entitytermsforlanguagelistview', QUnit.newMwEnvironment( { + teardown: function() { + $( '.test_entitytermsforlanguagelistview' ).each( function() { + var $entitytermsforlanguagelistview = $( this ), + entitytermsforlanguagelistview + = $entitytermsforlanguagelistview.data( 'entitytermsforlanguagelistview' ); + + if( entitytermsforlanguagelistview ) { + entitytermsforlanguagelistview.destroy(); + } + + $entitytermsforlanguagelistview.remove(); + } ); + } +} ) ); + +QUnit.test( 'Create & destroy', function( assert ) { + assert.throws( + function() { + createEntitytermsforlanguagelistview( { value: null } ); + }, + 'Throwing error when trying to initialize widget without a value.' + ); + + var $entitytermsforlanguagelistview = createEntitytermsforlanguagelistview(), + entitytermsforlanguagelistview + = $entitytermsforlanguagelistview.data( 'entitytermsforlanguagelistview' ); + + assert.ok( + entitytermsforlanguagelistview !== undefined, + 'Created widget.' + ); + + entitytermsforlanguagelistview.destroy(); + + assert.ok( + $entitytermsforlanguagelistview.data( 'entitytermsforlanguagelistview' ) === undefined, + 'Destroyed widget.' + ); +} ); + +QUnit.test( 'isInitialValue()', function( assert ) { + var $entitytermsforlanguagelistview = createEntitytermsforlanguagelistview(), + entitytermsforlanguagelistview + = $entitytermsforlanguagelistview.data( 'entitytermsforlanguagelistview' ); + + entitytermsforlanguagelistview.startEditing(); + + assert.ok( + entitytermsforlanguagelistview.isInitialValue(), + 'Verified isInitialValue() returning true.' + ); + + var $item = $entitytermsforlanguagelistview.data( 'listview' ).addItem( { + language: 'fa', + label: new wb.datamodel.Term( 'fa', 'fa-label' ), + description: new wb.datamodel.Term( 'fa', 'fa-description' ), + aliases: new wb.datamodel.MultiTerm( 'fa', [] ) + } ); + + assert.ok( + !entitytermsforlanguagelistview.isInitialValue(), + 'Verified isInitialValue() returning false after changing value.' + ); + + $entitytermsforlanguagelistview.data( 'listview' ).removeItem( $item ); + + assert.ok( + entitytermsforlanguagelistview.isInitialValue(), + 'Verified isInitialValue() returning true after resetting to initial value.' + ); +} ); + +// TODO: Add test which is kind of pointless without having a method to save a whole fingerprint +// which could be overwritten by the test mechanism. Instead, the "save" functions of labelview, +// descriptionview and aliasesview for each single entitytermsforlanguage would need to be +// overwritten (see entitytermsforlanguage tests). +// QUnit.test( 'startEditing() & stopEditing()', function( assert ) {} ); + +QUnit.test( 'setError()', function( assert ) { + var $entitytermsforlanguagelistview = createEntitytermsforlanguagelistview(), + entitytermsforlanguagelistview + = $entitytermsforlanguagelistview.data( 'entitytermsforlanguagelistview' ); + + $entitytermsforlanguagelistview + .on( 'entitytermsforlanguagelistviewtoggleerror', function( event, error ) { + assert.ok( + true, + 'Triggered "toggleerror" event.' + ); + } ); + + entitytermsforlanguagelistview.setError(); +} ); + +QUnit.test( 'value()', function( assert ) { + var $entitytermsforlanguagelistview = createEntitytermsforlanguagelistview(), + entitytermsforlanguagelistview + = $entitytermsforlanguagelistview.data( 'entitytermsforlanguagelistview' ); + + // TODO: Enhance test as soon as SiteLinkList is implemented in DataModelJavaScript and used + // as value object. + assert.equal( + entitytermsforlanguagelistview.value().length, + 2, + 'Retrieved value.' + ); + + assert.throws( + function() { + entitytermsforlanguagelistview.value( [] ); + }, + 'Throwing error when trying to set a new value.' + ); +} ); + +}( jQuery, wikibase, QUnit ) ); diff --git a/lib/tests/qunit/jquery.wikibase/jquery.wikibase.entitytermsview.tests.js b/lib/tests/qunit/jquery.wikibase/jquery.wikibase.entitytermsview.tests.js new file mode 100644 index 0000000..59d86b3 --- /dev/null +++ b/lib/tests/qunit/jquery.wikibase/jquery.wikibase.entitytermsview.tests.js @@ -0,0 +1,114 @@ +/** + * @licence GNU GPL v2+ + * @author H. Snater < mediaw...@snater.com > + */ +( function( $, wb, QUnit ) { +'use strict'; + +/** + * @param {Object} [options] + * @return {jQuery} + */ +var createEntitytermsview = function( options ) { + options = $.extend( { + value: [ + { + language: 'de', + label: new wb.datamodel.Term( 'de', 'de-label' ), + description: new wb.datamodel.Term( 'de', 'de-description' ), + aliases: new wb.datamodel.MultiTerm( 'de', [] ) + }, { + language: 'en', + label: new wb.datamodel.Term( 'en', 'en-label' ), + description: new wb.datamodel.Term( 'en', 'en-description' ), + aliases: new wb.datamodel.MultiTerm( 'en', [] ) + } + ], + entityId: 'i am an EntityId', + entityChangersFactory: { + getAliasesChanger: function() { return 'i am an AliasesChanger'; }, + getDescriptionsChanger: function() { return 'i am a DescriptionsChanger'; }, + getLabelsChanger: function() { return 'i am a LabelsChanger'; } + } + }, options || {} ); + + return $( '<div/>' ) + .appendTo( 'body' ) + .addClass( 'test_entitytermsview' ) + .entitytermsview( options ); +}; + +QUnit.module( 'jquery.wikibase.entitytermsview', QUnit.newMwEnvironment( { + teardown: function() { + $( '.test_entitytermsview' ).each( function() { + var $entitytermsview = $( this ), + entitytermsview = $entitytermsview.data( 'entitytermsview' ); + + if( entitytermsview ) { + entitytermsview.destroy(); + } + + $entitytermsview.remove(); + } ); + } +} ) ); + +QUnit.test( 'Create & destroy', function( assert ) { + assert.throws( + function() { + createEntitytermsview( { value: null } ); + }, + 'Throwing error when trying to initialize widget without a value.' + ); + + var $entitytermsview = createEntitytermsview(), + entitytermsview = $entitytermsview.data( 'entitytermsview' ); + + assert.ok( + entitytermsview !== undefined, + 'Created widget.' + ); + + entitytermsview.destroy(); + + assert.ok( + $entitytermsview.data( 'entitytermsview' ) === undefined, + 'Destroyed widget.' + ); +} ); + +QUnit.test( 'setError()', function( assert ) { + var $entitytermsview = createEntitytermsview(), + entitytermsview = $entitytermsview.data( 'entitytermsview' ); + + $entitytermsview + .on( 'entitytermsviewtoggleerror', function( event, error ) { + assert.ok( + true, + 'Triggered "toggleerror" event.' + ); + } ); + + entitytermsview.setError(); +} ); + +QUnit.test( 'value()', function( assert ) { + var $entitytermsview = createEntitytermsview(), + entitytermsview = $entitytermsview.data( 'entitytermsview' ); + + // TODO: Enhance test as soon as SiteLinkList is implemented in DataModelJavaScript + assert.equal( + entitytermsview.value().length, + 2, + 'Retrieved value.' + ); + + assert.throws( + function() { + entitytermsview.value( [] ); + }, + 'Throwing error when trying to set a new value.' + ); +} ); + +}( jQuery, wikibase, QUnit ) ); diff --git a/lib/tests/qunit/jquery.wikibase/jquery.wikibase.fingerprintgroupview.tests.js b/lib/tests/qunit/jquery.wikibase/jquery.wikibase.fingerprintgroupview.tests.js deleted file mode 100644 index c43f67e..0000000 --- a/lib/tests/qunit/jquery.wikibase/jquery.wikibase.fingerprintgroupview.tests.js +++ /dev/null @@ -1,114 +0,0 @@ -/** - * @licence GNU GPL v2+ - * @author H. Snater < mediaw...@snater.com > - */ -( function( $, wb, QUnit ) { -'use strict'; - -/** - * @param {Object} [options] - * @return {jQuery} - */ -var createFingerprintgroupview = function( options ) { - options = $.extend( { - value: [ - { - language: 'de', - label: new wb.datamodel.Term( 'de', 'de-label' ), - description: new wb.datamodel.Term( 'de', 'de-description' ), - aliases: new wb.datamodel.MultiTerm( 'de', [] ) - }, { - language: 'en', - label: new wb.datamodel.Term( 'en', 'en-label' ), - description: new wb.datamodel.Term( 'en', 'en-description' ), - aliases: new wb.datamodel.MultiTerm( 'en', [] ) - } - ], - entityId: 'i am an EntityId', - entityChangersFactory: { - getAliasesChanger: function() { return 'i am an AliasesChanger'; }, - getDescriptionsChanger: function() { return 'i am a DescriptionsChanger'; }, - getLabelsChanger: function() { return 'i am a LabelsChanger'; } - } - }, options || {} ); - - return $( '<div/>' ) - .appendTo( 'body' ) - .addClass( 'test_fingerprintgroupview' ) - .fingerprintgroupview( options ); -}; - -QUnit.module( 'jquery.wikibase.fingerprintgroupview', QUnit.newMwEnvironment( { - teardown: function() { - $( '.test_fingerprintgroupview' ).each( function() { - var $fingerprintgroupview = $( this ), - fingerprintgroupview = $fingerprintgroupview.data( 'fingerprintgroupview' ); - - if( fingerprintgroupview ) { - fingerprintgroupview.destroy(); - } - - $fingerprintgroupview.remove(); - } ); - } -} ) ); - -QUnit.test( 'Create & destroy', function( assert ) { - assert.throws( - function() { - createFingerprintgroupview( { value: null } ); - }, - 'Throwing error when trying to initialize widget without a value.' - ); - - var $fingerprintgroupview = createFingerprintgroupview(), - fingerprintgroupview = $fingerprintgroupview.data( 'fingerprintgroupview' ); - - assert.ok( - fingerprintgroupview !== undefined, - 'Created widget.' - ); - - fingerprintgroupview.destroy(); - - assert.ok( - $fingerprintgroupview.data( 'fingerprintgroupview' ) === undefined, - 'Destroyed widget.' - ); -} ); - -QUnit.test( 'setError()', function( assert ) { - var $fingerprintgroupview = createFingerprintgroupview(), - fingerprintgroupview = $fingerprintgroupview.data( 'fingerprintgroupview' ); - - $fingerprintgroupview - .on( 'fingerprintgroupviewtoggleerror', function( event, error ) { - assert.ok( - true, - 'Triggered "toggleerror" event.' - ); - } ); - - fingerprintgroupview.setError(); -} ); - -QUnit.test( 'value()', function( assert ) { - var $fingerprintgroupview = createFingerprintgroupview(), - fingerprintgroupview = $fingerprintgroupview.data( 'fingerprintgroupview' ); - - // TODO: Enhance test as soon as SiteLinkList is implemented in DataModelJavaScript - assert.equal( - fingerprintgroupview.value().length, - 2, - 'Retrieved value.' - ); - - assert.throws( - function() { - fingerprintgroupview.value( [] ); - }, - 'Throwing error when trying to set a new value.' - ); -} ); - -}( jQuery, wikibase, QUnit ) ); diff --git a/lib/tests/qunit/jquery.wikibase/jquery.wikibase.fingerprintlistview.tests.js b/lib/tests/qunit/jquery.wikibase/jquery.wikibase.fingerprintlistview.tests.js deleted file mode 100644 index b286060..0000000 --- a/lib/tests/qunit/jquery.wikibase/jquery.wikibase.fingerprintlistview.tests.js +++ /dev/null @@ -1,152 +0,0 @@ -/** - * @licence GNU GPL v2+ - * @author H. Snater < mediaw...@snater.com > - */ -( function( $, wb, QUnit ) { -'use strict'; - -/** - * @param {Object} [options] - * @return {jQuery} - */ -var createFingerprintlistview = function( options ) { - options = $.extend( { - entityId: 'i am an EntityId', - entityChangersFactory: { - getAliasesChanger: function() { return 'i am an AliasesChanger'; }, - getDescriptionsChanger: function() { return 'i am a DescriptionsChanger'; }, - getLabelsChanger: function() { return 'i am a LabelsChanger'; } - }, - value: [ - { - language: 'de', - label: new wb.datamodel.Term( 'de', 'de-label' ), - description: new wb.datamodel.Term( 'de', 'de-description' ), - aliases: new wb.datamodel.MultiTerm( 'de', [] ) - }, { - language: 'en', - label: new wb.datamodel.Term( 'en', 'en-label' ), - description: new wb.datamodel.Term( 'en', 'en-description' ), - aliases: new wb.datamodel.MultiTerm( 'en', [] ) - } - ] - }, options || {} ); - - return $( '<table/>' ) - .appendTo( 'body' ) - .addClass( 'test_fingerprintlistview' ) - .fingerprintlistview( options ); -}; - -QUnit.module( 'jquery.wikibase.fingerprintlistview', QUnit.newMwEnvironment( { - teardown: function() { - $( '.test_fingerprintlistview' ).each( function() { - var $fingerprintlistview = $( this ), - fingerprintlistview = $fingerprintlistview.data( 'fingerprintlistview' ); - - if( fingerprintlistview ) { - fingerprintlistview.destroy(); - } - - $fingerprintlistview.remove(); - } ); - } -} ) ); - -QUnit.test( 'Create & destroy', function( assert ) { - assert.throws( - function() { - createFingerprintlistview( { value: null } ); - }, - 'Throwing error when trying to initialize widget without a value.' - ); - - var $fingerprintlistview = createFingerprintlistview(), - fingerprintlistview = $fingerprintlistview.data( 'fingerprintlistview' ); - - assert.ok( - fingerprintlistview !== undefined, - 'Created widget.' - ); - - fingerprintlistview.destroy(); - - assert.ok( - $fingerprintlistview.data( 'fingerprintlistview' ) === undefined, - 'Destroyed widget.' - ); -} ); - -QUnit.test( 'isInitialValue()', function( assert ) { - var $fingerprintlistview = createFingerprintlistview(), - fingerprintlistview = $fingerprintlistview.data( 'fingerprintlistview' ); - - fingerprintlistview.startEditing(); - - assert.ok( - fingerprintlistview.isInitialValue(), - 'Verified isInitialValue() returning true.' - ); - - var $item = $fingerprintlistview.data( 'listview' ).addItem( { - language: 'fa', - label: new wb.datamodel.Term( 'fa', 'fa-label' ), - description: new wb.datamodel.Term( 'fa', 'fa-description' ), - aliases: new wb.datamodel.MultiTerm( 'fa', [] ) - } ); - - assert.ok( - !fingerprintlistview.isInitialValue(), - 'Verified isInitialValue() returning false after changing value.' - ); - - $fingerprintlistview.data( 'listview' ).removeItem( $item ); - - assert.ok( - fingerprintlistview.isInitialValue(), - 'Verified isInitialValue() returning true after resetting to initial value.' - ); -} ); - -// TODO: Add test which is kind of pointless without having a method to save a whole fingerprint -// which could be overwritten by the test mechanism. Instead, the "save" functions of labelview, -// descriptionview and aliasesview for each single fingerprintview would need to be overwritten -// (see fingerprintview tests). -// QUnit.test( 'startEditing() & stopEditing()', function( assert ) {} ); - -QUnit.test( 'setError()', function( assert ) { - var $fingerprintlistview = createFingerprintlistview(), - fingerprintlistview = $fingerprintlistview.data( 'fingerprintlistview' ); - - $fingerprintlistview - .on( 'fingerprintlistviewtoggleerror', function( event, error ) { - assert.ok( - true, - 'Triggered "toggleerror" event.' - ); - } ); - - fingerprintlistview.setError(); -} ); - -QUnit.test( 'value()', function( assert ) { - var $fingerprintlistview = createFingerprintlistview(), - fingerprintlistview = $fingerprintlistview.data( 'fingerprintlistview' ); - - // TODO: Enhance test as soon as SiteLinkList is implemented in DataModelJavaScript and used - // as value object. - assert.equal( - fingerprintlistview.value().length, - 2, - 'Retrieved value.' - ); - - assert.throws( - function() { - fingerprintlistview.value( [] ); - }, - 'Throwing error when trying to set a new value.' - ); -} ); - -}( jQuery, wikibase, QUnit ) ); diff --git a/lib/tests/qunit/jquery.wikibase/jquery.wikibase.fingerprintview.tests.js b/lib/tests/qunit/jquery.wikibase/jquery.wikibase.fingerprintview.tests.js deleted file mode 100644 index f23d8ba..0000000 --- a/lib/tests/qunit/jquery.wikibase/jquery.wikibase.fingerprintview.tests.js +++ /dev/null @@ -1,338 +0,0 @@ -/** - * @licence GNU GPL v2+ - * @author H. Snater < mediaw...@snater.com > - */ -( function( $, wb, QUnit ) { -'use strict'; - -/** - * @param {Object} [options] - * @param {jQuery} [$node] - * @return {jQuery} - */ -var createFingerprintview = function( options, $node ) { - options = $.extend( { - entityId: 'i am an EntityId', - entityChangersFactory: { - getAliasesChanger: function() { return 'i am an AliasesChanger'; }, - getDescriptionsChanger: function() { - return { - setDescription: function() { return $.Deferred().resolve(); } - }; - }, - getLabelsChanger: function() { - return { - setLabel: function() { return $.Deferred().resolve(); } - }; - } - }, - value: { - language: 'en', - label: new wb.datamodel.Term( 'en', 'test label' ), - description: new wb.datamodel.Term( 'en', 'test description' ), - aliases: new wb.datamodel.MultiTerm( 'en', ['alias1', 'alias2'] ) - } - }, options || {} ); - - $node = $node || $( '<tbody/>' ).appendTo( $( '<table/>' ) ); - - var $fingerprintview = $node - .addClass( 'test_fingerprintview' ) - .fingerprintview( options ); - - var fingerprintview = $fingerprintview.data( 'fingerprintview' ); - - fingerprintview.$labelview.data( 'labelview' )._save - = fingerprintview.$descriptionview.data( 'descriptionview' )._save - = fingerprintview.$aliasesview.data( 'aliasesview' )._save - = function() { - return $.Deferred().resolve( { - entity: { - lastrevid: 'i am a revision id' - } - } ).promise(); - }; - - return $fingerprintview; -}; - -QUnit.module( 'jquery.wikibase.fingerprintview', QUnit.newMwEnvironment( { - teardown: function() { - $( '.test_fingerprintview' ).each( function() { - var $fingerprintview = $( this ), - fingerprintview = $fingerprintview.data( 'fingerprintview' ); - - if( fingerprintview ) { - fingerprintview.destroy(); - } - - $fingerprintview.remove(); - } ); - } -} ) ); - -QUnit.test( 'Create & destroy', function( assert ) { - assert.throws( - function() { - createFingerprintview( { value: null } ); - }, - 'Throwing error when trying to initialize widget without a value.' - ); - - var $fingerprintview = createFingerprintview(), - fingerprintview = $fingerprintview.data( 'fingerprintview' ); - - assert.ok( - fingerprintview !== undefined, - 'Created widget.' - ); - - fingerprintview.destroy(); - - assert.ok( - $fingerprintview.data( 'fingerprintview' ) === undefined, - 'Destroyed widget.' - ); -} ); - -QUnit.test( 'startEditing() & stopEditing()', 6, function( assert ) { - var $fingerprintview = createFingerprintview(), - fingerprintview = $fingerprintview.data( 'fingerprintview' ); - - $fingerprintview - .on( 'fingerprintviewafterstartediting', function( event ) { - assert.ok( - true, - 'Started edit mode.' - ); - } ) - .on( 'fingerprintviewafterstopediting', function( event, dropValue ) { - assert.ok( - true, - 'Stopped edit mode.' - ); - } ); - - /** - * @param {Function} func - * @param {boolean} expectingEvent - * @return {jQuery.Promise} - */ - function testEditModeChange( func, expectingEvent ) { - var deferred = $.Deferred(); - - if( !expectingEvent ) { - func(); - return deferred.resolve().promise(); - } - - $fingerprintview - .one( 'fingerprintviewafterstartediting.fingerprintviewtest', function( event ) { - $fingerprintview.off( '.fingerprintviewtest' ); - deferred.resolve(); - } ) - .one( 'fingerprintviewafterstopediting.fingerprintviewtest', function( event, dropValue ) { - $fingerprintview.off( '.fingerprintviewtest' ); - deferred.resolve(); - } ); - - func(); - - return deferred.promise(); - } - - var $queue = $( {} ); - - /** - * @param {jQuery} $queue - * @param {Function} func - * @param {boolean} [expectingEvent] - */ - function addToQueue( $queue, func, expectingEvent ) { - if( expectingEvent === undefined ) { - expectingEvent = true; - } - $queue.queue( 'tests', function( next ) { - QUnit.stop(); - testEditModeChange( func, expectingEvent ).always( function() { - QUnit.start(); - next(); - } ); - } ); - } - - addToQueue( $queue, function() { - fingerprintview.startEditing(); - } ); - - addToQueue( $queue, function() { - fingerprintview.startEditing(); - }, false ); - - addToQueue( $queue, function() { - fingerprintview.stopEditing( true ); - } ); - - addToQueue( $queue, function() { - fingerprintview.stopEditing( true ); - }, false ); - - addToQueue( $queue, function() { - fingerprintview.stopEditing(); - }, false ); - - addToQueue( $queue, function() { - fingerprintview.startEditing(); - } ); - - addToQueue( $queue, function() { - fingerprintview.$label.find( 'input' ).val( '' ); - fingerprintview.stopEditing(); - } ); - - addToQueue( $queue, function() { - fingerprintview.startEditing(); - } ); - - addToQueue( $queue, function() { - fingerprintview.$description.find( 'input' ).val( 'changed description' ); - fingerprintview.stopEditing(); - } ); - - $queue.dequeue( 'tests' ); -} ); - -QUnit.test( 'isInitialValue()', function( assert ) { - var $fingerprintview = createFingerprintview(), - fingerprintview = $fingerprintview.data( 'fingerprintview' ); - - fingerprintview.startEditing(); - - assert.ok( - fingerprintview.isInitialValue(), - 'Verified isInitialValue() returning true.' - ); - - fingerprintview.$label.find( 'input' ).val( 'changed' ); - - assert.ok( - !fingerprintview.isInitialValue(), - 'Verified isInitialValue() returning false after changing value.' - ); - - fingerprintview.$label.find( 'input' ).val( 'test label' ); - - assert.ok( - fingerprintview.isInitialValue(), - 'Verified isInitialValue() returning true after resetting to initial value.' - ); -} ); - -QUnit.test( 'setError()', function( assert ) { - var $fingerprintview = createFingerprintview(), - fingerprintview = $fingerprintview.data( 'fingerprintview' ); - - $fingerprintview - .on( 'fingerprintviewtoggleerror', function( event, error ) { - assert.ok( - true, - 'Triggered "toggleerror" event.' - ); - } ); - - fingerprintview.setError(); -} ); - -QUnit.test( 'value()', function( assert ) { - var $fingerprintview = createFingerprintview(), - fingerprintview = $fingerprintview.data( 'fingerprintview' ), - label = new wb.datamodel.Term( 'en', 'changed label' ), - description = new wb.datamodel.Term( 'en', 'test description' ), - aliases = new wb.datamodel.MultiTerm( 'en', ['alias1', 'alias2'] ); - - assert.throws( - function() { - fingerprintview.value( null ); - }, - 'Trying to set no value fails.' - ); - - fingerprintview.value( { - language: 'en', - label: label, - description: description, - aliases: aliases - } ); - - assert.ok( - fingerprintview.value().label.equals( label ), - 'Set new label.' - ); - - assert.ok( - fingerprintview.value().description.equals( description ), - 'Did not change description.' - ); - - label = new wb.datamodel.Term( 'en', 'test label' ); - description = new wb.datamodel.Term( 'en', '' ); - - fingerprintview.value( { - language: 'en', - label: label, - description: description, - aliases: aliases - } ); - - assert.ok( - fingerprintview.value().label.equals( label ), - 'Reset label.' - ); - - assert.ok( - fingerprintview.value().description.equals( description ), - 'Removed description.' - ); - - aliases = new wb.datamodel.MultiTerm( 'en', ['alias1', 'alias2', 'alias3'] ); - - fingerprintview.value( { - language: 'en', - label: label, - description: description, - aliases: aliases - } ); - - assert.ok( - fingerprintview.value().aliases.equals( aliases ), - 'Added alias.' - ); - - aliases = new wb.datamodel.MultiTerm( 'en', [] ); - - fingerprintview.value( { - language: 'en', - label: label, - description: description, - aliases: aliases - } ); - - assert.ok( - fingerprintview.value().aliases.equals( aliases ), - 'Removed aliases.' - ); - - assert.throws( - function() { - fingerprintview.value( { - language: 'de', - label: label, - description: description, - aliases: aliases - } ); - }, - 'Trying to change language fails.' - ); -} ); - -}( jQuery, wikibase, QUnit ) ); diff --git a/lib/tests/qunit/jquery.wikibase/resources.php b/lib/tests/qunit/jquery.wikibase/resources.php index 38e9bc9..3e5a8ee 100644 --- a/lib/tests/qunit/jquery.wikibase/resources.php +++ b/lib/tests/qunit/jquery.wikibase/resources.php @@ -104,34 +104,34 @@ ), ), - 'jquery.wikibase.fingerprintgroupview.tests' => $moduleBase + array( + 'jquery.wikibase.entitytermsview.tests' => $moduleBase + array( 'scripts' => array( - 'jquery.wikibase.fingerprintgroupview.tests.js', + 'jquery.wikibase.entitytermsview.tests.js', ), 'dependencies' => array( - 'jquery.wikibase.fingerprintgroupview', + 'jquery.wikibase.entitytermsview', 'wikibase.datamodel.MultiTerm', 'wikibase.datamodel.Term', ), ), - 'jquery.wikibase.fingerprintlistview.tests' => $moduleBase + array( + 'jquery.wikibase.entitytermsforlanguagelistview.tests' => $moduleBase + array( 'scripts' => array( - 'jquery.wikibase.fingerprintlistview.tests.js', + 'jquery.wikibase.entitytermsforlanguagelistview.tests.js', ), 'dependencies' => array( - 'jquery.wikibase.fingerprintlistview', + 'jquery.wikibase.entitytermsforlanguagelistview', 'wikibase.datamodel.MultiTerm', 'wikibase.datamodel.Term', ), ), - 'jquery.wikibase.fingerprintview.tests' => $moduleBase + array( + 'jquery.wikibase.entitytermsforlanguage.tests' => $moduleBase + array( 'scripts' => array( - 'jquery.wikibase.fingerprintview.tests.js', + 'jquery.wikibase.entitytermsforlanguage.tests.js', ), 'dependencies' => array( - 'jquery.wikibase.fingerprintview', + 'jquery.wikibase.entitytermsforlanguage', ), ), diff --git a/repo/includes/View/TermBoxView.php b/repo/includes/View/TermBoxView.php index 5b14996..3631381 100644 --- a/repo/includes/View/TermBoxView.php +++ b/repo/includes/View/TermBoxView.php @@ -74,7 +74,7 @@ $hasLabel = $labels->hasTermForLanguage( $languageCode ); $hasDescription = $descriptions->hasTermForLanguage( $languageCode ); - $tbody .= wfTemplate( 'wikibase-fingerprintview', + $tbody .= wfTemplate( 'wikibase-entitytermsforlanguage', $languageCode, $title->getLocalURL( array( 'setlang' => $languageCode ) ), htmlspecialchars( Utils::fetchLanguageName( $languageCode ) ), @@ -100,9 +100,9 @@ ); } - $html = wfTemplate( 'wikibase-fingerprintgroupview', + $html = wfTemplate( 'wikibase-entitytermsview', $this->msg( 'wikibase-terms' )->text(), - wfTemplate( 'wikibase-fingerprintlistview', $tbody ), + wfTemplate( 'wikibase-entitytermsforlanguagelistview', $tbody ), $this->sectionEditLinkGenerator->getHtmlForEditSection( 'SpecialPages', array(), diff --git a/repo/resources/templates.php b/repo/resources/templates.php index ce39fdd..a85a0d0 100644 --- a/repo/resources/templates.php +++ b/repo/resources/templates.php @@ -202,40 +202,40 @@ <li class="wikibase-aliasesview-list-item" dir="auto">$1</li> HTML; - $templates['wikibase-fingerprintgroupview'] = + $templates['wikibase-entitytermsview'] = <<<HTML -<div class="wikibase-fingerprintgroupview"> - <div class="wikibase-fingerprintgroupview-heading-container"> - <h2 id="wb-terms" class="wb-section-heading wikibase-fingerprintgroupview-heading">$1</h2> +<div class="wikibase-entitytermsview"> + <div class="wikibase-entitytermsview-heading-container"> + <h2 id="wb-terms" class="wb-section-heading wikibase-entitytermsview-heading">$1</h2> <!-- wikibase-toolbar -->$3 </div> - <!-- wikibase-fingerprintlistview -->$2 + <!-- wikibase-entitytermsforlanguagelistview -->$2 </div> HTML; - $templates['wikibase-fingerprintlistview'] = + $templates['wikibase-entitytermsforlanguagelistview'] = <<<HTML -<table class="wikibase-fingerprintlistview"> +<table class="wikibase-entitytermsforlanguagelistview"> <colgroup> - <col class="wikibase-fingerprintlistview-language" /> - <col class="wikibase-fingerprintlistview-label wikibase-fingerprintlistview-description wikibase-fingerprintlistview-aliases" /> + <col class="wikibase-entitytermsforlanguagelistview-language" /> + <col class="wikibase-entitytermsforlanguagelistview-label wikibase-entitytermsforlanguagelistview-description wikibase-entitytermsforlanguagelistview-aliases" /> </colgroup> - <!-- [0,*] wikibase-fingerprintview -->$1 + <!-- [0,*] wikibase-entitytermsforlanguage -->$1 </table> HTML; - $templates['wikibase-fingerprintview'] = + $templates['wikibase-entitytermsforlanguage'] = <<<HTML -<tbody class="wikibase-fingerprintview wikibase-fingerprintview-$1" > +<tbody class="wikibase-entitytermsforlanguage wikibase-entitytermsforlanguage-$1" > <tr> - <td class="wikibase-fingerprintview-language" rowspan="3"><a href="$2">$3</a></td> - <td class="wikibase-fingerprintview-label">$4</td> + <td class="wikibase-entitytermsforlanguage-language" rowspan="3"><a href="$2">$3</a></td> + <td class="wikibase-entitytermsforlanguage-label">$4</td> </tr> <tr> - <td class="wikibase-fingerprintview-description">$5</td> + <td class="wikibase-entitytermsforlanguage-description">$5</td> </tr> <tr> - <td class="wikibase-fingerprintview-aliases">$6</td> + <td class="wikibase-entitytermsforlanguage-aliases">$6</td> </tr> </tbody> HTML; diff --git a/repo/resources/wikibase.ui.entityViewInit.js b/repo/resources/wikibase.ui.entityViewInit.js index 2aa0f75..1f62e45 100644 --- a/repo/resources/wikibase.ui.entityViewInit.js +++ b/repo/resources/wikibase.ui.entityViewInit.js @@ -45,7 +45,7 @@ 'statementview', 'descriptionview', 'labelview', - 'fingerprintgroupview', + 'entitytermsview', 'referenceview', 'sitelinkgroupview' ], -- To view, visit https://gerrit.wikimedia.org/r/180438 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I084b6a11f8ddb7930b145e7852b7a5e66daa0a32 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: master Gerrit-Owner: Henning Snater <henning.sna...@wikimedia.de> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits