Skip to content

Commit

Permalink
feat(ngTableFilterConfig): allow template urls for filters to be cust…
Browse files Browse the repository at this point in the history
…omized

`ngTableFilterConfig` is a new service that will allow various aspects of ng-table filters to be
customised.

Out of the box, the service allows an application to configure which url should be selected as the
template url for a filter.

**Example: override the url selected for the 'text' filter:**

```js
angular.module('yourApp').config(function(ngTableFilterConfigProvider){
    ngTableFilterConfigProvider.setConfig({ aliasUrls: {
        'text': 'custom/url/custom-text.html'
    }});
});
```

**Example: override the *default* url for all filter templates**

```js
angular.module('yourApp').config(function(ngTableFilterConfigProvider){
    ngTableFilterConfigProvider.setConfig({ defaultBaseUrl: 'default/path/to/filter/templates/'});
});
```
  • Loading branch information
ccrowhurstram committed Jul 25, 2015
1 parent 47460d6 commit 032f6ff
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 4 deletions.
3 changes: 1 addition & 2 deletions src/ng-table/filterRow.html
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
<tr ng-show="show_filter" class="ng-table-filters">
<th data-title-text="{{$column.titleAlt(this) || $column.title(this)}}" ng-repeat="$column in $columns" ng-if="$column.show(this)" class="filter">
<div ng-repeat="(name, filter) in $column.filter(this)">
<div ng-if="filter.indexOf('/') !== -1" ng-include="filter"></div>
<div ng-if="filter.indexOf('/') === -1" ng-include="'ng-table/filters/' + filter + '.html'"></div>
<div ng-include="config.getTemplateUrl(filter)"></div>
</div>
</th>
</tr>
59 changes: 59 additions & 0 deletions src/scripts/03-params.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,65 @@ app.value('ngTableDefaults', {
settings: {}
});

(function(){
'use strict';

angular.module('ngTable')
.provider('ngTableFilterConfig', ngTableFilterConfigProvider);

ngTableFilterConfigProvider.$inject = [];

function ngTableFilterConfigProvider(){
var defaultConfig = {
defaultBaseUrl: 'ng-table/filters/',
defaultExt: '.html',
aliasUrls: {}
};
var config = defaultConfig;

this.$get = ngTableFilterConfig;
this.setConfig = setConfig;

/////////

function setConfig(customConfig){
config = angular.extend({}, defaultConfig, customConfig);
config.aliasUrls = angular.extend({}, defaultConfig.aliasUrls, config.aliasUrls);
}

/////////

ngTableFilterConfig.$inject = [];

function ngTableFilterConfig(){

var publicConfig = angular.copy(config);

var service = {
config: publicConfig,
getTemplateUrl: getTemplateUrl,
getUrlForAlias: getUrlForAlias
};
return service;

/////////

function getTemplateUrl(filterValue, filterKey){
if (filterValue.indexOf('/') !== -1){
return filterValue;
}

return service.getUrlForAlias(filterValue, filterKey);
}

function getUrlForAlias(aliasName/*, filterKey*/){
return config.aliasUrls[aliasName] || config.defaultBaseUrl + aliasName + config.defaultExt;
}
}
}
})();


/**
* @ngdoc service
* @name NgTableParams
Expand Down
5 changes: 3 additions & 2 deletions src/scripts/04-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -293,9 +293,10 @@ app.factory('ngTableColumn', [function () {
angular.module('ngTable')
.controller('ngTableFilterRowController', ngTableFilterRowController);

ngTableFilterRowController.$inject = [];
ngTableFilterRowController.$inject = ['$scope', 'ngTableFilterConfig'];

function ngTableFilterRowController(){
function ngTableFilterRowController($scope, ngTableFilterConfig){

$scope.config = ngTableFilterConfig;
}
})();
49 changes: 49 additions & 0 deletions test/filtersSpec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
describe('ngTableFilterConfig', function () {
var ngTableFilterConfig,
ngTableFilterConfigProvider;

beforeEach(function () {
// Initialize the service provider
// by injecting it to a fake module's config block
var fakeModule = angular.module('test.config', function () {});
fakeModule.config( function (_ngTableFilterConfigProvider_) {
ngTableFilterConfigProvider = _ngTableFilterConfigProvider_;
});
// Initialize test.app injector
module('ngTable', 'test.config');
});

beforeEach(inject(function (_ngTableFilterConfig_) {
ngTableFilterConfig = _ngTableFilterConfig_;
}));

describe('getTemplateUrl', function(){

it('explicit url supplied', function(){
var explicitUrl = 'path/to/my-template.html';
expect(ngTableFilterConfig.getTemplateUrl(explicitUrl)).toBe(explicitUrl);
});

it('inbuilt alias supplied', function(){
expect(ngTableFilterConfig.getTemplateUrl('text')).toBe('ng-table/filters/text.html');
});

it('custom alias supplied', function(){
expect(ngTableFilterConfig.getTemplateUrl('my-template')).toBe('ng-table/filters/my-template.html');
});

it('alias registered with custom url', function(){
ngTableFilterConfigProvider.setConfig({ aliasUrls: {
'my-template': 'custom/url/my-template.html'
}});
expect(ngTableFilterConfig.getTemplateUrl('my-template')).toBe('custom/url/my-template.html');
});

it('inbuilt alias registered with custom url', function(){
ngTableFilterConfigProvider.setConfig({ aliasUrls: {
'text': 'custom/url/custom-text.html'
}});
expect(ngTableFilterConfig.getTemplateUrl('text')).toBe('custom/url/custom-text.html');
});
});
});

0 comments on commit 032f6ff

Please sign in to comment.