PromucFlow_constructor/app/client/src/widgets/TableWidget/component/Constants.ts
Tolulope Adetula d056c0baaa
feat: menu button as column type (#7039)
* fix: add menubutton

* feat: Make on Menu Item Click

* fix: remove console

* fix: refactor Utils.ts

* fix: add Comments

* fix: refactor utils

* fix: use forEach not Map

* fix: refactor table widget

* fix: add comment to config

* fix: refactor hook

* refactor: property Config

* fix: eslint issues

* fix:Add null check, refactor menuItemComponent

* test: add Cypress test for Menu button In Table widget

* fix: warning error

* fix: conflicts and remove menuStyle

* fix: change property pane arrangement

* fix: QA issues

* fix: Change default text, Change menu button color

* fix: Add background color to menuitems

* fix: bg color

* fix: failing tests
2021-10-06 13:57:05 +01:00

287 lines
6.6 KiB
TypeScript

import { isString } from "lodash";
import moment from "moment";
import { TextSize } from "constants/WidgetConstants";
import { IconName } from "@blueprintjs/icons";
import { Alignment } from "@blueprintjs/core";
import {
ButtonBorderRadius,
ButtonBoxShadow,
ButtonStyleType,
ButtonVariant,
} from "components/constants";
export type TableSizes = {
COLUMN_HEADER_HEIGHT: number;
TABLE_HEADER_HEIGHT: number;
ROW_HEIGHT: number;
ROW_FONT_SIZE: number;
};
export enum CompactModeTypes {
SHORT = "SHORT",
DEFAULT = "DEFAULT",
TALL = "TALL",
}
export enum CellAlignmentTypes {
LEFT = "LEFT",
RIGHT = "RIGHT",
CENTER = "CENTER",
}
export enum VerticalAlignmentTypes {
TOP = "TOP",
BOTTOM = "BOTTOM",
CENTER = "CENTER",
}
export const TABLE_SIZES: { [key: string]: TableSizes } = {
[CompactModeTypes.DEFAULT]: {
COLUMN_HEADER_HEIGHT: 32,
TABLE_HEADER_HEIGHT: 38,
ROW_HEIGHT: 40,
ROW_FONT_SIZE: 14,
},
[CompactModeTypes.SHORT]: {
COLUMN_HEADER_HEIGHT: 32,
TABLE_HEADER_HEIGHT: 38,
ROW_HEIGHT: 20,
ROW_FONT_SIZE: 12,
},
[CompactModeTypes.TALL]: {
COLUMN_HEADER_HEIGHT: 32,
TABLE_HEADER_HEIGHT: 38,
ROW_HEIGHT: 60,
ROW_FONT_SIZE: 18,
},
};
export enum ColumnTypes {
DATE = "date",
VIDEO = "video",
IMAGE = "image",
TEXT = "text",
NUMBER = "number",
URL = "url",
}
export enum OperatorTypes {
OR = "OR",
AND = "AND",
}
export enum SortOrderTypes {
asc = "asc",
desc = "desc",
}
export interface TableStyles {
cellBackground?: string;
textColor?: string;
textSize?: TextSize;
fontStyle?: string;
horizontalAlignment?: CellAlignment;
verticalAlignment?: VerticalAlignment;
}
export type CompactMode = keyof typeof CompactModeTypes;
export type Condition = keyof typeof ConditionFunctions | "";
export type Operator = keyof typeof OperatorTypes;
export type CellAlignment = keyof typeof CellAlignmentTypes;
export type VerticalAlignment = keyof typeof VerticalAlignmentTypes;
export interface ReactTableFilter {
column: string;
operator: Operator;
condition: Condition;
value: any;
}
export interface CellLayoutProperties {
horizontalAlignment?: CellAlignment;
verticalAlignment?: VerticalAlignment;
textSize?: TextSize;
fontStyle?: string;
textColor?: string;
cellBackground?: string;
buttonColor?: string;
buttonLabelColor?: string;
buttonLabel?: string;
menuButtonLabel?: string;
isVisible?: boolean;
isDisabled?: boolean;
displayText?: string;
buttonVariant: ButtonVariant;
borderRadius: ButtonBorderRadius;
boxShadow: ButtonBoxShadow;
boxShadowColor: string;
isCellVisible: boolean;
isCompact?: boolean;
menuItems: MenuItems;
menuVariant?: ButtonVariant;
menuColor?: string;
iconName?: IconName;
iconAlign?: Alignment;
onItemClicked?: (onClick: string | undefined) => void;
}
export type MenuItems = Record<
string,
{
widgetId: string;
id: string;
index: number;
isVisible?: boolean;
isDisabled?: boolean;
label?: string;
backgroundColor?: string;
textColor?: string;
iconName?: IconName;
iconColor?: string;
iconAlign?: Alignment;
onClick?: string;
}
>;
export interface TableColumnMetaProps {
isHidden: boolean;
format?: string;
inputFormat?: string;
type: string;
}
export interface TableColumnProps {
Header: string;
accessor: string;
width?: number;
minWidth: number;
draggable: boolean;
isHidden?: boolean;
isAscOrder?: boolean;
metaProperties?: TableColumnMetaProps;
isDerived?: boolean;
columnProperties: ColumnProperties;
}
export interface ReactTableColumnProps extends TableColumnProps {
Cell: (props: any) => JSX.Element;
}
export interface ColumnProperties {
id: string;
label?: string;
columnType: string;
isVisible: boolean;
isDisabled?: boolean;
index: number;
width: number;
cellBackground?: string;
horizontalAlignment?: CellAlignment;
verticalAlignment?: VerticalAlignment;
textSize?: TextSize;
fontStyle?: string;
textColor?: string;
enableFilter?: boolean;
enableSort?: boolean;
isDerived: boolean;
computedValue: string;
buttonLabel?: string;
menuButtonLabel?: string;
buttonColor?: string;
buttonLabelColor?: string;
onClick?: string;
outputFormat?: string;
inputFormat?: string;
dropdownOptions?: string;
onOptionChange?: string;
displayText?: string;
buttonVariant?: ButtonVariant;
isCompact?: boolean;
menuItems?: MenuItems;
menuVariant?: ButtonVariant;
menuColor?: string;
borderRadius?: ButtonBorderRadius;
boxShadow?: ButtonBoxShadow;
boxShadowColor?: string;
iconName?: IconName;
iconAlign?: Alignment;
onItemClicked?: (onClick: string | undefined) => void;
iconButtonStyle?: ButtonStyleType;
isCellVisible?: boolean;
}
export const ConditionFunctions: {
[key: string]: (a: any, b: any) => boolean;
} = {
isExactly: (a: any, b: any) => {
return a.toString() === b.toString();
},
empty: (a: any) => {
return a === "" || a === undefined || a === null;
},
notEmpty: (a: any) => {
return a !== "" && a !== undefined && a !== null;
},
notEqualTo: (a: any, b: any) => {
return a.toString() !== b.toString();
},
isEqualTo: (a: any, b: any) => {
return a.toString() === b.toString();
},
lessThan: (a: any, b: any) => {
const numericB = Number(b);
const numericA = Number(a);
return numericA < numericB;
},
lessThanEqualTo: (a: any, b: any) => {
const numericB = Number(b);
const numericA = Number(a);
return numericA <= numericB;
},
greaterThan: (a: any, b: any) => {
const numericB = Number(b);
const numericA = Number(a);
return numericA > numericB;
},
greaterThanEqualTo: (a: any, b: any) => {
const numericB = Number(b);
const numericA = Number(a);
return numericA >= numericB;
},
contains: (a: any, b: any) => {
if (isString(a) && isString(b)) {
return a.includes(b);
}
return false;
},
doesNotContain: (a: any, b: any) => {
if (isString(a) && isString(b)) {
return !a.includes(b);
}
return false;
},
startsWith: (a: any, b: any) => {
if (isString(a) && isString(b)) {
return a.indexOf(b) === 0;
}
return false;
},
endsWith: (a: any, b: any) => {
if (isString(a) && isString(b)) {
return a.length === a.lastIndexOf(b) + b.length;
}
return false;
},
is: (a: any, b: any) => {
return moment(a).isSame(moment(b), "d");
},
isNot: (a: any, b: any) => {
return !moment(a).isSame(moment(b), "d");
},
isAfter: (a: any, b: any) => {
return !moment(a).isAfter(moment(b), "d");
},
isBefore: (a: any, b: any) => {
return !moment(a).isBefore(moment(b), "d");
},
};