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

Reply via email to