-
Notifications
You must be signed in to change notification settings - Fork 0
Automated Test: group-dm-user-addition-post #320
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -1,34 +1,69 @@ | ||||||||||||||||||||||||||||||||||||||||||||
| export default Em.ObjectController.extend({ | ||||||||||||||||||||||||||||||||||||||||||||
| needs: ['adminGroups'], | ||||||||||||||||||||||||||||||||||||||||||||
| members: null, | ||||||||||||||||||||||||||||||||||||||||||||
| disableSave: false, | ||||||||||||||||||||||||||||||||||||||||||||
| usernames: null, | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| currentPage: function() { | ||||||||||||||||||||||||||||||||||||||||||||
| if (this.get("user_count") == 0) { return 0; } | ||||||||||||||||||||||||||||||||||||||||||||
| return Math.floor(this.get("offset") / this.get("limit")) + 1; | ||||||||||||||||||||||||||||||||||||||||||||
| }.property("limit", "offset", "user_count"), | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| totalPages: function() { | ||||||||||||||||||||||||||||||||||||||||||||
| if (this.get("user_count") == 0) { return 0; } | ||||||||||||||||||||||||||||||||||||||||||||
| return Math.floor(this.get("user_count") / this.get("limit")) + 1; | ||||||||||||||||||||||||||||||||||||||||||||
| }.property("limit", "user_count"), | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| showingFirst: Em.computed.lte("currentPage", 1), | ||||||||||||||||||||||||||||||||||||||||||||
| showingLast: Discourse.computed.propertyEqual("currentPage", "totalPages"), | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| 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} | ||||||||||||||||||||||||||||||||||||||||||||
| { 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(), | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| usernames: function(key, value) { | ||||||||||||||||||||||||||||||||||||||||||||
| var members = this.get('members'); | ||||||||||||||||||||||||||||||||||||||||||||
| if (arguments.length > 1) { | ||||||||||||||||||||||||||||||||||||||||||||
| this.set('_usernames', value); | ||||||||||||||||||||||||||||||||||||||||||||
| } else { | ||||||||||||||||||||||||||||||||||||||||||||
| var usernames; | ||||||||||||||||||||||||||||||||||||||||||||
| if(members) { | ||||||||||||||||||||||||||||||||||||||||||||
| usernames = members.map(function(user) { | ||||||||||||||||||||||||||||||||||||||||||||
| return user.get('username'); | ||||||||||||||||||||||||||||||||||||||||||||
| }).join(','); | ||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||
| this.set('_usernames', usernames); | ||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||
| return this.get('_usernames'); | ||||||||||||||||||||||||||||||||||||||||||||
| }.property('members.@each.username'), | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| actions: { | ||||||||||||||||||||||||||||||||||||||||||||
| next: function() { | ||||||||||||||||||||||||||||||||||||||||||||
| if (this.get("showingLast")) { return; } | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| var group = this.get("model"), | ||||||||||||||||||||||||||||||||||||||||||||
| offset = Math.min(group.get("offset") + group.get("limit"), group.get("user_count")); | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| group.set("offset", offset); | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| return group.findMembers(); | ||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+29
to
+38
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Clamp 🐛 Proposed fix- var group = this.get("model"),
- offset = Math.min(group.get("offset") + group.get("limit"), group.get("user_count"));
+ var group = this.get("model"),
+ maxOffset = Math.max(group.get("user_count") - group.get("limit"), 0),
+ offset = Math.min(group.get("offset") + group.get("limit"), maxOffset);📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| previous: function() { | ||||||||||||||||||||||||||||||||||||||||||||
| if (this.get("showingFirst")) { return; } | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| var group = this.get("model"), | ||||||||||||||||||||||||||||||||||||||||||||
| offset = Math.max(group.get("offset") - group.get("limit"), 0); | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| group.set("offset", offset); | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| return group.findMembers(); | ||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| removeMember: function(member) { | ||||||||||||||||||||||||||||||||||||||||||||
| var self = this, | ||||||||||||||||||||||||||||||||||||||||||||
| message = I18n.t("admin.groups.delete_member_confirm", { username: member.get("username"), group: this.get("name") }); | ||||||||||||||||||||||||||||||||||||||||||||
| return bootbox.confirm(message, I18n.t("no_value"), I18n.t("yes_value"), function(confirm) { | ||||||||||||||||||||||||||||||||||||||||||||
| if (confirm) { | ||||||||||||||||||||||||||||||||||||||||||||
| self.get("model").removeMember(member); | ||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||
| }); | ||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| addMembers: function() { | ||||||||||||||||||||||||||||||||||||||||||||
| // TODO: should clear the input | ||||||||||||||||||||||||||||||||||||||||||||
| if (Em.isEmpty(this.get("usernames"))) { return; } | ||||||||||||||||||||||||||||||||||||||||||||
| this.get("model").addMembers(this.get("usernames")); | ||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| save: function() { | ||||||||||||||||||||||||||||||||||||||||||||
| var self = this, | ||||||||||||||||||||||||||||||||||||||||||||
| group = this.get('model'); | ||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -37,9 +72,9 @@ export default Em.ObjectController.extend({ | |||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| var promise; | ||||||||||||||||||||||||||||||||||||||||||||
| if (group.get('id')) { | ||||||||||||||||||||||||||||||||||||||||||||
| promise = group.saveWithUsernames(this.get('usernames')); | ||||||||||||||||||||||||||||||||||||||||||||
| promise = group.save(); | ||||||||||||||||||||||||||||||||||||||||||||
| } else { | ||||||||||||||||||||||||||||||||||||||||||||
| promise = group.createWithUsernames(this.get('usernames')).then(function() { | ||||||||||||||||||||||||||||||||||||||||||||
| promise = group.create().then(function() { | ||||||||||||||||||||||||||||||||||||||||||||
| var groupsController = self.get('controllers.adminGroups'); | ||||||||||||||||||||||||||||||||||||||||||||
| groupsController.addObject(group); | ||||||||||||||||||||||||||||||||||||||||||||
| }); | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,29 +1,53 @@ | ||
| {{#if automatic}} | ||
| <h3>{{name}}</h3> | ||
| {{else}} | ||
| {{text-field value=name placeholderKey="admin.groups.name_placeholder"}} | ||
| {{/if}} | ||
| <form class="form-horizontal"> | ||
|
|
||
| <div class="control-group"> | ||
| <label class="control-label">{{i18n 'admin.groups.group_members'}}</label> | ||
| <div class="controls"> | ||
| {{user-selector usernames=usernames id="group-users" placeholderKey="admin.groups.selector_placeholder" tabindex="1" disabled=automatic}} | ||
| <div> | ||
| {{#if automatic}} | ||
| <h3>{{name}}</h3> | ||
| {{else}} | ||
| <label for="name">{{i18n 'admin.groups.name'}}</label> | ||
| {{text-field name="name" value=name placeholderKey="admin.groups.name_placeholder"}} | ||
| {{/if}} | ||
| </div> | ||
| </div> | ||
| <div class="control-group"> | ||
| <div class="controls"> | ||
| {{input type="checkbox" checked=visible}} {{i18n 'groups.visible'}} | ||
|
|
||
| {{#if id}} | ||
| <div> | ||
| <label>{{i18n 'admin.groups.group_members'}} ({{user_count}})</label> | ||
| <div> | ||
| <a {{bind-attr class=":previous showingFirst:disabled"}} {{action "previous"}}>{{fa-icon "fast-backward"}}</a> | ||
| {{currentPage}}/{{totalPages}} | ||
| <a {{bind-attr class=":next showingLast:disabled"}} {{action "next"}}>{{fa-icon "fast-forward"}}</a> | ||
| </div> | ||
| <div class="ac-wrap clearfix"> | ||
| {{each member in members itemView="group-member"}} | ||
| </div> | ||
| </div> | ||
|
|
||
| {{#unless automatic}} | ||
| <div> | ||
| <label for="user-selector">{{i18n 'admin.groups.add_members'}}</label> | ||
| {{user-selector usernames=usernames placeholderKey="admin.groups.selector_placeholder" id="user-selector"}} | ||
| <button {{action "addMembers"}} class='btn add'>{{fa-icon "plus"}} {{i18n 'admin.groups.add'}}</button> | ||
| </div> | ||
| {{/unless}} | ||
| {{/if}} | ||
|
|
||
| <div> | ||
| <label> | ||
| {{input type="checkbox" checked=visible}} | ||
| {{i18n 'groups.visible'}} | ||
| </label> | ||
| </div> | ||
| </div> | ||
| <div class="control-group"> | ||
| <label class="control-label">{{i18n 'groups.alias_levels.title'}}</label> | ||
| <div class="controls"> | ||
| {{combo-box valueAttribute="value" value=alias_level content=aliasLevelOptions}} | ||
|
|
||
| <div> | ||
| <label for="alias">{{i18n 'groups.alias_levels.title'}}</label> | ||
| {{combo-box name="alias" valueAttribute="value" value=alias_level content=aliasLevelOptions}} | ||
| </div> | ||
| </div> | ||
| <div class='controls'> | ||
| <button {{action "save"}} {{bind-attr disabled="disableSave"}} class='btn'>{{i18n 'admin.customize.save'}}</button> | ||
| {{#unless automatic}} | ||
| <button {{action "destroy"}} class='btn btn-danger'><i class="fa fa-trash-o"></i>{{i18n 'admin.customize.delete'}}</button> | ||
| {{/unless}} | ||
| </div> | ||
|
|
||
| <div class='buttons'> | ||
| <button {{action "save"}} {{bind-attr disabled="disableSave"}} class='btn btn-primary'>{{i18n 'admin.customize.save'}}</button> | ||
| {{#unless automatic}} | ||
| <button {{action "destroy"}} class='btn btn-danger'>{{fa-icon "trash-o"}}{{i18n 'admin.customize.delete'}}</button> | ||
| {{/unless}} | ||
| </div> | ||
|
|
||
| </form> |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1 @@ | ||||||||||||||||||||||||
| {{avatar member imageSize="small"}} {{member.username}} {{#unless automatic}}<a class='remove' {{action "removeMember" member}}>{{fa-icon "times"}}</a>{{/unless}} | ||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🏁 Script executed: # Check if the file exists and view its content
find . -name "group_member.hbs" -type fRepository: admin-coderabbit/coderabbit-discourse-mirror Length of output: 145 🏁 Script executed: # Search for similar .remove or remove action patterns in templates
find . -name "*.hbs" -type f -path "*/templates/*" | head -20Repository: admin-coderabbit/coderabbit-discourse-mirror Length of output: 1205 🏁 Script executed: # Check for CSS styling for .remove class
rg "\.remove\s*\{" --type css --type scssRepository: admin-coderabbit/coderabbit-discourse-mirror Length of output: 116 🏁 Script executed: # Search for button or <a> patterns in other handlebars templates to understand project conventions
rg "class=['\"]remove['\"]" --type hbsRepository: admin-coderabbit/coderabbit-discourse-mirror Length of output: 306 🏁 Script executed: # Read the actual file content
cat -n ./app/assets/javascripts/admin/templates/group_member.hbsRepository: admin-coderabbit/coderabbit-discourse-mirror Length of output: 257 🏁 Script executed: # Search for .remove styling in CSS files
find . -name "*.css" -type f | xargs rg "\.remove" 2>/dev/null | head -20Repository: admin-coderabbit/coderabbit-discourse-mirror Length of output: 70 🏁 Script executed: # Search for how buttons are implemented in other admin templates
rg "<button" app/assets/javascripts/admin/templates/ -A 2 | head -40Repository: admin-coderabbit/coderabbit-discourse-mirror Length of output: 3806 🏁 Script executed: # Search for how other interactive actions are implemented in templates
rg "action.*remove" app/assets/javascripts/admin/templates/ -B 2 -A 2Repository: admin-coderabbit/coderabbit-discourse-mirror Length of output: 306 🏁 Script executed: # Check how fa-icon is used in other templates to understand the helper
rg "fa-icon" app/assets/javascripts/admin/templates/ | head -10Repository: admin-coderabbit/coderabbit-discourse-mirror Length of output: 2141 🏁 Script executed: # Look for similar delete/remove patterns with <a> in other templates
rg "<a[^>]*remove" app/assets/javascripts/admin/templates/ -A 1Repository: admin-coderabbit/coderabbit-discourse-mirror Length of output: 306 🏁 Script executed: # Check if there are accessibility attributes (aria-label, role) on other <a> tags without href
rg "<a[^>]*(aria-label|role)[^>]*>" app/assets/javascripts/admin/templates/ | head -10Repository: admin-coderabbit/coderabbit-discourse-mirror Length of output: 70 Use a An ♿ Proposed fix-{{avatar member imageSize="small"}} {{member.username}} {{`#unless` automatic}}<a class='remove' {{action "removeMember" member}}>{{fa-icon "times"}}</a>{{/unless}}
+{{avatar member imageSize="small"}} {{member.username}}
+{{`#unless` automatic}}
+ <button type="button"
+ class="remove"
+ {{action "removeMember" member}}
+ aria-label="{{i18n 'admin_js.admin.groups.delete'}}"
+ title="{{i18n 'admin_js.admin.groups.delete'}}">
+ {{fa-icon "times"}}
+ </button>
+{{/unless}}📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| export default Discourse.View.extend({ | ||
| classNames: ["item"], | ||
| templateName: "admin/templates/group_member" | ||
| }); |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -7,53 +7,80 @@ | |||||||||||||||||
| @module Discourse | ||||||||||||||||||
| **/ | ||||||||||||||||||
| Discourse.Group = Discourse.Model.extend({ | ||||||||||||||||||
| limit: 50, | ||||||||||||||||||
| offset: 0, | ||||||||||||||||||
| user_count: 0, | ||||||||||||||||||
|
|
||||||||||||||||||
| userCountDisplay: function(){ | ||||||||||||||||||
| var c = this.get('user_count'); | ||||||||||||||||||
| // don't display zero its ugly | ||||||||||||||||||
| if(c > 0) { | ||||||||||||||||||
| return c; | ||||||||||||||||||
| } | ||||||||||||||||||
| if (c > 0) { return c; } | ||||||||||||||||||
| }.property('user_count'), | ||||||||||||||||||
|
|
||||||||||||||||||
| findMembers: function() { | ||||||||||||||||||
| if (Em.isEmpty(this.get('name'))) { return Ember.RSVP.resolve([]); } | ||||||||||||||||||
| if (Em.isEmpty(this.get('name'))) { return ; } | ||||||||||||||||||
|
|
||||||||||||||||||
| return Discourse.ajax('/groups/' + this.get('name') + '/members').then(function(result) { | ||||||||||||||||||
| return result.map(function(u) { return Discourse.User.create(u) }); | ||||||||||||||||||
| var self = this, offset = Math.min(this.get("user_count"), Math.max(this.get("offset"), 0)); | ||||||||||||||||||
|
|
||||||||||||||||||
| return Discourse.ajax('/groups/' + this.get('name') + '/members.json', { | ||||||||||||||||||
| data: { | ||||||||||||||||||
| limit: this.get("limit"), | ||||||||||||||||||
| offset: offset | ||||||||||||||||||
| } | ||||||||||||||||||
| }).then(function(result) { | ||||||||||||||||||
| self.setProperties({ | ||||||||||||||||||
| user_count: result.meta.total, | ||||||||||||||||||
| limit: result.meta.limit, | ||||||||||||||||||
| offset: result.meta.offset, | ||||||||||||||||||
| members: result.members.map(function(member) { return Discourse.User.create(member); }) | ||||||||||||||||||
| }); | ||||||||||||||||||
| }); | ||||||||||||||||||
| }, | ||||||||||||||||||
|
|
||||||||||||||||||
| destroy: function(){ | ||||||||||||||||||
| if(!this.get('id')) return; | ||||||||||||||||||
| return Discourse.ajax("/admin/groups/" + this.get('id'), {type: "DELETE"}); | ||||||||||||||||||
| removeMember: function(member) { | ||||||||||||||||||
| var self = this; | ||||||||||||||||||
| return Discourse.ajax('/admin/groups/' + this.get('id') + '/members.json', { | ||||||||||||||||||
| type: "DELETE", | ||||||||||||||||||
| data: { user_id: member.get("id") } | ||||||||||||||||||
| }).then(function() { | ||||||||||||||||||
| // reload member list | ||||||||||||||||||
| self.findMembers(); | ||||||||||||||||||
| }); | ||||||||||||||||||
| }, | ||||||||||||||||||
|
|
||||||||||||||||||
| asJSON: function() { | ||||||||||||||||||
| return { group: { | ||||||||||||||||||
| name: this.get('name'), | ||||||||||||||||||
| alias_level: this.get('alias_level'), | ||||||||||||||||||
| visible: !!this.get('visible'), | ||||||||||||||||||
| usernames: this.get('usernames') } }; | ||||||||||||||||||
| addMembers: function(usernames) { | ||||||||||||||||||
| var self = this; | ||||||||||||||||||
| return Discourse.ajax('/admin/groups/' + this.get('id') + '/members.json', { | ||||||||||||||||||
| type: "PUT", | ||||||||||||||||||
| data: { usernames: usernames } | ||||||||||||||||||
| }).then(function() { | ||||||||||||||||||
| // reload member list | ||||||||||||||||||
| self.findMembers(); | ||||||||||||||||||
| }) | ||||||||||||||||||
| }, | ||||||||||||||||||
|
|
||||||||||||||||||
| createWithUsernames: function(usernames){ | ||||||||||||||||||
| var self = this, | ||||||||||||||||||
| json = this.asJSON(); | ||||||||||||||||||
| json.group.usernames = usernames; | ||||||||||||||||||
| asJSON: function() { | ||||||||||||||||||
| return { | ||||||||||||||||||
| name: this.get('name'), | ||||||||||||||||||
| alias_level: this.get('alias_level'), | ||||||||||||||||||
| visible: !!this.get('visible') | ||||||||||||||||||
| }; | ||||||||||||||||||
| }, | ||||||||||||||||||
|
|
||||||||||||||||||
| return Discourse.ajax("/admin/groups", {type: "POST", data: json}).then(function(resp) { | ||||||||||||||||||
| create: function(){ | ||||||||||||||||||
| var self = this; | ||||||||||||||||||
| return Discourse.ajax("/admin/groups", { type: "POST", data: this.asJSON() }).then(function(resp) { | ||||||||||||||||||
| self.set('id', resp.basic_group.id); | ||||||||||||||||||
| }); | ||||||||||||||||||
| }, | ||||||||||||||||||
|
|
||||||||||||||||||
| saveWithUsernames: function(usernames){ | ||||||||||||||||||
| var json = this.asJSON(); | ||||||||||||||||||
| json.group.usernames = usernames; | ||||||||||||||||||
| return Discourse.ajax("/admin/groups/" + this.get('id'), { | ||||||||||||||||||
| type: "PUT", | ||||||||||||||||||
| data: json | ||||||||||||||||||
| }); | ||||||||||||||||||
| save: function(){ | ||||||||||||||||||
| return Discourse.ajax("/admin/groups/" + this.get('id'), { type: "PUT", data: this.asJSON() }); | ||||||||||||||||||
| }, | ||||||||||||||||||
|
|
||||||||||||||||||
| destroy: function(){ | ||||||||||||||||||
| if (!this.get('id')) { return }; | ||||||||||||||||||
| return Discourse.ajax("/admin/groups/" + this.get('id'), {type: "DELETE"}); | ||||||||||||||||||
| }, | ||||||||||||||||||
|
Comment on lines
+81
to
84
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Syntax error: extraneous semicolon after closing brace. Line 82 has a semicolon immediately after the closing brace of the if statement, which is a syntax error or no-op empty statement. 🐛 Proposed fix destroy: function(){
- if (!this.get('id')) { return };
+ if (!this.get('id')) { return; }
return Discourse.ajax("/admin/groups/" + this.get('id'), {type: "DELETE"});
},📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||
|
|
||||||||||||||||||
| findPosts: function(opts) { | ||||||||||||||||||
|
|
||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,3 +1 @@ | ||
|
|
||
| <input type="text"> | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix
totalPagesoff-by-one whenuser_countis a multiple oflimit.With
Math.floor(...)+1, 20 users at limit 10 yields 3 pages (should be 2). This produces an extra empty page and incorrectshowingLast.🐛 Proposed fix
📝 Committable suggestion
🤖 Prompt for AI Agents