diff --git a/app/assets/javascripts/admin/addon/templates/backups-index.hbs b/app/assets/javascripts/admin/addon/templates/backups-index.hbs index aaf7bd5849a..12b36f4b89d 100644 --- a/app/assets/javascripts/admin/addon/templates/backups-index.hbs +++ b/app/assets/javascripts/admin/addon/templates/backups-index.hbs @@ -27,6 +27,10 @@ class="btn-default" /> {{/if}} + + {{i18n "admin.backups.settings"}} + +
{{#if this.status.restoreDisabled}} {{d-icon diff --git a/app/assets/javascripts/admin/addon/templates/emojis.hbs b/app/assets/javascripts/admin/addon/templates/emojis.hbs index 334a8a169a0..9161d07b3af 100644 --- a/app/assets/javascripts/admin/addon/templates/emojis.hbs +++ b/app/assets/javascripts/admin/addon/templates/emojis.hbs @@ -1,5 +1,14 @@
-

{{i18n "admin.emoji.title"}}

+
+

{{i18n "admin.emoji.title"}}

+ + {{i18n "admin.emoji.settings"}} + +

{{i18n "admin.emoji.help"}}

diff --git a/app/assets/javascripts/discourse/app/components/sidebar/api-section.hbs b/app/assets/javascripts/discourse/app/components/sidebar/api-section.hbs index 8b6cb1fb812..a57ebf51186 100644 --- a/app/assets/javascripts/discourse/app/components/sidebar/api-section.hbs +++ b/app/assets/javascripts/discourse/app/components/sidebar/api-section.hbs @@ -16,6 +16,7 @@ @linkClass={{link.classNames}} @route={{link.route}} @model={{link.model}} + @query={{link.query}} @models={{link.models}} @href={{link.href}} @title={{link.title}} diff --git a/app/assets/javascripts/discourse/app/lib/sidebar/admin-nav-map.js b/app/assets/javascripts/discourse/app/lib/sidebar/admin-nav-map.js index aaa9aec67b7..07bda59e4eb 100644 --- a/app/assets/javascripts/discourse/app/lib/sidebar/admin-nav-map.js +++ b/app/assets/javascripts/discourse/app/lib/sidebar/admin-nav-map.js @@ -1,6 +1,285 @@ import getURL from "discourse-common/lib/get-url"; export const ADMIN_NAV_MAP = [ + { + name: "account", + label: "admin.account.title", + links: [ + { + name: "admin_backups", + route: "admin.backups", + label: "admin.account.sidebar_link.backups", + icon: "archive", + }, + { + name: "admin_whats_new", + route: "admin.dashboardNewFeatures", + label: "admin.account.sidebar_link.whats_new", + icon: "gift", + }, + ], + }, + { + name: "reports", + label: "admin.reports.sidebar_title", + links: [ + { + name: "admin_all_reports", + route: "admin.dashboardReports", + label: "admin.reports.sidebar_link.all", + icon: "chart-bar", + }, + ], + }, + { + name: "community", + label: "admin.community.title", + links: [ + { + name: "admin_about_your_site", + route: "adminSiteSettingsCategory", + routeModels: ["required"], + query: { filter: "" }, + label: "admin.community.sidebar_link.about_your_site", + icon: "cog", + }, + { + name: "admin_badges", + route: "adminBadges", + label: "admin.community.sidebar_link.badges", + icon: "certificate", + }, + { + name: "admin_login_and_authentication", + route: "adminSiteSettingsCategory", + routeModels: ["login"], + query: { filter: "" }, + label: "admin.community.sidebar_link.login_and_authentication", + icon: "unlock", + }, + { + name: "admin_notifications", + route: "adminSiteSettingsCategory", + routeModels: ["all_results"], + query: { filter: "notifications" }, + label: "admin.community.sidebar_link.notifications", + icon: "bell", + }, + { + name: "admin_permalinks", + route: "adminPermalinks", + label: "admin.community.sidebar_link.permalinks", + icon: "link", + }, + { + name: "admin_trust_levels", + route: "adminSiteSettingsCategory", + routeModels: ["trust"], + query: { filter: "" }, + label: "admin.community.sidebar_link.trust_levels", + icon: "user-shield", + }, + { + name: "admin_users", + route: "adminUsers", + label: "admin.community.sidebar_link.users", + icon: "users", + }, + { + name: "admin_user_fields", + route: "adminUserFields", + label: "admin.community.sidebar_link.user_fields", + icon: "user-edit", + }, + { + name: "admin_watched_words", + route: "adminWatchedWords", + label: "admin.community.sidebar_link.watched_words", + icon: "eye", + }, + { + name: "admin_legal", + route: "adminSiteSettingsCategory", + routeModels: ["legal"], + query: { filter: "" }, + label: "admin.community.sidebar_link.legal", + icon: "gavel", + }, + ], + }, + { + name: "appearance", + label: "admin.appearance.title", + links: [ + { + name: "admin_font_style", + route: "adminSiteSettingsCategory", + routeModels: ["all_results"], + query: { filter: "font" }, + label: "admin.appearance.sidebar_link.font_style", + icon: "italic", + }, + { + name: "admin_site_logo", + route: "adminSiteSettingsCategory", + routeModels: ["branding"], + query: { filter: "" }, + label: "admin.appearance.sidebar_link.site_logo", + icon: "fab-discourse", + }, + { + name: "admin_color_schemes", + route: "adminCustomize.colors", + label: "admin.appearance.sidebar_link.color_schemes", + icon: "palette", + }, + { + name: "admin_emoji", + route: "adminEmojis", + label: "admin.appearance.sidebar_link.emoji", + icon: "discourse-emojis", + }, + { + name: "admin_navigation", + route: "adminSiteSettingsCategory", + routeModels: ["all_results"], + query: { filter: "navigation" }, + label: "admin.appearance.sidebar_link.navigation", + icon: "project-diagram", + }, + { + name: "admin_themes", + route: "adminCustomizeThemes", + query: { tab: "themes" }, + label: "admin.appearance.sidebar_link.themes", + icon: "paint-brush", + }, + { + name: "admin_customize_site_texts", + route: "adminSiteText", + label: "admin.appearance.sidebar_link.site_texts", + icon: "language", + }, + ], + }, + { + name: "email_settings", + label: "admin.email_settings.title", + links: [ + { + name: "admin_appearance", + route: "adminCustomizeEmailStyle", + label: "admin.email_settings.sidebar_link.appearance", + icon: "envelope", + }, + { + name: "admin_preview_summary", + route: "adminEmail.previewDigest", + label: "admin.email_settings.sidebar_link.preview_summary", + icon: "notification.private_message", + }, + { + name: "admin_server_setup", + route: "adminEmail.index", + label: "admin.email_settings.sidebar_link.server_setup", + icon: "cog", + }, + ], + }, + { + name: "email_logs", + label: "admin.email_logs.title", + links: [ + { + name: "admin_email_sent", + route: "adminEmail.sent", + label: "admin.email_logs.sidebar_link.sent", + icon: "arrow-right", + }, + { + name: "admin_email_skipped", + route: "adminEmail.skipped", + label: "admin.email_logs.sidebar_link.skipped", + icon: "angle-double-right", + }, + { + name: "admin_email_bounced", + route: "adminEmail.bounced", + label: "admin.email_logs.sidebar_link.bounced", + icon: "times", + }, + { + name: "admin_email_received", + route: "adminEmail.received", + label: "admin.email_logs.sidebar_link.received", + icon: "inbox", + }, + { + name: "admin_email_rejected", + route: "adminEmail.rejected", + label: "admin.email_logs.sidebar_link.rejected", + icon: "ban", + }, + ], + }, + { + name: "security", + label: "admin.security.title", + links: [ + { + name: "admin_logs_error_logs", + href: getURL("/logs"), + label: "admin.security.sidebar_link.error_logs", + icon: "external-link-alt", + }, + { + name: "admin_logs_screened_emails", + route: "adminLogs.screenedEmails", + label: "admin.security.sidebar_link.screened_emails", + icon: "envelope", + }, + { + name: "admin_logs_screened_ip_addresses", + route: "adminLogs.screenedIpAddresses", + label: "admin.security.sidebar_link.screened_ips", + icon: "globe", + }, + { + name: "admin_logs_screened_urls", + route: "adminLogs.screenedUrls", + label: "admin.security.sidebar_link.screened_urls", + icon: "globe", + }, + { + name: "admin_logs_search_logs", + route: "adminSearchLogs", + label: "admin.security.sidebar_link.search_logs", + icon: "search", + }, + { + name: "admin_security", + route: "adminSiteSettingsCategory", + routeModels: ["security"], + query: { filter: "" }, + label: "admin.security.sidebar_link.security", + icon: "lock", + }, + { + name: "admin_spam", + route: "adminSiteSettingsCategory", + routeModels: ["spam"], + query: { filter: "" }, + label: "admin.security.sidebar_link.spam", + icon: "robot", + }, + { + name: "admin_logs_staff_action_logs", + route: "adminLogs.staffActionLogs", + label: "admin.security.sidebar_link.staff_action_logs", + icon: "user-shield", + }, + ], + }, { name: "plugins", label: "admin.plugins.title", @@ -8,206 +287,96 @@ export const ADMIN_NAV_MAP = [ { name: "admin_installed_plugins", route: "adminPlugins.index", - label: "admin.plugins.installed", + label: "admin.plugins.sidebar_link.installed", icon: "puzzle-piece", }, ], }, { - name: "email", - text: "Emails", - links: [ - { - name: "admin_email", - route: "adminEmail.index", - label: "admin.email.settings", - icon: "cog", - }, - { - name: "admin_email_sent", - route: "adminEmail.sent", - label: "admin.email.sent", - icon: "arrow-right", - }, - { - name: "admin_email_skipped", - route: "adminEmail.skipped", - label: "admin.email.skipped", - icon: "angle-double-right", - }, - { - name: "admin_email_bounced", - route: "adminEmail.bounced", - label: "admin.email.bounced", - icon: "times", - }, - { - name: "admin_email_received", - route: "adminEmail.received", - label: "admin.email.received", - icon: "inbox", - }, - { - name: "admin_email_rejected", - route: "adminEmail.rejected", - label: "admin.email.rejected", - icon: "ban", - }, - { - name: "admin_email_preview_summary", - route: "adminEmail.previewDigest", - label: "admin.email.preview_digest", - icon: "notification.private_message", - }, - { - name: "admin_email_advanced_test", - route: "adminEmail.advancedTest", - label: "admin.email.advanced_test.title", - icon: "wrench", - }, - ], - }, - { - name: "logs", - label: "admin.logs.title", - links: [ - { - name: "admin_logs_staff_action_logs", - route: "adminLogs.staffActionLogs", - label: "admin.logs.staff_actions.title", - icon: "user-shield", - }, - { - name: "admin_logs_screened_emails", - route: "adminLogs.screenedEmails", - label: "admin.logs.screened_emails.title", - icon: "envelope", - }, - { - name: "admin_logs_screened_ip_addresses", - route: "adminLogs.screenedIpAddresses", - label: "admin.logs.screened_ips.title", - icon: "globe", - }, - { - name: "admin_logs_screened_urls", - route: "adminLogs.screenedUrls", - label: "admin.logs.screened_urls.title", - icon: "globe", - }, - { - name: "admin_logs_search_logs", - route: "adminSearchLogs", - label: "admin.logs.search_logs.title", - icon: "search", - }, - { - name: "admin_logs_error_logs", - href: getURL("/logs"), - label: "admin.logs.logster.title", - icon: "external-link-alt", - }, - ], - }, - { - name: "customize", - label: "admin.customize.title", - links: [ - { - name: "admin_customize_themes", - route: "adminCustomizeThemes", - label: "admin.customize.theme.title", - icon: "paint-brush", - }, - { - name: "admin_customize_colors", - route: "adminCustomize.colors", - label: "admin.customize.colors.title", - icon: "palette", - }, - { - name: "admin_customize_site_texts", - route: "adminSiteText", - label: "admin.site_text.title", - icon: "language", - }, - { - name: "admin_customize_email_templates", - route: "adminCustomizeEmailTemplates", - label: "admin.email.templates_title", - icon: "envelope", - }, - { - name: "admin_customize_email_style", - route: "adminCustomizeEmailStyle", - label: "admin.customize.email_style.title", - icon: "envelope", - }, - { - name: "admin_customize_user_fields", - route: "adminUserFields", - label: "admin.user_fields.title", - icon: "user-edit", - }, - { - name: "admin_customize_emojis", - route: "adminEmojis", - label: "admin.emoji.title", - icon: "discourse-emojis", - }, - { - name: "admin_customize_permalinks", - route: "adminPermalinks", - label: "admin.permalink.title", - icon: "link", - }, - { - name: "admin_customize_embedding", - route: "adminEmbedding", - label: "admin.embedding.title", - icon: "code", - }, - { - name: "admin_customize_watched_words", - route: "adminWatchedWords", - label: "admin.watched_words.title", - icon: "eye", - }, - ], - }, - { - name: "api", - label: "admin.api.title", + name: "advanced", + label: "admin.advanced.title", links: [ { name: "admin_api_keys", route: "adminApiKeys", icon: "key", - label: "admin.api.keys", + label: "admin.advanced.sidebar_link.api_keys", + }, + { + name: "admin_developer", + route: "adminSiteSettingsCategory", + routeModels: ["developer"], + query: { filter: "" }, + label: "admin.advanced.sidebar_link.developer", + icon: "keyboard", + }, + { + name: "admin_embedding", + route: "adminEmbedding", + label: "admin.advanced.sidebar_link.embedding", + icon: "code", + }, + { + name: "admin_rate_limits", + route: "adminSiteSettingsCategory", + routeModels: ["rate_limits"], + query: { filter: "" }, + label: "admin.advanced.sidebar_link.rate_limits", + icon: "rocket", + }, + { + name: "admin_user_api", + route: "adminSiteSettingsCategory", + routeModels: ["user_api"], + query: { filter: "" }, + label: "admin.advanced.sidebar_link.user_api", + icon: "random", }, { name: "admin_api_web_hooks", route: "adminWebHooks", - label: "admin.web_hooks.title", + label: "admin.advanced.sidebar_link.web_hooks", icon: "globe", }, - ], - }, - { - name: "backups", - label: "admin.backups.menu.backups", - links: [ { - name: "admin_backups", - route: "admin.backups.index", - label: "admin.backups.menu.backups", - icon: "archive", + name: "admin_onebox", + route: "adminSiteSettingsCategory", + routeModels: ["onebox"], + query: { filter: "" }, + label: "admin.advanced.sidebar_link.onebox", + icon: "far-square", }, { - name: "admin_backups_logs", - route: "admin.backups.logs", - label: "admin.backups.menu.logs", - icon: "stream", + name: "admin_files", + route: "adminSiteSettingsCategory", + routeModels: ["files"], + query: { filter: "" }, + label: "admin.advanced.sidebar_link.files", + icon: "file", + }, + { + name: "admin_other_options", + route: "adminSiteSettingsCategory", + routeModels: ["uncategorized"], + query: { filter: "" }, + label: "admin.advanced.sidebar_link.other_options", + icon: "discourse-other-tab", + }, + { + name: "admin_search", + route: "adminSiteSettingsCategory", + routeModels: ["search"], + query: { filter: "" }, + label: "admin.advanced.sidebar_link.search", + icon: "search", + }, + { + name: "admin_experimental", + route: "adminSiteSettingsCategory", + routeModels: ["all_results"], + query: { filter: "experimental" }, + label: "admin.advanced.sidebar_link.experimental", + icon: "discourse-sparkles", }, ], }, diff --git a/app/assets/javascripts/discourse/app/lib/sidebar/admin-sidebar.js b/app/assets/javascripts/discourse/app/lib/sidebar/admin-sidebar.js index 35078cd3456..d61564e8cdd 100644 --- a/app/assets/javascripts/discourse/app/lib/sidebar/admin-sidebar.js +++ b/app/assets/javascripts/discourse/app/lib/sidebar/admin-sidebar.js @@ -37,6 +37,10 @@ class SidebarAdminSectionLink extends BaseCustomSidebarSectionLink { return this.adminSidebarNavLink.href; } + get query() { + return this.adminSidebarNavLink.query; + } + get models() { return this.adminSidebarNavLink.routeModels; } @@ -111,29 +115,11 @@ export function useAdminNavConfig(navMap) { hideSectionHeader: true, links: [ { - name: "admin_dashboard", - route: "admin.dashboard", + name: "admin_home", + route: "admin.dashboard.general", label: "admin.dashboard.title", icon: "home", }, - { - name: "admin_site_settings", - route: "adminSiteSettings", - label: "admin.site_settings.title", - icon: "cog", - }, - { - name: "admin_users", - route: "adminUsers", - label: "admin.users.title", - icon: "users", - }, - { - name: "admin_badges", - route: "adminBadges", - label: "admin.badges.title", - icon: "certificate", - }, ], }, ]; @@ -234,7 +220,7 @@ export default class AdminSidebarPanel extends BaseCustomSidebarPanel { } if (siteSettings.experimental_form_templates) { - navMap.findBy("name", "customize").links.push({ + navMap.findBy("name", "appearance").links.push({ name: "admin_customize_form_templates", route: "adminCustomizeFormTemplates", label: "admin.form_templates.nav_title", diff --git a/app/assets/javascripts/discourse/tests/acceptance/admin-sidebar-section-test.js b/app/assets/javascripts/discourse/tests/acceptance/admin-sidebar-section-test.js index 74219fe8204..822b8b4f944 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/admin-sidebar-section-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/admin-sidebar-section-test.js @@ -28,31 +28,53 @@ acceptance("Admin Sidebar - Sections", function (needs) { exists(".sidebar-section[data-section-name='admin-nav-section-root']"), "root section is displayed" ); + assert.ok( + exists(".sidebar-section[data-section-name='admin-nav-section-account']"), + "account section is displayed" + ); + assert.ok( + exists(".sidebar-section[data-section-name='admin-nav-section-reports']"), + "reports section is displayed" + ); + assert.ok( + exists( + ".sidebar-section[data-section-name='admin-nav-section-community']" + ), + "community section is displayed" + ); + assert.ok( + exists( + ".sidebar-section[data-section-name='admin-nav-section-appearance']" + ), + "appearance section is displayed" + ); + assert.ok( + exists( + ".sidebar-section[data-section-name='admin-nav-section-email_settings']" + ), + "email settings section is displayed" + ); + assert.ok( + exists( + ".sidebar-section[data-section-name='admin-nav-section-email_logs']" + ), + "email logs settings section is displayed" + ); + assert.ok( + exists( + ".sidebar-section[data-section-name='admin-nav-section-security']" + ), + "security settings section is displayed" + ); assert.ok( exists(".sidebar-section[data-section-name='admin-nav-section-plugins']"), "plugins section is displayed" ); - assert.ok( - exists(".sidebar-section[data-section-name='admin-nav-section-email']"), - "email section is displayed" - ); - assert.ok( - exists(".sidebar-section[data-section-name='admin-nav-section-logs']"), - "logs section is displayed" - ); assert.ok( exists( - ".sidebar-section[data-section-name='admin-nav-section-customize']" + ".sidebar-section[data-section-name='admin-nav-section-advanced']" ), - "customize section is displayed" - ); - assert.ok( - exists(".sidebar-section[data-section-name='admin-nav-section-api']"), - "api section is displayed" - ); - assert.ok( - exists(".sidebar-section[data-section-name='admin-nav-section-backups']"), - "backups section is displayed" + "advanced section is displayed" ); }); diff --git a/app/assets/stylesheets/common/admin/admin_emojis.scss b/app/assets/stylesheets/common/admin/admin_emojis.scss index 163f55f3e60..f472fc64455 100644 --- a/app/assets/stylesheets/common/admin/admin_emojis.scss +++ b/app/assets/stylesheets/common/admin/admin_emojis.scss @@ -19,3 +19,12 @@ } } } +.admin-emojis__header { + display: flex; + justify-content: space-between; + align-items: center; + a { + font-size: var(--font-up-1); + margin-bottom: 10px; + } +} diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index ca7ecc4eeed..f58559167b5 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -4821,6 +4821,9 @@ en: reports: title: "List of available reports" meta_doc: "Explore our
documentation for a detailed overview of the reports." + sidebar_title: "Reports" + sidebar_link: + all: "All" dashboard: title: "Dashboard" @@ -5230,6 +5233,67 @@ en: timestamp: "Created" completion: "Completion Time" actions: "Actions" + home: + title: "Home" + account: + title: "Account" + sidebar_link: + backups: "Backups" + whats_new: "What's New" + + community: + title: "Community" + sidebar_link: + about_your_site: "About Your Site" + badges: "Badges" + login_and_authentication: "Login & Authentication" + notifications: "Notifications" + permalinks: "Permalinks" + trust_levels: "Trust Levels" + users: "Users" + user_fields: "User Fields" + watched_words: "Watched Words" + legal: "Legal" + + appearance: + title: "Appearance" + sidebar_link: + font_style: "Font Style" + site_logo: "Site Logo" + color_schemes: "Color Schemes" + emoji: "Emoji" + navigation: "Navigation" + themes: "Themes" + site_texts: "Site Texts" + + email_settings: + title: "Email Settings" + sidebar_link: + appearance: "Appearance" + preview_summary: "Preview Summary" + server_setup: "Server Setup" + + email_logs: + title: "Email Logs" + sidebar_link: + sent: "Sent" + skipped: "Skipped" + bounced: "Bounced" + received: "Received" + rejected: "Rejected" + + security: + title: "Security" + sidebar_link: + error_logs: "Error Logs" + screened_emails: "Screened Emails" + screened_ips: "Screened IPs" + screened_urls: "Screened URLs" + search_logs: "Search Logs" + security: "Security" + spam: "Spam" + staff_action_logs: "Staff Action Logs" + plugins: title: "Plugins" installed: "Installed Plugins" @@ -5246,6 +5310,23 @@ en: author: "By %{author}" experimental_badge: "experimental" learn_more: "Learn more" + sidebar_link: + installed: "Installed" + + advanced: + title: "Advanced" + sidebar_link: + api_keys: "API keys" + developer: "Developer" + embedding: "Embedding" + rate_limits: "Rate Limits" + user_api: "User API" + web_hooks: "Webhooks" + onebox: "Onebox" + files: "Files" + other_options: "Other" + search: "Search" + experimental: "Experimental" navigation_menu: sidebar: "Sidebar" @@ -5278,6 +5359,7 @@ en: uploading_progress: "Uploading… %{progress}%" success: "'%{filename}' has successfully been uploaded. The file is now being processed and will take up to a minute to show up in the list." error: "There has been an error while uploading '%{filename}': %{message}" + settings: "Settings" operations: is_running: "An operation is currently running…" failed: "The %{operation} failed. Please check the logs." @@ -6590,6 +6672,7 @@ en: image: "Image" alt: "custom emoji preview" delete_confirm: "Are you sure you want to delete the :%{name}: emoji?" + settings: "Settings" embedding: get_started: "If you'd like to embed Discourse on another website, begin by adding its host." diff --git a/lib/svg_sprite.rb b/lib/svg_sprite.rb index e099fc736ec..f1deba86b01 100644 --- a/lib/svg_sprite.rb +++ b/lib/svg_sprite.rb @@ -184,6 +184,7 @@ module SvgSprite plus-circle plus-square power-off + project-diagram puzzle-piece question question-circle diff --git a/spec/system/admin_sidebar_navigation_spec.rb b/spec/system/admin_sidebar_navigation_spec.rb index b50827f0f10..32680706330 100644 --- a/spec/system/admin_sidebar_navigation_spec.rb +++ b/spec/system/admin_sidebar_navigation_spec.rb @@ -73,7 +73,7 @@ describe "Admin Revamp | Sidebar Navigation", type: :system do filter.filter("ie") links = page.all(".sidebar-section-link-content-text") expect(links.count).to eq(2) - expect(links.map(&:text)).to eq(["Preview Summary", "User Fields"]) + expect(links.map(&:text)).to eq(["User Fields", "Preview Summary"]) expect(page).to have_no_css(".sidebar-no-results") filter.filter("ieeee") @@ -87,9 +87,9 @@ describe "Admin Revamp | Sidebar Navigation", type: :system do expect(page).to have_css(".sidebar-sections__back-to-forum") # When match section title, display all links - filter.filter("Backups") + filter.filter("Email Sett") links = page.all(".sidebar-section-link-content-text") - expect(links.count).to eq(2) - expect(links.map(&:text)).to eq(%w[Backups Logs]) + expect(links.count).to eq(3) + expect(links.map(&:text)).to eq(["Appearance", "Preview Summary", "Server Setup"]) end end