UX: Use DPageHeader on the Emails page (#30781)

There are a few changes here to make the Emails admin page more consistent with the rest of the admin UI.

- The header and navigation menu have been updated.
- The sidebar now stays highlighted when visiting the email admin sub-pages.
- Moved the Template editor from /admin/customize/email_templates to /admin/email/templates, so it fit as a sub-page.
- Removed the link to the Template editor from the Customize section of the old top menu, since it's accessible from the Emails section, instead.
This commit is contained in:
Gary Pendergast
2025-01-15 15:36:16 +11:00
committed by GitHub
parent 698e7a17dd
commit 5da6a06ce3
16 changed files with 84 additions and 82 deletions

View File

@@ -6,11 +6,11 @@ import discourseComputed from "discourse/lib/decorators";
import { bufferedProperty } from "discourse/mixins/buffered-content";
import { i18n } from "discourse-i18n";
export default class AdminCustomizeEmailTemplatesEditController extends Controller.extend(
export default class AdminEmailTemplatesEditController extends Controller.extend(
bufferedProperty("emailTemplate")
) {
@service dialog;
@controller adminCustomizeEmailTemplates;
@controller adminEmailTemplates;
emailTemplate = null;
saved = false;

View File

@@ -3,7 +3,7 @@ import { action } from "@ember/object";
import { sort } from "@ember/object/computed";
import { service } from "@ember/service";
export default class AdminCustomizeEmailTemplatesController extends Controller {
export default class AdminEmailTemplatesController extends Controller {
@service router;
titleSorting = ["title"];
@@ -11,6 +11,6 @@ export default class AdminCustomizeEmailTemplatesController extends Controller {
@action
onSelectTemplate(template) {
this.router.transitionTo("adminCustomizeEmailTemplates.edit", template);
this.router.transitionTo("adminEmailTemplates.edit", template);
}
}

View File

@@ -4,7 +4,7 @@ import RestModel from "discourse/models/rest";
export default class EmailTemplate extends RestModel {
revert() {
return ajax(`/admin/customize/email_templates/${this.id}`, {
return ajax(`/admin/email/templates/${this.id}`, {
type: "DELETE",
}).then((result) =>
getProperties(result.email_template, "subject", "body", "can_revert")

View File

@@ -1,9 +1,9 @@
import Route from "@ember/routing/route";
import { scrollTop } from "discourse/mixins/scroll-top";
export default class AdminCustomizeEmailTemplatesEditRoute extends Route {
export default class AdminEmailTemplatesEditRoute extends Route {
model(params) {
const all = this.modelFor("adminCustomizeEmailTemplates");
const all = this.modelFor("adminEmailTemplates");
return all.findBy("id", params.id);
}

View File

@@ -2,7 +2,7 @@ import { action } from "@ember/object";
import Route from "@ember/routing/route";
import { service } from "@ember/service";
export default class AdminCustomizeEmailTemplatesRoute extends Route {
export default class AdminEmailTemplatesRoute extends Route {
@service router;
model() {
@@ -15,13 +15,11 @@ export default class AdminCustomizeEmailTemplatesRoute extends Route {
@action
didTransition() {
const editController = this.controllerFor(
"adminCustomizeEmailTemplates.edit"
);
const editController = this.controllerFor("adminEmailTemplates.edit");
if (!editController.emailTemplate) {
this.router.transitionTo(
"adminCustomizeEmailTemplates.edit",
"adminEmailTemplates.edit",
this.controller.get("sortedTemplates.firstObject")
);
}

View File

@@ -38,6 +38,13 @@ export default function () {
this.route("rejected");
this.route("previewDigest", { path: "/preview-digest" });
this.route("advancedTest", { path: "/advanced-test" });
this.route(
"adminEmailTemplates",
{ path: "/templates", resetNamespace: true },
function () {
this.route("edit", { path: "/:id" });
}
);
}
);
@@ -80,13 +87,6 @@ export default function () {
this.route("edit", { path: "/:id" });
}
);
this.route(
"adminCustomizeEmailTemplates",
{ path: "/email_templates", resetNamespace: true },
function () {
this.route("edit", { path: "/:id" });
}
);
this.route("adminCustomizeRobotsTxt", {
path: "/robots",
resetNamespace: true,

View File

@@ -17,11 +17,6 @@
@label="admin.site_text.title"
class="admin-customize-site-text"
/>
<NavItem
@route="adminCustomizeEmailTemplates"
@label="admin.customize.email_templates.title"
class="admin-customize-email-templates"
/>
<NavItem
@route="adminCustomizeEmailStyle"
@label="admin.customize.email_style.title"

View File

@@ -1,7 +1,7 @@
<ComboBox
@value={{this.emailTemplate.id}}
@content={{this.adminCustomizeEmailTemplates.sortedTemplates}}
@onChange={{this.adminCustomizeEmailTemplates.onSelectTemplate}}
@content={{this.adminEmailTemplates.sortedTemplates}}
@onChange={{this.adminEmailTemplates.onSelectTemplate}}
@nameProperty="title"
/>

View File

@@ -1,23 +1,33 @@
<AdminNav>
<NavItem @route="adminEmail.index" @label="admin.email.settings" />
<NavItem
@route="adminEmail.previewDigest"
@label="admin.email.preview_digest"
/>
<NavItem
@route="adminEmail.advancedTest"
@label="admin.email.advanced_test.title"
/>
<NavItem
@route="adminCustomizeEmailTemplates"
@label="admin.email.templates"
/>
<NavItem @route="adminEmail.sent" @label="admin.email.sent" />
<NavItem @route="adminEmail.skipped" @label="admin.email.skipped" />
<NavItem @route="adminEmail.bounced" @label="admin.email.bounced" />
<NavItem @route="adminEmail.received" @label="admin.email.received" />
<NavItem @route="adminEmail.rejected" @label="admin.email.rejected" />
</AdminNav>
<DPageHeader
@titleLabel={{i18n "admin.email.title"}}
@descriptionLabel={{i18n "admin.email.description"}}
@shouldDisplay={{true}}
>
<:breadcrumbs>
<DBreadcrumbsItem @path="/admin" @label={{i18n "admin_title"}} />
<DBreadcrumbsItem
@path="/admin/email"
@label={{i18n "admin.email.title"}}
/>
</:breadcrumbs>
<:tabs>
<NavItem @route="adminEmail.index" @label="admin.email.settings" />
<NavItem
@route="adminEmail.previewDigest"
@label="admin.email.preview_digest"
/>
<NavItem
@route="adminEmail.advancedTest"
@label="admin.email.advanced_test.title"
/>
<NavItem @route="adminEmailTemplates" @label="admin.email.templates" />
<NavItem @route="adminEmail.sent" @label="admin.email.sent" />
<NavItem @route="adminEmail.skipped" @label="admin.email.skipped" />
<NavItem @route="adminEmail.bounced" @label="admin.email.bounced" />
<NavItem @route="adminEmail.received" @label="admin.email.received" />
<NavItem @route="adminEmail.rejected" @label="admin.email.rejected" />
</:tabs>
</DPageHeader>
<div class="admin-container">
{{outlet}}

View File

@@ -1,7 +1,9 @@
import RestAdapter from "discourse/adapters/rest";
export default class EmailTemplateAdapter extends RestAdapter {
basePath() {
return "/admin/customize/";
pathFor(store, type, id) {
return id === undefined
? "/admin/email/templates"
: `/admin/email/templates/${id}`;
}
}

View File

@@ -162,7 +162,7 @@ export const ADMIN_NAV_MAP = [
links: [
{
name: "admin_server_setup",
route: "adminEmail.index",
route: "adminEmail",
label: "admin.email_settings.sidebar_link.server_setup.title",
icon: "gear",
keywords: "admin.email_settings.sidebar_link.server_setup.keywords",

View File

@@ -955,7 +955,7 @@
}
}
.admin-customize-email-templates {
.admin-email-templates {
.email-template,
.controls {
margin-top: 1em;