import { MdKeyboardArrowDown } from "react-icons/md"; import { DroppedItemsObj } from "./DocumentContainer"; import React, { ReactHTMLElement, useEffect, useState } from "react"; import { RiAsterisk } from "react-icons/ri"; import { GoDotFill } from "react-icons/go"; import { IoClose } from "react-icons/io5"; import { LuAsterisk } from "react-icons/lu"; import { dateFormats, dateTimeFormats, monthFormats, timeFormats, weekFormats, yearFormats } from "../../../utlity/dateTimeUtils"; import { DroppedItem } from "../../../utlity/types"; import { IoMdClose } from "react-icons/io"; import dayjs from "dayjs"; interface DroppedItemProps { selectedTag: DroppedItem setDroppedItems: React.Dispatch> selTagKey: string, selTagIndx: number } enum TEXT { PARAGRAPH = "paragraph", SINGLE_LINE = "single_line", PASSWORD = "password", } // enum SIGNATURE { // TYPED = "typed", // DRAW = "draw", // UPLOAD = "upload", // } // enum INITIALS { // TYPED = "typed", // DRAW = "draw", // UPLOAD = "upload", // } export enum TEMPORAL { DATE = "date", TIME = "time", DATE_TIME = "date_time", // YEAR = "year", // MONTH = "month", // WEEK = "week", } enum NUMBER { INTEGER = "integer", DECIMAL = "decimal", CURRENCY = "currency" } // enum IMAGE { // STAMP = "stamp", // LOGO = "logo" // } enum SELECT { SINGLE_SELECT = "single select", MULTI_SELECT = "multi select" } enum MASKTYPE { ALL = "all", LAST_FOUR = "last_four", CREDIT_CARD = "credit_Card", NATIONAL_INSURANCE = "national_insurance", SOCIAL_SECURITY = "social_security", SOCIAL_INSURANCE = "social_insurance" } enum MASKCHARACTER { ASTERISK = "ASTERISK", DOT = "DOT", X = "CROSS", } const enumMap = { text: TEXT, temporal: TEMPORAL, number: NUMBER, image: String, select: SELECT } enum DROPDOWNTOGGLE { TYPE, MASK_TYPE, MASK_CHARACTER, DDMMYY_FORMAT } const dateTimeFormatMap = { "date": dateFormats, "time": timeFormats, "date_time": dateTimeFormats, "year": yearFormats, "month": monthFormats, "week": weekFormats } const RightSideBar: React.FC = ({ selectedTag, setDroppedItems, selTagKey, selTagIndx }) => { console.log(selectedTag, "selectedTag Line 102") const selectedType = selectedTag.type in enumMap && enumMap[selectedTag.type as keyof typeof enumMap]; const [dropDownToggle, setDropDownToggle] = useState(null); // const [showFormatEg, setShowFormatEg] = useState(false); const [is24Hrs, setIs24Hrs] = useState(true); const [isCurrentTimeStamp, setIsCurrentTimeStamp] = useState(true); // const [selectedOptions, setSelectedOptions] = useState([]) const [decimalPlace, setDecimalPlace] = useState(2) const [selectedOption, setSelectedOption] = useState() const handlePropertyChange = (changeTo: string, changeWith: string | boolean | number) => { console.log("Handle Property Change Called", "changeTo", changeTo, "changeWith", changeWith) if (changeTo === '' || changeWith === '') return if (changeTo === "subType" && (changeWith === TEMPORAL.DATE || changeWith === TEMPORAL.DATE_TIME || changeWith === TEMPORAL.TIME)) { // let change: string = changeWith; // if (change === "DATE TIME") { // change = "DATE_TIME" // } setDroppedItems((prev) => ( { ...prev, [selTagKey]: Array.isArray(prev[selTagKey]) // Ensure it's an array ? prev[selTagKey].map((item, i) => i === selTagIndx ? { ...item, [changeTo]: changeWith || "", format: "" } : item ) : [], }// Provide a fallback in case it's undefined or not an array )); } else if (changeTo === "subType" && typeof changeWith === "string" && changeWith.toLowerCase() === "password") { console.log("Line 161") setDroppedItems((prev) => ( { ...prev, [selTagKey]: Array.isArray(prev[selTagKey]) ? prev[selTagKey].map((item, i) => i === selTagIndx ? { ...item, [changeTo]: changeWith, maskType: "All", maskCharacter: "ASTERISK" } : item ) : [], } )); } else if (changeTo === "subType" && (changeWith === NUMBER.CURRENCY || changeWith === NUMBER.INTEGER || changeWith === NUMBER.DECIMAL)) { let decPlace = changeWith !== NUMBER.DECIMAL ? 0 : decimalPlace; const isCurrency = changeWith === NUMBER.CURRENCY; // const currencyType = null setDroppedItems((prev) => ( { ...prev, [selTagKey]: Array.isArray(prev[selTagKey]) // Ensure it's an array ? prev[selTagKey].map((item, i) => i === selTagIndx ? { ...item, [changeTo]: changeWith, decimalPlace: decPlace, isCurrency } : item ) : [], }// Provide a fallback in case it's undefined or not an array )); } else if (changeTo === "format" && selectedTag.subType === TEMPORAL.DATE_TIME) { let val = timeFormats[0].format; if (!is24Hrs) { val = timeFormats[1].format } setDroppedItems((prev) => ( { ...prev, [selTagKey]: Array.isArray(prev[selTagKey]) // Ensure it's an array ? prev[selTagKey].map((item, i) => i === selTagIndx ? { ...item, [changeTo]: changeWith + " " + val } : item ) : [], }// Provide a fallback in case it's undefined or not an array )); } else { setDroppedItems((prev) => ( { ...prev, [selTagKey]: Array.isArray(prev[selTagKey]) // Ensure it's an array ? prev[selTagKey].map((item, i) => i === selTagIndx ? { ...item, [changeTo]: changeWith } : item ) : [], }// Provide a fallback in case it's undefined or not an array )); } setDropDownToggle(null) } // const handleSelectTagOptions = () => { // if (!selectedOptions.length) return // setDroppedItems((prev) => ( // { // ...prev, // [selTagKey]: Array.isArray(prev[selTagKey]) // ? prev[selTagKey].map((item, i) => { // if (i === selTagIndx) { // return { ...item, options: [...selectedOptions] }; // } // return item; // }) // : [], // } // )); // } // useEffect(() => { // handleSelectTagOptions(); // }, [selectedOptions]) useEffect(() => { if (selectedTag.subType === TEMPORAL.DATE || selectedTag.subType === TEMPORAL.DATE_TIME || selectedTag.subType === TEMPORAL.TIME) { if (selectedTag.subType === TEMPORAL.DATE) { handlePropertyChange("format", dateFormats[0].format) } else if (selectedTag.subType === TEMPORAL.DATE_TIME) { handlePropertyChange("format", dateTimeFormats[0].format) } else if (selectedTag.subType === TEMPORAL.TIME) { handlePropertyChange("format", timeFormats[0].format) } } // else if(selectedTag.subType === TEXT.PASSWORD) { // handlePropertyChange("format", timeFormats[0].format) // } }, [selectedTag.subType]) useEffect(() => { if (selectedTag.format === timeFormats[1].format && is24Hrs) { setIs24Hrs(false); } else if (selectedTag.format === timeFormats[0].format && !is24Hrs) { setIs24Hrs(true); } }, [selectedTag.format]) useEffect(() => { if (selectedTag.label === "temporal") { handlePropertyChange("subType", TEMPORAL.DATE); handlePropertyChange("format", "DD/MM/YY"); } }, []) const handleIs24HrsClick = (checked: boolean) => { if (selectedTag.subType === TEMPORAL.TIME) { if (!checked) { handlePropertyChange("format", timeFormats[1].format) } else { handlePropertyChange("format", timeFormats[0].format) } } setIs24Hrs(checked) } const handleIsCurrentTimeStamp = (checked: boolean) => { if (selectedTag.type.toLowerCase() === "temporal") { setIsCurrentTimeStamp(checked) handlePropertyChange("currentTimeStamp", checked); } } const handleAddSelectOption = () => { if (selectedOption && selectedOption.length) { setDroppedItems((prev) => ( { ...prev, [selTagKey]: Array.isArray(prev[selTagKey]) ? prev[selTagKey].map((item, i) => { if (i === selTagIndx) { return { ...item, options: item.options ? [...item.options, selectedOption] : [selectedOption] }; } return item; }) : [], } )); } } const handleSelectOptionDel = (indx: number) => { // setSelectedOptions(prev => // prev.filter((_, i) => i !== indx) // ) setDroppedItems((prev) => ( { ...prev, [selTagKey]: Array.isArray(prev[selTagKey]) ? prev[selTagKey].map((item, i) => { if (i === selTagIndx) { return { ...item, options: item.options ? item.options.filter((_, i) => i !== indx) : [] }; } return item; }) : [], } )); } const handleDecimalPlace = (e: React.ChangeEvent) => { const val = Number(e.target.value) setDecimalPlace(val) handlePropertyChange("decimalPlace", val) } useEffect(() => { if ("styles" in selectedTag) { const fontSize = selectedTag?.styles?.textSize; const tagHeight = selectedTag?.dimensions?.height - 18; console.log(fontSize, tagHeight, "Line 323", selectedTag?.styles) if (selectedTag.subType !== "password" && selectedTag.subType !== "paragraph" && tagHeight > (fontSize + fontSize)) { console.log("Change subType Called from if") handlePropertyChange("subType", "paragraph") } else if (selectedTag.subType !== "password" && selectedTag.subType !== "single_line" && tagHeight <= (fontSize + fontSize)) { console.log("Change subType Called from elseif") handlePropertyChange("subType", "single_line") } } }, [selectedTag]) console.log("RightSideBar - selectedTag", selectedTag) return ( <> {/* Right Side Bar Start */}

Properties


{/* label */}
handlePropertyChange('label', e.target.value)} type="text" className="outline-none border-1 rounded px-2 py-1 border-slate-200" />
{/* Required */} {(selectedTag.type !== "signature" && selectedTag.type !== "initials") &&
handlePropertyChange('required', e.target.checked)} type="checkbox" className="outline-none border-1 rounded px-2 py-1 border-slate-200" />
} {/* Use Current TimeStamp */} {selectedTag.type.toLowerCase() === "temporal" &&
handleIsCurrentTimeStamp(e.target.checked)} id="use_current_timestamp" type="checkbox" />
} {/* Type | SubType */} {selectedType && Object.keys(selectedType).length > 0 &&
setDropDownToggle(dropDownToggle === DROPDOWNTOGGLE.TYPE ? null : DROPDOWNTOGGLE.TYPE)} className="flex justify-between items-center border-1 rounded px-2 py-1 border-slate-200">

{selectedTag?.subType ? (selectedTag.subType === "date_time" ? "Date Time" : selectedTag.subType) : selectedType[Object.keys(selectedType)[0] as keyof typeof selectedType]}

{dropDownToggle === DROPDOWNTOGGLE.TYPE &&
{Object.keys(selectedType).map((val, indx) => (
handlePropertyChange("subType", selectedType[val as keyof typeof selectedType])} className={`capitalize px-2 py-1 hover:bg-slate-200 cursor-pointer`} > {selectedType[val as keyof typeof selectedType] === "date_time" ? "Date Time" : selectedType[val as keyof typeof selectedType]}
))}
}
} {/* Mask Type */} { selectedTag?.subType === TEXT.PASSWORD &&
setDropDownToggle(dropDownToggle === DROPDOWNTOGGLE.MASK_TYPE ? null : DROPDOWNTOGGLE.MASK_TYPE)} className="flex justify-between items-center border-1 rounded px-2 py-1 border-slate-200">

{(selectedTag.maskType && selectedTag.maskType.replace("_", " ")) ? selectedTag.maskType : MASKTYPE.ALL}

{ dropDownToggle === DROPDOWNTOGGLE.MASK_TYPE &&
{(Object.keys(MASKTYPE) as (keyof typeof MASKTYPE)[]).map((val, indx) => (
handlePropertyChange("maskType", MASKTYPE[val])} className="capitalize px-2 py-1 hover:bg-slate-200 cursor-pointer" > {(MASKTYPE[val]).replace("_", " ")}
) )}
}
} {/* Mask Character - START */} { selectedTag?.subType === TEXT.PASSWORD &&
setDropDownToggle(dropDownToggle === DROPDOWNTOGGLE.MASK_CHARACTER ? null : DROPDOWNTOGGLE.MASK_CHARACTER)} className="flex justify-between items-center border-1 rounded px-2 py-1 border-slate-200">

{selectedTag?.maskCharacter ? selectedTag.maskCharacter === MASKCHARACTER.ASTERISK && || selectedTag.maskCharacter === MASKCHARACTER.DOT && || selectedTag.maskCharacter === MASKCHARACTER.X && : }

{ dropDownToggle === DROPDOWNTOGGLE.MASK_CHARACTER &&
{(Object.keys(MASKCHARACTER) as (keyof typeof MASKCHARACTER)[]).map((val, indx) => (
handlePropertyChange("maskCharacter", MASKCHARACTER[val])} className="capitalize p-2 hover:bg-slate-200 cursor-pointer" > { MASKCHARACTER[val] === MASKCHARACTER.ASTERISK && } { MASKCHARACTER[val] === MASKCHARACTER.DOT && } { MASKCHARACTER[val] === MASKCHARACTER.X && }
) )}
}
} {/* Mask Character - END */} {/* TEMPORAL DATE FORMAT - START */} { (selectedTag?.subType === TEMPORAL.DATE || selectedTag?.subType === TEMPORAL.TIME || selectedTag?.subType === TEMPORAL.DATE_TIME) &&
{/*
setShowFormatEg(e.target.checked)} id="data_time_format" type="checkbox" />
*/}
{(selectedTag.subType === TEMPORAL.DATE_TIME || selectedTag.subType === TEMPORAL.TIME) &&
handleIs24HrsClick(e.target.checked)} id="data_time_format" type="checkbox" />
}
setDropDownToggle(dropDownToggle === DROPDOWNTOGGLE.DDMMYY_FORMAT ? null : DROPDOWNTOGGLE.DDMMYY_FORMAT)} className="flex justify-between items-center border-1 rounded px-2 py-1 border-slate-200">

{selectedTag.format ? selectedTag.format : dateTimeFormatMap['date'][0].format} {/* {(selectedTag.subType !== TEMPORAL.DATE && selectedTag.subType !== TEMPORAL.TIME) ? (is24Hrs ? " " + timeFormats[0].format : " " + timeFormats[1].format) : ""} */}

{ dropDownToggle === DROPDOWNTOGGLE.DDMMYY_FORMAT &&
{dateTimeFormatMap[selectedTag.subType].map((valObj, indx) => { // let val = showFormatEg ? valObj["example"] : valObj["format"] let val = valObj["format"] if (selectedTag.subType === TEMPORAL.DATE_TIME) { if (is24Hrs) { val = val + " " + timeFormats[0].format; } else { val = val + " " + timeFormats[1].format; } } return (
handlePropertyChange("format", valObj["format"])} className="px-2 py-1 hover:bg-slate-200 cursor-pointer" > {val}
) } )}
} {selectedTag.format &&
{/*

Example

*/}

{dayjs().format(selectedTag.format)}

}
} {/* TEMPORAL DATE FORMAT - END */} {/* NUMBER - DECIMAL PLACES */} { selectedTag?.subType === NUMBER.DECIMAL &&
handleDecimalPlace(e)} value={decimalPlace} className="bg-slate-100 w-full outline-none p-2 rounded" />
} {(selectedTag?.subType === "single select" || selectedTag?.subType === "multi select") && <>
setSelectedOption(e.target.value)} value={selectedOption} onKeyUp={(e) => { if (e.code === "Enter") { // if (selectedOption) { // setSelectedOptions((prev) => [...prev, selectedOption]); // setSelectedOption(""); // } handleAddSelectOption() } }} className="bg-slate-100 w-full outline-none p-2 rounded" />
{ selectedTag.options && selectedTag.options.map((val, indx) => (

{val}

// setSelectedOptions(prev => // prev.filter((_, i) => i !== indx) // ) handleSelectOptionDel(indx) } className="cursor-pointer text-slate-500 hover:text-slate-600" />
)) }
}
{/* Right Side Bar End */} ) } export default RightSideBar