import React, { useState } from "react"; import { Icon, InputGroup } from "@blueprintjs/core"; import { MenuColumnWrapper, CellWrapper, ActionWrapper, SortIconWrapper, } from "./TableStyledWrappers"; import { ColumnAction } from "components/propertyControls/ColumnActionSelectorControl"; import { ColumnMenuOptionProps } from "components/designSystems/appsmith/ReactTableComponent"; import { ReactTableColumnProps, ColumnTypes, Condition, } from "widgets/TableWidget"; import { isString, isNumber } from "lodash"; import VideoComponent from "components/designSystems/appsmith/VideoComponent"; import Button from "components/editorComponents/Button"; import AutoToolTipComponent from "components/designSystems/appsmith/AutoToolTipComponent"; import TableColumnMenuPopup from "./TableColumnMenu"; import { ControlIcons } from "icons/ControlIcons"; import { AnyStyledComponent } from "styled-components"; import styled from "constants/DefaultTheme"; import { Colors } from "constants/Colors"; import moment from "moment"; interface MenuOptionProps { columnAccessor?: string; isColumnHidden: boolean; columnType: string; format?: string; hideColumn: (columnIndex: number, isColumnHidden: boolean) => void; updateColumnType: (columnIndex: number, columnType: string) => void; handleUpdateCurrencySymbol: ( columnIndex: number, currencySymbol: string, ) => void; handleDateFormatUpdate: (columnIndex: number, dateFormat: string) => void; } export const getMenuOptions = (props: MenuOptionProps) => { const basicOptions: ColumnMenuOptionProps[] = [ { content: "Rename a Column", closeOnClick: true, id: "rename_column", editColumnName: true, }, { content: props.isColumnHidden ? "Show Column" : "Hide Column", closeOnClick: true, id: "hide_column", onClick: (columnIndex: number) => { props.hideColumn(columnIndex, props.isColumnHidden); }, }, ]; if (props.columnAccessor && props.columnAccessor === "actions") { return basicOptions; } const columnMenuOptions: ColumnMenuOptionProps[] = [ ...basicOptions, { content: "Select a Data Type", id: "change_column_type", category: true, }, { content: (
Image
), closeOnClick: true, isSelected: props.columnType === ColumnTypes.IMAGE, onClick: (columnIndex: number, isSelected: boolean) => { if (isSelected) { props.updateColumnType(columnIndex, ""); } else { props.updateColumnType(columnIndex, ColumnTypes.IMAGE); } }, }, { content: (
Video
), isSelected: props.columnType === ColumnTypes.VIDEO, closeOnClick: true, onClick: (columnIndex: number, isSelected: boolean) => { if (isSelected) { props.updateColumnType(columnIndex, ""); } else { props.updateColumnType(columnIndex, ColumnTypes.VIDEO); } }, }, { content: (
Text
), closeOnClick: true, isSelected: props.columnType === ColumnTypes.TEXT, onClick: (columnIndex: number, isSelected: boolean) => { if (isSelected) { props.updateColumnType(columnIndex, ""); } else { props.updateColumnType(columnIndex, ColumnTypes.TEXT); } }, }, { content: (
Currency
), closeOnClick: false, isSelected: props.columnType === ColumnTypes.CURRENCY, options: [ { content: "USD - $", isSelected: props.format === "$", closeOnClick: true, onClick: (columnIndex: number) => { props.handleUpdateCurrencySymbol(columnIndex, "$"); }, }, { content: "INR - ₹", isSelected: props.format === "₹", closeOnClick: true, onClick: (columnIndex: number) => { props.handleUpdateCurrencySymbol(columnIndex, "₹"); }, }, { content: "GBP - £", isSelected: props.format === "£", closeOnClick: true, onClick: (columnIndex: number) => { props.handleUpdateCurrencySymbol(columnIndex, "£"); }, }, { content: "AUD - A$", isSelected: props.format === "A$", closeOnClick: true, onClick: (columnIndex: number) => { props.handleUpdateCurrencySymbol(columnIndex, "A$"); }, }, { content: "EUR - €", isSelected: props.format === "€", closeOnClick: true, onClick: (columnIndex: number) => { props.handleUpdateCurrencySymbol(columnIndex, "€"); }, }, { content: "SGD - S$", isSelected: props.format === "S$", closeOnClick: true, onClick: (columnIndex: number) => { props.handleUpdateCurrencySymbol(columnIndex, "S$"); }, }, { content: "CAD - C$", isSelected: props.format === "C$", closeOnClick: true, onClick: (columnIndex: number) => { props.handleUpdateCurrencySymbol(columnIndex, "C$"); }, }, ], }, { content: (
Date
), closeOnClick: false, isSelected: props.columnType === ColumnTypes.DATE, options: [ { content: "MM-DD-YY", isSelected: props.format === "MM-DD-YY", closeOnClick: true, onClick: (columnIndex: number) => { props.handleDateFormatUpdate(columnIndex, "MM-DD-YY"); }, }, { content: "DD-MM-YY", isSelected: props.format === "DD-MM-YY", closeOnClick: true, onClick: (columnIndex: number) => { props.handleDateFormatUpdate(columnIndex, "DD-MM-YY"); }, }, { content: "DD/MM/YY", isSelected: props.format === "DD/MM/YY", closeOnClick: true, onClick: (columnIndex: number) => { props.handleDateFormatUpdate(columnIndex, "DD/MM/YY"); }, }, { content: "MM/DD/YY", isSelected: props.format === "MM/DD/YY", closeOnClick: true, onClick: (columnIndex: number) => { props.handleDateFormatUpdate(columnIndex, "MM/DD/YY"); }, }, ], }, { content: (
Time
), closeOnClick: true, isSelected: props.columnType === ColumnTypes.TIME, onClick: (columnIndex: number, isSelected: boolean) => { if (isSelected) { props.updateColumnType(columnIndex, ""); } else { props.updateColumnType(columnIndex, ColumnTypes.TIME); } }, }, { content: (
Number
), closeOnClick: true, isSelected: props.columnType === ColumnTypes.NUMBER, onClick: (columnIndex: number, isSelected: boolean) => { if (isSelected) { props.updateColumnType(columnIndex, ""); } else { props.updateColumnType(columnIndex, ColumnTypes.NUMBER); } }, }, ]; return columnMenuOptions; }; export const renderCell = ( value: any, columnType: string, isHidden: boolean, ) => { switch (columnType) { case ColumnTypes.IMAGE: if (!value) { return ; } else if (!isString(value)) { return (
Invalid Image
); } const imageRegex = /(http(s?):)([/|.|\w|\s|-])*\.(?:jpeg|jpg|gif|png)??(?:&?[^=&]*=[^=&]*)*/; return ( {value .toString() .split(",") .map((item: string, index: number) => { if (imageRegex.test(item)) { return ( e.stopPropagation()} target="_blank" rel="noopener noreferrer" href={item} >
); } else { return
Invalid Image
; } })} ); case ColumnTypes.VIDEO: const youtubeRegex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=|\?v=)([^#&?]*).*/; if (!value) { return ; } else if (isString(value) && youtubeRegex.test(value)) { return ( ); } else { return ( Invalid Video Link ); } default: const data = isString(value) || isNumber(value) ? value.toString() : JSON.stringify(value); return ( {data} ); } }; interface RenderActionProps { isSelected: boolean; columnActions?: ColumnAction[]; onCommandClick: (dynamicTrigger: string, onComplete: () => void) => void; } export const renderActions = (props: RenderActionProps) => { if (!props.columnActions) return ; return ( {props.columnActions.map((action: ColumnAction, index: number) => { return ( ); })} ); }; const TableAction = (props: { isSelected: boolean; action: ColumnAction; onCommandClick: (dynamicTrigger: string, onComplete: () => void) => void; }) => { const [loading, setLoading] = useState(false); const onComplete = () => { setLoading(false); }; return ( { if (props.isSelected) { e.stopPropagation(); } }} >