Remove Gallery from the Canvas sidebar
This commit is contained in:
1 parent
ca546c987c
commit
ea5d47787e
4 files changed
+18
-20
No files matched your search
@@ -12,7 +12,7 @@
|
||||
|
||||
## Scope
|
||||
|
||||
- Remove the exact create-dialog description, change the Canvas rail from pale lavender to pale yellow, diagnose actual Canvas project creation timeouts, and implement the smallest evidenced safe recovery/fix.
|
||||
- Remove the exact create-dialog description, change the Canvas rail from pale lavender to pale yellow, remove its Gallery entry while preserving Code Gallery, diagnose actual Canvas project creation timeouts, and implement the smallest evidenced safe recovery/fix.
|
||||
|
||||
## Intent And Constraints
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
## Outcome
|
||||
|
||||
- Removed the exact desktop creation description and disabled its absent aria description; Canvas shared rail surface is pale yellow #fff9e8, with Code recipes preserved. Both creation dialogs hold a distinct creation intent. Any failed request for unchanged intent/name reuses its original server clientWorkspaceId; a new dialog or modified name creates a new intent, and repeated concurrent submissions share one in-flight request. Account/logout/reset generations prevent old responses from changing another account or reset store. Create/rename name input is disabled during submission. README synchronized.
|
||||
- Removed the exact desktop creation description and disabled its absent aria description; Canvas shared rail surface is pale yellow #fff9e8, with Code recipes preserved. Both creation dialogs hold a distinct creation intent. Any failed request for unchanged intent/name reuses its original server clientWorkspaceId; a new dialog or modified name creates a new intent, and repeated concurrent submissions share one in-flight request. Account/logout/reset generations prevent old responses from changing another account or reset store. Create/rename name input is disabled during submission. Removed only the Canvas Gallery/作品广场 footer entry; Code Gallery and all account/compact controls are preserved. README synchronized.
|
||||
|
||||
## Verification
|
||||
|
||||
@@ -78,3 +78,14 @@ Gate result:
|
||||
- Product commit and final HEAD will be reported to the authorized coordination chat. This clean Ready source contains Renderer-only changes; Main/shared/resources are unchanged against runtime436. Source implementation and live network recovery are separately evidenced.
|
||||
- A precise read-only real-project bootstrap recovered; no real Autumn project was created. Real UI color/copy activation remains for the combined update, because actual WeChat f1dab files are active while current.json still points at436, and another Code Main update is in progress. Preserve actual newer Renderer feature source and active user work rather than blindly replacing the old pointer's tree.
|
||||
- Any different title or explicitly reopened create dialog is a new creation intent; an older transport-unknown project may still exist on the server. Never delete it or infer identity from a matching name. This patch prevents same-intent retries from making extra identities; it does not establish the underlying NetworkService hang trigger or prove real model generation.
|
||||
|
||||
## Same-task Steering Resume
|
||||
|
||||
- Official start/status resumed this exact task/worktree/branch/base; user adds removal of the Canvas rail Gallery/作品广场 entry. All earlier color/copy/retry/recovery scope remains. Prior full context and peer assessment still apply; this intentionally supersedes the earlier Canvas Gallery addition while preserving Code Gallery semantics. No conflicting source or runtime ownership change is inferred.
|
||||
- Planning Gate Passed for this narrow addition. Change only Sidebar visibility condition, README and existing Canvas E2E expectations; repeat related source/lint/build/UI verification because the user-visible footer changed. Keep previous reviewed retry implementation and real network recovery evidence intact. The previously reported ca546c9 is superseded by the forthcoming final source HEAD.
|
||||
|
||||
## Final Steering Verification
|
||||
|
||||
- Same-task narrow steering completed: Canvas Gallery entry is absent; Code chat/settings Gallery remains. Standard typecheck, scoped Sidebar/E2E lint, default full build and independent diff review pass.
|
||||
- Final real isolated Electron pair passed: Canvas V2 desktop/compact creation/dialog/draft/plan/history (7.1s) and Code remembered-project/shared-settings chrome (5.1s), total 2 passed/12.7s. Inspected final creation-dialog screenshot with pale-yellow rail, no original description and no Canvas Gallery. Logs/PNG updated in the external task evidence stage. Earlier 81 focused unit tests remain applicable to the unchanged retry/store/dialog implementation.
|
||||
- The final continuation source HEAD supersedes ca546c9; both are in this branch. No new actual runtime update or Main restart was performed by this continuation. Authorized coordinator will preserve f1dab live WeChat source and active user work during unified activation.
|
||||
@@ -24,7 +24,7 @@ Makelore 是一个面向软件、视觉创作、智能机器人与个人云智
|
||||
|
||||
Agents 侧栏的「渠道」按每个微信一张卡展示备注、当前智能体与使用状态;一个微信同时只绑定一个智能体,多个微信可以使用同一智能体。绑定有效且服务正常时始终开启回复,不提供暂停或恢复开关;更换智能体保留登录与历史,完成重新登录后也开启回复。旧的关闭记录在页面可见时,重新核对登录、在线服务、可用目标、同步状态及新旧渠道操作恢复记录后串行开启;服务离线、退出待确认、目标不可用和结果未知时不自动写入。常用操作是“更换智能体”;“更多操作”内可以解除微信绑定,停止任务、清除目标并退出微信登录,历史保留,再使用需扫码。确认解绑后的卡片可选择“删除微信卡片”,只从这台设备的当前账号列表移除,刷新和重开后仍保留删除结果;其他设备及云端账号和聊天历史不受影响,同一微信重新绑定后再次显示。本机偏好按账号与租户隔离,删除前再次读取云端状态并检查原操作,保存失败时保留卡片并显示原因。添加流程为选择已开始使用的智能体、扫码、自动完成绑定;扫码确认、目标正确、启用成功且最终状态回读可用后才显示完成。微信服务离线时,卡片仅保留右上角“微信服务离线”状态,不显示重复的离线长段说明;绑定或重新连接失败的窗口仍说明原因,不把扫码成功当作回复可用。未知或未同步状态显示“状态待确认”。无可用智能体时说明创建和“开始使用”的前提,加载失败不冒充空态,已有微信仍可解绑。Main 持有凭据与原操作恢复;解除需要配套 Yuxi 用户级 `/channel-accounts/{id}/unbind`,旧后端不会通过改按钮文案或组合未确认操作假装完成。变更以最新读取状态为准,未完成操作保留原身份供显式恢复;失败在当前窗口可见,结果未知不自动重放。微信退出仍在处理中时,禁止新的连接和绑定变更,保留刷新与原操作恢复。旧请求无法安全恢复、账号关系不一致或目标不可用时提示先核对;“不再提醒”只移除本机提醒,不取消服务端仍在处理的操作。最新 Yuxi 的退出保护条件和持久恢复由服务端负责,发布需配套 Core/Adapter 与 Yuxi business=13、knowledge=2 数据库版本。渠道页不展示微信聊天或活动,既有历史、费用、内容隔离与应用 API 保持原边界。实际微信身份及重复扫码识别仍由云端负责,不从备注推测。
|
||||
|
||||
- `Makelore Canvas|AI 绘画`:每个设计项目(Workspace)维护一份从创建起就存在的 Living Form。左侧工作栏与 Code 共用间距、图标徽章、项目行、操作菜单和底部广场/账户样式,仅工作栏底色采用淡黄色(`#fff9e8`);顶部返回箭头与 Code 对齐,分组标题为“我的项目”,桌面项目列表仅显示名称,隐藏名称下的设计版本与更新时间;新建、切换和项目操作菜单集中管理 Workspace;创建请求失败后保留名称与本次创建标识,原样重试避免重复创建项目。工作区统一项目标题、设计版本与制作状态,创作对话和作品区支持拖动分栏、键盘调宽及单栏展开;对话以 Markdown 呈现,底部输入器保留草稿、发送状态与 Enter / Shift+Enter 快捷键。右侧通过“当前作品 / 历史作品”切换,在大图或视频预览旁编辑唯一制作方案、确认费用和制作;历史作品可回到工作区查看,切换面板保留未保存的制作参数。紧凑窗口以“创作对话 / 作品与方案”切换面板,通过项目抽屉管理 Workspace。图片支持适应窗口、原始尺寸及 Esc 关闭,视频支持预览和保存到电脑。参考图从本地上传后以 `@图片N` 绑定,具体用法只写在创作提示词中。
|
||||
- `Makelore Canvas|AI 绘画`:每个设计项目(Workspace)维护一份从创建起就存在的 Living Form。左侧工作栏与 Code 共用间距、图标徽章、项目行、操作菜单和底部账户样式,仅工作栏底色采用淡黄色(`#fff9e8`);顶部返回箭头与 Code 对齐,Canvas 工作栏不显示“作品广场”,分组标题为“我的项目”,桌面项目列表仅显示名称,隐藏名称下的设计版本与更新时间;新建、切换和项目操作菜单集中管理 Workspace;创建请求失败后保留名称与本次创建标识,原样重试避免重复创建项目。工作区统一项目标题、设计版本与制作状态,创作对话和作品区支持拖动分栏、键盘调宽及单栏展开;对话以 Markdown 呈现,底部输入器保留草稿、发送状态与 Enter / Shift+Enter 快捷键。右侧通过“当前作品 / 历史作品”切换,在大图或视频预览旁编辑唯一制作方案、确认费用和制作;历史作品可回到工作区查看,切换面板保留未保存的制作参数。紧凑窗口以“创作对话 / 作品与方案”切换面板,通过项目抽屉管理 Workspace。图片支持适应窗口、原始尺寸及 Esc 关闭,视频支持预览和保存到电脑。参考图从本地上传后以 `@图片N` 绑定,具体用法只写在创作提示词中。
|
||||
- `Makelore Robot|AI 机器`:管理机器人智能体、设备激活绑定、智能体配置与设备分配;机器人工作台的智能体位于 Robot 全局侧栏,选中后在内容区先查看绑定设备、再查看基础设置,当前智能体通过 URL 参数保持可分享选择;绑定设备时默认先选择“引导配网”或“已有激活码”。在 Windows 与 macOS 的引导路径中,Makelore 可在弹窗内扫描并连接附近开放的 `Xiaozhi-*` 配网热点,失败时仍可通过系统 Wi-Fi 手动连接;后续继续复用机器人现有热点配网页面,不修改固件,也不由 Makelore 接收 Wi-Fi 密码。
|
||||
|
||||
应用启动默认进入 AI 模块入口选择页。入口页可在未登录状态浏览;未登录用户点击已开通模块时进入客户端原生登录页,可使用账号密码或手机号短信验证码登录。密码登录可选“记住密码”:正式安装包仅由 Electron Main 使用系统受保护凭据存储加密保存和回填账号密码,不写入 Renderer 持久状态,未打包开发版或系统安全存储不可用时禁用该选项。登录请求由 Renderer 经 Host API 交给 Electron Main,再由 Main 调用 Works Square;成功后回到入口选择页。已登录时,Electron Main 会从 Works Square `/api/auth/me` 读取当前账号,只向 Renderer 投影用户名、账号/租户/部门标识、权限名列表与四个模块布尔开关,不透传上游资料或凭据。工作区门禁同时要求有效 Token 和完整用户身份;旧状态缺失身份时会先尝试从 Main 恢复,仍无法确认则清除残留会话并返回登录页。被管理员关闭的模块会在入口页置灰且无法点击,直接访问其工作区路径也会返回入口页。旧服务端未返回策略或缺少单项字段时默认开放;这个客户端门禁不替代服务端 API 授权。
|
||||
|
||||
@@ -874,7 +874,7 @@ export function Sidebar({
|
||||
onOpenChange={setProfileDialogOpen}
|
||||
/>
|
||||
|
||||
{((workspaceLayout && isProgrammingModule) || isPaintingModule) && (
|
||||
{workspaceLayout && isProgrammingModule && (
|
||||
<div className="classroom-community-footer">
|
||||
<CommunityLink variant="sidebar" collapsed={sidebarCollapsed} />
|
||||
</div>
|
||||
|
||||
@@ -479,7 +479,7 @@ test.describe('AI Design V2 workspace', () => {
|
||||
const project = sidebar.getByTestId('sidebar-image-project-workspace-1');
|
||||
const projectsHeading = sidebar.locator('.classroom-projects-heading');
|
||||
const moduleReturn = sidebar.getByTestId('sidebar-module-switcher-trigger');
|
||||
const community = sidebar.getByRole('button', { name: '作品广场', exact: true });
|
||||
await expect(sidebar.getByRole('button', { name: '作品广场', exact: true })).toHaveCount(0);
|
||||
const account = sidebar.getByTestId('sidebar-member-menu-trigger');
|
||||
await expect(sidebar).toHaveAttribute('aria-hidden', 'false');
|
||||
await expect(sidebar).toHaveCSS('background-color', 'rgb(255, 249, 232)');
|
||||
@@ -502,8 +502,8 @@ test.describe('AI Design V2 workspace', () => {
|
||||
const actions = sidebar.getByRole('button', { name: '项目操作:咖啡机新品主视觉', exact: true });
|
||||
await expect(actions).toHaveCSS('width', '32px');
|
||||
await expect(actions).toHaveCSS('height', '32px');
|
||||
const [sidebarBox, createBox, headingBox, projectBox, returnBox, communityBox, accountBox] = await Promise.all(
|
||||
[sidebar, createProject, projectsHeading, project, moduleReturn, community, account].map((locator) => locator.boundingBox()),
|
||||
const [sidebarBox, createBox, headingBox, projectBox, returnBox, accountBox] = await Promise.all(
|
||||
[sidebar, createProject, projectsHeading, project, moduleReturn, account].map((locator) => locator.boundingBox()),
|
||||
);
|
||||
expect(sidebarBox!.width).toBe(256);
|
||||
expect(createBox!.height).toBe(48);
|
||||
@@ -512,20 +512,7 @@ test.describe('AI Design V2 workspace', () => {
|
||||
expect(headingBox!.y - sidebarBox!.y).toBe(96);
|
||||
expect(projectBox!.y - sidebarBox!.y).toBe(136);
|
||||
expect(returnBox!.y - sidebarBox!.y).toBe(4);
|
||||
expect(communityBox!.x).toBe(createBox!.x);
|
||||
expect(communityBox!.height).toBe(createBox!.height);
|
||||
expect(communityBox!.y).toBeGreaterThan(projectBox!.y + projectBox!.height);
|
||||
expect(accountBox!.y - communityBox!.y - communityBox!.height).toBeCloseTo(0, 0);
|
||||
expect(sidebarBox!.y + sidebarBox!.height - accountBox!.y - accountBox!.height).toBeLessThanOrEqual(14);
|
||||
const navigationStyles = await sidebar.evaluate((element) => {
|
||||
const recipe = (selector: string) => {
|
||||
const style = getComputedStyle(element.querySelector(selector)!);
|
||||
return [style.borderRadius, style.borderWidth, style.boxShadow, style.padding, style.fontSize, style.fontWeight, style.lineHeight];
|
||||
};
|
||||
return { create: recipe('[data-testid="sidebar-create-project"]'), community: recipe('.community-link') };
|
||||
});
|
||||
expect(navigationStyles.community).toEqual(navigationStyles.create);
|
||||
|
||||
await createProject.click();
|
||||
const creationDialog = page.getByRole('dialog', { name: '新建设计项目', exact: true });
|
||||
await expect(creationDialog).toBeVisible();
|
||||
|
||||
Reference in new issue
Block a user