Skip to content

Commit df213d7

Browse files
committed
Filter on site settings across all categories
1 parent 1e37abc commit df213d7

10 files changed

Lines changed: 102 additions & 29 deletions
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
Discourse.AdminSiteSettingsCategoryController = Ember.ObjectController.extend({
2+
categoryNameKey: null,
3+
needs: ['adminSiteSettings'],
4+
5+
filteredContent: function() {
6+
if (!this.get('categoryNameKey')) { return Em.A(); }
7+
8+
var category = this.get('controllers.adminSiteSettings.content').find(function(siteSettingCategory) {
9+
return siteSettingCategory.nameKey === this.get('categoryNameKey');
10+
}, this);
11+
12+
if (category) {
13+
return category.siteSettings;
14+
} else {
15+
return Em.A();
16+
}
17+
}.property('controllers.adminSiteSettings.content', 'categoryNameKey')
18+
19+
});

app/assets/javascripts/admin/controllers/admin_site_settings_controller.js

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,31 +15,47 @@ Discourse.AdminSiteSettingsController = Ember.ArrayController.extend(Discourse.P
1515
1616
@property filteredContent
1717
**/
18-
filteredContent: function() {
18+
filterContent: function() {
1919

2020
// If we have no content, don't bother filtering anything
21-
if (!this.present('content')) return null;
21+
if (!this.present('allSiteSettings')) return;
2222

2323
var filter;
2424
if (this.get('filter')) {
2525
filter = this.get('filter').toLowerCase();
2626
}
2727

28-
var adminSettingsController = this;
28+
if ((filter === undefined || filter.length < 1) && !this.get('onlyOverridden')) {
29+
this.set('model', this.get('allSiteSettings'));
30+
return;
31+
}
2932

30-
var maxResults = Em.isNone(filter) ? this.get('content.length') : 20;
31-
return _.first(this.get('content').filter(function(item, index, enumerable) {
32-
if (adminSettingsController.get('onlyOverridden') && !item.get('overridden')) return false;
33-
if (filter) {
34-
if (item.get('setting').toLowerCase().indexOf(filter) > -1) return true;
35-
if (item.get('description').toLowerCase().indexOf(filter) > -1) return true;
36-
if (item.get('value').toLowerCase().indexOf(filter) > -1) return true;
37-
return false;
33+
var self = this,
34+
matches,
35+
matchesGroupedByCategory = Em.A();
36+
37+
_.each(this.get('allSiteSettings'), function(settingsCategory) {
38+
matches = settingsCategory.siteSettings.filter(function(item) {
39+
if (self.get('onlyOverridden') && !item.get('overridden')) return false;
40+
if (filter) {
41+
if (item.get('setting').toLowerCase().indexOf(filter) > -1) return true;
42+
if (item.get('description').toLowerCase().indexOf(filter) > -1) return true;
43+
if (item.get('value').toLowerCase().indexOf(filter) > -1) return true;
44+
return false;
45+
} else {
46+
return true;
47+
}
48+
});
49+
if (matches.length > 0) {
50+
matchesGroupedByCategory.pushObject({
51+
nameKey: settingsCategory.nameKey,
52+
name: settingsCategory.name,
53+
siteSettings: matches});
3854
}
55+
});
3956

40-
return true;
41-
}), maxResults);
42-
}.property('filter', 'content.@each', 'onlyOverridden'),
57+
this.set('model', matchesGroupedByCategory);
58+
}.observes('filter', 'onlyOverridden'),
4359

4460
actions: {
4561

app/assets/javascripts/admin/models/site_setting.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ Discourse.SiteSetting.reopenClass({
118118
categories[s.category].pushObject(Discourse.SiteSetting.create(s));
119119
});
120120
_.each(categoryNames, function(n) {
121-
result.pushObject({nameKey: n, name: I18n.t('admin.site_settings.categories.' + n),siteSettings: categories[n]});
121+
result.pushObject({nameKey: n, name: I18n.t('admin.site_settings.categories.' + n), siteSettings: categories[n]});
122122
});
123123
return result;
124124
});

app/assets/javascripts/admin/routes/admin_site_setting_category_route.js renamed to app/assets/javascripts/admin/routes/admin_site_settings_category_route.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,6 @@
88
**/
99
Discourse.AdminSiteSettingsCategoryRoute = Discourse.Route.extend({
1010
model: function(params) {
11-
var category = this.modelFor('adminSiteSettings').find(function(siteSettingCategory) {
12-
return siteSettingCategory.nameKey === params.category_id;
13-
});
14-
if (category) {
15-
return category.siteSettings;
16-
}
11+
this.controllerFor('adminSiteSettingsCategory').set('categoryNameKey', params.category_id);
1712
}
1813
});

app/assets/javascripts/admin/routes/admin_site_settings_route.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
Discourse.AdminSiteSettingsRoute = Discourse.Route.extend({
1010
model: function() {
1111
return Discourse.SiteSetting.findAll();
12+
},
13+
14+
afterModel: function(siteSettings) {
15+
this.controllerFor('adminSiteSettings').set('allSiteSettings', siteSettings);
1216
}
1317
});
1418

app/assets/javascripts/admin/templates/site_settings.js.handlebars

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<div class='admin-controls'>
22
<div class='search controls'>
3-
<label>
4-
{{input type="checkbox" checked=onlyOverridden}}
5-
{{i18n admin.site_settings.show_overriden}}
6-
</label>
3+
<label>
4+
{{input type="checkbox" checked=onlyOverridden}}
5+
{{i18n admin.site_settings.show_overriden}}
6+
</label>
77
</div>
88
<div class='controls'>
99
{{textField value=filter placeholderKey="type_to_filter"}}
@@ -12,7 +12,7 @@
1212

1313
<ul class="nav nav-pills">
1414
{{#each category in controller}}
15-
<li>{{#link-to 'adminSiteSettingsCategory' category.nameKey}}{{category.name}}{{/link-to}}</a></li>
15+
<li>{{#link-to 'adminSiteSettingsCategory' category.nameKey}}{{category.name}}{{/link-to}}</li>
1616
{{/each}}
1717
</ul>
1818

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{{collection contentBinding="content" classNames="form-horizontal settings" itemViewClass="Discourse.SiteSettingView"}}
1+
{{collection contentBinding="filteredContent" classNames="form-horizontal settings" itemViewClass="Discourse.SiteSettingView"}}

config/locales/client.en.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1418,7 +1418,7 @@ en:
14181418
reset: 'reset to default'
14191419
none: 'none'
14201420
categories:
1421-
mandatory: 'Mandatory'
1421+
required: 'Required'
14221422
users: 'Users'
14231423
posting: 'Posting'
14241424
email: 'Email'

config/site_settings.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
mandatory:
1+
required:
22
title:
33
client: true
44
default: 'Discourse'
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
module("Discourse.AdminSiteSettingsController");
2+
3+
test("filter", function() {
4+
var allSettings = Em.A([Ember.Object.create({
5+
nameKey: 'users', name: 'users',
6+
siteSettings: [Discourse.SiteSetting.create({"setting":"username_change_period","description":"x","default":3,"type":"fixnum","value":"3","category":"users"})]
7+
}), Ember.Object.create({
8+
nameKey: 'posting', name: 'posting',
9+
siteSettings: [Discourse.SiteSetting.create({"setting":"display_name_on_posts","description":"x","default":false,"type":"bool","value":"true","category":"posting"})]
10+
})]);
11+
var adminSiteSettingsController = testController(Discourse.AdminSiteSettingsController, allSettings);
12+
adminSiteSettingsController.set('allSiteSettings', allSettings);
13+
14+
equal(adminSiteSettingsController.get('content')[0].nameKey, 'users', "Can get first site setting category's name key.");
15+
16+
adminSiteSettingsController.set('filter', 'username_change');
17+
equal(adminSiteSettingsController.get('content').length, 1, "a. Filter with one match for username_change");
18+
equal(adminSiteSettingsController.get('content')[0].nameKey, "users", "b. Filter with one match for username_change");
19+
equal(adminSiteSettingsController.get('content')[0].siteSettings[0].setting, "username_change_period", "c. Filter with one match for username_change");
20+
21+
adminSiteSettingsController.set('filter', 'name_on');
22+
equal(adminSiteSettingsController.get('content').length, 1, "a. Filter with one match for name_on");
23+
equal(adminSiteSettingsController.get('content')[0].nameKey, "posting", "b. Filter with one match for name_on");
24+
equal(adminSiteSettingsController.get('content')[0].siteSettings[0].setting, "display_name_on_posts", "c. Filter with one match for name_on");
25+
26+
adminSiteSettingsController.set('filter', 'name');
27+
equal(adminSiteSettingsController.get('content').length, 2, "a. Filter with one match for name");
28+
equal(adminSiteSettingsController.get('content')[0].nameKey, "users", "b. Filter with one match for name");
29+
equal(adminSiteSettingsController.get('content')[1].nameKey, "posting", "c. Filter with one match for name");
30+
equal(adminSiteSettingsController.get('content')[0].siteSettings[0].setting, "username_change_period", "d. Filter with one match for name");
31+
equal(adminSiteSettingsController.get('content')[1].siteSettings[0].setting, "display_name_on_posts", "d. Filter with one match for name");
32+
33+
adminSiteSettingsController.set('filter', '');
34+
adminSiteSettingsController.set('onlyOverridden', true);
35+
equal(adminSiteSettingsController.get('content').length, 1, "a. onlyOverridden with one match");
36+
equal(adminSiteSettingsController.get('content')[0].nameKey, "posting", "b. onlyOverridden with one match");
37+
equal(adminSiteSettingsController.get('content')[0].siteSettings[0].setting, "display_name_on_posts", "c. onlyOverridden with one match");
38+
39+
});

0 commit comments

Comments
 (0)