feat(FN-1301): add Projects action to mobile more sheet
- Add a Projects entry with icon and test id in the mobile More sheet actions - Extend MobileNavBar props with onViewAllProjects and trigger it via the shared more-sheet action handler - Wire App to pass handleViewAllProjects into MobileNavBar so the new action opens project selection - Add test coverage for rendering the Projects item and invoking its callback while closing the sheet
This commit is contained in:
@@ -337,6 +337,7 @@ function AppInner() {
|
||||
onResumePlanning={modalManager.resumePlanning}
|
||||
activePlanningSessionCount={bgPlanningSessions.length}
|
||||
onOpenUsage={modalManager.openUsage}
|
||||
onViewAllProjects={handleViewAllProjects}
|
||||
onRunScript={modalManager.runScript}
|
||||
projectId={currentProject?.id}
|
||||
/>
|
||||
|
||||
@@ -5,6 +5,7 @@ import {
|
||||
Clock,
|
||||
Folder,
|
||||
GitBranch,
|
||||
Grid3X3,
|
||||
LayoutGrid,
|
||||
Lightbulb,
|
||||
Mail,
|
||||
@@ -44,6 +45,7 @@ export interface MobileNavBarProps {
|
||||
onOpenUsage?: () => void;
|
||||
onRunScript?: (name: string, command: string) => void;
|
||||
projectId?: string;
|
||||
onViewAllProjects?: () => void;
|
||||
}
|
||||
|
||||
function GitHubLogo({ size = 20 }: { size?: number }) {
|
||||
@@ -84,6 +86,7 @@ export function MobileNavBar({
|
||||
onResumePlanning,
|
||||
activePlanningSessionCount = 0,
|
||||
onOpenUsage,
|
||||
onViewAllProjects,
|
||||
}: MobileNavBarProps) {
|
||||
const mode = useViewportMode();
|
||||
const [isMoreOpen, setIsMoreOpen] = useState(false);
|
||||
@@ -297,6 +300,16 @@ export function MobileNavBar({
|
||||
<span>Usage</span>
|
||||
</button>
|
||||
|
||||
<button
|
||||
type="button"
|
||||
className="mobile-more-item"
|
||||
data-testid="mobile-more-item-projects"
|
||||
onClick={() => handleMoreAction(onViewAllProjects)}
|
||||
>
|
||||
<Grid3X3 />
|
||||
<span>Projects</span>
|
||||
</button>
|
||||
|
||||
<div className="mobile-more-separator" />
|
||||
|
||||
<button
|
||||
|
||||
@@ -40,6 +40,7 @@ const createDefaultProps = () => ({
|
||||
onResumePlanning: vi.fn(),
|
||||
activePlanningSessionCount: 0,
|
||||
onOpenUsage: vi.fn(),
|
||||
onViewAllProjects: vi.fn(),
|
||||
onRunScript: vi.fn(),
|
||||
projectId: "proj_1",
|
||||
});
|
||||
@@ -125,6 +126,7 @@ describe("MobileNavBar", () => {
|
||||
expect(screen.getByTestId("mobile-more-item-schedules")).toBeDefined();
|
||||
expect(screen.getByTestId("mobile-more-item-github")).toBeDefined();
|
||||
expect(screen.getByTestId("mobile-more-item-usage")).toBeDefined();
|
||||
expect(screen.getByTestId("mobile-more-item-projects")).toBeDefined();
|
||||
expect(screen.getByTestId("mobile-more-item-settings")).toBeDefined();
|
||||
});
|
||||
|
||||
@@ -139,6 +141,17 @@ describe("MobileNavBar", () => {
|
||||
expect(props.onOpenSettings).toHaveBeenCalledOnce();
|
||||
});
|
||||
|
||||
it("calls onViewAllProjects from the Projects more-sheet item", () => {
|
||||
const props = createDefaultProps();
|
||||
const { container } = render(<MobileNavBar {...props} />);
|
||||
|
||||
fireEvent.click(screen.getByTestId("mobile-nav-tab-more"));
|
||||
fireEvent.click(screen.getByTestId("mobile-more-item-projects"));
|
||||
|
||||
expect(container.querySelector(".mobile-more-sheet")).toBeNull();
|
||||
expect(props.onViewAllProjects).toHaveBeenCalledOnce();
|
||||
});
|
||||
|
||||
it("closes sheet on backdrop click", () => {
|
||||
const { container } = render(<MobileNavBar {...createDefaultProps()} />);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user