diff --git a/app/assets/javascripts/admin/controllers/admin-user-index.js.es6 b/app/assets/javascripts/admin/controllers/admin-user-index.js.es6 index 78f8ef1d1c2..8c3b95bd13b 100644 --- a/app/assets/javascripts/admin/controllers/admin-user-index.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-user-index.js.es6 @@ -48,7 +48,7 @@ export default Ember.Controller.extend(CanCheckEmails, { return automaticGroups .map(group => { const name = Ember.String.htmlSafe(group.name); - return `${name}`; + return `${name}`; }) .join(", "); }, diff --git a/app/assets/javascripts/discourse/components/group-card-contents.js.es6 b/app/assets/javascripts/discourse/components/group-card-contents.js.es6 index 763d8fe2c56..2a73474d677 100644 --- a/app/assets/javascripts/discourse/components/group-card-contents.js.es6 +++ b/app/assets/javascripts/discourse/components/group-card-contents.js.es6 @@ -35,7 +35,7 @@ export default Ember.Component.extend(CardContentsBase, CleansUp, { @computed("group") groupPath(group) { - return `${Discourse.BaseUri}/groups/${group.name}`; + return `${Discourse.BaseUri}/g/${group.name}`; }, _showCallback(username, $target) { diff --git a/app/assets/javascripts/discourse/controllers/composer.js.es6 b/app/assets/javascripts/discourse/controllers/composer.js.es6 index 4d299ef2f22..7ef2397a4fa 100644 --- a/app/assets/javascripts/discourse/controllers/composer.js.es6 +++ b/app/assets/javascripts/discourse/controllers/composer.js.es6 @@ -547,18 +547,19 @@ export default Ember.Controller.extend({ ) { groups.forEach(group => { let body; + const groupLink = Discourse.getURL(`/g/${group.name}/members`); if (group.max_mentions < group.user_count) { body = I18n.t("composer.group_mentioned_limit", { group: "@" + group.name, max: group.max_mentions, - group_link: Discourse.getURL(`/groups/${group.name}/members`) + group_link: groupLink }); } else { body = I18n.t("composer.group_mentioned", { group: "@" + group.name, count: group.user_count, - group_link: Discourse.getURL(`/groups/${group.name}/members`) + group_link: groupLink }); } diff --git a/app/assets/javascripts/discourse/initializers/url-redirects.js.es6 b/app/assets/javascripts/discourse/initializers/url-redirects.js.es6 index 56febf3be68..dad01375741 100644 --- a/app/assets/javascripts/discourse/initializers/url-redirects.js.es6 +++ b/app/assets/javascripts/discourse/initializers/url-redirects.js.es6 @@ -10,6 +10,8 @@ export default { // URL rewrites (usually due to refactoring) DiscourseURL.rewrite(/^\/category\//, "/c/"); DiscourseURL.rewrite(/^\/group\//, "/groups/"); + DiscourseURL.rewrite(/^\/groups$/, "/g"); + DiscourseURL.rewrite(/^\/groups\//, "/g/"); DiscourseURL.rewrite(/\/private-messages\/$/, "/messages/"); DiscourseURL.rewrite(/^\/users$/, "/u"); DiscourseURL.rewrite(/^\/users\//, "/u/"); diff --git a/app/assets/javascripts/discourse/lib/link-mentions.js.es6 b/app/assets/javascripts/discourse/lib/link-mentions.js.es6 index c58797d0bfa..16bc7304c19 100644 --- a/app/assets/javascripts/discourse/lib/link-mentions.js.es6 +++ b/app/assets/javascripts/discourse/lib/link-mentions.js.es6 @@ -16,7 +16,7 @@ function replaceSpan($e, username, opts) { extraClass = "notify"; } $e.replaceWith( - `@${username}` ); } else { 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 1e2e6ad3381..160a72938bb 100644 --- a/app/assets/javascripts/discourse/routes/app-route-map.js.es6 +++ b/app/assets/javascripts/discourse/routes/app-route-map.js.es6 @@ -60,36 +60,32 @@ export default function() { this.route("categoryWithID", { path: "/c/:parentSlug/:slug/:id" }); }); - this.route("groups", { resetNamespace: true }, function() { + this.route("groups", { resetNamespace: true, path: "/g" }, function() { this.route("new", { path: "custom/new" }); }); - this.route( - "group", - { path: "/groups/:name", resetNamespace: true }, - function() { + this.route("group", { path: "/g/:name", resetNamespace: true }, function() { + this.route("members"); + + this.route("activity", function() { + this.route("posts"); + this.route("topics"); + this.route("mentions"); + }); + + this.route("manage", function() { + this.route("profile"); + this.route("membership"); + this.route("interaction"); this.route("members"); + this.route("logs"); + }); - this.route("activity", function() { - this.route("posts"); - this.route("topics"); - this.route("mentions"); - }); - - this.route("manage", function() { - this.route("profile"); - this.route("membership"); - this.route("interaction"); - this.route("members"); - this.route("logs"); - }); - - this.route("messages", function() { - this.route("inbox"); - this.route("archive"); - }); - } - ); + this.route("messages", function() { + this.route("inbox"); + this.route("archive"); + }); + }); // User routes this.route("users", { resetNamespace: true, path: "/u" }); diff --git a/app/assets/javascripts/discourse/widgets/header-topic-info.js.es6 b/app/assets/javascripts/discourse/widgets/header-topic-info.js.es6 index 40237b9c6cd..f3b136b6abe 100644 --- a/app/assets/javascripts/discourse/widgets/header-topic-info.js.es6 +++ b/app/assets/javascripts/discourse/widgets/header-topic-info.js.es6 @@ -26,7 +26,7 @@ createWidget("topic-header-participant", { url = user.get("path"); } else { content = [iconNode("users")]; - url = Discourse.getURL(`/groups/${group.name}`); + url = Discourse.getURL(`/g/${group.name}`); content.push(h("span", group.name)); } diff --git a/app/assets/javascripts/discourse/widgets/post-small-action.js.es6 b/app/assets/javascripts/discourse/widgets/post-small-action.js.es6 index 92cd072bf95..e28658a7390 100644 --- a/app/assets/javascripts/discourse/widgets/post-small-action.js.es6 +++ b/app/assets/javascripts/discourse/widgets/post-small-action.js.es6 @@ -13,7 +13,7 @@ export function actionDescriptionHtml(actionCode, createdAt, username) { var who = ""; if (username) { if (actionCode === "invited_group" || actionCode === "removed_group") { - who = `@${username}`; + who = `@${username}`; } else { who = `@${username}`; } diff --git a/app/assets/javascripts/discourse/widgets/poster-name.js.es6 b/app/assets/javascripts/discourse/widgets/poster-name.js.es6 index 9d21c0412bd..85c98e19cdb 100644 --- a/app/assets/javascripts/discourse/widgets/poster-name.js.es6 +++ b/app/assets/javascripts/discourse/widgets/poster-name.js.es6 @@ -17,7 +17,7 @@ createWidget("poster-name-title", { html(attrs) { let titleContents = attrs.title; if (attrs.primaryGroupName) { - const href = Discourse.getURL(`/groups/${attrs.primaryGroupName}`); + const href = Discourse.getURL(`/g/${attrs.primaryGroupName}`); titleContents = h( "a.user-group", { diff --git a/app/assets/javascripts/discourse/widgets/private-message-map.js.es6 b/app/assets/javascripts/discourse/widgets/private-message-map.js.es6 index 200ed332b2c..40b5ce38c02 100644 --- a/app/assets/javascripts/discourse/widgets/private-message-map.js.es6 +++ b/app/assets/javascripts/discourse/widgets/private-message-map.js.es6 @@ -25,7 +25,7 @@ createWidget("pm-map-user-group", { tagName: "div.user.group", transform(attrs) { - return { href: Discourse.getURL(`/groups/${attrs.group.name}`) }; + return { href: Discourse.getURL(`/g/${attrs.group.name}`) }; }, template: hbs` diff --git a/app/assets/javascripts/select-kit/components/group-dropdown.js.es6 b/app/assets/javascripts/select-kit/components/group-dropdown.js.es6 index 3b0376a2621..53406d7c687 100644 --- a/app/assets/javascripts/select-kit/components/group-dropdown.js.es6 +++ b/app/assets/javascripts/select-kit/components/group-dropdown.js.es6 @@ -34,7 +34,7 @@ export default ComboBoxComponent.extend({ (this.currentUser && this.currentUser.get("staff")) ) { return ` - + ${I18n.t("groups.index.all").toLowerCase()} `.htmlSafe(); @@ -43,7 +43,7 @@ export default ComboBoxComponent.extend({ actions: { onSelect(groupName) { - DiscourseURL.routeTo(Discourse.getURL(`/groups/${groupName}`)); + DiscourseURL.routeTo(Discourse.getURL(`/g/${groupName}`)); } } }); diff --git a/config/routes.rb b/config/routes.rb index 2ea0ce89e26..820b6d74243 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -482,45 +482,47 @@ Discourse::Application.routes.draw do get "posts/:username/deleted" => "posts#deleted_posts", constraints: { username: RouteFormat.username } get "posts/:username/flagged" => "posts#flagged_posts", constraints: { username: RouteFormat.username } - resources :groups, id: RouteFormat.username do - get "posts.rss" => "groups#posts_feed", format: :rss - get "mentions.rss" => "groups#mentions_feed", format: :rss + %w{groups g}.each do |root_path| + resources :groups, id: RouteFormat.username, path: root_path do + get "posts.rss" => "groups#posts_feed", format: :rss + get "mentions.rss" => "groups#mentions_feed", format: :rss - get 'members' - get 'posts' - get 'mentions' - get 'counts' - get 'mentionable' - get 'messageable' - get 'logs' => 'groups#histories' + get 'members' + get 'posts' + get 'mentions' + get 'counts' + get 'mentionable' + get 'messageable' + get 'logs' => 'groups#histories' - collection do - get "check-name" => 'groups#check_name' - get 'custom/new' => 'groups#new', constraints: AdminConstraint.new - get "search" => "groups#search" - end - - member do - %w{ - activity - activity/:filter - messages - messages/inbox - messages/archive - manage - manage/profile - manage/members - manage/membership - manage/interaction - manage/logs - }.each do |path| - get path => 'groups#show' + collection do + get "check-name" => 'groups#check_name' + get 'custom/new' => 'groups#new', constraints: AdminConstraint.new + get "search" => "groups#search" end - put "members" => "groups#add_members" - delete "members" => "groups#remove_member" - post "request_membership" => "groups#request_membership" - post "notifications" => "groups#set_notifications" + member do + %w{ + activity + activity/:filter + messages + messages/inbox + messages/archive + manage + manage/profile + manage/members + manage/membership + manage/interaction + manage/logs + }.each do |path| + get path => 'groups#show' + end + + put "members" => "groups#add_members" + delete "members" => "groups#remove_member" + post "request_membership" => "groups#request_membership" + post "notifications" => "groups#set_notifications" + end end end diff --git a/test/javascripts/acceptance/group-index-test.js.es6 b/test/javascripts/acceptance/group-index-test.js.es6 index 1cc9025c2b6..a09fd6867f9 100644 --- a/test/javascripts/acceptance/group-index-test.js.es6 +++ b/test/javascripts/acceptance/group-index-test.js.es6 @@ -3,7 +3,7 @@ import { acceptance, logIn, replaceCurrentUser } from "helpers/qunit-helpers"; acceptance("Group Members"); QUnit.test("Viewing Members as anon user", async assert => { - await visit("/groups/discourse"); + await visit("/g/discourse"); assert.ok( count(".avatar-flair .d-icon-adjust") === 1, @@ -28,7 +28,7 @@ QUnit.test("Viewing Members as a group owner", async assert => { Discourse.reset(); replaceCurrentUser({ admin: false, staff: false }); - await visit("/groups/discourse"); + await visit("/g/discourse"); await click(".group-members-add"); assert.equal( @@ -42,7 +42,7 @@ QUnit.test("Viewing Members as an admin user", async assert => { logIn(); Discourse.reset(); - await visit("/groups/discourse"); + await visit("/g/discourse"); assert.ok( count(".group-member-dropdown") > 0, diff --git a/test/javascripts/acceptance/group-manage-interaction-test.js.es6 b/test/javascripts/acceptance/group-manage-interaction-test.js.es6 index 5884eca593e..014a7156115 100644 --- a/test/javascripts/acceptance/group-manage-interaction-test.js.es6 +++ b/test/javascripts/acceptance/group-manage-interaction-test.js.es6 @@ -8,7 +8,7 @@ acceptance("Managing Group Interaction Settings", { }); QUnit.test("As an admin", async assert => { - await visit("/groups/discourse/manage/interaction"); + await visit("/g/discourse/manage/interaction"); assert.equal( find(".groups-form-visibility-level").length, @@ -43,7 +43,7 @@ QUnit.test("As an admin", async assert => { QUnit.test("As a group owner", async assert => { replaceCurrentUser({ admin: false, staff: false }); - await visit("/groups/discourse/manage/interaction"); + await visit("/g/discourse/manage/interaction"); assert.equal( find(".groups-form-visibility-level").length, diff --git a/test/javascripts/acceptance/group-manage-logs-test.js.es6 b/test/javascripts/acceptance/group-manage-logs-test.js.es6 index ab23cfaea47..1a3d6ada4af 100644 --- a/test/javascripts/acceptance/group-manage-logs-test.js.es6 +++ b/test/javascripts/acceptance/group-manage-logs-test.js.es6 @@ -94,7 +94,7 @@ acceptance("Group logs", { }); QUnit.test("Browsing group logs", async assert => { - await visit("/groups/snorlax/manage/logs"); + await visit("/g/snorlax/manage/logs"); assert.ok( find("tr.group-manage-logs-row").length === 2, "it should display the right number of logs" diff --git a/test/javascripts/acceptance/group-manage-membership-test.js.es6 b/test/javascripts/acceptance/group-manage-membership-test.js.es6 index 1b57b393b6c..340c625bbce 100644 --- a/test/javascripts/acceptance/group-manage-membership-test.js.es6 +++ b/test/javascripts/acceptance/group-manage-membership-test.js.es6 @@ -5,7 +5,7 @@ acceptance("Managing Group Membership", { }); QUnit.test("As an admin", async assert => { - await visit("/groups/discourse/manage/membership"); + await visit("/g/discourse/manage/membership"); assert.ok( find('label[for="automatic_membership"]').length === 1, @@ -70,7 +70,7 @@ QUnit.test("As an admin", async assert => { QUnit.test("As a group owner", async assert => { replaceCurrentUser({ staff: false, admin: false }); - await visit("/groups/discourse/manage/membership"); + await visit("/g/discourse/manage/membership"); assert.ok( find('label[for="automatic_membership"]').length === 0, diff --git a/test/javascripts/acceptance/group-manage-profile-test.js.es6 b/test/javascripts/acceptance/group-manage-profile-test.js.es6 index a219797a61f..156f27939b2 100644 --- a/test/javascripts/acceptance/group-manage-profile-test.js.es6 +++ b/test/javascripts/acceptance/group-manage-profile-test.js.es6 @@ -6,7 +6,7 @@ QUnit.test("As an admin", async assert => { logIn(); Discourse.reset(); - await visit("/groups/discourse/manage/profile"); + await visit("/g/discourse/manage/profile"); assert.ok( find(".group-flair-inputs").length === 1, @@ -31,7 +31,7 @@ QUnit.test("As a group owner", async assert => { Discourse.reset(); replaceCurrentUser({ staff: false, admin: false }); - await visit("/groups/discourse/manage/profile"); + await visit("/g/discourse/manage/profile"); assert.equal( find(".group-form-name").length, @@ -41,7 +41,7 @@ QUnit.test("As a group owner", async assert => { }); QUnit.test("As an anonymous user", async assert => { - await visit("/groups/discourse/manage/profile"); + await visit("/g/discourse/manage/profile"); assert.ok( count(".group-members tr") > 0, diff --git a/test/javascripts/acceptance/group-test.js.es6 b/test/javascripts/acceptance/group-test.js.es6 index a5a28125e80..3c73a89a840 100644 --- a/test/javascripts/acceptance/group-test.js.es6 +++ b/test/javascripts/acceptance/group-test.js.es6 @@ -18,7 +18,7 @@ const response = object => { }; QUnit.test("Anonymous Viewing Group", async assert => { - await visit("/groups/discourse"); + await visit("/g/discourse"); assert.equal( count(".nav-pills li a[title='Messages']"), @@ -30,12 +30,12 @@ QUnit.test("Anonymous Viewing Group", async assert => { assert.ok(count(".user-stream-item") > 0, "it lists stream items"); - await click(".activity-nav li a[href='/groups/discourse/activity/topics']"); + await click(".activity-nav li a[href='/g/discourse/activity/topics']"); assert.ok(find(".topic-list"), "it shows the topic list"); assert.equal(count(".topic-list-item"), 2, "it lists stream items"); - await click(".activity-nav li a[href='/groups/discourse/activity/mentions']"); + await click(".activity-nav li a[href='/g/discourse/activity/mentions']"); assert.ok(count(".user-stream-item") > 0, "it lists stream items"); assert.ok( @@ -68,8 +68,8 @@ QUnit.test("Anonymous Viewing Group", async assert => { Discourse.SiteSettings.enable_group_directory = false; - await visit("/groups"); - await visit("/groups/discourse"); + await visit("/g"); + await visit("/g/discourse"); await expandSelectKit(".group-dropdown"); assert.equal( @@ -80,7 +80,7 @@ QUnit.test("Anonymous Viewing Group", async assert => { }); QUnit.test("Anonymous Viewing Automatic Group", async assert => { - await visit("/groups/moderators"); + await visit("/g/moderators"); assert.equal( count(".nav-pills li a[title='Manage']"), @@ -93,7 +93,7 @@ QUnit.test("User Viewing Group", async assert => { logIn(); Discourse.reset(); - await visit("/groups"); + await visit("/g"); await click(".group-index-request"); assert.equal( @@ -117,7 +117,7 @@ QUnit.test("User Viewing Group", async assert => { "Internationalization / localization" ); - await visit("/groups/discourse"); + await visit("/g/discourse"); await click(".group-message-button"); @@ -140,7 +140,7 @@ QUnit.test( logIn(); Discourse.reset(); - await visit("/groups/discourse"); + await visit("/g/discourse"); await click(".nav-pills li a[title='Messages']"); @@ -240,7 +240,7 @@ QUnit.test("Admin viewing group messages", async assert => { logIn(); Discourse.reset(); - await visit("/groups/discourse"); + await visit("/g/discourse"); await click(".nav-pills li a[title='Messages']"); assert.equal( @@ -256,7 +256,7 @@ QUnit.test("Admin Viewing Group", async assert => { logIn(); Discourse.reset(); - await visit("/groups/discourse"); + await visit("/g/discourse"); assert.ok( find(".nav-pills li a[title='Manage']").length === 1, diff --git a/test/javascripts/acceptance/groups-index-test.js.es6 b/test/javascripts/acceptance/groups-index-test.js.es6 index 891cf4803fa..5f3f45fca68 100644 --- a/test/javascripts/acceptance/groups-index-test.js.es6 +++ b/test/javascripts/acceptance/groups-index-test.js.es6 @@ -3,11 +3,11 @@ import { acceptance } from "helpers/qunit-helpers"; acceptance("Groups"); QUnit.test("Browsing Groups", async assert => { - await visit("/groups?username=eviltrout"); + await visit("/g?username=eviltrout"); assert.equal(count(".groups-table-row"), 1, "it displays user's groups"); - await visit("/groups"); + await visit("/g"); assert.equal(count(".groups-table-row"), 2, "it displays visible groups"); assert.equal( @@ -33,7 +33,7 @@ QUnit.test("Browsing Groups", async assert => { assert.ok(exists(".modal.login-modal"), "it shows the login modal"); - await click("a[href='/groups/discourse/members']"); + await click("a[href='/g/discourse/members']"); assert.equal( find(".group-info-name") diff --git a/test/javascripts/acceptance/groups-new-test.js.es6 b/test/javascripts/acceptance/groups-new-test.js.es6 index 4aaea091e93..c2fe64478e4 100644 --- a/test/javascripts/acceptance/groups-new-test.js.es6 +++ b/test/javascripts/acceptance/groups-new-test.js.es6 @@ -3,7 +3,7 @@ import { acceptance, logIn } from "helpers/qunit-helpers"; acceptance("New Group"); QUnit.test("As an anon user", async assert => { - await visit("/groups"); + await visit("/g"); assert.equal( find(".groups-header-new").length, @@ -16,7 +16,7 @@ QUnit.test("Creating a new group", async assert => { logIn(); Discourse.reset(); - await visit("/groups"); + await visit("/g"); await click(".groups-header-new"); diff --git a/test/javascripts/fixtures/badges_fixture.js.es6 b/test/javascripts/fixtures/badges_fixture.js.es6 index 43ad075bc79..0bde34c6778 100644 --- a/test/javascripts/fixtures/badges_fixture.js.es6 +++ b/test/javascripts/fixtures/badges_fixture.js.es6 @@ -114,7 +114,7 @@ export default { id: 116, name: "Tester", description: - 'Reported 10 bugs that were liked by the Discourse team', + 'Reported 10 bugs that were liked by the Discourse team', grant_count: 9, allow_title: true, multiple_grant: false, @@ -157,7 +157,7 @@ export default { id: 114, name: "Bug Reporter", description: - 'Reported a bug that was liked by the Discourse team', + 'Reported a bug that was liked by the Discourse team', grant_count: 183, allow_title: false, multiple_grant: false, diff --git a/test/javascripts/fixtures/topic.js.es6 b/test/javascripts/fixtures/topic.js.es6 index 7fb9c4102b8..fefcc524881 100644 --- a/test/javascripts/fixtures/topic.js.es6 +++ b/test/javascripts/fixtures/topic.js.es6 @@ -4589,7 +4589,7 @@ export default { uploaded_avatar_id: 9, created_at: "2015-08-13T14:49:11.840Z", cooked: - '

This is the first post. @discourse

', + '

This is the first post. @discourse

', post_number: 1, post_type: 1, updated_at: "2015-08-13T14:49:11.840Z",