mirror of
https://github.com/discourse/discourse.git
synced 2025-05-22 07:53:49 +08:00
Remove admin group management pages.
This commit is contained in:
@ -1,110 +0,0 @@
|
||||
import { popupAjaxError } from 'discourse/lib/ajax-error';
|
||||
import computed from 'ember-addons/ember-computed-decorators';
|
||||
|
||||
export default Ember.Controller.extend({
|
||||
adminGroupsType: Ember.inject.controller(),
|
||||
disableSave: false,
|
||||
savingStatus: '',
|
||||
|
||||
aliasLevelOptions: function() {
|
||||
return [
|
||||
{ name: I18n.t("groups.alias_levels.nobody"), value: 0 },
|
||||
{ name: I18n.t("groups.alias_levels.mods_and_admins"), value: 2 },
|
||||
{ name: I18n.t("groups.alias_levels.members_mods_and_admins"), value: 3 },
|
||||
{ name: I18n.t("groups.alias_levels.everyone"), value: 99 }
|
||||
];
|
||||
}.property(),
|
||||
|
||||
visibilityLevelOptions: function() {
|
||||
return [
|
||||
{ name: I18n.t("groups.visibility_levels.public"), value: 0 },
|
||||
{ name: I18n.t("groups.visibility_levels.members"), value: 1 },
|
||||
{ name: I18n.t("groups.visibility_levels.staff"), value: 2 },
|
||||
{ name: I18n.t("groups.visibility_levels.owners"), value: 3 }
|
||||
];
|
||||
}.property(),
|
||||
|
||||
trustLevelOptions: function() {
|
||||
return [
|
||||
{ name: I18n.t("groups.trust_levels.none"), value: 0 },
|
||||
{ name: 1, value: 1 }, { name: 2, value: 2 }, { name: 3, value: 3 }, { name: 4, value: 4 }
|
||||
];
|
||||
}.property(),
|
||||
|
||||
@computed('model.visibility_level', 'model.public_admission')
|
||||
disableMembershipRequestSetting(visibility_level, publicAdmission) {
|
||||
visibility_level = parseInt(visibility_level);
|
||||
return (visibility_level !== 0) || publicAdmission;
|
||||
},
|
||||
|
||||
@computed('model.visibility_level', 'model.allow_membership_requests')
|
||||
disablePublicSetting(visibility_level, allowMembershipRequests) {
|
||||
visibility_level = parseInt(visibility_level);
|
||||
return (visibility_level !== 0) || allowMembershipRequests;
|
||||
},
|
||||
|
||||
actions: {
|
||||
removeOwner(member) {
|
||||
const self = this,
|
||||
message = I18n.t("admin.groups.delete_owner_confirm", { username: member.get("username"), group: this.get("model.name") });
|
||||
return bootbox.confirm(message, I18n.t("no_value"), I18n.t("yes_value"), function(confirm) {
|
||||
if (confirm) {
|
||||
self.get("model").removeOwner(member);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
addOwners() {
|
||||
if (Em.isEmpty(this.get("model.ownerUsernames"))) { return; }
|
||||
this.get("model").addOwners(this.get("model.ownerUsernames")).catch(popupAjaxError);
|
||||
this.set("model.ownerUsernames", null);
|
||||
},
|
||||
|
||||
save() {
|
||||
const group = this.get('model'),
|
||||
groupsController = this.get("adminGroupsType"),
|
||||
groupType = groupsController.get("type");
|
||||
|
||||
this.set('disableSave', true);
|
||||
this.set('savingStatus', I18n.t('saving'));
|
||||
|
||||
let promise = group.get("id") ? group.save() : group.create().then(() => groupsController.get('model').addObject(group));
|
||||
|
||||
promise.then(() => {
|
||||
this.transitionToRoute("adminGroup", groupType, group.get('name'));
|
||||
this.set('savingStatus', I18n.t('saved'));
|
||||
}).catch(popupAjaxError)
|
||||
.finally(() => this.set('disableSave', false));
|
||||
},
|
||||
|
||||
destroy() {
|
||||
const group = this.get('model'),
|
||||
groupsController = this.get('adminGroupsType'),
|
||||
self = this;
|
||||
|
||||
if (!group.get('id')) {
|
||||
self.transitionToRoute('adminGroupsType.index', 'custom');
|
||||
return;
|
||||
}
|
||||
|
||||
this.set('disableSave', true);
|
||||
|
||||
bootbox.confirm(
|
||||
I18n.t("admin.groups.delete_confirm"),
|
||||
I18n.t("no_value"),
|
||||
I18n.t("yes_value"),
|
||||
function(confirmed) {
|
||||
if (confirmed) {
|
||||
group.destroy().then(() => {
|
||||
groupsController.get('model').removeObject(group);
|
||||
self.transitionToRoute('adminGroups.index');
|
||||
}).catch(() => bootbox.alert(I18n.t("admin.groups.delete_failed")))
|
||||
.finally(() => self.set('disableSave', false));
|
||||
} else {
|
||||
self.set('disableSave', false);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
@ -1,4 +0,0 @@
|
||||
export default Ember.Controller.extend({
|
||||
adminGroupsBulk: Ember.inject.controller(),
|
||||
bulkAddResponse: Ember.computed.alias('adminGroupsBulk.bulkAddResponse')
|
||||
});
|
@ -1,37 +0,0 @@
|
||||
import { ajax } from 'discourse/lib/ajax';
|
||||
import computed from 'ember-addons/ember-computed-decorators';
|
||||
import { popupAjaxError } from 'discourse/lib/ajax-error';
|
||||
|
||||
export default Ember.Controller.extend({
|
||||
users: null,
|
||||
groupId: null,
|
||||
saving: false,
|
||||
bulkAddResponse: null,
|
||||
|
||||
@computed('saving', 'users', 'groupId')
|
||||
buttonDisabled(saving, users, groupId) {
|
||||
return saving || !groupId || !users || !users.length;
|
||||
},
|
||||
|
||||
actions: {
|
||||
addToGroup() {
|
||||
if (this.get('saving')) { return; }
|
||||
|
||||
const users = this.get('users').split("\n")
|
||||
.uniq()
|
||||
.reject(x => x.length === 0);
|
||||
|
||||
this.set('saving', true);
|
||||
ajax('/admin/groups/bulk', {
|
||||
data: { users, group_id: this.get('groupId') },
|
||||
method: 'PUT'
|
||||
}).then(result => {
|
||||
this.set('bulkAddResponse', result);
|
||||
this.transitionToRoute('adminGroups.bulkComplete');
|
||||
}).catch(popupAjaxError).finally(() => {
|
||||
this.set('saving', false);
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
});
|
@ -1,11 +0,0 @@
|
||||
import computed from 'ember-addons/ember-computed-decorators';
|
||||
|
||||
export default Ember.Controller.extend({
|
||||
adminGroupsType: Ember.inject.controller(),
|
||||
sortedGroups: Ember.computed.alias("adminGroupsType.sortedGroups"),
|
||||
|
||||
@computed("sortedGroups")
|
||||
messageKey(sortedGroups) {
|
||||
return `admin.groups.${sortedGroups.length > 0 ? 'none_selected' : 'no_custom_groups'}`;
|
||||
}
|
||||
});
|
@ -1,20 +0,0 @@
|
||||
import { ajax } from 'discourse/lib/ajax';
|
||||
export default Ember.Controller.extend({
|
||||
sortedGroups: Ember.computed.sort('model', 'groupSorting'),
|
||||
groupSorting: ['name'],
|
||||
|
||||
refreshingAutoGroups: false,
|
||||
|
||||
isAuto: Ember.computed.equal('type', 'automatic'),
|
||||
|
||||
actions: {
|
||||
refreshAutoGroups() {
|
||||
this.set('refreshingAutoGroups', true);
|
||||
ajax('/admin/groups/refresh_automatic_groups', {type: 'POST'}).then(() => {
|
||||
this.transitionToRoute("adminGroupsType", "automatic").then(() => {
|
||||
this.set('refreshingAutoGroups', false);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
@ -1,24 +0,0 @@
|
||||
import Group from 'discourse/models/group';
|
||||
|
||||
export default Discourse.Route.extend({
|
||||
|
||||
model(params) {
|
||||
if (params.name === 'new') {
|
||||
return Group.create({ automatic: false, visibility_level: 0 });
|
||||
}
|
||||
|
||||
const group = this.modelFor('adminGroupsType').findBy('name', params.name);
|
||||
|
||||
if (!group) { return this.transitionTo('adminGroups.index'); }
|
||||
|
||||
return group;
|
||||
},
|
||||
|
||||
setupController(controller, model) {
|
||||
controller.set("model", model);
|
||||
controller.set("model.usernames", null);
|
||||
controller.set("savingStatus", "");
|
||||
model.findMembers();
|
||||
}
|
||||
|
||||
});
|
@ -1,13 +0,0 @@
|
||||
import Group from 'discourse/models/group';
|
||||
|
||||
export default Ember.Route.extend({
|
||||
model() {
|
||||
return Group.findAll().then(groups => {
|
||||
return groups.filter(g => !g.get('automatic'));
|
||||
});
|
||||
},
|
||||
|
||||
setupController(controller, groups) {
|
||||
controller.setProperties({ groups, groupId: null, users: null });
|
||||
}
|
||||
});
|
@ -1,5 +0,0 @@
|
||||
export default Discourse.Route.extend({
|
||||
redirect: function() {
|
||||
this.transitionTo("adminGroupsType", "custom");
|
||||
}
|
||||
});
|
@ -1,15 +0,0 @@
|
||||
import Group from 'discourse/models/group';
|
||||
|
||||
export default Discourse.Route.extend({
|
||||
model(params) {
|
||||
this.set("type", params.type);
|
||||
return Group.findAll().then(function(groups) {
|
||||
return groups.filterBy("type", params.type);
|
||||
});
|
||||
},
|
||||
|
||||
setupController(controller, model){
|
||||
controller.set("type", this.get("type"));
|
||||
controller.set("model", model);
|
||||
}
|
||||
});
|
@ -76,14 +76,6 @@ export default function() {
|
||||
});
|
||||
});
|
||||
|
||||
this.route('adminGroups', { path: '/groups', resetNamespace: true }, function() {
|
||||
this.route('bulk');
|
||||
this.route('bulkComplete', { path: 'bulk-complete' });
|
||||
this.route('adminGroupsType', { path: '/:type', resetNamespace: true }, function() {
|
||||
this.route('adminGroup', { path: '/:name', resetNamespace: true });
|
||||
});
|
||||
});
|
||||
|
||||
this.route('adminUsers', { path: '/users', resetNamespace: true }, function() {
|
||||
this.route('adminUser', { path: '/:user_id/:username', resetNamespace: true }, function() {
|
||||
this.route('badges');
|
||||
|
@ -12,7 +12,6 @@
|
||||
{{nav-item route='adminBadges' label='admin.badges.title'}}
|
||||
{{/if}}
|
||||
{{#if currentUser.admin}}
|
||||
{{nav-item route='adminGroups' label='admin.groups.title'}}
|
||||
{{nav-item route='adminEmail' label='admin.email.title'}}
|
||||
{{/if}}
|
||||
{{nav-item route='adminFlags' label='admin.flags.title'}}
|
||||
|
@ -1,173 +0,0 @@
|
||||
<form class="form-horizontal">
|
||||
|
||||
<div>
|
||||
{{#if model.automatic}}
|
||||
<h3>{{model.name}}</h3>
|
||||
{{else}}
|
||||
<label for="name">{{i18n 'groups.name'}}</label>
|
||||
{{text-field name="name" value=model.name placeholderKey="groups.name_placeholder"}}
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
{{#unless model.automatic}}
|
||||
<div>
|
||||
<label for='full_name'>{{i18n 'groups.manage.full_name'}}</label>
|
||||
{{input type='text' name='full_name' value=model.full_name class='group-manage-full-name'}}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label for="bio">{{i18n 'groups.bio'}}</label>
|
||||
{{d-editor value=model.bio_raw}}
|
||||
</div>
|
||||
|
||||
{{#if model.hasOwners}}
|
||||
<div>
|
||||
<label for='owner-list'>{{i18n 'admin.groups.group_owners'}}</label>
|
||||
<div class="ac-wrap clearfix" id='owner-list'>
|
||||
{{#each model.owners as |member|}}
|
||||
{{group-member member=member removeAction="removeOwner"}}
|
||||
{{/each}}
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
<div>
|
||||
<label for="owner-selector">{{i18n 'admin.groups.add_owners'}}</label>
|
||||
|
||||
{{user-selector usernames=model.ownerUsernames
|
||||
placeholderKey="groups.selector_placeholder"
|
||||
id="owner-selector"}}
|
||||
|
||||
{{#if model.id}}
|
||||
{{d-button
|
||||
action="addOwners"
|
||||
class="add"
|
||||
icon="plus"
|
||||
label="admin.groups.add"}}
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/unless}}
|
||||
|
||||
<div>
|
||||
{{group-members-input model=model addButton=model.id}}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label for="visiblity">{{i18n 'groups.visibility_levels.title'}}</label>
|
||||
{{combo-box name="alias"
|
||||
valueAttribute="value"
|
||||
value=model.visibility_level
|
||||
content=visibilityLevelOptions
|
||||
castInteger=true}}
|
||||
</div>
|
||||
|
||||
{{#unless model.automatic}}
|
||||
<div>
|
||||
<label>
|
||||
{{input type="checkbox"
|
||||
checked=model.public_admission
|
||||
disabled=disablePublicSetting}}
|
||||
|
||||
{{i18n 'groups.public_admission'}}
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label>
|
||||
{{input type='checkbox'
|
||||
checked=model.public_exit}}
|
||||
|
||||
{{i18n 'groups.public_exit'}}
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label>
|
||||
{{input type="checkbox"
|
||||
checked=model.allow_membership_requests
|
||||
disabled=disableMembershipRequestSetting}}
|
||||
|
||||
{{i18n 'groups.allow_membership_requests'}}
|
||||
</label>
|
||||
</div>
|
||||
|
||||
{{#if model.allow_membership_requests}}
|
||||
<div>
|
||||
<label for="membership-request-template">
|
||||
{{i18n 'groups.membership_request_template'}}
|
||||
</label>
|
||||
|
||||
{{expanding-text-area name="membership-request-template"
|
||||
value=model.membership_request_template}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
<div>
|
||||
<label>
|
||||
{{input type="checkbox" checked=model.primary_group}}
|
||||
{{i18n 'admin.groups.primary_group'}}
|
||||
</label>
|
||||
</div>
|
||||
{{/unless}}
|
||||
|
||||
<div>
|
||||
<label for="alias">{{i18n 'groups.alias_levels.mentionable'}}</label>
|
||||
{{combo-box name="alias" valueAttribute="value" value=model.mentionable_level content=aliasLevelOptions}}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label for="alias">{{i18n 'groups.alias_levels.messageable'}}</label>
|
||||
{{combo-box name="alias" valueAttribute="value" value=model.messageable_level content=aliasLevelOptions}}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label>{{i18n 'groups.notification_level'}}</label>
|
||||
{{notifications-button i18nPrefix='groups.notifications' value=model.default_notification_level}}
|
||||
<div class='clearfix'></div>
|
||||
</div>
|
||||
|
||||
{{#unless model.automatic}}
|
||||
<div>
|
||||
<label for="automatic_membership">{{i18n 'admin.groups.automatic_membership_email_domains'}}</label>
|
||||
{{list-setting name="automatic_membership" settingValue=model.emailDomains}}
|
||||
<label>
|
||||
{{input type="checkbox" checked=model.automatic_membership_retroactive}}
|
||||
{{i18n 'admin.groups.automatic_membership_retroactive'}}
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label for="title">
|
||||
{{i18n 'admin.groups.default_title'}}
|
||||
</label>
|
||||
{{input value=model.title}}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label for="grant_trust_level">{{i18n 'groups.trust_levels.title'}}</label>
|
||||
{{combo-box name="grant_trust_level" valueAttribute="value" value=model.grant_trust_level content=trustLevelOptions}}
|
||||
</div>
|
||||
|
||||
{{#if siteSettings.email_in}}
|
||||
<label for="incoming_email">{{i18n 'admin.groups.incoming_email'}}</label>
|
||||
{{text-field name="incoming_email" value=model.incoming_email placeholderKey="admin.groups.incoming_email_placeholder"}}
|
||||
{{plugin-outlet name="group-email-in" args=(hash model=model)}}
|
||||
{{/if}}
|
||||
{{/unless}}
|
||||
|
||||
{{#unless model.automatic}}
|
||||
{{group-flair-inputs model=model}}
|
||||
{{/unless}}
|
||||
|
||||
{{plugin-outlet name="group-edit" args=(hash group=model)}}
|
||||
|
||||
<div class='buttons'>
|
||||
<button {{action "save"}} disabled={{disableSave}} class='btn btn-primary'>{{i18n 'admin.customize.save'}}</button>
|
||||
{{#unless model.automatic}}
|
||||
<button {{action "destroy"}} class='btn btn-danger'>{{d-icon "trash-o"}}{{i18n 'admin.customize.delete'}}</button>
|
||||
{{/unless}}
|
||||
|
||||
<span class="saving {{unless savingStatus 'hidden'}}">{{savingStatus}}</span>
|
||||
</div>
|
||||
|
||||
</form>
|
@ -1,11 +0,0 @@
|
||||
{{#if bulkAddResponse}}
|
||||
<p>{{{bulkAddResponse.message}}}</p>
|
||||
{{#if bulkAddResponse.users_not_added}}
|
||||
<p>{{i18n "admin.groups.bulk_complete_users_not_added"}}</p>
|
||||
{{#each bulkAddResponse.users_not_added as |user|}}
|
||||
{{user}}<br/>
|
||||
{{/each}}
|
||||
{{/if}}
|
||||
{{else}}
|
||||
<p>{{i18n "admin.groups.bulk_complete"}}</p>
|
||||
{{/if}}
|
@ -1,19 +0,0 @@
|
||||
<div class='groups-bulk'>
|
||||
<p>{{i18n "admin.groups.bulk_paste"}}</p>
|
||||
|
||||
<div class='control'>
|
||||
{{textarea value=users class="paste-users"}}
|
||||
</div>
|
||||
|
||||
<div class='control'>
|
||||
{{combo-box filterable=true content=groups value=groupId none="admin.groups.bulk_select"}}
|
||||
</div>
|
||||
|
||||
<div class='control'>
|
||||
{{d-button disabled=buttonDisabled
|
||||
class="btn-primary"
|
||||
action="addToGroup"
|
||||
icon="plus"
|
||||
label="admin.groups.bulk"}}
|
||||
</div>
|
||||
</div>
|
@ -1,9 +0,0 @@
|
||||
<div class="groups-type-index">
|
||||
<p>{{i18n messageKey}}</p>
|
||||
|
||||
<div>
|
||||
{{#link-to 'adminGroup' 'new' class="btn"}}
|
||||
{{d-icon "plus"}} {{i18n 'admin.groups.new'}}
|
||||
{{/link-to}}
|
||||
</div>
|
||||
</div>
|
@ -1,31 +0,0 @@
|
||||
<div class='row groups'>
|
||||
{{#if sortedGroups}}
|
||||
<div class='content-list'>
|
||||
<h3>{{i18n 'admin.groups.edit'}}</h3>
|
||||
<ul>
|
||||
{{#each sortedGroups as |group|}}
|
||||
<li>
|
||||
{{#link-to "adminGroup" group.type group.name}}{{group.name}}
|
||||
{{#if group.userCountDisplay}}
|
||||
<span class="count">{{number group.userCountDisplay}}</span>
|
||||
{{/if}}
|
||||
{{/link-to}}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
<div class='controls'>
|
||||
{{#if isAuto}}
|
||||
{{d-button action="refreshAutoGroups" icon="refresh" label="admin.groups.refresh" disabled=refreshingAutoGroups}}
|
||||
{{else}}
|
||||
{{#link-to 'adminGroup' 'new' class="btn"}}
|
||||
{{d-icon "plus"}} {{i18n 'admin.groups.new'}}
|
||||
{{/link-to}}
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="content-body">
|
||||
{{outlet}}
|
||||
</div>
|
||||
</div>
|
@ -1,9 +0,0 @@
|
||||
{{#admin-nav}}
|
||||
{{nav-item route='adminGroupsType' routeParam='custom' label='admin.groups.custom'}}
|
||||
{{nav-item route='adminGroupsType' routeParam='automatic' label='admin.groups.automatic'}}
|
||||
{{nav-item route='adminGroups.bulk' label='admin.groups.bulk'}}
|
||||
{{/admin-nav}}
|
||||
|
||||
<div class="admin-container">
|
||||
{{outlet}}
|
||||
</div>
|
@ -0,0 +1,45 @@
|
||||
import computed from 'ember-addons/ember-computed-decorators';
|
||||
import { extractError } from 'discourse/lib/ajax-error';
|
||||
import ModalFunctionality from 'discourse/mixins/modal-functionality';
|
||||
import { ajax } from 'discourse/lib/ajax';
|
||||
|
||||
export default Ember.Controller.extend(ModalFunctionality, {
|
||||
loading: false,
|
||||
|
||||
@computed('input', 'loading', 'result')
|
||||
disableAddButton(input, loading, result) {
|
||||
return loading || Ember.isEmpty(input) || (input.length <= 0) || result;
|
||||
},
|
||||
|
||||
actions: {
|
||||
cancel() {
|
||||
this.set('result', null);
|
||||
},
|
||||
|
||||
add() {
|
||||
this.setProperties({
|
||||
loading: true,
|
||||
result: null,
|
||||
});
|
||||
|
||||
const users = this.get('input').split("\n")
|
||||
.uniq()
|
||||
.reject(x => x.length === 0);
|
||||
|
||||
ajax('/admin/groups/bulk', {
|
||||
data: { users, group_id: this.get('model.id') },
|
||||
method: 'PUT'
|
||||
}).then(result => {
|
||||
this.set('result', result);
|
||||
|
||||
if (result.users_not_added) {
|
||||
this.set('result.invalidUsers', result.users_not_added.join(", "));
|
||||
}
|
||||
}).catch(error => {
|
||||
this.flash(extractError(error), 'error');
|
||||
}).finally(() => {
|
||||
this.set('loading', false);
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
@ -2,6 +2,7 @@ import { default as computed } from 'ember-addons/ember-computed-decorators';
|
||||
|
||||
export default Ember.Controller.extend({
|
||||
application: Ember.inject.controller(),
|
||||
destroying: null,
|
||||
|
||||
@computed("model.automatic")
|
||||
tabs(automatic) {
|
||||
@ -22,4 +23,27 @@ export default Ember.Controller.extend({
|
||||
|
||||
return defaultTabs;
|
||||
},
|
||||
|
||||
actions: {
|
||||
destroy() {
|
||||
const group = this.get('model');
|
||||
this.set('destroying', true);
|
||||
|
||||
bootbox.confirm(
|
||||
I18n.t("admin.groups.delete_confirm"),
|
||||
I18n.t("no_value"),
|
||||
I18n.t("yes_value"),
|
||||
confirmed => {
|
||||
if (confirmed) {
|
||||
group.destroy().then(() => {
|
||||
self.transitionToRoute('groups.index');
|
||||
}).catch(() => bootbox.alert(I18n.t("admin.groups.delete_failed")))
|
||||
.finally(() => this.set('destroying', false));
|
||||
} else {
|
||||
this.set('destroying', false);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -190,10 +190,7 @@ const Group = RestModel.extend({
|
||||
},
|
||||
|
||||
save() {
|
||||
const id = this.get('id');
|
||||
const url = this.get('is_group_owner') ? `/groups/${id}` : `/admin/groups/${id}`;
|
||||
|
||||
return ajax(url, {
|
||||
return ajax(`/groups/${this.get('id')}`, {
|
||||
type: "PUT",
|
||||
data: { group: this.asJSON() }
|
||||
});
|
||||
|
@ -26,6 +26,10 @@ export default Discourse.Route.extend({
|
||||
showModal('group-add-members', { model: this.modelFor('group') });
|
||||
},
|
||||
|
||||
showBulkAddModal() {
|
||||
showModal('group-bulk-add', { model: this.modelFor('group') });
|
||||
},
|
||||
|
||||
didTransition() {
|
||||
this.controllerFor("group-index").set("filterInput", this._params.filter);
|
||||
return true;
|
||||
|
@ -3,10 +3,9 @@
|
||||
class="group-username-filter no-blur"}}
|
||||
|
||||
{{#if canManageGroup}}
|
||||
{{d-button action='showAddMembersModal'
|
||||
icon="plus"
|
||||
label="groups.add_members.title"
|
||||
class="btn btn-primary pull-right"}}
|
||||
{{group-members-dropdown
|
||||
showAddMembersModal="showAddMembersModal"
|
||||
showBulkAddModal="showBulkAddModal"}}
|
||||
{{/if}}
|
||||
|
||||
{{#if hasMembers}}
|
||||
|
@ -7,6 +7,14 @@
|
||||
{{/link-to}}
|
||||
</li>
|
||||
{{/each}}
|
||||
|
||||
<li>
|
||||
{{d-button action="destroy"
|
||||
disabled=destroying
|
||||
icon="trash"
|
||||
class='btn-danger'
|
||||
label="admin.groups.delete"}}
|
||||
</li>
|
||||
{{/mobile-nav}}
|
||||
|
||||
<div class="{{if site.mobileView "" "pull-left"}} group-manage-outlet">
|
||||
|
@ -15,7 +15,10 @@
|
||||
{{#if currentUser.admin}}
|
||||
<div class="control-group group-add-members-make-owner">
|
||||
<label>
|
||||
{{input type="checkbox" class="inline" checked=setAsOwner}}
|
||||
{{input type="checkbox"
|
||||
class="inline"
|
||||
checked=setAsOwner
|
||||
disabled=bulkAdd}}
|
||||
{{i18n "admin.groups.add_members.as_owner"}}
|
||||
</label>
|
||||
</div>
|
||||
|
@ -0,0 +1,38 @@
|
||||
{{#d-modal-body title="admin.groups.bulk_add.title"}}
|
||||
{{#if result}}
|
||||
{{#if result.message}}
|
||||
<div class="alert alert-success">
|
||||
{{result.message}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if result.invalidUsers}}
|
||||
<div class="alert alert-error">
|
||||
{{i18n "admin.groups.bulk_add.complete_users_not_added"}}
|
||||
{{result.invalidUsers}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="">
|
||||
<a {{action 'cancel'}}>{{i18n 'cancel'}}</a>
|
||||
</div>
|
||||
{{else}}
|
||||
<form class="form-vertical group-bulk-add">
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
{{i18n "admin.groups.bulk_add.paste"}}
|
||||
</label>
|
||||
|
||||
{{textarea value=input}}
|
||||
</div>
|
||||
</form>
|
||||
{{/if}}
|
||||
{{/d-modal-body}}
|
||||
|
||||
<div class="modal-footer">
|
||||
{{d-button action="add"
|
||||
class="add btn-primary"
|
||||
icon="plus"
|
||||
disabled=disableAddButton
|
||||
label="groups.add"}}
|
||||
</div>
|
@ -0,0 +1,33 @@
|
||||
import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box";
|
||||
|
||||
export default DropdownSelectBoxComponent.extend({
|
||||
classNames: "group-members-dropdown",
|
||||
headerIcon: ["bars", "caret-down"],
|
||||
showFullTitle: false,
|
||||
allowInitialValueMutation: false,
|
||||
autoHighlight() {},
|
||||
|
||||
computeContent() {
|
||||
const items = [
|
||||
{
|
||||
id: "showAddMembersModal",
|
||||
name: I18n.t("groups.add_members.title"),
|
||||
icon: "user-plus"
|
||||
}
|
||||
];
|
||||
|
||||
if (this.currentUser.admin) {
|
||||
items.push({
|
||||
id: "showBulkAddModal",
|
||||
name: I18n.t("admin.groups.bulk_add.title"),
|
||||
icon: "users"
|
||||
});
|
||||
}
|
||||
|
||||
return items;
|
||||
},
|
||||
|
||||
mutateValue(value) {
|
||||
this.sendAction(value);
|
||||
}
|
||||
});
|
@ -1,108 +1,45 @@
|
||||
class Admin::GroupsController < Admin::AdminController
|
||||
def index
|
||||
groups = Group.order(:name).where("groups.id <> ?", Group::AUTO_GROUPS[:everyone])
|
||||
|
||||
if search = params[:search].to_s
|
||||
groups = groups.where("name ILIKE ?", "%#{search}%")
|
||||
end
|
||||
|
||||
if params[:ignore_automatic].to_s == "true"
|
||||
groups = groups.where(automatic: false)
|
||||
end
|
||||
|
||||
render_serialized(groups, BasicGroupSerializer)
|
||||
end
|
||||
|
||||
def show
|
||||
render body: nil
|
||||
end
|
||||
|
||||
def bulk
|
||||
render body: nil
|
||||
end
|
||||
|
||||
def bulk_perform
|
||||
group = Group.find(params[:group_id].to_i)
|
||||
group = Group.find_by(id: params[:group_id].to_i)
|
||||
raise Discourse::NotFound unless group
|
||||
users_added = 0
|
||||
if group.present?
|
||||
users = (params[:users] || []).map { |u| u.downcase }
|
||||
|
||||
users = (params[:users] || []).map { |user| user.downcase!; user }
|
||||
valid_emails = {}
|
||||
valid_usernames = {}
|
||||
|
||||
valid_users = User.joins(:user_emails)
|
||||
.where("username_lower IN (:users) OR user_emails.email IN (:users)", users: users)
|
||||
.where("username_lower IN (:users) OR lower(user_emails.email) IN (:users)", users: users)
|
||||
.pluck(:id, :username_lower, :"user_emails.email")
|
||||
|
||||
valid_users.map! do |id, username_lower, email|
|
||||
valid_emails[email] = valid_usernames[username_lower] = id
|
||||
id
|
||||
end
|
||||
|
||||
valid_users.uniq!
|
||||
invalid_users = users.reject! { |u| valid_emails[u] || valid_usernames[u] }
|
||||
invalid_users = users.reject { |u| valid_emails[u] || valid_usernames[u] }
|
||||
group.bulk_add(valid_users) if valid_users.present?
|
||||
users_added = valid_users.count
|
||||
|
||||
response = success_json.merge(users_not_added: invalid_users)
|
||||
|
||||
if users_added > 0
|
||||
response[:message] = I18n.t('groups.success.bulk_add', count: users_added)
|
||||
end
|
||||
|
||||
render json: { success: true, message: I18n.t('groups.success.bulk_add', users_added: users_added), users_not_added: invalid_users }
|
||||
render json: response
|
||||
end
|
||||
|
||||
def create
|
||||
save_group(Group.new)
|
||||
end
|
||||
attributes = group_params.to_h.except(:owner_usernames, :usernames)
|
||||
group = Group.new(attributes)
|
||||
|
||||
def update
|
||||
group = Group.find(params[:id])
|
||||
|
||||
# group rename is ignored for automatic groups
|
||||
group.name = group_params[:name] if group_params[:name] && !group.automatic
|
||||
save_group(group) do |group|
|
||||
GroupActionLogger.new(current_user, group).log_change_group_settings
|
||||
DiscourseEvent.trigger(:group_updated, group)
|
||||
end
|
||||
end
|
||||
|
||||
def save_group(group)
|
||||
group.name = group_params[:name] if group_params[:name].present? && !group.automatic
|
||||
group.mentionable_level = group_params[:mentionable_level].to_i if group_params[:mentionable_level].present?
|
||||
group.messageable_level = group_params[:messageable_level].to_i if group_params[:messageable_level].present?
|
||||
|
||||
if group_params[:visibility_level]
|
||||
group.visibility_level = group_params[:visibility_level]
|
||||
end
|
||||
|
||||
grant_trust_level = group_params[:grant_trust_level].to_i
|
||||
group.grant_trust_level = (grant_trust_level > 0 && grant_trust_level <= 4) ? grant_trust_level : nil
|
||||
|
||||
group.automatic_membership_email_domains = group_params[:automatic_membership_email_domains] unless group.automatic
|
||||
group.automatic_membership_retroactive = group_params[:automatic_membership_retroactive] == "true" unless group.automatic
|
||||
|
||||
group.primary_group = group.automatic ? false : group_params["primary_group"] == "true"
|
||||
|
||||
group.incoming_email = group.automatic ? nil : group_params[:incoming_email]
|
||||
|
||||
title = group_params[:title] if group_params[:title].present?
|
||||
group.title = group.automatic ? nil : title
|
||||
|
||||
group.flair_url = group_params[:flair_url].presence
|
||||
group.flair_bg_color = group_params[:flair_bg_color].presence
|
||||
group.flair_color = group_params[:flair_color].presence
|
||||
|
||||
%i{public_admission public_exit}.each do |key|
|
||||
if group_params[key]
|
||||
group.public_send("#{key}=", group_params[key])
|
||||
end
|
||||
end
|
||||
|
||||
group.bio_raw = group_params[:bio_raw] if group_params[:bio_raw]
|
||||
group.full_name = group_params[:full_name] if group_params[:full_name]
|
||||
|
||||
if group_params.key?(:default_notification_level)
|
||||
group.default_notification_level = group_params[:default_notification_level]
|
||||
end
|
||||
|
||||
if group_params[:allow_membership_requests]
|
||||
group.allow_membership_requests = group_params[:allow_membership_requests]
|
||||
group.membership_request_template = group_params[:membership_request_template]
|
||||
unless group_params[:allow_membership_requests]
|
||||
group.membership_request_template = nil
|
||||
end
|
||||
|
||||
if group_params[:owner_usernames].present?
|
||||
@ -126,9 +63,6 @@ class Admin::GroupsController < Admin::AdminController
|
||||
|
||||
if group.save
|
||||
group.restore_user_count!
|
||||
|
||||
yield(group) if block_given?
|
||||
|
||||
render_serialized(group, BasicGroupSerializer)
|
||||
else
|
||||
render_json_error group
|
||||
@ -136,23 +70,21 @@ class Admin::GroupsController < Admin::AdminController
|
||||
end
|
||||
|
||||
def destroy
|
||||
group = Group.find(params[:id])
|
||||
group = Group.find_by(id: params[:id])
|
||||
raise Discourse::NotFound unless group
|
||||
|
||||
if group.automatic
|
||||
can_not_modify_automatic
|
||||
else
|
||||
group.destroy
|
||||
group.destroy!
|
||||
render json: success_json
|
||||
end
|
||||
end
|
||||
|
||||
def refresh_automatic_groups
|
||||
Group.refresh_automatic_groups!
|
||||
render json: success_json
|
||||
end
|
||||
|
||||
def add_owners
|
||||
group = Group.find(params.require(:id))
|
||||
group = Group.find_by(id: params.require(:id))
|
||||
raise Discourse::NotFound unless group
|
||||
|
||||
return can_not_modify_automatic if group.automatic
|
||||
users = User.where(username: group_params[:usernames].split(","))
|
||||
|
||||
@ -173,7 +105,9 @@ class Admin::GroupsController < Admin::AdminController
|
||||
end
|
||||
|
||||
def remove_owner
|
||||
group = Group.find(params.require(:id))
|
||||
group = Group.find_by(params.require(:id))
|
||||
raise Discourse::NotFound unless group
|
||||
|
||||
return can_not_modify_automatic if group.automatic
|
||||
|
||||
user = User.find(params[:user_id].to_i)
|
||||
@ -214,9 +148,9 @@ class Admin::GroupsController < Admin::AdminController
|
||||
:allow_membership_requests,
|
||||
:full_name,
|
||||
:default_notification_level,
|
||||
:usernames,
|
||||
:membership_request_template,
|
||||
:owner_usernames,
|
||||
:membership_request_template
|
||||
:usernames
|
||||
)
|
||||
end
|
||||
end
|
||||
|
@ -304,7 +304,8 @@ class GroupsController < ApplicationController
|
||||
end
|
||||
|
||||
def remove_member
|
||||
group = Group.find(params[:id])
|
||||
group = Group.find_by(id: params[:id])
|
||||
raise Discourse::NotFound unless group
|
||||
group.public_exit ? ensure_logged_in : guardian.ensure_can_edit!(group)
|
||||
|
||||
user =
|
||||
|
@ -48,6 +48,7 @@ class Group < ActiveRecord::Base
|
||||
validate :incoming_email_validator
|
||||
validate :can_allow_membership_requests, if: :allow_membership_requests
|
||||
validates :flair_url, url: true, if: Proc.new { |g| g.flair_url && g.flair_url[0, 3] != 'fa-' }
|
||||
validate :validate_grant_trust_level, if: :will_save_change_to_grant_trust_level?
|
||||
|
||||
AUTO_GROUPS = {
|
||||
everyone: 0,
|
||||
@ -688,6 +689,15 @@ class Group < ActiveRecord::Base
|
||||
|
||||
private
|
||||
|
||||
def validate_grant_trust_level
|
||||
unless TrustLevel.valid?(self.grant_trust_level)
|
||||
self.errors.add(:base, I18n.t(
|
||||
'groups.errors.grant_trust_level_not_valid',
|
||||
trust_level: self.grant_trust_level
|
||||
))
|
||||
end
|
||||
end
|
||||
|
||||
def can_allow_membership_requests
|
||||
valid = true
|
||||
|
||||
|
@ -2842,6 +2842,10 @@ en:
|
||||
available: "Group name is available"
|
||||
not_available: "Group name is not available"
|
||||
blank: "Group name cannot be blank"
|
||||
bulk_add:
|
||||
title: "Bulk Add to Group"
|
||||
complete_users_not_added: "These users were not added (make sure they have an account):"
|
||||
paste: "Paste a list of usernames or emails, one per line:"
|
||||
add_members:
|
||||
as_owner: "Set user(s) as owner(s) of this group"
|
||||
manage:
|
||||
@ -2878,11 +2882,6 @@ en:
|
||||
delete_owner_confirm: "Remove owner privilege for '%{username}'?"
|
||||
add: "Add"
|
||||
custom: "Custom"
|
||||
bulk_complete: "The users have been added to the group."
|
||||
bulk_complete_users_not_added: "These users were not added (make sure they have an account):"
|
||||
bulk: "Bulk Add to Group"
|
||||
bulk_paste: "Paste a list of usernames or emails, one per line:"
|
||||
bulk_select: "(select a group)"
|
||||
automatic: "Automatic"
|
||||
default_title: "Default title for all users in this group"
|
||||
group_owners: Owners
|
||||
|
@ -293,8 +293,11 @@ en:
|
||||
|
||||
groups:
|
||||
success:
|
||||
bulk_add: "%{users_added} users have been added to the group."
|
||||
bulk_add:
|
||||
one: "%{count} user have been added to the group."
|
||||
other: "%{count} users have been added to the group."
|
||||
errors:
|
||||
grant_trust_level_not_valid: "'%{trust_level}' is not a valid trust level."
|
||||
can_not_modify_automatic: "You cannot modify an automatic group"
|
||||
member_already_exist:
|
||||
one: "'%{username}' is already a member of this group."
|
||||
|
@ -77,7 +77,6 @@ Discourse::Application.routes.draw do
|
||||
|
||||
resources :groups, constraints: AdminConstraint.new do
|
||||
collection do
|
||||
post "refresh_automatic_groups" => "groups#refresh_automatic_groups"
|
||||
get 'bulk'
|
||||
get 'bulk-complete' => 'groups#bulk'
|
||||
put 'bulk' => 'groups#bulk_perform'
|
||||
|
@ -1,128 +0,0 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe Admin::GroupsController do
|
||||
let(:user) { Fabricate(:user) }
|
||||
let(:group) { Fabricate(:group) }
|
||||
|
||||
before do
|
||||
@admin = log_in(:admin)
|
||||
end
|
||||
|
||||
it "is a subclass of AdminController" do
|
||||
expect(Admin::GroupsController < Admin::AdminController).to eq(true)
|
||||
end
|
||||
|
||||
context ".bulk" do
|
||||
it "can assign users to a group by email or username" do
|
||||
group = Fabricate(:group, name: "test", primary_group: true, title: 'WAT', grant_trust_level: 3)
|
||||
user = Fabricate(:user, trust_level: 2)
|
||||
user2 = Fabricate(:user, trust_level: 4)
|
||||
|
||||
put :bulk_perform, params: {
|
||||
group_id: group.id, users: [user.username.upcase, user2.email, 'doesnt_exist']
|
||||
}, format: :json
|
||||
|
||||
expect(response).to be_success
|
||||
|
||||
user.reload
|
||||
expect(user.primary_group).to eq(group)
|
||||
expect(user.title).to eq("WAT")
|
||||
expect(user.trust_level).to eq(3)
|
||||
|
||||
user2.reload
|
||||
expect(user2.primary_group).to eq(group)
|
||||
expect(user2.title).to eq("WAT")
|
||||
expect(user2.trust_level).to eq(4)
|
||||
|
||||
# verify JSON response
|
||||
json = ::JSON.parse(response.body)
|
||||
expect(json['message']).to eq("2 users have been added to the group.")
|
||||
expect(json['users_not_added'][0]).to eq("doesnt_exist")
|
||||
end
|
||||
end
|
||||
|
||||
context "#update" do
|
||||
it 'should update a group' do
|
||||
group.add_owner(user)
|
||||
|
||||
expect do
|
||||
put :update, params: {
|
||||
id: group.id,
|
||||
group: {
|
||||
visibility_level: Group.visibility_levels[:owners],
|
||||
allow_membership_requests: "true"
|
||||
}
|
||||
}, format: :json
|
||||
|
||||
end.to change { GroupHistory.count }.by(2)
|
||||
|
||||
expect(response).to be_success
|
||||
|
||||
group.reload
|
||||
|
||||
expect(group.visibility_level).to eq(Group.visibility_levels[:owners])
|
||||
expect(group.allow_membership_requests).to eq(true)
|
||||
end
|
||||
|
||||
it "ignore name change on automatic group" do
|
||||
put :update, params: { id: 1, group: { name: "WAT" } }, format: :json
|
||||
expect(response).to be_success
|
||||
|
||||
group = Group.find(1)
|
||||
expect(group.name).not_to eq("WAT")
|
||||
end
|
||||
|
||||
it "doesn't launch the 'automatic group membership' job when it's not retroactive" do
|
||||
Jobs.expects(:enqueue).never
|
||||
group = Fabricate(:group)
|
||||
|
||||
put :update, params: {
|
||||
id: group.id, group: { automatic_membership_retroactive: "false" }
|
||||
}, format: :json
|
||||
|
||||
expect(response).to be_success
|
||||
end
|
||||
|
||||
it "launches the 'automatic group membership' job when it's retroactive" do
|
||||
group = Fabricate(:group)
|
||||
Jobs.expects(:enqueue).with(:automatic_group_membership, group_id: group.id)
|
||||
|
||||
put :update, params: {
|
||||
id: group.id, group: { automatic_membership_retroactive: "true" }
|
||||
}, format: :json
|
||||
|
||||
expect(response).to be_success
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
context ".destroy" do
|
||||
|
||||
it "returns a 422 if the group is automatic" do
|
||||
group = Fabricate(:group, automatic: true)
|
||||
delete :destroy, params: { id: group.id }, format: :json
|
||||
expect(response.status).to eq(422)
|
||||
expect(Group.where(id: group.id).count).to eq(1)
|
||||
end
|
||||
|
||||
it "is able to destroy a non-automatic group" do
|
||||
group = Fabricate(:group)
|
||||
delete :destroy, params: { id: group.id }, format: :json
|
||||
expect(response.status).to eq(200)
|
||||
expect(Group.where(id: group.id).count).to eq(0)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
context ".refresh_automatic_groups" do
|
||||
|
||||
it "is able to refresh automatic groups" do
|
||||
Group.expects(:refresh_automatic_groups!).returns(true)
|
||||
|
||||
post :refresh_automatic_groups, format: :json
|
||||
expect(response.status).to eq(200)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
@ -6,6 +6,21 @@ describe Group do
|
||||
let(:group) { Fabricate(:group) }
|
||||
|
||||
context 'validations' do
|
||||
describe '#grant_trust_level' do
|
||||
describe 'when trust level is not valid' do
|
||||
it 'should not be valid' do
|
||||
group.grant_trust_level = 123456
|
||||
|
||||
expect(group.valid?).to eq(false)
|
||||
|
||||
expect(group.errors.full_messages.join(",")).to eq(I18n.t(
|
||||
'groups.errors.grant_trust_level_not_valid',
|
||||
trust_level: 123456
|
||||
))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#username' do
|
||||
context 'when a user with a similar name exists' do
|
||||
it 'should not be valid' do
|
||||
|
@ -21,7 +21,7 @@ RSpec.describe Admin::GroupsController do
|
||||
}
|
||||
}
|
||||
|
||||
expect(response).to be_success
|
||||
expect(response.status).to eq(200)
|
||||
|
||||
group = Group.last
|
||||
|
||||
@ -50,4 +50,68 @@ RSpec.describe Admin::GroupsController do
|
||||
.to contain_exactly(user, admin)
|
||||
end
|
||||
end
|
||||
|
||||
describe "#bulk_perform" do
|
||||
let(:group) do
|
||||
Fabricate(:group,
|
||||
name: "test",
|
||||
primary_group: true,
|
||||
title: 'WAT',
|
||||
grant_trust_level: 3
|
||||
)
|
||||
end
|
||||
|
||||
let(:user) { Fabricate(:user, trust_level: 2) }
|
||||
let(:user2) { Fabricate(:user, trust_level: 4) }
|
||||
|
||||
it "can assign users to a group by email or username" do
|
||||
put "/admin/groups/bulk.json", params: {
|
||||
group_id: group.id, users: [user.username.upcase, user2.email, 'doesnt_exist']
|
||||
}
|
||||
|
||||
expect(response.status).to eq(200)
|
||||
|
||||
user.reload
|
||||
expect(user.primary_group).to eq(group)
|
||||
expect(user.title).to eq("WAT")
|
||||
expect(user.trust_level).to eq(3)
|
||||
|
||||
user2.reload
|
||||
expect(user2.primary_group).to eq(group)
|
||||
expect(user2.title).to eq("WAT")
|
||||
expect(user2.trust_level).to eq(4)
|
||||
|
||||
json = ::JSON.parse(response.body)
|
||||
expect(json['message']).to eq("2 users have been added to the group.")
|
||||
expect(json['users_not_added'][0]).to eq("doesnt_exist")
|
||||
end
|
||||
end
|
||||
|
||||
context "#destroy" do
|
||||
it 'should return the right response for an invalid group_id' do
|
||||
delete "/admin/groups/123.json"
|
||||
|
||||
expect(response.status).to eq(404)
|
||||
end
|
||||
|
||||
describe 'when group is automatic' do
|
||||
it "returns the right response" do
|
||||
group.update!(automatic: true)
|
||||
|
||||
delete "/admin/groups/#{group.id}.json"
|
||||
|
||||
expect(response.status).to eq(422)
|
||||
expect(Group.find(group.id)).to eq(group)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'for a non automatic group' do
|
||||
it "returns the right response" do
|
||||
delete "/admin/groups/#{group.id}.json"
|
||||
|
||||
expect(response.status).to eq(200)
|
||||
expect(Group.find_by(id: group.id)).to eq(nil)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -473,6 +473,7 @@ describe GroupsController do
|
||||
before do
|
||||
user.update_attributes!(admin: true)
|
||||
sign_in(user)
|
||||
SiteSetting.queue_jobs = true
|
||||
end
|
||||
|
||||
it 'should be able to update the group' do
|
||||
@ -506,6 +507,9 @@ describe GroupsController do
|
||||
expect(group.automatic_membership_email_domains).to eq('test.org')
|
||||
expect(group.automatic_membership_retroactive).to eq(true)
|
||||
expect(group.grant_trust_level).to eq(2)
|
||||
|
||||
expect(Jobs::AutomaticGroupMembership.jobs.first["args"].first["group_id"])
|
||||
.to eq(group.id)
|
||||
end
|
||||
|
||||
it "should be able to update an automatic group" do
|
||||
|
@ -24,7 +24,7 @@ QUnit.test("Creating a new group", assert => {
|
||||
|
||||
andThen(() => {
|
||||
assert.equal(
|
||||
find('.tip.bad').text().trim(), I18n.t("groups.new.name.too_short"),
|
||||
find('.tip.bad').text().trim(), I18n.t("admin.groups.new.name.too_short"),
|
||||
'it should show the right validation tooltip'
|
||||
);
|
||||
|
||||
@ -38,7 +38,7 @@ QUnit.test("Creating a new group", assert => {
|
||||
|
||||
andThen(() => {
|
||||
assert.equal(
|
||||
find('.tip.bad').text().trim(), I18n.t("groups.new.name.too_long"),
|
||||
find('.tip.bad').text().trim(), I18n.t("admin.groups.new.name.too_long"),
|
||||
'it should show the right validation tooltip'
|
||||
);
|
||||
});
|
||||
@ -47,7 +47,7 @@ QUnit.test("Creating a new group", assert => {
|
||||
|
||||
andThen(() => {
|
||||
assert.equal(
|
||||
find('.tip.bad').text().trim(), I18n.t("groups.new.name.blank"),
|
||||
find('.tip.bad').text().trim(), I18n.t("admin.groups.new.name.blank"),
|
||||
'it should show the right validation tooltip'
|
||||
);
|
||||
});
|
||||
@ -56,7 +56,7 @@ QUnit.test("Creating a new group", assert => {
|
||||
|
||||
andThen(() => {
|
||||
assert.equal(
|
||||
find('.tip.good').text().trim(), I18n.t("groups.new.name.available"),
|
||||
find('.tip.good').text().trim(), I18n.t("admin.groups.new.name.available"),
|
||||
'it should show the right validation tooltip'
|
||||
);
|
||||
});
|
||||
|
@ -1,41 +0,0 @@
|
||||
moduleFor("controller:admin-group", {
|
||||
needs: ['controller:adminGroupsType']
|
||||
});
|
||||
|
||||
QUnit.test("disablePublicSetting", function(assert) {
|
||||
this.subject().setProperties({
|
||||
model: { visibility_level: 1, allow_membership_requests: false }
|
||||
});
|
||||
|
||||
assert.equal(this.subject().get("disablePublicSetting"), true, "it should disable setting");
|
||||
|
||||
this.subject().set("model.visibility_level", 0);
|
||||
|
||||
assert.equal(this.subject().get("disablePublicSetting"), false, "it should enable setting");
|
||||
|
||||
this.subject().set("model.allow_membership_requests", true);
|
||||
|
||||
assert.equal(this.subject().get("disablePublicSetting"), true, "it should disable setting");
|
||||
});
|
||||
|
||||
QUnit.test("disableMembershipRequestSetting", function(assert) {
|
||||
this.subject().setProperties({
|
||||
model: { visibility_level: 1, public_admission: false, canEveryoneMention: true }
|
||||
});
|
||||
|
||||
assert.equal(this.subject().get("disableMembershipRequestSetting"), true, "it should disable setting");
|
||||
|
||||
this.subject().set("model.visibility_level", 0);
|
||||
|
||||
assert.equal(
|
||||
this.subject().get("disableMembershipRequestSetting"), false,
|
||||
"it should enable setting"
|
||||
);
|
||||
|
||||
this.subject().set("model.public_admission", true);
|
||||
|
||||
assert.equal(
|
||||
this.subject().get("disableMembershipRequestSetting"), true,
|
||||
"it should disable setting"
|
||||
);
|
||||
});
|
Reference in New Issue
Block a user