Jakob has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/381000 )
Change subject: [WIP] Make lexeme language and lexical category editable. ...................................................................... [WIP] Make lexeme language and lexical category editable. * created LexemeHeaderWidget with subcomponents: * LemmaWidget * LanguageAndLexicalCategoryWidget TODO: - tests - some file names don't make much sense anymore - saving is broken - lexeme ID missing - UI doesn't look the way it should Bug: T168298 Change-Id: I7e756d868e6502d4fe8a3f6d5e322caf2dc4d5ed --- M extension.json M package.json A resources/widgets/LanguageAndLexicalCategoryWidget.js M resources/widgets/LemmaWidget.js M resources/widgets/LemmaWidget.newLemmaWidget.js M resources/widgets/LemmaWidget.newLemmaWidgetStore.js A resources/widgets/LexemeHeader.newLexemeHeader.js M src/View/LexemeView.php 8 files changed, 212 insertions(+), 51 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/WikibaseLexeme refs/changes/00/381000/1 diff --git a/extension.json b/extension.json index ad5163b..fecb853 100644 --- a/extension.json +++ b/extension.json @@ -53,7 +53,7 @@ "jquery.wikibase.lexemeformlistview", "jquery.wikibase.senselistview", "wikibase.lexeme.view.ControllerViewFactory", - "lemma-widget" + "lexeme-header" ] }, "wikibase.lexeme": { @@ -132,11 +132,13 @@ "promise-polyfill": { "scripts":"vendor/es6-promise.auto.js" }, - "lemma-widget":{ + "lexeme-header":{ "scripts": "widgets/LemmaWidget.js", "dependencies": [ "vue", "vuex", + "wikibase.lexeme.widgets.LanguageAndLexicalCategoryWidget", + "wikibase.lexeme.widgets.LexemeHeader.newLexemeHeader", "wikibase.lexeme.widgets.LemmaWidget.newLemmaWidgetStore", "wikibase.lexeme.widgets.LemmaWidget.newLemmaWidget", "wikibase.api.RepoApi", @@ -191,6 +193,12 @@ "wikibase.lexeme.datamodel.Lemma" ] }, + "wikibase.lexeme.widgets.LexemeHeader.newLexemeHeader": { + "scripts": "widgets/LexemeHeader.newLexemeHeader.js" + }, + "wikibase.lexeme.widgets.LanguageAndLexicalCategoryWidget": { + "scripts": "widgets/LanguageAndLexicalCategoryWidget.js" + }, "wikibase.templates.lexeme": { "class": "\\Wikibase\\Lexeme\\View\\TemplateModule", "dependencies": [ diff --git a/package.json b/package.json index ea60458..059a091 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,8 @@ "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.widgets.LanguageAndLexicalCategoryWidget": "./resources/widgets/LanguageAndLexicalCategoryWidget.js", + "wikibase.lexeme.widgets.LexemeHeader.newLexemeHeader": "./resources/widgets/LexemeHeader.newLexemeHeader.js", "wikibase.lexeme.datamodel.Lemma": "./resources/datamodel/Lemma.js" } } diff --git a/resources/widgets/LanguageAndLexicalCategoryWidget.js b/resources/widgets/LanguageAndLexicalCategoryWidget.js new file mode 100644 index 0000000..00abe50 --- /dev/null +++ b/resources/widgets/LanguageAndLexicalCategoryWidget.js @@ -0,0 +1,21 @@ +module.exports = ( function () { + 'use strict'; + + /** + * @callback wikibase.lexeme.widgets.LanguageAndLexicalCategoryWidget + * + * @param {string} template - template string or selector + */ + return function ( template, messages ) { + return { + props: [ 'language', 'lexicalCategory', 'inEditMode', 'isSaving' ], + template: template, + + filters: { + message: function ( key ) { + return messages.get( key ); + } + } + }; + }; +} )(); diff --git a/resources/widgets/LemmaWidget.js b/resources/widgets/LemmaWidget.js index 9858a7b..b3ab1fb 100644 --- a/resources/widgets/LemmaWidget.js +++ b/resources/widgets/LemmaWidget.js @@ -4,6 +4,8 @@ /** @type {wikibase.lexeme.widgets.LemmaWidget.newLemmaWidgetStore} */ var newLemmaWidgetStore = require( 'wikibase.lexeme.widgets.LemmaWidget.newLemmaWidgetStore' ); var newLemmaWidget = require( 'wikibase.lexeme.widgets.LemmaWidget.newLemmaWidget' ); + var newLanguageAndLexicalCategoryWidget = require( 'wikibase.lexeme.widgets.LanguageAndLexicalCategoryWidget' ); + var newLexemeHeader = require( 'wikibase.lexeme.widgets.LexemeHeader.newLexemeHeader' ); var Lemma = require( 'wikibase.lexeme.datamodel.Lemma' ); var wbEntity = JSON.parse( mw.config.get( 'wbEntity' ) ); @@ -13,12 +15,30 @@ lemmas.push( new Lemma( lemma.value, lemma.language ) ); } ); + var lexeme = { + lemmas: lemmas, + lexicalCategory: wbEntity.lexicalCategory, + language: wbEntity.language, + id: mw.config.get( 'wbEntityId' ) + }; + var repoApi = new wb.api.RepoApi( new mw.Api() ); - var entityId = mw.config.get( 'wbEntityId' ); var baseRevId = mw.config.get( 'wgCurRevisionId' ); - var store = new Vuex.Store( newLemmaWidgetStore( repoApi, lemmas, entityId, baseRevId ) ); + var store = new Vuex.Store( newLemmaWidgetStore( repoApi, lexeme, baseRevId ) ); - var app = new Vue( newLemmaWidget( store, '#lemmas-widget', '#lemma-widget-vue-template', mw.messages ) ); + var lemmaWidget = newLemmaWidget( '#lemma-widget-vue-template', mw.messages ); + var languageAndLexicalCategoryWidget = newLanguageAndLexicalCategoryWidget( + '#language-and-lexical-category-widget-vue-template', + mw.messages + ); + var app = new Vue( newLexemeHeader( + store, + '#wb-lexeme-header', + '#lexeme-header-widget-vue-template', + lemmaWidget, + languageAndLexicalCategoryWidget, + mw.messages + ) ); } )( jQuery, mediaWiki, require, wikibase, Vue, Vuex ); diff --git a/resources/widgets/LemmaWidget.newLemmaWidget.js b/resources/widgets/LemmaWidget.newLemmaWidget.js index 556bbc4..8b7f954 100644 --- a/resources/widgets/LemmaWidget.newLemmaWidget.js +++ b/resources/widgets/LemmaWidget.newLemmaWidget.js @@ -3,15 +3,6 @@ var Lemma = require( 'wikibase.lexeme.datamodel.Lemma' ); - function copyLemmaList( list ) { - var result = []; - list.forEach( function ( lemma ) { - result.push( lemma.copy() ); - } ); - - return result; - } - /** * @callback wikibase.lexeme.widgets.LemmaWidget.newComponent * @@ -19,41 +10,21 @@ * @param {string} element * @param {string} template - template string or selector */ - return function ( store, element, template, messages ) { + return function ( template, messages ) { return { - el: element, + props: [ 'lemmas', 'inEditMode', 'isSaving' ], template: template, - data: { - isInitialized: true, - inEditMode: false, - lemmas: copyLemmaList( store.state.lemmas ) - }, - computed: { - isSaving: function () { - return store.state.isSaving; - } - }, + methods: { - edit: function () { - this.inEditMode = true; - }, add: function () { this.lemmas.push( new Lemma( '', '' ) ); }, remove: function ( lemma ) { var index = this.lemmas.indexOf( lemma ); this.lemmas.splice( index, 1 ); - }, - save: function () { - return store.dispatch( 'save', this.lemmas ).then( function () { - this.inEditMode = false; - }.bind( this ) ); - }, - cancel: function () { - this.inEditMode = false; - this.lemmas = copyLemmaList( store.state.lemmas ); } }, + filters: { message: function ( key ) { return messages.get( key ); diff --git a/resources/widgets/LemmaWidget.newLemmaWidgetStore.js b/resources/widgets/LemmaWidget.newLemmaWidgetStore.js index 73f10af..9ce3f8f 100644 --- a/resources/widgets/LemmaWidget.newLemmaWidgetStore.js +++ b/resources/widgets/LemmaWidget.newLemmaWidgetStore.js @@ -31,13 +31,15 @@ * @param {string} entityId * @param {int} baseRevId */ - return function ( repoApi, lemmas, entityId, baseRevId ) { + return function ( repoApi, lexeme, baseRevId ) { return { strict: true, //FIXME make it configurable state: { isSaving: false, baseRevId: baseRevId, - lemmas: lemmas + lemmas: lexeme.lemmas, + language: lexeme.language, + lexicalCategory: lexeme.lexicalCategory }, mutations: { updateLemmas: function ( state, newLemmas ) { @@ -62,11 +64,15 @@ var requestLemmas = getRequestLemmas( context.state.lemmas, lemmas ); - var data = { lemmas: requestLemmas }; + var data = { + lemmas: requestLemmas, + language: context.state.language, + lexicalCategory: context.state.lexicalCategory + }; var clear = false; return repoApi.editEntity( - entityId, + lexeme.id, context.state.baseRevId, data, clear diff --git a/resources/widgets/LexemeHeader.newLexemeHeader.js b/resources/widgets/LexemeHeader.newLexemeHeader.js new file mode 100644 index 0000000..89ed883 --- /dev/null +++ b/resources/widgets/LexemeHeader.newLexemeHeader.js @@ -0,0 +1,69 @@ +module.exports = ( function () { + 'use strict'; + + function copyLemmaList( list ) { + var result = []; + list.forEach( function ( lemma ) { + result.push( lemma.copy() ); + } ); + + return result; + } + + /** + * @callback wikibase.lexeme.widgets.LemmaWidget.newComponent + * + * @param {Vuex.Store} store + * @param {string} element + * @param {string} template - template string or selector + * @param {Object} messages - mw.messages localization service + */ + return function ( store, element, template, lemmaWidget, languageAndCategoryWidget, messages ) { + return { + el: element, + template: template, + + data: { + isInitialized: true, + inEditMode: false, + lemmas: copyLemmaList( store.state.lemmas ), + language: store.state.language, + lexicalCategory: store.state.lexicalCategory + }, + + methods: { + save: function () { + return store.dispatch( 'save', this.lemmas ).then( function () { + this.inEditMode = false; + }.bind( this ) ); + }, + + edit: function () { + this.inEditMode = true; + }, + + cancel: function () { + this.inEditMode = false; + this.lemmas = copyLemmaList( store.state.lemmas ); + } + }, + + computed: { + isSaving: function () { + return store.state.isSaving; + } + }, + + components: { + 'lemma-widget': lemmaWidget, + 'language-and-category-widget': languageAndCategoryWidget + }, + + filters: { + message: function ( key ) { + return messages.get( key ); + } + } + }; + }; +} )(); diff --git a/src/View/LexemeView.php b/src/View/LexemeView.php index 6c9155a..e1c04d6 100644 --- a/src/View/LexemeView.php +++ b/src/View/LexemeView.php @@ -118,7 +118,8 @@ HTML; return $lexemeHeader - . $this->getHtmlForLexicalCategoryAndLanguage( $entity ) + . $this->getLexemeHeaderVueTemplate() + . $this->getLanguageAndLexicalCategoryVueTemplate() . $this->templateFactory->render( 'wikibase-toc' ) . $this->statementSectionsView->getHtml( $entity->getStatements() ) . $this->formsView->getHtml( $entity->getForms() ) @@ -244,6 +245,77 @@ HTML; } + private function getLexemeHeaderVueTemplate() { + return <<<HTML +<script id="lexeme-header-widget-vue-template" type="x-template"> + {$this->getRawLexemeHeaderVueTemplate()} +</script> +HTML; + } + + private function getLanguageAndLexicalCategoryVueTemplate() { + return <<<HTML +<script id="language-and-lexical-category-widget-vue-template" type="x-template"> + {$this->getRawLanguageAndLexicalCategoryWidgetVueTemplate()} +</script> +HTML; + } + + private function getRawLexemeHeaderVueTemplate() { + return <<<'HTML' +<div> + <h1 id="wb-lexeme-header" class="wb-lexeme-header"> + <div class="wb-lexeme-header_id">ID GOES HERE</div> + <div class="wb-lexeme-header_lemma-widget"> + <lemma-widget :lemmas="lemmas" :inEditMode="inEditMode" :isSaving="isSaving"></lemma-widget> + </div> + <div class="lemma-widget_controls" v-if="isInitialized" > + <button type="button" class="lemma-widget_edit" v-if="!inEditMode" + :disabled="isSaving" v-on:click="edit">{{'wikibase-edit'|message}}</button> + <button type="button" class="lemma-widget_save" v-if="inEditMode" + :disabled="isSaving" v-on:click="save">{{'wikibase-save'|message}}</button> + <button type="button" class="lemma-widget_cancel" v-if="inEditMode" + :disabled="isSaving" v-on:click="cancel">{{'wikibase-cancel'|message}}</button> + </div> + </h1> + <language-and-category-widget + :language="language" + :lexicalCategory="lexicalCategory" + :inEditMode="inEditMode" + :isSaving="isSaving"> + </language-and-category-widget> +</div> +HTML; + } + + private function getRawLanguageAndLexicalCategoryWidgetVueTemplate() { + return <<<'HTML' +<div class="language-lexical-category-widget"> + <div v-if="!inEditMode"> + <div> + <span>{{'wikibase-language'|message}}</span> + <span>{{language}}</span> + </div> + <div> + <span>{{'wikibase-lexical-category'|message}}</span> + <span>lex cat goes here</span> + </div> + </div> + <div v-else> + <div> + <label for="lemma-language">{{'wikibase-language'|message}}</label> + <input type="text" id="lemma-language" v-model="language"> + </div> + <div> + <label for="lemma-lexical-category">{{'wikibase-lexical-category'|message}}</label> + <input type="text" id="lemma-lexical-category"> + </div> + </div> +</div> +HTML; + + } + private function getRawLemmaVueTemplate() { return <<<'HTML' <div class="lemma-widget"> @@ -276,14 +348,6 @@ :disabled="isSaving" :title="'wikibase-add'|message">+</button> </li> </ul> - </div> - <div class="lemma-widget_controls" v-if="isInitialized" > - <button type="button" class="lemma-widget_edit" v-if="!inEditMode" - :disabled="isSaving" v-on:click="edit">{{'wikibase-edit'|message}}</button> - <button type="button" class="lemma-widget_save" v-if="inEditMode" - :disabled="isSaving" v-on:click="save">{{'wikibase-save'|message}}</button> - <button type="button" class="lemma-widget_cancel" v-if="inEditMode" - :disabled="isSaving" v-on:click="cancel">{{'wikibase-cancel'|message}}</button> </div> </div> HTML; -- To view, visit https://gerrit.wikimedia.org/r/381000 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I7e756d868e6502d4fe8a3f6d5e322caf2dc4d5ed Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/WikibaseLexeme Gerrit-Branch: master Gerrit-Owner: Jakob <jakob.warkot...@wikimedia.de> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits