Mooeypoo has uploaded a new change for review. https://gerrit.wikimedia.org/r/319251
Change subject: [wip] RecentChanges Dynamic Filters ...................................................................... [wip] RecentChanges Dynamic Filters ** SUPER WIP ** This is the beginning/groundwork for the new RecentChanges filters with ORES. This commit is extremely WIP as we should work on solving some big infrastructure questions. Bug: T144448 Change-Id: I97a2df99b11eca8288fb3c9b85ed9588cc408749 --- M extension.json M includes/Hooks.php A modules/recentchanges/dm/mw.ores.dm.FilterGroup.js A modules/recentchanges/dm/mw.ores.dm.FilterItem.js A modules/recentchanges/dm/mw.ores.dm.FiltersViewModel.js A modules/recentchanges/mw.ores.js A modules/recentchanges/ui/mw.ores.ui.FilterItemWidget.js A modules/recentchanges/ui/mw.ores.ui.FiltersCapsuleMultiselectWidget.js A modules/recentchanges/ui/mw.ores.ui.FiltersListWidget.js 9 files changed, 251 insertions(+), 1 deletion(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/ORES refs/changes/51/319251/1 diff --git a/extension.json b/extension.json index eb096bc..bdfb3aa 100644 --- a/extension.json +++ b/extension.json @@ -71,6 +71,19 @@ "desktop", "mobile" ] + }, + "ext.ores.recentchangesfilters": { + "scripts": [ + "modules/recentchanges/mw.ores.js", + "modules/recentchanges/dm/mw.ores.dm.FilterItem.js", + "modules/recentchanges/dm/mw.ores.dm.FiltersModel.js", + "modules/recentchanges/ui/mw.ores.ui.FiltersListWidget.js", + "modules/recentchanges/ui/mw.ores.ui.FiltersCapsuleMultiselectWidget.js" + ], + "targets": [ + "desktop", + "mobile" + ] } }, "MessagesDirs": { @@ -125,7 +138,17 @@ "legend": "ores-damaging-legend", "class": "ores-damaging" } - } + }, + "RCDynamicFilters": { + "userregistration": { + "options": { + "registered": { + + }, + "unregistered": {} + } + } + }, }, "DefaultUserOptions": { "oresDamagingPref": "hard", diff --git a/includes/Hooks.php b/includes/Hooks.php index 9c887ea..2ba47a7 100644 --- a/includes/Hooks.php +++ b/includes/Hooks.php @@ -507,6 +507,12 @@ } $out->addModuleStyles( 'ext.ores.styles' ); + + // TODO: Add another layer of beta feature to this? + // TODO: Only do this if we are in Special:RecentChanges + $wgRCDynamicFilters[] = ''; + $out->addModules( array( 'ext.ores.recentchangesfilters' ) ); + return true; } diff --git a/modules/recentchanges/dm/mw.ores.dm.FilterGroup.js b/modules/recentchanges/dm/mw.ores.dm.FilterGroup.js new file mode 100644 index 0000000..4604c57 --- /dev/null +++ b/modules/recentchanges/dm/mw.ores.dm.FilterGroup.js @@ -0,0 +1,28 @@ +( function ( mw ) { + /** + * Filter group model + * + * @mixins OO.EventEmitter + * @mixins OO.EmitterList + * + * @constructor + * @param {Object} config Configuration object + * @cfg {boolean} selected Filter is selected + */ + mw.ores.dm.FilterGroup = function MwOresDmFilterGroup( config ) { + config = config || {}; + + // Mixin constructor + OO.EventEmitter.call( this ); + OO.EmitterList.call( this ); + + // Parent constructor + mw.ores.dm.FilterGroup.parent.call( this, config ); + }; + + /* Initialization */ + + OO.initClass( mw.ores.dm.FilterGroup ); + OO.mixinClass( mw.ores.dm.FilterGroup, OO.EventEmitter ); + OO.mixinClass( mw.ores.dm.FilterGroup, OO.EmitterList ); +} )( mediaWiki ); diff --git a/modules/recentchanges/dm/mw.ores.dm.FilterItem.js b/modules/recentchanges/dm/mw.ores.dm.FilterItem.js new file mode 100644 index 0000000..c79ca33 --- /dev/null +++ b/modules/recentchanges/dm/mw.ores.dm.FilterItem.js @@ -0,0 +1,68 @@ +( function ( mw ) { + /** + * Filter item model + * + * @mixins OO.EventEmitter + * + * @constructor + * @param {Object} config Configuration object + * @cfg {boolean} [selecte] Filter is selected + * @cfg {string} [color] The color that represents this filter. + * Null represents no color was chosen. + */ + mw.ores.dm.FilterItem = function MwOresDmFilterItem( config ) { + config = config || {}; + + // Mixin constructor + OO.EventEmitter.call( this ); + + this.selected = !!config.selected; + this.color = config.color || null; + }; + + /* Initialization */ + + OO.initClass( mw.ores.dm.FilterItem ); + OO.mixinClass( mw.ores.dm.FilterItem, OO.EventEmitter ); + + /* Events */ + + /** + * @event update + * @param {boolean} isSelected Filter is selected + * @param {string} color Color used to mark this filter + * + * The state of this filter has changed + */ + + /* Methods */ + + /** + * Toggle the selected state of the item + * + * @param {boolean} isSelected Filter is selected + * @fires update + */ + mw.ores.dm.FilterItem.prototype.toggleSelected = function ( isSelected ) { + isSelected = isSelected === undefined ? !this.selected : isSelected; + + if ( this.selected !== isSelected ) { + this.selected = isSelected; + this.emit( 'update', this.selected, this.color ); + } + }; + /** + * Set the color representing this filter + * + * @param {string} [color] The color representing the filter + * @fires update + */ + mw.ores.dm.FilterItem.prototype.setColor = function ( color ) { + color = color || null; + + if ( this.color !== color ) { + this.color = color; + this.emit( 'update', this.selected, this.color ); + } + }; +} )( mediaWiki ); diff --git a/modules/recentchanges/dm/mw.ores.dm.FiltersViewModel.js b/modules/recentchanges/dm/mw.ores.dm.FiltersViewModel.js new file mode 100644 index 0000000..093ff6c --- /dev/null +++ b/modules/recentchanges/dm/mw.ores.dm.FiltersViewModel.js @@ -0,0 +1,44 @@ +( function ( mw ) { + /** + * View model for the filters selection and display + * + * @mixins OO.EventEmitter + * @mixins OO.EmitterList + * + * @constructor + * @param {Object} config Configuration object + */ + mw.ores.dm.FiltersViewModel = function MwOresDmFiltersViewModel( config ) { + config = config || {}; + + // Mixin constructor + OO.EventEmitter.call( this ); + OO.EmitterList.call( this ); + + // // ORES filters + // this.quality = []; + // this.intent = []; + // // General filters + // this.registered = []; + // this.experience = []; + // this.authorship = []; + // this.automated = []; + // this.effect = []; + // this.namespace = []; + // this.tags = []; + // this.categories = []; + }; + + OO.initClass( mw.ores.dm.FiltersViewModel ); + OO.mixinClass( mw.ores.dm.FiltersViewModel, OO.EventEmitter ); + OO.mixinClass( mw.ores.dm.FiltersViewModel, OO.EmitterList ); + + /** + * Accept an object that mimics the URL query and populate all + * filters accordingly. + * + * @param {[type]} urlQuery [description] + * @return {[type]} [description] + */ + mw.ores.dm.FiltersModel.prototype.populateFromObject = function ( urlQueryObj ) {}; +} )( mediaWiki ); diff --git a/modules/recentchanges/mw.ores.js b/modules/recentchanges/mw.ores.js new file mode 100644 index 0000000..c8ecde0 --- /dev/null +++ b/modules/recentchanges/mw.ores.js @@ -0,0 +1,6 @@ +( function ( mw ) { + mw.ores = { + dm: {}, + ui: {} + }; +} )( mediaWiki ); diff --git a/modules/recentchanges/ui/mw.ores.ui.FilterItemWidget.js b/modules/recentchanges/ui/mw.ores.ui.FilterItemWidget.js new file mode 100644 index 0000000..9f3f2e2 --- /dev/null +++ b/modules/recentchanges/ui/mw.ores.ui.FilterItemWidget.js @@ -0,0 +1,24 @@ +( function ( mw, $ ) { + /** + * Filter item for the filters selection widget. + * + * @class + * @extends OO.ui.SelectWidget + * + * @constructor + * @param {mw.ores.dm.FilterItem} model Filter item model + * @param {object} config Configuration options + */ + mw.ores.ui.FilterItemWidget = function MwOresUiFilterItemWidget( model, config ) { + config = config || {}; + + // Parent constructor + mw.ores.ui.FilterItemWidget.parent.call( this, config ); + + this.model = model; + }; + + /* Initialization */ + + OO.inheritClass( mw.ores.ui.FilterItemWidget, OO.ui.Widget ); +} )( mediaWiki, jQuery ); diff --git a/modules/recentchanges/ui/mw.ores.ui.FiltersCapsuleMultiselectWidget.js b/modules/recentchanges/ui/mw.ores.ui.FiltersCapsuleMultiselectWidget.js new file mode 100644 index 0000000..5eeb987 --- /dev/null +++ b/modules/recentchanges/ui/mw.ores.ui.FiltersCapsuleMultiselectWidget.js @@ -0,0 +1,26 @@ +( function ( mw ) { + /** + * Filters multiselect widget, allowing to select multiple filters + * for the RecentChanges page. + * + * @class + * @extends OO.ui.CapsuleMultiselectWidget + * + * @constructor + * @param {mw.ores.dm.FiltersModel} model Filters model + * @param {object} config Configuration options + */ + mw.ores.ui.FiltersCapsuleMultiselectWidget = function MwOresUiFiltersCapsuleMultiselectWidget( model, config ) { + config = config || {}; + + // Parent constructor + mw.ores.ui.FiltersMultiselectWidget.parent.call( this, $.extend( { + allowArbitrary: false + }, config ) ); + + this.model = model; + }; + /* Initialization */ + + OO.inheritClass( mw.ores.ui.FiltersMultiselectWidget, OO.ui.CapsuleMultiselectWidget ); +} )( mediaWiki ); diff --git a/modules/recentchanges/ui/mw.ores.ui.FiltersListWidget.js b/modules/recentchanges/ui/mw.ores.ui.FiltersListWidget.js new file mode 100644 index 0000000..ac4c5d5 --- /dev/null +++ b/modules/recentchanges/ui/mw.ores.ui.FiltersListWidget.js @@ -0,0 +1,25 @@ +( function ( mw, $ ) { + /** + * Filters select widget, showing the available filters + * by filter category. + * + * @class + * @extends OO.ui.Widget + * + * @constructor + * @param {mw.ores.dm.FiltersModel} model Filters model + * @param {object} config Configuration options + */ + mw.ores.ui.FiltersListWidget = function MwOresUiFiltersListWidget( model, config ) { + config = config || {}; + + // Parent constructor + mw.ores.ui.FiltersListWidget.parent.call( this, config ); + + this.model = model; + }; + + /* Initialization */ + + OO.inheritClass( mw.ores.ui.FiltersListWidget, OO.ui.Widget ); +} )( mediaWiki, jQuery ); -- To view, visit https://gerrit.wikimedia.org/r/319251 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I97a2df99b11eca8288fb3c9b85ed9588cc408749 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/ORES Gerrit-Branch: master Gerrit-Owner: Mooeypoo <mor...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits