From 25d9927785b07697132504fca77b8156600966ff Mon Sep 17 00:00:00 2001 From: Mark VanLandingham Date: Thu, 14 Dec 2023 13:45:59 -0600 Subject: [PATCH] DEV: Remove DefaultNotificationItem widget (#24906) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These are no longer used anymore because we use glimmer notification items everywhere 🎉 --- .../app/widgets/default-notification-item.js | 199 ------------------ .../widgets/default-notification-item-test.js | 66 ------ 2 files changed, 265 deletions(-) delete mode 100644 app/assets/javascripts/discourse/app/widgets/default-notification-item.js delete mode 100644 app/assets/javascripts/discourse/tests/integration/components/widgets/default-notification-item-test.js diff --git a/app/assets/javascripts/discourse/app/widgets/default-notification-item.js b/app/assets/javascripts/discourse/app/widgets/default-notification-item.js deleted file mode 100644 index a85fd4590f5..00000000000 --- a/app/assets/javascripts/discourse/app/widgets/default-notification-item.js +++ /dev/null @@ -1,199 +0,0 @@ -import { isEmpty } from "@ember/utils"; -import { h } from "virtual-dom"; -import { ajax, setTransientHeader } from "discourse/lib/ajax"; -import cookie from "discourse/lib/cookie"; -import { wantsNewWindow } from "discourse/lib/intercept-click"; -import { emojiUnescape } from "discourse/lib/text"; -import DiscourseURL, { userPath } from "discourse/lib/url"; -import { - escapeExpression, - formatUsername, - postUrl, -} from "discourse/lib/utilities"; -import RawHtml from "discourse/widgets/raw-html"; -import { createWidget } from "discourse/widgets/widget"; -import getURL from "discourse-common/lib/get-url"; -import { iconNode } from "discourse-common/lib/icon-library"; -import I18n from "discourse-i18n"; - -export const DefaultNotificationItem = createWidget( - "default-notification-item", - { - tagName: "li", - - buildClasses(attrs) { - const classNames = []; - if (attrs.get("read")) { - classNames.push("read"); - } - if (attrs.is_warning) { - classNames.push("is-warning"); - } - const notificationName = this.lookupNotificationName( - attrs.notification_type - ); - if (notificationName) { - classNames.push(notificationName.replace(/_/g, "-")); - } - return classNames; - }, - - url(data) { - const attrs = this.attrs; - - const badgeId = data.badge_id; - if (badgeId) { - let badgeSlug = data.badge_slug; - - if (!badgeSlug) { - const badgeName = data.badge_name; - badgeSlug = badgeName.replace(/[^A-Za-z0-9_]+/g, "-").toLowerCase(); - } - - let username = data.username; - username = username ? "?username=" + username.toLowerCase() : ""; - return getURL("/badges/" + badgeId + "/" + badgeSlug + username); - } - - const topicId = attrs.topic_id; - - if (topicId) { - return postUrl(attrs.slug, topicId, attrs.post_number); - } - - if (data.group_id) { - return userPath(data.username + "/messages/group/" + data.group_name); - } - - if (data.bookmarkable_url) { - return getURL(data.bookmarkable_url); - } - }, - - description(data) { - const badgeName = data.badge_name; - if (badgeName) { - return escapeExpression(badgeName); - } - - const groupName = data.group_name; - - if (groupName) { - if (this.attrs.fancy_title) { - if (this.attrs.topic_id) { - return `@${groupName} ${this.attrs.fancy_title}`; - } - return `@${groupName} ${this.attrs.fancy_title}`; - } - } - - if (this.attrs.fancy_title) { - if (this.attrs.topic_id) { - return `${this.attrs.fancy_title}`; - } - return this.attrs.fancy_title; - } - - const description = data.topic_title || data.title; - - return isEmpty(description) ? "" : escapeExpression(description); - }, - - text(notificationName, data) { - const username = formatUsername(data.display_username); - const description = this.description(data, notificationName); - - return I18n.t(`notifications.${notificationName}`, { - description, - username, - }); - }, - - icon(notificationName) { - return iconNode(`notification.${notificationName}`); - }, - - _addA11yAttrsTo(icon, notificationName) { - icon.properties.attributes["aria-label"] = I18n.t( - `notifications.titles.${notificationName}` - ); - icon.properties.attributes["aria-hidden"] = false; - icon.properties.attributes["role"] = "img"; - return icon; - }, - - notificationTitle(notificationName) { - if (notificationName) { - return I18n.t(`notifications.titles.${notificationName}`); - } else { - return ""; - } - }, - - lookupNotificationName(notificationType) { - const lookup = this.site.get("notificationLookup"); - return lookup[notificationType]; - }, - - html(attrs) { - const notificationName = this.lookupNotificationName( - attrs.notification_type - ); - let { data } = attrs; - let text = emojiUnescape(this.text(notificationName, data)); - let icon = this.icon(notificationName, data); - this._addA11yAttrsTo(icon, notificationName); - - const title = this.notificationTitle(notificationName, data); - - // We can use a `

` tag here once other languages have fixed their HTML - // translations. - let html = new RawHtml({ html: `

${text}
` }); - - let contents = [icon, html]; - - const href = this.url(data); - return href - ? h( - "a", - { attributes: { href, title, "data-auto-route": true } }, - contents - ) - : contents; - }, - - click(e) { - this.attrs.set("read", true); - const id = this.attrs.id; - setTransientHeader("Discourse-Clear-Notifications", id); - cookie("cn", id, { path: getURL("/") }); - - if (wantsNewWindow(e)) { - return; - } - e.preventDefault(); - - this.sendWidgetEvent("linkClicked"); - if (this.attrs.data.revision_number) { - this.appEvents.trigger("edit-notification:clicked", { - topicId: this.attrs.topic_id, - postNumber: this.attrs.post_number, - revisionNumber: this.attrs.data.revision_number, - }); - } - DiscourseURL.routeTo(this.url(this.attrs.data)); - }, - - mouseUp(event) { - // dismiss notification on middle click - if (event.which === 2 && !this.attrs.read) { - this.attrs.set("read", true); - ajax("/notifications/mark-read", { - method: "PUT", - data: { id: this.attrs.id }, - }); - this.scheduleRerender(); - } - }, - } -); diff --git a/app/assets/javascripts/discourse/tests/integration/components/widgets/default-notification-item-test.js b/app/assets/javascripts/discourse/tests/integration/components/widgets/default-notification-item-test.js deleted file mode 100644 index 8aaac2011ba..00000000000 --- a/app/assets/javascripts/discourse/tests/integration/components/widgets/default-notification-item-test.js +++ /dev/null @@ -1,66 +0,0 @@ -import EmberObject from "@ember/object"; -import { render, triggerEvent } from "@ember/test-helpers"; -import { hbs } from "ember-cli-htmlbars"; -import { module, test } from "qunit"; -import { setupRenderingTest } from "discourse/tests/helpers/component-test"; -import pretender, { response } from "discourse/tests/helpers/create-pretender"; -import { count, exists } from "discourse/tests/helpers/qunit-helpers"; - -module( - "Integration | Component | Widget | default-notification-item", - function (hooks) { - setupRenderingTest(hooks); - - test("sets notification as read on middle click", async function (assert) { - this.set( - "args", - EmberObject.create({ - id: 3, - user_id: 1, - notification_type: 6, - read: false, - created_at: "2020-01-01T12:00:00.000Z", - post_number: 1, - topic_id: 10, - fancy_title: "Greetings!", - slug: "greetings", - data: { - topic_title: "Greetings!", - original_post_id: 14, - original_post_type: 1, - original_username: "discobot", - revision_number: null, - display_username: "discobot", - }, - }) - ); - - await render( - hbs`` - ); - - let requests = 0; - pretender.put("/notifications/mark-read", (request) => { - ++requests; - - assert.strictEqual( - request.requestBody, - `id=${this.args.id}`, - "it sets correct request parameters" - ); - - return response({ success: true }); - }); - - assert.ok(!exists("li.read")); - - await triggerEvent("li", "mouseup", { button: 1, which: 2 }); - assert.strictEqual( - count("li.read"), - 1, - "only one item is marked as read" - ); - assert.strictEqual(requests, 1); - }); - } -);