diff --git a/scripts/vendor-zoo-modeling-app.mjs b/scripts/vendor-zoo-modeling-app.mjs index 35d613c6a..adfadebe7 100644 --- a/scripts/vendor-zoo-modeling-app.mjs +++ b/scripts/vendor-zoo-modeling-app.mjs @@ -315,10 +315,105 @@ function patchOfficialSource() { " {displayedName !== user.email && (", " {!isHiCadEmbedded && displayedName !== user.email && (" ); + replaceSource( + "src/components/AppHeader.tsx", + "import { HicadAutosaveStatus } from '@src/components/HicadProjectExperience'\n", + "" + ); + replaceSource( + "src/components/AppHeader.tsx", + "import { HicadAutosaveStatus, HicadEditorProjectActions } from '@src/components/HicadProjectExperience'\n", + "" + ); replaceSource( "src/components/AppHeader.tsx", "import ProjectSidebarMenu from '@src/components/ProjectSidebarMenu'\n", - "import { HicadAutosaveStatus } from '@src/components/HicadProjectExperience'\nimport ProjectSidebarMenu from '@src/components/ProjectSidebarMenu'\n" + "import { HicadAutosaveStatus, HicadEditorProjectActions } from '@src/components/HicadProjectExperience'\nimport ProjectSidebarMenu from '@src/components/ProjectSidebarMenu'\n" + ); + replaceSource( + "src/components/AppHeader.tsx", + " {project && }\n", + "" + ); + replaceSource( + "src/components/AppHeader.tsx", + ` {project && ( + { + lsp.onProjectClose(file || null, project.path || null, false) + kclManager.switchedFiles = true + void navigate(PATHS.HOME) + }} + onCreateBlankProject={() => { + lsp.onProjectClose(file || null, project.path || null, false) + kclManager.switchedFiles = true + void navigate(\`\${PATHS.HOME}?create=blank\`) + }} + /> + )} +`, + "" + ); + replaceSource( + "src/components/AppHeader.tsx", + ` {project && ( + { + lsp.onProjectClose(file || null, project.path || null, false) + kclManager.switchedFiles = true + }} + onCreateBlankProject={() => { + lsp.onProjectClose(file || null, project.path || null, false) + kclManager.switchedFiles = true + }} + /> + )} +`, + "" + ); + replaceSource( + "src/components/AppHeader.tsx", + ` +
`, + ` + {project && ( + { + lsp.onProjectClose(file || null, project.path || null, false) + kclManager.switchedFiles = true + }} + onCreateBlankProject={() => { + lsp.onProjectClose(file || null, project.path || null, false) + kclManager.switchedFiles = true + }} + /> + )} +
` + ); + replaceSource( + "src/lib/routeLoaders.ts", + " if (await webHomeRouteEnabled(app)) {\n", + " if (true) {\n" + ); + replaceSource( + "src/lib/routeLoaders.ts", + " if (!window.electron && !(await webHomeRouteEnabled(app))) {\n", + " if (false) {\n" + ); + replaceSource( + "src/lib/app.ts", + ` const enableProjectDirectoryCommands = + typeof window !== 'undefined' && + (Boolean(window.electron) || + userFeaturesContextHas( + this.userFeatures.actor.getSnapshot().context, + OPFS_CLOUD_FEATURE_FLAG, + false + )) +`, + ` const enableProjectDirectoryCommands = + typeof window !== 'undefined' +` ); replaceSource( "src/components/AppHeader.tsx", diff --git a/tests/routes/hicad-project-experience.test.ts b/tests/routes/hicad-project-experience.test.ts index 892a279b2..4ff0b27bc 100644 --- a/tests/routes/hicad-project-experience.test.ts +++ b/tests/routes/hicad-project-experience.test.ts @@ -28,6 +28,19 @@ test.describe('HiCAD project management experience', () => { expect(experience).toContain('自动保存已开启') expect(experience).toContain('data-testid="hicad-create-project"') expect(experience).toContain('data-testid="hicad-create-from-sample"') + expect(experience).toContain('data-testid="hicad-open-project-list"') + expect(experience).toContain('data-testid="hicad-create-blank-project"') + expect(experience).toContain('?create=blank') + expect(experience).toContain('[data-testid="home-new-file"]') + expect(script).toContain(' { diff --git a/vendor/zoo-modeling-app/HicadProjectExperience.tsx.template b/vendor/zoo-modeling-app/HicadProjectExperience.tsx.template index 368ec661c..b7bccba3d 100644 --- a/vendor/zoo-modeling-app/HicadProjectExperience.tsx.template +++ b/vendor/zoo-modeling-app/HicadProjectExperience.tsx.template @@ -1,10 +1,15 @@ import { CustomIcon } from '@src/components/CustomIcon' +import { PATHS } from '@src/lib/paths' +import { useEffect } from 'react' +import { useLocation, useNavigate } from 'react-router-dom' export function HicadProjectDashboardHeading({ projectCount, }: { projectCount: number }) { + const location = useLocation() + const navigate = useNavigate() const startCreatingProject = () => { document .querySelector('[data-testid="home-new-file"]') @@ -18,6 +23,19 @@ export function HicadProjectDashboardHeading({ ?.click() } + useEffect(() => { + const shouldCreateBlankProject = + new URLSearchParams(location.search).get('create') === 'blank' + if (!shouldCreateBlankProject) return + + const timer = window.setTimeout(() => { + startCreatingProject() + void navigate(PATHS.HOME, { replace: true }) + }, 250) + + return () => window.clearTimeout(timer) + }, [location.search, navigate]) + return (
) } + +export function HicadEditorProjectActions({ + onOpenProjectList, + onCreateBlankProject, +}: { + onOpenProjectList: () => void + onCreateBlankProject: () => void +}) { + const buttonClassName = + 'inline-flex h-7 items-center justify-center gap-1.5 rounded-md border border-chalkboard-30 bg-chalkboard-10/80 px-2 text-xs font-medium text-chalkboard-80 transition-colors hover:border-primary/50 hover:bg-primary/5 hover:text-primary focus-visible:outline-appForeground dark:border-chalkboard-70 dark:bg-chalkboard-100/50 dark:text-chalkboard-30 dark:hover:border-primary/50 dark:hover:text-primary' + + return ( + + ) +}