PromucFlow_constructor/app/client/src/pages/Editor/MainContainerLayoutControl.tsx
albinAppsmith 110e6085b8
feat: Renamed design system package (#19854)
## Description

This PR includes changes for renaming design system package. Since we
are building new package for the refactored design system components,
the old package is renaming to design-system-old.

Fixes #19536 

## Type of change

- New feature (non-breaking change which adds functionality)
- Breaking change (fix or feature that would cause existing
functionality to not work as expected)


## How Has This Been Tested?

- Manual
- Jest
- Cypress

### Test Plan
> Add Testsmith test cases links that relate to this PR

### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)


## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [x] 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
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag


### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
2023-01-23 09:20:47 +05:30

156 lines
4.2 KiB
TypeScript

import classNames from "classnames";
import { useDispatch, useSelector } from "react-redux";
import React, { useMemo, useCallback } from "react";
import {
getCurrentApplicationId,
getCurrentApplicationLayout,
} from "selectors/editorSelectors";
import { Colors } from "constants/Colors";
import {
AppLayoutConfig,
SupportedLayouts,
} from "reducers/entityReducers/pageListReducer";
import { TooltipComponent, Icon, IconName, IconSize } from "design-system-old";
import { updateApplicationLayout } from "actions/applicationActions";
interface AppsmithLayoutConfigOption {
name: string;
type: SupportedLayouts;
icon?: IconName;
}
export const AppsmithDefaultLayout: AppLayoutConfig = {
type: "FLUID",
};
const AppsmithLayouts: AppsmithLayoutConfigOption[] = [
{
name: "Fluid Width",
type: "FLUID",
icon: "fluid",
},
{
name: "Desktop",
type: "DESKTOP",
icon: "desktop",
},
{
name: "Tablet (Landscape)",
type: "TABLET_LARGE",
icon: "tabletLandscape",
},
{
name: "Tablet (Portrait)",
type: "TABLET",
icon: "tablet",
},
{
name: "Mobile Device",
type: "MOBILE",
icon: "mobile",
},
];
export function MainContainerLayoutControl() {
const dispatch = useDispatch();
const appId = useSelector(getCurrentApplicationId);
const appLayout = useSelector(getCurrentApplicationLayout);
const buttonRefs: Array<HTMLButtonElement | null> = [];
/**
* return selected layout index. if there is no app
* layout, use the default one ( fluid )
*/
const selectedIndex = useMemo(() => {
return AppsmithLayouts.findIndex(
(each) => each.type === (appLayout?.type || AppsmithDefaultLayout.type),
);
}, [appLayout]);
const [focusedIndex, setFocusedIndex] = React.useState(selectedIndex);
/**
* updates the app layout
*
* @param layoutConfig
*/
const updateAppLayout = useCallback(
(layoutConfig: AppLayoutConfig) => {
const { type } = layoutConfig;
dispatch(
updateApplicationLayout(appId || "", {
appLayout: {
type,
},
}),
);
},
[dispatch, appLayout],
);
const handleKeyDown = (event: React.KeyboardEvent, index: number) => {
if (!buttonRefs.length) return;
switch (event.key) {
case "ArrowRight":
case "Right":
const rightIndex = index === buttonRefs.length - 1 ? 0 : index + 1;
buttonRefs[rightIndex]?.focus();
setFocusedIndex(rightIndex);
break;
case "ArrowLeft":
case "Left":
const leftIndex = index === 0 ? buttonRefs.length - 1 : index - 1;
buttonRefs[leftIndex]?.focus();
setFocusedIndex(leftIndex);
break;
}
};
return (
<div className="pb-6 space-y-2 t--layout-control-wrapper">
<div
className="flex justify-around"
onBlur={() => setFocusedIndex(selectedIndex)}
>
{AppsmithLayouts.map((layoutOption: any, index: number) => {
return (
<TooltipComponent
className="flex-grow"
content={layoutOption.name}
key={layoutOption.name}
position={
index === AppsmithLayouts.length - 1 ? "bottom-right" : "bottom"
}
>
<button
className={classNames({
"border-transparent border flex items-center justify-center p-2 flex-grow focus:bg-gray-200": true,
"bg-white border-gray-300": selectedIndex === index,
"bg-gray-100 hover:bg-gray-200": selectedIndex !== index,
})}
onClick={() => {
updateAppLayout(layoutOption);
setFocusedIndex(index);
}}
onKeyDown={(event) => handleKeyDown(event, index)}
ref={(input) => buttonRefs.push(input)}
tabIndex={index === focusedIndex ? 0 : -1}
>
<Icon
fillColor={Colors.BLACK}
name={layoutOption.icon}
size={layoutOption.iconSize || IconSize.MEDIUM}
/>
</button>
</TooltipComponent>
);
})}
</div>
</div>
);
}