jenkins-bot has submitted this change and it was merged. (
https://gerrit.wikimedia.org/r/372850 )
Change subject: Migrate LemmaWidget tests to jasmine
......................................................................
Migrate LemmaWidget tests to jasmine
Co-authored with Chris Neuroth and Jonas Kress.
Change-Id: I427407136aae7e091eb931c01ac1c6209e326692
---
M package.json
M src/WikibaseLexeme.hooks.php
A tests/jasmine/LemmaWidget.spec.js
R tests/jasmine/LemmaWidgetStore.spec.js
D tests/qunit/widgets/LemmaWidget.tests.js
5 files changed, 191 insertions(+), 232 deletions(-)
Approvals:
Jonas Kress (WMDE): Looks good to me, approved
jenkins-bot: Verified
diff --git a/package.json b/package.json
index 9885f56..b5fed2d 100644
--- a/package.json
+++ b/package.json
@@ -14,12 +14,18 @@
"jsdom": "^11.1.0",
"jsdom-global": "^3.0.2",
"module-alias": "^2.0.0",
+ "sinon": "^3.2.1",
"unexpected": "^10.32.1",
"unexpected-dom": "^4.0.0",
- "vue": "2.3.3"
+ "vue": "2.3.3",
+ "vuex": "^2.3.1"
},
"_moduleAliases": {
"wikibase.lexeme.widgets.GlossWidget":
"./resources/widgets/GlossWidget.js",
- "wikibase.lexeme.widgets.RepresentationWidget":
"./resources/widgets/RepresentationWidget.js"
+ "wikibase.lexeme.widgets.RepresentationWidget":
"./resources/widgets/RepresentationWidget.js",
+ "wikibase.lexeme.widgets.LemmaWidget":
"./resources/widgets/LemmaWidget.js",
+ "wikibase.lexeme.widgets.LemmaWidget.newLemmaWidget":
"./resources/widgets/LemmaWidget.newLemmaWidget.js",
+ "wikibase.lexeme.widgets.LemmaWidget.newLemmaWidgetStore":
"./resources/widgets/LemmaWidget.newLemmaWidgetStore.js",
+ "wikibase.lexeme.datamodel.Lemma": "./resources/datamodel/Lemma.js"
}
}
diff --git a/src/WikibaseLexeme.hooks.php b/src/WikibaseLexeme.hooks.php
index bf8575e..a256d1b 100644
--- a/src/WikibaseLexeme.hooks.php
+++ b/src/WikibaseLexeme.hooks.php
@@ -109,8 +109,6 @@
'tests/qunit/special/formHelpers/LexemeLanguageFieldObserver.tests.js',
'tests/qunit/widgets/ItemSelectorWidget.tests.js',
'tests/qunit/widgets/GrammaticalFeatureListWidget.tests.js',
- 'tests/qunit/widgets/LemmaWidgetStore.tests.js',
- 'tests/qunit/widgets/LemmaWidget.tests.js',
'tests/qunit/widgets/RepresentationWidget.tests.js',
],
'dependencies' => [
@@ -130,8 +128,6 @@
'wikibase.lexeme.special.formHelpers.LexemeLanguageFieldObserver',
'wikibase.lexeme.widgets.ItemSelectorWidget',
'wikibase.lexeme.widgets.GrammaticalFeatureListWidget',
-
'wikibase.lexeme.widgets.LemmaWidget.newLemmaWidgetStore',
-
'wikibase.lexeme.widgets.LemmaWidget.newLemmaWidget',
'wikibase.lexeme.widgets.GlossWidget',
'wikibase.lexeme.widgets.RepresentationWidget',
'wikibase.tests.qunit.testrunner',
diff --git a/tests/jasmine/LemmaWidget.spec.js
b/tests/jasmine/LemmaWidget.spec.js
new file mode 100644
index 0000000..fbfc7b8
--- /dev/null
+++ b/tests/jasmine/LemmaWidget.spec.js
@@ -0,0 +1,151 @@
+/**
+ * @license GPL-2.0+
+ */
+describe( 'wikibase.lexeme.widgets.LemmaWidget', function () {
+ var sinon = require( 'sinon' );
+ var expect = require( 'unexpected' ).clone();
+ expect.installPlugin( require( 'unexpected-dom' ) );
+
+ var Vue = global.Vue = require( 'vue/dist/vue.js' );
+ var Vuex = global.Vuex = require( 'vuex/dist/vuex.js' );
+ Vue.use( Vuex );
+
+ var newLemmaWidget = require(
'wikibase.lexeme.widgets.LemmaWidget.newLemmaWidget' );
+ var newLemmaWidgetStore = require(
'wikibase.lexeme.widgets.LemmaWidget.newLemmaWidgetStore' );
+ var Lemma = require( 'wikibase.lexeme.datamodel.Lemma' );
+
+ it( 'initialize widget with one lemma', function () {
+ var widget = newWidget( [ new Lemma( 'hello', 'en' ) ] );
+
+ assertWidget( widget ).when( 'created' ).dom.containsLemma(
'hello', 'en' );
+ } );
+
+ it( 'switch to edit mode', function ( done ) {
+ var widget = newWidget( [ new Lemma( 'hello', 'en' ) ] );
+
+ assertWidget( widget ).when( 'created' ).dom.hasNoInputFields();
+
+ widget.edit();
+ widget.$nextTick( function () {
+ assertWidget( widget ).when( 'switched to edit mode'
).isInEditMode();
+ assertWidget( widget ).when( 'switched to edit mode'
).dom.hasAtLeastOneInputField();
+ done();
+ } );
+ } );
+
+ it( 'cancel edit mode', function ( done ) {
+ var widget = newWidget( [ new Lemma( 'hello', 'en' ) ] );
+
+ widget.edit();
+ widget.cancel();
+ widget.$nextTick( function () {
+ assertWidget( widget ).when( 'canceled the edit mode'
).dom.hasNoInputFields();
+ done();
+ } );
+ } );
+
+ it( 'add a new lemma', function ( done ) {
+ var widget = newWidget( [ new Lemma( 'hello', 'en' ) ] );
+
+ assertWidget( widget ).when( 'created' ).dom.containsLemma(
'hello', 'en' );
+ widget.add();
+ widget.$nextTick( function () {
+ assertWidget( widget ).when( 'addition triggered'
).dom.containsLemma( 'hello', 'en' );
+ assertWidget( widget ).when( 'addition triggered'
).dom.containsLemma( '', '' );
+ done();
+ } );
+ } );
+
+ it( 'remove a lemma', function ( done ) {
+ var lemmaToRemove = new Lemma( 'hello', 'en' ),
+ widget = newWidget( [ lemmaToRemove ] );
+
+ assertWidget( widget ).when( 'created' ).dom.containsLemma(
'hello', 'en' );
+ widget.remove( lemmaToRemove );
+ widget.$nextTick( function () {
+ assertWidget( widget ).when( 'lemma removed'
).dom.containsNoLemmas();
+ done();
+ } );
+ } );
+
+ it( 'save lemma list', function ( done ) {
+ var lemmas = [ new Lemma( 'hello', 'en' ) ],
+ store = newStore( lemmas ),
+ widget = newWidgetWithStore( store ),
+ storeSpy = sinon.stub( store, 'dispatch' ).callsFake(
function () {
+ return Promise.resolve();
+ } );
+
+ widget.edit();
+ widget.save().then( function () {
+ expect( storeSpy.called, 'to be true' );
+ expect( storeSpy.calledWith( 'save', lemmas ), 'to be
true' );
+ assertWidget( widget ).when( 'saved'
).isNotInEditMode();
+ done();
+ } );
+ } );
+
+ function newWidget( initialLemmas ) {
+ return newWidgetWithStore( newStore( initialLemmas ) );
+ }
+
+ function newStore( initialLemmas ) {
+ return new Vuex.Store( newLemmaWidgetStore( {}, initialLemmas,
'', 0 ) );
+ }
+
+ function newWidgetWithStore( store ) {
+ var element = document.createElement( 'div' );
+
+ return new Vue( newLemmaWidget( store, element, getTemplate() )
);
+ }
+
+ function assertWidget( widget ) {
+ var when = '',
+ selector = {
+ lemma: '.lemma-widget_lemma',
+ lemmaValue: '.lemma-widget_lemma-value',
+ lemmaLanguage: '.lemma-widget_lemma-language'
+ };
+
+ return {
+ isInEditMode: function () {
+ expect( widget.inEditMode, 'to be true' );
+ },
+ isNotInEditMode: function () {
+ expect( widget.inEditMode, 'to be false' );
+ },
+ when: function ( text ) {
+ when = 'when ' + text + ': ';
+ return this;
+ },
+ dom: {
+ hasNoInputFields: function () {
+ expect( widget.$el, 'to contain no
elements matching', 'input' );
+ },
+ hasAtLeastOneInputField: function () {
+ expect( widget.$el, 'to contain
elements matching', 'input' );
+ },
+ containsNoLemmas: function () {
+ expect( widget.$el, 'to contain no
elements matching', selector.lemma );
+ },
+ containsLemma: function ( value, language ) {
+ var found = false;
+ widget.$el.querySelectorAll(
selector.lemma ).forEach( function ( element ) {
+ var lemmaValue =
element.querySelector( selector.lemmaValue ).textContent,
+ lemmaLanguage =
element.querySelector( selector.lemmaLanguage ).textContent;
+ found = found || lemmaValue ===
value && lemmaLanguage === language;
+ } );
+
+ expect( found, 'to be true' );
+ }
+ }
+
+ };
+ }
+
+ // FIXME: duplicated from LexemeView.php until it's reusable
+ function getTemplate() {
+ return '<div class="lemma-widget">\n <ul v-if="!inEditMode"
class="lemma-widget_lemma-list">\n <li v-for="lemma in lemmas"
class="lemma-widget_lemma">\n <span
class="lemma-widget_lemma-value">{{lemma.value}}</span>\n <span
class="lemma-widget_lemma-language">{{lemma.language}}</span>\n </li>\n
</ul>\n <div v-else>\n <div class="lemma-widget_edit-area">\n
<ul class="lemma-widget_lemma-list">\n <li v-for="lemma in
lemmas" class="lemma-widget_lemma-edit-box">\n <input
size="1" class="lemma-widget_lemma-value-input" \n
v-model="lemma.value" :disabled="isSaving">\n <input
size="1" class="lemma-widget_lemma-language-input" \n
v-model="lemma.language" :disabled="isSaving">\n <button
class="lemma-widget_lemma-remove" v-on:click="remove(lemma)" \n
:disabled="isSaving" :title="\'wikibase-remove\'|message">\n
×\n </button>\n </li>\n
<li>\n <button type="button"
class="lemma-widget_add" v-on:click="add" \n
:disabled="isSaving" :title="\'wikibase-add\'|message">+</button>\n
</li>\n </ul>\n </div>\n </div>\n <div
class="lemma-widget_controls">\n <button type="button"
class="lemma-widget_control" v-if="!inEditMode" \n
:disabled="isSaving" v-on:click="edit">{{\'wikibase-edit\'|message}}</button>\n
<button type="button" class="lemma-widget_control" v-if="inEditMode" \n
:disabled="isSaving"
v-on:click="save">{{\'wikibase-save\'|message}}</button>\n <button
type="button" class="lemma-widget_control" v-if="inEditMode" \n
:disabled="isSaving"
v-on:click="cancel">{{\'wikibase-cancel\'|message}}</button>\n
</div>\n</div>';
+
+ }
+} );
diff --git a/tests/qunit/widgets/LemmaWidgetStore.tests.js
b/tests/jasmine/LemmaWidgetStore.spec.js
similarity index 69%
rename from tests/qunit/widgets/LemmaWidgetStore.tests.js
rename to tests/jasmine/LemmaWidgetStore.spec.js
index d784645..39efd7f 100644
--- a/tests/qunit/widgets/LemmaWidgetStore.tests.js
+++ b/tests/jasmine/LemmaWidgetStore.spec.js
@@ -1,10 +1,9 @@
/**
* @license GPL-2.0+
*/
-( function ( wb, $, QUnit, sinon ) {
- 'use strict';
-
- QUnit.module( 'wikibase.lexeme.widgets.LemmaWidget.newLemmaWidgetStore'
);
+describe( 'wikibase.lexeme.widgets.LemmaWidget.newLemmaWidgetStore', function
() {
+ var sinon = require( 'sinon' );
+ var expect = require( 'unexpected' ).clone();
/** @type {wikibase.lexeme.widgets.LemmaWidget.newLemmaWidgetStore} */
var newLemmaWidgetStore = require(
'wikibase.lexeme.widgets.LemmaWidget.newLemmaWidgetStore' );
@@ -12,31 +11,31 @@
var mutations = newLemmaWidgetStore( {}, [], '', 0 ).mutations;
- QUnit.test( 'mutation startSaving switches the isSaving flag to true',
function ( assert ) {
+ it( 'mutation startSaving switches the isSaving flag to true', function
() {
var state = { isSaving: false };
mutations.startSaving( state );
- assert.ok( state.isSaving );
+ expect( state.isSaving, 'to be ok' );
} );
- QUnit.test( 'mutation finishSaving switches the isSaving flag to
false', function ( assert ) {
+ it( 'mutation finishSaving switches the isSaving flag to false',
function () {
var state = { isSaving: true };
mutations.finishSaving( state );
- assert.notOk( state.isSaving );
+ expect( state.isSaving, 'not to be ok' );
} );
- QUnit.test( 'mutation updateRevisionId changes baseRevId to given
value', function ( assert ) {
+ it( 'mutation updateRevisionId changes baseRevId to given value',
function () {
var state = { baseRevId: 1 };
mutations.updateRevisionId( state, 2 );
- assert.equal( 2, state.baseRevId );
+ expect( state.baseRevId, 'to be', 2 );
} );
- function newTestAction( assert ) {
+ function newTestAction( done ) {
// helper for testing action with expected mutations
return {
@@ -49,12 +48,11 @@
{ commit: commit, state: state },
payload
).catch( function ( error ) {
- assert.notOk( error );
+ expect( error, 'not to be ok' );
} );
},
test: function testAction( action, payload, state,
expectedMutations ) {
- var done = assert.async();
var count = 0;
// mock commit
@@ -62,15 +60,9 @@
var mutation = expectedMutations[ count
];
try {
- assert.equal( mutation.type,
type, 'Mutation has correct type' );
- // expect( mutation.type
).to.equal( type );
+ expect( mutation.type, 'to
equal', type );
if ( payload ) {
- assert.deepEqual(
-
mutation.payload,
- payload,
- 'Mutation was
called with correct payload'
- );
- // expect(
mutation.payload ).to.deep.equal( payload );
+ expect(
mutation.payload, 'to equal', payload );
}
} catch ( error ) {
done( error );
@@ -87,17 +79,16 @@
// check if no mutations should have been
dispatched
if ( expectedMutations.length === 0 ) {
- assert.equal( 0, count );
- // expect( count ).to.equal( 0 );
+ expect( count, 'to equal', 0 );
done();
}
}
};
}
- QUnit.test(
+ it(
'action save on success mutates the state to start saving,
updates revision, updates lemmas and finishes saving',
- function ( assert ) {
+ function ( done ) {
var state = { isSaving: false, baseRevId: 1, lemmas: []
};
var newRevisionId = 2;
@@ -110,13 +101,13 @@
var repoApi = {
editEntity: function ( id, baseRevId, data,
clear ) {
- return $.Deferred().resolve( response
).promise();
+ return Promise.resolve( response );
}
};
var actions = newLemmaWidgetStore( repoApi, [], '', 0
).actions;
- newTestAction( assert ).test(
+ newTestAction( done ).test(
actions.save,
[ new Lemma( 'lemma1', 'en' ) ],
state,
@@ -130,10 +121,9 @@
}
);
- QUnit.test(
+ it(
'action save calls API with correct parameters and changes
state using data from response',
- function ( assert ) {
- var done = assert.async();
+ function ( done ) {
var baseRevisionId = 0;
var state = { isSaving: false, baseRevId:
baseRevisionId, lemmas: [] };
@@ -148,24 +138,24 @@
};
var editEntity = function ( id, baseRevId, data, clear
) {
- return $.Deferred().resolve( response
).promise();
+ return Promise.resolve( response );
};
var repoApi = {
- editEntity: this.spy( editEntity )
+ editEntity: sinon.spy( editEntity )
};
var lemmasToSave = [ new Lemma( 'lemma1', 'en' ) ];
var actions = newLemmaWidgetStore( repoApi, [],
entityId, baseRevisionId ).actions;
- newTestAction( assert ).applyWithMutations(
+ newTestAction( done ).applyWithMutations(
actions.save,
lemmasToSave,
state,
mutations
).then( function () {
- assert.equal( newRevisionId, state.baseRevId );
- assert.deepEqual( [ { value: 'lemma1',
language: 'en' } ], state.lemmas );
- assert.notOk( state.isSaving );
+ expect( newRevisionId, 'to equal',
state.baseRevId );
+ expect( [ { value: 'lemma1', language: 'en' }
], 'to equal', state.lemmas );
+ expect( state.isSaving, 'not to be ok' );
sinon.assert.calledWith( repoApi.editEntity,
entityId, baseRevisionId, { lemmas: lemmasToSave }, false );
done();
@@ -173,10 +163,9 @@
}
);
- QUnit.test(
+ it(
'action save calls API with correct parameters when removing an
item from the state',
- function ( assert ) {
- var done = assert.async();
+ function ( done ) {
var baseRevisionId = 1;
var state = { isSaving: false, baseRevId:
baseRevisionId, lemmas: [ new Lemma( 'a lemma', 'en' ) ] };
@@ -191,17 +180,17 @@
};
var editEntity = function ( id, baseRevId, data, clear
) {
- return $.Deferred().resolve( response
).promise();
+ return Promise.resolve( response );
};
var repoApi = {
- editEntity: this.spy( editEntity )
+ editEntity: sinon.spy( editEntity )
};
var lemmasToSave = [];
var lemmasInApiRequest = [ { language: 'en', remove: ''
} ];
var actions = newLemmaWidgetStore( repoApi, [],
entityId, baseRevisionId ).actions;
- newTestAction( assert ).applyWithMutations(
+ newTestAction( done ).applyWithMutations(
actions.save,
lemmasToSave,
state,
@@ -212,5 +201,4 @@
} );
}
);
-
-}( wikibase, jQuery, QUnit, sinon ) );
+} );
diff --git a/tests/qunit/widgets/LemmaWidget.tests.js
b/tests/qunit/widgets/LemmaWidget.tests.js
deleted file mode 100644
index 0ea7004..0000000
--- a/tests/qunit/widgets/LemmaWidget.tests.js
+++ /dev/null
@@ -1,182 +0,0 @@
-/**
- * @license GPL-2.0+
- */
-( function ( wb, $, QUnit, Vue, Vuex ) {
- 'use strict';
-
- QUnit.module( 'wikibase.lexeme.widgets.LemmaWidget',
setUpCustomAssertions() );
-
- var newLemmaWidget = require(
'wikibase.lexeme.widgets.LemmaWidget.newLemmaWidget' );
- var newLemmaWidgetStore = require(
'wikibase.lexeme.widgets.LemmaWidget.newLemmaWidgetStore' );
- var Lemma = require( 'wikibase.lexeme.datamodel.Lemma' );
-
- QUnit.test( 'initialize widget with one lemma', function ( assert ) {
- var widget = newWidget( [ new Lemma( 'hello', 'en' ) ] );
-
- assert.widget( widget ).when( 'created' ).dom.containsLemma(
'hello', 'en' );
- } );
-
- QUnit.test( 'switch to edit mode', function ( assert ) {
- var done = assert.async(),
- widget = newWidget( [ new Lemma( 'hello', 'en' ) ] );
-
- assert.widget( widget ).when( 'created'
).dom.hasNoInputFields();
-
- widget.edit();
- widget.$nextTick( function () {
- assert.widget( widget ).when( 'switched to edit mode'
).isInEditMode();
- assert.widget( widget ).when( 'switched to edit mode'
).dom.hasAtLeastOneInputField();
- done();
- } );
- } );
-
- QUnit.test( 'cancel edit mode', function ( assert ) {
- var done = assert.async(),
- widget = newWidget( [ new Lemma( 'hello', 'en' ) ] );
-
- widget.edit();
- widget.cancel();
- widget.$nextTick( function () {
- assert.widget( widget ).when( 'canceled the edit mode'
).dom.hasNoInputFields();
- done();
- } );
- } );
-
- QUnit.test( 'add a new lemma', function ( assert ) {
- var done = assert.async(),
- widget = newWidget( [ new Lemma( 'hello', 'en' ) ] );
-
- assert.widget( widget ).when( 'created' ).dom.containsLemma(
'hello', 'en' );
- widget.add();
- widget.$nextTick( function () {
- assert.widget( widget ).when( 'addition triggered'
).dom.containsLemma( 'hello', 'en' );
- assert.widget( widget ).when( 'addition triggered'
).dom.containsLemma( '', '' );
- done();
- } );
- } );
-
- QUnit.test( 'remove a lemma', function ( assert ) {
- var done = assert.async(),
- lemmaToRemove = new Lemma( 'hello', 'en' ),
- widget = newWidget( [ lemmaToRemove ] );
-
- assert.widget( widget ).when( 'created' ).dom.containsLemma(
'hello', 'en' );
- widget.remove( lemmaToRemove );
- widget.$nextTick( function () {
- assert.widget( widget ).when( 'lemma removed'
).dom.containsNoLemmas();
- done();
- } );
- } );
-
- QUnit.test( 'save lemma list', function ( assert ) {
- var done = assert.async(),
- lemmas = [ new Lemma( 'hello', 'en' ) ],
- store = newStore( lemmas ),
- widget = newWidgetWithStore( store ),
- storeSpy = this.stub( store, 'dispatch', function () {
- return $.Deferred().resolve().promise();
- } );
-
- widget.edit();
- widget.save().then( function () {
- assert.ok( storeSpy.called );
- assert.ok( storeSpy.calledWith( 'save', lemmas ) );
- assert.widget( widget ).when( 'saved'
).isNotInEditMode();
- done();
- } );
- } );
-
- function newWidget( initialLemmas ) {
- return newWidgetWithStore( newStore( initialLemmas ) );
- }
-
- function newStore( initialLemmas ) {
- return new Vuex.Store( newLemmaWidgetStore( {}, initialLemmas,
'', 0 ) );
- }
-
- function newWidgetWithStore( store ) {
- var element = document.createElement( 'div' );
-
- return new Vue( newLemmaWidget( store, element, getTemplate() )
);
- }
-
- function setUpCustomAssertions() {
- return {
- setup: function () {
- QUnit.assert.widget = function assertWidget(
widget ) {
- var assert = this,
- when = '',
- selector = {
- lemma:
'.lemma-widget_lemma',
- lemmaValue:
'.lemma-widget_lemma-value',
- lemmaLanguage:
'.lemma-widget_lemma-language'
- };
-
- return {
- isInEditMode: function () {
- assert.ok(
widget.inEditMode, when + 'is in edit mode' );
- },
- isNotInEditMode: function () {
- assert.notOk(
widget.inEditMode, when + 'is not in edit mode' );
- },
- when: function ( text ) {
- when = 'when ' + text +
': ';
- return this;
- },
- dom: {
- hasNoInputFields:
function () {
- assert.equal(
- $(
widget.$el ).find( 'input' ).length,
- 0,
- when +
'DOM has no input fields'
- );
- },
-
hasAtLeastOneInputField: function () {
- assert.ok(
- $(
widget.$el ).find( 'input' ).length > 0,
- when +
'has at leas one input in DOM '
- );
- },
- containsNoLemmas:
function () {
- assert.equal(
- $(
selector.lemma, widget.$el ).length,
- 0,
- when +
'DOM contains no lemmas'
- );
- },
- containsLemma: function
( value, language ) {
- var found =
false;
- $(
selector.lemma, widget.$el ).each( function () {
- var $el
= $( this );
- found =
found ||
-
$el.children( selector.lemmaValue ).text() === value &&
-
$el.children( selector.lemmaLanguage ).text() === language;
- } );
- var message =
when + 'DOM contains lemma with value "' + value +
- '" and
language "' + language + '"';
- return
assert.pushResult( {
- result:
found,
- actual:
found,
-
expected: { value: value, language: language },
-
message: message,
-
negative: false
- } );
- }
- }
-
- };
-
- };
- },
- teardown: function () {
- delete QUnit.assert.widget;
- }
- };
- }
-
- // FIXME: duplicated from LexemeView.php until it's reusable
- function getTemplate() {
- return '<div class="lemma-widget">\n <ul v-if="!inEditMode"
class="lemma-widget_lemma-list">\n <li v-for="lemma in lemmas"
class="lemma-widget_lemma">\n <span
class="lemma-widget_lemma-value">{{lemma.value}}</span>\n <span
class="lemma-widget_lemma-language">{{lemma.language}}</span>\n </li>\n
</ul>\n <div v-else>\n <div class="lemma-widget_edit-area">\n
<ul class="lemma-widget_lemma-list">\n <li v-for="lemma in
lemmas" class="lemma-widget_lemma-edit-box">\n <input
size="1" class="lemma-widget_lemma-value-input" \n
v-model="lemma.value" :disabled="isSaving">\n <input
size="1" class="lemma-widget_lemma-language-input" \n
v-model="lemma.language" :disabled="isSaving">\n <button
class="lemma-widget_lemma-remove" v-on:click="remove(lemma)" \n
:disabled="isSaving" :title="\'wikibase-remove\'|message">\n
×\n </button>\n </li>\n
<li>\n <button type="button"
class="lemma-widget_add" v-on:click="add" \n
:disabled="isSaving" :title="\'wikibase-add\'|message">+</button>\n
</li>\n </ul>\n </div>\n </div>\n <div
class="lemma-widget_controls">\n <button type="button"
class="lemma-widget_control" v-if="!inEditMode" \n
:disabled="isSaving" v-on:click="edit">{{\'wikibase-edit\'|message}}</button>\n
<button type="button" class="lemma-widget_control" v-if="inEditMode" \n
:disabled="isSaving"
v-on:click="save">{{\'wikibase-save\'|message}}</button>\n <button
type="button" class="lemma-widget_control" v-if="inEditMode" \n
:disabled="isSaving"
v-on:click="cancel">{{\'wikibase-cancel\'|message}}</button>\n
</div>\n</div>';
-
- }
-}( wikibase, jQuery, QUnit, Vue, Vuex ) );
--
To view, visit https://gerrit.wikimedia.org/r/372850
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I427407136aae7e091eb931c01ac1c6209e326692
Gerrit-PatchSet: 4
Gerrit-Project: mediawiki/extensions/WikibaseLexeme
Gerrit-Branch: master
Gerrit-Owner: WMDE-leszek <[email protected]>
Gerrit-Reviewer: Chrisneuroth <[email protected]>
Gerrit-Reviewer: Jonas Kress (WMDE) <[email protected]>
Gerrit-Reviewer: WMDE-leszek <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits