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

Reply via email to