## Description - In the fixed layout system, the background of the canvas fell short of the bottom most widget. - This was due to an unnecessary `height: 100%` applied to the Fixed layout system. - Changed the code so that the `height: 100%` is only applied in the Anvil layout system #### PR fixes following issue(s) Fixes #29797 Fixes #29883 #### Type of change - Bug fix (non-breaking change which fixes an issue) ## Testing #### How Has This Been Tested? - [x] Manual - [ ] JUnit - [ ] Jest - [x] Cypress #### Test Plan #### Issues raised during DP testing ## Checklist: #### Dev activity - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] PR is being merged under a feature flag #### QA activity: - [ ] [Speedbreak features](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#speedbreakers-) have been covered - [ ] Test plan covers all impacted features and [areas of interest](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#areas-of-interest-) - [ ] Test plan has been peer reviewed by project stakeholders and other QA members - [ ] Manually tested functionality on DP - [ ] We had an implementation alignment call with stakeholders post QA Round 2 - [ ] Cypress test cases have been added and approved by SDET/manual QA - [ ] Added `Test Plan Approved` label after Cypress tests were reviewed - [ ] Added `Test Plan Approved` label after JUnit tests were reviewed <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **Style** - Enhanced the Canvas layout to adjust its height dynamically according to the layout system in use. - **Tests** - Introduced tests to validate the main container's overflow behavior in mobile responsive scenarios. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
128 lines
4.4 KiB
TypeScript
128 lines
4.4 KiB
TypeScript
import log from "loglevel";
|
|
import React from "react";
|
|
import styled from "styled-components";
|
|
import * as Sentry from "@sentry/react";
|
|
import { useSelector } from "react-redux";
|
|
import type { CanvasWidgetStructure } from "WidgetProvider/constants";
|
|
import useWidgetFocus from "utils/hooks/useWidgetFocus";
|
|
import { useFeatureFlag } from "utils/hooks/useFeatureFlag";
|
|
import { combinedPreviewModeSelector } from "selectors/editorSelectors";
|
|
import { getSelectedAppTheme } from "selectors/appThemingSelectors";
|
|
import { getViewportClassName } from "layoutSystems/autolayout/utils/AutoLayoutUtils";
|
|
import type { FontFamily } from "@design-system/theming";
|
|
import {
|
|
ThemeProvider as WDSThemeProvider,
|
|
useTheme,
|
|
} from "@design-system/theming";
|
|
import { getIsAppSettingsPaneWithNavigationTabOpen } from "selectors/appSettingsPaneSelectors";
|
|
import { CANVAS_ART_BOARD } from "constants/componentClassNameConstants";
|
|
import { renderAppsmithCanvas } from "layoutSystems/CanvasFactory";
|
|
import type { WidgetProps } from "widgets/BaseWidget";
|
|
import { LayoutSystemTypes } from "layoutSystems/types";
|
|
import { getLayoutSystemType } from "selectors/layoutSystemSelectors";
|
|
import { getAppThemeSettings } from "@appsmith/selectors/applicationSelectors";
|
|
|
|
interface CanvasProps {
|
|
widgetsStructure: CanvasWidgetStructure;
|
|
pageId: string;
|
|
canvasWidth: number;
|
|
enableMainCanvasResizer?: boolean;
|
|
}
|
|
|
|
const Wrapper = styled.section<{
|
|
background: string;
|
|
width: number;
|
|
$enableMainCanvasResizer: boolean;
|
|
}>`
|
|
background: ${({ background }) => background};
|
|
width: ${({ $enableMainCanvasResizer, width }) =>
|
|
$enableMainCanvasResizer ? `100%` : `${width}px`};
|
|
`;
|
|
const Canvas = (props: CanvasProps) => {
|
|
const { canvasWidth } = props;
|
|
const isPreviewMode = useSelector(combinedPreviewModeSelector);
|
|
const isAppSettingsPaneWithNavigationTabOpen = useSelector(
|
|
getIsAppSettingsPaneWithNavigationTabOpen,
|
|
);
|
|
const selectedTheme = useSelector(getSelectedAppTheme);
|
|
const isWDSEnabled = useFeatureFlag("ab_wds_enabled");
|
|
const layoutSystemType: LayoutSystemTypes = useSelector(getLayoutSystemType);
|
|
|
|
const themeSetting = useSelector(getAppThemeSettings);
|
|
const themeProps = {
|
|
borderRadius: selectedTheme.properties.borderRadius.appBorderRadius,
|
|
seedColor: selectedTheme.properties.colors.primaryColor,
|
|
fontFamily: selectedTheme.properties.fontFamily.appFont as FontFamily,
|
|
};
|
|
const wdsThemeProps = {
|
|
borderRadius: themeSetting.borderRadius,
|
|
seedColor: themeSetting.accentColor,
|
|
colorMode: themeSetting.colorMode.toLowerCase(),
|
|
fontFamily: themeSetting.fontFamily as FontFamily,
|
|
userSizing: themeSetting.sizing,
|
|
userDensity: themeSetting.density,
|
|
};
|
|
const { theme } = useTheme(isWDSEnabled ? wdsThemeProps : themeProps);
|
|
|
|
/**
|
|
* background for canvas
|
|
*/
|
|
let backgroundForCanvas: string;
|
|
|
|
if (isPreviewMode || isAppSettingsPaneWithNavigationTabOpen) {
|
|
backgroundForCanvas = "initial";
|
|
} else {
|
|
backgroundForCanvas = selectedTheme.properties.colors.backgroundColor;
|
|
}
|
|
|
|
const focusRef = useWidgetFocus();
|
|
|
|
const marginHorizontalClass = props.enableMainCanvasResizer
|
|
? `mx-0`
|
|
: `mx-auto`;
|
|
const paddingBottomClass = props.enableMainCanvasResizer ? "" : "pb-52";
|
|
|
|
const height = layoutSystemType === LayoutSystemTypes.ANVIL ? "h-full" : "";
|
|
|
|
const renderChildren = () => {
|
|
return (
|
|
<Wrapper
|
|
$enableMainCanvasResizer={!!props.enableMainCanvasResizer}
|
|
background={isWDSEnabled ? "" : backgroundForCanvas}
|
|
className={`relative t--canvas-artboard ${height} ${paddingBottomClass} transition-all duration-400 ${marginHorizontalClass} ${getViewportClassName(
|
|
canvasWidth,
|
|
)}`}
|
|
data-testid={"t--canvas-artboard"}
|
|
id={CANVAS_ART_BOARD}
|
|
ref={isWDSEnabled ? undefined : focusRef}
|
|
width={canvasWidth}
|
|
>
|
|
{props.widgetsStructure.widgetId &&
|
|
renderAppsmithCanvas({
|
|
...props.widgetsStructure,
|
|
classList:
|
|
layoutSystemType === LayoutSystemTypes.ANVIL
|
|
? ["main-anvil-canvas"]
|
|
: [],
|
|
} as WidgetProps)}
|
|
</Wrapper>
|
|
);
|
|
};
|
|
|
|
try {
|
|
if (isWDSEnabled) {
|
|
return (
|
|
<WDSThemeProvider theme={theme}>{renderChildren()}</WDSThemeProvider>
|
|
);
|
|
}
|
|
|
|
return renderChildren();
|
|
} catch (error) {
|
|
log.error("Error rendering DSL", error);
|
|
Sentry.captureException(error);
|
|
return null;
|
|
}
|
|
};
|
|
|
|
export default Canvas;
|