diff --git a/app/assets/javascripts/admin/controllers/admin-group.js.es6 b/app/assets/javascripts/admin/controllers/admin-group.js.es6
index 71cb2c70328..6c3da11d7f7 100644
--- a/app/assets/javascripts/admin/controllers/admin-group.js.es6
+++ b/app/assets/javascripts/admin/controllers/admin-group.js.es6
@@ -1,5 +1,4 @@
import { popupAjaxError } from 'discourse/lib/ajax-error';
-import { propertyEqual } from 'discourse/lib/computed';
import computed from 'ember-addons/ember-computed-decorators';
export default Ember.Controller.extend({
@@ -7,19 +6,6 @@ export default Ember.Controller.extend({
disableSave: false,
savingStatus: '',
- currentPage: function() {
- if (this.get("model.user_count") === 0) { return 0; }
- return Math.floor(this.get("model.offset") / this.get("model.limit")) + 1;
- }.property("model.limit", "model.offset", "model.user_count"),
-
- totalPages: function() {
- if (this.get("model.user_count") === 0) { return 0; }
- return Math.floor(this.get("model.user_count") / this.get("model.limit")) + 1;
- }.property("model.limit", "model.user_count"),
-
- showingFirst: Em.computed.lte("currentPage", 1),
- showingLast: propertyEqual("currentPage", "totalPages"),
-
aliasLevelOptions: function() {
return [
{ name: I18n.t("groups.alias_levels.nobody"), value: 0 },
@@ -47,38 +33,6 @@ export default Ember.Controller.extend({
},
actions: {
- next() {
- if (this.get("showingLast")) { return; }
-
- const group = this.get("model"),
- offset = Math.min(group.get("offset") + group.get("limit"), group.get("user_count"));
-
- group.set("offset", offset);
-
- return group.findMembers();
- },
-
- previous() {
- if (this.get("showingFirst")) { return; }
-
- const group = this.get("model"),
- offset = Math.max(group.get("offset") - group.get("limit"), 0);
-
- group.set("offset", offset);
-
- return group.findMembers();
- },
-
- removeMember(member) {
- const self = this,
- message = I18n.t("admin.groups.delete_member_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").removeMember(member);
- }
- });
- },
-
removeOwner(member) {
const self = this,
message = I18n.t("admin.groups.delete_owner_confirm", { username: member.get("username"), group: this.get("model.name") });
@@ -95,12 +49,6 @@ export default Ember.Controller.extend({
this.set("model.ownerUsernames", null);
},
- addMembers() {
- if (Em.isEmpty(this.get("model.usernames"))) { return; }
- this.get("model").addMembers(this.get("model.usernames")).catch(popupAjaxError);
- this.set("model.usernames", null);
- },
-
save() {
const group = this.get('model'),
groupsController = this.get("adminGroupsType"),
diff --git a/app/assets/javascripts/admin/templates/group.hbs b/app/assets/javascripts/admin/templates/group.hbs
index f66e0ca8557..79ba4466969 100644
--- a/app/assets/javascripts/admin/templates/group.hbs
+++ b/app/assets/javascripts/admin/templates/group.hbs
@@ -33,26 +33,8 @@
{{/unless}}
diff --git a/app/assets/javascripts/admin/components/group-member.js.es6 b/app/assets/javascripts/discourse/components/group-member.js.es6
similarity index 100%
rename from app/assets/javascripts/admin/components/group-member.js.es6
rename to app/assets/javascripts/discourse/components/group-member.js.es6
diff --git a/app/assets/javascripts/discourse/components/group-members-input.js.es6 b/app/assets/javascripts/discourse/components/group-members-input.js.es6
new file mode 100644
index 00000000000..1fb45f27bf6
--- /dev/null
+++ b/app/assets/javascripts/discourse/components/group-members-input.js.es6
@@ -0,0 +1,69 @@
+import computed from 'ember-addons/ember-computed-decorators';
+import { popupAjaxError } from 'discourse/lib/ajax-error';
+import { propertyEqual } from 'discourse/lib/computed';
+
+export default Ember.Component.extend({
+ classNames: ["group-members-input"],
+
+ @computed('model.limit', 'model.offset', 'model.user_count')
+ currentPage(limit, offset, userCount) {
+ if (userCount === 0) { return 0; }
+
+ return Math.floor(offset / limit) + 1;
+ },
+
+ @computed('model.limit', 'model.user_count')
+ totalPages(limit, userCount) {
+ if (userCount === 0) { return 0; }
+ return Math.floor(userCount / limit) + 1;
+ },
+
+ @computed('model.usernames')
+ disableAddButton(usernames) {
+ return !usernames || !(usernames.length > 0);
+ },
+
+ showingFirst: Em.computed.lte("currentPage", 1),
+ showingLast: propertyEqual("currentPage", "totalPages"),
+
+ actions: {
+ next() {
+ if (this.get("showingLast")) { return; }
+
+ const group = this.get("model");
+ const offset = Math.min(group.get("offset") + group.get("limit"), group.get("user_count"));
+ group.set("offset", offset);
+
+ return group.findMembers();
+ },
+
+ previous() {
+ if (this.get("showingFirst")) { return; }
+
+ const group = this.get("model");
+ const offset = Math.max(group.get("offset") - group.get("limit"), 0);
+ group.set("offset", offset);
+
+ return group.findMembers();
+ },
+
+ addMembers() {
+ if (Em.isEmpty(this.get("model.usernames"))) { return; }
+ this.get("model").addMembers(this.get("model.usernames")).catch(popupAjaxError);
+ this.set("model.usernames", null);
+ },
+
+ removeMember(member) {
+ const message = I18n.t("groups.edit.delete_member_confirm",{
+ username: member.get("username"),
+ group: this.get("model.name")
+ });
+
+ return bootbox.confirm(message, I18n.t("no_value"), I18n.t("yes_value"), confirm => {
+ if (confirm) {
+ this.get("model").removeMember(member);
+ }
+ });
+ }
+ }
+});
diff --git a/app/assets/javascripts/discourse/controllers/edit-group.js.es6 b/app/assets/javascripts/discourse/controllers/group-edit.js.es6
similarity index 51%
rename from app/assets/javascripts/discourse/controllers/edit-group.js.es6
rename to app/assets/javascripts/discourse/controllers/group-edit.js.es6
index 01db8c7ad47..32277430af5 100644
--- a/app/assets/javascripts/discourse/controllers/edit-group.js.es6
+++ b/app/assets/javascripts/discourse/controllers/group-edit.js.es6
@@ -1,16 +1,19 @@
import { popupAjaxError } from 'discourse/lib/ajax-error';
+import computed from 'ember-addons/ember-computed-decorators';
export default Ember.Controller.extend({
- saving: false,
+ @computed('saving')
+ savingText(saving) {
+ if (saving !== undefined) {
+ return saving ? I18n.t('saving') : I18n.t('saved');
+ }
+ },
actions: {
save() {
this.set('saving', true);
- this.get('model').save().then(() => {
- this.transitionToRoute('group', this.get('model.name'));
- this.send('closeModal');
- }).catch(error => {
+ this.get('model').save().catch(error => {
popupAjaxError(error);
}).finally(() => {
this.set('saving', false);
diff --git a/app/assets/javascripts/discourse/controllers/group-index.js.es6 b/app/assets/javascripts/discourse/controllers/group-index.js.es6
index ff1b32741e5..64ff33dc6d6 100644
--- a/app/assets/javascripts/discourse/controllers/group-index.js.es6
+++ b/app/assets/javascripts/discourse/controllers/group-index.js.es6
@@ -10,6 +10,7 @@ export default Ember.Controller.extend({
limit: null,
offset: null,
isOwner: Ember.computed.alias('model.is_group_owner'),
+ showActions: false,
@observes('order', 'desc')
refreshMembers() {
@@ -28,6 +29,10 @@ export default Ember.Controller.extend({
},
actions: {
+ toggleActions() {
+ this.toggleProperty("showActions");
+ },
+
removeMember(user) {
this.get('model').removeMember(user);
},
diff --git a/app/assets/javascripts/discourse/controllers/group.js.es6 b/app/assets/javascripts/discourse/controllers/group.js.es6
index 8500a9d0fac..1e38992e8a2 100644
--- a/app/assets/javascripts/discourse/controllers/group.js.es6
+++ b/app/assets/javascripts/discourse/controllers/group.js.es6
@@ -21,6 +21,10 @@ export default Ember.Controller.extend({
Tab.create({ name: 'topics' }),
Tab.create({ name: 'mentions' }),
Tab.create({ name: 'messages', requiresMembership: true }),
+ Tab.create({
+ name: 'edit', i18nKey: 'edit.title',
+ requiresMembership: true, requiresGroupAdmin: true
+ }),
Tab.create({
name: 'logs', i18nKey: 'logs.title',
requiresMembership: true, requiresGroupAdmin: true
diff --git a/app/assets/javascripts/discourse/routes/app-route-map.js.es6 b/app/assets/javascripts/discourse/routes/app-route-map.js.es6
index 37733386f1f..4b23587a899 100644
--- a/app/assets/javascripts/discourse/routes/app-route-map.js.es6
+++ b/app/assets/javascripts/discourse/routes/app-route-map.js.es6
@@ -57,6 +57,7 @@ export default function() {
this.route('mentions');
this.route('messages');
this.route('logs');
+ this.route('edit');
});
// User routes
diff --git a/app/assets/javascripts/discourse/routes/group-edit.js.es6 b/app/assets/javascripts/discourse/routes/group-edit.js.es6
new file mode 100644
index 00000000000..8608e6ecf3b
--- /dev/null
+++ b/app/assets/javascripts/discourse/routes/group-edit.js.es6
@@ -0,0 +1,15 @@
+export default Ember.Route.extend({
+ titleToken() {
+ return I18n.t('groups.edit.title');
+ },
+
+ model() {
+ return this.modelFor('group');
+ },
+
+ setupController(controller, model) {
+ this.controllerFor('group-edit').setProperties({ model });
+ this.controllerFor("group").set("showing", 'edit');
+ model.findMembers();
+ }
+});
diff --git a/app/assets/javascripts/discourse/routes/group.js.es6 b/app/assets/javascripts/discourse/routes/group.js.es6
index 51731bccb68..232d898d794 100644
--- a/app/assets/javascripts/discourse/routes/group.js.es6
+++ b/app/assets/javascripts/discourse/routes/group.js.es6
@@ -17,12 +17,5 @@ export default Discourse.Route.extend({
setupController(controller, model) {
controller.setProperties({ model, counts: this.get('counts') });
- },
-
- actions: {
- showGroupEditor() {
- showModal('edit-group');
- this.controllerFor('edit-group').set('model', this.modelFor('group'));
- }
}
});
diff --git a/app/assets/javascripts/admin/templates/components/group-member.hbs b/app/assets/javascripts/discourse/templates/components/group-member.hbs
similarity index 100%
rename from app/assets/javascripts/admin/templates/components/group-member.hbs
rename to app/assets/javascripts/discourse/templates/components/group-member.hbs
diff --git a/app/assets/javascripts/discourse/templates/components/group-members-input.hbs b/app/assets/javascripts/discourse/templates/components/group-members-input.hbs
new file mode 100644
index 00000000000..c720c630f53
--- /dev/null
+++ b/app/assets/javascripts/discourse/templates/components/group-members-input.hbs
@@ -0,0 +1,23 @@
+
+
+
+ {{#each model.members as |member|}}
+ {{group-member member=member automatic=model.automatic removeAction="removeMember"}}
+ {{/each}}
+
+
+{{#unless model.automatic}}
+
+ {{user-selector usernames=model.usernames}}
+
+ {{d-button action="addMembers"
+ class="add"
+ icon="plus"
+ disabled=disableAddButton
+ label="groups.edit.add_members"}}
+
+{{/unless}}
diff --git a/app/assets/javascripts/discourse/templates/group-edit.hbs b/app/assets/javascripts/discourse/templates/group-edit.hbs
new file mode 100644
index 00000000000..136cd09ffa5
--- /dev/null
+++ b/app/assets/javascripts/discourse/templates/group-edit.hbs
@@ -0,0 +1,46 @@
+
diff --git a/app/assets/javascripts/discourse/templates/group-index.hbs b/app/assets/javascripts/discourse/templates/group-index.hbs
index cd01f61fa4d..ec00b5415ce 100644
--- a/app/assets/javascripts/discourse/templates/group-index.hbs
+++ b/app/assets/javascripts/discourse/templates/group-index.hbs
@@ -1,10 +1,5 @@
{{#if model}}
- {{#if isOwner}}
-
- {{else if canJoinGroup}}
+ {{#if canJoinGroup}}
{{#if model.is_group_user}}
{{d-button action="leaveGroup"
class="btn-danger group-index-leave"
@@ -31,7 +26,6 @@
{{group-index-toggle order=order desc=desc field='username_lower' i18nKey='username'}}
{{group-index-toggle order=order desc=desc field='last_posted_at' i18nKey='last_post'}}
{{group-index-toggle order=order desc=desc field='last_seen_at' i18nKey='last_seen'}}
-
|
@@ -48,13 +42,6 @@
{{bound-date m.last_seen_at}}
|
-
- {{#if isOwner}}
- {{#unless m.owner}}
-
- {{/unless}}
- {{/if}}
- |
{{/each}}
diff --git a/app/assets/javascripts/discourse/templates/group.hbs b/app/assets/javascripts/discourse/templates/group.hbs
index 3b20460b2c8..bacefc99715 100644
--- a/app/assets/javascripts/discourse/templates/group.hbs
+++ b/app/assets/javascripts/discourse/templates/group.hbs
@@ -20,12 +20,6 @@
@{{model.name}}
{{/if}}
-
- {{#if canEditGroup}}
-
- {{d-button action="showGroupEditor" label="groups.edit.title" class="group-edit-btn" icon="pencil"}}
-
- {{/if}}
{{#if model.bio_cooked}}
diff --git a/app/assets/javascripts/discourse/templates/modal/edit-group.hbs b/app/assets/javascripts/discourse/templates/modal/edit-group.hbs
deleted file mode 100644
index 863f83dd3c3..00000000000
--- a/app/assets/javascripts/discourse/templates/modal/edit-group.hbs
+++ /dev/null
@@ -1,34 +0,0 @@
-{{#d-modal-body title="groups.edit.title" class="edit-group groups"}}
-