PromucFlow_constructor/app/client/src/layoutSystems/common/utils/commonUtils.ts

132 lines
4.2 KiB
TypeScript
Raw Normal View History

chore: Create layout system structure for Anvil and AnvilFlexComponent. (#27178) ## Description 1. Add new ```appPositioningType``` : ANVIL. 2. Create new code path and folder structure for Anvil layout system. 3. Move common pieces of functionalities between autoLayout and anvil to anvil folder structure (e.g. ```CanvasResizer```). 4. Create ```AnvilFlexComponent```. 5. Use WDS Flex component in AnvilFlexComponent. 6. Pass min max size props in a data structure that is supported by container queries in the Flex component. e.g. min-width: { base: "120px", "480px": "200px" } 7. Supply the following flex properties (flex-grow flex-shrink flex-basis) to widgets depending on their ```responsiveBehvaiour```: a) Fill: ```flex: 1 1 0%;``` b) Hug: ```flex: 0 0 auto;``` #### PR fixes following issue(s) Fixes # (issue number) 1. [#26987](https://github.com/appsmithorg/appsmith/issues/26987) 2. [#26609](https://github.com/appsmithorg/appsmith/issues/26609) 3. [#26611](https://github.com/appsmithorg/appsmith/issues/26611) #### Type of change - New feature (non-breaking change which adds functionality) ## Testing > #### How Has This Been Tested? > Please describe the tests that you ran to verify your changes. Also list any relevant details for your test configuration. > Delete anything that is not relevant - [x] Manual - [ ] JUnit - [x] Jest - [ ] Cypress ## Checklist: #### Dev activity - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my own code - [x] 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 - [x] 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 - [x] 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 --------- Co-authored-by: Ashok Kumar M <35134347+marks0351@users.noreply.github.com> Co-authored-by: Aswath K <aswath.sana@gmail.com> Co-authored-by: rahulramesha <rahul@appsmith.com> Co-authored-by: rahulramesha <71900764+rahulramesha@users.noreply.github.com>
2023-10-02 19:41:05 +00:00
import type {
AutoDimensionOptions,
AutoLayoutConfig,
WidgetSizeConfig,
} from "WidgetProvider/constants";
import WidgetFactory from "WidgetProvider/factory";
import { isFunction } from "lodash";
import type { BaseWidgetProps } from "widgets/BaseWidgetHOC/withBaseWidgetHOC";
export const getAutoDimensionsConfig = (
config: AutoLayoutConfig,
props: BaseWidgetProps,
): AutoDimensionOptions | undefined => {
let autoDimensionConfig = config.autoDimension;
if (isFunction(autoDimensionConfig)) {
autoDimensionConfig = autoDimensionConfig(props);
}
if (props.isListItemContainer && autoDimensionConfig) {
autoDimensionConfig.height = false;
}
return autoDimensionConfig;
};
export const getAutoLayoutWidgetConfig = (
props: BaseWidgetProps,
): AutoLayoutConfig => {
return WidgetFactory.getWidgetAutoLayoutConfig(props.type);
};
// TODO: update sizeConfig structure and get rid of this method.
export const restructureWidgetSizeConfig = (
sizeConfig: Array<WidgetSizeConfig> | undefined,
props: BaseWidgetProps,
): {
maxHeight: Record<string, string | number>;
maxWidth: Record<string, string | number>;
minHeight: Record<string, string | number>;
minWidth: Record<string, string | number>;
} => {
/**
* Size config is stored as an array of objects.
* Each object has a viewportMinWidth and a configuration function that returns the minMax sizes at the viewport.
* e.g [{ viewportMinWidth: 0, configuration: (props) => ({ maxHeight: 400, minWidth: 100 })}]
*
* WDS flex component requires the same information in a different structure (Responsive<T>):
* minWidth: { base: '100px', '480px': '200px' }, // default min width is 100px. However, above container width of 480px, min width changes to 200px.
* maxHeight: { base: 400 },
*/
// TODO: We should look into how size config is stored. Both structure and values can be updated.
const res: {
maxHeight: Record<string, string | number>;
maxWidth: Record<string, string | number>;
minHeight: Record<string, string | number>;
minWidth: Record<string, string | number>;
} = {
maxHeight: {},
maxWidth: {},
minHeight: {},
minWidth: {},
};
if (!sizeConfig || !sizeConfig.length) return res;
return sizeConfig.reduce(
(acc: any, size: WidgetSizeConfig) => {
const data = size.configuration(props);
if (size.viewportMinWidth === 0) {
// WDS flex component doesn't handle null || undefined values. Hence, add in properties only if they are defined.
const res = {
maxHeight: {},
maxWidth: {},
minHeight: {},
minWidth: {},
};
if (data?.maxHeight)
res.maxHeight = { base: addPixelToSize(data.maxHeight) };
if (data?.maxWidth)
res.maxWidth = { base: addPixelToSize(data.maxWidth) };
if (data?.minHeight)
res.minHeight = { base: addPixelToSize(data.minHeight) };
if (data?.minWidth)
res.minWidth = { base: addPixelToSize(data.minWidth) };
return res;
}
return {
maxHeight: data?.maxHeight
? {
...acc.maxHeight,
[addPixelToSize(size.viewportMinWidth)]: addPixelToSize(
data?.maxHeight,
),
}
: acc,
maxWidth: data?.maxWidth
? {
...acc.maxWidth,
[addPixelToSize(size.viewportMinWidth)]: addPixelToSize(
data?.maxWidth,
),
}
: acc,
minHeight: data?.minHeight
? {
...acc.minHeight,
[addPixelToSize(size.viewportMinWidth)]: addPixelToSize(
data?.minHeight,
),
}
: acc,
minWidth: data?.minWidth
? {
...acc.minWidth,
[addPixelToSize(size.viewportMinWidth)]: addPixelToSize(
data?.minWidth,
),
}
: acc,
};
},
{
maxHeight: {},
maxWidth: {},
minHeight: {},
minWidth: {},
},
);
};
export const addPixelToSize = (size: number | string): string => {
if (!size) return "";
return typeof size === "string" ? size : `${size}px`;
};