ItSpiderman has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/405869 )
Change subject: Add PageExport dialog ...................................................................... Add PageExport dialog This dialog allows exporting pages to wiki-list when provided with array of page names Needs cherry-picking to REL1_27 Change-Id: Iaf35731368370175e1754c0f732c5c7aee85a57b ERM: #8210 --- M extension.json M i18n/extjs/de.json M i18n/extjs/en.json M i18n/extjs/qqq.json A resources/bluespice.extjs/BS/dialog/PageExport.js 5 files changed, 316 insertions(+), 4 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/BlueSpiceFoundation refs/changes/69/405869/1 diff --git a/extension.json b/extension.json index 75005a6..534fcd9 100644 --- a/extension.json +++ b/extension.json @@ -164,7 +164,19 @@ "bs-extjs-filter-date-after", "bs-extjs-filter-date-before", "bs-extjs-filter-date-on", - "bs-extjs-filter-date-filter" + "bs-extjs-filter-date-filter", + "bs-extjs-pageexport-dialog-title", + "bs-extjs-pageexport-list-name-label", + "bs-extjs-pageexport-list-format-label", + "bs-extjs-pageexport-list-format-plain-label", + "bs-extjs-pageexport-list-format-link-label", + "bs-extjs-pageexport-overwrite-label", + "bs-extjs-pageexport-general-error", + "bs-extjs-pageexport-pagecollection-prefix", + "bs-extjs-pageexport-success", + "bs-extjs-pageexport-success-text", + "bs-extjs-pageexport-required-text", + "bs-extjs-export-search-summary-text" ], "dependencies": [ "ext.bluespice.extjs.theme.ux", diff --git a/i18n/extjs/de.json b/i18n/extjs/de.json index a45a3b7..226b3cd 100644 --- a/i18n/extjs/de.json +++ b/i18n/extjs/de.json @@ -54,5 +54,6 @@ "bs-extjs-filter-date-after": "Nach", "bs-extjs-filter-date-before": "Vor", "bs-extjs-filter-date-on": "Am", - "bs-extjs-filter-date-filter": "Filtern" + "bs-extjs-filter-date-filter": "Filtern", + "bs-extjs-pageexport-pagecollection-prefix": "Seitensammlung_" } diff --git a/i18n/extjs/en.json b/i18n/extjs/en.json index aa47deb..3f24144 100644 --- a/i18n/extjs/en.json +++ b/i18n/extjs/en.json @@ -52,6 +52,18 @@ "bs-extjs-filter-date-after": "After", "bs-extjs-filter-date-before": "Before", "bs-extjs-filter-date-on": "On", - "bs-extjs-filter-date-filter": "Filter" + "bs-extjs-filter-date-filter": "Filter", + "bs-extjs-pageexport-pageexportdialog-title": "Export pages", + "bs-extjs-pageexport-list-name-label": "List name", + "bs-extjs-pageexport-list-format-label": "List format", + "bs-extjs-pageexport-list-format-plain-label": "Plain text", + "bs-extjs-pageexport-list-format-link-label": "Link", + "bs-extjs-pageexport-overwrite-label": "Overwrite", + "bs-extjs-pageexport-general-error": "Export error", + "bs-extjs-pageexport-pagecollection-prefix": "Page_collection_", + "bs-extjs-pageexport-success": "Export successful", + "bs-extjs-pageexport-success-text": "Page collection exported to <a href='$1'>$2</a>", + "bs-extjs-pageexport-required-text": "List name cannot be empty and at least one page must be selected", + "bs-extjs-export-search-summary-text": "Generated by PageExport" } diff --git a/i18n/extjs/qqq.json b/i18n/extjs/qqq.json index f1b02f2..179566f 100644 --- a/i18n/extjs/qqq.json +++ b/i18n/extjs/qqq.json @@ -57,5 +57,17 @@ "bs-extjs-filter-date-after": "Label for a filter option that filters for datasets where date in the field is later than the entered date\n{{Identical|After}}", "bs-extjs-filter-date-before": "Label for a filter option that filters for datasets where date in the field is earlier than the the entered date\n{{Identical|Before}}", "bs-extjs-filter-date-on": "Label for a filter option that filters for datasets where date in the field is the same as the entered date\n{{Identical|On}}", - "bs-extjs-filter-date-filter": "Label for a button invoking the filter\n{{Identical|Filter}}" + "bs-extjs-filter-date-filter": "Label for a button invoking the filter\n{{Identical|Filter}}", + "bs-extjs-pageexport-pageexportdialog-title": "Title for the export dialog", + "bs-extjs-pageexport-list-name-label": "Title for the export dialog", + "bs-extjs-pageexport-list-format-label": "Label text for choosing export list format", + "bs-extjs-pageexport-list-format-plain-label": "Label text indicating plain text format for export list", + "bs-extjs-pageexport-list-format-link-label": "Label text indicating link format for export list", + "bs-extjs-pageexport-overwrite-label": "Label text indicating link format for export list", + "bs-extjs-pageexport-general-error": "Text for general error in export process", + "bs-extjs-pageexport-pagecollection-prefix": "Prefix for naming page collections created by exporting search results", + "bs-extjs-pageexport-success": "Dialog title when export was sucessful", + "bs-extjs-pageexport-success-text": "Content of dialog when export was sucessful", + "bs-extjs-pageexport-required-text": "Dialog text when required fields are not filled", + "bs-extjs-export-search-summary-text": "Text for summary message for page edit on export" } diff --git a/resources/bluespice.extjs/BS/dialog/PageExport.js b/resources/bluespice.extjs/BS/dialog/PageExport.js new file mode 100644 index 0000000..35ff890 --- /dev/null +++ b/resources/bluespice.extjs/BS/dialog/PageExport.js @@ -0,0 +1,275 @@ +Ext.define( 'BS.dialog.PageExport', { + extend: 'BS.Window', + requires: [], + width: 350, + title: mw.message( 'bs-extjs-pageexport-dialog-title' ).plain(), + pages: [], + defaultName: '', + targetTitle: null, + targetPageContent: '', + formattedExportContent: '', + + afterInitComponent: function() { + this.tbName = Ext.create( 'Ext.form.field.Text', { + fieldLabel: mw.message( 'bs-extjs-pageexport-list-name-label' ).plain(), + labelAlign: 'right', + value: this.defaultName + }); + this.rgFormat = Ext.create('Ext.form.RadioGroup', { + value: 'plain', + flex: 1, + items: [{ + boxLabel: mw.message( 'bs-extjs-pageexport-list-format-plain-label' ).plain(), + id: 'export-format-plain', + name: 'export-format', + inputValue: 'plain', + checked: true + }, + { + boxLabel: mw.message('bs-extjs-pageexport-list-format-link-label').plain(), + id: 'export-format-link', + name: 'export-format', + inputValue: 'link' + } + ] + }); + + this.cbxOverwrite = Ext.create( 'Ext.form.field.Checkbox', { + value: '0', + fieldLabel: mw.message( 'bs-extjs-pageexport-overwrite-label' ).plain(), + labelAlign: 'right' + }); + + this.preparePages(); + this.makePagesStore(); + this.makePagesGrid(); + + this.items = [ + this.tbName, + { + xtype: 'fieldcontainer', + fieldLabel: mw.message( 'bs-extjs-pageexport-list-format-label' ).plain(), + labelAlign: 'right', + layout: 'hbox', + items: [ + this.rgFormat + ] + }, + this.cbxOverwrite, + this.gdPages + ] + this.callParent(arguments); + }, + + preparePages: function() { + var finalPages = []; + $.each( this.pages, function( idx, page ) { + finalPages.push({ + included: true, + pageTitle: page + }) + }); + this.pages = finalPages; + }, + + makePagesStore: function() { + this.store = Ext.create( 'Ext.data.Store', { + fields: [ 'included', 'pageTitle' ], + data: { 'pages': this.pages }, + proxy: { + type: 'memory', + reader: { + type: 'json', + root: 'pages' + } + } + } ); + }, + + makePagesGrid: function() { + this.gdPages = Ext.create( 'Ext.grid.Panel', { + store: this.store, + columns: [ + { + header: '', + dataIndex: 'included', + xtype: 'checkcolumn', + width: 40, + resizeable: false, + groupable: false, + sortable: false + }, + { + header: 'Page title', + dataIndex: 'pageTitle', + width: 300 + } + ] + } ); + }, + + onBtnOKClick: function () { + var me = this; + + me.data = me.getData(); + if( me.data.name === '' || me.data.pages.length === 0 ) { + bs.util.alert( + 'bs-pageexport-alert-required', + { + text: mw.message( 'bs-extjs-pageexport-required-text').plain() + } + ); + return; + } + + me.setLoading( true ); + + me.setTargetTitle(); + var exportPromise = me.doExport(); + + exportPromise.fail( function( code, errResponse ) { + me.setLoading( false ); + bs.util.alert( + 'bs-pageexport-alert-fail', + { + titleMsg: 'bs-extjs-pageexport-general-error', + text: errResponse.error.info + } + ); + me.close(); + } ); + + exportPromise.done( function( response ) { + me.setLoading( false ); + bs.util.alert( + 'bs-pageexport-alert-success', + { + titleMsg: 'bs-extjs-pageexport-success', + text: mw.message( + 'bs-extjs-pageexport-success-text', + me.targetTitle.getUrl(), + me.targetTitle.getPrefixedText() + ).plain() + } + ); + me.close(); + } ); + }, + + setTargetTitle: function() { + var ns = mw.config.get( 'wgNamespaceIds' )['mediawiki']; + var text = mw.message( 'bs-extjs-pageexport-pagecollection-prefix' ).plain(); + text += this.data.name; + this.targetTitle = mw.Title.newFromText( text, ns ); + }, + + doExport: function() { + var me = this, + getTargetPageInfoAPI = new mw.Api(), + dfd = $.Deferred(); + + getTargetPageInfoAPI.get( { + action: 'query', + titles: me.targetTitle.getPrefixedText(), + prop: 'revisions', + rvprop: 'content', + indexpageids : '' + } ) + .fail( function( code, errResp ) { + dfd.reject( code, errResp ); + } ) + .done( function( response ) { + var pageId = response.query.pageids[0]; + var pageInfo = response.query.pages[pageId]; + if( !pageInfo.missing && pageInfo.revisions && pageInfo.revisions[0] ) { + me.targetPageContent = pageInfo.revisions[0]['*']; + } + + var savePromise = me.savePage(); + savePromise.fail( function( code, error ) { + dfd.reject( code, error ); + }); + savePromise.done( function( response ){ + dfd.resolve( response ); + }); + } ); + + return dfd.promise(); + }, + + savePage: function() { + var me = this, + savePageAPI = new mw.Api(), + dfd = $.Deferred(); + + me.formatExportContent(); + + if( me.data.overwrite == false ) { + me.formattedExportContent = + me.targetPageContent + "\n" + me.formattedExportContent; + } + + savePageAPI.postWithToken( 'edit', { + action: 'edit', + title: me.targetTitle.getPrefixedText(), + summary: mw.message( 'bs-extjs-pageexport-edit-summary-text' ).plain(), + text: me.formattedExportContent + } ).done( function( response ) { + dfd.resolve( response ); + } ).fail( function( code, err ) { + dfd.reject( code, err ); + } ); + + return dfd.promise(); + }, + + formatExportContent: function() { + var me = this; + if( me.data.pages.length === 0 ) { + return; + } + me.formattedExportContent = ''; + + $.each( me.data.pages, function( idx, page ){ + var exportLine = '* '; + if( me.data.link ) { + exportLine += "[[" + page + "]]\n"; + } else { + exportLine += page + "\n"; + } + me.formattedExportContent += exportLine; + } ); + }, + + getData: function() { + var me = this; + var pages = []; + var range = this.store.getRange(); + $.each( range, function( idx, item ) { + if( item.data.included == false ) { + return; + } + pages.push( item.data.pageTitle ); + }); + + var data = { + pages: pages, + link: false, + overwrite: false, + name: me.tbName.getValue() + }; + + if( me.rgFormat.getValue()['export-format'] === 'link' ) { + data.link = true; + } + + if( me.cbxOverwrite.getValue() ) { + data.overwrite = true; + } + + return data; + } +}); + + + -- To view, visit https://gerrit.wikimedia.org/r/405869 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iaf35731368370175e1754c0f732c5c7aee85a57b Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/BlueSpiceFoundation Gerrit-Branch: master Gerrit-Owner: ItSpiderman <d.savulje...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits