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 <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits