新增“帖子类型”创作操作下拉菜单

enable_new_composer_actions 标志后进行的 Composer 重新设计

本次更新引入了重新设计的 Composer 体验,并将其置于一个新的 Alpha 阶段“即将变更”标志之后。当该标志关闭(默认状态)时,界面不会发生任何可见变化。管理员可通过“即将变更”管理页面选择启用。

启用标志后的变化

  • 统一的操作下拉菜单。原有的 SelectKit composer-actions 下拉菜单已被新的 Glimmer/DMenu 组件(composer-actions-new.gjs)取代。新组件依然展示所有相同的模式切换行(回复主题、作为新主题回复、创建私信等),但标签和图标更加清晰。

  • 开关与操作集成。静默模式(Whisper)、不置顶(no-bump)和隐藏(unlist)现在以下拉菜单底部的 <DToggleSwitch> 项形式呈现,不再使用独立的组合按钮菜单。开关状态在模式切换时得以保留(例如:开启静默模式 → 从“回复主题”切换到“回复帖子” → 仍保持静默状态)。

  • 静默指示器胶囊按钮。下拉菜单触发器右侧有一个小按钮,以两种视觉样式显示当前的静默状态:--public(辅助色,眼睛图标,“回复将可见”)和 --whispering(主色中等/主色极低背景,闭眼图标,“正在静默”)。点击该按钮即可切换静默状态 —— 其代码路径与下拉菜单内的开关相同,因此两者保持同步。当处于静默模式时,触发器图标本身也会切换为 far-eye-slash

  • 编辑用户体验。编辑帖子时,下拉菜单会折叠为一个静态的、无下拉箭头的标签(铅笔图标 + “编辑帖子”)。原本位于 Composer 工具栏其他位置的“添加编辑理由”按钮,现已整合到此静态触发器中,作为一个可点击的“描述您的编辑”按钮;点击它会将标签替换为绑定到 composer.editReason 的文本输入框并自动聚焦。

    • editing
  • Composer 工具栏.action-title 文本/标签已被移除 —— 下拉菜单触发器本身即显示当前模式。

  • 帖子/主题链接 现在仅在必要时显示。当离开主题导航时,主题链接将渲染;当滚动离开帖子或导航离开时,帖子链接将渲染。

插件开发者注意事项

新组件 不是 SelectKit 的子类,因此旧的扩展 API 无法作用于它。为了在此 Alpha 阶段同时支持两种标志状态,插件应同时注册两套 API:

旧 API(仅适用于旧组件) 新 API(仅适用于新组件)
api.modifySelectKit("composer-actions").appendContent(...) api.registerValueTransformer("composer-actions-content", ({ value, context }) => { value.push(...); return value; })
api.modifyClass("component:composer-actions", { fooSelected(options, model) { ... } }) api.registerBehaviorTransformer("composer-actions-on-select", ({ context, next }) => { if (context.actionId === "foo") { ...; return; } next(); })

行结构({ name, description, icon, id })在两者中完全一致。行为转换器在其上下文中接收 { actionId, options, model }

:double_exclamation_mark: 仅注册旧钩子的插件,一旦管理员启用该标志,将在 Composer 中静默消失。 仅注册新转换器的插件,在标志关闭时(合并时的默认状态)将不可见。

参考链接:

  • discourse-post-voting/extend-composer-actions.js — 双重注册的完整示例(位于核心代码中)

  • discourse-staff-alias — 单独的 PR 在此处添加了双重注册

  • transformers.js — 两个新的转换器名称

发布说明

  • 标志状态为 Alpha —— 仅供内部测试启用。

  • 与 Composer 操作集成的插件,应在该功能推广至 Beta/Stable 之前添加双重注册。

  • 测试覆盖了两种状态:现有的验收/系统测试覆盖标志关闭的情况;同级的 *-new-test.js 文件覆盖标志开启的情况(包括新组件的 DOM 选择器,用于统一下拉菜单、开关项、静默指示器和分割标签跨度)。

20 个赞

“主题链接”除了显示主题标题外,还渲染了 HTML 代码……

这肯定不对。

已在此修复 → FIX: Do not render fancyTitle link in composer header by jordanvidrine · Pull Request #40500 · discourse/discourse · GitHub

4 个赞

如果所选的类别类型不是 Ideas,或者类别设置未启用帖子投票功能,是否可能不显示 Toggle post voting 选项?: ))

5 个赞

我觉得这说得通,这会不会是一个回归问题?还是说一直都是这样,@jordan.vidrine 你知道吗?

1 个赞

情况一直如此,帖子投票插件是全站范围的,而非按类别限定。其类别级别的设置仅用于设定默认值,而非限制其使用。

帖子投票插件目前正处于过渡阶段……我们认为需要先规划迁移方案,以避免在将其限制为特定类别使用时破坏其更广泛的用途,因为“创意”这一类型概念相对较新。

1 个赞

好消息是,在此期间我们已有钩子允许在主题组件中实现此功能……以下代码可在初始化器中运行,仅在与“创意”相关的分类中显示切换按钮:

import { withPluginApi } from "discourse/lib/plugin-api";

export default {
    name: "hide-post-voting-toggle",
    after: "extend-composer-actions", 

    initialize() {
      withPluginApi((api) => {
        api.registerValueTransformer(
          "composer-actions-content",
          ({ value, context }) => {
            const category = context.composerModel?.category;
    
            if (!category?.isType("ideas")) {
              return value.filter((item) => item.id !== "togglePostVoting");
            }
    
            return value;
          }
        );
      });
    }
};

5 个赞