From 707f7c93a5f10ff79d521759fd8af4d4e8d4f661 Mon Sep 17 00:00:00 2001 From: "James D. Forrester" Date: Fri, 15 Nov 2013 12:02:34 -0800 Subject: [PATCH] Let users set __NOEDITSECTION__ status Adds a checkbox to the page settings pane of the meta dialog that lets users set or unset the __NOEDITSECTION__ flag on the page. Change-Id: If1eca58e28d214021f5f5582856e595d4d0fbc43 --- VisualEditor.php | 2 + .../ve.dm.MWNoEditSectionMetaItem.js | 47 +++++++++++++++++ .../metaitems/ve.dm.MWTOCDisableMetaItem.js | 2 +- .../dm/metaitems/ve.dm.MWTOCForceMetaItem.js | 2 +- modules/ve-mw/i18n/en.json | 3 +- modules/ve-mw/i18n/qqq.json | 1 + .../ve-mw/ui/pages/ve.ui.MWSettingsPage.js | 50 +++++++++++++++---- 7 files changed, 95 insertions(+), 12 deletions(-) create mode 100644 modules/ve-mw/dm/metaitems/ve.dm.MWNoEditSectionMetaItem.js diff --git a/VisualEditor.php b/VisualEditor.php index 5b527c7c65..eaf1729e25 100644 --- a/VisualEditor.php +++ b/VisualEditor.php @@ -524,6 +524,7 @@ $wgResourceModules += array( 'modules/ve-mw/dm/metaitems/ve.dm.MWCategoryMetaItem.js', 'modules/ve-mw/dm/metaitems/ve.dm.MWDefaultSortMetaItem.js', 'modules/ve-mw/dm/metaitems/ve.dm.MWLanguageMetaItem.js', + 'modules/ve-mw/dm/metaitems/ve.dm.MWNoEditSectionMetaItem.js', 'modules/ve-mw/dm/metaitems/ve.dm.MWTransclusionMetaItem.js', 'modules/ve-mw/dm/metaitems/ve.dm.MWTOCDisableMetaItem.js', 'modules/ve-mw/dm/metaitems/ve.dm.MWTOCForceMetaItem.js', @@ -646,6 +647,7 @@ $wgResourceModules += array( 'visualeditor-dialog-meta-languages-readonlynote', 'visualeditor-dialog-meta-languages-section', 'visualeditor-dialog-meta-settings-label', + 'visualeditor-dialog-meta-settings-noeditsection-label', 'visualeditor-dialog-meta-settings-section', 'visualeditor-dialog-meta-settings-toc-default', 'visualeditor-dialog-meta-settings-toc-disable', diff --git a/modules/ve-mw/dm/metaitems/ve.dm.MWNoEditSectionMetaItem.js b/modules/ve-mw/dm/metaitems/ve.dm.MWNoEditSectionMetaItem.js new file mode 100644 index 0000000000..8abb143db3 --- /dev/null +++ b/modules/ve-mw/dm/metaitems/ve.dm.MWNoEditSectionMetaItem.js @@ -0,0 +1,47 @@ +/*! + * VisualEditor DataModel MWNoEditSectionMetaItem class. + * + * @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt + * @license The MIT License (MIT); see LICENSE.txt + */ + +/** + * DataModel disable section edit links meta item. + * + * @class + * @extends ve.dm.MetaItem + * @constructor + * @param {Object} element Reference to element in meta-linmod + */ +ve.dm.MWNoEditSectionMetaItem = function VeDmMWNoEditSectionMetaItem( element ) { + // Parent constructor + ve.dm.MetaItem.call( this, element ); +}; + +/* Inheritance */ + +OO.inheritClass( ve.dm.MWNoEditSectionMetaItem, ve.dm.MetaItem ); + +/* Static Properties */ + +ve.dm.MWNoEditSectionMetaItem.static.name = 'mwNoEditSection'; + +ve.dm.MWNoEditSectionMetaItem.static.group = 'mwNoEditSection'; + +ve.dm.MWNoEditSectionMetaItem.static.matchTagNames = [ 'meta' ]; + +ve.dm.MWNoEditSectionMetaItem.static.matchRdfaTypes = [ 'mw:PageProp/noeditsection' ]; + +ve.dm.MWNoEditSectionMetaItem.static.toDataElement = function () { + return { 'type': this.name }; +}; + +ve.dm.MWNoEditSectionMetaItem.static.toDomElements = function ( dataElement, doc ) { + var meta = doc.createElement( 'meta' ); + meta.setAttribute( 'property', 'mw:PageProp/noeditsection' ); + return [ meta ]; +}; + +/* Registration */ + +ve.dm.modelRegistry.register( ve.dm.MWNoEditSectionMetaItem ); diff --git a/modules/ve-mw/dm/metaitems/ve.dm.MWTOCDisableMetaItem.js b/modules/ve-mw/dm/metaitems/ve.dm.MWTOCDisableMetaItem.js index f8d7d1d320..60ed46baf3 100644 --- a/modules/ve-mw/dm/metaitems/ve.dm.MWTOCDisableMetaItem.js +++ b/modules/ve-mw/dm/metaitems/ve.dm.MWTOCDisableMetaItem.js @@ -32,7 +32,7 @@ ve.dm.MWTOCDisableMetaItem.static.matchTagNames = [ 'meta' ]; ve.dm.MWTOCDisableMetaItem.static.matchRdfaTypes = [ 'mw:PageProp/notoc' ]; -ve.dm.MWTOCDisableMetaItem.static.toDataElement = function ( ) { +ve.dm.MWTOCDisableMetaItem.static.toDataElement = function () { return { 'type': this.name }; }; diff --git a/modules/ve-mw/dm/metaitems/ve.dm.MWTOCForceMetaItem.js b/modules/ve-mw/dm/metaitems/ve.dm.MWTOCForceMetaItem.js index df885a61ac..4eeb0ac0e7 100644 --- a/modules/ve-mw/dm/metaitems/ve.dm.MWTOCForceMetaItem.js +++ b/modules/ve-mw/dm/metaitems/ve.dm.MWTOCForceMetaItem.js @@ -32,7 +32,7 @@ ve.dm.MWTOCForceMetaItem.static.matchTagNames = [ 'meta' ]; ve.dm.MWTOCForceMetaItem.static.matchRdfaTypes = [ 'mw:PageProp/forcetoc' ]; -ve.dm.MWTOCForceMetaItem.static.toDataElement = function ( ) { +ve.dm.MWTOCForceMetaItem.static.toDataElement = function () { return { 'type': this.name }; }; diff --git a/modules/ve-mw/i18n/en.json b/modules/ve-mw/i18n/en.json index b54f03c3a1..68999d8faf 100644 --- a/modules/ve-mw/i18n/en.json +++ b/modules/ve-mw/i18n/en.json @@ -58,6 +58,7 @@ "visualeditor-dialog-meta-languages-readonlynote": "This is a list of pages in other languages that are linked to this one; for now, it can only be edited in source mode or on Wikidata.", "visualeditor-dialog-meta-languages-section": "Languages", "visualeditor-dialog-meta-settings-label": "Page settings", + "visualeditor-dialog-meta-settings-noeditsection-label": "Disable the edit links next to each heading on this page.", "visualeditor-dialog-meta-settings-section": "Page settings", "visualeditor-dialog-meta-settings-toc-default": "Show if needed", "visualeditor-dialog-meta-settings-toc-disable": "Never show", @@ -174,4 +175,4 @@ "visualeditor-wikitext-warning": "You are using VisualEditor - [[{{MediaWiki:visualeditor-wikitext-warning-link}}|wikitext]] does not work here. Click \"{{int:visualeditor-ca-editsource}}\" to edit the page in wikitext mode – unsaved changes will be lost.", "visualeditor-wikitext-warning-link": "Help:Wiki markup", "visualeditor-wikitext-warning-title": "Wikitext markup detected" -} \ No newline at end of file +} diff --git a/modules/ve-mw/i18n/qqq.json b/modules/ve-mw/i18n/qqq.json index 05a8d93dbf..9f7851cef9 100644 --- a/modules/ve-mw/i18n/qqq.json +++ b/modules/ve-mw/i18n/qqq.json @@ -61,6 +61,7 @@ "visualeditor-dialog-meta-languages-readonlynote": "Text of a note informing users that the language links cannot yet be edited.\n\nSee also:\n* {{msg-mw|Visualeditor-referencelist-missingref}}", "visualeditor-dialog-meta-languages-section": "Label for the language links dialog section.\n{{Identical|Language}}", "visualeditor-dialog-meta-settings-label": "Title for the page settings dialog section", + "visualeditor-dialog-meta-settings-noeditsection-label": "Prompt for the checkbox to let the user disable section edit links on the page.", "visualeditor-dialog-meta-settings-section": "Label for the page settings dialog section.", "visualeditor-dialog-meta-settings-toc-default": "Label for the default TOC behaviour option.", "visualeditor-dialog-meta-settings-toc-disable": "Label for the TOC behaviour option to never show.", diff --git a/modules/ve-mw/ui/pages/ve.ui.MWSettingsPage.js b/modules/ve-mw/ui/pages/ve.ui.MWSettingsPage.js index 875733cb2d..5e7587e5f4 100644 --- a/modules/ve-mw/ui/pages/ve.ui.MWSettingsPage.js +++ b/modules/ve-mw/ui/pages/ve.ui.MWSettingsPage.js @@ -33,6 +33,10 @@ ve.ui.MWSettingsPage = function VeUiMWSettingsPage( surface, name, config ) { 'label': ve.msg( 'visualeditor-dialog-meta-settings-label' ), 'icon': 'settings' } ); + + // Initialization + + // Table of Contents items this.tocOptionSelector = new OO.ui.SelectWidget( { '$': this.$ } ); this.tocOptionWidgets = { 'default': new OO.ui.OptionWidget( @@ -49,18 +53,20 @@ ve.ui.MWSettingsPage = function VeUiMWSettingsPage( surface, name, config ) { ) }; this.tocOptionSelector.addItems( ve.getObjectValues( this.tocOptionWidgets ) ); - - // Events - this.tocOptionSelector.connect( this, { - 'select': 'onTOCOptionChange' - } ); - - // Initialization this.settingsFieldset.$element.append( this.$( '' ) .text( ve.msg( 'visualeditor-dialog-meta-settings-toc-label' ) ), this.tocOptionSelector.$element ); + this.tocOptionSelector.connect( this, { 'select': 'onTOCOptionChange' } ); + + // Disable section edit links items + this.disableSectionEditLinksInput = new OO.ui.CheckboxWidget( { + '$': this.$, + 'label': ve.msg( 'visualeditor-dialog-meta-settings-noeditsection-label' ) + } ); + this.settingsFieldset.$element.append( this.disableSectionEditLinksInput.$element ); + this.$element.append( this.settingsFieldset.$element ); }; @@ -88,6 +94,15 @@ ve.ui.MWSettingsPage.prototype.getTOCOptionItem = function () { return this.metaList.getItemsInGroup( 'mwTOC' )[0] || null; }; +/** + * Get the section edit link disabling item + * + * @returns {Object|null} Section edit link disabling meta item, if any + */ +ve.ui.MWSettingsPage.prototype.getDisableSectionEditLinksItem = function () { + return this.metaList.getItemsInGroup( 'mwNoEditSection' )[0] || null; +}; + /** * Setup settings page. * @@ -97,8 +112,12 @@ ve.ui.MWSettingsPage.prototype.setup = function () { var tocOption = this.getTOCOptionItem(), tocType = tocOption && tocOption.element.type || 'default'; + // Table of Contents items this.tocOptionSelector.selectItem( this.tocOptionWidgets[tocType] ); this.tocOptionTouched = false; + + // Disable section edit links items + this.disableSectionEditLinksInput.setValue( !!this.getDisableSectionEditLinksItem() ); }; /** @@ -110,8 +129,13 @@ ve.ui.MWSettingsPage.prototype.teardown = function ( data ) { // Data initialisation data = data || {}; - var currentTOCItem = this.getTOCOptionItem(), - newTOCData = this.tocOptionSelector.getSelectedItem(); + var // Table of Contents items + currentTOCItem = this.getTOCOptionItem(), + newTOCData = this.tocOptionSelector.getSelectedItem(), + + // Disable section edit links items + currentDisableSectionEditLinksItem = this.getDisableSectionEditLinksItem(), + newDisableSectionEditState = this.disableSectionEditLinksInput.getValue(); // Alter the TOC option flag iff it's been touched & is actually different if ( this.tocOptionTouched ) { @@ -132,4 +156,12 @@ ve.ui.MWSettingsPage.prototype.teardown = function ( data ) { } } } + + // Disable section edit links items + if ( currentDisableSectionEditLinksItem && !newDisableSectionEditState ) { + currentDisableSectionEditLinksItem.remove(); + } + if ( !currentDisableSectionEditLinksItem && newDisableSectionEditState ) { + this.metaList.insertMeta( { 'type': 'mwNoEditSection' } ); + } };