import React, { useEffect, useState } from 'react'; import Popover from 'react-bootstrap/Popover'; import OverlayTrigger from 'react-bootstrap/OverlayTrigger'; import DropDownSelect from '@/Editor/QueryManager/QueryEditors/TooljetDatabase/DropDownSelect'; import { ButtonSolid } from '@/_ui/AppButton/AppButton'; import Information from '@/_ui/Icon/solidIcons/Information'; import SolidIcon from '@/_ui/Icon/SolidIcons'; import LeftNav from '../../Icons/LeftNav.svg'; import RightNav from '../../Icons/RightNav.svg'; import cx from 'classnames'; import './styles.scss'; import styles from './styles.module.scss'; import Skeleton from 'react-loading-skeleton'; export const CellEditMenu = ({ darkMode = false, children, show, close, columnDetails, saveFunction, setCellValue, cellValue, previousCellValue, setDefaultValue, defaultValue, setNullValue, nullValue, isBoolean, referencedColumnDetails = [], referenceColumnName = '', isForeignKey = false, scrollEventForColumnValues, organizationId, foreignKeys, setReferencedColumnDetails, cellHeader, cachedOptions, dataType = '', }) => { // below state is used only for boolean cell const [selectedValue, setSelectedValue] = useState(cellValue); const [shouldCloseFkMenu, setShouldCloseFKMenu] = useState(0); const [selectedForeignKeyValue, setSelectedForeignKeyValue] = useState({ value: previousCellValue === 'Null' ? null : previousCellValue, label: previousCellValue === 'Null' ? null : previousCellValue, }); const handleDefaultChange = (defaultColumnValue, defaultBooleanValue) => { if (defaultBooleanValue === true) { setCellValue(defaultColumnValue); setSelectedForeignKeyValue({ label: defaultColumnValue, value: defaultColumnValue, }); } else { setCellValue(previousCellValue); } setDefaultValue(defaultBooleanValue); setNullValue(false); }; const handleNullChange = (nullVal) => { if (nullVal === true) { setCellValue(null); setSelectedForeignKeyValue({ label: null, value: null, }); } else { if (previousCellValue === null) { setCellValue(''); setSelectedForeignKeyValue({ label: '', value: '', }); } else { setCellValue(previousCellValue); setSelectedForeignKeyValue({ label: previousCellValue, value: previousCellValue, }); } } setNullValue(nullVal); setDefaultValue(false); }; const handleSelectedState = (value) => { setSelectedValue(value); setCellValue(value); }; const closePopover = () => { setReferencedColumnDetails([]); setSelectedValue(previousCellValue); close(); }; const closeFKMenu = () => { setShouldCloseFKMenu((prev) => prev + 1); }; const saveFKValue = () => { saveFunction(cellValue); closeFKMenu(); }; const handleKeyDown = (e) => { if (e.key === 'ArrowRight' && isBoolean) { e.preventDefault(); if (selectedValue === false) handleSelectedState(true); if (selectedValue === true) handleSelectedState(null); } if (e.key === 'ArrowLeft' && isBoolean) { e.preventDefault(); if (selectedValue === null) handleSelectedState(true); if (selectedValue === true) handleSelectedState(false); } if (e.key === 'Escape') { closePopover(); } if (e.key === 'Enter' && cellValue != previousCellValue && show) { saveFunction(cellValue); } if (e.key === 'Backspace') { if (selectedValue === null) { if (isBoolean) { setSelectedValue(true); setCellValue(true); } else { setSelectedValue(''); setCellValue(''); } setNullValue(false); setDefaultValue(false); document.getElementById('edit-input-blur').focus(); } } e.stopPropagation(); }; const referencedFKDataList = referencedColumnDetails.map((item) => { const [key, _value] = Object.entries(item); return { label: key[1] === null ? 'Null' : key[1], value: key[1] === null ? 'Null' : key[1], }; }); useEffect(() => { if (show) { document.addEventListener('keydown', handleKeyDown); return () => { document.removeEventListener('keydown', handleKeyDown); }; } // eslint-disable-next-line react-hooks/exhaustive-deps }, [show, isBoolean, selectedValue, cellValue]); useEffect(() => { if (selectedValue !== cellValue) setSelectedValue(cellValue); // eslint-disable-next-line react-hooks/exhaustive-deps }, [cellValue]); const SaveChangesSection = () => { return (