PromucFlow_constructor/app/client/src/widgets/constants.ts
ashit-rath a47dba5e26
feat: List V2 (#15839)
## Description

TL;DR
This is a complete architectural change of of List widget works to
support all widgets we currently have and should automatically support
any future widgets.
It also introduces nested List widgets i.e a list widget can have a
another list widget which in turn can have another list widget.

Fixes #18206
Fixes #6775
Fixes #13211
Fixes #16582
Fixes #11739
Fixes #15094
Fixes #6840
Fixes #10841
Fixes #17386
Fixes #18340
Fixes #16898
Fixes #17555
Fixes #6858
Fixes #9568
Fixes #17480
Fixes #18523
Fixes #18206  
Fixes #16586
Fixes #18106
Fixes #16576
Fixes #14697
Fixes #9607
Fixes #19648 
Fixes #19739
Fixes #19652 
Fixes #18730 
Fixes #19503 
Fixes #19498
Fixes #19437
Fixes #5245 
Fixes #19150
Fixes #18638
Fixes #11332
Fixes #17901
Fixes #19043
Fixes #17777
Fixes #8237
Fixes #15487
Fixes #15988
Fixes #18621
Fixes #16788
Fixes #18110
Fixes #18382
Fixes #17427
Fixes #18105
Fixes #18287
Fixes #19808
Fixes #14655

## Type of change

- New feature (non-breaking change which adds functionality)

## How Has This Been Tested?
- Cypress
- Jest
- Manual

## Checklist:

- [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
- [x] My changes generate no new warnings
- [x] 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

---------

Co-authored-by: Tolulope Adetula <31691737+Tooluloope@users.noreply.github.com>
Co-authored-by: Favour Ohanekwu <fohanekwu@gmail.com>
2023-02-14 17:07:31 +01:00

284 lines
7.6 KiB
TypeScript

import { IconNames } from "@blueprintjs/icons";
import { PropertyPaneConfig } from "constants/PropertyControlConstants";
import { WIDGET_STATIC_PROPS } from "constants/WidgetConstants";
import { Theme } from "constants/DefaultTheme";
import { omit } from "lodash";
import { WidgetConfigProps } from "reducers/entityReducers/widgetConfigReducer";
import { DerivedPropertiesMap } from "utils/WidgetFactory";
import { WidgetFeatures } from "utils/WidgetFeatures";
import { WidgetProps } from "./BaseWidget";
import moment from "moment";
import { Stylesheet } from "entities/AppTheming";
export interface WidgetConfiguration {
type: string;
name: string;
iconSVG?: string;
defaults: Partial<WidgetProps> & WidgetConfigProps;
hideCard?: boolean;
eagerRender?: boolean;
isDeprecated?: boolean;
replacement?: string;
isCanvas?: boolean;
needsMeta?: boolean;
features?: WidgetFeatures;
canvasHeightOffset?: (props: WidgetProps) => number;
searchTags?: string[];
needsHeightForContent?: boolean;
properties: {
config?: PropertyPaneConfig[];
contentConfig?: PropertyPaneConfig[];
styleConfig?: PropertyPaneConfig[];
default: Record<string, string>;
meta: Record<string, any>;
derived: DerivedPropertiesMap;
loadingProperties?: Array<RegExp>;
stylesheetConfig?: Stylesheet;
};
}
export const GRID_DENSITY_MIGRATION_V1 = 4;
export enum BlueprintOperationTypes {
MODIFY_PROPS = "MODIFY_PROPS",
ADD_ACTION = "ADD_ACTION",
CHILD_OPERATIONS = "CHILD_OPERATIONS",
}
export type FlattenedWidgetProps = WidgetProps & {
children?: string[];
};
export interface DSLWidget extends WidgetProps {
children?: DSLWidget[];
}
const staticProps = omit(
WIDGET_STATIC_PROPS,
"children",
"topRowBeforeCollapse",
"bottomRowBeforeCollapse",
);
export type CanvasWidgetStructure = Pick<
WidgetProps,
keyof typeof staticProps
> & {
children?: CanvasWidgetStructure[];
selected?: boolean;
onClickCapture?: (event: React.MouseEvent<HTMLElement>) => void;
};
export enum FileDataTypes {
Base64 = "Base64",
Text = "Text",
Binary = "Binary",
Array = "Array",
}
export type AlignWidget = "LEFT" | "RIGHT";
export enum AlignWidgetTypes {
LEFT = "LEFT",
RIGHT = "RIGHT",
}
// Minimum Rows for Widget Popups
export const MinimumPopupRows = 12;
// Default boxShadowColor used in theming migration
export const rgbaMigrationConstantV56 = "rgba(0, 0, 0, 0.25)";
export const BUTTON_GROUP_CHILD_STYLESHEET = {
button: {
buttonColor: "{{appsmith.theme.colors.primaryColor}}",
},
};
export const TABLE_WIDGET_CHILD_STYLESHEET = {
button: {
buttonColor: "{{appsmith.theme.colors.primaryColor}}",
borderRadius: "{{appsmith.theme.borderRadius.appBorderRadius}}",
boxShadow: "none",
},
menuButton: {
menuColor: "{{appsmith.theme.colors.primaryColor}}",
borderRadius: "{{appsmith.theme.borderRadius.appBorderRadius}}",
boxShadow: "none",
},
iconButton: {
menuColor: "{{appsmith.theme.colors.primaryColor}}",
borderRadius: "{{appsmith.theme.borderRadius.appBorderRadius}}",
boxShadow: "none",
},
};
export const JSON_FORM_WIDGET_CHILD_STYLESHEET = {
ARRAY: {
accentColor: "{{appsmith.theme.colors.primaryColor}}",
borderRadius: "{{appsmith.theme.borderRadius.appBorderRadius}}",
boxShadow: "none",
cellBorderRadius: "{{appsmith.theme.borderRadius.appBorderRadius}}",
cellBoxShadow: "none",
},
OBJECT: {
borderRadius: "{{appsmith.theme.borderRadius.appBorderRadius}}",
boxShadow: "none",
cellBorderRadius: "{{appsmith.theme.borderRadius.appBorderRadius}}",
cellBoxShadow: "none",
},
CHECKBOX: {
accentColor: "{{appsmith.theme.colors.primaryColor}}",
borderRadius: "{{appsmith.theme.borderRadius.appBorderRadius}}",
},
CURRENCY_INPUT: {
accentColor: "{{appsmith.theme.colors.primaryColor}}",
borderRadius: "{{appsmith.theme.borderRadius.appBorderRadius}}",
boxShadow: "none",
},
DATEPICKER: {
accentColor: "{{appsmith.theme.colors.primaryColor}}",
borderRadius: "{{appsmith.theme.borderRadius.appBorderRadius}}",
boxShadow: "none",
},
EMAIL_INPUT: {
accentColor: "{{appsmith.theme.colors.primaryColor}}",
borderRadius: "{{appsmith.theme.borderRadius.appBorderRadius}}",
boxShadow: "none",
},
MULTISELECT: {
accentColor: "{{appsmith.theme.colors.primaryColor}}",
borderRadius: "{{appsmith.theme.borderRadius.appBorderRadius}}",
boxShadow: "none",
},
MULTILINE_TEXT_INPUT: {
accentColor: "{{appsmith.theme.colors.primaryColor}}",
borderRadius: "{{appsmith.theme.borderRadius.appBorderRadius}}",
boxShadow: "none",
},
NUMBER_INPUT: {
accentColor: "{{appsmith.theme.colors.primaryColor}}",
borderRadius: "{{appsmith.theme.borderRadius.appBorderRadius}}",
boxShadow: "none",
},
PASSWORD_INPUT: {
accentColor: "{{appsmith.theme.colors.primaryColor}}",
borderRadius: "{{appsmith.theme.borderRadius.appBorderRadius}}",
boxShadow: "none",
},
PHONE_NUMBER_INPUT: {
accentColor: "{{appsmith.theme.colors.primaryColor}}",
borderRadius: "{{appsmith.theme.borderRadius.appBorderRadius}}",
boxShadow: "none",
},
RADIO_GROUP: {
accentColor: "{{appsmith.theme.colors.primaryColor}}",
boxShadow: "none",
},
SELECT: {
accentColor: "{{appsmith.theme.colors.primaryColor}}",
borderRadius: "{{appsmith.theme.borderRadius.appBorderRadius}}",
boxShadow: "none",
},
SWITCH: {
accentColor: "{{appsmith.theme.colors.primaryColor}}",
boxShadow: "none",
},
TEXT_INPUT: {
accentColor: "{{appsmith.theme.colors.primaryColor}}",
borderRadius: "{{appsmith.theme.borderRadius.appBorderRadius}}",
boxShadow: "none",
},
};
export const YOUTUBE_URL_REGEX = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=|\?v=)([^#&?]*).*/;
export const ICON_NAMES = Object.keys(IconNames).map(
(name: string) => IconNames[name as keyof typeof IconNames],
);
export const dateFormatOptions = [
{
label: moment().format("YYYY-MM-DDTHH:mm:ss.sssZ"),
subText: "ISO 8601",
value: "YYYY-MM-DDTHH:mm:ss.sssZ",
},
{
label: moment().format("LLL"),
subText: "LLL",
value: "LLL",
},
{
label: moment().format("LL"),
subText: "LL",
value: "LL",
},
{
label: moment().format("YYYY-MM-DD HH:mm"),
subText: "YYYY-MM-DD HH:mm",
value: "YYYY-MM-DD HH:mm",
},
{
label: moment().format("YYYY-MM-DDTHH:mm:ss"),
subText: "YYYY-MM-DDTHH:mm:ss",
value: "YYYY-MM-DDTHH:mm:ss",
},
{
label: moment().format("YYYY-MM-DD hh:mm:ss A"),
subText: "YYYY-MM-DD hh:mm:ss A",
value: "YYYY-MM-DD hh:mm:ss A",
},
{
label: moment().format("DD/MM/YYYY HH:mm"),
subText: "DD/MM/YYYY HH:mm",
value: "DD/MM/YYYY HH:mm",
},
{
label: moment().format("D MMMM, YYYY"),
subText: "D MMMM, YYYY",
value: "D MMMM, YYYY",
},
{
label: moment().format("H:mm A D MMMM, YYYY"),
subText: "H:mm A D MMMM, YYYY",
value: "H:mm A D MMMM, YYYY",
},
{
label: moment().format("YYYY-MM-DD"),
subText: "YYYY-MM-DD",
value: "YYYY-MM-DD",
},
{
label: moment().format("MM-DD-YYYY"),
subText: "MM-DD-YYYY",
value: "MM-DD-YYYY",
},
{
label: moment().format("DD-MM-YYYY"),
subText: "DD-MM-YYYY",
value: "DD-MM-YYYY",
},
{
label: moment().format("MM/DD/YYYY"),
subText: "MM/DD/YYYY",
value: "MM/DD/YYYY",
},
{
label: moment().format("DD/MM/YYYY"),
subText: "DD/MM/YYYY",
value: "DD/MM/YYYY",
},
{
label: moment().format("DD/MM/YY"),
subText: "DD/MM/YY",
value: "DD/MM/YY",
},
{
label: moment().format("MM/DD/YY"),
subText: "MM/DD/YY",
value: "MM/DD/YY",
},
];
export type ThemeProp = {
theme: Theme;
};