Ejegg has uploaded a new change for review. https://gerrit.wikimedia.org/r/199266
Change subject: WIP: shared filter component ...................................................................... WIP: shared filter component Add a <filters> component and a <dropdown-filter> subcomponent. Each subcomponent is responsible for creating its own query string. Change-Id: I9665ba59c4fdf8acf088d5ef6074328e4a975dbc --- M src/app/startup.js M src/app/widgetBase.js A src/components/filters/dropdown-filter/dropdown-filter.html A src/components/filters/dropdown-filter/dropdown-filter.js A src/components/filters/filters.html A src/components/filters/filters.js M src/components/widgets/x-by-y/x-by-y.html 7 files changed, 120 insertions(+), 6 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/wikimedia/fundraising/dash refs/changes/66/199266/1 diff --git a/src/app/startup.js b/src/app/startup.js index e6cc743..0d0cf6a 100644 --- a/src/app/startup.js +++ b/src/app/startup.js @@ -19,6 +19,10 @@ ko.components.register( 'generic-board', { require: 'components/boards/generic-board/generic-board' }); ko.components.register( 'bigEnglishBoard', { require: 'components/boards/bigEnglish/bigEnglishBoard' }); + //register filters + ko.components.register( 'filters', { require: 'components/filters/filters' }); + ko.components.register( 'dropdown-filter', { require: 'components/filters/dropdown-filter/dropdown-filter' }); + //register individual widgets ko.components.register( 'fraud-gauge', { require: 'components/widgets/fraud-gauge/fraud-gauge' }); ko.components.register( 'totals-earned-chart', { require: 'components/widgets/totals-earned-chart/totals-earned-chart' }); diff --git a/src/app/widgetBase.js b/src/app/widgetBase.js index 4a395d0..c9f9e48 100644 --- a/src/app/widgetBase.js +++ b/src/app/widgetBase.js @@ -28,6 +28,19 @@ self.chartHeight = ko.observable('550'); self.chartLoaded = ko.observable(false); self.title = ko.observable(params.title); + self.userChoices = ko.observable(self.config.userChoices); + self.filterQueryString = ko.observable(self.config.filterQueryString || ''); + self.metadataRequest = ( function() { + var storageKey = 'metadata-' + self.widgetCode, + data = localStorage.getItem( storageKey ); + + if ( data ) { + return $.Deferred().resolve( JSON.parse( data ) ).promise(); + } + return $.get( 'metadata/' + self.widgetCode, function( fetchedData ) { + localStorage.setItem( storageKey, JSON.stringify( fetchedData ) ); + } ); + } )(); self.getChartData = function( qs ){ self.dataLoading(true); @@ -42,6 +55,9 @@ }; self.saveWidgetConfig = function(){ + self.config.userChoices = ko.toJSON( self.userChoices ); + self.config.filterQueryString = ko.toJSON( self.filterQueryString ); + var data = JSON.stringify( { configuration: self.config, isShared: false, @@ -124,14 +140,22 @@ var timeArray = ['Year', 'Month', 'Day', 'Hour'], index = timeArray.indexOf( userChoices.timeBreakout ), - query = 'group=' + userChoices.timeBreakout; + query = 'group=' + userChoices.timeBreakout, + filterQueryString = self.filterQueryString(), + extraFilter; // If we're grouping by anything finer than year, add a filter and // also group by the next level up. if ( index > 0 ) { query = query + '&group=' + timeArray[index - 1]; - query = query + '&$filter=' + timeArray[index - 1] + 'sAgo lt \'1\''; + extraFilter = timeArray[index - 1] + 'sAgo lt \'1\'' + if ( filterQueryString === '' ) { + filterQueryString = '$filter=' + extraFilter; + } else { + filterQueryString = filterQueryString + ' AND ' + extraFilter; + } } + query = query + '&' + filterQueryString; //groupStr = timeBreakout + '&group=' + userChoices.xSlice; // if( userChoices.additionalFilters.length > 0 ){ diff --git a/src/components/filters/dropdown-filter/dropdown-filter.html b/src/components/filters/dropdown-filter/dropdown-filter.html new file mode 100644 index 0000000..2395fc0 --- /dev/null +++ b/src/components/filters/dropdown-filter/dropdown-filter.html @@ -0,0 +1 @@ +<select data-bind="options:values, selectedOptions: selectedValues" multiple="true"/> diff --git a/src/components/filters/dropdown-filter/dropdown-filter.js b/src/components/filters/dropdown-filter/dropdown-filter.js new file mode 100644 index 0000000..59c669b --- /dev/null +++ b/src/components/filters/dropdown-filter/dropdown-filter.js @@ -0,0 +1,25 @@ +define( [ + 'knockout', + 'jquery', + 'text!components/filters/dropdown-filter/dropdown-filter.html' + ], +function( ko, $, template ){ + + function DropdownFilterViewModel( params ){ + this.values = params.metadata.values; + this.selectedValues = params.userChoices; + + this.selectedValues.subscribe( function( vals ) { + var qs = ''; + $.each( vals, function( i, value ) { + if ( i > 0 ) { + qs += ' OR '; + } + qs += params.name + ' eq \'' + value + '\''; + } ); + params.queryString( qs ); + } ); + } + + return { viewModel: DropdownFilterViewModel, template: template }; +} ); diff --git a/src/components/filters/filters.html b/src/components/filters/filters.html new file mode 100644 index 0000000..bca4a32 --- /dev/null +++ b/src/components/filters/filters.html @@ -0,0 +1,6 @@ +<div class="filters"> + <div class="row" data-bind="foreach: filters"> + <span data-bind="text: metadata.display"></span>: + <div data-bind="component: { name: metadata.type + '-filter', params: { name: name, queryString: queryString, metadata: metadata, userChoices: userChoices } }"></div> + </div> +</div> diff --git a/src/components/filters/filters.js b/src/components/filters/filters.js new file mode 100644 index 0000000..90ca8b0 --- /dev/null +++ b/src/components/filters/filters.js @@ -0,0 +1,53 @@ +define( [ + 'knockout', + 'jquery', + 'text!components/filters/filters.html' + ], +function( ko, $, template ){ + + function FiltersViewModel( params ){ + var self = this; + + this.filters = ko.observableArray( [] ); + this.setChoices = function() { + var qs = '', choices = {}; + $.each( self.filters(), function( i, filter ) { + var filterQs = filter.queryString(); + if ( !filterQs || filterQs == '' ) { + return; + } + if ( qs === '' ) { + qs += '$filter=('; + } else { + qs += ' AND ('; + } + qs += filterQs; + qs += ')'; + choices[filter.name] = filter.userChoices(); + } ); + params.queryString( qs ); + params.userChoices( choices ); + params.change(); + }; + + params.metadataRequest.then( function( metadata ) { + $.each( metadata.filters, function( name, filterMeta ) { + var filter = { + name: name, + metadata: filterMeta, + queryString: ko.observable('') + } + if ( filterMeta.type === 'dropdown' ) { + filter.userChoices = ko.observableArray( params.userChoices[name] || [] ); + } else { + return;//temporarily only doing dropdown filters + filter.userChoices = ko.observable( params.userChoices[name] ); + } + filter.queryString.subscribe( self.setChoices ); + self.filters.push( filter ); + } ); + } ); + } + + return { viewModel: FiltersViewModel, template: template }; +} ); diff --git a/src/components/widgets/x-by-y/x-by-y.html b/src/components/widgets/x-by-y/x-by-y.html index fa3b62a..a35da4d 100644 --- a/src/components/widgets/x-by-y/x-by-y.html +++ b/src/components/widgets/x-by-y/x-by-y.html @@ -43,9 +43,10 @@ <!-- <hr> --> </div> - <!-- <div class="row-fluid"> + <div class="row-fluid"> <label for="selectXYFilters">Additional filters:</label><br> - <span data-bind="foreach: groupChoices"> + <filters params="change: logStateChange, userChoices: userChoices, metadataRequest: metadataRequest, queryString: filterQueryString" /> + <!--span data-bind="foreach: groupChoices"> <div class="panel panel-default xyGroupOption"> <div class="panel-heading"> <span data-bind="text: $data.name" class="pull-left"></span> @@ -61,8 +62,8 @@ </ul> </div> </div> - </span> - </div> --> + </span--> + </div> </form> </div> -- To view, visit https://gerrit.wikimedia.org/r/199266 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I9665ba59c4fdf8acf088d5ef6074328e4a975dbc Gerrit-PatchSet: 1 Gerrit-Project: wikimedia/fundraising/dash Gerrit-Branch: master Gerrit-Owner: Ejegg <eeggles...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits