## Description - Git mod integration with applications behind feature flag Fixes #37815 Fixes #37816 Fixes #37817 Fixes #37818 Fixes #37819 Fixes #37820 ## Automation /ok-to-test tags="@tag.All" ### 🔍 Cypress test results <!-- This is an auto-generated comment: Cypress test results --> > [!TIP] > 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉 > Workflow run: <https://github.com/appsmithorg/appsmith/actions/runs/12526603607> > Commit: 19f3ca0a35b16b25b2cff8700e2df4b2a497e7fe > <a href="https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=12526603607&attempt=2" target="_blank">Cypress dashboard</a>. > Tags: `@tag.All` > Spec: > <hr>Sat, 28 Dec 2024 15:57:13 UTC <!-- end of auto-generated comment: Cypress test results --> ## Communication Should the DevRel and Marketing teams inform users about this change? - [ ] Yes - [ ] No <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Summary by CodeRabbit ## Release Notes - **New Features** - Introduced various new hooks for Git functionalities, including `useGitModEnabled`, `useGitCurrentBranch`, `useGitProtectedMode`, and `useGitConnected`. - Added a new component `DeployButton` to manage deployment actions. - Integrated `ConnectSuccessModal` to enhance user feedback upon successful Git connection. - Added `GitImportModal` for improved Git import functionality. - Introduced `GlobalProfileView` for managing and displaying user profile information. - Added a new icon, `CloudIconV2`, to the icon provider. - Implemented `fetchGlobalSSHKey` and `gitImport` sagas for better state management. - **Improvements** - Enhanced handling of Git-related states and actions across multiple components and sagas. - Streamlined selector usage for determining preview mode by replacing `combinedPreviewModeSelector` with `selectCombinedPreviewMode`. - Updated the `DeployPreview` component to manage success feedback and handle commit operations more effectively. - Improved the `StatusChangesView` component by adding a callout for migration messages. - Added new transformers for application status handling. - **Bug Fixes** - Updated error handling and loading states across various actions and components to improve reliability. - **Refactor** - Refactored action creators to use `createArtifactAction` instead of `createSingleArtifactAction` for consistency and clarity. - Consolidated Git import and connection logic to improve modularity and maintainability. - Modified the `Header` component to utilize `GitApplicationContextProvider` for managing Git-related state. - Updated various components to utilize the new `selectCombinedPreviewMode` selector for improved state management. - Refactored the `DeployPreview` component to enhance its functionality and styling consistency. - Enhanced the `applicationStatusTransformer` to handle multiple status transformations. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
130 lines
4.3 KiB
TypeScript
130 lines
4.3 KiB
TypeScript
import log from "loglevel";
|
|
import React, { useCallback } from "react";
|
|
import styled from "styled-components";
|
|
import * as Sentry from "@sentry/react";
|
|
import { useDispatch, useSelector } from "react-redux";
|
|
import type { CanvasWidgetStructure } from "WidgetProvider/constants";
|
|
import useWidgetFocus from "utils/hooks/useWidgetFocus";
|
|
import { selectCombinedPreviewMode } from "selectors/gitModSelectors";
|
|
import { getSelectedAppTheme } from "selectors/appThemingSelectors";
|
|
import { getViewportClassName } from "layoutSystems/autolayout/utils/AutoLayoutUtils";
|
|
import {
|
|
ThemeProvider as WDSThemeProvider,
|
|
useTheme,
|
|
} from "@appsmith/wds-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 { getAppThemeSettings } from "ee/selectors/applicationSelectors";
|
|
import CodeModeTooltip from "pages/Editor/WidgetsEditor/components/CodeModeTooltip";
|
|
import { getIsAnvilLayout } from "layoutSystems/anvil/integrations/selectors";
|
|
import { focusWidget } from "actions/widgetActions";
|
|
|
|
interface CanvasProps {
|
|
widgetsStructure: CanvasWidgetStructure;
|
|
canvasWidth: number;
|
|
enableMainCanvasResizer?: boolean;
|
|
}
|
|
|
|
const StyledWDSThemeProvider = styled(WDSThemeProvider)`
|
|
min-height: 100%;
|
|
display: flex;
|
|
`;
|
|
|
|
const Wrapper = styled.section<{
|
|
background: string;
|
|
width: number;
|
|
$enableMainCanvasResizer: boolean;
|
|
}>`
|
|
flex: 1;
|
|
background: ${({ background }) => background};
|
|
width: ${({ $enableMainCanvasResizer, width }) =>
|
|
$enableMainCanvasResizer ? `100%` : `${width}px`};
|
|
`;
|
|
const Canvas = (props: CanvasProps) => {
|
|
const { canvasWidth } = props;
|
|
const isPreviewMode = useSelector(selectCombinedPreviewMode);
|
|
const isAppSettingsPaneWithNavigationTabOpen = useSelector(
|
|
getIsAppSettingsPaneWithNavigationTabOpen,
|
|
);
|
|
const selectedTheme = useSelector(getSelectedAppTheme);
|
|
const isAnvilLayout = useSelector(getIsAnvilLayout);
|
|
|
|
const themeSetting = useSelector(getAppThemeSettings);
|
|
const wdsThemeProps = {
|
|
borderRadius: themeSetting.borderRadius,
|
|
seedColor: themeSetting.accentColor,
|
|
colorMode: themeSetting.colorMode.toLowerCase(),
|
|
userSizing: themeSetting.sizing,
|
|
userDensity: themeSetting.density,
|
|
} as Parameters<typeof useTheme>[0];
|
|
// in case of non-WDS theme, we will pass an empty object to useTheme hook
|
|
// so that fixedLayout theme does not break because of calculations done in useTheme
|
|
const { theme } = useTheme(isAnvilLayout ? wdsThemeProps : {});
|
|
|
|
const dispatch = useDispatch();
|
|
const unfocusAllWidgets = useCallback(() => {
|
|
dispatch(focusWidget());
|
|
}, [dispatch]);
|
|
|
|
/**
|
|
* 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 renderChildren = () => {
|
|
return (
|
|
<CodeModeTooltip>
|
|
<Wrapper
|
|
$enableMainCanvasResizer={!!props.enableMainCanvasResizer}
|
|
background={isAnvilLayout ? "" : backgroundForCanvas}
|
|
className={`relative t--canvas-artboard mp-mask ${paddingBottomClass} ${marginHorizontalClass} ${getViewportClassName(
|
|
canvasWidth,
|
|
)}`}
|
|
data-testid={"t--canvas-artboard"}
|
|
id={CANVAS_ART_BOARD}
|
|
onMouseLeave={unfocusAllWidgets}
|
|
ref={isAnvilLayout ? undefined : focusRef}
|
|
width={canvasWidth}
|
|
>
|
|
{props.widgetsStructure.widgetId &&
|
|
renderAppsmithCanvas(props.widgetsStructure as WidgetProps)}
|
|
</Wrapper>
|
|
</CodeModeTooltip>
|
|
);
|
|
};
|
|
|
|
try {
|
|
if (isAnvilLayout) {
|
|
return (
|
|
<StyledWDSThemeProvider theme={theme}>
|
|
{renderChildren()}
|
|
</StyledWDSThemeProvider>
|
|
);
|
|
}
|
|
|
|
return renderChildren();
|
|
} catch (error) {
|
|
log.error("Error rendering DSL", error);
|
|
Sentry.captureException(error);
|
|
|
|
return null;
|
|
}
|
|
};
|
|
|
|
export default Canvas;
|