Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FEATURE: New and Unread messages for user personal messages. #13603

Merged
merged 3 commits into from Aug 2, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
8 changes: 6 additions & 2 deletions app/assets/javascripts/discourse/app/controllers/topic.js
Expand Up @@ -154,10 +154,14 @@ export default Controller.extend(bufferedProperty("model"), {
showCategoryChooser: not("model.isPrivateMessage"),

gotoInbox(name) {
let url = userPath(this.get("currentUser.username_lower") + "/messages");
let url = userPath(`${this.get("currentUser.username_lower")}/messages`);

if (name) {
url = url + "/group/" + name;
url = `${url}/group/${name}`;
} else {
url = `${url}/personal`;
}

DiscourseURL.routeTo(url);
},

Expand Down
Expand Up @@ -3,26 +3,112 @@ import { action } from "@ember/object";
import { alias, and, equal } from "@ember/object/computed";
import discourseComputed from "discourse-common/utils/decorators";
import { VIEW_NAME_WARNINGS } from "discourse/routes/user-private-messages-warnings";
import I18n from "I18n";

export const PERSONAL_INBOX = "__personal_inbox__";
const ALL_INBOX = "__all_inbox__";

export default Controller.extend({
user: controller(),

pmView: false,
viewingSelf: alias("user.viewingSelf"),
isGroup: equal("pmView", "groups"),
group: null,
groupFilter: alias("group.name"),
currentPath: alias("router._router.currentPath"),
pmTaggingEnabled: alias("site.can_tag_pms"),
tagId: null,

showNewPM: and("user.viewingSelf", "currentUser.can_send_private_messages"),

@discourseComputed("inboxes", "isAllInbox")
displayGlobalFilters(inboxes, isAllInbox) {
if (inboxes.length === 0) {
return true;
}
if (inboxes.length && isAllInbox) {
return true;
}
return false;
},

@discourseComputed("inboxes")
sectionClass(inboxes) {
const defaultClass = "user-secondary-navigation user-messages";

return inboxes.length
? `${defaultClass} user-messages-inboxes`
: defaultClass;
},

@discourseComputed("pmView")
isPersonalInbox(pmView) {
return pmView && pmView.startsWith("personal");
},

@discourseComputed("isPersonalInbox", "group.name")
isAllInbox(isPersonalInbox, groupName) {
return !this.isPersonalInbox && !groupName;
},

@discourseComputed("isPersonalInbox", "group.name")
selectedInbox(isPersonalInbox, groupName) {
if (groupName) {
return groupName;
}

return isPersonalInbox ? PERSONAL_INBOX : ALL_INBOX;
},

@discourseComputed("viewingSelf", "pmView", "currentUser.admin")
showWarningsWarning(viewingSelf, pmView, isAdmin) {
return pmView === VIEW_NAME_WARNINGS && !viewingSelf && !isAdmin;
},

@discourseComputed("model.groups")
inboxes(groups) {
const groupsWithMessages = groups?.filter((group) => {
return group.has_messages;
});

if (!groupsWithMessages || groupsWithMessages.length === 0) {
return [];
}

const inboxes = [];

inboxes.push({
id: ALL_INBOX,
name: I18n.t("user.messages.all"),
});

inboxes.push({
id: PERSONAL_INBOX,
name: I18n.t("user.messages.personal"),
icon: "envelope",
});

groupsWithMessages.forEach((group) => {
inboxes.push({ id: group.name, name: group.name, icon: "users" });
});

return inboxes;
},

@action
changeGroupNotificationLevel(notificationLevel) {
this.group.setNotification(notificationLevel, this.get("user.model.id"));
},

@action
updateInbox(inbox) {
if (inbox === ALL_INBOX) {
this.transitionToRoute("userPrivateMessages.index");
} else if (inbox === PERSONAL_INBOX) {
this.transitionToRoute("userPrivateMessages.personal");
} else {
this.transitionToRoute("userPrivateMessages.group", inbox);
}
},
});
@@ -1,5 +1,6 @@
export function findOrResetCachedTopicList(session, filter) {
const lastTopicList = session.get("topicList");

if (lastTopicList && lastTopicList.filter === filter) {
return lastTopicList;
} else {
Expand Down
11 changes: 10 additions & 1 deletion app/assets/javascripts/discourse/app/routes/app-route-map.js
Expand Up @@ -140,11 +140,20 @@ export default function () {
"userPrivateMessages",
{ path: "/messages", resetNamespace: true },
function () {
this.route("sent");
this.route("new");
this.route("unread");
this.route("archive");
this.route("sent");
this.route("personal");
this.route("personalSent", { path: "personal/sent" });
this.route("personalNew", { path: "personal/new" });
this.route("personalUnread", { path: "personal/unread" });
this.route("personalArchive", { path: "personal/archive" });
this.route("warnings");
this.route("group", { path: "group/:name" });
this.route("groupArchive", { path: "group/:name/archive" });
this.route("groupNew", { path: "group/:name/new" });
this.route("groupUnread", { path: "group/:name/unread" });
this.route("tags");
this.route("tagsShow", { path: "tags/:id" });
}
Expand Down
@@ -0,0 +1,68 @@
import I18n from "I18n";
import createPMRoute from "discourse/routes/build-private-messages-route";
import { findOrResetCachedTopicList } from "discourse/lib/cached-topic-list";

export default (viewName, channel) => {
return createPMRoute("groups", "private-messages-groups").extend({
groupName: null,

titleToken() {
const groupName = this.groupName;

if (groupName) {
let title = groupName.capitalize();

if (viewName !== "index") {
title = `${title} ${I18n.t("user.messages." + viewName)}`;
}

return [title, I18n.t(`user.private_messages`)];
}
},

model(params) {
const username = this.modelFor("user").get("username_lower");
let filter = `topics/private-messages-group/${username}/${params.name}`;

if (viewName !== "index") {
filter = `${filter}/${viewName}`;
}

const lastTopicList = findOrResetCachedTopicList(this.session, filter);

return lastTopicList
? lastTopicList
: this.store.findFiltered("topicList", { filter });
},

afterModel(model) {
const filters = model.get("filter").split("/");
let groupName;

if (viewName !== "index") {
groupName = filters[filters.length - 2];
} else {
groupName = filters.pop();
}

const group = this.modelFor("user")
.get("groups")
.filterBy("name", groupName)[0];

this.setProperties({ groupName: groupName, group });
},

setupController() {
this._super.apply(this, arguments);
this.controllerFor("user-private-messages").set("group", this.group);

if (channel) {
this.controllerFor("user-topics-list").subscribe(
`/private-messages/group/${this.get(
"groupName"
).toLowerCase()}/${channel}`
);
}
},
});
};
Expand Up @@ -23,7 +23,9 @@ export default (viewName, path, channel) => {
model() {
const filter =
"topics/" + path + "/" + this.modelFor("user").get("username_lower");

const lastTopicList = findOrResetCachedTopicList(this.session, filter);

return lastTopicList
? lastTopicList
: this.store.findFiltered("topicList", { filter });
Expand All @@ -49,6 +51,7 @@ export default (viewName, path, channel) => {
this.controllerFor("user-private-messages").setProperties({
archive: false,
pmView: viewName,
group: null,
});

this.searchService.set("contextType", "private_messages");
Expand Down
@@ -1,3 +1,7 @@
import createPMRoute from "discourse/routes/build-private-messages-route";

export default createPMRoute("archive", "private-messages-archive", "archive");
export default createPMRoute(
"archive",
"private-messages-all-archive",
"archive"
);
@@ -1,48 +1,3 @@
import I18n from "I18n";
import createPMRoute from "discourse/routes/build-private-messages-route";
import { findOrResetCachedTopicList } from "discourse/lib/cached-topic-list";
import createPMRoute from "discourse/routes/build-private-messages-group-route";

export default createPMRoute("groups", "private-messages-groups").extend({
groupName: null,

titleToken() {
const groupName = this.groupName;

if (groupName) {
return [
`${groupName.capitalize()} ${I18n.t("user.messages.archive")}`,
I18n.t("user.private_messages"),
];
}
},

model(params) {
const username = this.modelFor("user").get("username_lower");
const filter = `topics/private-messages-group/${username}/${params.name}/archive`;
const lastTopicList = findOrResetCachedTopicList(this.session, filter);
return lastTopicList
? lastTopicList
: this.store.findFiltered("topicList", { filter });
},

afterModel(model) {
const split = model.get("filter").split("/");
const groupName = split[split.length - 2];
this.set("groupName", groupName);
const group = this.modelFor("user")
.get("groups")
.filterBy("name", groupName)[0];
this.controllerFor("user-private-messages").set("group", group);
},

setupController(controller, model) {
this._super.apply(this, arguments);
const split = model.get("filter").split("/");
const group = split[split.length - 2];
this.controllerFor("user-private-messages").set("groupFilter", group);
this.controllerFor("user-private-messages").set("archive", true);
this.controllerFor("user-topics-list").subscribe(
`/private-messages/group/${group}/archive`
);
},
});
export default createPMRoute("archive", "archive");
@@ -0,0 +1,3 @@
import createPMRoute from "discourse/routes/build-private-messages-group-route";

export default createPMRoute("new", null /* no message bus notifications */);
@@ -0,0 +1,3 @@
import createPMRoute from "discourse/routes/build-private-messages-group-route";

export default createPMRoute("unread", null /* no message bus notifications */);
@@ -1,42 +1,3 @@
import I18n from "I18n";
import createPMRoute from "discourse/routes/build-private-messages-route";
import { findOrResetCachedTopicList } from "discourse/lib/cached-topic-list";
import createPMRoute from "discourse/routes/build-private-messages-group-route";

export default createPMRoute("groups", "private-messages-groups").extend({
groupName: null,

titleToken() {
const groupName = this.groupName;
if (groupName) {
return [groupName.capitalize(), I18n.t("user.private_messages")];
}
},

model(params) {
const username = this.modelFor("user").get("username_lower");
const filter = `topics/private-messages-group/${username}/${params.name}`;
const lastTopicList = findOrResetCachedTopicList(this.session, filter);
return lastTopicList
? lastTopicList
: this.store.findFiltered("topicList", { filter });
},

afterModel(model) {
const groupName = model.get("filter").split("/").pop();
this.set("groupName", groupName);
const group = this.modelFor("user")
.get("groups")
.filterBy("name", groupName)[0];
this.controllerFor("user-private-messages").set("group", group);
},

setupController(controller, model) {
this._super.apply(this, arguments);
const group = model.get("filter").split("/").pop();
this.controllerFor("user-private-messages").set("groupFilter", group);
this.controllerFor("user-private-messages").set("archive", false);
this.controllerFor("user-topics-list").subscribe(
`/private-messages/group/${group}`
);
},
});
export default createPMRoute("index", "inbox");
@@ -1,3 +1,3 @@
import createPMRoute from "discourse/routes/build-private-messages-route";

export default createPMRoute("index", "private-messages", "inbox");
export default createPMRoute("index", "private-messages-all", "inbox");
@@ -0,0 +1,7 @@
import createPMRoute from "discourse/routes/build-private-messages-route";

export default createPMRoute(
"new",
"private-messages-all-new",
null /* no message bus notifications */
);
@@ -0,0 +1,3 @@
import createPMRoute from "discourse/routes/build-private-messages-route";

export default createPMRoute("personal", "private-messages-archive", "archive");
@@ -0,0 +1,7 @@
import createPMRoute from "discourse/routes/build-private-messages-route";

export default createPMRoute(
"personal",
"private-messages-new",
null /* no message bus notifications */
);
@@ -0,0 +1,3 @@
import createPMRoute from "discourse/routes/build-private-messages-route";

export default createPMRoute("personal", "private-messages-sent", "sent");
@@ -0,0 +1,7 @@
import createPMRoute from "discourse/routes/build-private-messages-route";

export default createPMRoute(
"personal",
"private-messages-unread",
null /* no message bus notifications */
);
@@ -0,0 +1,3 @@
import createPMRoute from "discourse/routes/build-private-messages-route";

export default createPMRoute("personal", "private-messages", "inbox");