react-admin-crud-manager 1.0.26 → 1.0.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/lib/utils.js","../src/components/Button/Button.jsx","../src/components/Form/components/InputLabel.jsx","../src/components/Form/components/Select.jsx","../src/components/Form/components/Switch.jsx","../src/data/countries.js","../src/components/Form/components/PhoneInput.jsx","../src/components/Form/components/TextArea.jsx","../src/components/Form/components/ImagePicker.jsx","../src/components/Form/components/Input.jsx","../src/components/Form/components/TinyEditor.jsx","../src/components/Form/components/Checkbox.jsx","../src/components/Form/components/AudioPicker.jsx","../src/components/Form/components/RenderFields.jsx","../src/components/Filter/FilterDrawer.jsx","../src/components/Chip/Chip.jsx","../src/components/Table/components/TableSkeleton.jsx","../src/components/Table/components/ImagePreview.jsx","../src/components/Table/Table.jsx","../src/components/Modal/Modal.jsx","../src/components/Form/Form.jsx","../src/components/Details/Details.jsx","../src/components/CrudPage.jsx","../src/index.jsx"],"sourcesContent":["// ======= Format Date : Jan 15, 2024 =======\r\n\r\nexport const formatDate = (dateString, format = \"DD MMM YYYY\") => {\r\n if (!dateString) return \"N/A\";\r\n\r\n const date = new Date(dateString);\r\n if (isNaN(date)) return \"Invalid Date\";\r\n\r\n const pad = (n) => String(n).padStart(2, \"0\");\r\n\r\n const map = {\r\n YYYY: date.getFullYear(),\r\n YY: String(date.getFullYear()).slice(-2),\r\n\r\n MMMM: date.toLocaleString(\"en-US\", { month: \"long\" }),\r\n MMM: date.toLocaleString(\"en-US\", { month: \"short\" }),\r\n MM: pad(date.getMonth() + 1),\r\n M: date.getMonth() + 1,\r\n\r\n DD: pad(date.getDate()),\r\n D: date.getDate(),\r\n\r\n dddd: date.toLocaleString(\"en-US\", { weekday: \"long\" }),\r\n ddd: date.toLocaleString(\"en-US\", { weekday: \"short\" }),\r\n\r\n HH: pad(date.getHours()),\r\n hh: pad(date.getHours() % 12 || 12),\r\n\r\n mm: pad(date.getMinutes()),\r\n ss: pad(date.getSeconds()),\r\n\r\n A: date.getHours() >= 12 ? \"PM\" : \"AM\",\r\n };\r\n\r\n return format.replace(\r\n /YYYY|YY|MMMM|MMM|MM|M|DD|D|dddd|ddd|HH|hh|mm|ss|A/g,\r\n (token) => map[token],\r\n );\r\n};\r\n\r\n// =========== Local Search function ===========\r\nexport const searchLocalData = (data, searchTerm, searchKeys = []) => {\r\n if (!searchTerm?.trim()) return data;\r\n\r\n const lowerSearchTerm = searchTerm.toLowerCase();\r\n\r\n const extractValues = (obj) => {\r\n if (obj == null) return [];\r\n if (typeof obj === \"object\") {\r\n return Object.values(obj).flatMap(extractValues);\r\n }\r\n return [String(obj)];\r\n };\r\n\r\n return data.filter((item) => {\r\n let valuesToSearch = [];\r\n\r\n // ✅ If specific keys are provided → search only in those keys\r\n if (searchKeys.length > 0) {\r\n searchKeys.forEach((key) => {\r\n if (item[key] !== undefined) {\r\n valuesToSearch.push(...extractValues(item[key]));\r\n }\r\n });\r\n } else {\r\n // ✅ Otherwise → search in entire object\r\n valuesToSearch = extractValues(item);\r\n }\r\n\r\n return valuesToSearch.some((val) =>\r\n val.toLowerCase().includes(lowerSearchTerm),\r\n );\r\n });\r\n};\r\n","import React from \"react\";\r\n\r\nconst Button = React.forwardRef(\r\n (\r\n {\r\n className = \"\",\r\n variant = \"contained\",\r\n color = \"default\",\r\n size = \"default\",\r\n fullWidth = false,\r\n children,\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n const baseStyles =\r\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-400 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\";\r\n\r\n const sizes = {\r\n sm: \"h-8 px-3 rounded-md text-sm\",\r\n md: \"h-9 px-4 rounded-md text-sm\",\r\n lg: \"h-11 px-6 rounded-md text-base\",\r\n xl: \"h-12 px-8 rounded-lg text-lg\",\r\n default: \"h-9 px-4 rounded-md text-sm\",\r\n };\r\n\r\n const colorVariants = {\r\n primary: {\r\n contained:\r\n \"bg-primary text-white hover:bg-primary-600 focus:ring-primary-500 shadow-sm\",\r\n outlined:\r\n \"border border-primary bg-transparent text-primary hover:bg-primary-50 focus:ring-primary-500\",\r\n text: \"bg-transparent text-primary hover:bg-primary-50 focus:ring-primary-500\",\r\n },\r\n success: {\r\n contained:\r\n \"bg-green-600 text-white hover:bg-green-700 focus:ring-green-500 shadow-sm\",\r\n outlined:\r\n \"border border-green-600 bg-transparent text-green-600 hover:bg-green-50 focus:ring-green-500\",\r\n text: \"bg-transparent text-green-600 hover:bg-green-50 focus:ring-green-500\",\r\n },\r\n error: {\r\n contained:\r\n \"bg-red-600 text-white hover:bg-red-700 focus:ring-red-500 shadow-sm\",\r\n outlined:\r\n \"border border-red-600 bg-transparent text-red-600 hover:bg-red-50 focus:ring-red-500\",\r\n text: \"bg-transparent text-red-600 hover:bg-red-50 focus:ring-red-500\",\r\n },\r\n default: {\r\n contained:\r\n \"border bg-gray-200 text-gray-800 hover:bg-gray-300 focus:ring-gray-300 shadow-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-100 dark:hover:bg-gray-600 dark:focus:ring-gray-600\",\r\n outlined:\r\n \"border border-gray-300 bg-transparent text-gray-700 hover:bg-gray-100 focus:ring-gray-300 dark:border-gray-600 dark:text-gray-200 dark:hover:bg-gray-700 dark:focus:ring-gray-500\",\r\n text: \"bg-transparent text-gray-700 hover:bg-gray-100 focus:ring-gray-300 dark:text-gray-200 dark:hover:bg-gray-700 dark:focus:ring-gray-500\",\r\n },\r\n };\r\n\r\n const colorStyles =\r\n colorVariants[color]?.[variant] || colorVariants.default.contained;\r\n const sizeStyles = sizes[size];\r\n\r\n const combinedClassName = `\r\n ${baseStyles} \r\n ${colorStyles} \r\n ${sizeStyles} \r\n ${fullWidth ? \"w-full\" : \"\"} \r\n ${className}\r\n `.trim();\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n type={props.type || \"button\"}\r\n className={combinedClassName}\r\n {...props}\r\n >\r\n {children}\r\n </button>\r\n );\r\n },\r\n);\r\n\r\nButton.displayName = \"Button\";\r\n\r\nexport default Button;\r\n","import { Info } from \"lucide-react\";\r\nimport React from \"react\";\r\n\r\nexport default function InputLabel({ label, required = false, infoText = \"\" }) {\r\n return (\r\n <>\r\n <label className=\"flex text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {label}\r\n {required && <span className=\"ml-1\">*</span>}\r\n\r\n {infoText && (\r\n <span className=\"ml-2 relative group inline-flex items-center cursor-pointer\">\r\n <Info className=\"w-4 h-4 text-gray-500 dark:text-gray-400\" />\r\n\r\n {/* Tooltip */}\r\n <span\r\n className=\"absolute left-1/2 top-full mt-2\r\n w-max max-w-xs bg-white text-black dark:bg-black dark:text-white text-xs\r\n rounded px-2 py-1 opacity-0 shadow-lg\r\n group-hover:opacity-100 transition-opacity\r\n duration-200 pointer-events-none z-50\"\r\n >\r\n {infoText}\r\n </span>\r\n </span>\r\n )}\r\n </label>\r\n </>\r\n );\r\n}\r\n","import React, { useState, useEffect, useRef } from \"react\";\r\nimport { ChevronDown, Search, Check } from \"lucide-react\";\r\nimport InputLabel from \"./InputLabel\";\r\n\r\nconst Select = ({\r\n options = [],\r\n value = \"\",\r\n defaultValue = \"\",\r\n onChange,\r\n placeholder = \"Select option\",\r\n className = \"\",\r\n disabled = false,\r\n search = false,\r\n label = \"\",\r\n required = false,\r\n name = \"\",\r\n parentClass = \"\",\r\n multiple = false, // ✅ NEW\r\n dropdownMaxHeight = \"\",\r\n formData = {},\r\n dependencyKey = \"\",\r\n}) => {\r\n const [open, setOpen] = useState(false);\r\n const [searchTerm, setSearchTerm] = useState(\"\");\r\n const [showAboveState, setShowAboveState] = useState(true);\r\n const dropdownRef = useRef(null);\r\n const searchInputRef = useRef(null);\r\n const [normalizedOptions, setNormalizedOptions] = useState([]);\r\n\r\n let initialVal = value || value === false ? value : defaultValue;\r\n\r\n const normalize = (val) => {\r\n if (val === null || val === undefined || val === \"\") return \"\";\r\n return typeof val === \"boolean\" ? String(val) : String(val ?? \"\");\r\n };\r\n\r\n useEffect(\r\n () => {\r\n const loadOptions = async () => {\r\n if (typeof options === \"function\") {\r\n const result = await options(formData);\r\n setNormalizedOptions(result);\r\n } else {\r\n setNormalizedOptions(options || []);\r\n }\r\n };\r\n\r\n loadOptions();\r\n },\r\n dependencyKey ? [options, formData?.[dependencyKey]] : [options],\r\n ); // ✅ Add dependencyKey if options depend on formData\r\n\r\n const normalizedValue = multiple\r\n ? (initialVal || []).map(normalize)\r\n : normalize(initialVal);\r\n\r\n const filteredOptions = normalizedOptions.filter((option) =>\r\n option.label.toLowerCase().includes(searchTerm.toLowerCase()),\r\n );\r\n\r\n const isSelected = (optionValue) => {\r\n const normalized = normalize(optionValue);\r\n if (multiple) {\r\n return normalizedValue.includes(normalized);\r\n }\r\n return normalized === normalizedValue;\r\n };\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event) => {\r\n if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {\r\n setOpen(false);\r\n setSearchTerm(\"\");\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (open && dropdownRef.current) {\r\n const rect = dropdownRef.current.getBoundingClientRect();\r\n const viewportHeight = window.innerHeight;\r\n const spaceBelow = viewportHeight - rect.bottom;\r\n const dropdownHeight = 200;\r\n setShowAboveState(spaceBelow < dropdownHeight);\r\n }\r\n }, [open]);\r\n\r\n useEffect(() => {\r\n if (open && searchInputRef.current) {\r\n searchInputRef.current.focus();\r\n }\r\n }, [open]);\r\n\r\n const handleOptionClick = (optionValue) => {\r\n let finalValue = optionValue;\r\n if (optionValue === \"true\") finalValue = true;\r\n else if (optionValue === \"false\") finalValue = false;\r\n\r\n if (multiple) {\r\n const exists = normalizedValue.includes(normalize(optionValue));\r\n\r\n let newValues;\r\n if (exists) {\r\n newValues = value.filter(\r\n (v) => normalize(v) !== normalize(optionValue),\r\n );\r\n } else {\r\n newValues = [...(value || []), finalValue];\r\n }\r\n\r\n onChange(newValues);\r\n } else {\r\n onChange(finalValue);\r\n setOpen(false);\r\n }\r\n\r\n setSearchTerm(\"\");\r\n };\r\n\r\n const selectedLabels = multiple\r\n ? normalizedOptions\r\n .filter((opt) => isSelected(opt.value))\r\n .map((opt) => opt.label)\r\n .join(\", \")\r\n : normalizedOptions.find((opt) => isSelected(opt.value))?.label;\r\n\r\n useEffect(() => {\r\n if (initialVal || initialVal === false) {\r\n setTimeout(() => {\r\n onChange(initialVal);\r\n }, 100);\r\n }\r\n }, []);\r\n\r\n return (\r\n <div key={name} className={parentClass || \"col-span-12\"}>\r\n <InputLabel label={label} required={required} />\r\n\r\n <div className={`relative ${className}`} ref={dropdownRef}>\r\n <select\r\n name=\"hidden_select_for_validation\"\r\n value={selectedLabels || \"\"}\r\n required={required}\r\n multiple={multiple}\r\n className=\"absolute opacity-0 right-1/2 top-[80%] -translate-x-1/2 -translate-y-1/2 pointer-events-none h-[10px]\"\r\n >\r\n <option hidden value={selectedLabels}>\r\n {selectedLabels}\r\n </option>\r\n </select>\r\n <button\r\n type=\"button\"\r\n onClick={() => !disabled && setOpen(!open)}\r\n disabled={disabled}\r\n className={`w-full h-10 px-3 border border-gray-300 dark:border-gray-600 rounded-md text-left text-sm flex items-center justify-between \r\n ${\r\n !selectedLabels\r\n ? \"text-gray-500 dark:text-gray-400\"\r\n : \"dark:text-white\"\r\n } \r\n ${disabled ? \"opacity-50 cursor-not-allowed\" : \"dark:bg-gray-700\"}`}\r\n >\r\n <span className=\"truncate\">{selectedLabels || placeholder}</span>\r\n\r\n <ChevronDown\r\n className={`w-4 h-4 transition-transform ${\r\n open ? \"rotate-180\" : \"\"\r\n }`}\r\n />\r\n </button>\r\n\r\n {open && (\r\n <div\r\n className={`absolute z-50 w-full border rounded-md bg-white dark:bg-gray-700 shadow-lg \r\n ${showAboveState ? \"bottom-full mb-1\" : \"top-full mt-1\"}`}\r\n >\r\n {search && (\r\n <div className=\"p-2 border-b border-gray-200 dark:border-gray-600\">\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400\" />\r\n <input\r\n ref={searchInputRef}\r\n type=\"text\"\r\n value={searchTerm}\r\n onChange={(e) => setSearchTerm(e.target.value)}\r\n placeholder=\"Search...\"\r\n className=\"w-full pl-9 pr-3 py-2 text-sm border rounded-md bg-white dark:bg-gray-800 dark:text-white placeholder-gray-500 dark:placeholder-gray-400 focus:outline-none\"\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div\r\n className={`max-h-40 overflow-y-auto`}\r\n style={{\r\n maxHeight: dropdownMaxHeight || \"\",\r\n }}\r\n >\r\n {filteredOptions.length > 0 ? (\r\n filteredOptions.map((option) => (\r\n <button\r\n key={String(option.value)}\r\n type=\"button\"\r\n onClick={() => handleOptionClick(String(option.value))}\r\n className={`w-full px-3 py-2 text-left text-sm flex items-center justify-between hover:bg-gray-100 dark:hover:bg-gray-600 \r\n ${\r\n isSelected(option.value)\r\n ? \"bg-blue-50 dark:bg-blue-900/20 text-blue-700 dark:text-blue-300\"\r\n : \"\"\r\n }`}\r\n >\r\n <span>{option.label}</span>\r\n\r\n {multiple && isSelected(option.value) && (\r\n <Check className=\"w-4 h-4\" />\r\n )}\r\n </button>\r\n ))\r\n ) : (\r\n <div className=\"px-3 py-2 text-sm text-gray-500 dark:text-gray-400\">\r\n No options found\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default Select;\r\n","import React from \"react\";\r\nimport InputLabel from \"./InputLabel\";\r\n\r\nconst Switch = ({\r\n value = true,\r\n onChange,\r\n text,\r\n options = [],\r\n label,\r\n required,\r\n name = \"\",\r\n disabled = false,\r\n parentClass = \"\",\r\n}) => {\r\n const radioOptions =\r\n options.length > 0\r\n ? options\r\n : [\r\n { label: \"Active\", value: true },\r\n { label: \"Inactive\", value: false },\r\n ];\r\n\r\n return (\r\n <>\r\n <div key={name} className={parentClass || \"col-span-12\"}>\r\n <InputLabel label={label} required={required} />\r\n <div className=\"flex items-center justify-between h-10 gap-4 bg-gray-100 dark:bg-gray-700 px-3 rounded-md border border-gray-100 dark:border-gray-600\">\r\n {/* Left Text */}\r\n {text && (\r\n <p className=\"text-xs text-gray-600 dark:text-gray-400 flex-shrink overflow-hidden text-ellipsis whitespace-nowrap max-w-[200px]\">\r\n {text}\r\n </p>\r\n )}\r\n\r\n {/* Radio Buttons */}\r\n <div className=\"flex items-center gap-6\">\r\n {radioOptions.map((opt, idx) => (\r\n <label\r\n key={idx}\r\n className=\"flex items-center gap-2 cursor-pointer select-none\"\r\n >\r\n <input\r\n type=\"radio\"\r\n name=\"switch-field\"\r\n required={required && idx === 0}\r\n value={opt.value}\r\n disabled={disabled}\r\n checked={value === opt.value}\r\n onChange={() => onChange(opt.value)}\r\n className=\"w-4 h-4 border-gray-300 cursor-pointer\"\r\n />\r\n <span className=\"text-sm text-gray-700 dark:text-white\">\r\n {opt.label}\r\n </span>\r\n </label>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default Switch;\r\n","export const countries = [\r\n { label: \"Afghanistan\", code: \"AF\", phone: \"93\" },\r\n { label: \"Aland Islands\", code: \"AX\", phone: \"358\" },\r\n { label: \"Albania\", code: \"AL\", phone: \"355\" },\r\n { label: \"Algeria\", code: \"DZ\", phone: \"213\" },\r\n { label: \"American Samoa\", code: \"AS\", phone: \"1\" },\r\n { label: \"Andorra\", code: \"AD\", phone: \"376\" },\r\n { label: \"Angola\", code: \"AO\", phone: \"244\" },\r\n { label: \"Anguilla\", code: \"AI\", phone: \"1\" },\r\n { label: \"Antarctica\", code: \"AQ\", phone: \"672\" },\r\n { label: \"Antigua and Barbuda\", code: \"AG\", phone: \"1\" },\r\n { label: \"Argentina\", code: \"AR\", phone: \"54\" },\r\n { label: \"Armenia\", code: \"AM\", phone: \"374\" },\r\n { label: \"Aruba\", code: \"AW\", phone: \"297\" },\r\n { label: \"Australia\", code: \"AU\", phone: \"61\" },\r\n { label: \"Austria\", code: \"AT\", phone: \"43\" },\r\n { label: \"Azerbaijan\", code: \"AZ\", phone: \"994\" },\r\n { label: \"Bahrain\", code: \"BH\", phone: \"973\" },\r\n { label: \"Bangladesh\", code: \"BD\", phone: \"880\" },\r\n { label: \"Barbados\", code: \"BB\", phone: \"1\" },\r\n { label: \"Belarus\", code: \"BY\", phone: \"375\" },\r\n { label: \"Belgium\", code: \"BE\", phone: \"32\" },\r\n { label: \"Belize\", code: \"BZ\", phone: \"501\" },\r\n { label: \"Benin\", code: \"BJ\", phone: \"229\" },\r\n { label: \"Bermuda\", code: \"BM\", phone: \"1\" },\r\n { label: \"Bhutan\", code: \"BT\", phone: \"975\" },\r\n { label: \"Bolivia\", code: \"BO\", phone: \"591\" },\r\n { label: \"Bonaire, Sint Eustatius and Saba\", code: \"BQ\", phone: \"599\" },\r\n { label: \"Bosnia and Herzegovina\", code: \"BA\", phone: \"387\" },\r\n { label: \"Botswana\", code: \"BW\", phone: \"267\" },\r\n { label: \"Bouvet Island\", code: \"BV\", phone: \"0055\" },\r\n { label: \"Brazil\", code: \"BR\", phone: \"55\" },\r\n { label: \"British Indian Ocean Territory\", code: \"IO\", phone: \"246\" },\r\n { label: \"Brunei\", code: \"BN\", phone: \"673\" },\r\n { label: \"Bulgaria\", code: \"BG\", phone: \"359\" },\r\n { label: \"Burkina Faso\", code: \"BF\", phone: \"226\" },\r\n { label: \"Burundi\", code: \"BI\", phone: \"257\" },\r\n { label: \"Cambodia\", code: \"KH\", phone: \"855\" },\r\n { label: \"Cameroon\", code: \"CM\", phone: \"237\" },\r\n { label: \"Canada\", code: \"CA\", phone: \"1\" },\r\n { label: \"Cape Verde\", code: \"CV\", phone: \"238\" },\r\n { label: \"Cayman Islands\", code: \"KY\", phone: \"1\" },\r\n { label: \"Central African Republic\", code: \"CF\", phone: \"236\" },\r\n { label: \"Chad\", code: \"TD\", phone: \"235\" },\r\n { label: \"Chile\", code: \"CL\", phone: \"56\" },\r\n { label: \"China\", code: \"CN\", phone: \"86\" },\r\n { label: \"Christmas Island\", code: \"CX\", phone: \"61\" },\r\n { label: \"Cocos (Keeling) Islands\", code: \"CC\", phone: \"61\" },\r\n { label: \"Colombia\", code: \"CO\", phone: \"57\" },\r\n { label: \"Comoros\", code: \"KM\", phone: \"269\" },\r\n { label: \"Congo\", code: \"CG\", phone: \"242\" },\r\n { label: \"Cook Islands\", code: \"CK\", phone: \"682\" },\r\n { label: \"Costa Rica\", code: \"CR\", phone: \"506\" },\r\n { label: \"Croatia\", code: \"HR\", phone: \"385\" },\r\n { label: \"Cuba\", code: \"CU\", phone: \"53\" },\r\n { label: \"Curaçao\", code: \"CW\", phone: \"599\" },\r\n { label: \"Cyprus\", code: \"CY\", phone: \"357\" },\r\n { label: \"Czech Republic\", code: \"CZ\", phone: \"420\" },\r\n { label: \"Democratic Republic of the Congo\", code: \"CD\", phone: \"243\" },\r\n { label: \"Denmark\", code: \"DK\", phone: \"45\" },\r\n { label: \"Djibouti\", code: \"DJ\", phone: \"253\" },\r\n { label: \"Dominica\", code: \"DM\", phone: \"1\" },\r\n { label: \"Dominican Republic\", code: \"DO\", phone: \"1\" },\r\n { label: \"Ecuador\", code: \"EC\", phone: \"593\" },\r\n { label: \"Egypt\", code: \"EG\", phone: \"20\" },\r\n { label: \"El Salvador\", code: \"SV\", phone: \"503\" },\r\n { label: \"Equatorial Guinea\", code: \"GQ\", phone: \"240\" },\r\n { label: \"Eritrea\", code: \"ER\", phone: \"291\" },\r\n { label: \"Estonia\", code: \"EE\", phone: \"372\" },\r\n { label: \"Eswatini\", code: \"SZ\", phone: \"268\" },\r\n { label: \"Ethiopia\", code: \"ET\", phone: \"251\" },\r\n { label: \"Falkland Islands\", code: \"FK\", phone: \"500\" },\r\n { label: \"Faroe Islands\", code: \"FO\", phone: \"298\" },\r\n { label: \"Fiji Islands\", code: \"FJ\", phone: \"679\" },\r\n { label: \"Finland\", code: \"FI\", phone: \"358\" },\r\n { label: \"France\", code: \"FR\", phone: \"33\" },\r\n { label: \"French Guiana\", code: \"GF\", phone: \"594\" },\r\n { label: \"French Polynesia\", code: \"PF\", phone: \"689\" },\r\n { label: \"French Southern Territories\", code: \"TF\", phone: \"262\" },\r\n { label: \"Gabon\", code: \"GA\", phone: \"241\" },\r\n { label: \"Georgia\", code: \"GE\", phone: \"995\" },\r\n { label: \"Germany\", code: \"DE\", phone: \"49\" },\r\n { label: \"Ghana\", code: \"GH\", phone: \"233\" },\r\n { label: \"Gibraltar\", code: \"GI\", phone: \"350\" },\r\n { label: \"Greece\", code: \"GR\", phone: \"30\" },\r\n { label: \"Greenland\", code: \"GL\", phone: \"299\" },\r\n { label: \"Grenada\", code: \"GD\", phone: \"1\" },\r\n { label: \"Guadeloupe\", code: \"GP\", phone: \"590\" },\r\n { label: \"Guam\", code: \"GU\", phone: \"1\" },\r\n { label: \"Guatemala\", code: \"GT\", phone: \"502\" },\r\n { label: \"Guernsey\", code: \"GG\", phone: \"44\" },\r\n { label: \"Guinea\", code: \"GN\", phone: \"224\" },\r\n { label: \"Guinea-Bissau\", code: \"GW\", phone: \"245\" },\r\n { label: \"Guyana\", code: \"GY\", phone: \"592\" },\r\n { label: \"Haiti\", code: \"HT\", phone: \"509\" },\r\n { label: \"Heard Island and McDonald Islands\", code: \"HM\", phone: \"672\" },\r\n { label: \"Honduras\", code: \"HN\", phone: \"504\" },\r\n { label: \"Hong Kong S.A.R.\", code: \"HK\", phone: \"852\" },\r\n { label: \"Hungary\", code: \"HU\", phone: \"36\" },\r\n { label: \"Iceland\", code: \"IS\", phone: \"354\" },\r\n { label: \"India\", code: \"IN\", phone: \"91\" },\r\n { label: \"Indonesia\", code: \"ID\", phone: \"62\" },\r\n { label: \"Iran\", code: \"IR\", phone: \"98\" },\r\n { label: \"Iraq\", code: \"IQ\", phone: \"964\" },\r\n { label: \"Ireland\", code: \"IE\", phone: \"353\" },\r\n { label: \"Israel\", code: \"IL\", phone: \"972\" },\r\n { label: \"Italy\", code: \"IT\", phone: \"39\" },\r\n { label: \"Ivory Coast\", code: \"CI\", phone: \"225\" },\r\n { label: \"Jamaica\", code: \"JM\", phone: \"1\" },\r\n { label: \"Japan\", code: \"JP\", phone: \"81\" },\r\n { label: \"Jersey\", code: \"JE\", phone: \"44\" },\r\n { label: \"Jordan\", code: \"JO\", phone: \"962\" },\r\n { label: \"Kazakhstan\", code: \"KZ\", phone: \"7\" },\r\n { label: \"Kenya\", code: \"KE\", phone: \"254\" },\r\n { label: \"Kiribati\", code: \"KI\", phone: \"686\" },\r\n { label: \"Kosovo\", code: \"XK\", phone: \"383\" },\r\n { label: \"Kuwait\", code: \"KW\", phone: \"965\" },\r\n { label: \"Kyrgyzstan\", code: \"KG\", phone: \"996\" },\r\n { label: \"Laos\", code: \"LA\", phone: \"856\" },\r\n { label: \"Latvia\", code: \"LV\", phone: \"371\" },\r\n { label: \"Lebanon\", code: \"LB\", phone: \"961\" },\r\n { label: \"Lesotho\", code: \"LS\", phone: \"266\" },\r\n { label: \"Liberia\", code: \"LR\", phone: \"231\" },\r\n { label: \"Libya\", code: \"LY\", phone: \"218\" },\r\n { label: \"Liechtenstein\", code: \"LI\", phone: \"423\" },\r\n { label: \"Lithuania\", code: \"LT\", phone: \"370\" },\r\n { label: \"Luxembourg\", code: \"LU\", phone: \"352\" },\r\n { label: \"Macau S.A.R.\", code: \"MO\", phone: \"853\" },\r\n { label: \"Madagascar\", code: \"MG\", phone: \"261\" },\r\n { label: \"Malawi\", code: \"MW\", phone: \"265\" },\r\n { label: \"Malaysia\", code: \"MY\", phone: \"60\" },\r\n { label: \"Maldives\", code: \"MV\", phone: \"960\" },\r\n { label: \"Mali\", code: \"ML\", phone: \"223\" },\r\n { label: \"Malta\", code: \"MT\", phone: \"356\" },\r\n { label: \"Man (Isle of)\", code: \"IM\", phone: \"44\" },\r\n { label: \"Marshall Islands\", code: \"MH\", phone: \"692\" },\r\n { label: \"Martinique\", code: \"MQ\", phone: \"596\" },\r\n { label: \"Mauritania\", code: \"MR\", phone: \"222\" },\r\n { label: \"Mauritius\", code: \"MU\", phone: \"230\" },\r\n { label: \"Mayotte\", code: \"YT\", phone: \"262\" },\r\n { label: \"Mexico\", code: \"MX\", phone: \"52\" },\r\n { label: \"Micronesia\", code: \"FM\", phone: \"691\" },\r\n { label: \"Moldova\", code: \"MD\", phone: \"373\" },\r\n { label: \"Monaco\", code: \"MC\", phone: \"377\" },\r\n { label: \"Mongolia\", code: \"MN\", phone: \"976\" },\r\n { label: \"Montenegro\", code: \"ME\", phone: \"382\" },\r\n { label: \"Montserrat\", code: \"MS\", phone: \"1\" },\r\n { label: \"Morocco\", code: \"MA\", phone: \"212\" },\r\n { label: \"Mozambique\", code: \"MZ\", phone: \"258\" },\r\n { label: \"Myanmar\", code: \"MM\", phone: \"95\" },\r\n { label: \"Namibia\", code: \"NA\", phone: \"264\" },\r\n { label: \"Nauru\", code: \"NR\", phone: \"674\" },\r\n { label: \"Nepal\", code: \"NP\", phone: \"977\" },\r\n { label: \"Netherlands\", code: \"NL\", phone: \"31\" },\r\n { label: \"New Caledonia\", code: \"NC\", phone: \"687\" },\r\n { label: \"New Zealand\", code: \"NZ\", phone: \"64\" },\r\n { label: \"Nicaragua\", code: \"NI\", phone: \"505\" },\r\n { label: \"Niger\", code: \"NE\", phone: \"227\" },\r\n { label: \"Nigeria\", code: \"NG\", phone: \"234\" },\r\n { label: \"Niue\", code: \"NU\", phone: \"683\" },\r\n { label: \"Norfolk Island\", code: \"NF\", phone: \"672\" },\r\n { label: \"North Korea\", code: \"KP\", phone: \"850\" },\r\n { label: \"North Macedonia\", code: \"MK\", phone: \"389\" },\r\n { label: \"Northern Mariana Islands\", code: \"MP\", phone: \"1\" },\r\n { label: \"Norway\", code: \"NO\", phone: \"47\" },\r\n { label: \"Oman\", code: \"OM\", phone: \"968\" },\r\n { label: \"Pakistan\", code: \"PK\", phone: \"92\" },\r\n { label: \"Palau\", code: \"PW\", phone: \"680\" },\r\n { label: \"Palestinian Territory Occupied\", code: \"PS\", phone: \"970\" },\r\n { label: \"Panama\", code: \"PA\", phone: \"507\" },\r\n { label: \"Papua New Guinea\", code: \"PG\", phone: \"675\" },\r\n { label: \"Paraguay\", code: \"PY\", phone: \"595\" },\r\n { label: \"Peru\", code: \"PE\", phone: \"51\" },\r\n { label: \"Philippines\", code: \"PH\", phone: \"63\" },\r\n { label: \"Pitcairn Island\", code: \"PN\", phone: \"870\" },\r\n { label: \"Poland\", code: \"PL\", phone: \"48\" },\r\n { label: \"Portugal\", code: \"PT\", phone: \"351\" },\r\n { label: \"Puerto Rico\", code: \"PR\", phone: \"1\" },\r\n { label: \"Qatar\", code: \"QA\", phone: \"974\" },\r\n { label: \"Reunion\", code: \"RE\", phone: \"262\" },\r\n { label: \"Romania\", code: \"RO\", phone: \"40\" },\r\n { label: \"Russia\", code: \"RU\", phone: \"7\" },\r\n { label: \"Rwanda\", code: \"RW\", phone: \"250\" },\r\n { label: \"Saint Helena\", code: \"SH\", phone: \"290\" },\r\n { label: \"Saint Kitts and Nevis\", code: \"KN\", phone: \"1\" },\r\n { label: \"Saint Lucia\", code: \"LC\", phone: \"1\" },\r\n { label: \"Saint Pierre and Miquelon\", code: \"PM\", phone: \"508\" },\r\n { label: \"Saint Vincent and the Grenadines\", code: \"VC\", phone: \"1\" },\r\n { label: \"Saint-Barthelemy\", code: \"BL\", phone: \"590\" },\r\n { label: \"Saint-Martin (French part)\", code: \"MF\", phone: \"590\" },\r\n { label: \"Samoa\", code: \"WS\", phone: \"685\" },\r\n { label: \"San Marino\", code: \"SM\", phone: \"378\" },\r\n { label: \"Sao Tome and Principe\", code: \"ST\", phone: \"239\" },\r\n { label: \"Saudi Arabia\", code: \"SA\", phone: \"966\" },\r\n { label: \"Senegal\", code: \"SN\", phone: \"221\" },\r\n { label: \"Serbia\", code: \"RS\", phone: \"381\" },\r\n { label: \"Seychelles\", code: \"SC\", phone: \"248\" },\r\n { label: \"Sierra Leone\", code: \"SL\", phone: \"232\" },\r\n { label: \"Singapore\", code: \"SG\", phone: \"65\" },\r\n { label: \"Sint Maarten (Dutch part)\", code: \"SX\", phone: \"1721\" },\r\n { label: \"Slovakia\", code: \"SK\", phone: \"421\" },\r\n { label: \"Slovenia\", code: \"SI\", phone: \"386\" },\r\n { label: \"Solomon Islands\", code: \"SB\", phone: \"677\" },\r\n { label: \"Somalia\", code: \"SO\", phone: \"252\" },\r\n { label: \"South Africa\", code: \"ZA\", phone: \"27\" },\r\n { label: \"South Georgia\", code: \"GS\", phone: \"500\" },\r\n { label: \"South Korea\", code: \"KR\", phone: \"82\" },\r\n { label: \"South Sudan\", code: \"SS\", phone: \"211\" },\r\n { label: \"Spain\", code: \"ES\", phone: \"34\" },\r\n { label: \"Sri Lanka\", code: \"LK\", phone: \"94\" },\r\n { label: \"Sudan\", code: \"SD\", phone: \"249\" },\r\n { label: \"Suriname\", code: \"SR\", phone: \"597\" },\r\n { label: \"Svalbard and Jan Mayen Islands\", code: \"SJ\", phone: \"47\" },\r\n { label: \"Sweden\", code: \"SE\", phone: \"46\" },\r\n { label: \"Switzerland\", code: \"CH\", phone: \"41\" },\r\n { label: \"Syria\", code: \"SY\", phone: \"963\" },\r\n { label: \"Taiwan\", code: \"TW\", phone: \"886\" },\r\n { label: \"Tajikistan\", code: \"TJ\", phone: \"992\" },\r\n { label: \"Tanzania\", code: \"TZ\", phone: \"255\" },\r\n { label: \"Thailand\", code: \"TH\", phone: \"66\" },\r\n { label: \"The Bahamas\", code: \"BS\", phone: \"1\" },\r\n { label: \"The Gambia\", code: \"GM\", phone: \"220\" },\r\n { label: \"Timor-Leste\", code: \"TL\", phone: \"670\" },\r\n { label: \"Togo\", code: \"TG\", phone: \"228\" },\r\n { label: \"Tokelau\", code: \"TK\", phone: \"690\" },\r\n { label: \"Tonga\", code: \"TO\", phone: \"676\" },\r\n { label: \"Trinidad and Tobago\", code: \"TT\", phone: \"1\" },\r\n { label: \"Tunisia\", code: \"TN\", phone: \"216\" },\r\n { label: \"Turkey\", code: \"TR\", phone: \"90\" },\r\n { label: \"Turkmenistan\", code: \"TM\", phone: \"993\" },\r\n { label: \"Turks and Caicos Islands\", code: \"TC\", phone: \"1\" },\r\n { label: \"Tuvalu\", code: \"TV\", phone: \"688\" },\r\n { label: \"Uganda\", code: \"UG\", phone: \"256\" },\r\n { label: \"Ukraine\", code: \"UA\", phone: \"380\" },\r\n { label: \"United Arab Emirates\", code: \"AE\", phone: \"971\" },\r\n { label: \"United Kingdom\", code: \"GB\", phone: \"44\" },\r\n { label: \"United States\", code: \"US\", phone: \"1\" },\r\n { label: \"United States Minor Outlying Islands\", code: \"UM\", phone: \"1\" },\r\n { label: \"Uruguay\", code: \"UY\", phone: \"598\" },\r\n { label: \"Uzbekistan\", code: \"UZ\", phone: \"998\" },\r\n { label: \"Vanuatu\", code: \"VU\", phone: \"678\" },\r\n { label: \"Vatican City State (Holy See)\", code: \"VA\", phone: \"379\" },\r\n { label: \"Venezuela\", code: \"VE\", phone: \"58\" },\r\n { label: \"Vietnam\", code: \"VN\", phone: \"84\" },\r\n { label: \"Virgin Islands (British)\", code: \"VG\", phone: \"1\" },\r\n { label: \"Virgin Islands (US)\", code: \"VI\", phone: \"1\" },\r\n { label: \"Wallis and Futuna Islands\", code: \"WF\", phone: \"681\" },\r\n { label: \"Western Sahara\", code: \"EH\", phone: \"212\" },\r\n { label: \"Yemen\", code: \"YE\", phone: \"967\" },\r\n { label: \"Zambia\", code: \"ZM\", phone: \"260\" },\r\n { label: \"Zimbabwe\", code: \"ZW\", phone: \"263\" },\r\n];\r\n","import React, { useState, useEffect, useRef } from \"react\";\r\nimport { countries } from \"../../../data/countries\";\r\nimport { ChevronDown, Search } from \"lucide-react\";\r\nimport InputLabel from \"./InputLabel\";\r\n\r\nexport default function PhoneInput({\r\n label = \"\",\r\n value = \"\",\r\n name = \"\",\r\n parentClass = \"\",\r\n onChange,\r\n disabled = false,\r\n required = false,\r\n placeholder = \"Phone number\",\r\n search = false,\r\n countriesList = false,\r\n defaultCountry = \"\",\r\n}) {\r\n const find_country_with_code = (value) => {\r\n return countries.find((obj) => obj.code == value);\r\n };\r\n\r\n const [selectedCountry, setSelectedCountry] = useState(\r\n find_country_with_code(defaultCountry) || countries[0],\r\n );\r\n const [fullNumber, setFullNumber] = useState(\"\");\r\n const [open, setOpen] = useState(false);\r\n const [searchTerm, setSearchTerm] = useState(\"\");\r\n const dropdownRef = useRef();\r\n\r\n // Match prefix when value starts with +code\r\n useEffect(() => {\r\n if (typeof value === \"string\" && value.startsWith(\"+\")) {\r\n const match = countries\r\n .filter((c) => value.startsWith(\"+\" + c.phone))\r\n .sort((a, b) => b.phone.length - a.phone.length)[0];\r\n if (match) {\r\n setSelectedCountry(match);\r\n setFullNumber(value.replace(\"+\" + match.phone, \"\"));\r\n return;\r\n }\r\n }\r\n setFullNumber(value);\r\n }, [value]);\r\n\r\n const handleNumberChange = (e) => {\r\n const input = e.target.value.replace(/\\D/g, \"\");\r\n setFullNumber(input);\r\n if (selectedCountry && onChange) {\r\n onChange(\"+\" + selectedCountry.phone + input);\r\n }\r\n };\r\n\r\n const handleCountrySelect = (country) => {\r\n setSelectedCountry(country);\r\n if (onChange) onChange(\"+\" + country.phone + fullNumber);\r\n setOpen(false);\r\n setSearchTerm(\"\");\r\n };\r\n\r\n // 🖱️ Close dropdown on outside click\r\n useEffect(() => {\r\n const handleClickOutside = (e) => {\r\n if (dropdownRef.current && !dropdownRef.current.contains(e.target))\r\n setOpen(false);\r\n };\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, []);\r\n\r\n const filteredCountries = countries.filter(\r\n (c) =>\r\n c.label.toLowerCase().includes(searchTerm.toLowerCase()) ||\r\n c.phone.includes(searchTerm),\r\n );\r\n\r\n if (!countriesList) {\r\n const handleInputChange = (e) => {\r\n const input = e.target.value.replace(/[^+\\d]/g, \"\");\r\n const formatted = input.startsWith(\"+\")\r\n ? \"+\" + input.replace(/[+]/g, \"\").slice(0)\r\n : input;\r\n onChange(formatted);\r\n };\r\n\r\n return (\r\n <>\r\n <div key={name} className={parentClass || \"col-span-12\"}>\r\n <InputLabel label={label} required={required} />\r\n <input\r\n type=\"text\"\r\n value={value}\r\n onChange={handleInputChange}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n required={required}\r\n className=\"w-full h-10 px-3 text-sm border border-gray-300 dark:border-gray-600 rounded-md \r\n bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:outline-none \r\n focus:ring-1 focus:ring-blue-300 dark:focus:ring-blue-200\"\r\n inputMode=\"tel\"\r\n pattern=\"^\\+\\d{1,15}$\"\r\n />\r\n </div>\r\n </>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <div key={name} className={parentClass || \"col-span-12\"}>\r\n <InputLabel label={label} required={required} />\r\n <div className=\"relative \" ref={dropdownRef}>\r\n {/* Input container */}\r\n <div\r\n className={`h-[40px] flex items-center border rounded-md px-2 bg-white dark:bg-gray-700 transition-all\r\n ${\r\n open\r\n ? \"ring-0.5 ring-blue-100 border-blue-300\"\r\n : \"border-gray-300 dark:border-gray-600\"\r\n }\r\n ${disabled ? \"opacity-60 cursor-not-allowed\" : \"\"}`}\r\n >\r\n {/* Flag & dropdown */}\r\n <button\r\n type=\"button\"\r\n disabled={disabled}\r\n onClick={() => setOpen(!open)}\r\n className=\"flex items-center gap-1 pr-2 border-r border-gray-300 dark:border-gray-700 focus:outline-none\"\r\n >\r\n {selectedCountry ? (\r\n <img\r\n src={`https://flagcdn.com/w20/${selectedCountry.code.toLowerCase()}.png`}\r\n alt={selectedCountry.code}\r\n className=\"w-5 h-3 object-cover\"\r\n />\r\n ) : (\r\n <span className=\"text-gray-400 text-xs\">🌐</span>\r\n )}\r\n <ChevronDown className=\"w-3 h-3 text-gray-500\" />\r\n </button>\r\n\r\n {/* Country code */}\r\n {selectedCountry && (\r\n <span className=\"ml-2 text-sm text-gray-700 dark:text-gray-200 whitespace-nowrap\">\r\n +{selectedCountry.phone}\r\n </span>\r\n )}\r\n\r\n {/* Number input */}\r\n <input\r\n type=\"tel\"\r\n value={fullNumber}\r\n onChange={handleNumberChange}\r\n required={required}\r\n disabled={disabled || !selectedCountry}\r\n placeholder={!selectedCountry ? \"Select a country\" : placeholder}\r\n className=\"flex-1 ml-2 bg-transparent outline-none text-sm text-gray-800 dark:text-gray-100 placeholder-gray-400\"\r\n />\r\n\r\n {/* Hidden input for native browser validation */}\r\n <input\r\n type=\"tel\"\r\n required={required}\r\n tabIndex={-1}\r\n readOnly\r\n value={\r\n selectedCountry && fullNumber\r\n ? \"+\" + selectedCountry.phone + fullNumber\r\n : \"\"\r\n }\r\n style={{\r\n position: \"absolute\",\r\n opacity: 0,\r\n pointerEvents: \"none\",\r\n height: 0,\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Dropdown */}\r\n {open && (\r\n <div className=\"absolute top-full left-0 w-full mt-1 border border-gray-300 dark:border-gray-700 rounded-md bg-white dark:bg-gray-700 shadow-lg z-50 max-h-60 overflow-y-auto\">\r\n {search && (\r\n <div className=\"p-2 border-b border-gray-200 dark:border-gray-700\">\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-gray-400\" />\r\n <input\r\n type=\"text\"\r\n value={searchTerm}\r\n onChange={(e) => setSearchTerm(e.target.value)}\r\n placeholder=\"Search country...\"\r\n className=\"w-full pl-9 pr-3 py-2 text-sm border rounded-md bg-white dark:bg-gray-800 dark:text-white placeholder-gray-500 dark:placeholder-gray-400 focus:outline-none \"\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {filteredCountries.map((c) => (\r\n <button\r\n key={c.code}\r\n type=\"button\"\r\n onClick={() => handleCountrySelect(c)}\r\n className=\"w-full flex items-center gap-2 px-2 py-1 text-sm hover:bg-blue-50 dark:hover:bg-gray-700 text-gray-800 dark:text-gray-100\"\r\n >\r\n <img\r\n src={`https://flagcdn.com/w20/${c.code.toLowerCase()}.png`}\r\n alt={c.code}\r\n className=\"w-5 h-3 object-cover\"\r\n />\r\n <span>\r\n {c.label} (+{c.phone})\r\n </span>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n","import React, { useState } from \"react\";\r\nimport InputLabel from \"./InputLabel\";\r\n\r\nconst TextArea = React.forwardRef(\r\n ({ className = \"\", label, required, ...props }, ref) => {\r\n const combinedClassName = `\r\n placeholder-gray-400 dark:placeholder-gray-400\r\n ${className}\r\n `.trim();\r\n\r\n return (\r\n <>\r\n <div key={props.name} className={props.parentClass || \"col-span-12\"}>\r\n <InputLabel label={label} required={required} />\r\n <div className=\"relative\">\r\n <textarea\r\n className={combinedClassName}\r\n ref={ref}\r\n required={required}\r\n {...props}\r\n />\r\n </div>\r\n </div>\r\n </>\r\n );\r\n },\r\n);\r\n\r\nTextArea.displayName = \"TextArea\";\r\n\r\nexport { TextArea };\r\n","import { Icon } from \"@iconify/react\";\r\nimport React, { useState, useEffect, useRef } from \"react\";\r\nimport InputLabel from \"./InputLabel\";\r\nimport Button from \"../../Button/Button\";\r\n\r\nconst ImagePicker = ({\r\n label = \"\",\r\n value = null,\r\n onChange,\r\n required = false,\r\n accept = \"image/*\",\r\n id,\r\n dragDrop = false,\r\n name = \"\",\r\n parentClass = \"\",\r\n}) => {\r\n const [image, setImage] = useState(value);\r\n const [isDragging, setIsDragging] = useState(false);\r\n const inputRef = useRef(null);\r\n\r\n useEffect(() => {\r\n if (value instanceof File) {\r\n setImage({ file: value, preview: URL.createObjectURL(value) });\r\n } else if (value?.preview) {\r\n setImage(value);\r\n } else {\r\n setImage(value);\r\n }\r\n\r\n // Cleanup function\r\n return () => {\r\n if (image?.preview && image.preview.startsWith(\"blob:\")) {\r\n URL.revokeObjectURL(image.preview);\r\n }\r\n };\r\n }, [value]);\r\n\r\n const handleFileChange = (files) => {\r\n if (!files || files.length === 0) {\r\n return;\r\n }\r\n\r\n const file = files[0];\r\n const preview = URL.createObjectURL(file);\r\n const imgObj = { file, preview };\r\n\r\n // Cleanup previous preview\r\n if (image?.preview && image.preview.startsWith(\"blob:\")) {\r\n URL.revokeObjectURL(image.preview);\r\n }\r\n\r\n setImage(imgObj);\r\n onChange?.(file);\r\n };\r\n\r\n const removeImage = (e) => {\r\n if (e) {\r\n e.stopPropagation(); // Prevent triggering the parent click\r\n }\r\n\r\n // Cleanup preview\r\n if (image?.preview && image.preview.startsWith(\"blob:\")) {\r\n URL.revokeObjectURL(image.preview);\r\n }\r\n\r\n setImage(null);\r\n onChange?.(null);\r\n\r\n // Reset input value\r\n if (inputRef.current) {\r\n inputRef.current.value = \"\";\r\n }\r\n };\r\n\r\n // Drag events\r\n const handleDragOver = (e) => {\r\n if (!dragDrop) return;\r\n e.preventDefault();\r\n setIsDragging(true);\r\n };\r\n\r\n const handleDragLeave = (e) => {\r\n if (!dragDrop) return;\r\n e.preventDefault();\r\n setIsDragging(false);\r\n };\r\n\r\n const handleDrop = (e) => {\r\n if (!dragDrop) return;\r\n e.preventDefault();\r\n setIsDragging(false);\r\n handleFileChange(e.dataTransfer.files);\r\n };\r\n\r\n const handleButtonClick = () => {\r\n inputRef.current.click();\r\n };\r\n\r\n return (\r\n <>\r\n <div key={name} className={parentClass || \"col-span-12\"}>\r\n <InputLabel label={label} required={required} />\r\n <div\r\n className={`relative rounded-md p-2 transition-all ${\r\n isDragging\r\n ? \"border-2 border-dashed border-blue-500 bg-blue-50 dark:bg-blue-900/20\"\r\n : \"border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800\"\r\n }`}\r\n onDragOver={handleDragOver}\r\n onDragLeave={handleDragLeave}\r\n onDrop={handleDrop}\r\n >\r\n {/* Hidden file input */}\r\n <input\r\n ref={inputRef}\r\n id={id}\r\n type=\"file\"\r\n accept={accept}\r\n onChange={(e) => handleFileChange(e.target.files)}\r\n required={required && !image}\r\n className=\"absolute opacity-0 right-[50%] top-[80%] -translate-y-1/2 pointer-events-none h-[10px]\"\r\n />\r\n\r\n {/* Content */}\r\n <div\r\n className={`flex items-center space-x-4 transition-all ${\r\n isDragging ? \"opacity-50\" : \"\"\r\n }`}\r\n >\r\n {image ? (\r\n // Image preview with close button\r\n <div className=\"relative group\">\r\n <img\r\n src={image.preview || image}\r\n alt=\"preview\"\r\n className=\"object-cover w-20 h-20 rounded-full shadow-md\"\r\n />\r\n {/* Close button */}\r\n {!required && (\r\n <button\r\n type=\"button\"\r\n onClick={removeImage}\r\n className=\"absolute top-0 -right-2 bg-red-500 text-white rounded-full p-1 shadow-lg hover:bg-red-600 transition-colors focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2\"\r\n aria-label=\"Remove image\"\r\n >\r\n <Icon icon=\"mdi:close\" className=\"w-3 h-3\" />\r\n </button>\r\n )}\r\n </div>\r\n ) : (\r\n // Placeholder icon\r\n <div className=\"rounded-full bg-gray-100 dark:bg-gray-700 h-20 w-20 flex items-center justify-center\">\r\n <Icon\r\n icon=\"ri:image-add-fill\"\r\n className=\"text-gray-400 w-10 h-10\"\r\n />\r\n </div>\r\n )}\r\n\r\n <div className=\"flex flex-col items-center space-y-1\">\r\n <Button\r\n type=\"button\"\r\n onClick={handleButtonClick}\r\n variant=\"outlined\"\r\n color=\"default\"\r\n >\r\n {image ? \"Change Image\" : \"Select Image\"}\r\n </Button>\r\n\r\n {/* Optional drag & drop hint */}\r\n {dragDrop && !image && (\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\r\n or drag and drop\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Drag overlay text */}\r\n {dragDrop && isDragging && (\r\n <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none bg-blue-500/10 rounded-md\">\r\n <span className=\"text-blue-600 dark:text-blue-400 font-semibold text-lg\">\r\n Drop image here\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default ImagePicker;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { Icon } from \"@iconify/react\";\r\nimport InputLabel from \"./InputLabel\";\r\n\r\nconst Input = React.forwardRef(\r\n (\r\n {\r\n label,\r\n required,\r\n parentClass = \"\",\r\n className = \"\",\r\n type = \"text\",\r\n onKeyDown,\r\n negativeNumberAllow = true,\r\n defaultValue = \"\",\r\n field = {},\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n const [showPassword, setShowPassword] = useState(false);\r\n\r\n const handleKeyDown = (e) => {\r\n if (type === \"number\") {\r\n const blockedKeys = [\"e\", \"E\", \"+\"];\r\n\r\n // Block e, E, +\r\n if (blockedKeys.includes(e.key)) {\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n // Block negative sign if not allowed\r\n if (negativeNumberAllow == false && e.key === \"-\") {\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n // Block arrow up/down from changing value\r\n if ([\"ArrowUp\", \"ArrowDown\"].includes(e.key)) {\r\n e.preventDefault();\r\n return;\r\n }\r\n }\r\n\r\n onKeyDown?.(e);\r\n };\r\n\r\n const combinedClassName = `\r\n h-10 placeholder-gray-400 dark:placeholder-gray-400\r\n ${type === \"password\" ? \"pr-10\" : \"\"}\r\n ${type === \"number\" ? \"no-spinner\" : \"\"}\r\n ${className}\r\n `.trim();\r\n\r\n useEffect(() => {\r\n if (defaultValue) {\r\n let value = props.value || defaultValue;\r\n setTimeout(() => {\r\n props.onChange?.({ target: { value: value } });\r\n }, 100);\r\n }\r\n }, [defaultValue]);\r\n\r\n return (\r\n <>\r\n <div key={props.name} className={parentClass || \"col-span-12\"}>\r\n <InputLabel\r\n label={label}\r\n required={required}\r\n infoText={field.infoText}\r\n />\r\n <div className=\"relative\">\r\n <input\r\n type={type === \"password\" && showPassword ? \"text\" : type}\r\n ref={ref}\r\n required={required}\r\n onKeyDown={handleKeyDown}\r\n className={combinedClassName}\r\n {...props}\r\n />\r\n\r\n {type === \"password\" && (\r\n <button\r\n type=\"button\"\r\n tabIndex={-1}\r\n onClick={() => setShowPassword((prev) => !prev)}\r\n className=\"absolute inset-y-0 right-3 flex items-center text-gray-400 hover:text-gray-600 dark:text-gray-400 dark:hover:text-gray-200\"\r\n >\r\n <Icon\r\n icon={\r\n showPassword ? \"mdi:eye-outline\" : \"mdi:eye-off-outline\"\r\n }\r\n className=\"w-5 h-5\"\r\n />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </>\r\n );\r\n },\r\n);\r\n\r\nInput.displayName = \"Input\";\r\n\r\nexport { Input };\r\n","import React from \"react\";\r\nimport { Editor } from \"@tinymce/tinymce-react\";\r\nimport InputLabel from \"./InputLabel\";\r\n\r\nconst TinyEditor = ({\r\n key,\r\n editorKey = \"\",\r\n value = \"\",\r\n onChange,\r\n label = \"\",\r\n required = false,\r\n placeholder = \"\",\r\n parentClass = \"col-span-12\",\r\n height = 400,\r\n inline = false,\r\n disabled = false,\r\n plugins,\r\n toolbar,\r\n menubar = false,\r\n fontFamily = \"Inter, sans-serif\",\r\n initConfig = {},\r\n imageUploadHandler, // ✅ Promise function passed from parent\r\n}) => {\r\n const defaultPlugins = [\r\n \"advlist\",\r\n \"autolink\",\r\n \"lists\",\r\n \"link\",\r\n \"image\",\r\n \"charmap\",\r\n \"preview\",\r\n \"anchor\",\r\n \"searchreplace\",\r\n \"visualblocks\",\r\n \"code\",\r\n \"fullscreen\",\r\n \"insertdatetime\",\r\n \"media\",\r\n \"table\",\r\n \"help\",\r\n \"wordcount\",\r\n ];\r\n\r\n const defaultToolbar =\r\n \"undo redo | blocks | bold italic underline forecolor backcolor | \" +\r\n \"alignleft aligncenter alignright alignjustify | \" +\r\n \"bullist numlist outdent indent | link image media table | \" +\r\n \"removeformat | code fullscreen preview\";\r\n\r\n // ✅ Handle Image Upload via Promise\r\n const handleImageUpload = (blobInfo) => {\r\n return new Promise((resolve, reject) => {\r\n if (!imageUploadHandler) {\r\n // fallback to base64 if no handler provided\r\n resolve(`data:${blobInfo.blob().type};base64,${blobInfo.base64()}`);\r\n return;\r\n }\r\n\r\n imageUploadHandler(blobInfo)\r\n .then((url) => {\r\n if (!url) {\r\n reject(\"Upload failed: No URL returned\");\r\n } else {\r\n resolve(url);\r\n }\r\n })\r\n .catch((error) => {\r\n reject(\r\n typeof error === \"string\"\r\n ? error\r\n : error?.message || \"Image upload failed\",\r\n );\r\n });\r\n });\r\n };\r\n\r\n return (\r\n <div key={key} className={parentClass}>\r\n {label && <InputLabel label={label} required={required} />}\r\n\r\n <Editor\r\n apiKey={editorKey}\r\n value={value}\r\n disabled={disabled}\r\n init={{\r\n height,\r\n inline,\r\n menubar,\r\n branding: false,\r\n statusbar: true,\r\n automatic_uploads: true,\r\n images_upload_handler: handleImageUpload,\r\n plugins: plugins ?? defaultPlugins,\r\n toolbar: toolbar ?? defaultToolbar,\r\n placeholder,\r\n content_style: `\r\n body {\r\n font-family: ${fontFamily};\r\n }\r\n `,\r\n ...initConfig,\r\n }}\r\n onEditorChange={(content) => {\r\n if (onChange) {\r\n onChange(content);\r\n }\r\n }}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default TinyEditor;\r\n","import React from \"react\";\r\nimport InputLabel from \"./InputLabel\";\r\n\r\nconst Checkbox = ({\r\n name = \"\",\r\n label = \"\", // label for single checkbox\r\n options = [], // array of { label, value } for multiple\r\n value = null, // boolean for single, array for multiple, or string for single select\r\n onChange,\r\n disabled = false,\r\n required = false,\r\n parentClass = \"col-span-12\",\r\n className = \"\",\r\n multiSelect = false, // ✅ if true, only one option can be selected (like radio)\r\n}) => {\r\n // Detect if multiple options are present\r\n const multiple = Array.isArray(options) && options.length > 0;\r\n\r\n // Check if a value is selected\r\n const isChecked = (optionValue) => {\r\n if (multiple) {\r\n if (!multiSelect) return value === optionValue;\r\n return Array.isArray(value) && value.includes(optionValue);\r\n }\r\n return Boolean(value);\r\n };\r\n\r\n // Handle change for single checkbox\r\n const handleSingleChange = (e) => {\r\n onChange?.(e.target.checked, name);\r\n };\r\n\r\n // Handle change for multiple checkboxes\r\n const handleMultipleChange = (optionValue, checked) => {\r\n if (!onChange) return;\r\n\r\n if (!multiSelect) {\r\n if (checked) {\r\n onChange(optionValue, name);\r\n } else {\r\n onChange(\"\", name);\r\n }\r\n // Only allow one selected\r\n } else {\r\n const newValue = Array.isArray(value) ? [...value] : [];\r\n if (checked) {\r\n if (!newValue.includes(optionValue)) newValue.push(optionValue);\r\n } else {\r\n const index = newValue.indexOf(optionValue);\r\n if (index > -1) newValue.splice(index, 1);\r\n }\r\n onChange(newValue, name);\r\n }\r\n };\r\n\r\n // ---------------- JSX ----------------\r\n if (multiple) {\r\n // Multiple options\r\n return (\r\n <>\r\n <div className={`${parentClass}`}>\r\n <InputLabel label={label} required={required} />\r\n <div className={`flex flex-col space-y-2`}>\r\n {options.map((opt, idx) => (\r\n <div key={opt.value || opt.label} className=\"flex items-center\">\r\n <input\r\n type=\"checkbox\"\r\n name={name}\r\n value={opt.value}\r\n checked={isChecked(opt.value)}\r\n disabled={disabled || opt.disabled}\r\n required={required && idx === 0}\r\n onChange={(e) =>\r\n handleMultipleChange(opt.value, e.target.checked)\r\n }\r\n key={name}\r\n className={`h-4 w-4 cursor-pointer text-blue-600 border-gray-300 rounded focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-400 ${className}`}\r\n />\r\n {opt.label && (\r\n <label\r\n htmlFor={name}\r\n className=\"ml-2 text-sm text-gray-700 dark:text-gray-200 select-none\"\r\n >\r\n {opt.label}\r\n </label>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </>\r\n );\r\n }\r\n\r\n // Single checkbox\r\n return (\r\n <div className={`flex items-center ${parentClass}`}>\r\n <input\r\n type=\"checkbox\"\r\n name={name}\r\n checked={isChecked()}\r\n disabled={disabled}\r\n required={required}\r\n onChange={handleSingleChange}\r\n className={`h-4 w-4 text-blue-600 cursor-pointer border-gray-300 rounded focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-400 ${className}`}\r\n />\r\n {label && (\r\n <label\r\n htmlFor={name}\r\n className=\"ml-2 text-sm text-gray-700 dark:text-gray-200 select-none\"\r\n >\r\n {label}\r\n </label>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default Checkbox;\r\n","import { Icon } from \"@iconify/react\";\r\nimport React, { useState, useEffect, useRef } from \"react\";\r\nimport InputLabel from \"./InputLabel\";\r\nimport Button from \"../../Button/Button\";\r\n\r\nconst AudioPicker = ({\r\n label = \"\",\r\n value = null,\r\n onChange,\r\n required = false,\r\n accept = \"audio/*\",\r\n id,\r\n dragDrop = false,\r\n name = \"\",\r\n parentClass = \"\",\r\n}) => {\r\n const [audio, setAudio] = useState(null);\r\n const [isDragging, setIsDragging] = useState(false);\r\n const inputRef = useRef(null);\r\n\r\n // Sync external value\r\n useEffect(() => {\r\n if (!value) {\r\n cleanupAudio();\r\n setAudio(null);\r\n return;\r\n }\r\n\r\n if (value instanceof File) {\r\n const preview = URL.createObjectURL(value);\r\n setAudio({ file: value, preview });\r\n\r\n return () => {\r\n URL.revokeObjectURL(preview);\r\n };\r\n } else if (typeof value === \"string\") {\r\n setAudio({ preview: value });\r\n } else if (value?.preview) {\r\n setAudio(value);\r\n }\r\n }, [value]);\r\n\r\n // Cleanup function\r\n const cleanupAudio = () => {\r\n if (audio?.preview && audio.preview.startsWith(\"blob:\")) {\r\n URL.revokeObjectURL(audio.preview);\r\n }\r\n };\r\n\r\n const handleFileChange = (files) => {\r\n if (!files || files.length === 0) {\r\n return;\r\n }\r\n\r\n const file = files[0];\r\n const preview = URL.createObjectURL(file);\r\n\r\n // Cleanup previous preview\r\n cleanupAudio();\r\n setAudio({ file, preview });\r\n onChange?.(file);\r\n };\r\n\r\n const removeAudio = (e) => {\r\n if (e) {\r\n e.stopPropagation();\r\n }\r\n\r\n cleanupAudio();\r\n setAudio(null);\r\n onChange?.(null);\r\n\r\n // Reset input value\r\n if (inputRef.current) {\r\n inputRef.current.value = \"\";\r\n }\r\n };\r\n\r\n // Drag events\r\n const handleDragOver = (e) => {\r\n if (!dragDrop) return;\r\n e.preventDefault();\r\n setIsDragging(true);\r\n };\r\n\r\n const handleDragLeave = (e) => {\r\n if (!dragDrop) return;\r\n e.preventDefault();\r\n setIsDragging(false);\r\n };\r\n\r\n const handleDrop = (e) => {\r\n if (!dragDrop) return;\r\n e.preventDefault();\r\n setIsDragging(false);\r\n handleFileChange(e.dataTransfer.files);\r\n };\r\n\r\n const handleButtonClick = () => {\r\n inputRef.current.click();\r\n };\r\n\r\n return (\r\n <div key={name} className={parentClass || \"col-span-12\"}>\r\n <InputLabel label={label} required={required} />\r\n\r\n <div\r\n className={`relative rounded-lg p-2 transition-all ${\r\n isDragging\r\n ? \"border-2 border-dashed border-blue-500 bg-blue-50 dark:bg-blue-900/20\"\r\n : \"border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800\"\r\n }`}\r\n onDragOver={handleDragOver}\r\n onDragLeave={handleDragLeave}\r\n onDrop={handleDrop}\r\n >\r\n {/* Hidden file input */}\r\n <input\r\n ref={inputRef}\r\n id={id}\r\n type=\"file\"\r\n accept={accept}\r\n onChange={(e) => handleFileChange(e.target.files)}\r\n required={required && !audio}\r\n className=\"absolute opacity-0 right-[50%] top-[80%] -translate-y-1/2 pointer-events-none h-[10px]\"\r\n />\r\n\r\n {/* Content */}\r\n <div\r\n className={`flex items-center space-x-4 transition-all ${\r\n isDragging ? \"opacity-50\" : \"\"\r\n }`}\r\n >\r\n {audio ? (\r\n // Audio player with close button and change button\r\n <div className=\"flex items-center space-x-4\">\r\n {/* Close button */}\r\n <div className=\"relative w-full\">\r\n {!required && (\r\n <button\r\n type=\"button\"\r\n onClick={removeAudio}\r\n className=\"absolute top-0 -right-2 bg-red-500 text-white rounded-full p-1 shadow-lg hover:bg-red-600 transition-colors z-10 focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2 dark:focus:ring-offset-gray-800\"\r\n aria-label=\"Remove audio\"\r\n >\r\n <Icon icon=\"mdi:close\" className=\"w-3 h-3\" />\r\n </button>\r\n )}\r\n\r\n {/* Audio player */}\r\n <audio\r\n key={audio.preview}\r\n src={audio.preview}\r\n controls\r\n controlsList=\"nodownload\"\r\n />\r\n </div>\r\n <Button type=\"button\" onClick={handleButtonClick}>\r\n <span>Change Audio File</span>\r\n </Button>\r\n </div>\r\n ) : (\r\n // Empty state with upload button\r\n <div className=\"flex items-center justify-center space-x-4\">\r\n <div className=\"rounded-full bg-gray-100 dark:bg-gray-700 h-20 w-20 flex items-center justify-center\">\r\n <Icon icon=\"mdi:music\" className=\"text-gray-400 w-10 h-10\" />\r\n </div>\r\n\r\n <Button\r\n type=\"button\"\r\n onClick={handleButtonClick}\r\n variant=\"outlined\"\r\n >\r\n <span>Choose Audio File</span>\r\n </Button>\r\n\r\n {/* Drag & drop hint */}\r\n {dragDrop && (\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\r\n or drag and drop your audio file here\r\n </p>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Drag overlay */}\r\n {dragDrop && isDragging && !audio && (\r\n <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none bg-blue-500/10 rounded-lg\">\r\n <span className=\"text-blue-600 dark:text-blue-400 font-semibold text-lg bg-white dark:bg-gray-800 px-4 py-2 rounded-lg shadow-lg\">\r\n Drop audio here\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default AudioPicker;\r\n","import React from \"react\";\r\nimport Select from \"./Select\";\r\nimport Switch from \"./Switch\";\r\nimport PhoneInput from \"./PhoneInput\";\r\nimport { TextArea } from \"./TextArea\";\r\nimport ImagePicker from \"./ImagePicker\";\r\nimport { Input } from \"./Input\";\r\nimport TinyEditor from \"./TinyEditor\";\r\nimport Checkbox from \"./Checkbox\";\r\nimport AudioPicker from \"./AudioPicker\";\r\n\r\nconst RenderFields = ({ field, formData, handleChange }) => {\r\n const {\r\n key,\r\n label,\r\n type,\r\n options,\r\n placeholder,\r\n rows,\r\n inputClass,\r\n search,\r\n accept,\r\n text,\r\n required = false,\r\n minLength,\r\n dragDrop,\r\n parentClass,\r\n countriesList,\r\n defaultCountry,\r\n multiple,\r\n dropdownMaxHeight,\r\n editorKey,\r\n fontFamily,\r\n disabled,\r\n negativeNumberAllow,\r\n defaultValue,\r\n renderCondition,\r\n optionDependencyKey,\r\n pattern,\r\n } = field;\r\n\r\n let value = formData?.[key];\r\n if (value === undefined || value === null) {\r\n value = \"\";\r\n }\r\n\r\n const finalPlaceholder =\r\n placeholder || (type === \"select\" ? `Select ${label}` : `Enter ${label}`);\r\n\r\n const baseClass =\r\n \"w-full px-3 py-2 rounded-md border border-gray-300 dark:border-gray-600 text-sm focus:outline-none focus:ring-1 focus:ring-blue-200 bg-white text-black dark:bg-gray-700 dark:text-white\";\r\n\r\n if (renderCondition && typeof renderCondition === \"function\") {\r\n const shouldRender = renderCondition(formData);\r\n if (!shouldRender) {\r\n return null;\r\n }\r\n }\r\n\r\n switch (type) {\r\n case \"select\":\r\n return (\r\n <Select\r\n options={options || []}\r\n value={value}\r\n formData={formData}\r\n dependencyKey={optionDependencyKey}\r\n onChange={(val) => handleChange(key, val)}\r\n placeholder={finalPlaceholder}\r\n className={inputClass || \"\"}\r\n search={search}\r\n required={required}\r\n defaultValue={defaultValue}\r\n label={label}\r\n name={key}\r\n disabled={disabled}\r\n parentClass={parentClass}\r\n multiple={multiple}\r\n dropdownMaxHeight={dropdownMaxHeight}\r\n />\r\n );\r\n\r\n case \"checkbox\":\r\n return (\r\n <Checkbox\r\n name={key}\r\n label={label}\r\n options={options || []}\r\n value={value}\r\n onChange={(val) => handleChange(key, val)}\r\n required={required}\r\n parentClass={parentClass}\r\n className={inputClass || \"\"}\r\n multiSelect={multiple}\r\n disabled={disabled}\r\n />\r\n );\r\n\r\n case \"switch\":\r\n return (\r\n <Switch\r\n value={value}\r\n onChange={(val) => handleChange(key, val)}\r\n text={text}\r\n options={options || []}\r\n label={label}\r\n required={required}\r\n name={key}\r\n disabled={disabled}\r\n parentClass={parentClass}\r\n />\r\n );\r\n\r\n case \"phone\":\r\n return (\r\n <PhoneInput\r\n value={value}\r\n onChange={(val) => handleChange(key, val)}\r\n countriesList={countriesList}\r\n defaultCountry={defaultCountry}\r\n required={required}\r\n placeholder={finalPlaceholder}\r\n search={search}\r\n label={label}\r\n name={key}\r\n disabled={disabled}\r\n parentClass={parentClass}\r\n />\r\n );\r\n\r\n case \"textarea\":\r\n return (\r\n <TextArea\r\n value={value}\r\n onChange={(e) => handleChange(key, e.target.value)}\r\n placeholder={finalPlaceholder}\r\n rows={rows || 3}\r\n className={`${baseClass} ${inputClass || \"\"}`}\r\n required={required}\r\n name={key}\r\n label={label}\r\n disabled={disabled}\r\n parentClass={parentClass}\r\n />\r\n );\r\n\r\n case \"image\":\r\n return (\r\n <ImagePicker\r\n value={value}\r\n onChange={(imgObj) => handleChange(key, imgObj)}\r\n required={required}\r\n accept={accept || \"image/*\"}\r\n id={`file-${key}`}\r\n dragDrop={dragDrop}\r\n label={label}\r\n name={key}\r\n parentClass={parentClass}\r\n />\r\n );\r\n case \"audio\":\r\n return (\r\n <AudioPicker\r\n value={value}\r\n onChange={(audio) => handleChange(key, audio)}\r\n required={required}\r\n accept={accept || \"audio/*\"}\r\n id={`file-${key}`}\r\n dragDrop={dragDrop}\r\n label={label}\r\n name={key}\r\n parentClass={parentClass}\r\n />\r\n );\r\n\r\n case \"tinyEditor\":\r\n return (\r\n <TinyEditor\r\n value={value}\r\n onChange={(newValue) => handleChange(key, newValue)}\r\n required={required}\r\n key={`editor-${key}`}\r\n placeholder={finalPlaceholder}\r\n label={label}\r\n parentClass={parentClass}\r\n fontFamily={fontFamily}\r\n editorKey={editorKey}\r\n disabled={disabled}\r\n />\r\n );\r\n\r\n default:\r\n return (\r\n <Input\r\n field={field}\r\n type={type || \"text\"}\r\n defaultValue={defaultValue}\r\n value={value}\r\n onChange={(e) => handleChange(key, e.target.value)}\r\n placeholder={finalPlaceholder}\r\n className={`${baseClass} ${inputClass || \"\"}`}\r\n required={required}\r\n name={key}\r\n minLength={minLength}\r\n label={label}\r\n negativeNumberAllow={negativeNumberAllow}\r\n parentClass={parentClass}\r\n disabled={disabled}\r\n pattern={pattern}\r\n />\r\n );\r\n }\r\n};\r\n\r\nexport default RenderFields;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { X } from \"lucide-react\";\r\nimport Button from \"../Button/Button\";\r\nimport RenderFields from \"../Form/components/RenderFields\";\r\n\r\nconst FilterDrawer = ({ isOpen, onClose, config, onApply }) => {\r\n const [filters, setFilters] = useState({});\r\n const handleChange = (key, value) => {\r\n setFilters((prev) => ({ ...prev, [key]: value }));\r\n };\r\n\r\n const handleApply = () => {\r\n onApply?.(filters);\r\n onClose();\r\n };\r\n\r\n const handleReset = () => {\r\n setFilters({});\r\n onApply?.({});\r\n onClose();\r\n };\r\n\r\n return (\r\n <>\r\n {/* Overlay */}\r\n <div\r\n className={`fixed inset-0 bg-black/50 z-40 transition-opacity duration-300 ${\r\n isOpen\r\n ? \"opacity-100 pointer-events-auto\"\r\n : \"opacity-0 pointer-events-none\"\r\n }`}\r\n onClick={onClose}\r\n />\r\n\r\n {/* Drawer */}\r\n <div\r\n className={`fixed top-0 right-0 h-full w-[28rem] bg-white dark:bg-gray-900 shadow-2xl z-50 flex flex-col border-l border-gray-200 dark:border-gray-700\r\n transform transition-transform duration-300 ease-in-out\r\n ${isOpen ? \"translate-x-0\" : \"translate-x-full\"}\r\n `}\r\n >\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-gray-200 dark:border-gray-700\">\r\n <h2 className=\"text-lg font-semibold text-gray-900 dark:text-white\">\r\n Filters\r\n </h2>\r\n <button\r\n onClick={onClose}\r\n className=\"p-2 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-md transition\"\r\n >\r\n <X className=\"w-5 h-5 text-gray-500 dark:text-gray-400\" />\r\n </button>\r\n </div>\r\n\r\n {/* Content */}\r\n {isOpen && (\r\n <div className=\"flex-1 overflow-y-auto px-4 py-3\">\r\n {config?.component ? (\r\n <config.component\r\n filters={filters}\r\n onFilterChange={handleChange}\r\n />\r\n ) : (\r\n <div className=\"space-y-4\">\r\n {config?.fields?.map((field) => (\r\n <>\r\n <RenderFields\r\n key={field.key}\r\n field={field}\r\n formData={filters}\r\n handleChange={handleChange}\r\n />\r\n </>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Footer */}\r\n <div className=\"flex gap-2 px-4 py-3 border-t border-gray-200 dark:border-gray-700\">\r\n <Button\r\n onClick={handleApply}\r\n variant=\"contained\"\r\n color=\"primary\"\r\n fullWidth\r\n >\r\n Apply Filters\r\n </Button>\r\n <Button\r\n onClick={handleReset}\r\n variant=\"contained\"\r\n className=\"min-w-[150px]\"\r\n >\r\n Reset\r\n </Button>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default FilterDrawer;\r\n","import React from \"react\";\r\n\r\nconst BADGE_COLORS = {\r\n blue: {\r\n bg: \"bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300\",\r\n border:\r\n \"border border-blue-300 text-blue-700 dark:border-blue-700 dark:text-blue-300\",\r\n },\r\n teal: {\r\n bg: \"bg-teal-100 text-teal-800 dark:bg-teal-900/30 dark:text-teal-300\",\r\n border:\r\n \"border border-teal-300 text-teal-700 dark:border-teal-700 dark:text-teal-300\",\r\n },\r\n purple: {\r\n bg: \"bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300\",\r\n border:\r\n \"border border-purple-300 text-purple-700 dark:border-purple-700 dark:text-purple-300\",\r\n },\r\n yellow: {\r\n bg: \"bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-300\",\r\n border:\r\n \"border border-yellow-300 text-yellow-700 dark:border-yellow-700 dark:text-yellow-300\",\r\n },\r\n green: {\r\n bg: \"bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300\",\r\n border:\r\n \"border border-green-300 text-green-700 dark:border-green-700 dark:text-green-300\",\r\n },\r\n red: {\r\n bg: \"bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300\",\r\n border:\r\n \"border border-red-300 text-red-700 dark:border-red-700 dark:text-red-300\",\r\n },\r\n gray: {\r\n bg: \"bg-gray-100 text-gray-800 dark:bg-gray-900/30 dark:text-gray-300\",\r\n border:\r\n \"border border-gray-300 text-gray-700 dark:border-gray-700 dark:text-gray-300\",\r\n },\r\n};\r\n\r\nconst BADGE_VARIANTS = {\r\n contained: \"bg\",\r\n outline: \"border !bg-transparent\",\r\n soft: \"bg opacity-90\",\r\n};\r\n\r\nconst Chip = ({\r\n label,\r\n variant = \"contained\", // contained | outline | soft\r\n color = \"green\",\r\n className = \"\",\r\n}) => {\r\n const colorConfig = BADGE_COLORS[color] || BADGE_COLORS.green;\r\n const variantKey = BADGE_VARIANTS[variant] || BADGE_VARIANTS.contained;\r\n\r\n const variantClasses =\r\n variant === \"outline\" ? colorConfig.border : colorConfig.bg;\r\n\r\n return (\r\n <span\r\n className={`inline-flex justify-center items-center rounded-sm text-xs font-semibold px-3 py-1 min-w-[78px]\r\n ${variantClasses}\r\n ${variantKey}\r\n ${className}`}\r\n >\r\n {label}\r\n </span>\r\n );\r\n};\r\n\r\nexport default Chip;\r\n","const TableSkeleton = ({ rows = 5, columns = 5 }) => {\r\n return (\r\n <>\r\n <div className=\"w-full mb-6 inline-flex justify-end items-center\">\r\n <div className=\"h-8 w-80 bg-gray-300 dark:bg-gray-700 rounded animate-pulse\" />\r\n </div>\r\n <div className=\"overflow-hidden rounded-md border border-gray-200 dark:border-gray-800\">\r\n <table className=\"w-full border-collapse\">\r\n <thead>\r\n <tr className=\"bg-gray-50 dark:bg-gray-900\">\r\n {Array.from({ length: columns }).map((_, i) => (\r\n <th key={i} className=\"px-4 py-3\">\r\n <div className=\"h-6 w-24 bg-gray-300 dark:bg-gray-700 rounded animate-pulse inline-flex justify-center items-center\" />\r\n </th>\r\n ))}\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n {Array.from({ length: rows }).map((_, rowIndex) => (\r\n <tr\r\n key={rowIndex}\r\n className=\"border-t border-gray-200 dark:border-gray-800\"\r\n >\r\n {Array.from({ length: columns }).map((_, colIndex) => (\r\n <td key={colIndex} className=\"px-4 py-6\">\r\n <div className=\"h-6 w-full bg-gray-300 dark:bg-gray-700 rounded animate-pulse\" />\r\n </td>\r\n ))}\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default TableSkeleton;\r\n","import { useEffect } from \"react\";\r\nimport { X } from \"lucide-react\";\r\n\r\nconst ImagePreview = ({ src, alt = \"preview\", isOpen, setIsOpen }) => {\r\n const closePreview = () => setIsOpen(false);\r\n\r\n // Handle ESC key + prevent body scroll\r\n useEffect(() => {\r\n const handleEsc = (e) => {\r\n if (e.key === \"Escape\") closePreview();\r\n };\r\n\r\n if (isOpen) {\r\n document.body.style.overflow = \"hidden\";\r\n document.addEventListener(\"keydown\", handleEsc);\r\n }\r\n\r\n return () => {\r\n document.body.style.overflow = \"\";\r\n document.removeEventListener(\"keydown\", handleEsc);\r\n };\r\n }, [isOpen]);\r\n\r\n return (\r\n <>\r\n {/* Fullscreen Preview */}\r\n <div\r\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/70 dark:bg-black/80 \r\n backdrop-blur-sm animate-in fade-in duration-200\"\r\n onClick={closePreview}\r\n >\r\n {/* Close Button */}\r\n <button\r\n onClick={closePreview}\r\n className=\"absolute top-4 right-4 bg-white dark:bg-gray-800 text-gray-800 dark:text-gray-200\r\n hover:bg-gray-100 dark:hover:bg-gray-700 rounded-full p-2 shadow-lg transition\"\r\n >\r\n <X size={20} />\r\n </button>\r\n\r\n {/* Image Container */}\r\n <div\r\n className=\"max-w-5xl w-full px-4 transform transition-all duration-200 scale-95 animate-in zoom-in-95\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {/* Large Image */}\r\n <img\r\n src={src}\r\n alt={alt}\r\n className=\"w-full max-h-[90vh] object-contain rounded-xl\"\r\n />\r\n </div>\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default ImagePreview;\r\n","import React, { useState, useMemo, useRef, useEffect } from \"react\";\r\nimport {\r\n ChevronLeft,\r\n ChevronRight,\r\n Search,\r\n EllipsisVertical,\r\n Filter,\r\n User,\r\n Music,\r\n Plus,\r\n} from \"lucide-react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { formatDate, searchLocalData } from \"../../lib/utils\";\r\nimport Button from \"../Button/Button\";\r\nimport FilterDrawer from \"../Filter/FilterDrawer\";\r\nimport Chip from \"../Chip/Chip\";\r\nimport TableSkeleton from \"./components/TableSkeleton\";\r\nimport ImagePreview from \"./components/ImagePreview\";\r\n\r\nconst Table = ({\r\n config,\r\n setShowAdd,\r\n title,\r\n buttonText,\r\n description,\r\n showAddButton,\r\n}) => {\r\n const {\r\n data = [],\r\n table_head = [],\r\n loading = false,\r\n search = {\r\n enabled: false,\r\n placeholder: \"Search...\",\r\n useServerSideSearch: false,\r\n },\r\n filter = {\r\n enabled: false,\r\n useServerSideFilters: false,\r\n },\r\n pagination = {\r\n enabled: false,\r\n rows_per_page: 10,\r\n useServerSidePagination: false,\r\n },\r\n emptyMessage = \"No data available\",\r\n onMenuAction,\r\n setServerSidePaginationData = () => {},\r\n onFilterApply,\r\n filterConfig = null,\r\n rowClick = null,\r\n } = config;\r\n\r\n const [searchTerm, setSearchTerm] = useState(\"\");\r\n const [activeMenu, setActiveMenu] = useState(null);\r\n const [menuList, setMenuList] = useState([]);\r\n const [menuPosition, setMenuPosition] = useState({});\r\n const [showFilters, setShowFilters] = useState(false);\r\n const [appliedFilters, setAppliedFilters] = useState({});\r\n\r\n // image preview\r\n const [targetImage, setTargetImage] = useState(null);\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n const filteredData = useMemo(() => {\r\n if (!search.enabled || !searchTerm.trim()) return data;\r\n if (search.useServerSideSearch) return data;\r\n return searchLocalData(data, searchTerm, search.searchKeys || []);\r\n }, [data, searchTerm, search]);\r\n\r\n const [currentPage, setCurrentPage] = useState(1);\r\n const [pageSize, setPageSize] = useState(pagination?.rows_per_page || 50);\r\n const [totalRecords, setTotalRecords] = useState(filteredData.length || 0);\r\n\r\n const totalPages = pagination?.useServerSidePagination\r\n ? pagination.total_pages\r\n : Math.ceil(filteredData.length / pageSize);\r\n\r\n const paginatedData = useMemo(() => {\r\n if (pagination.useServerSidePagination) return filteredData;\r\n const start = (currentPage - 1) * pageSize;\r\n return filteredData.slice(start, start + pageSize);\r\n }, [filteredData, currentPage, pageSize]);\r\n\r\n const menuRef = useRef(null);\r\n const buttonRefs = useRef({});\r\n const searchTimeoutRef = useRef(null);\r\n\r\n const handleSearchChange = (value) => {\r\n setSearchTerm(value);\r\n setCurrentPage(1);\r\n\r\n if (search.useServerSideSearch) {\r\n if (searchTimeoutRef.current) clearTimeout(searchTimeoutRef.current);\r\n\r\n searchTimeoutRef.current = setTimeout(async () => {\r\n try {\r\n await setServerSidePaginationData((prev) => ({\r\n ...prev,\r\n search: value,\r\n current_page: 1,\r\n }));\r\n } catch (error) {\r\n console.error(\"Search error:\", error);\r\n }\r\n }, 800);\r\n }\r\n };\r\n\r\n const handleActionClick = (action, item, e) => {\r\n e.stopPropagation();\r\n setActiveMenu(null);\r\n onMenuAction?.(action.type, item);\r\n };\r\n\r\n const handleMenuToggle = (itemId, e, menu_list) => {\r\n e.stopPropagation();\r\n setMenuList(menu_list);\r\n const button = e.currentTarget;\r\n buttonRefs.current[itemId] = button;\r\n const rect = button.getBoundingClientRect();\r\n const menuWidth = 192;\r\n const menuHeight = menu_list.length * 40;\r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n\r\n const openLeft = viewportWidth - rect.right < menuWidth;\r\n const left = openLeft ? rect.left - menuWidth + rect.width : rect.left;\r\n\r\n const openUp =\r\n viewportHeight - rect.bottom < menuHeight && rect.top > menuHeight;\r\n const top = openUp ? rect.top - menuHeight - 2 : rect.bottom + 2;\r\n\r\n setMenuPosition({\r\n top: Math.max(8, Math.min(top, viewportHeight - menuHeight - 8)),\r\n left: Math.max(8, Math.min(left, viewportWidth - menuWidth - 8)),\r\n });\r\n\r\n setActiveMenu(activeMenu === itemId ? null : itemId);\r\n };\r\n\r\n const calculateRowNumber = (index) => {\r\n return (currentPage - 1) * pageSize + index + 1;\r\n };\r\n\r\n const openPreview = (image) => {\r\n if (image && image.src instanceof File) {\r\n image = { ...image, src: URL.createObjectURL(image.src) };\r\n }\r\n setTargetImage(image);\r\n setIsOpen(true);\r\n };\r\n\r\n const renderAvatar = (\r\n imageSrc,\r\n imageAlt,\r\n className,\r\n fallback_icon = null,\r\n row = null,\r\n ) => {\r\n return (\r\n <>\r\n {imageSrc ? (\r\n <img\r\n src={\r\n imageSrc instanceof File\r\n ? URL.createObjectURL(imageSrc)\r\n : imageSrc\r\n }\r\n alt={imageAlt || \"Avatar\"}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n openPreview({ src: imageSrc, alt: imageAlt });\r\n }}\r\n className={`w-10 h-10 cursor-pointer shrink-0 rounded-full object-cover border border-gray-200 dark:border-gray-700 ${className || \"\"}`}\r\n />\r\n ) : (\r\n <>\r\n {fallback_icon ? (\r\n typeof fallback_icon === \"function\" ? (\r\n fallback_icon(row)\r\n ) : (\r\n fallback_icon\r\n )\r\n ) : (\r\n <div\r\n className={`w-10 h-10 flex items-center shrink-0 justify-center rounded-full border border-gray-300 dark:border-gray-700 bg-gray-200 dark:bg-gray-600 ${className || \"\"}`}\r\n >\r\n <User className=\"w-6 h-6 text-gray-400 dark:text-gray-400\" />\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </>\r\n );\r\n };\r\n\r\n const renderAudio = (audioSrc, className) => {\r\n return (\r\n <>\r\n {audioSrc ? (\r\n <audio\r\n key={\r\n audioSrc instanceof File\r\n ? URL.createObjectURL(audioSrc)\r\n : audioSrc\r\n }\r\n controls\r\n src={\r\n audioSrc instanceof File\r\n ? URL.createObjectURL(audioSrc)\r\n : audioSrc\r\n }\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n }}\r\n className={`w-64 cursor-pointer ${className || \"\"}`}\r\n />\r\n ) : (\r\n <>\r\n <div\r\n className={`w-12 h-12 flex items-center shrink-0 justify-center rounded-full border border-gray-300 dark:border-gray-700 bg-gray-200 dark:bg-gray-600 ${className || \"\"}`}\r\n >\r\n <Music className=\"w-6 h-6 text-gray-400 dark:text-gray-400\" />\r\n </div>\r\n </>\r\n )}\r\n </>\r\n );\r\n };\r\n\r\n const renderGroupCell = (row, col) => {\r\n return (\r\n <div className={`flex items-center space-x-4 ${col.className || \"\"}`}>\r\n {col.imageKey\r\n ? renderAvatar(\r\n row[col.imageKey],\r\n row[col.titleKey],\r\n \"group-avatar\",\r\n col.fallback_icon,\r\n row,\r\n )\r\n : \"\"}\r\n <div>\r\n <p className=\"font-medium text-gray-900 dark:text-white group-title\">\r\n {row[col.titleKey] || \"\"}\r\n </p>\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400 group-sub-title\">\r\n {row[col.subtitleKey] || \"\"}\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const handleRenderChip = (value, col) => {\r\n let label = String(value);\r\n const variant = col.variant || \"contained\";\r\n let color = col.defaultColor;\r\n\r\n if (col?.chipOptions?.length > 0) {\r\n let chipObj = col?.chipOptions.find((obj) => obj.value == value);\r\n if (chipObj) {\r\n label = chipObj.label;\r\n color = chipObj.color;\r\n }\r\n }\r\n\r\n return (\r\n <Chip\r\n label={label}\r\n variant={variant}\r\n color={color}\r\n className={col.className || \"\"}\r\n />\r\n );\r\n };\r\n\r\n const handleRenderCellValue = (col, row, index) => {\r\n const value = row[col.key];\r\n if (col.type === \"menu_actions\") {\r\n return (\r\n <div className={`text-center ${col.className || \"\"}`}>\r\n <button\r\n ref={(el) => (buttonRefs.current[row.id || row._id] = el)}\r\n onClick={(e) =>\r\n handleMenuToggle(row.id || row._id, e, col.menuList)\r\n }\r\n className=\"p-2 bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600 rounded-full transition text-gray-700 dark:text-gray-300\"\r\n >\r\n <EllipsisVertical className=\"h-4 w-4\" />\r\n </button>\r\n </div>\r\n );\r\n } else if (col.type === \"index\") {\r\n return (\r\n <span className={col.className || \"\"}>{calculateRowNumber(index)}</span>\r\n );\r\n } else if (col.type === \"group\") {\r\n return renderGroupCell(row, col);\r\n } else if (col.type === \"chip\") {\r\n return <>{handleRenderChip(value, col)}</>;\r\n } else if (col.type === \"date\") {\r\n return (\r\n <span className={col.className || \"\"}>\r\n {formatDate(value, col.format || \"DD MMM YYYY\")}\r\n </span>\r\n );\r\n } else if (col.type === \"avatar\") {\r\n return (\r\n <>\r\n <div className=\"min-w-[40px]\">\r\n {renderAvatar(\r\n value,\r\n col.alt,\r\n col.className,\r\n col.fallback_icon,\r\n row,\r\n )}\r\n </div>\r\n </>\r\n );\r\n } else if (col.type === \"audio\") {\r\n return <>{renderAudio(value, col.className)}</>;\r\n } else {\r\n return <span className={col.className || \"\"}>{value || \"N/A\"}</span>;\r\n }\r\n };\r\n\r\n // handle CLick\r\n const handleRowClick = (row) => {\r\n if (typeof rowClick === \"function\") {\r\n return rowClick(row);\r\n }\r\n if (rowClick) {\r\n return onMenuAction?.(\"view\", row);\r\n }\r\n };\r\n\r\n const handleColumnClick = (col, row) => {\r\n if (col.onClickDetails) {\r\n return onMenuAction?.(\"view\", row);\r\n }\r\n\r\n if (typeof col.handleClick === \"function\") {\r\n return col.handleClick(row);\r\n }\r\n };\r\n\r\n // Helper to check if row is clickable\r\n const isRowClickable = () => rowClick || typeof rowClick === \"function\";\r\n // Helper to check if column is clickable\r\n const isColumnClickable = (col) =>\r\n col.onClickDetails || typeof col.handleClick === \"function\";\r\n\r\n // Close menu on scroll -------------------\r\n useEffect(() => {\r\n const handleScroll = () => {\r\n if (activeMenu) setActiveMenu(null);\r\n };\r\n\r\n window.addEventListener(\"scroll\", handleScroll, true);\r\n return () => {\r\n window.removeEventListener(\"scroll\", handleScroll, true);\r\n };\r\n }, [activeMenu]);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (e) => {\r\n if (menuRef.current && !menuRef.current.contains(e.target)) {\r\n setActiveMenu(null);\r\n }\r\n };\r\n document.addEventListener(\"click\", handleClickOutside);\r\n return () => document.removeEventListener(\"click\", handleClickOutside);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (pagination?.rows_per_page && pagination?.useServerSidePagination) {\r\n setPageSize(pagination?.rows_per_page || 50);\r\n }\r\n\r\n if (pagination.current_page) {\r\n setCurrentPage(pagination.current_page);\r\n }\r\n }, [\r\n pagination.rows_per_page,\r\n pagination?.useServerSidePagination,\r\n pagination.current_page,\r\n ]);\r\n\r\n useEffect(() => {\r\n setTotalRecords(\r\n pagination?.useServerSidePagination\r\n ? pagination.total_records\r\n : filteredData.length,\r\n );\r\n\r\n if (\r\n filteredData.length <= pageSize * (currentPage - 1) &&\r\n !pagination?.useServerSidePagination\r\n ) {\r\n setCurrentPage((prev) => prev - 1 || 1);\r\n }\r\n }, [\r\n filteredData.length,\r\n pagination.total_records,\r\n pagination?.useServerSidePagination,\r\n ]);\r\n\r\n return (\r\n <>\r\n {/* header Bar */}\r\n\r\n {loading ? (\r\n <TableSkeleton rows={6} columns={6} />\r\n ) : (\r\n <>\r\n <div className=\"flex flex-col sm:flex-row sm:justify-between gap-4 mb-3\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\r\n {title}\r\n </h1>\r\n <p className=\"text-md text-gray-600 dark:text-gray-400\">\r\n {description}\r\n </p>\r\n </div>\r\n <div className=\"flex flex-col justify-end items-end gap-2\">\r\n {showAddButton && (\r\n <Button\r\n onClick={() => setShowAdd(true)}\r\n variant=\"contained\"\r\n color=\"primary\"\r\n >\r\n <Plus className=\"w-4 h-4 mr-2\" />\r\n {buttonText || \"Add New\"}\r\n </Button>\r\n )}\r\n <div className=\"flex justify-end items-center gap-2\">\r\n {search.enabled && (\r\n <div className=\"\">\r\n <div className=\"relative min-w-[300px]\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400 dark:text-gray-300\" />\r\n <input\r\n type=\"text\"\r\n placeholder={search.placeholder || \"Search...\"}\r\n value={searchTerm}\r\n onChange={(e) => handleSearchChange(e.target.value)}\r\n className=\"w-full h-[36px] pl-9 pr-4 py-3 text-sm border border-gray-300 dark:border-gray-600 rounded-md bg-gray-50 dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-500 dark:placeholder-gray-400 focus:outline-none focus:ring-1 focus:ring-blue-300 dark:ring-blue-200 disabled:opacity-50\"\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {filterConfig && filter.enabled && (\r\n // add red dot if filter are applied\r\n <div className=\"relative\">\r\n <Button\r\n onClick={() => setShowFilters(true)}\r\n variant=\"contained\"\r\n >\r\n <Filter className=\"w-4 h-4 mr-2\" />\r\n Filters\r\n </Button>\r\n {Object.keys(appliedFilters).length > 0 && (\r\n <span className=\"absolute top-1 right-1 w-2 h-2 bg-red-500 rounded-full\"></span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n {/* =========================== Table =========================== */}\r\n <div className=\"bg-white dark:bg-gray-800 rounded-lg shadow overflow-hidden border border-gray-200 dark:border-gray-700\">\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"min-w-full divide-y divide-gray-200 dark:divide-gray-700\">\r\n <thead className=\"bg-gray-50 dark:bg-gray-700/60\">\r\n <tr>\r\n {table_head.map((col) => (\r\n <th\r\n key={col.key}\r\n className={`px-6 py-4 text-left text-xs font-medium text-black dark:text-white uppercase tracking-wider min-w-max max-w-[180px] truncate ${col.headClass || \"\"}`}\r\n >\r\n {col.title}\r\n </th>\r\n ))}\r\n </tr>\r\n </thead>\r\n\r\n <tbody className=\"bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700\">\r\n {paginatedData.length === 0 ? (\r\n <tr>\r\n <td\r\n colSpan={table_head.length}\r\n className=\"text-center py-10 text-gray-500 dark:text-gray-400\"\r\n >\r\n {emptyMessage}\r\n </td>\r\n </tr>\r\n ) : (\r\n paginatedData.map((row, index) => (\r\n <tr\r\n key={row.id || row._id || index}\r\n className={`hover:bg-gray-50 dark:hover:bg-blue-800/10 transition ${isRowClickable() ? \"cursor-pointer\" : \"\"}`}\r\n onClick={(e) => {\r\n isRowClickable() && handleRowClick(row);\r\n }}\r\n >\r\n {table_head.map((col) => (\r\n <td\r\n key={col.key}\r\n className={`px-6 py-4 text-sm text-gray-900 dark:text-gray-100 min-w-max ${col.type == \"audio\" ? \"\" : \"max-w-[300px]\"} truncate ${\r\n isColumnClickable(col) ? \"cursor-pointer\" : \"\"\r\n }`}\r\n title={String(row[col.key] ?? \"\")}\r\n onClick={(e) => {\r\n if (isColumnClickable(col)) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n handleColumnClick(col, row);\r\n }\r\n }}\r\n >\r\n {col.render\r\n ? col.render(row, index)\r\n : handleRenderCellValue(col, row, index)}\r\n </td>\r\n ))}\r\n </tr>\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n {pagination?.enabled && filteredData.length > 0 && (\r\n <div className=\" bg-gray-50 dark:bg-gray-700/60 px-6 py-3 flex flex-wrap items-center justify-between border-t border-gray-200 dark:border-gray-600 gap-3\">\r\n <div className=\"text-sm text-gray-700 dark:text-gray-300\">\r\n Showing {(currentPage - 1) * pageSize + 1} to{\" \"}\r\n {Math.min(currentPage * pageSize, totalRecords)} of{\" \"}\r\n {totalRecords} results\r\n </div>\r\n\r\n <div className=\"flex items-center gap-4\">\r\n {/* Rows per page selector */}\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-sm text-gray-700 dark:text-gray-300\">\r\n Rows per page:\r\n </span>\r\n <select\r\n value={pageSize}\r\n onChange={(e) => {\r\n const newLimit = Number(e.target.value);\r\n setPageSize(newLimit);\r\n setCurrentPage(1);\r\n if (pagination.useServerSidePagination) {\r\n setServerSidePaginationData((prev) => ({\r\n ...prev,\r\n current_page: 1,\r\n rows_per_page: newLimit,\r\n }));\r\n }\r\n }}\r\n className=\"border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 text-sm rounded-md px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500\"\r\n >\r\n {[2, 10, 25, 50, 100].map((n) => (\r\n <option key={n} value={n}>\r\n {n}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n {/* ============= Pagination ============= */}\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => {\r\n if (currentPage > 1) {\r\n const newPage = currentPage - 1;\r\n setCurrentPage(newPage);\r\n if (pagination.useServerSidePagination) {\r\n setServerSidePaginationData((prev) => ({\r\n ...prev,\r\n current_page: newPage,\r\n }));\r\n }\r\n }\r\n }}\r\n disabled={currentPage === 1}\r\n className=\"p-2 hover:bg-gray-200 dark:hover:bg-gray-600 rounded-md transition text-gray-500 dark:text-gray-300 disabled:opacity-50\"\r\n >\r\n <ChevronLeft className=\"h-4 w-4\" />\r\n </button>\r\n\r\n <span className=\"text-sm text-gray-800 dark:text-gray-200\">\r\n Page {currentPage} of {totalPages}\r\n </span>\r\n\r\n <button\r\n onClick={() => {\r\n if (currentPage < totalPages) {\r\n const newPage = currentPage + 1;\r\n setCurrentPage(newPage);\r\n if (pagination.useServerSidePagination) {\r\n setServerSidePaginationData((prev) => ({\r\n ...prev,\r\n current_page: newPage,\r\n }));\r\n }\r\n }\r\n }}\r\n disabled={currentPage === totalPages}\r\n className=\"p-2 hover:bg-gray-200 dark:hover:bg-gray-600 rounded-md transition text-gray-500 dark:text-gray-300 disabled:opacity-50\"\r\n >\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* Portal Menu */}\r\n {activeMenu &&\r\n createPortal(\r\n <div\r\n ref={menuRef}\r\n style={{\r\n position: \"fixed\",\r\n top: `${menuPosition.top}px`,\r\n left: `${menuPosition.left}px`,\r\n zIndex: 9999,\r\n }}\r\n className=\"w-48 bg-white dark:bg-gray-700 rounded-md shadow-lg border border-gray-200 dark:border-gray-600\"\r\n >\r\n {menuList.map((action, i) => (\r\n <button\r\n key={i}\r\n onClick={(e) =>\r\n handleActionClick(\r\n action,\r\n data.find(\r\n (d) => d.id === activeMenu || d._id == activeMenu,\r\n ),\r\n e,\r\n )\r\n }\r\n className={`w-full flex items-center gap-2 px-4 py-2 text-sm text-left hover:bg-gray-100 dark:hover:bg-gray-600 ${\r\n action.variant === \"danger\"\r\n ? \"text-red-600 dark:text-red-500\"\r\n : \"text-gray-700 dark:text-gray-200\"\r\n }`}\r\n >\r\n {action.icon && <span className=\"shrink-0\">{action.icon}</span>}\r\n {action.title}\r\n </button>\r\n ))}\r\n </div>,\r\n document.body,\r\n )}\r\n\r\n {/* Filter Drawer */}\r\n {filterConfig && (\r\n <FilterDrawer\r\n isOpen={showFilters}\r\n onClose={() => setShowFilters(false)}\r\n config={filterConfig}\r\n onApply={(filters) => {\r\n setAppliedFilters(filters);\r\n onFilterApply?.(filters);\r\n }}\r\n />\r\n )}\r\n\r\n {isOpen && (\r\n <ImagePreview\r\n src={targetImage.src}\r\n alt={targetImage.alt}\r\n isOpen={isOpen}\r\n setIsOpen={setIsOpen}\r\n />\r\n )}\r\n </>\r\n );\r\n};\r\n\r\nexport default Table;\r\n","import React from \"react\";\r\nimport { X } from \"lucide-react\";\r\nimport Button from \"../Button/Button\";\r\n\r\nconst Modal = ({\r\n isOpen,\r\n onClose,\r\n icon,\r\n title,\r\n children,\r\n size = \"md\",\r\n actionButtons = [],\r\n actions,\r\n showDefaultClose = true,\r\n footerConfig = null,\r\n hideFooter = false,\r\n onFormSubmit = () => {},\r\n onCancel,\r\n loadingBtn = false,\r\n executeFunction = () => {},\r\n selectedItem = null,\r\n}) => {\r\n if (!isOpen) return null;\r\n\r\n // Size classes\r\n const sizeClasses = {\r\n sm: \"max-w-md\",\r\n md: \"max-w-lg\",\r\n lg: \"max-w-2xl\",\r\n xl: \"max-w-4xl\",\r\n full: \"max-w-full\",\r\n };\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-4\">\r\n {/* Backdrop */}\r\n <div\r\n className=\"fixed inset-0 bg-gray-500 opacity-75\"\r\n onClick={() => onClose()}\r\n ></div>\r\n\r\n {/* Modal container */}\r\n <div\r\n className={`relative bg-white rounded-lg shadow-xl w-full ${\r\n sizeClasses[size] || sizeClasses.md\r\n } max-h-[90vh] flex flex-col dark:bg-gray-800`}\r\n >\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700 flex-shrink-0\">\r\n <div className=\"flex items-center gap-1\">\r\n {icon && <span>{icon}</span>}\r\n <h3 className=\"text-lg font-medium text-gray-900 dark:text-white\">\r\n {title}\r\n </h3>\r\n </div>\r\n\r\n <button\r\n onClick={() => onClose()}\r\n className=\"text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\"\r\n >\r\n <X className=\"w-6 h-6\" />\r\n </button>\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"flex-1 overflow-y-auto p-4\">{children}</div>\r\n\r\n {/* Footer */}\r\n {/* {!hideFooter && (actions || footerConfig || showDefaultClose) && (\r\n <div className=\"px-4 py-3 flex justify-end gap-3 border-t border-gray-200 dark:border-gray-700 sm:px-6\">\r\n {actions}\r\n\r\n {footerConfig && (\r\n <>\r\n {footerConfig.cancelButton && (\r\n <Button\r\n onClick={() => (onCancel() || onClose())}\r\n disabled={loadingBtn}\r\n variant=\"contained\"\r\n color=\"default\"\r\n >\r\n {footerConfig.cancelText || \"Cancel\"}\r\n </Button>\r\n )}\r\n\r\n {footerConfig.submitButton && (\r\n <Button\r\n onClick={onFormSubmit}\r\n disabled={loadingBtn}\r\n variant=\"contained\"\r\n color={footerConfig.color || \"primary\"}\r\n className=\"min-w-[100px]\"\r\n >\r\n {loadingBtn ? (\r\n <div className=\"flex items-center\">\r\n <div className=\"animate-spin rounded-full h-4 w-4 border-2 border-white/30 border-t-2 border-t-white mr-2\"></div>\r\n {footerConfig.submitText || \"Submit\"}...\r\n </div>\r\n ) : (\r\n footerConfig.submitText || \"Submit\"\r\n )}\r\n </Button>\r\n )}\r\n </>\r\n )}\r\n\r\n {showDefaultClose && !actions && !footerConfig && (\r\n <Button onClick={() => onClose()} variant=\"outlined\">\r\n Close\r\n </Button>\r\n )}\r\n </div>\r\n )} */}\r\n\r\n {actionButtons.length > 0 && (\r\n <div className=\"px-4 py-3 flex justify-end gap-3 border-t border-gray-200 dark:border-gray-700 sm:px-6\">\r\n {actionButtons.map((btn) => (\r\n <Button\r\n onClick={(e) => {\r\n if (btn.type == \"submit\") {\r\n onFormSubmit(e);\r\n } else {\r\n executeFunction(\r\n () => btn?.onClick?.(e, selectedItem),\r\n (resp) => onClose?.(resp),\r\n );\r\n }\r\n }}\r\n disabled={loadingBtn || btn.disabled}\r\n variant={btn.variant || \"contained\"}\r\n color={btn.color || \"primary\"}\r\n className={`min-w-[100px] ${btn.className}`}\r\n type={btn.type || \"button\"}\r\n >\r\n {loadingBtn ? (\r\n <div className=\"flex items-center\">\r\n <div className=\"animate-spin rounded-full h-4 w-4 border-2 border-white/30 border-t-2 border-t-white mr-2\"></div>\r\n {btn.label || \"Submit\"}...\r\n </div>\r\n ) : (\r\n btn.label || \"Submit\"\r\n )}\r\n </Button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default Modal;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport RenderFields from \"./components/RenderFields\";\r\n\r\nconst Form = ({ config, onSubmit, initialData = {}, type = \"add\" }) => {\r\n const { formClass = \"grid grid-cols-12 gap-4\", formFields = [] } =\r\n config || {};\r\n\r\n const [formData, setFormData] = useState(initialData);\r\n\r\n useEffect(() => {\r\n setFormData(initialData);\r\n }, []);\r\n\r\n const handleChange = (key, value) => {\r\n setFormData((prev) => ({ ...prev, [key]: value }));\r\n };\r\n\r\n const handleSubmit = (e) => {\r\n e.preventDefault();\r\n const form = e.target;\r\n\r\n if (!form.checkValidity()) {\r\n form.reportValidity();\r\n return;\r\n }\r\n\r\n onSubmit(formData);\r\n };\r\n\r\n return (\r\n <form\r\n id={\r\n type == \"add\" ? \"addForm\" : type == \"edit\" ? \"editForm\" : \"defaultForm\"\r\n }\r\n onSubmit={handleSubmit}\r\n className={formClass}\r\n noValidate={false} // enables native validation\r\n >\r\n {formFields.map((field) => (\r\n <>\r\n <RenderFields\r\n key={field.key}\r\n field={field}\r\n formData={formData}\r\n handleChange={handleChange}\r\n />\r\n </>\r\n ))}\r\n </form>\r\n );\r\n};\r\n\r\nexport default Form;\r\n","import { User } from \"lucide-react\";\r\nimport React, { useState } from \"react\";\r\nimport Chip from \"../Chip/Chip\";\r\nimport { formatDate } from \"../../lib/utils\";\r\nimport ImagePreview from \"../Table/components/ImagePreview\";\r\n\r\nexport default function Details({ data, config }) {\r\n const { fields, containerClass } = config;\r\n\r\n // image preview\r\n const [targetImage, setTargetImage] = useState(null);\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n const openPreview = (image) => {\r\n if (image && image.src instanceof File) {\r\n image = { ...image, src: URL.createObjectURL(image.src) };\r\n }\r\n setTargetImage(image);\r\n setIsOpen(true);\r\n };\r\n\r\n const DetailRow = ({ col }) => {\r\n let Icon = col?.icon;\r\n let label = col.label;\r\n let value = data[col.key];\r\n let type = col.type;\r\n let variant = col.variant || \"outline\";\r\n let color = col.defaultColor;\r\n\r\n if (type === \"chip\" && col.chipOptions?.length > 0) {\r\n let chipObj = col?.chipOptions.find((obj) => obj.value == value);\r\n if (chipObj) {\r\n value = chipObj.label;\r\n color = chipObj.color;\r\n }\r\n }\r\n\r\n return (\r\n <div\r\n className={`col-span-12 flex items-center space-x-4 p-4 rounded-xl \r\n bg-gray-100 dark:bg-gray-900 ${col.blockClass || \"\"}`}\r\n >\r\n {Icon && <div className=\"flex-shrink-0\">{Icon}</div>}\r\n\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium text-gray-500 dark:text-gray-400\">\r\n {label}\r\n </p>\r\n\r\n {/* CHIP */}\r\n {type === \"chip\" ? (\r\n <Chip\r\n label={value}\r\n variant={variant}\r\n color={color}\r\n className=\"mt-1\"\r\n />\r\n ) : /* TINY EDITOR */\r\n type === \"tinyEditor\" ? (\r\n <p\r\n className=\"mt-1 text-sm text-gray-900 dark:text-white break-words\"\r\n dangerouslySetInnerHTML={{\r\n __html: value,\r\n }}\r\n ></p>\r\n ) : type === \"audio\" ? (\r\n value ? (\r\n <audio\r\n key={value instanceof File ? URL.createObjectURL(value) : value}\r\n controls\r\n src={value instanceof File ? URL.createObjectURL(value) : value}\r\n onClick={(e) => e.stopPropagation()}\r\n className=\"shadow-md rounded-full mt-1\"\r\n />\r\n ) : (\r\n <p className=\"mt-1 text-sm text-gray-400\">N/A</p>\r\n )\r\n ) : (\r\n /* DEFAULT */\r\n <p className=\"mt-1 text-sm text-gray-900 dark:text-white break-words\">\r\n {type == \"date\" ? (\r\n <span>{formatDate(value, col.format || \"DD MMM YYYY\")}</span>\r\n ) : (\r\n value || \"N/A\"\r\n )}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const GroupRow = ({ col }) => {\r\n let title = data[col.titleKey];\r\n let subtitle = data[col.subtitleKey];\r\n let image = data[col.imageKey];\r\n let fallback_icon = col.fallback_icon;\r\n\r\n return (\r\n <div\r\n className={`col-span-12 flex items-center space-x-4 p-4 rounded-xl \r\n bg-gray-100 dark:bg-gray-900 \r\n ${col.blockClass}`}\r\n >\r\n {image ? (\r\n <img\r\n src={image instanceof File ? URL.createObjectURL(image) : image}\r\n alt={title}\r\n onClick={() => openPreview({ src: image, alt: title })}\r\n className=\"w-16 h-16 cursor-pointer rounded-full object-cover border-2 border-gray-200 dark:border-gray-700\"\r\n />\r\n ) : fallback_icon ? (\r\n fallback_icon instanceof Function ? (\r\n fallback_icon(data)\r\n ) : (\r\n fallback_icon\r\n )\r\n ) : (\r\n <div className=\"w-16 h-16 flex items-center justify-center rounded-full border-2 border-gray-300 dark:border-gray-700 bg-gray-200 dark:bg-gray-600\">\r\n <User className=\"w-8 h-8 text-gray-400\" />\r\n </div>\r\n )}\r\n\r\n <div>\r\n <h3 className=\"text-xl font-semibold text-gray-900 dark:text-white\">\r\n {title}\r\n </h3>\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">{subtitle}</p>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const CardGroup = ({ col }) => {\r\n let title = data[col.titleKey];\r\n let subtitle = data[col.subtitleKey];\r\n let image = data[col.imageKey];\r\n let label = col.label;\r\n let Icon = col?.icon;\r\n let fallback_icon = col.fallback_icon;\r\n\r\n return (\r\n <div\r\n className={`col-span-12 flex items-center space-x-4 p-4 rounded-xl \r\n bg-gray-100 dark:bg-gray-900 \r\n ${col.blockClass}`}\r\n >\r\n {Icon && <div className=\"flex-shrink-0\">{Icon}</div>}\r\n\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium text-gray-500 dark:text-gray-400\">\r\n {label}\r\n </p>\r\n\r\n <div className=\"flex items-center\">\r\n {image ? (\r\n <img\r\n src={image instanceof File ? URL.createObjectURL(image) : image}\r\n alt={title}\r\n onClick={() => openPreview({ src: image, alt: title })}\r\n className=\"w-8 h-8 cursor-pointer rounded-full object-cover border-2 border-gray-200 dark:border-gray-700\"\r\n />\r\n ) : fallback_icon ? (\r\n fallback_icon instanceof Function ? (\r\n fallback_icon(data)\r\n ) : (\r\n fallback_icon\r\n )\r\n ) : (\r\n <div className=\"w-8 h-8 flex items-center justify-center rounded-full border-2 border-gray-300 dark:border-gray-700 bg-gray-200 dark:bg-gray-600\">\r\n <User className=\"w-6 h-6 text-gray-400\" />\r\n </div>\r\n )}\r\n\r\n <div className=\"ml-2\">\r\n <p className=\"mb-0 text-sm text-gray-900 dark:text-white break-words\">\r\n {title}\r\n </p>\r\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\r\n {subtitle}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <>\r\n {isOpen && (\r\n <ImagePreview\r\n src={targetImage.src}\r\n alt={targetImage.alt}\r\n isOpen={isOpen}\r\n setIsOpen={setIsOpen}\r\n />\r\n )}\r\n\r\n <div className={`grid grid-cols-12 gap-4 ${containerClass || \"\"}`}>\r\n {fields.map((col) => {\r\n if (\r\n col.renderCondition &&\r\n typeof col.renderCondition === \"function\"\r\n ) {\r\n const shouldRender = col.renderCondition(data);\r\n if (!shouldRender) {\r\n return null;\r\n }\r\n }\r\n return col.type == \"group\" ? (\r\n <GroupRow col={col} />\r\n ) : col.type == \"cardGroup\" ? (\r\n <CardGroup col={col} />\r\n ) : (\r\n <DetailRow col={col} />\r\n );\r\n })}\r\n </div>\r\n </>\r\n );\r\n}\r\n","import React, { useEffect, useMemo, useState } from \"react\";\r\nimport { X } from \"lucide-react\";\r\nimport Table from \"./Table/Table\";\r\nimport Modal from \"./Modal/Modal\";\r\nimport Form from \"./Form/Form\";\r\nimport { Icon } from \"@iconify/react\";\r\nimport { enqueueSnackbar } from \"notistack\";\r\nimport Details from \"./Details/Details\";\r\nimport PropTypes from \"prop-types\";\r\nimport { SnackbarProvider } from \"notistack\";\r\n\r\nconst CrudPage = ({ config }) => {\r\n const {\r\n title,\r\n fetchData = async () => {},\r\n isStaticData = false,\r\n tableConfig = {},\r\n modalConfig = {},\r\n filterConfig,\r\n } = config;\r\n\r\n const [loading, setLoading] = useState(true);\r\n const [formLoading, setFormLoading] = useState(false);\r\n\r\n const [listingData, setListingData] = useState([]);\r\n const [paginationData, setPaginationData] = useState(null);\r\n const [serverSidePaginationData, setServerSidePaginationData] = useState({\r\n search: \"\",\r\n rows_per_page: 50,\r\n current_page: 1,\r\n });\r\n const [filterData, setFilterData] = useState({});\r\n const [changeFilterData, setChangeFilterData] = useState(false);\r\n\r\n const [showAdd, setShowAdd] = useState(false);\r\n const [showEdit, setShowEdit] = useState(false);\r\n const [showDelete, setShowDelete] = useState(false);\r\n const [showView, setShowView] = useState(false);\r\n const [selectedItem, setSelectedItem] = useState(null);\r\n\r\n const handleMenuAction = (action, item) => {\r\n if (action === \"edit\") {\r\n setSelectedItem(item);\r\n setShowEdit(true);\r\n } else if (action === \"view\") {\r\n setSelectedItem(item);\r\n setShowView(true);\r\n } else if (action === \"delete\") {\r\n setSelectedItem(item);\r\n setShowDelete(true);\r\n }\r\n };\r\n\r\n const executeAction = async (\r\n action,\r\n onSuccess,\r\n success_message = \"\",\r\n error_message = \"\",\r\n ) => {\r\n setFormLoading(true);\r\n\r\n try {\r\n const resp = await action?.();\r\n if (success_message || resp.message) {\r\n enqueueSnackbar(success_message || resp.message, {\r\n variant: \"success\",\r\n });\r\n }\r\n onSuccess?.(resp);\r\n } catch (error) {\r\n if (error_message || error.message) {\r\n enqueueSnackbar(error_message || error.message, { variant: \"error\" });\r\n }\r\n } finally {\r\n setFormLoading(false);\r\n }\r\n };\r\n\r\n const handleAddResult = (resp) => {\r\n let newObj = resp.newObject;\r\n if (isStaticData) {\r\n setListingData((prev) => [newObj, ...prev]);\r\n setPaginationData((prev) => ({\r\n ...prev,\r\n current_page: 1,\r\n }));\r\n } else {\r\n setServerSidePaginationData((prev) => ({\r\n ...prev,\r\n current_page: 1,\r\n }));\r\n if (serverSidePaginationData.current_page == 1) {\r\n handleGetListing();\r\n }\r\n }\r\n setShowAdd(false);\r\n };\r\n\r\n const handleEditResult = (resp) => {\r\n let updatedObj = resp.newObject;\r\n let targetObj = resp.targetObject;\r\n if (isStaticData) {\r\n setListingData((prev) =>\r\n prev.map((item) =>\r\n item.id === targetObj.id ? { ...item, ...updatedObj } : item,\r\n ),\r\n );\r\n } else {\r\n handleGetListing();\r\n }\r\n setShowEdit(false);\r\n };\r\n\r\n const handleDeleteResult = (resp) => {\r\n if (!resp) {\r\n setShowDelete(false);\r\n setSelectedItem(null);\r\n return;\r\n }\r\n\r\n if (isStaticData) {\r\n setListingData((prev) =>\r\n prev.filter((item) => item.id !== resp.targetObject.id),\r\n );\r\n } else {\r\n if (\r\n listingData.length == 1 &&\r\n serverSidePaginationData.current_page > 1\r\n ) {\r\n setServerSidePaginationData((prev) => ({\r\n ...prev,\r\n current_page: prev.current_page - 1,\r\n }));\r\n } else {\r\n handleGetListing();\r\n }\r\n }\r\n setShowDelete(false);\r\n setSelectedItem(null);\r\n };\r\n\r\n const handleAddFormSubmit = (formData) =>\r\n executeAction(\r\n () => modalConfig?.addModal?.handleSubmit?.(formData),\r\n handleAddResult,\r\n );\r\n\r\n const handleEditFormSubmit = (formData) =>\r\n executeAction(\r\n () => modalConfig?.editModal?.handleSubmit?.(formData, selectedItem),\r\n handleEditResult,\r\n );\r\n\r\n const handleDeleteConfirm = () =>\r\n executeAction(\r\n () => modalConfig?.deleteModal?.action?.(selectedItem),\r\n handleDeleteResult,\r\n );\r\n\r\n const handleGetListing = async () => {\r\n setLoading(true);\r\n\r\n fetchData?.({ ...serverSidePaginationData, ...filterData })\r\n .then((resp) => {\r\n setListingData(resp.data);\r\n setPaginationData(resp.pagination);\r\n })\r\n .catch((error) => {\r\n enqueueSnackbar(error.message, { variant: \"error\" });\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n };\r\n\r\n const handleFilterData = (data) => {\r\n setFilterData((prev) => ({\r\n ...data,\r\n }));\r\n if (tableConfig?.filter?.useServerSideFilters) {\r\n setChangeFilterData((prev) => !prev);\r\n }\r\n };\r\n\r\n const filterByMatchingFields = (data, filters) => {\r\n return data.filter((item) =>\r\n Object.entries(filters).every(([key, value]) => item[key] === value),\r\n );\r\n };\r\n\r\n const filteredData = useMemo(() => {\r\n if (tableConfig?.filter?.useServerSideFilters) return listingData;\r\n return filterByMatchingFields(listingData, filterData);\r\n }, [listingData, filterData]);\r\n\r\n useEffect(() => {\r\n handleGetListing();\r\n }, [\r\n serverSidePaginationData.search,\r\n serverSidePaginationData.rows_per_page,\r\n serverSidePaginationData.current_page,\r\n changeFilterData,\r\n ]);\r\n\r\n return (\r\n <SnackbarProvider\r\n maxSnack={3}\r\n anchorOrigin={{\r\n vertical: \"bottom\",\r\n horizontal: \"right\",\r\n }}\r\n autoHideDuration={3000}\r\n action={(snackbarKey) => (\r\n <button\r\n onClick={() => {\r\n window.dispatchEvent(\r\n new CustomEvent(\"closeSnackbar\", { detail: snackbarKey }),\r\n );\r\n }}\r\n className=\"p-1 hover:bg-white/20 rounded-full transition-colors duration-200 text-white flex items-center justify-center\"\r\n >\r\n <X className=\"h-4 w-4\" />\r\n </button>\r\n )}\r\n >\r\n <div>\r\n {/* Table */}\r\n <Table\r\n title={title}\r\n setShowAdd={setShowAdd}\r\n description={config.description}\r\n buttonText={config.buttonText}\r\n showAddButton={!!modalConfig.addModal}\r\n config={{\r\n ...tableConfig,\r\n pagination: {\r\n ...tableConfig.pagination,\r\n ...paginationData,\r\n },\r\n data: filteredData,\r\n setServerSidePaginationData: setServerSidePaginationData,\r\n onMenuAction: handleMenuAction,\r\n filterConfig,\r\n onFilterApply: handleFilterData,\r\n loading,\r\n }}\r\n />\r\n\r\n {/* Add Modal */}\r\n <Modal\r\n isOpen={showAdd}\r\n onClose={() => {\r\n if (!formLoading) {\r\n setShowAdd(false);\r\n }\r\n }}\r\n icon={modalConfig.addModal?.icon}\r\n title={modalConfig.addModal?.title || \"Add New\"}\r\n size={modalConfig.addModal?.size || \"md\"}\r\n onFormSubmit={() =>\r\n document.querySelector(\"#addForm\")?.requestSubmit()\r\n }\r\n loadingBtn={formLoading}\r\n actionButtons={modalConfig?.addModal?.actionButtons || []}\r\n >\r\n <Form\r\n config={modalConfig?.addModal || {}}\r\n onSubmit={handleAddFormSubmit}\r\n initialData={{}}\r\n type=\"add\"\r\n loading={formLoading}\r\n />\r\n </Modal>\r\n\r\n {/* Edit Modal */}\r\n <Modal\r\n isOpen={showEdit}\r\n onClose={() => {\r\n if (!formLoading) {\r\n setShowEdit(false);\r\n }\r\n }}\r\n icon={modalConfig.editModal?.icon}\r\n title={modalConfig.editModal?.title || \"Edit\"}\r\n size={modalConfig.editModal?.size || \"md\"}\r\n onFormSubmit={() =>\r\n document.querySelector(\"#editForm\")?.requestSubmit()\r\n }\r\n actionButtons={modalConfig?.editModal?.actionButtons || []}\r\n loadingBtn={formLoading}\r\n >\r\n <Form\r\n config={modalConfig.editModal || {}}\r\n onSubmit={handleEditFormSubmit}\r\n initialData={selectedItem}\r\n type=\"edit\"\r\n loading={formLoading}\r\n />\r\n </Modal>\r\n\r\n {/* Delete Modal */}\r\n {showDelete && (\r\n <Modal\r\n isOpen={showDelete}\r\n onClose={(resp) => {\r\n handleDeleteResult(resp);\r\n }}\r\n icon={\r\n modalConfig.deleteModal?.icon || (\r\n <Icon icon=\"ph:warning-bold\" className=\"w-6 h-6 text-red-500\" />\r\n )\r\n }\r\n title={modalConfig.deleteModal?.title || \"Confirm Delete\"}\r\n size={modalConfig.deleteModal?.size || \"md\"}\r\n loading={formLoading}\r\n actionButtons={modalConfig?.deleteModal?.actionButtons || []}\r\n executeFunction={executeAction}\r\n selectedItem={selectedItem}\r\n >\r\n <div className=\"flex items-center space-x-2 py-3\">\r\n <div>\r\n <p className=\"text-md text-gray-700 dark:text-white\">\r\n {modalConfig.deleteModal?.confirmText ||\r\n \"Are you sure you want to delete this item?\"}\r\n </p>\r\n {modalConfig.deleteModal?.referenceKey && (\r\n <p className=\"text-md font-semibold text-gray-700 dark:text-white\">\r\n {selectedItem[modalConfig.deleteModal?.referenceKey]}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </Modal>\r\n )}\r\n\r\n {/* View Detail Modal */}\r\n {modalConfig.viewModal && (\r\n <Modal\r\n isOpen={showView}\r\n onClose={() => {\r\n setShowView(false);\r\n setSelectedItem(null);\r\n }}\r\n icon={modalConfig.viewModal?.icon}\r\n title={modalConfig.viewModal?.title || \"View Details\"}\r\n size={modalConfig.viewModal?.size || \"lg\"}\r\n footerConfig={modalConfig?.viewModal.footer}\r\n >\r\n {modalConfig.viewModal?.component ? (\r\n <modalConfig.viewModal.component data={selectedItem} />\r\n ) : (\r\n <Details\r\n data={selectedItem}\r\n config={modalConfig.viewModal || {}}\r\n />\r\n )}\r\n </Modal>\r\n )}\r\n </div>\r\n </SnackbarProvider>\r\n );\r\n};\r\n\r\nconst optionType = PropTypes.shape({\r\n value: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.number,\r\n PropTypes.bool,\r\n ]).isRequired,\r\n label: PropTypes.string.isRequired,\r\n color: PropTypes.string,\r\n});\r\n\r\nconst actionButtonType = PropTypes.shape({\r\n type: PropTypes.string.isRequired,\r\n label: PropTypes.string.isRequired,\r\n color: PropTypes.string,\r\n variant: PropTypes.string,\r\n onClick: PropTypes.func,\r\n});\r\n\r\nconst menuActionType = PropTypes.shape({\r\n title: PropTypes.string.isRequired,\r\n type: PropTypes.string.isRequired,\r\n variant: PropTypes.string,\r\n icon: PropTypes.node,\r\n});\r\n\r\nconst tableHeadType = PropTypes.shape({\r\n key: PropTypes.string.isRequired,\r\n title: PropTypes.string,\r\n type: PropTypes.string,\r\n imageKey: PropTypes.string,\r\n titleKey: PropTypes.string,\r\n subtitleKey: PropTypes.string,\r\n onClickDetails: PropTypes.bool,\r\n variant: PropTypes.string,\r\n chipOptions: PropTypes.arrayOf(optionType),\r\n defaultColor: PropTypes.string,\r\n className: PropTypes.string,\r\n format: PropTypes.string,\r\n menuList: PropTypes.arrayOf(menuActionType),\r\n});\r\n\r\nconst formFieldType = PropTypes.shape({\r\n key: PropTypes.string.isRequired,\r\n label: PropTypes.string,\r\n type: PropTypes.string.isRequired,\r\n required: PropTypes.bool,\r\n minLength: PropTypes.number,\r\n parentClass: PropTypes.string,\r\n search: PropTypes.bool,\r\n multiple: PropTypes.bool,\r\n dropdownMaxHeight: PropTypes.string,\r\n dragDrop: PropTypes.bool,\r\n countriesList: PropTypes.bool,\r\n defaultCountry: PropTypes.string,\r\n placeholder: PropTypes.string,\r\n rows: PropTypes.number,\r\n text: PropTypes.string,\r\n editorKey: PropTypes.string,\r\n options: PropTypes.arrayOf(optionType),\r\n});\r\n\r\nconst viewFieldType = PropTypes.shape({\r\n key: PropTypes.string,\r\n label: PropTypes.string,\r\n type: PropTypes.string,\r\n imageKey: PropTypes.string,\r\n titleKey: PropTypes.string,\r\n subtitleKey: PropTypes.string,\r\n blockClass: PropTypes.string,\r\n icon: PropTypes.node,\r\n variant: PropTypes.string,\r\n chipOptions: PropTypes.arrayOf(optionType),\r\n defaultColor: PropTypes.string,\r\n className: PropTypes.string,\r\n format: PropTypes.string,\r\n});\r\n\r\nCrudPage.propTypes = {\r\n config: PropTypes.shape({\r\n title: PropTypes.string.isRequired,\r\n description: PropTypes.string,\r\n buttonText: PropTypes.string,\r\n fetchData: PropTypes.func.isRequired,\r\n isStaticData: PropTypes.bool,\r\n\r\n /* ================= TABLE CONFIG ================= */\r\n\r\n tableConfig: PropTypes.shape({\r\n table_head: PropTypes.arrayOf(tableHeadType).isRequired,\r\n\r\n search: PropTypes.shape({\r\n enabled: PropTypes.bool,\r\n useServerSideSearch: PropTypes.bool,\r\n searchKeys: PropTypes.arrayOf(PropTypes.string),\r\n }),\r\n\r\n pagination: PropTypes.shape({\r\n enabled: PropTypes.bool,\r\n useServerSidePagination: PropTypes.bool,\r\n }),\r\n\r\n filter: PropTypes.shape({\r\n enabled: PropTypes.bool,\r\n useServerSideFilters: PropTypes.bool,\r\n }),\r\n }).isRequired,\r\n\r\n /* ================= MODAL CONFIG ================= */\r\n\r\n modalConfig: PropTypes.shape({\r\n addModal: PropTypes.shape({\r\n title: PropTypes.string.isRequired,\r\n size: PropTypes.string,\r\n formClass: PropTypes.string,\r\n formFields: PropTypes.arrayOf(formFieldType),\r\n handleSubmit: PropTypes.func.isRequired,\r\n actionButtons: PropTypes.arrayOf(actionButtonType),\r\n }),\r\n\r\n editModal: PropTypes.shape({\r\n title: PropTypes.string.isRequired,\r\n size: PropTypes.string,\r\n formClass: PropTypes.string,\r\n formFields: PropTypes.arrayOf(formFieldType),\r\n handleSubmit: PropTypes.func.isRequired,\r\n actionButtons: PropTypes.arrayOf(actionButtonType),\r\n }),\r\n\r\n deleteModal: PropTypes.shape({\r\n title: PropTypes.string.isRequired,\r\n size: PropTypes.string,\r\n confirmText: PropTypes.string,\r\n referenceKey: PropTypes.string,\r\n actionButtons: PropTypes.arrayOf(actionButtonType),\r\n }),\r\n\r\n viewModal: PropTypes.shape({\r\n title: PropTypes.string.isRequired,\r\n size: PropTypes.string,\r\n\r\n // 👇 This covers your commented code:\r\n component: PropTypes.elementType, // for custom component like TeamMemberDetail\r\n\r\n fields: PropTypes.arrayOf(viewFieldType),\r\n\r\n footer: PropTypes.shape({\r\n cancelButton: PropTypes.bool,\r\n cancelText: PropTypes.string,\r\n }),\r\n }),\r\n }),\r\n\r\n /* ================= FILTER CONFIG ================= */\r\n\r\n filterConfig: PropTypes.shape({\r\n fields: PropTypes.arrayOf(formFieldType),\r\n }),\r\n }).isRequired,\r\n};\r\n\r\nexport default CrudPage;\r\n","import React, { useEffect } from \"react\";\r\nimport CrudPage from \"./components/CrudPage\";\r\n\r\n// Inject styles dynamically\r\nconst injectStyles = () => {\r\n if (typeof document === \"undefined\") return;\r\n \r\n // Check if styles already loaded\r\n if (document.getElementById(\"react-admin-crud-manager-styles\")) return;\r\n \r\n // Create style tag\r\n const style = document.createElement(\"style\");\r\n style.id = \"react-admin-crud-manager-styles\";\r\n \r\n // Add all CSS rules\r\n const cssRules = `\r\n .no-spinner::-webkit-outer-spin-button,\r\n .no-spinner::-webkit-inner-spin-button {\r\n -webkit-appearance: none;\r\n margin: 0;\r\n }\r\n \r\n .no-spinner {\r\n -moz-appearance: textfield;\r\n }\r\n \r\n .tox.tox-tinymce .tox-edit-area::before {\r\n border: 0 !important;\r\n box-shadow: none !important;\r\n }\r\n `;\r\n \r\n style.textContent = cssRules;\r\n document.head.appendChild(style);\r\n};\r\n\r\nexport default function Crud(props) {\r\n useEffect(() => {\r\n injectStyles();\r\n }, []);\r\n\r\n return (\r\n <>\r\n <CrudPage config={props.config} />\r\n </>\r\n );\r\n}\r\n"],"names":["formatDate","dateString","format","date","pad","n","map","token","searchLocalData","data","searchTerm","searchKeys","lowerSearchTerm","extractValues","obj","item","valuesToSearch","key","val","Button","React","className","variant","color","size","fullWidth","children","props","ref","baseStyles","sizes","colorVariants","colorStyles","_a","sizeStyles","combinedClassName","jsx","InputLabel","label","required","infoText","Fragment","jsxs","Info","Select","options","value","defaultValue","onChange","placeholder","disabled","search","name","parentClass","multiple","dropdownMaxHeight","formData","dependencyKey","open","setOpen","useState","setSearchTerm","showAboveState","setShowAboveState","dropdownRef","useRef","searchInputRef","normalizedOptions","setNormalizedOptions","initialVal","normalize","useEffect","result","normalizedValue","filteredOptions","option","isSelected","optionValue","normalized","handleClickOutside","event","rect","spaceBelow","handleOptionClick","finalValue","exists","newValues","v","selectedLabels","opt","ChevronDown","Search","e","Check","Switch","text","radioOptions","idx","countries","PhoneInput","countriesList","defaultCountry","find_country_with_code","selectedCountry","setSelectedCountry","fullNumber","setFullNumber","match","c","a","b","handleNumberChange","input","handleCountrySelect","country","filteredCountries","handleInputChange","formatted","TextArea","ImagePicker","accept","id","dragDrop","image","setImage","isDragging","setIsDragging","inputRef","handleFileChange","files","file","preview","imgObj","removeImage","handleDragOver","handleDragLeave","handleDrop","handleButtonClick","Icon","Input","type","onKeyDown","negativeNumberAllow","field","showPassword","setShowPassword","handleKeyDown","prev","TinyEditor","editorKey","height","inline","plugins","toolbar","menubar","fontFamily","initConfig","imageUploadHandler","defaultPlugins","defaultToolbar","handleImageUpload","blobInfo","resolve","reject","url","error","Editor","content","Checkbox","multiSelect","isChecked","handleSingleChange","handleMultipleChange","checked","newValue","index","AudioPicker","audio","setAudio","cleanupAudio","removeAudio","RenderFields","handleChange","rows","inputClass","minLength","renderCondition","optionDependencyKey","pattern","finalPlaceholder","baseClass","FilterDrawer","isOpen","onClose","config","onApply","filters","setFilters","handleApply","handleReset","X","BADGE_COLORS","BADGE_VARIANTS","Chip","colorConfig","variantKey","variantClasses","TableSkeleton","columns","_","rowIndex","colIndex","ImagePreview","src","alt","setIsOpen","closePreview","handleEsc","Table","setShowAdd","title","buttonText","description","showAddButton","table_head","loading","filter","pagination","emptyMessage","onMenuAction","setServerSidePaginationData","onFilterApply","filterConfig","rowClick","activeMenu","setActiveMenu","menuList","setMenuList","menuPosition","setMenuPosition","showFilters","setShowFilters","appliedFilters","setAppliedFilters","targetImage","setTargetImage","filteredData","useMemo","currentPage","setCurrentPage","pageSize","setPageSize","totalRecords","setTotalRecords","totalPages","paginatedData","start","menuRef","buttonRefs","searchTimeoutRef","handleSearchChange","handleActionClick","action","handleMenuToggle","itemId","menu_list","button","menuWidth","menuHeight","viewportWidth","viewportHeight","left","top","calculateRowNumber","openPreview","renderAvatar","imageSrc","imageAlt","fallback_icon","row","User","renderAudio","audioSrc","Music","renderGroupCell","col","handleRenderChip","chipObj","handleRenderCellValue","el","EllipsisVertical","handleRowClick","handleColumnClick","isRowClickable","isColumnClickable","handleScroll","Plus","Filter","newLimit","newPage","ChevronLeft","ChevronRight","createPortal","i","d","Modal","icon","actionButtons","actions","showDefaultClose","footerConfig","hideFooter","onFormSubmit","onCancel","loadingBtn","executeFunction","selectedItem","sizeClasses","btn","resp","Form","onSubmit","initialData","formClass","formFields","setFormData","handleSubmit","form","Details","fields","containerClass","DetailRow","GroupRow","subtitle","CardGroup","CrudPage","fetchData","isStaticData","tableConfig","modalConfig","setLoading","formLoading","setFormLoading","listingData","setListingData","paginationData","setPaginationData","serverSidePaginationData","filterData","setFilterData","changeFilterData","setChangeFilterData","showAdd","showEdit","setShowEdit","showDelete","setShowDelete","showView","setShowView","setSelectedItem","handleMenuAction","executeAction","onSuccess","success_message","error_message","enqueueSnackbar","handleAddResult","newObj","handleGetListing","handleEditResult","updatedObj","targetObj","handleDeleteResult","handleAddFormSubmit","_b","handleEditFormSubmit","handleFilterData","filterByMatchingFields","SnackbarProvider","snackbarKey","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","_p","_q","_r","_s","optionType","PropTypes","actionButtonType","menuActionType","tableHeadType","formFieldType","viewFieldType","injectStyles","style","cssRules","Crud"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/lib/utils.js","../src/components/Button/Button.jsx","../src/components/Form/components/InputLabel.jsx","../src/components/Form/components/Select.jsx","../src/components/Form/components/Switch.jsx","../src/data/countries.js","../src/components/Form/components/PhoneInput.jsx","../src/components/Form/components/TextArea.jsx","../src/components/Form/components/ImagePicker.jsx","../src/components/Form/components/Input.jsx","../src/components/Form/components/TinyEditor.jsx","../src/components/Form/components/Checkbox.jsx","../src/components/Form/components/AudioPicker.jsx","../src/components/Table/components/ImagePreview.jsx","../src/components/Details/components/GroupRow.jsx","../src/components/Details/components/CardGroup.jsx","../src/components/Chip/Chip.jsx","../src/components/Details/components/DetailRow.jsx","../src/components/Form/components/Radio.jsx","../src/components/Form/components/RenderFields.jsx","../src/components/Filter/FilterDrawer.jsx","../src/components/Table/components/TableSkeleton.jsx","../src/components/Table/Table.jsx","../src/components/Modal/Modal.jsx","../src/components/Form/Form.jsx","../src/components/Details/Details.jsx","../src/components/CrudPage.jsx","../src/OptionalSnackbarProvider.jsx","../src/index.jsx"],"sourcesContent":["// ======= Format Date : Jan 15, 2024 =======\r\n\r\nexport const formatDate = (dateString, format = \"DD MMM YYYY\") => {\r\n if (!dateString) return \"N/A\";\r\n\r\n const date = new Date(dateString);\r\n if (isNaN(date)) return \"Invalid Date\";\r\n\r\n const pad = (n) => String(n).padStart(2, \"0\");\r\n\r\n const map = {\r\n YYYY: date.getFullYear(),\r\n YY: String(date.getFullYear()).slice(-2),\r\n\r\n MMMM: date.toLocaleString(\"en-US\", { month: \"long\" }),\r\n MMM: date.toLocaleString(\"en-US\", { month: \"short\" }),\r\n MM: pad(date.getMonth() + 1),\r\n M: date.getMonth() + 1,\r\n\r\n DD: pad(date.getDate()),\r\n D: date.getDate(),\r\n\r\n dddd: date.toLocaleString(\"en-US\", { weekday: \"long\" }),\r\n ddd: date.toLocaleString(\"en-US\", { weekday: \"short\" }),\r\n\r\n HH: pad(date.getHours()),\r\n hh: pad(date.getHours() % 12 || 12),\r\n\r\n mm: pad(date.getMinutes()),\r\n ss: pad(date.getSeconds()),\r\n\r\n A: date.getHours() >= 12 ? \"PM\" : \"AM\",\r\n };\r\n\r\n return format.replace(\r\n /YYYY|YY|MMMM|MMM|MM|M|DD|D|dddd|ddd|HH|hh|mm|ss|A/g,\r\n (token) => map[token],\r\n );\r\n};\r\n\r\n// =========== Local Search function ===========\r\nexport const searchLocalData = (data, searchTerm, searchKeys = []) => {\r\n if (!searchTerm?.trim()) return data;\r\n\r\n const lowerSearchTerm = searchTerm.toLowerCase();\r\n\r\n const extractValues = (obj) => {\r\n if (obj == null) return [];\r\n if (typeof obj === \"object\") {\r\n return Object.values(obj).flatMap(extractValues);\r\n }\r\n return [String(obj)];\r\n };\r\n\r\n return data.filter((item) => {\r\n let valuesToSearch = [];\r\n\r\n // ✅ If specific keys are provided → search only in those keys\r\n if (searchKeys.length > 0) {\r\n searchKeys.forEach((key) => {\r\n if (item[key] !== undefined) {\r\n valuesToSearch.push(...extractValues(item[key]));\r\n }\r\n });\r\n } else {\r\n // ✅ Otherwise → search in entire object\r\n valuesToSearch = extractValues(item);\r\n }\r\n\r\n return valuesToSearch.some((val) =>\r\n val.toLowerCase().includes(lowerSearchTerm),\r\n );\r\n });\r\n};\r\n","import React from \"react\";\r\n\r\nconst Button = React.forwardRef(\r\n (\r\n {\r\n className = \"\",\r\n variant = \"contained\",\r\n color = \"default\",\r\n size = \"default\",\r\n fullWidth = false,\r\n children,\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n const baseStyles =\r\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-400 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\";\r\n\r\n const sizes = {\r\n sm: \"h-8 px-3 rounded-md text-sm\",\r\n md: \"h-9 px-4 rounded-md text-sm\",\r\n lg: \"h-11 px-6 rounded-md text-base\",\r\n xl: \"h-12 px-8 rounded-lg text-lg\",\r\n default: \"h-9 px-4 rounded-md text-sm\",\r\n };\r\n\r\n const colorVariants = {\r\n primary: {\r\n contained:\r\n \"bg-primary text-white hover:bg-primary-600 focus:ring-primary-500 shadow-sm\",\r\n outlined:\r\n \"border border-primary bg-transparent text-primary hover:bg-primary-50 focus:ring-primary-500\",\r\n text: \"bg-transparent text-primary hover:bg-primary-50 focus:ring-primary-500\",\r\n },\r\n success: {\r\n contained:\r\n \"bg-green-600 text-white hover:bg-green-700 focus:ring-green-500 shadow-sm\",\r\n outlined:\r\n \"border border-green-600 bg-transparent text-green-600 hover:bg-green-50 focus:ring-green-500\",\r\n text: \"bg-transparent text-green-600 hover:bg-green-50 focus:ring-green-500\",\r\n },\r\n error: {\r\n contained:\r\n \"bg-red-600 text-white hover:bg-red-700 focus:ring-red-500 shadow-sm\",\r\n outlined:\r\n \"border border-red-600 bg-transparent text-red-600 hover:bg-red-50 focus:ring-red-500\",\r\n text: \"bg-transparent text-red-600 hover:bg-red-50 focus:ring-red-500\",\r\n },\r\n default: {\r\n contained:\r\n \"border bg-gray-200 text-gray-800 hover:bg-gray-300 focus:ring-gray-300 shadow-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-100 dark:hover:bg-gray-600 dark:focus:ring-gray-600\",\r\n outlined:\r\n \"border border-gray-300 bg-transparent text-gray-700 hover:bg-gray-100 focus:ring-gray-300 dark:border-gray-600 dark:text-gray-200 dark:hover:bg-gray-700 dark:focus:ring-gray-500\",\r\n text: \"bg-transparent text-gray-700 hover:bg-gray-100 focus:ring-gray-300 dark:text-gray-200 dark:hover:bg-gray-700 dark:focus:ring-gray-500\",\r\n },\r\n };\r\n\r\n const colorStyles =\r\n colorVariants[color]?.[variant] || colorVariants.default.contained;\r\n const sizeStyles = sizes[size];\r\n\r\n const combinedClassName = `\r\n ${baseStyles} \r\n ${colorStyles} \r\n ${sizeStyles} \r\n ${fullWidth ? \"w-full\" : \"\"} \r\n ${className}\r\n `.trim();\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n type={props.type || \"button\"}\r\n className={combinedClassName}\r\n {...props}\r\n >\r\n {children}\r\n </button>\r\n );\r\n },\r\n);\r\n\r\nButton.displayName = \"Button\";\r\n\r\nexport default Button;\r\n","import { Info } from \"lucide-react\";\r\nimport React from \"react\";\r\n\r\nexport default function InputLabel({ label, required = false, infoText = \"\" }) {\r\n return (\r\n <>\r\n <label className=\"flex text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {label}\r\n {required && <span className=\"ml-1\">*</span>}\r\n\r\n {infoText && (\r\n <span className=\"ml-2 relative group inline-flex items-center cursor-pointer\">\r\n <Info className=\"w-4 h-4 text-gray-500 dark:text-gray-400\" />\r\n\r\n {/* Tooltip */}\r\n <span\r\n className=\"absolute left-1/2 top-full mt-2\r\n w-max max-w-xs bg-white text-black dark:bg-black dark:text-white text-xs\r\n rounded px-2 py-1 opacity-0 shadow-lg\r\n group-hover:opacity-100 transition-opacity\r\n duration-200 pointer-events-none z-50\"\r\n >\r\n {infoText}\r\n </span>\r\n </span>\r\n )}\r\n </label>\r\n </>\r\n );\r\n}\r\n","import React, { useState, useEffect, useRef } from \"react\";\r\nimport { ChevronDown, Search, Check } from \"lucide-react\";\r\nimport InputLabel from \"./InputLabel\";\r\n\r\nconst Select = ({\r\n options = [],\r\n value = \"\",\r\n defaultValue = \"\",\r\n onChange,\r\n placeholder = \"Select option\",\r\n className = \"\",\r\n disabled = false,\r\n search = false,\r\n label = \"\",\r\n required = false,\r\n name = \"\",\r\n parentClass = \"\",\r\n multiple = false, // ✅ NEW\r\n dropdownMaxHeight = \"\",\r\n formData = {},\r\n dependencyKey = \"\",\r\n}) => {\r\n const [open, setOpen] = useState(false);\r\n const [searchTerm, setSearchTerm] = useState(\"\");\r\n const [showAboveState, setShowAboveState] = useState(true);\r\n const dropdownRef = useRef(null);\r\n const searchInputRef = useRef(null);\r\n const [normalizedOptions, setNormalizedOptions] = useState([]);\r\n\r\n let initialVal = value || value === false ? value : defaultValue;\r\n\r\n const normalize = (val) => {\r\n if (val === null || val === undefined || val === \"\") return \"\";\r\n return typeof val === \"boolean\" ? String(val) : String(val ?? \"\");\r\n };\r\n\r\n useEffect(\r\n () => {\r\n const loadOptions = async () => {\r\n if (typeof options === \"function\") {\r\n const result = await options(formData);\r\n setNormalizedOptions(result);\r\n } else {\r\n setNormalizedOptions(options || []);\r\n }\r\n };\r\n\r\n loadOptions();\r\n },\r\n dependencyKey ? [options, formData?.[dependencyKey]] : [options],\r\n ); // ✅ Add dependencyKey if options depend on formData\r\n\r\n const normalizedValue = multiple\r\n ? (initialVal || []).map(normalize)\r\n : normalize(initialVal);\r\n\r\n const filteredOptions = normalizedOptions.filter((option) =>\r\n option.label.toLowerCase().includes(searchTerm.toLowerCase()),\r\n );\r\n\r\n const isSelected = (optionValue) => {\r\n const normalized = normalize(optionValue);\r\n if (multiple) {\r\n return normalizedValue.includes(normalized);\r\n }\r\n return normalized === normalizedValue;\r\n };\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event) => {\r\n if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {\r\n setOpen(false);\r\n setSearchTerm(\"\");\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (open && dropdownRef.current) {\r\n const rect = dropdownRef.current.getBoundingClientRect();\r\n const viewportHeight = window.innerHeight;\r\n const spaceBelow = viewportHeight - rect.bottom;\r\n const dropdownHeight = 200;\r\n setShowAboveState(spaceBelow < dropdownHeight);\r\n }\r\n }, [open]);\r\n\r\n useEffect(() => {\r\n if (open && searchInputRef.current) {\r\n searchInputRef.current.focus();\r\n }\r\n }, [open]);\r\n\r\n const handleOptionClick = (optionValue) => {\r\n let finalValue = optionValue;\r\n if (optionValue === \"true\") finalValue = true;\r\n else if (optionValue === \"false\") finalValue = false;\r\n\r\n if (multiple) {\r\n const exists = normalizedValue.includes(normalize(optionValue));\r\n\r\n let newValues;\r\n if (exists) {\r\n newValues = value.filter(\r\n (v) => normalize(v) !== normalize(optionValue),\r\n );\r\n } else {\r\n newValues = [...(value || []), finalValue];\r\n }\r\n\r\n onChange(newValues);\r\n } else {\r\n onChange(finalValue);\r\n setOpen(false);\r\n }\r\n\r\n setSearchTerm(\"\");\r\n };\r\n\r\n const selectedLabels = multiple\r\n ? normalizedOptions\r\n .filter((opt) => isSelected(opt.value))\r\n .map((opt) => opt.label)\r\n .join(\", \")\r\n : normalizedOptions.find((opt) => isSelected(opt.value))?.label;\r\n\r\n useEffect(() => {\r\n if (initialVal || initialVal === false) {\r\n setTimeout(() => {\r\n onChange(initialVal);\r\n }, 100);\r\n }\r\n }, []);\r\n\r\n return (\r\n <div key={name} className={parentClass || \"col-span-12\"}>\r\n <InputLabel label={label} required={required} />\r\n\r\n <div className={`relative ${className}`} ref={dropdownRef}>\r\n <select\r\n name=\"hidden_select_for_validation\"\r\n value={selectedLabels || \"\"}\r\n required={required}\r\n multiple={multiple}\r\n className=\"absolute opacity-0 right-1/2 top-[80%] -translate-x-1/2 -translate-y-1/2 pointer-events-none h-[10px]\"\r\n >\r\n <option hidden value={selectedLabels}>\r\n {selectedLabels}\r\n </option>\r\n </select>\r\n <button\r\n type=\"button\"\r\n onClick={() => !disabled && setOpen(!open)}\r\n disabled={disabled}\r\n className={`w-full h-10 px-3 border border-gray-300 dark:border-gray-600 rounded-md text-left text-sm flex items-center justify-between \r\n ${\r\n !selectedLabels\r\n ? \"text-gray-500 dark:text-gray-400\"\r\n : \"dark:text-white\"\r\n } \r\n ${disabled ? \"opacity-50 cursor-not-allowed\" : \"dark:bg-gray-700\"}`}\r\n >\r\n <span className=\"truncate\">{selectedLabels || placeholder}</span>\r\n\r\n <ChevronDown\r\n className={`w-4 h-4 transition-transform ${\r\n open ? \"rotate-180\" : \"\"\r\n }`}\r\n />\r\n </button>\r\n\r\n {open && (\r\n <div\r\n className={`absolute z-50 w-full border rounded-md bg-white dark:bg-gray-700 shadow-lg \r\n ${showAboveState ? \"bottom-full mb-1\" : \"top-full mt-1\"}`}\r\n >\r\n {search && (\r\n <div className=\"p-2 border-b border-gray-200 dark:border-gray-600\">\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400\" />\r\n <input\r\n ref={searchInputRef}\r\n type=\"text\"\r\n value={searchTerm}\r\n onChange={(e) => setSearchTerm(e.target.value)}\r\n placeholder=\"Search...\"\r\n className=\"w-full pl-9 pr-3 py-2 text-sm border rounded-md bg-white dark:bg-gray-800 dark:text-white placeholder-gray-500 dark:placeholder-gray-400 focus:outline-none\"\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div\r\n className={`max-h-40 overflow-y-auto`}\r\n style={{\r\n maxHeight: dropdownMaxHeight || \"\",\r\n }}\r\n >\r\n {filteredOptions.length > 0 ? (\r\n filteredOptions.map((option) => (\r\n <button\r\n key={String(option.value)}\r\n type=\"button\"\r\n onClick={() => handleOptionClick(String(option.value))}\r\n className={`w-full px-3 py-2 text-left text-sm flex items-center justify-between hover:bg-gray-100 dark:hover:bg-gray-600 \r\n ${\r\n isSelected(option.value)\r\n ? \"bg-blue-50 dark:bg-blue-900/20 text-blue-700 dark:text-blue-300\"\r\n : \"\"\r\n }`}\r\n >\r\n <span>{option.label}</span>\r\n\r\n {multiple && isSelected(option.value) && (\r\n <Check className=\"w-4 h-4\" />\r\n )}\r\n </button>\r\n ))\r\n ) : (\r\n <div className=\"px-3 py-2 text-sm text-gray-500 dark:text-gray-400\">\r\n No options found\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default Select;\r\n","import React from \"react\";\r\nimport InputLabel from \"./InputLabel\";\r\n\r\nconst Switch = React.forwardRef(\r\n (\r\n {\r\n label,\r\n required,\r\n parentClass = \"col-span-12\",\r\n className = \"\",\r\n value,\r\n onChange,\r\n disabled = false,\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n return (\r\n <div className={`flex justify-between ${parentClass}`}>\r\n {label && <InputLabel label={label} required={required} />}\r\n\r\n <label className=\"relative inline-flex items-center cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n ref={ref}\r\n className=\"sr-only peer\"\r\n checked={value}\r\n onChange={(e) => onChange(e.target.checked)}\r\n disabled={disabled}\r\n {...props}\r\n />\r\n\r\n {/* Switch Track */}\r\n <div\r\n className={`\r\n w-11 h-6 bg-gray-200 peer-focus:outline-none\r\n rounded-full peer dark:bg-gray-700\r\n peer-checked:bg-primary-600\r\n peer-disabled:opacity-50 peer-disabled:cursor-not-allowed\r\n transition-colors duration-200\r\n ${className}\r\n `}\r\n ></div>\r\n\r\n {/* Switch Thumb */}\r\n <div\r\n className=\"\r\n absolute left-1 top-1\r\n w-4 h-4 bg-white rounded-full\r\n transition-transform duration-200\r\n peer-checked:translate-x-5\r\n \"\r\n ></div>\r\n </label>\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nSwitch.displayName = \"Switch\";\r\n\r\nexport { Switch };\r\n","export const countries = [\r\n { label: \"Afghanistan\", code: \"AF\", phone: \"93\" },\r\n { label: \"Aland Islands\", code: \"AX\", phone: \"358\" },\r\n { label: \"Albania\", code: \"AL\", phone: \"355\" },\r\n { label: \"Algeria\", code: \"DZ\", phone: \"213\" },\r\n { label: \"American Samoa\", code: \"AS\", phone: \"1\" },\r\n { label: \"Andorra\", code: \"AD\", phone: \"376\" },\r\n { label: \"Angola\", code: \"AO\", phone: \"244\" },\r\n { label: \"Anguilla\", code: \"AI\", phone: \"1\" },\r\n { label: \"Antarctica\", code: \"AQ\", phone: \"672\" },\r\n { label: \"Antigua and Barbuda\", code: \"AG\", phone: \"1\" },\r\n { label: \"Argentina\", code: \"AR\", phone: \"54\" },\r\n { label: \"Armenia\", code: \"AM\", phone: \"374\" },\r\n { label: \"Aruba\", code: \"AW\", phone: \"297\" },\r\n { label: \"Australia\", code: \"AU\", phone: \"61\" },\r\n { label: \"Austria\", code: \"AT\", phone: \"43\" },\r\n { label: \"Azerbaijan\", code: \"AZ\", phone: \"994\" },\r\n { label: \"Bahrain\", code: \"BH\", phone: \"973\" },\r\n { label: \"Bangladesh\", code: \"BD\", phone: \"880\" },\r\n { label: \"Barbados\", code: \"BB\", phone: \"1\" },\r\n { label: \"Belarus\", code: \"BY\", phone: \"375\" },\r\n { label: \"Belgium\", code: \"BE\", phone: \"32\" },\r\n { label: \"Belize\", code: \"BZ\", phone: \"501\" },\r\n { label: \"Benin\", code: \"BJ\", phone: \"229\" },\r\n { label: \"Bermuda\", code: \"BM\", phone: \"1\" },\r\n { label: \"Bhutan\", code: \"BT\", phone: \"975\" },\r\n { label: \"Bolivia\", code: \"BO\", phone: \"591\" },\r\n { label: \"Bonaire, Sint Eustatius and Saba\", code: \"BQ\", phone: \"599\" },\r\n { label: \"Bosnia and Herzegovina\", code: \"BA\", phone: \"387\" },\r\n { label: \"Botswana\", code: \"BW\", phone: \"267\" },\r\n { label: \"Bouvet Island\", code: \"BV\", phone: \"0055\" },\r\n { label: \"Brazil\", code: \"BR\", phone: \"55\" },\r\n { label: \"British Indian Ocean Territory\", code: \"IO\", phone: \"246\" },\r\n { label: \"Brunei\", code: \"BN\", phone: \"673\" },\r\n { label: \"Bulgaria\", code: \"BG\", phone: \"359\" },\r\n { label: \"Burkina Faso\", code: \"BF\", phone: \"226\" },\r\n { label: \"Burundi\", code: \"BI\", phone: \"257\" },\r\n { label: \"Cambodia\", code: \"KH\", phone: \"855\" },\r\n { label: \"Cameroon\", code: \"CM\", phone: \"237\" },\r\n { label: \"Canada\", code: \"CA\", phone: \"1\" },\r\n { label: \"Cape Verde\", code: \"CV\", phone: \"238\" },\r\n { label: \"Cayman Islands\", code: \"KY\", phone: \"1\" },\r\n { label: \"Central African Republic\", code: \"CF\", phone: \"236\" },\r\n { label: \"Chad\", code: \"TD\", phone: \"235\" },\r\n { label: \"Chile\", code: \"CL\", phone: \"56\" },\r\n { label: \"China\", code: \"CN\", phone: \"86\" },\r\n { label: \"Christmas Island\", code: \"CX\", phone: \"61\" },\r\n { label: \"Cocos (Keeling) Islands\", code: \"CC\", phone: \"61\" },\r\n { label: \"Colombia\", code: \"CO\", phone: \"57\" },\r\n { label: \"Comoros\", code: \"KM\", phone: \"269\" },\r\n { label: \"Congo\", code: \"CG\", phone: \"242\" },\r\n { label: \"Cook Islands\", code: \"CK\", phone: \"682\" },\r\n { label: \"Costa Rica\", code: \"CR\", phone: \"506\" },\r\n { label: \"Croatia\", code: \"HR\", phone: \"385\" },\r\n { label: \"Cuba\", code: \"CU\", phone: \"53\" },\r\n { label: \"Curaçao\", code: \"CW\", phone: \"599\" },\r\n { label: \"Cyprus\", code: \"CY\", phone: \"357\" },\r\n { label: \"Czech Republic\", code: \"CZ\", phone: \"420\" },\r\n { label: \"Democratic Republic of the Congo\", code: \"CD\", phone: \"243\" },\r\n { label: \"Denmark\", code: \"DK\", phone: \"45\" },\r\n { label: \"Djibouti\", code: \"DJ\", phone: \"253\" },\r\n { label: \"Dominica\", code: \"DM\", phone: \"1\" },\r\n { label: \"Dominican Republic\", code: \"DO\", phone: \"1\" },\r\n { label: \"Ecuador\", code: \"EC\", phone: \"593\" },\r\n { label: \"Egypt\", code: \"EG\", phone: \"20\" },\r\n { label: \"El Salvador\", code: \"SV\", phone: \"503\" },\r\n { label: \"Equatorial Guinea\", code: \"GQ\", phone: \"240\" },\r\n { label: \"Eritrea\", code: \"ER\", phone: \"291\" },\r\n { label: \"Estonia\", code: \"EE\", phone: \"372\" },\r\n { label: \"Eswatini\", code: \"SZ\", phone: \"268\" },\r\n { label: \"Ethiopia\", code: \"ET\", phone: \"251\" },\r\n { label: \"Falkland Islands\", code: \"FK\", phone: \"500\" },\r\n { label: \"Faroe Islands\", code: \"FO\", phone: \"298\" },\r\n { label: \"Fiji Islands\", code: \"FJ\", phone: \"679\" },\r\n { label: \"Finland\", code: \"FI\", phone: \"358\" },\r\n { label: \"France\", code: \"FR\", phone: \"33\" },\r\n { label: \"French Guiana\", code: \"GF\", phone: \"594\" },\r\n { label: \"French Polynesia\", code: \"PF\", phone: \"689\" },\r\n { label: \"French Southern Territories\", code: \"TF\", phone: \"262\" },\r\n { label: \"Gabon\", code: \"GA\", phone: \"241\" },\r\n { label: \"Georgia\", code: \"GE\", phone: \"995\" },\r\n { label: \"Germany\", code: \"DE\", phone: \"49\" },\r\n { label: \"Ghana\", code: \"GH\", phone: \"233\" },\r\n { label: \"Gibraltar\", code: \"GI\", phone: \"350\" },\r\n { label: \"Greece\", code: \"GR\", phone: \"30\" },\r\n { label: \"Greenland\", code: \"GL\", phone: \"299\" },\r\n { label: \"Grenada\", code: \"GD\", phone: \"1\" },\r\n { label: \"Guadeloupe\", code: \"GP\", phone: \"590\" },\r\n { label: \"Guam\", code: \"GU\", phone: \"1\" },\r\n { label: \"Guatemala\", code: \"GT\", phone: \"502\" },\r\n { label: \"Guernsey\", code: \"GG\", phone: \"44\" },\r\n { label: \"Guinea\", code: \"GN\", phone: \"224\" },\r\n { label: \"Guinea-Bissau\", code: \"GW\", phone: \"245\" },\r\n { label: \"Guyana\", code: \"GY\", phone: \"592\" },\r\n { label: \"Haiti\", code: \"HT\", phone: \"509\" },\r\n { label: \"Heard Island and McDonald Islands\", code: \"HM\", phone: \"672\" },\r\n { label: \"Honduras\", code: \"HN\", phone: \"504\" },\r\n { label: \"Hong Kong S.A.R.\", code: \"HK\", phone: \"852\" },\r\n { label: \"Hungary\", code: \"HU\", phone: \"36\" },\r\n { label: \"Iceland\", code: \"IS\", phone: \"354\" },\r\n { label: \"India\", code: \"IN\", phone: \"91\" },\r\n { label: \"Indonesia\", code: \"ID\", phone: \"62\" },\r\n { label: \"Iran\", code: \"IR\", phone: \"98\" },\r\n { label: \"Iraq\", code: \"IQ\", phone: \"964\" },\r\n { label: \"Ireland\", code: \"IE\", phone: \"353\" },\r\n { label: \"Israel\", code: \"IL\", phone: \"972\" },\r\n { label: \"Italy\", code: \"IT\", phone: \"39\" },\r\n { label: \"Ivory Coast\", code: \"CI\", phone: \"225\" },\r\n { label: \"Jamaica\", code: \"JM\", phone: \"1\" },\r\n { label: \"Japan\", code: \"JP\", phone: \"81\" },\r\n { label: \"Jersey\", code: \"JE\", phone: \"44\" },\r\n { label: \"Jordan\", code: \"JO\", phone: \"962\" },\r\n { label: \"Kazakhstan\", code: \"KZ\", phone: \"7\" },\r\n { label: \"Kenya\", code: \"KE\", phone: \"254\" },\r\n { label: \"Kiribati\", code: \"KI\", phone: \"686\" },\r\n { label: \"Kosovo\", code: \"XK\", phone: \"383\" },\r\n { label: \"Kuwait\", code: \"KW\", phone: \"965\" },\r\n { label: \"Kyrgyzstan\", code: \"KG\", phone: \"996\" },\r\n { label: \"Laos\", code: \"LA\", phone: \"856\" },\r\n { label: \"Latvia\", code: \"LV\", phone: \"371\" },\r\n { label: \"Lebanon\", code: \"LB\", phone: \"961\" },\r\n { label: \"Lesotho\", code: \"LS\", phone: \"266\" },\r\n { label: \"Liberia\", code: \"LR\", phone: \"231\" },\r\n { label: \"Libya\", code: \"LY\", phone: \"218\" },\r\n { label: \"Liechtenstein\", code: \"LI\", phone: \"423\" },\r\n { label: \"Lithuania\", code: \"LT\", phone: \"370\" },\r\n { label: \"Luxembourg\", code: \"LU\", phone: \"352\" },\r\n { label: \"Macau S.A.R.\", code: \"MO\", phone: \"853\" },\r\n { label: \"Madagascar\", code: \"MG\", phone: \"261\" },\r\n { label: \"Malawi\", code: \"MW\", phone: \"265\" },\r\n { label: \"Malaysia\", code: \"MY\", phone: \"60\" },\r\n { label: \"Maldives\", code: \"MV\", phone: \"960\" },\r\n { label: \"Mali\", code: \"ML\", phone: \"223\" },\r\n { label: \"Malta\", code: \"MT\", phone: \"356\" },\r\n { label: \"Man (Isle of)\", code: \"IM\", phone: \"44\" },\r\n { label: \"Marshall Islands\", code: \"MH\", phone: \"692\" },\r\n { label: \"Martinique\", code: \"MQ\", phone: \"596\" },\r\n { label: \"Mauritania\", code: \"MR\", phone: \"222\" },\r\n { label: \"Mauritius\", code: \"MU\", phone: \"230\" },\r\n { label: \"Mayotte\", code: \"YT\", phone: \"262\" },\r\n { label: \"Mexico\", code: \"MX\", phone: \"52\" },\r\n { label: \"Micronesia\", code: \"FM\", phone: \"691\" },\r\n { label: \"Moldova\", code: \"MD\", phone: \"373\" },\r\n { label: \"Monaco\", code: \"MC\", phone: \"377\" },\r\n { label: \"Mongolia\", code: \"MN\", phone: \"976\" },\r\n { label: \"Montenegro\", code: \"ME\", phone: \"382\" },\r\n { label: \"Montserrat\", code: \"MS\", phone: \"1\" },\r\n { label: \"Morocco\", code: \"MA\", phone: \"212\" },\r\n { label: \"Mozambique\", code: \"MZ\", phone: \"258\" },\r\n { label: \"Myanmar\", code: \"MM\", phone: \"95\" },\r\n { label: \"Namibia\", code: \"NA\", phone: \"264\" },\r\n { label: \"Nauru\", code: \"NR\", phone: \"674\" },\r\n { label: \"Nepal\", code: \"NP\", phone: \"977\" },\r\n { label: \"Netherlands\", code: \"NL\", phone: \"31\" },\r\n { label: \"New Caledonia\", code: \"NC\", phone: \"687\" },\r\n { label: \"New Zealand\", code: \"NZ\", phone: \"64\" },\r\n { label: \"Nicaragua\", code: \"NI\", phone: \"505\" },\r\n { label: \"Niger\", code: \"NE\", phone: \"227\" },\r\n { label: \"Nigeria\", code: \"NG\", phone: \"234\" },\r\n { label: \"Niue\", code: \"NU\", phone: \"683\" },\r\n { label: \"Norfolk Island\", code: \"NF\", phone: \"672\" },\r\n { label: \"North Korea\", code: \"KP\", phone: \"850\" },\r\n { label: \"North Macedonia\", code: \"MK\", phone: \"389\" },\r\n { label: \"Northern Mariana Islands\", code: \"MP\", phone: \"1\" },\r\n { label: \"Norway\", code: \"NO\", phone: \"47\" },\r\n { label: \"Oman\", code: \"OM\", phone: \"968\" },\r\n { label: \"Pakistan\", code: \"PK\", phone: \"92\" },\r\n { label: \"Palau\", code: \"PW\", phone: \"680\" },\r\n { label: \"Palestinian Territory Occupied\", code: \"PS\", phone: \"970\" },\r\n { label: \"Panama\", code: \"PA\", phone: \"507\" },\r\n { label: \"Papua New Guinea\", code: \"PG\", phone: \"675\" },\r\n { label: \"Paraguay\", code: \"PY\", phone: \"595\" },\r\n { label: \"Peru\", code: \"PE\", phone: \"51\" },\r\n { label: \"Philippines\", code: \"PH\", phone: \"63\" },\r\n { label: \"Pitcairn Island\", code: \"PN\", phone: \"870\" },\r\n { label: \"Poland\", code: \"PL\", phone: \"48\" },\r\n { label: \"Portugal\", code: \"PT\", phone: \"351\" },\r\n { label: \"Puerto Rico\", code: \"PR\", phone: \"1\" },\r\n { label: \"Qatar\", code: \"QA\", phone: \"974\" },\r\n { label: \"Reunion\", code: \"RE\", phone: \"262\" },\r\n { label: \"Romania\", code: \"RO\", phone: \"40\" },\r\n { label: \"Russia\", code: \"RU\", phone: \"7\" },\r\n { label: \"Rwanda\", code: \"RW\", phone: \"250\" },\r\n { label: \"Saint Helena\", code: \"SH\", phone: \"290\" },\r\n { label: \"Saint Kitts and Nevis\", code: \"KN\", phone: \"1\" },\r\n { label: \"Saint Lucia\", code: \"LC\", phone: \"1\" },\r\n { label: \"Saint Pierre and Miquelon\", code: \"PM\", phone: \"508\" },\r\n { label: \"Saint Vincent and the Grenadines\", code: \"VC\", phone: \"1\" },\r\n { label: \"Saint-Barthelemy\", code: \"BL\", phone: \"590\" },\r\n { label: \"Saint-Martin (French part)\", code: \"MF\", phone: \"590\" },\r\n { label: \"Samoa\", code: \"WS\", phone: \"685\" },\r\n { label: \"San Marino\", code: \"SM\", phone: \"378\" },\r\n { label: \"Sao Tome and Principe\", code: \"ST\", phone: \"239\" },\r\n { label: \"Saudi Arabia\", code: \"SA\", phone: \"966\" },\r\n { label: \"Senegal\", code: \"SN\", phone: \"221\" },\r\n { label: \"Serbia\", code: \"RS\", phone: \"381\" },\r\n { label: \"Seychelles\", code: \"SC\", phone: \"248\" },\r\n { label: \"Sierra Leone\", code: \"SL\", phone: \"232\" },\r\n { label: \"Singapore\", code: \"SG\", phone: \"65\" },\r\n { label: \"Sint Maarten (Dutch part)\", code: \"SX\", phone: \"1721\" },\r\n { label: \"Slovakia\", code: \"SK\", phone: \"421\" },\r\n { label: \"Slovenia\", code: \"SI\", phone: \"386\" },\r\n { label: \"Solomon Islands\", code: \"SB\", phone: \"677\" },\r\n { label: \"Somalia\", code: \"SO\", phone: \"252\" },\r\n { label: \"South Africa\", code: \"ZA\", phone: \"27\" },\r\n { label: \"South Georgia\", code: \"GS\", phone: \"500\" },\r\n { label: \"South Korea\", code: \"KR\", phone: \"82\" },\r\n { label: \"South Sudan\", code: \"SS\", phone: \"211\" },\r\n { label: \"Spain\", code: \"ES\", phone: \"34\" },\r\n { label: \"Sri Lanka\", code: \"LK\", phone: \"94\" },\r\n { label: \"Sudan\", code: \"SD\", phone: \"249\" },\r\n { label: \"Suriname\", code: \"SR\", phone: \"597\" },\r\n { label: \"Svalbard and Jan Mayen Islands\", code: \"SJ\", phone: \"47\" },\r\n { label: \"Sweden\", code: \"SE\", phone: \"46\" },\r\n { label: \"Switzerland\", code: \"CH\", phone: \"41\" },\r\n { label: \"Syria\", code: \"SY\", phone: \"963\" },\r\n { label: \"Taiwan\", code: \"TW\", phone: \"886\" },\r\n { label: \"Tajikistan\", code: \"TJ\", phone: \"992\" },\r\n { label: \"Tanzania\", code: \"TZ\", phone: \"255\" },\r\n { label: \"Thailand\", code: \"TH\", phone: \"66\" },\r\n { label: \"The Bahamas\", code: \"BS\", phone: \"1\" },\r\n { label: \"The Gambia\", code: \"GM\", phone: \"220\" },\r\n { label: \"Timor-Leste\", code: \"TL\", phone: \"670\" },\r\n { label: \"Togo\", code: \"TG\", phone: \"228\" },\r\n { label: \"Tokelau\", code: \"TK\", phone: \"690\" },\r\n { label: \"Tonga\", code: \"TO\", phone: \"676\" },\r\n { label: \"Trinidad and Tobago\", code: \"TT\", phone: \"1\" },\r\n { label: \"Tunisia\", code: \"TN\", phone: \"216\" },\r\n { label: \"Turkey\", code: \"TR\", phone: \"90\" },\r\n { label: \"Turkmenistan\", code: \"TM\", phone: \"993\" },\r\n { label: \"Turks and Caicos Islands\", code: \"TC\", phone: \"1\" },\r\n { label: \"Tuvalu\", code: \"TV\", phone: \"688\" },\r\n { label: \"Uganda\", code: \"UG\", phone: \"256\" },\r\n { label: \"Ukraine\", code: \"UA\", phone: \"380\" },\r\n { label: \"United Arab Emirates\", code: \"AE\", phone: \"971\" },\r\n { label: \"United Kingdom\", code: \"GB\", phone: \"44\" },\r\n { label: \"United States\", code: \"US\", phone: \"1\" },\r\n { label: \"United States Minor Outlying Islands\", code: \"UM\", phone: \"1\" },\r\n { label: \"Uruguay\", code: \"UY\", phone: \"598\" },\r\n { label: \"Uzbekistan\", code: \"UZ\", phone: \"998\" },\r\n { label: \"Vanuatu\", code: \"VU\", phone: \"678\" },\r\n { label: \"Vatican City State (Holy See)\", code: \"VA\", phone: \"379\" },\r\n { label: \"Venezuela\", code: \"VE\", phone: \"58\" },\r\n { label: \"Vietnam\", code: \"VN\", phone: \"84\" },\r\n { label: \"Virgin Islands (British)\", code: \"VG\", phone: \"1\" },\r\n { label: \"Virgin Islands (US)\", code: \"VI\", phone: \"1\" },\r\n { label: \"Wallis and Futuna Islands\", code: \"WF\", phone: \"681\" },\r\n { label: \"Western Sahara\", code: \"EH\", phone: \"212\" },\r\n { label: \"Yemen\", code: \"YE\", phone: \"967\" },\r\n { label: \"Zambia\", code: \"ZM\", phone: \"260\" },\r\n { label: \"Zimbabwe\", code: \"ZW\", phone: \"263\" },\r\n];\r\n","import React, { useState, useEffect, useRef } from \"react\";\r\nimport { countries } from \"../../../data/countries\";\r\nimport { ChevronDown, Search } from \"lucide-react\";\r\nimport InputLabel from \"./InputLabel\";\r\n\r\nexport default function PhoneInput({\r\n label = \"\",\r\n value = \"\",\r\n name = \"\",\r\n parentClass = \"\",\r\n onChange,\r\n disabled = false,\r\n required = false,\r\n placeholder = \"Phone number\",\r\n search = false,\r\n countriesList = false,\r\n defaultCountry = \"\",\r\n}) {\r\n const find_country_with_code = (value) => {\r\n return countries.find((obj) => obj.code == value);\r\n };\r\n\r\n const [selectedCountry, setSelectedCountry] = useState(\r\n find_country_with_code(defaultCountry) || countries[0],\r\n );\r\n const [fullNumber, setFullNumber] = useState(\"\");\r\n const [open, setOpen] = useState(false);\r\n const [searchTerm, setSearchTerm] = useState(\"\");\r\n const dropdownRef = useRef();\r\n\r\n // Match prefix when value starts with +code\r\n useEffect(() => {\r\n if (typeof value === \"string\" && value.startsWith(\"+\")) {\r\n const match = countries\r\n .filter((c) => value.startsWith(\"+\" + c.phone))\r\n .sort((a, b) => b.phone.length - a.phone.length)[0];\r\n if (match) {\r\n setSelectedCountry(match);\r\n setFullNumber(value.replace(\"+\" + match.phone, \"\"));\r\n return;\r\n }\r\n }\r\n setFullNumber(value);\r\n }, [value]);\r\n\r\n const handleNumberChange = (e) => {\r\n const input = e.target.value.replace(/\\D/g, \"\");\r\n setFullNumber(input);\r\n if (selectedCountry && onChange) {\r\n onChange(\"+\" + selectedCountry.phone + input);\r\n }\r\n };\r\n\r\n const handleCountrySelect = (country) => {\r\n setSelectedCountry(country);\r\n if (onChange) onChange(\"+\" + country.phone + fullNumber);\r\n setOpen(false);\r\n setSearchTerm(\"\");\r\n };\r\n\r\n // 🖱️ Close dropdown on outside click\r\n useEffect(() => {\r\n const handleClickOutside = (e) => {\r\n if (dropdownRef.current && !dropdownRef.current.contains(e.target))\r\n setOpen(false);\r\n };\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, []);\r\n\r\n const filteredCountries = countries.filter(\r\n (c) =>\r\n c.label.toLowerCase().includes(searchTerm.toLowerCase()) ||\r\n c.phone.includes(searchTerm),\r\n );\r\n\r\n if (!countriesList) {\r\n const handleInputChange = (e) => {\r\n const input = e.target.value.replace(/[^+\\d]/g, \"\");\r\n const formatted = input.startsWith(\"+\")\r\n ? \"+\" + input.replace(/[+]/g, \"\").slice(0)\r\n : input;\r\n onChange(formatted);\r\n };\r\n\r\n return (\r\n <>\r\n <div key={name} className={parentClass || \"col-span-12\"}>\r\n <InputLabel label={label} required={required} />\r\n <input\r\n type=\"text\"\r\n value={value}\r\n onChange={handleInputChange}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n required={required}\r\n className=\"w-full h-10 px-3 text-sm border border-gray-300 dark:border-gray-600 rounded-md \r\n bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:outline-none \r\n focus:ring-1 focus:ring-blue-300 dark:focus:ring-blue-200\"\r\n inputMode=\"tel\"\r\n pattern=\"^\\+\\d{1,15}$\"\r\n />\r\n </div>\r\n </>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <div key={name} className={parentClass || \"col-span-12\"}>\r\n <InputLabel label={label} required={required} />\r\n <div className=\"relative \" ref={dropdownRef}>\r\n {/* Input container */}\r\n <div\r\n className={`h-[40px] flex items-center border rounded-md px-2 bg-white dark:bg-gray-700 transition-all\r\n ${\r\n open\r\n ? \"ring-0.5 ring-blue-100 border-blue-300\"\r\n : \"border-gray-300 dark:border-gray-600\"\r\n }\r\n ${disabled ? \"opacity-60 cursor-not-allowed\" : \"\"}`}\r\n >\r\n {/* Flag & dropdown */}\r\n <button\r\n type=\"button\"\r\n disabled={disabled}\r\n onClick={() => setOpen(!open)}\r\n className=\"flex items-center gap-1 pr-2 border-r border-gray-300 dark:border-gray-700 focus:outline-none\"\r\n >\r\n {selectedCountry ? (\r\n <img\r\n src={`https://flagcdn.com/w20/${selectedCountry.code.toLowerCase()}.png`}\r\n alt={selectedCountry.code}\r\n className=\"w-5 h-3 object-cover\"\r\n />\r\n ) : (\r\n <span className=\"text-gray-400 text-xs\">🌐</span>\r\n )}\r\n <ChevronDown className=\"w-3 h-3 text-gray-500\" />\r\n </button>\r\n\r\n {/* Country code */}\r\n {selectedCountry && (\r\n <span className=\"ml-2 text-sm text-gray-700 dark:text-gray-200 whitespace-nowrap\">\r\n +{selectedCountry.phone}\r\n </span>\r\n )}\r\n\r\n {/* Number input */}\r\n <input\r\n type=\"tel\"\r\n value={fullNumber}\r\n onChange={handleNumberChange}\r\n required={required}\r\n disabled={disabled || !selectedCountry}\r\n placeholder={!selectedCountry ? \"Select a country\" : placeholder}\r\n className=\"flex-1 ml-2 bg-transparent outline-none text-sm text-gray-800 dark:text-gray-100 placeholder-gray-400\"\r\n />\r\n\r\n {/* Hidden input for native browser validation */}\r\n <input\r\n type=\"tel\"\r\n required={required}\r\n tabIndex={-1}\r\n readOnly\r\n value={\r\n selectedCountry && fullNumber\r\n ? \"+\" + selectedCountry.phone + fullNumber\r\n : \"\"\r\n }\r\n style={{\r\n position: \"absolute\",\r\n opacity: 0,\r\n pointerEvents: \"none\",\r\n height: 0,\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Dropdown */}\r\n {open && (\r\n <div className=\"absolute top-full left-0 w-full mt-1 border border-gray-300 dark:border-gray-700 rounded-md bg-white dark:bg-gray-700 shadow-lg z-50 max-h-60 overflow-y-auto\">\r\n {search && (\r\n <div className=\"p-2 border-b border-gray-200 dark:border-gray-700\">\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-gray-400\" />\r\n <input\r\n type=\"text\"\r\n value={searchTerm}\r\n onChange={(e) => setSearchTerm(e.target.value)}\r\n placeholder=\"Search country...\"\r\n className=\"w-full pl-9 pr-3 py-2 text-sm border rounded-md bg-white dark:bg-gray-800 dark:text-white placeholder-gray-500 dark:placeholder-gray-400 focus:outline-none \"\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {filteredCountries.map((c) => (\r\n <button\r\n key={c.code}\r\n type=\"button\"\r\n onClick={() => handleCountrySelect(c)}\r\n className=\"w-full flex items-center gap-2 px-2 py-1 text-sm hover:bg-blue-50 dark:hover:bg-gray-700 text-gray-800 dark:text-gray-100\"\r\n >\r\n <img\r\n src={`https://flagcdn.com/w20/${c.code.toLowerCase()}.png`}\r\n alt={c.code}\r\n className=\"w-5 h-3 object-cover\"\r\n />\r\n <span>\r\n {c.label} (+{c.phone})\r\n </span>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n","import React, { useState } from \"react\";\r\nimport InputLabel from \"./InputLabel\";\r\n\r\nconst TextArea = React.forwardRef(\r\n ({ className = \"\", label, required, ...props }, ref) => {\r\n const combinedClassName = `\r\n placeholder-gray-400 dark:placeholder-gray-400\r\n ${className}\r\n `.trim();\r\n\r\n return (\r\n <>\r\n <div key={props.name} className={props.parentClass || \"col-span-12\"}>\r\n <InputLabel label={label} required={required} />\r\n <div className=\"relative\">\r\n <textarea\r\n className={combinedClassName}\r\n ref={ref}\r\n required={required}\r\n {...props}\r\n />\r\n </div>\r\n </div>\r\n </>\r\n );\r\n },\r\n);\r\n\r\nTextArea.displayName = \"TextArea\";\r\n\r\nexport { TextArea };\r\n","import { Icon } from \"@iconify/react\";\r\nimport React, { useState, useEffect, useRef } from \"react\";\r\nimport InputLabel from \"./InputLabel\";\r\nimport Button from \"../../Button/Button\";\r\n\r\nconst ImagePicker = ({\r\n label = \"\",\r\n value = null,\r\n onChange,\r\n required = false,\r\n accept = \"image/*\",\r\n id,\r\n dragDrop = false,\r\n name = \"\",\r\n parentClass = \"\",\r\n}) => {\r\n const [image, setImage] = useState(value);\r\n const [isDragging, setIsDragging] = useState(false);\r\n const inputRef = useRef(null);\r\n\r\n useEffect(() => {\r\n if (value instanceof File) {\r\n setImage({ file: value, preview: URL.createObjectURL(value) });\r\n } else if (value?.preview) {\r\n setImage(value);\r\n } else {\r\n setImage(value);\r\n }\r\n\r\n // Cleanup function\r\n return () => {\r\n if (image?.preview && image.preview.startsWith(\"blob:\")) {\r\n URL.revokeObjectURL(image.preview);\r\n }\r\n };\r\n }, [value]);\r\n\r\n const handleFileChange = (files) => {\r\n if (!files || files.length === 0) {\r\n return;\r\n }\r\n\r\n const file = files[0];\r\n const preview = URL.createObjectURL(file);\r\n const imgObj = { file, preview };\r\n\r\n // Cleanup previous preview\r\n if (image?.preview && image.preview.startsWith(\"blob:\")) {\r\n URL.revokeObjectURL(image.preview);\r\n }\r\n\r\n setImage(imgObj);\r\n onChange?.(file);\r\n };\r\n\r\n const removeImage = (e) => {\r\n if (e) {\r\n e.stopPropagation(); // Prevent triggering the parent click\r\n }\r\n\r\n // Cleanup preview\r\n if (image?.preview && image.preview.startsWith(\"blob:\")) {\r\n URL.revokeObjectURL(image.preview);\r\n }\r\n\r\n setImage(null);\r\n onChange?.(null);\r\n\r\n // Reset input value\r\n if (inputRef.current) {\r\n inputRef.current.value = \"\";\r\n }\r\n };\r\n\r\n // Drag events\r\n const handleDragOver = (e) => {\r\n if (!dragDrop) return;\r\n e.preventDefault();\r\n setIsDragging(true);\r\n };\r\n\r\n const handleDragLeave = (e) => {\r\n if (!dragDrop) return;\r\n e.preventDefault();\r\n setIsDragging(false);\r\n };\r\n\r\n const handleDrop = (e) => {\r\n if (!dragDrop) return;\r\n e.preventDefault();\r\n setIsDragging(false);\r\n handleFileChange(e.dataTransfer.files);\r\n };\r\n\r\n const handleButtonClick = () => {\r\n inputRef.current.click();\r\n };\r\n\r\n return (\r\n <>\r\n <div key={name} className={parentClass || \"col-span-12\"}>\r\n <InputLabel label={label} required={required} />\r\n <div\r\n className={`relative rounded-md p-2 transition-all ${\r\n isDragging\r\n ? \"border-2 border-dashed border-blue-500 bg-blue-50 dark:bg-blue-900/20\"\r\n : \"border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800\"\r\n }`}\r\n onDragOver={handleDragOver}\r\n onDragLeave={handleDragLeave}\r\n onDrop={handleDrop}\r\n >\r\n {/* Hidden file input */}\r\n <input\r\n ref={inputRef}\r\n id={id}\r\n type=\"file\"\r\n accept={accept}\r\n onChange={(e) => handleFileChange(e.target.files)}\r\n required={required && !image}\r\n className=\"absolute opacity-0 right-[50%] top-[80%] -translate-y-1/2 pointer-events-none h-[10px]\"\r\n />\r\n\r\n {/* Content */}\r\n <div\r\n className={`flex items-center space-x-4 transition-all ${\r\n isDragging ? \"opacity-50\" : \"\"\r\n }`}\r\n >\r\n {image ? (\r\n // Image preview with close button\r\n <div className=\"relative group\">\r\n <img\r\n src={image.preview || image}\r\n alt=\"preview\"\r\n className=\"object-cover w-20 h-20 rounded-full shadow-md\"\r\n />\r\n {/* Close button */}\r\n {!required && (\r\n <button\r\n type=\"button\"\r\n onClick={removeImage}\r\n className=\"absolute top-0 -right-2 bg-red-500 text-white rounded-full p-1 shadow-lg hover:bg-red-600 transition-colors focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2\"\r\n aria-label=\"Remove image\"\r\n >\r\n <Icon icon=\"mdi:close\" className=\"w-3 h-3\" />\r\n </button>\r\n )}\r\n </div>\r\n ) : (\r\n // Placeholder icon\r\n <div className=\"rounded-full bg-gray-100 dark:bg-gray-700 h-20 w-20 flex items-center justify-center\">\r\n <Icon\r\n icon=\"ri:image-add-fill\"\r\n className=\"text-gray-400 w-10 h-10\"\r\n />\r\n </div>\r\n )}\r\n\r\n <div className=\"flex flex-col items-center space-y-1\">\r\n <Button\r\n type=\"button\"\r\n onClick={handleButtonClick}\r\n variant=\"outlined\"\r\n color=\"default\"\r\n >\r\n {image ? \"Change Image\" : \"Select Image\"}\r\n </Button>\r\n\r\n {/* Optional drag & drop hint */}\r\n {dragDrop && !image && (\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\r\n or drag and drop\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Drag overlay text */}\r\n {dragDrop && isDragging && (\r\n <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none bg-blue-500/10 rounded-md\">\r\n <span className=\"text-blue-600 dark:text-blue-400 font-semibold text-lg\">\r\n Drop image here\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default ImagePicker;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { Icon } from \"@iconify/react\";\r\nimport InputLabel from \"./InputLabel\";\r\n\r\nconst Input = React.forwardRef(\r\n (\r\n {\r\n label,\r\n required,\r\n parentClass = \"\",\r\n className = \"\",\r\n type = \"text\",\r\n onKeyDown,\r\n negativeNumberAllow = true,\r\n defaultValue = \"\",\r\n field = {},\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n const [showPassword, setShowPassword] = useState(false);\r\n\r\n const handleKeyDown = (e) => {\r\n if (type === \"number\") {\r\n const blockedKeys = [\"e\", \"E\", \"+\"];\r\n\r\n // Block e, E, +\r\n if (blockedKeys.includes(e.key)) {\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n // Block negative sign if not allowed\r\n if (negativeNumberAllow == false && e.key === \"-\") {\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n // Block arrow up/down from changing value\r\n if ([\"ArrowUp\", \"ArrowDown\"].includes(e.key)) {\r\n e.preventDefault();\r\n return;\r\n }\r\n }\r\n\r\n onKeyDown?.(e);\r\n };\r\n\r\n const combinedClassName = `\r\n h-10 placeholder-gray-400 dark:placeholder-gray-400\r\n ${type === \"password\" ? \"pr-10\" : \"\"}\r\n ${type === \"number\" ? \"no-spinner\" : \"\"}\r\n ${className}\r\n `.trim();\r\n\r\n useEffect(() => {\r\n if (defaultValue) {\r\n let value = props.value || defaultValue;\r\n setTimeout(() => {\r\n props.onChange?.({ target: { value: value } });\r\n }, 100);\r\n }\r\n }, [defaultValue]);\r\n\r\n return (\r\n <>\r\n <div key={props.name} className={parentClass || \"col-span-12\"}>\r\n <InputLabel\r\n label={label}\r\n required={required}\r\n infoText={field.infoText}\r\n />\r\n <div className=\"relative\">\r\n <input\r\n type={type === \"password\" && showPassword ? \"text\" : type}\r\n ref={ref}\r\n required={required}\r\n onKeyDown={handleKeyDown}\r\n className={combinedClassName}\r\n {...props}\r\n />\r\n\r\n {type === \"password\" && (\r\n <button\r\n type=\"button\"\r\n tabIndex={-1}\r\n onClick={() => setShowPassword((prev) => !prev)}\r\n className=\"absolute inset-y-0 right-3 flex items-center text-gray-400 hover:text-gray-600 dark:text-gray-400 dark:hover:text-gray-200\"\r\n >\r\n <Icon\r\n icon={\r\n showPassword ? \"mdi:eye-outline\" : \"mdi:eye-off-outline\"\r\n }\r\n className=\"w-5 h-5\"\r\n />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </>\r\n );\r\n },\r\n);\r\n\r\nInput.displayName = \"Input\";\r\n\r\nexport { Input };\r\n","import React from \"react\";\r\nimport { Editor } from \"@tinymce/tinymce-react\";\r\nimport InputLabel from \"./InputLabel\";\r\n\r\nconst TinyEditor = ({\r\n key,\r\n editorKey = \"\",\r\n value = \"\",\r\n onChange,\r\n label = \"\",\r\n required = false,\r\n placeholder = \"\",\r\n parentClass = \"col-span-12\",\r\n height = 400,\r\n inline = false,\r\n disabled = false,\r\n plugins,\r\n toolbar,\r\n menubar = false,\r\n fontFamily = \"Inter, sans-serif\",\r\n initConfig = {},\r\n imageUploadHandler, // ✅ Promise function passed from parent\r\n}) => {\r\n const defaultPlugins = [\r\n \"advlist\",\r\n \"autolink\",\r\n \"lists\",\r\n \"link\",\r\n \"image\",\r\n \"charmap\",\r\n \"preview\",\r\n \"anchor\",\r\n \"searchreplace\",\r\n \"visualblocks\",\r\n \"code\",\r\n \"fullscreen\",\r\n \"insertdatetime\",\r\n \"media\",\r\n \"table\",\r\n \"help\",\r\n \"wordcount\",\r\n ];\r\n\r\n const defaultToolbar =\r\n \"undo redo | blocks | bold italic underline forecolor backcolor | \" +\r\n \"alignleft aligncenter alignright alignjustify | \" +\r\n \"bullist numlist outdent indent | link image media table | \" +\r\n \"removeformat | code fullscreen preview\";\r\n\r\n // ✅ Handle Image Upload via Promise\r\n const handleImageUpload = (blobInfo) => {\r\n return new Promise((resolve, reject) => {\r\n if (!imageUploadHandler) {\r\n // fallback to base64 if no handler provided\r\n resolve(`data:${blobInfo.blob().type};base64,${blobInfo.base64()}`);\r\n return;\r\n }\r\n\r\n imageUploadHandler(blobInfo)\r\n .then((url) => {\r\n if (!url) {\r\n reject(\"Upload failed: No URL returned\");\r\n } else {\r\n resolve(url);\r\n }\r\n })\r\n .catch((error) => {\r\n reject(\r\n typeof error === \"string\"\r\n ? error\r\n : error?.message || \"Image upload failed\",\r\n );\r\n });\r\n });\r\n };\r\n\r\n return (\r\n <div key={key} className={parentClass}>\r\n {label && <InputLabel label={label} required={required} />}\r\n\r\n <Editor\r\n apiKey={editorKey}\r\n value={value}\r\n disabled={disabled}\r\n init={{\r\n height,\r\n inline,\r\n menubar,\r\n branding: false,\r\n statusbar: true,\r\n automatic_uploads: true,\r\n images_upload_handler: handleImageUpload,\r\n plugins: plugins ?? defaultPlugins,\r\n toolbar: toolbar ?? defaultToolbar,\r\n placeholder,\r\n content_style: `\r\n body {\r\n font-family: ${fontFamily};\r\n }\r\n `,\r\n ...initConfig,\r\n }}\r\n onEditorChange={(content) => {\r\n if (onChange) {\r\n onChange(content);\r\n }\r\n }}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default TinyEditor;\r\n","import React from \"react\";\r\nimport InputLabel from \"./InputLabel\";\r\n\r\nconst Checkbox = ({\r\n name = \"\",\r\n label = \"\", // label for single checkbox\r\n options = [], // array of { label, value } for multiple\r\n value = null, // boolean for single, array for multiple, or string for single select\r\n onChange,\r\n disabled = false,\r\n required = false,\r\n parentClass = \"col-span-12\",\r\n className = \"\",\r\n multiSelect = false, // ✅ if true, only one option can be selected (like radio)\r\n}) => {\r\n // Detect if multiple options are present\r\n const multiple = Array.isArray(options) && options.length > 0;\r\n\r\n // Check if a value is selected\r\n const isChecked = (optionValue) => {\r\n if (multiple) {\r\n if (!multiSelect) return value === optionValue;\r\n return Array.isArray(value) && value.includes(optionValue);\r\n }\r\n return Boolean(value);\r\n };\r\n\r\n // Handle change for single checkbox\r\n const handleSingleChange = (e) => {\r\n onChange?.(e.target.checked, name);\r\n };\r\n\r\n // Handle change for multiple checkboxes\r\n const handleMultipleChange = (optionValue, checked) => {\r\n if (!onChange) return;\r\n\r\n if (!multiSelect) {\r\n if (checked) {\r\n onChange(optionValue, name);\r\n } else {\r\n onChange(\"\", name);\r\n }\r\n // Only allow one selected\r\n } else {\r\n const newValue = Array.isArray(value) ? [...value] : [];\r\n if (checked) {\r\n if (!newValue.includes(optionValue)) newValue.push(optionValue);\r\n } else {\r\n const index = newValue.indexOf(optionValue);\r\n if (index > -1) newValue.splice(index, 1);\r\n }\r\n onChange(newValue, name);\r\n }\r\n };\r\n\r\n // ---------------- JSX ----------------\r\n if (multiple) {\r\n // Multiple options\r\n return (\r\n <>\r\n <div className={`${parentClass}`}>\r\n <InputLabel label={label} required={required} />\r\n <div className={`flex flex-col space-y-2`}>\r\n {options.map((opt, idx) => (\r\n <div key={opt.value || opt.label} className=\"flex items-center\">\r\n <input\r\n type=\"checkbox\"\r\n name={name}\r\n value={opt.value}\r\n checked={isChecked(opt.value)}\r\n disabled={disabled || opt.disabled}\r\n required={required && idx === 0}\r\n onChange={(e) =>\r\n handleMultipleChange(opt.value, e.target.checked)\r\n }\r\n key={name}\r\n className={`h-4 w-4 cursor-pointer text-blue-600 border-gray-300 rounded focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-400 ${className}`}\r\n />\r\n {opt.label && (\r\n <label\r\n htmlFor={name}\r\n className=\"ml-2 text-sm text-gray-700 dark:text-gray-200 select-none\"\r\n >\r\n {opt.label}\r\n </label>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </>\r\n );\r\n }\r\n\r\n // Single checkbox\r\n return (\r\n <div className={`flex items-center ${parentClass}`}>\r\n <input\r\n type=\"checkbox\"\r\n name={name}\r\n checked={isChecked()}\r\n disabled={disabled}\r\n required={required}\r\n onChange={handleSingleChange}\r\n className={`h-4 w-4 text-blue-600 cursor-pointer border-gray-300 rounded focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-400 ${className}`}\r\n />\r\n {label && (\r\n <label\r\n htmlFor={name}\r\n className=\"ml-2 text-sm text-gray-700 dark:text-gray-200 select-none\"\r\n >\r\n {label}\r\n </label>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default Checkbox;\r\n","import { Icon } from \"@iconify/react\";\r\nimport React, { useState, useEffect, useRef } from \"react\";\r\nimport InputLabel from \"./InputLabel\";\r\nimport Button from \"../../Button/Button\";\r\n\r\nconst AudioPicker = ({\r\n label = \"\",\r\n value = null,\r\n onChange,\r\n required = false,\r\n accept = \"audio/*\",\r\n id,\r\n dragDrop = false,\r\n name = \"\",\r\n parentClass = \"\",\r\n}) => {\r\n const [audio, setAudio] = useState(null);\r\n const [isDragging, setIsDragging] = useState(false);\r\n const inputRef = useRef(null);\r\n\r\n // Sync external value\r\n useEffect(() => {\r\n if (!value) {\r\n cleanupAudio();\r\n setAudio(null);\r\n return;\r\n }\r\n\r\n if (value instanceof File) {\r\n const preview = URL.createObjectURL(value);\r\n setAudio({ file: value, preview });\r\n\r\n return () => {\r\n URL.revokeObjectURL(preview);\r\n };\r\n } else if (typeof value === \"string\") {\r\n setAudio({ preview: value });\r\n } else if (value?.preview) {\r\n setAudio(value);\r\n }\r\n }, [value]);\r\n\r\n // Cleanup function\r\n const cleanupAudio = () => {\r\n if (audio?.preview && audio.preview.startsWith(\"blob:\")) {\r\n URL.revokeObjectURL(audio.preview);\r\n }\r\n };\r\n\r\n const handleFileChange = (files) => {\r\n if (!files || files.length === 0) {\r\n return;\r\n }\r\n\r\n const file = files[0];\r\n const preview = URL.createObjectURL(file);\r\n\r\n // Cleanup previous preview\r\n cleanupAudio();\r\n setAudio({ file, preview });\r\n onChange?.(file);\r\n };\r\n\r\n const removeAudio = (e) => {\r\n if (e) {\r\n e.stopPropagation();\r\n }\r\n\r\n cleanupAudio();\r\n setAudio(null);\r\n onChange?.(null);\r\n\r\n // Reset input value\r\n if (inputRef.current) {\r\n inputRef.current.value = \"\";\r\n }\r\n };\r\n\r\n // Drag events\r\n const handleDragOver = (e) => {\r\n if (!dragDrop) return;\r\n e.preventDefault();\r\n setIsDragging(true);\r\n };\r\n\r\n const handleDragLeave = (e) => {\r\n if (!dragDrop) return;\r\n e.preventDefault();\r\n setIsDragging(false);\r\n };\r\n\r\n const handleDrop = (e) => {\r\n if (!dragDrop) return;\r\n e.preventDefault();\r\n setIsDragging(false);\r\n handleFileChange(e.dataTransfer.files);\r\n };\r\n\r\n const handleButtonClick = () => {\r\n inputRef.current.click();\r\n };\r\n\r\n return (\r\n <div key={name} className={parentClass || \"col-span-12\"}>\r\n <InputLabel label={label} required={required} />\r\n\r\n <div\r\n className={`relative rounded-lg p-2 transition-all ${\r\n isDragging\r\n ? \"border-2 border-dashed border-blue-500 bg-blue-50 dark:bg-blue-900/20\"\r\n : \"border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800\"\r\n }`}\r\n onDragOver={handleDragOver}\r\n onDragLeave={handleDragLeave}\r\n onDrop={handleDrop}\r\n >\r\n {/* Hidden file input */}\r\n <input\r\n ref={inputRef}\r\n id={id}\r\n type=\"file\"\r\n accept={accept}\r\n onChange={(e) => handleFileChange(e.target.files)}\r\n required={required && !audio}\r\n className=\"absolute opacity-0 right-[50%] top-[80%] -translate-y-1/2 pointer-events-none h-[10px]\"\r\n />\r\n\r\n {/* Content */}\r\n <div\r\n className={`flex items-center space-x-4 transition-all ${\r\n isDragging ? \"opacity-50\" : \"\"\r\n }`}\r\n >\r\n {audio ? (\r\n // Audio player with close button and change button\r\n <div className=\"flex items-center space-x-4\">\r\n {/* Close button */}\r\n <div className=\"relative w-full\">\r\n {!required && (\r\n <button\r\n type=\"button\"\r\n onClick={removeAudio}\r\n className=\"absolute top-0 -right-2 bg-red-500 text-white rounded-full p-1 shadow-lg hover:bg-red-600 transition-colors z-10 focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2 dark:focus:ring-offset-gray-800\"\r\n aria-label=\"Remove audio\"\r\n >\r\n <Icon icon=\"mdi:close\" className=\"w-3 h-3\" />\r\n </button>\r\n )}\r\n\r\n {/* Audio player */}\r\n <audio\r\n key={audio.preview}\r\n src={audio.preview}\r\n controls\r\n controlsList=\"nodownload\"\r\n />\r\n </div>\r\n <Button type=\"button\" onClick={handleButtonClick}>\r\n <span>Change Audio File</span>\r\n </Button>\r\n </div>\r\n ) : (\r\n // Empty state with upload button\r\n <div className=\"flex items-center justify-center space-x-4\">\r\n <div className=\"rounded-full bg-gray-100 dark:bg-gray-700 h-20 w-20 flex items-center justify-center\">\r\n <Icon icon=\"mdi:music\" className=\"text-gray-400 w-10 h-10\" />\r\n </div>\r\n\r\n <Button\r\n type=\"button\"\r\n onClick={handleButtonClick}\r\n variant=\"outlined\"\r\n >\r\n <span>Choose Audio File</span>\r\n </Button>\r\n\r\n {/* Drag & drop hint */}\r\n {dragDrop && (\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\r\n or drag and drop your audio file here\r\n </p>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Drag overlay */}\r\n {dragDrop && isDragging && !audio && (\r\n <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none bg-blue-500/10 rounded-lg\">\r\n <span className=\"text-blue-600 dark:text-blue-400 font-semibold text-lg bg-white dark:bg-gray-800 px-4 py-2 rounded-lg shadow-lg\">\r\n Drop audio here\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default AudioPicker;\r\n","import { useEffect } from \"react\";\r\nimport { X } from \"lucide-react\";\r\n\r\nconst ImagePreview = ({ src, alt = \"preview\", isOpen, setIsOpen }) => {\r\n const closePreview = () => setIsOpen(false);\r\n\r\n // Handle ESC key + prevent body scroll\r\n useEffect(() => {\r\n const handleEsc = (e) => {\r\n if (e.key === \"Escape\") closePreview();\r\n };\r\n\r\n if (isOpen) {\r\n document.body.style.overflow = \"hidden\";\r\n document.addEventListener(\"keydown\", handleEsc);\r\n }\r\n\r\n return () => {\r\n document.body.style.overflow = \"\";\r\n document.removeEventListener(\"keydown\", handleEsc);\r\n };\r\n }, [isOpen]);\r\n\r\n return (\r\n <>\r\n {/* Fullscreen Preview */}\r\n <div\r\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/70 dark:bg-black/80 \r\n backdrop-blur-sm animate-in fade-in duration-200\"\r\n onClick={closePreview}\r\n >\r\n {/* Close Button */}\r\n <button\r\n onClick={closePreview}\r\n className=\"absolute top-4 right-4 bg-white dark:bg-gray-800 text-gray-800 dark:text-gray-200\r\n hover:bg-gray-100 dark:hover:bg-gray-700 rounded-full p-2 shadow-lg transition\"\r\n >\r\n <X size={20} />\r\n </button>\r\n\r\n {/* Image Container */}\r\n <div\r\n className=\"max-w-5xl w-full px-4 transform transition-all duration-200 scale-95 animate-in zoom-in-95\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {/* Large Image */}\r\n <img\r\n src={src}\r\n alt={alt}\r\n className=\"w-full max-h-[90vh] object-contain rounded-xl\"\r\n />\r\n </div>\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default ImagePreview;\r\n","import { User } from \"lucide-react\";\r\nimport React, { useState } from \"react\";\r\nimport ImagePreview from \"../../Table/components/ImagePreview\";\r\n\r\nconst GroupRow = ({ col, data }) => {\r\n let title = data[col.titleKey];\r\n let subtitle = data[col.subtitleKey];\r\n let image = data[col.imageKey];\r\n let fallback_icon = col.fallback_icon;\r\n\r\n // image preview\r\n const [targetImage, setTargetImage] = useState(null);\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n const openPreview = (image) => {\r\n if (image && image.src instanceof File) {\r\n image = { ...image, src: URL.createObjectURL(image.src) };\r\n }\r\n setTargetImage(image);\r\n setIsOpen(true);\r\n };\r\n\r\n return (\r\n <>\r\n {isOpen && (\r\n <ImagePreview\r\n src={targetImage.src}\r\n alt={targetImage.alt}\r\n isOpen={isOpen}\r\n setIsOpen={setIsOpen}\r\n />\r\n )}\r\n\r\n <div\r\n className={`col-span-12 flex items-center space-x-4 p-4 rounded-xl \r\n bg-gray-100 dark:bg-gray-900 \r\n ${col.blockClass}`}\r\n >\r\n {image ? (\r\n <img\r\n src={image instanceof File ? URL.createObjectURL(image) : image}\r\n alt={title}\r\n onClick={() => openPreview({ src: image, alt: title })}\r\n className=\"w-16 h-16 cursor-pointer rounded-full object-cover border-2 border-gray-200 dark:border-gray-700\"\r\n />\r\n ) : fallback_icon ? (\r\n fallback_icon instanceof Function ? (\r\n fallback_icon(data)\r\n ) : (\r\n fallback_icon\r\n )\r\n ) : (\r\n <div className=\"w-16 h-16 flex items-center justify-center rounded-full border-2 border-gray-300 dark:border-gray-700 bg-gray-200 dark:bg-gray-600\">\r\n <User className=\"w-8 h-8 text-gray-400\" />\r\n </div>\r\n )}\r\n\r\n <div>\r\n <h3 className=\"text-xl font-semibold text-gray-900 dark:text-white\">\r\n {title}\r\n </h3>\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">{subtitle}</p>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default GroupRow;\r\n","import { User } from \"lucide-react\";\r\nimport React, { useState } from \"react\";\r\nimport ImagePreview from \"../../Table/components/ImagePreview\";\r\n\r\nconst CardGroup = ({ col, data }) => {\r\n let title = data[col.titleKey];\r\n let subtitle = data[col.subtitleKey];\r\n let image = data[col.imageKey];\r\n let label = col.label;\r\n let Icon = col?.icon;\r\n let fallback_icon = col.fallback_icon;\r\n\r\n // image preview\r\n const [targetImage, setTargetImage] = useState(null);\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n const openPreview = (image) => {\r\n if (image && image.src instanceof File) {\r\n image = { ...image, src: URL.createObjectURL(image.src) };\r\n }\r\n setTargetImage(image);\r\n setIsOpen(true);\r\n };\r\n\r\n return (\r\n <>\r\n {isOpen && (\r\n <ImagePreview\r\n src={targetImage.src}\r\n alt={targetImage.alt}\r\n isOpen={isOpen}\r\n setIsOpen={setIsOpen}\r\n />\r\n )}\r\n\r\n <div\r\n className={`col-span-12 flex items-center space-x-4 p-4 rounded-xl \r\n bg-gray-100 dark:bg-gray-900 \r\n ${col.blockClass}`}\r\n >\r\n {Icon && <div className=\"flex-shrink-0\">{Icon}</div>}\r\n\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium text-gray-500 dark:text-gray-400\">\r\n {label}\r\n </p>\r\n\r\n <div className=\"flex items-center\">\r\n {image ? (\r\n <img\r\n src={image instanceof File ? URL.createObjectURL(image) : image}\r\n alt={title}\r\n onClick={() => openPreview({ src: image, alt: title })}\r\n className=\"w-8 h-8 cursor-pointer rounded-full object-cover border-2 border-gray-200 dark:border-gray-700\"\r\n />\r\n ) : fallback_icon ? (\r\n fallback_icon instanceof Function ? (\r\n fallback_icon(data)\r\n ) : (\r\n fallback_icon\r\n )\r\n ) : (\r\n <div className=\"w-8 h-8 flex items-center justify-center rounded-full border-2 border-gray-300 dark:border-gray-700 bg-gray-200 dark:bg-gray-600\">\r\n <User className=\"w-6 h-6 text-gray-400\" />\r\n </div>\r\n )}\r\n\r\n <div className=\"ml-2\">\r\n <p className=\"mb-0 text-sm text-gray-900 dark:text-white break-words\">\r\n {title}\r\n </p>\r\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\r\n {subtitle}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n};\r\nexport default CardGroup;\r\n","import React from \"react\";\r\n\r\nconst BADGE_COLORS = {\r\n blue: {\r\n bg: \"bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300\",\r\n border:\r\n \"border border-blue-300 text-blue-700 dark:border-blue-700 dark:text-blue-300\",\r\n },\r\n teal: {\r\n bg: \"bg-teal-100 text-teal-800 dark:bg-teal-900/30 dark:text-teal-300\",\r\n border:\r\n \"border border-teal-300 text-teal-700 dark:border-teal-700 dark:text-teal-300\",\r\n },\r\n purple: {\r\n bg: \"bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300\",\r\n border:\r\n \"border border-purple-300 text-purple-700 dark:border-purple-700 dark:text-purple-300\",\r\n },\r\n yellow: {\r\n bg: \"bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-300\",\r\n border:\r\n \"border border-yellow-300 text-yellow-700 dark:border-yellow-700 dark:text-yellow-300\",\r\n },\r\n green: {\r\n bg: \"bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300\",\r\n border:\r\n \"border border-green-300 text-green-700 dark:border-green-700 dark:text-green-300\",\r\n },\r\n red: {\r\n bg: \"bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300\",\r\n border:\r\n \"border border-red-300 text-red-700 dark:border-red-700 dark:text-red-300\",\r\n },\r\n gray: {\r\n bg: \"bg-gray-100 text-gray-800 dark:bg-gray-900/30 dark:text-gray-300\",\r\n border:\r\n \"border border-gray-300 text-gray-700 dark:border-gray-700 dark:text-gray-300\",\r\n },\r\n};\r\n\r\nconst BADGE_VARIANTS = {\r\n contained: \"bg\",\r\n outline: \"border !bg-transparent\",\r\n soft: \"bg opacity-90\",\r\n};\r\n\r\nconst Chip = ({\r\n label,\r\n variant = \"contained\", // contained | outline | soft\r\n color = \"green\",\r\n className = \"\",\r\n}) => {\r\n const colorConfig = BADGE_COLORS[color] || BADGE_COLORS.green;\r\n const variantKey = BADGE_VARIANTS[variant] || BADGE_VARIANTS.contained;\r\n\r\n const variantClasses =\r\n variant === \"outline\" ? colorConfig.border : colorConfig.bg;\r\n\r\n return (\r\n <span\r\n className={`inline-flex justify-center items-center rounded-sm text-xs font-semibold px-3 py-1 min-w-[78px]\r\n ${variantClasses}\r\n ${variantKey}\r\n ${className}`}\r\n >\r\n {label}\r\n </span>\r\n );\r\n};\r\n\r\nexport default Chip;\r\n","import React from \"react\";\r\nimport Chip from \"../../Chip/Chip\";\r\nimport { formatDate } from \"../../../lib/utils\";\r\n\r\nconst DetailRow = ({ col, data }) => {\r\n let Icon = col?.icon;\r\n let label = col.label;\r\n let value = data[col.key];\r\n let type = col.type;\r\n let variant = col.variant || \"outline\";\r\n let color = col.defaultColor;\r\n\r\n if (type === \"chip\" && col.chipOptions?.length > 0) {\r\n let chipObj = col?.chipOptions.find((obj) => obj.value == value);\r\n if (chipObj) {\r\n value = chipObj.label;\r\n color = chipObj.color;\r\n }\r\n }\r\n\r\n return (\r\n <div\r\n className={`col-span-12 flex items-center space-x-4 p-4 rounded-xl \r\n bg-gray-100 dark:bg-gray-900 ${col.blockClass || \"\"}`}\r\n >\r\n {Icon && <div className=\"flex-shrink-0\">{Icon}</div>}\r\n\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium text-gray-500 dark:text-gray-400\">\r\n {label}\r\n </p>\r\n\r\n {/* CHIP */}\r\n {type === \"chip\" ? (\r\n <Chip\r\n label={value}\r\n variant={variant}\r\n color={color}\r\n className=\"mt-1\"\r\n />\r\n ) : /* TINY EDITOR */\r\n type === \"tinyEditor\" ? (\r\n <p\r\n className=\"mt-1 text-sm text-gray-900 dark:text-white break-words\"\r\n dangerouslySetInnerHTML={{\r\n __html: value,\r\n }}\r\n ></p>\r\n ) : type === \"audio\" ? (\r\n value ? (\r\n <audio\r\n key={value instanceof File ? URL.createObjectURL(value) : value}\r\n controls\r\n src={value instanceof File ? URL.createObjectURL(value) : value}\r\n onClick={(e) => e.stopPropagation()}\r\n className=\"shadow-md rounded-full mt-1\"\r\n />\r\n ) : (\r\n <p className=\"mt-1 text-sm text-gray-400\">N/A</p>\r\n )\r\n ) : (\r\n /* DEFAULT */\r\n <p className=\"mt-1 text-sm text-gray-900 dark:text-white break-words\">\r\n {type == \"date\" ? (\r\n <span>{formatDate(value, col.format || \"DD MMM YYYY\")}</span>\r\n ) : (\r\n value || \"N/A\"\r\n )}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\nexport default DetailRow;\r\n","import React from \"react\";\r\nimport InputLabel from \"./InputLabel\";\r\n\r\nconst Radio = ({\r\n value = true,\r\n onChange,\r\n text,\r\n options = [],\r\n label,\r\n required,\r\n name = \"\",\r\n disabled = false,\r\n parentClass = \"\",\r\n}) => {\r\n const radioOptions =\r\n options.length > 0\r\n ? options\r\n : [\r\n { label: \"Active\", value: true },\r\n { label: \"Inactive\", value: false },\r\n ];\r\n\r\n return (\r\n <>\r\n <div key={name} className={parentClass || \"col-span-12\"}>\r\n <InputLabel label={label} required={required} />\r\n <div className=\"flex items-center justify-between h-10 gap-4 bg-gray-100 dark:bg-gray-700 px-3 rounded-md border border-gray-100 dark:border-gray-600\">\r\n {/* Left Text */}\r\n {text && (\r\n <p className=\"text-xs text-gray-600 dark:text-gray-400 flex-shrink overflow-hidden text-ellipsis whitespace-nowrap max-w-[200px]\">\r\n {text}\r\n </p>\r\n )}\r\n\r\n {/* Radio Buttons */}\r\n <div className=\"flex items-center gap-6\">\r\n {radioOptions.map((opt, idx) => (\r\n <label\r\n key={idx}\r\n className=\"flex items-center gap-2 cursor-pointer select-none\"\r\n >\r\n <input\r\n type=\"radio\"\r\n name=\"switch-field\"\r\n required={required && idx === 0}\r\n value={opt.value}\r\n disabled={disabled}\r\n checked={value === opt.value}\r\n onChange={() => onChange(opt.value)}\r\n className=\"w-4 h-4 border-gray-300 cursor-pointer\"\r\n />\r\n <span className=\"text-sm text-gray-700 dark:text-white\">\r\n {opt.label}\r\n </span>\r\n </label>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default Radio;\r\n","import React from \"react\";\r\nimport Select from \"./Select\";\r\nimport { Switch } from \"./Switch\";\r\nimport PhoneInput from \"./PhoneInput\";\r\nimport { TextArea } from \"./TextArea\";\r\nimport ImagePicker from \"./ImagePicker\";\r\nimport { Input } from \"./Input\";\r\nimport TinyEditor from \"./TinyEditor\";\r\nimport Checkbox from \"./Checkbox\";\r\nimport AudioPicker from \"./AudioPicker\";\r\nimport GroupRow from \"../../Details/components/GroupRow\";\r\nimport CardGroup from \"../../Details/components/CardGroup\";\r\nimport DetailRow from \"../../Details/components/DetailRow\";\r\nimport Radio from \"./Radio\";\r\n\r\nconst RenderFields = ({ field, formData, handleChange }) => {\r\n const {\r\n key,\r\n label,\r\n type,\r\n options,\r\n placeholder,\r\n rows,\r\n inputClass,\r\n search,\r\n accept,\r\n text,\r\n required = false,\r\n minLength,\r\n dragDrop,\r\n parentClass,\r\n countriesList,\r\n defaultCountry,\r\n multiple,\r\n dropdownMaxHeight,\r\n editorKey,\r\n fontFamily,\r\n disabled,\r\n negativeNumberAllow,\r\n defaultValue,\r\n renderCondition,\r\n optionDependencyKey,\r\n pattern,\r\n renderType,\r\n } = field;\r\n\r\n let value = formData?.[key];\r\n if (value === undefined || value === null) {\r\n value = \"\";\r\n }\r\n\r\n const finalPlaceholder =\r\n placeholder || (type === \"select\" ? `Select ${label}` : `Enter ${label}`);\r\n\r\n const baseClass =\r\n \"w-full px-3 py-2 rounded-md border border-gray-300 dark:border-gray-600 text-sm focus:outline-none focus:ring-1 focus:ring-blue-200 bg-white text-black dark:bg-gray-700 dark:text-white\";\r\n\r\n if (renderCondition && typeof renderCondition === \"function\") {\r\n const shouldRender = renderCondition(formData);\r\n if (!shouldRender) {\r\n return null;\r\n }\r\n }\r\n\r\n if (renderType && renderType == \"details\") {\r\n switch (type) {\r\n case \"group\":\r\n return <GroupRow col={field} data={formData} />;\r\n case \"cardGroup\":\r\n return <CardGroup col={field} data={formData} />;\r\n default:\r\n return <DetailRow col={field} data={formData} />;\r\n }\r\n }\r\n\r\n switch (type) {\r\n case \"select\":\r\n return (\r\n <Select\r\n options={options || []}\r\n value={value}\r\n formData={formData}\r\n dependencyKey={optionDependencyKey}\r\n onChange={(val) => handleChange(key, val)}\r\n placeholder={finalPlaceholder}\r\n className={inputClass || \"\"}\r\n search={search}\r\n required={required}\r\n defaultValue={defaultValue}\r\n label={label}\r\n name={key}\r\n disabled={disabled}\r\n parentClass={parentClass}\r\n multiple={multiple}\r\n dropdownMaxHeight={dropdownMaxHeight}\r\n />\r\n );\r\n\r\n case \"checkbox\":\r\n return (\r\n <Checkbox\r\n name={key}\r\n label={label}\r\n options={options || []}\r\n value={value}\r\n onChange={(val) => handleChange(key, val)}\r\n required={required}\r\n parentClass={parentClass}\r\n className={inputClass || \"\"}\r\n multiSelect={multiple}\r\n disabled={disabled}\r\n />\r\n );\r\n\r\n case \"radio\":\r\n return (\r\n <Radio\r\n value={value}\r\n onChange={(val) => handleChange(key, val)}\r\n text={text}\r\n options={options || []}\r\n label={label}\r\n required={required}\r\n name={key}\r\n disabled={disabled}\r\n parentClass={parentClass}\r\n />\r\n );\r\n\r\n case \"switch\":\r\n return (\r\n <Switch\r\n value={value}\r\n onChange={(val) => handleChange(key, val)}\r\n text={text}\r\n options={options || []}\r\n label={label}\r\n required={required}\r\n name={key}\r\n disabled={disabled}\r\n parentClass={parentClass}\r\n />\r\n );\r\n case \"phone\":\r\n return (\r\n <PhoneInput\r\n value={value}\r\n onChange={(val) => handleChange(key, val)}\r\n countriesList={countriesList}\r\n defaultCountry={defaultCountry}\r\n required={required}\r\n placeholder={finalPlaceholder}\r\n search={search}\r\n label={label}\r\n name={key}\r\n disabled={disabled}\r\n parentClass={parentClass}\r\n />\r\n );\r\n\r\n case \"textarea\":\r\n return (\r\n <TextArea\r\n value={value}\r\n onChange={(e) => handleChange(key, e.target.value)}\r\n placeholder={finalPlaceholder}\r\n rows={rows || 3}\r\n className={`${baseClass} ${inputClass || \"\"}`}\r\n required={required}\r\n name={key}\r\n label={label}\r\n disabled={disabled}\r\n parentClass={parentClass}\r\n />\r\n );\r\n\r\n case \"image\":\r\n return (\r\n <ImagePicker\r\n value={value}\r\n onChange={(imgObj) => handleChange(key, imgObj)}\r\n required={required}\r\n accept={accept || \"image/*\"}\r\n id={`file-${key}`}\r\n dragDrop={dragDrop}\r\n label={label}\r\n name={key}\r\n parentClass={parentClass}\r\n />\r\n );\r\n case \"audio\":\r\n return (\r\n <AudioPicker\r\n value={value}\r\n onChange={(audio) => handleChange(key, audio)}\r\n required={required}\r\n accept={accept || \"audio/*\"}\r\n id={`file-${key}`}\r\n dragDrop={dragDrop}\r\n label={label}\r\n name={key}\r\n parentClass={parentClass}\r\n />\r\n );\r\n\r\n case \"tinyEditor\":\r\n return (\r\n <TinyEditor\r\n value={value}\r\n onChange={(newValue) => handleChange(key, newValue)}\r\n required={required}\r\n key={`editor-${key}`}\r\n placeholder={finalPlaceholder}\r\n label={label}\r\n parentClass={parentClass}\r\n fontFamily={fontFamily}\r\n editorKey={editorKey}\r\n disabled={disabled}\r\n />\r\n );\r\n\r\n default:\r\n return (\r\n <Input\r\n field={field}\r\n type={type || \"text\"}\r\n defaultValue={defaultValue}\r\n value={value}\r\n onChange={(e) => handleChange(key, e.target.value)}\r\n placeholder={finalPlaceholder}\r\n className={`${baseClass} ${inputClass || \"\"}`}\r\n required={required}\r\n name={key}\r\n minLength={minLength}\r\n label={label}\r\n negativeNumberAllow={negativeNumberAllow}\r\n parentClass={parentClass}\r\n disabled={disabled}\r\n pattern={pattern}\r\n />\r\n );\r\n }\r\n};\r\n\r\nexport default RenderFields;\r\n ","import React, { useEffect, useState } from \"react\";\r\nimport { X } from \"lucide-react\";\r\nimport Button from \"../Button/Button\";\r\nimport RenderFields from \"../Form/components/RenderFields\";\r\n\r\nconst FilterDrawer = ({ isOpen, onClose, config, onApply }) => {\r\n const [filters, setFilters] = useState({});\r\n const handleChange = (key, value) => {\r\n setFilters((prev) => ({ ...prev, [key]: value }));\r\n };\r\n\r\n const handleApply = () => {\r\n onApply?.(filters);\r\n onClose();\r\n };\r\n\r\n const handleReset = () => {\r\n setFilters({});\r\n onApply?.({});\r\n onClose();\r\n };\r\n\r\n return (\r\n <>\r\n {/* Overlay */}\r\n <div\r\n className={`fixed inset-0 bg-black/50 z-40 transition-opacity duration-300 ${\r\n isOpen\r\n ? \"opacity-100 pointer-events-auto\"\r\n : \"opacity-0 pointer-events-none\"\r\n }`}\r\n onClick={onClose}\r\n />\r\n\r\n {/* Drawer */}\r\n <div\r\n className={`fixed top-0 right-0 h-full w-[28rem] bg-white dark:bg-gray-900 shadow-2xl z-50 flex flex-col border-l border-gray-200 dark:border-gray-700\r\n transform transition-transform duration-300 ease-in-out\r\n ${isOpen ? \"translate-x-0\" : \"translate-x-full\"}\r\n `}\r\n >\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-gray-200 dark:border-gray-700\">\r\n <h2 className=\"text-lg font-semibold text-gray-900 dark:text-white\">\r\n Filters\r\n </h2>\r\n <button\r\n onClick={onClose}\r\n className=\"p-2 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-md transition\"\r\n >\r\n <X className=\"w-5 h-5 text-gray-500 dark:text-gray-400\" />\r\n </button>\r\n </div>\r\n\r\n {/* Content */}\r\n {isOpen && (\r\n <div className=\"flex-1 overflow-y-auto px-4 py-3\">\r\n {config?.component ? (\r\n <config.component\r\n filters={filters}\r\n onFilterChange={handleChange}\r\n />\r\n ) : (\r\n <div className=\"space-y-4\">\r\n {config?.fields?.map((field) => (\r\n <>\r\n <RenderFields\r\n key={field.key}\r\n field={field}\r\n formData={filters}\r\n handleChange={handleChange}\r\n />\r\n </>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Footer */}\r\n <div className=\"flex gap-2 px-4 py-3 border-t border-gray-200 dark:border-gray-700\">\r\n <Button\r\n onClick={handleApply}\r\n variant=\"contained\"\r\n color=\"primary\"\r\n fullWidth\r\n >\r\n Apply Filters\r\n </Button>\r\n <Button\r\n onClick={handleReset}\r\n variant=\"contained\"\r\n className=\"min-w-[150px]\"\r\n >\r\n Reset\r\n </Button>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default FilterDrawer;\r\n","const TableSkeleton = ({ rows = 5, columns = 5 }) => {\r\n return (\r\n <>\r\n <div className=\"w-full mb-6 inline-flex justify-end items-center\">\r\n <div className=\"h-8 w-80 bg-gray-300 dark:bg-gray-700 rounded animate-pulse\" />\r\n </div>\r\n <div className=\"overflow-hidden rounded-md border border-gray-200 dark:border-gray-800\">\r\n <table className=\"w-full border-collapse\">\r\n <thead>\r\n <tr className=\"bg-gray-50 dark:bg-gray-900\">\r\n {Array.from({ length: columns }).map((_, i) => (\r\n <th key={i} className=\"px-4 py-3\">\r\n <div className=\"h-6 w-24 bg-gray-300 dark:bg-gray-700 rounded animate-pulse inline-flex justify-center items-center\" />\r\n </th>\r\n ))}\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n {Array.from({ length: rows }).map((_, rowIndex) => (\r\n <tr\r\n key={rowIndex}\r\n className=\"border-t border-gray-200 dark:border-gray-800\"\r\n >\r\n {Array.from({ length: columns }).map((_, colIndex) => (\r\n <td key={colIndex} className=\"px-4 py-6\">\r\n <div className=\"h-6 w-full bg-gray-300 dark:bg-gray-700 rounded animate-pulse\" />\r\n </td>\r\n ))}\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default TableSkeleton;\r\n","import React, { useState, useMemo, useRef, useEffect } from \"react\";\r\nimport {\r\n ChevronLeft,\r\n ChevronRight,\r\n Search,\r\n EllipsisVertical,\r\n Filter,\r\n User,\r\n Music,\r\n Plus,\r\n} from \"lucide-react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { formatDate, searchLocalData } from \"../../lib/utils\";\r\nimport Button from \"../Button/Button\";\r\nimport FilterDrawer from \"../Filter/FilterDrawer\";\r\nimport Chip from \"../Chip/Chip\";\r\nimport TableSkeleton from \"./components/TableSkeleton\";\r\nimport ImagePreview from \"./components/ImagePreview\";\r\n\r\nconst Table = ({\r\n config,\r\n setShowAdd,\r\n title,\r\n buttonText,\r\n description,\r\n showAddButton,\r\n}) => {\r\n const {\r\n data = [],\r\n table_head = [],\r\n loading = false,\r\n search = {\r\n enabled: false,\r\n placeholder: \"Search...\",\r\n useServerSideSearch: false,\r\n },\r\n filter = {\r\n enabled: false,\r\n useServerSideFilters: false,\r\n },\r\n pagination = {\r\n enabled: false,\r\n rows_per_page: 10,\r\n useServerSidePagination: false,\r\n },\r\n emptyMessage = \"No data available\",\r\n onMenuAction,\r\n setServerSidePaginationData = () => {},\r\n onFilterApply,\r\n filterConfig = null,\r\n rowClick = null,\r\n } = config;\r\n\r\n const [searchTerm, setSearchTerm] = useState(\"\");\r\n const [activeMenu, setActiveMenu] = useState(null);\r\n const [menuList, setMenuList] = useState([]);\r\n const [menuPosition, setMenuPosition] = useState({});\r\n const [showFilters, setShowFilters] = useState(false);\r\n const [appliedFilters, setAppliedFilters] = useState({});\r\n\r\n // image preview\r\n const [targetImage, setTargetImage] = useState(null);\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n const filteredData = useMemo(() => {\r\n if (!search.enabled || !searchTerm.trim()) return data;\r\n if (search.useServerSideSearch) return data;\r\n return searchLocalData(data, searchTerm, search.searchKeys || []);\r\n }, [data, searchTerm, search]);\r\n\r\n const [currentPage, setCurrentPage] = useState(1);\r\n const [pageSize, setPageSize] = useState(pagination?.rows_per_page || 50);\r\n const [totalRecords, setTotalRecords] = useState(filteredData.length || 0);\r\n\r\n const totalPages = pagination?.useServerSidePagination\r\n ? pagination.total_pages\r\n : Math.ceil(filteredData.length / pageSize);\r\n\r\n const paginatedData = useMemo(() => {\r\n if (pagination.useServerSidePagination) return filteredData;\r\n const start = (currentPage - 1) * pageSize;\r\n return filteredData.slice(start, start + pageSize);\r\n }, [filteredData, currentPage, pageSize]);\r\n\r\n const menuRef = useRef(null);\r\n const buttonRefs = useRef({});\r\n const searchTimeoutRef = useRef(null);\r\n\r\n const handleSearchChange = (value) => {\r\n setSearchTerm(value);\r\n setCurrentPage(1);\r\n\r\n if (search.useServerSideSearch) {\r\n if (searchTimeoutRef.current) clearTimeout(searchTimeoutRef.current);\r\n\r\n searchTimeoutRef.current = setTimeout(async () => {\r\n try {\r\n await setServerSidePaginationData((prev) => ({\r\n ...prev,\r\n search: value,\r\n current_page: 1,\r\n }));\r\n } catch (error) {\r\n console.error(\"Search error:\", error);\r\n }\r\n }, 800);\r\n }\r\n };\r\n\r\n const handleActionClick = (action, item, e) => {\r\n e.stopPropagation();\r\n setActiveMenu(null);\r\n onMenuAction?.(action.type, item);\r\n };\r\n\r\n const handleMenuToggle = (itemId, e, menu_list) => {\r\n e.stopPropagation();\r\n setMenuList(menu_list);\r\n const button = e.currentTarget;\r\n buttonRefs.current[itemId] = button;\r\n const rect = button.getBoundingClientRect();\r\n const menuWidth = 192;\r\n const menuHeight = menu_list.length * 40;\r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n\r\n const openLeft = viewportWidth - rect.right < menuWidth;\r\n const left = openLeft ? rect.left - menuWidth + rect.width : rect.left;\r\n\r\n const openUp =\r\n viewportHeight - rect.bottom < menuHeight && rect.top > menuHeight;\r\n const top = openUp ? rect.top - menuHeight - 2 : rect.bottom + 2;\r\n\r\n setMenuPosition({\r\n top: Math.max(8, Math.min(top, viewportHeight - menuHeight - 8)),\r\n left: Math.max(8, Math.min(left, viewportWidth - menuWidth - 8)),\r\n });\r\n\r\n setActiveMenu(activeMenu === itemId ? null : itemId);\r\n };\r\n\r\n const calculateRowNumber = (index) => {\r\n return (currentPage - 1) * pageSize + index + 1;\r\n };\r\n\r\n const openPreview = (image) => {\r\n if (image && image.src instanceof File) {\r\n image = { ...image, src: URL.createObjectURL(image.src) };\r\n }\r\n setTargetImage(image);\r\n setIsOpen(true);\r\n };\r\n\r\n const renderAvatar = (\r\n imageSrc,\r\n imageAlt,\r\n className,\r\n fallback_icon = null,\r\n row = null,\r\n ) => {\r\n return (\r\n <>\r\n {imageSrc ? (\r\n <img\r\n src={\r\n imageSrc instanceof File\r\n ? URL.createObjectURL(imageSrc)\r\n : imageSrc\r\n }\r\n alt={imageAlt || \"Avatar\"}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n openPreview({ src: imageSrc, alt: imageAlt });\r\n }}\r\n className={`w-10 h-10 cursor-pointer shrink-0 rounded-full object-cover border border-gray-200 dark:border-gray-700 ${className || \"\"}`}\r\n />\r\n ) : (\r\n <>\r\n {fallback_icon ? (\r\n typeof fallback_icon === \"function\" ? (\r\n fallback_icon(row)\r\n ) : (\r\n fallback_icon\r\n )\r\n ) : (\r\n <div\r\n className={`w-10 h-10 flex items-center shrink-0 justify-center rounded-full border border-gray-300 dark:border-gray-700 bg-gray-200 dark:bg-gray-600 ${className || \"\"}`}\r\n >\r\n <User className=\"w-6 h-6 text-gray-400 dark:text-gray-400\" />\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </>\r\n );\r\n };\r\n\r\n const renderAudio = (audioSrc, className) => {\r\n return (\r\n <>\r\n {audioSrc ? (\r\n <audio\r\n key={\r\n audioSrc instanceof File\r\n ? URL.createObjectURL(audioSrc)\r\n : audioSrc\r\n }\r\n controls\r\n src={\r\n audioSrc instanceof File\r\n ? URL.createObjectURL(audioSrc)\r\n : audioSrc\r\n }\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n }}\r\n className={`w-64 cursor-pointer ${className || \"\"}`}\r\n />\r\n ) : (\r\n <>\r\n <div\r\n className={`w-12 h-12 flex items-center shrink-0 justify-center rounded-full border border-gray-300 dark:border-gray-700 bg-gray-200 dark:bg-gray-600 ${className || \"\"}`}\r\n >\r\n <Music className=\"w-6 h-6 text-gray-400 dark:text-gray-400\" />\r\n </div>\r\n </>\r\n )}\r\n </>\r\n );\r\n };\r\n\r\n const renderGroupCell = (row, col) => {\r\n return (\r\n <div className={`flex items-center space-x-4 ${col.className || \"\"}`}>\r\n {col.imageKey\r\n ? renderAvatar(\r\n row[col.imageKey],\r\n row[col.titleKey],\r\n \"group-avatar\",\r\n col.fallback_icon,\r\n row,\r\n )\r\n : \"\"}\r\n <div>\r\n <p className=\"font-medium text-gray-900 dark:text-white group-title\">\r\n {row[col.titleKey] || \"\"}\r\n </p>\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400 group-sub-title\">\r\n {row[col.subtitleKey] || \"\"}\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const handleRenderChip = (value, col) => {\r\n let label = String(value);\r\n const variant = col.variant || \"contained\";\r\n let color = col.defaultColor;\r\n\r\n if (col?.chipOptions?.length > 0) {\r\n let chipObj = col?.chipOptions.find((obj) => obj.value == value);\r\n if (chipObj) {\r\n label = chipObj.label;\r\n color = chipObj.color;\r\n }\r\n }\r\n\r\n return (\r\n <Chip\r\n label={label}\r\n variant={variant}\r\n color={color}\r\n className={col.className || \"\"}\r\n />\r\n );\r\n };\r\n\r\n const handleRenderCellValue = (col, row, index) => {\r\n const value = row[col.key];\r\n if (col.type === \"menu_actions\") {\r\n return (\r\n <div className={`text-center ${col.className || \"\"}`}>\r\n <button\r\n ref={(el) => (buttonRefs.current[row.id || row._id] = el)}\r\n onClick={(e) =>\r\n handleMenuToggle(row.id || row._id, e, col.menuList)\r\n }\r\n className=\"p-2 bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600 rounded-full transition text-gray-700 dark:text-gray-300\"\r\n >\r\n <EllipsisVertical className=\"h-4 w-4\" />\r\n </button>\r\n </div>\r\n );\r\n } else if (col.type === \"index\") {\r\n return (\r\n <span className={col.className || \"\"}>{calculateRowNumber(index)}</span>\r\n );\r\n } else if (col.type === \"group\") {\r\n return renderGroupCell(row, col);\r\n } else if (col.type === \"chip\") {\r\n return <>{handleRenderChip(value, col)}</>;\r\n } else if (col.type === \"date\") {\r\n return (\r\n <span className={col.className || \"\"}>\r\n {formatDate(value, col.format || \"DD MMM YYYY\")}\r\n </span>\r\n );\r\n } else if (col.type === \"avatar\") {\r\n return (\r\n <>\r\n <div className=\"min-w-[40px]\">\r\n {renderAvatar(\r\n value,\r\n col.alt,\r\n col.className,\r\n col.fallback_icon,\r\n row,\r\n )}\r\n </div>\r\n </>\r\n );\r\n } else if (col.type === \"audio\") {\r\n return <>{renderAudio(value, col.className)}</>;\r\n } else {\r\n return <span className={col.className || \"\"}>{value || \"N/A\"}</span>;\r\n }\r\n };\r\n\r\n // handle CLick\r\n const handleRowClick = (row) => {\r\n if (typeof rowClick === \"function\") {\r\n return rowClick(row);\r\n }\r\n if (rowClick) {\r\n return onMenuAction?.(\"view\", row);\r\n }\r\n };\r\n\r\n const handleColumnClick = (col, row) => {\r\n if (col.onClickDetails) {\r\n return onMenuAction?.(\"view\", row);\r\n }\r\n\r\n if (typeof col.handleClick === \"function\") {\r\n return col.handleClick(row);\r\n }\r\n };\r\n\r\n // Helper to check if row is clickable\r\n const isRowClickable = () => rowClick || typeof rowClick === \"function\";\r\n // Helper to check if column is clickable\r\n const isColumnClickable = (col) =>\r\n col.onClickDetails || typeof col.handleClick === \"function\";\r\n\r\n // Close menu on scroll -------------------\r\n useEffect(() => {\r\n const handleScroll = () => {\r\n if (activeMenu) setActiveMenu(null);\r\n };\r\n\r\n window.addEventListener(\"scroll\", handleScroll, true);\r\n return () => {\r\n window.removeEventListener(\"scroll\", handleScroll, true);\r\n };\r\n }, [activeMenu]);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (e) => {\r\n if (menuRef.current && !menuRef.current.contains(e.target)) {\r\n setActiveMenu(null);\r\n }\r\n };\r\n document.addEventListener(\"click\", handleClickOutside);\r\n return () => document.removeEventListener(\"click\", handleClickOutside);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (pagination?.rows_per_page && pagination?.useServerSidePagination) {\r\n setPageSize(pagination?.rows_per_page || 50);\r\n }\r\n\r\n if (pagination.current_page) {\r\n setCurrentPage(pagination.current_page);\r\n }\r\n }, [\r\n pagination.rows_per_page,\r\n pagination?.useServerSidePagination,\r\n pagination.current_page,\r\n ]);\r\n\r\n useEffect(() => {\r\n setTotalRecords(\r\n pagination?.useServerSidePagination\r\n ? pagination.total_records\r\n : filteredData.length,\r\n );\r\n\r\n if (\r\n filteredData.length <= pageSize * (currentPage - 1) &&\r\n !pagination?.useServerSidePagination\r\n ) {\r\n setCurrentPage((prev) => prev - 1 || 1);\r\n }\r\n }, [\r\n filteredData.length,\r\n pagination.total_records,\r\n pagination?.useServerSidePagination,\r\n ]);\r\n\r\n return (\r\n <>\r\n {/* header Bar */}\r\n\r\n {loading ? (\r\n <TableSkeleton rows={6} columns={6} />\r\n ) : (\r\n <>\r\n <div className=\"flex flex-col sm:flex-row sm:justify-between gap-4 mb-3\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\r\n {title}\r\n </h1>\r\n <p className=\"text-md text-gray-600 dark:text-gray-400\">\r\n {description}\r\n </p>\r\n </div>\r\n <div className=\"flex flex-col justify-end items-end gap-2\">\r\n {showAddButton && (\r\n <Button\r\n onClick={() => setShowAdd(true)}\r\n variant=\"contained\"\r\n color=\"primary\"\r\n >\r\n <Plus className=\"w-4 h-4 mr-2\" />\r\n {buttonText || \"Add New\"}\r\n </Button>\r\n )}\r\n <div className=\"flex justify-end items-center gap-2\">\r\n {search.enabled && (\r\n <div className=\"\">\r\n <div className=\"relative min-w-[300px]\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400 dark:text-gray-300\" />\r\n <input\r\n type=\"text\"\r\n placeholder={search.placeholder || \"Search...\"}\r\n value={searchTerm}\r\n onChange={(e) => handleSearchChange(e.target.value)}\r\n className=\"w-full h-[36px] pl-9 pr-4 py-3 text-sm border border-gray-300 dark:border-gray-600 rounded-md bg-gray-50 dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-500 dark:placeholder-gray-400 focus:outline-none focus:ring-1 focus:ring-blue-300 dark:ring-blue-200 disabled:opacity-50\"\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {filterConfig && filter.enabled && (\r\n // add red dot if filter are applied\r\n <div className=\"relative\">\r\n <Button\r\n onClick={() => setShowFilters(true)}\r\n variant=\"contained\"\r\n >\r\n <Filter className=\"w-4 h-4 mr-2\" />\r\n Filters\r\n </Button>\r\n {Object.keys(appliedFilters).length > 0 && (\r\n <span className=\"absolute top-1 right-1 w-2 h-2 bg-red-500 rounded-full\"></span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n {/* =========================== Table =========================== */}\r\n <div className=\"bg-white dark:bg-gray-800 rounded-lg shadow overflow-hidden border border-gray-200 dark:border-gray-700\">\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"min-w-full divide-y divide-gray-200 dark:divide-gray-700\">\r\n <thead className=\"bg-gray-50 dark:bg-gray-700/60\">\r\n <tr>\r\n {table_head.map((col) => (\r\n <th\r\n key={col.key}\r\n className={`px-6 py-4 text-left text-xs font-medium text-black dark:text-white uppercase tracking-wider min-w-max max-w-[180px] truncate ${col.headClass || \"\"}`}\r\n >\r\n {col.title}\r\n </th>\r\n ))}\r\n </tr>\r\n </thead>\r\n\r\n <tbody className=\"bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700\">\r\n {paginatedData.length === 0 ? (\r\n <tr>\r\n <td\r\n colSpan={table_head.length}\r\n className=\"text-center py-10 text-gray-500 dark:text-gray-400\"\r\n >\r\n {emptyMessage}\r\n </td>\r\n </tr>\r\n ) : (\r\n paginatedData.map((row, index) => (\r\n <tr\r\n key={row.id || row._id || index}\r\n className={`hover:bg-gray-50 dark:hover:bg-blue-800/10 transition ${isRowClickable() ? \"cursor-pointer\" : \"\"}`}\r\n onClick={(e) => {\r\n isRowClickable() && handleRowClick(row);\r\n }}\r\n >\r\n {table_head.map((col) => (\r\n <td\r\n key={col.key}\r\n className={`px-6 py-4 text-sm text-gray-900 dark:text-gray-100 min-w-max ${col.type == \"audio\" ? \"\" : \"max-w-[300px]\"} truncate ${\r\n isColumnClickable(col) ? \"cursor-pointer\" : \"\"\r\n }`}\r\n title={String(row[col.key] ?? \"\")}\r\n onClick={(e) => {\r\n if (isColumnClickable(col)) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n handleColumnClick(col, row);\r\n }\r\n }}\r\n >\r\n {col.render\r\n ? col.render(row, index)\r\n : handleRenderCellValue(col, row, index)}\r\n </td>\r\n ))}\r\n </tr>\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n {pagination?.enabled && filteredData.length > 0 && (\r\n <div className=\" bg-gray-50 dark:bg-gray-700/60 px-6 py-3 flex flex-wrap items-center justify-between border-t border-gray-200 dark:border-gray-600 gap-3\">\r\n <div className=\"text-sm text-gray-700 dark:text-gray-300\">\r\n Showing {(currentPage - 1) * pageSize + 1} to{\" \"}\r\n {Math.min(currentPage * pageSize, totalRecords)} of{\" \"}\r\n {totalRecords} results\r\n </div>\r\n\r\n <div className=\"flex items-center gap-4\">\r\n {/* Rows per page selector */}\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-sm text-gray-700 dark:text-gray-300\">\r\n Rows per page:\r\n </span>\r\n <select\r\n value={pageSize}\r\n onChange={(e) => {\r\n const newLimit = Number(e.target.value);\r\n setPageSize(newLimit);\r\n setCurrentPage(1);\r\n if (pagination.useServerSidePagination) {\r\n setServerSidePaginationData((prev) => ({\r\n ...prev,\r\n current_page: 1,\r\n rows_per_page: newLimit,\r\n }));\r\n }\r\n }}\r\n className=\"border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 text-sm rounded-md px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500\"\r\n >\r\n {[2, 10, 25, 50, 100].map((n) => (\r\n <option key={n} value={n}>\r\n {n}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n {/* ============= Pagination ============= */}\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => {\r\n if (currentPage > 1) {\r\n const newPage = currentPage - 1;\r\n setCurrentPage(newPage);\r\n if (pagination.useServerSidePagination) {\r\n setServerSidePaginationData((prev) => ({\r\n ...prev,\r\n current_page: newPage,\r\n }));\r\n }\r\n }\r\n }}\r\n disabled={currentPage === 1}\r\n className=\"p-2 hover:bg-gray-200 dark:hover:bg-gray-600 rounded-md transition text-gray-500 dark:text-gray-300 disabled:opacity-50\"\r\n >\r\n <ChevronLeft className=\"h-4 w-4\" />\r\n </button>\r\n\r\n <span className=\"text-sm text-gray-800 dark:text-gray-200\">\r\n Page {currentPage} of {totalPages}\r\n </span>\r\n\r\n <button\r\n onClick={() => {\r\n if (currentPage < totalPages) {\r\n const newPage = currentPage + 1;\r\n setCurrentPage(newPage);\r\n if (pagination.useServerSidePagination) {\r\n setServerSidePaginationData((prev) => ({\r\n ...prev,\r\n current_page: newPage,\r\n }));\r\n }\r\n }\r\n }}\r\n disabled={currentPage === totalPages}\r\n className=\"p-2 hover:bg-gray-200 dark:hover:bg-gray-600 rounded-md transition text-gray-500 dark:text-gray-300 disabled:opacity-50\"\r\n >\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* Portal Menu */}\r\n {activeMenu &&\r\n createPortal(\r\n <div\r\n ref={menuRef}\r\n style={{\r\n position: \"fixed\",\r\n top: `${menuPosition.top}px`,\r\n left: `${menuPosition.left}px`,\r\n zIndex: 9999,\r\n }}\r\n className=\"w-48 bg-white dark:bg-gray-700 rounded-md shadow-lg border border-gray-200 dark:border-gray-600\"\r\n >\r\n {menuList.map((action, i) => (\r\n <button\r\n key={i}\r\n onClick={(e) =>\r\n handleActionClick(\r\n action,\r\n data.find(\r\n (d) => d.id === activeMenu || d._id == activeMenu,\r\n ),\r\n e,\r\n )\r\n }\r\n className={`w-full flex items-center gap-2 px-4 py-2 text-sm text-left hover:bg-gray-100 dark:hover:bg-gray-600 ${\r\n action.variant === \"danger\"\r\n ? \"text-red-600 dark:text-red-500\"\r\n : \"text-gray-700 dark:text-gray-200\"\r\n }`}\r\n >\r\n {action.icon && <span className=\"shrink-0\">{action.icon}</span>}\r\n {action.title}\r\n </button>\r\n ))}\r\n </div>,\r\n document.body,\r\n )}\r\n\r\n {/* Filter Drawer */}\r\n {filterConfig && (\r\n <FilterDrawer\r\n isOpen={showFilters}\r\n onClose={() => setShowFilters(false)}\r\n config={filterConfig}\r\n onApply={(filters) => {\r\n setAppliedFilters(filters);\r\n onFilterApply?.(filters);\r\n }}\r\n />\r\n )}\r\n\r\n {isOpen && (\r\n <ImagePreview\r\n src={targetImage.src}\r\n alt={targetImage.alt}\r\n isOpen={isOpen}\r\n setIsOpen={setIsOpen}\r\n />\r\n )}\r\n </>\r\n );\r\n};\r\n\r\nexport default Table;\r\n","import React from \"react\";\r\nimport { X } from \"lucide-react\";\r\nimport Button from \"../Button/Button\";\r\n\r\nconst Modal = ({\r\n isOpen,\r\n onClose,\r\n icon,\r\n title,\r\n children,\r\n size = \"md\",\r\n actionButtons = [],\r\n actions,\r\n showDefaultClose = true,\r\n footerConfig = null,\r\n hideFooter = false,\r\n onFormSubmit = () => {},\r\n onCancel,\r\n loadingBtn = false,\r\n executeFunction = () => {},\r\n selectedItem = null,\r\n}) => {\r\n if (!isOpen) return null;\r\n\r\n // Size classes\r\n const sizeClasses = {\r\n sm: \"max-w-md\",\r\n md: \"max-w-lg\",\r\n lg: \"max-w-2xl\",\r\n xl: \"max-w-4xl\",\r\n full: \"max-w-full\",\r\n };\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-4\">\r\n {/* Backdrop */}\r\n <div\r\n className=\"fixed inset-0 bg-gray-500 opacity-75\"\r\n onClick={() => onClose()}\r\n ></div>\r\n\r\n {/* Modal container */}\r\n <div\r\n className={`relative bg-white rounded-lg shadow-xl w-full ${\r\n sizeClasses[size] || sizeClasses.md\r\n } max-h-[90vh] flex flex-col dark:bg-gray-800`}\r\n >\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700 flex-shrink-0\">\r\n <div className=\"flex items-center gap-1\">\r\n {icon && <span>{icon}</span>}\r\n <h3 className=\"text-lg font-medium text-gray-900 dark:text-white\">\r\n {title}\r\n </h3>\r\n </div>\r\n\r\n <button\r\n onClick={() => onClose()}\r\n className=\"text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\"\r\n >\r\n <X className=\"w-6 h-6\" />\r\n </button>\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"flex-1 overflow-y-auto p-4\">{children}</div>\r\n\r\n {/* Footer */}\r\n {/* {!hideFooter && (actions || footerConfig || showDefaultClose) && (\r\n <div className=\"px-4 py-3 flex justify-end gap-3 border-t border-gray-200 dark:border-gray-700 sm:px-6\">\r\n {actions}\r\n\r\n {footerConfig && (\r\n <>\r\n {footerConfig.cancelButton && (\r\n <Button\r\n onClick={() => (onCancel() || onClose())}\r\n disabled={loadingBtn}\r\n variant=\"contained\"\r\n color=\"default\"\r\n >\r\n {footerConfig.cancelText || \"Cancel\"}\r\n </Button>\r\n )}\r\n\r\n {footerConfig.submitButton && (\r\n <Button\r\n onClick={onFormSubmit}\r\n disabled={loadingBtn}\r\n variant=\"contained\"\r\n color={footerConfig.color || \"primary\"}\r\n className=\"min-w-[100px]\"\r\n >\r\n {loadingBtn ? (\r\n <div className=\"flex items-center\">\r\n <div className=\"animate-spin rounded-full h-4 w-4 border-2 border-white/30 border-t-2 border-t-white mr-2\"></div>\r\n {footerConfig.submitText || \"Submit\"}...\r\n </div>\r\n ) : (\r\n footerConfig.submitText || \"Submit\"\r\n )}\r\n </Button>\r\n )}\r\n </>\r\n )}\r\n\r\n {showDefaultClose && !actions && !footerConfig && (\r\n <Button onClick={() => onClose()} variant=\"outlined\">\r\n Close\r\n </Button>\r\n )}\r\n </div>\r\n )} */}\r\n\r\n {actionButtons.length > 0 && (\r\n <div className=\"px-4 py-3 flex justify-end gap-3 border-t border-gray-200 dark:border-gray-700 sm:px-6\">\r\n {actionButtons.map((btn) => (\r\n <Button\r\n onClick={(e) => {\r\n if (btn.type == \"submit\") {\r\n onFormSubmit(e);\r\n } else {\r\n executeFunction(\r\n () => btn?.onClick?.(e, selectedItem),\r\n (resp) => onClose?.(resp),\r\n );\r\n }\r\n }}\r\n disabled={loadingBtn || btn.disabled}\r\n variant={btn.variant || \"contained\"}\r\n color={btn.color || \"primary\"}\r\n className={`min-w-[100px] ${btn.className}`}\r\n type={btn.type || \"button\"}\r\n >\r\n {loadingBtn ? (\r\n <div className=\"flex items-center\">\r\n <div className=\"animate-spin rounded-full h-4 w-4 border-2 border-white/30 border-t-2 border-t-white mr-2\"></div>\r\n {btn.label || \"Submit\"}...\r\n </div>\r\n ) : (\r\n btn.label || \"Submit\"\r\n )}\r\n </Button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default Modal;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport RenderFields from \"./components/RenderFields\";\r\nimport { enqueueSnackbar } from \"notistack\";\r\n\r\nconst Form = ({\r\n config,\r\n onSubmit,\r\n initialData = {},\r\n fetchRowDetails,\r\n type = \"add\",\r\n}) => {\r\n const { formClass = \"grid grid-cols-12 gap-4\", formFields = [] } =\r\n config || {};\r\n\r\n const [formData, setFormData] = useState(initialData);\r\n\r\n const [dataLoading, setDataLoading] = useState(true);\r\n\r\n const handleGetDetails = async () => {\r\n fetchRowDetails?.(initialData)\r\n .then((resp) => {\r\n setFormData(resp.data);\r\n })\r\n .catch((error) => {\r\n enqueueSnackbar(error.message, { variant: \"error\" });\r\n })\r\n .finally(() => {\r\n setDataLoading(false);\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n if (fetchRowDetails instanceof Function) {\r\n handleGetDetails();\r\n } else {\r\n setFormData(initialData);\r\n setDataLoading(false);\r\n }\r\n }, []);\r\n\r\n const handleChange = (key, value) => {\r\n setFormData((prev) => ({ ...prev, [key]: value }));\r\n };\r\n\r\n const handleSubmit = (e) => {\r\n e.preventDefault();\r\n const form = e.target;\r\n\r\n if (!form.checkValidity()) {\r\n form.reportValidity();\r\n return;\r\n }\r\n\r\n onSubmit(formData);\r\n };\r\n\r\n if (dataLoading) {\r\n return (\r\n // spinner loader\r\n <div className=\"flex items-center justify-center h-64\">\r\n <div\r\n className={`rounded-full border-4 border-blue-500 border-t-gray-200 animate-spin w-8 h-8 border-4`}\r\n style={{\r\n borderTopColor: \"border-primary-500\",\r\n }}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <form\r\n id={\r\n type == \"add\" ? \"addForm\" : type == \"edit\" ? \"editForm\" : \"defaultForm\"\r\n }\r\n onSubmit={handleSubmit}\r\n className={formClass}\r\n noValidate={false} // enables native validation\r\n >\r\n {formFields.map((field) => (\r\n <>\r\n <RenderFields\r\n key={field.key}\r\n field={field}\r\n formData={formData}\r\n handleChange={handleChange}\r\n />\r\n </>\r\n ))}\r\n </form>\r\n );\r\n};\r\n\r\nexport default Form;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport DetailRow from \"./components/DetailRow\";\r\nimport CardGroup from \"./components/CardGroup\";\r\nimport GroupRow from \"./components/GroupRow\";\r\nimport { enqueueSnackbar } from \"notistack\";\r\n\r\nexport default function Details({ data, config, fetchRowDetails }) {\r\n const { fields, containerClass } = config;\r\n\r\n const [detailsData, setDetailsData] = useState(data);\r\n\r\n const [dataLoading, setDataLoading] = useState(true);\r\n\r\n const handleGetDetails = async () => {\r\n fetchRowDetails?.(data)\r\n .then((resp) => {\r\n setDetailsData(resp.data);\r\n })\r\n .catch((error) => {\r\n enqueueSnackbar(error.message, { variant: \"error\" });\r\n })\r\n .finally(() => {\r\n setDataLoading(false);\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n if (fetchRowDetails instanceof Function) {\r\n handleGetDetails();\r\n } else {\r\n setDetailsData(data);\r\n setDataLoading(false);\r\n }\r\n }, []);\r\n\r\n if (dataLoading) {\r\n return (\r\n // spinner loader\r\n <div className=\"flex items-center justify-center h-64\">\r\n <div\r\n className={`rounded-full border-4 border-blue-500 border-t-gray-200 animate-spin w-8 h-8 border-4`}\r\n style={{\r\n borderTopColor: \"border-primary-500\",\r\n }}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <div className={`grid grid-cols-12 gap-4 ${containerClass || \"\"}`}>\r\n {fields.map((col) => {\r\n if (\r\n col.renderCondition &&\r\n typeof col.renderCondition === \"function\"\r\n ) {\r\n const shouldRender = col.renderCondition(detailsData);\r\n if (!shouldRender) {\r\n return null;\r\n }\r\n }\r\n return col.type == \"group\" ? (\r\n <GroupRow col={col} data={detailsData} />\r\n ) : col.type == \"cardGroup\" ? (\r\n <CardGroup col={col} data={detailsData} />\r\n ) : (\r\n <DetailRow col={col} data={detailsData} />\r\n );\r\n })}\r\n </div>\r\n </>\r\n );\r\n}\r\n","import React, { useEffect, useMemo, useState } from \"react\";\r\nimport Table from \"./Table/Table\";\r\nimport Modal from \"./Modal/Modal\";\r\nimport Form from \"./Form/Form\";\r\nimport { Icon } from \"@iconify/react\";\r\nimport { enqueueSnackbar } from \"notistack\";\r\nimport Details from \"./Details/Details\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nconst CrudPage = ({ config }) => {\r\n const {\r\n title,\r\n fetchData = async () => {},\r\n fetchRowDetails = null,\r\n isStaticData = false,\r\n tableConfig = {},\r\n modalConfig = {},\r\n filterConfig,\r\n } = config;\r\n\r\n const [loading, setLoading] = useState(true);\r\n const [formLoading, setFormLoading] = useState(false);\r\n\r\n const [listingData, setListingData] = useState([]);\r\n const [paginationData, setPaginationData] = useState(null);\r\n const [serverSidePaginationData, setServerSidePaginationData] = useState({\r\n search: \"\",\r\n rows_per_page: 50,\r\n current_page: 1,\r\n });\r\n const [filterData, setFilterData] = useState({});\r\n const [changeFilterData, setChangeFilterData] = useState(false);\r\n\r\n const [showAdd, setShowAdd] = useState(false);\r\n const [showEdit, setShowEdit] = useState(false);\r\n const [showDelete, setShowDelete] = useState(false);\r\n const [showView, setShowView] = useState(false);\r\n const [selectedItem, setSelectedItem] = useState(null);\r\n\r\n const handleMenuAction = (action, item) => {\r\n if (action === \"edit\") {\r\n setSelectedItem(item);\r\n setShowEdit(true);\r\n } else if (action === \"view\") {\r\n setSelectedItem(item);\r\n setShowView(true);\r\n } else if (action === \"delete\") {\r\n setSelectedItem(item);\r\n setShowDelete(true);\r\n }\r\n };\r\n\r\n const executeAction = async (\r\n action,\r\n onSuccess,\r\n success_message = \"\",\r\n error_message = \"\",\r\n ) => {\r\n setFormLoading(true);\r\n\r\n try {\r\n const resp = await action?.();\r\n if (success_message || resp.message) {\r\n enqueueSnackbar(success_message || resp.message, {\r\n variant: \"success\",\r\n });\r\n }\r\n onSuccess?.(resp);\r\n } catch (error) {\r\n if (error_message || error.message) {\r\n enqueueSnackbar(error_message || error.message, { variant: \"error\" });\r\n }\r\n } finally {\r\n setFormLoading(false);\r\n }\r\n };\r\n\r\n const handleAddResult = (resp) => {\r\n let newObj = resp.newObject;\r\n if (isStaticData) {\r\n setListingData((prev) => [newObj, ...prev]);\r\n setPaginationData((prev) => ({\r\n ...prev,\r\n current_page: 1,\r\n }));\r\n } else {\r\n setServerSidePaginationData((prev) => ({\r\n ...prev,\r\n current_page: 1,\r\n }));\r\n if (serverSidePaginationData.current_page == 1) {\r\n handleGetListing();\r\n }\r\n }\r\n setShowAdd(false);\r\n };\r\n\r\n const handleEditResult = (resp) => {\r\n let updatedObj = resp.newObject;\r\n let targetObj = resp.targetObject;\r\n if (isStaticData) {\r\n setListingData((prev) =>\r\n prev.map((item) =>\r\n item.id === targetObj.id ? { ...item, ...updatedObj } : item,\r\n ),\r\n );\r\n } else {\r\n handleGetListing();\r\n }\r\n setShowEdit(false);\r\n };\r\n\r\n const handleDeleteResult = (resp) => {\r\n if (!resp) {\r\n setShowDelete(false);\r\n setSelectedItem(null);\r\n return;\r\n }\r\n\r\n if (isStaticData) {\r\n setListingData((prev) =>\r\n prev.filter((item) => item.id !== resp.targetObject.id),\r\n );\r\n } else {\r\n if (\r\n listingData.length == 1 &&\r\n serverSidePaginationData.current_page > 1\r\n ) {\r\n setServerSidePaginationData((prev) => ({\r\n ...prev,\r\n current_page: prev.current_page - 1,\r\n }));\r\n } else {\r\n handleGetListing();\r\n }\r\n }\r\n setShowDelete(false);\r\n setSelectedItem(null);\r\n };\r\n\r\n const handleAddFormSubmit = (formData) =>\r\n executeAction(\r\n () => modalConfig?.addModal?.handleSubmit?.(formData),\r\n handleAddResult,\r\n );\r\n\r\n const handleEditFormSubmit = (formData) =>\r\n executeAction(\r\n () => modalConfig?.editModal?.handleSubmit?.(formData, selectedItem),\r\n handleEditResult,\r\n );\r\n\r\n const handleDeleteConfirm = () =>\r\n executeAction(\r\n () => modalConfig?.deleteModal?.action?.(selectedItem),\r\n handleDeleteResult,\r\n );\r\n\r\n const handleGetListing = async () => {\r\n setLoading(true);\r\n\r\n fetchData?.({ ...serverSidePaginationData, ...filterData })\r\n .then((resp) => {\r\n setListingData(resp.data);\r\n setPaginationData(resp.pagination);\r\n })\r\n .catch((error) => {\r\n enqueueSnackbar(error.message, { variant: \"error\" });\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n };\r\n\r\n const handleFilterData = (data) => {\r\n setFilterData((prev) => ({\r\n ...data,\r\n }));\r\n if (tableConfig?.filter?.useServerSideFilters) {\r\n setChangeFilterData((prev) => !prev);\r\n }\r\n };\r\n\r\n const filterByMatchingFields = (data, filters) => {\r\n return data.filter((item) =>\r\n Object.entries(filters).every(([key, value]) => item[key] === value),\r\n );\r\n };\r\n\r\n const filteredData = useMemo(() => {\r\n if (tableConfig?.filter?.useServerSideFilters) return listingData;\r\n return filterByMatchingFields(listingData, filterData);\r\n }, [listingData, filterData]);\r\n\r\n useEffect(() => {\r\n handleGetListing();\r\n }, [\r\n serverSidePaginationData.search,\r\n serverSidePaginationData.rows_per_page,\r\n serverSidePaginationData.current_page,\r\n changeFilterData,\r\n ]);\r\n\r\n return (\r\n <div>\r\n {/* Table */}\r\n <Table\r\n title={title}\r\n setShowAdd={setShowAdd}\r\n description={config.description}\r\n buttonText={config.buttonText}\r\n showAddButton={!!modalConfig.addModal}\r\n config={{\r\n ...tableConfig,\r\n pagination: {\r\n ...tableConfig.pagination,\r\n ...paginationData,\r\n },\r\n data: filteredData,\r\n setServerSidePaginationData: setServerSidePaginationData,\r\n onMenuAction: handleMenuAction,\r\n filterConfig,\r\n onFilterApply: handleFilterData,\r\n loading,\r\n }}\r\n />\r\n\r\n {/* Add Modal */}\r\n <Modal\r\n isOpen={showAdd}\r\n onClose={() => {\r\n if (!formLoading) {\r\n setShowAdd(false);\r\n }\r\n }}\r\n icon={modalConfig.addModal?.icon}\r\n title={modalConfig.addModal?.title || \"Add New\"}\r\n size={modalConfig.addModal?.size || \"md\"}\r\n onFormSubmit={() => document.querySelector(\"#addForm\")?.requestSubmit()}\r\n loadingBtn={formLoading}\r\n actionButtons={modalConfig?.addModal?.actionButtons || []}\r\n >\r\n <Form\r\n config={modalConfig?.addModal || {}}\r\n onSubmit={handleAddFormSubmit}\r\n initialData={{}}\r\n type=\"add\"\r\n loading={formLoading}\r\n />\r\n </Modal>\r\n\r\n {/* Edit Modal */}\r\n <Modal\r\n isOpen={showEdit}\r\n onClose={() => {\r\n if (!formLoading) {\r\n setShowEdit(false);\r\n }\r\n }}\r\n icon={modalConfig.editModal?.icon}\r\n title={modalConfig.editModal?.title || \"Edit\"}\r\n size={modalConfig.editModal?.size || \"md\"}\r\n onFormSubmit={() =>\r\n document.querySelector(\"#editForm\")?.requestSubmit()\r\n }\r\n actionButtons={modalConfig?.editModal?.actionButtons || []}\r\n loadingBtn={formLoading}\r\n >\r\n <Form\r\n config={modalConfig.editModal || {}}\r\n onSubmit={handleEditFormSubmit}\r\n initialData={selectedItem}\r\n type=\"edit\"\r\n loading={formLoading}\r\n fetchRowDetails={fetchRowDetails}\r\n />\r\n </Modal>\r\n\r\n {/* Delete Modal */}\r\n {showDelete && (\r\n <Modal\r\n isOpen={showDelete}\r\n onClose={(resp) => {\r\n handleDeleteResult(resp);\r\n }}\r\n icon={\r\n modalConfig.deleteModal?.icon || (\r\n <Icon icon=\"ph:warning-bold\" className=\"w-6 h-6 text-red-500\" />\r\n )\r\n }\r\n title={modalConfig.deleteModal?.title || \"Confirm Delete\"}\r\n size={modalConfig.deleteModal?.size || \"md\"}\r\n loading={formLoading}\r\n actionButtons={modalConfig?.deleteModal?.actionButtons || []}\r\n executeFunction={executeAction}\r\n selectedItem={selectedItem}\r\n >\r\n <div className=\"flex items-center space-x-2 py-3\">\r\n <div>\r\n <p className=\"text-md text-gray-700 dark:text-white\">\r\n {modalConfig.deleteModal?.confirmText ||\r\n \"Are you sure you want to delete this item?\"}\r\n </p>\r\n {modalConfig.deleteModal?.referenceKey && (\r\n <p className=\"text-md font-semibold text-gray-700 dark:text-white\">\r\n {selectedItem[modalConfig.deleteModal?.referenceKey]}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </Modal>\r\n )}\r\n\r\n {/* View Detail Modal */}\r\n {modalConfig.viewModal && (\r\n <Modal\r\n isOpen={showView}\r\n onClose={() => {\r\n setShowView(false);\r\n setSelectedItem(null);\r\n }}\r\n icon={modalConfig.viewModal?.icon}\r\n title={modalConfig.viewModal?.title || \"View Details\"}\r\n size={modalConfig.viewModal?.size || \"lg\"}\r\n footerConfig={modalConfig?.viewModal.footer}\r\n >\r\n {modalConfig.viewModal?.component ? (\r\n <modalConfig.viewModal.component data={selectedItem} />\r\n ) : (\r\n <Details\r\n data={selectedItem}\r\n fetchRowDetails={fetchRowDetails}\r\n config={modalConfig.viewModal || {}}\r\n />\r\n )}\r\n </Modal>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nconst optionType = PropTypes.shape({\r\n value: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.number,\r\n PropTypes.bool,\r\n ]).isRequired,\r\n label: PropTypes.string.isRequired,\r\n color: PropTypes.string,\r\n});\r\n\r\nconst actionButtonType = PropTypes.shape({\r\n type: PropTypes.string.isRequired,\r\n label: PropTypes.string.isRequired,\r\n color: PropTypes.string,\r\n variant: PropTypes.string,\r\n onClick: PropTypes.func,\r\n});\r\n\r\nconst menuActionType = PropTypes.shape({\r\n title: PropTypes.string.isRequired,\r\n type: PropTypes.string.isRequired,\r\n variant: PropTypes.string,\r\n icon: PropTypes.node,\r\n});\r\n\r\nconst tableHeadType = PropTypes.shape({\r\n key: PropTypes.string.isRequired,\r\n title: PropTypes.string,\r\n type: PropTypes.string,\r\n imageKey: PropTypes.string,\r\n titleKey: PropTypes.string,\r\n subtitleKey: PropTypes.string,\r\n onClickDetails: PropTypes.bool,\r\n variant: PropTypes.string,\r\n chipOptions: PropTypes.arrayOf(optionType),\r\n defaultColor: PropTypes.string,\r\n className: PropTypes.string,\r\n format: PropTypes.string,\r\n menuList: PropTypes.arrayOf(menuActionType),\r\n});\r\n\r\nconst formFieldType = PropTypes.shape({\r\n key: PropTypes.string.isRequired,\r\n label: PropTypes.string,\r\n type: PropTypes.string.isRequired,\r\n required: PropTypes.bool,\r\n minLength: PropTypes.number,\r\n parentClass: PropTypes.string,\r\n search: PropTypes.bool,\r\n multiple: PropTypes.bool,\r\n dropdownMaxHeight: PropTypes.string,\r\n dragDrop: PropTypes.bool,\r\n countriesList: PropTypes.bool,\r\n defaultCountry: PropTypes.string,\r\n placeholder: PropTypes.string,\r\n rows: PropTypes.number,\r\n text: PropTypes.string,\r\n editorKey: PropTypes.string,\r\n options: PropTypes.arrayOf(optionType),\r\n});\r\n\r\nconst viewFieldType = PropTypes.shape({\r\n key: PropTypes.string,\r\n label: PropTypes.string,\r\n type: PropTypes.string,\r\n imageKey: PropTypes.string,\r\n titleKey: PropTypes.string,\r\n subtitleKey: PropTypes.string,\r\n blockClass: PropTypes.string,\r\n icon: PropTypes.node,\r\n variant: PropTypes.string,\r\n chipOptions: PropTypes.arrayOf(optionType),\r\n defaultColor: PropTypes.string,\r\n className: PropTypes.string,\r\n format: PropTypes.string,\r\n});\r\n\r\nCrudPage.propTypes = {\r\n config: PropTypes.shape({\r\n title: PropTypes.string.isRequired,\r\n description: PropTypes.string,\r\n buttonText: PropTypes.string,\r\n fetchData: PropTypes.func.isRequired,\r\n isStaticData: PropTypes.bool,\r\n\r\n /* ================= TABLE CONFIG ================= */\r\n\r\n tableConfig: PropTypes.shape({\r\n table_head: PropTypes.arrayOf(tableHeadType).isRequired,\r\n\r\n search: PropTypes.shape({\r\n enabled: PropTypes.bool,\r\n useServerSideSearch: PropTypes.bool,\r\n searchKeys: PropTypes.arrayOf(PropTypes.string),\r\n }),\r\n\r\n pagination: PropTypes.shape({\r\n enabled: PropTypes.bool,\r\n useServerSidePagination: PropTypes.bool,\r\n }),\r\n\r\n filter: PropTypes.shape({\r\n enabled: PropTypes.bool,\r\n useServerSideFilters: PropTypes.bool,\r\n }),\r\n }).isRequired,\r\n\r\n /* ================= MODAL CONFIG ================= */\r\n\r\n modalConfig: PropTypes.shape({\r\n addModal: PropTypes.shape({\r\n title: PropTypes.string.isRequired,\r\n size: PropTypes.string,\r\n formClass: PropTypes.string,\r\n formFields: PropTypes.arrayOf(formFieldType),\r\n handleSubmit: PropTypes.func.isRequired,\r\n actionButtons: PropTypes.arrayOf(actionButtonType),\r\n }),\r\n\r\n editModal: PropTypes.shape({\r\n title: PropTypes.string.isRequired,\r\n size: PropTypes.string,\r\n formClass: PropTypes.string,\r\n formFields: PropTypes.arrayOf(formFieldType),\r\n handleSubmit: PropTypes.func.isRequired,\r\n actionButtons: PropTypes.arrayOf(actionButtonType),\r\n }),\r\n\r\n deleteModal: PropTypes.shape({\r\n title: PropTypes.string.isRequired,\r\n size: PropTypes.string,\r\n confirmText: PropTypes.string,\r\n referenceKey: PropTypes.string,\r\n actionButtons: PropTypes.arrayOf(actionButtonType),\r\n }),\r\n\r\n viewModal: PropTypes.shape({\r\n title: PropTypes.string.isRequired,\r\n size: PropTypes.string,\r\n\r\n // 👇 This covers your commented code:\r\n component: PropTypes.elementType, // for custom component like TeamMemberDetail\r\n\r\n fields: PropTypes.arrayOf(viewFieldType),\r\n\r\n footer: PropTypes.shape({\r\n cancelButton: PropTypes.bool,\r\n cancelText: PropTypes.string,\r\n }),\r\n }),\r\n }),\r\n\r\n /* ================= FILTER CONFIG ================= */\r\n\r\n filterConfig: PropTypes.shape({\r\n fields: PropTypes.arrayOf(formFieldType),\r\n }),\r\n }).isRequired,\r\n};\r\n\r\nexport default CrudPage;\r\n","import React from \"react\";\r\nimport { SnackbarProvider, useSnackbar } from \"notistack\";\r\nimport { X } from \"lucide-react\";\r\n\r\nfunction InnerCheck({ children }) {\r\n useSnackbar(); // If this works, provider exists\r\n return children;\r\n}\r\n\r\nexport default function OptionalSnackbarProvider({ children }) {\r\n try {\r\n return <InnerCheck>{children}</InnerCheck>;\r\n } catch (error) {\r\n return (\r\n <SnackbarProvider\r\n anchorOrigin={{\r\n vertical: \"bottom\",\r\n horizontal: \"right\",\r\n }}\r\n action={(snackbarKey) => (\r\n <button\r\n onClick={() => {\r\n window.dispatchEvent(\r\n new CustomEvent(\"closeSnackbar\", { detail: snackbarKey }),\r\n );\r\n }}\r\n className=\"p-1 hover:bg-white/20 rounded-full transition-colors duration-200 text-white flex items-center justify-center\"\r\n >\r\n <X className=\"h-4 w-4\" />\r\n </button>\r\n )}\r\n maxSnack={3}\r\n autoHideDuration={3000}\r\n >\r\n {children}\r\n </SnackbarProvider>\r\n );\r\n }\r\n}\r\n","import React, { useEffect } from \"react\";\r\nimport CrudPage from \"./components/CrudPage\";\r\nimport OptionalSnackbarProvider from \"./OptionalSnackbarProvider\";\r\n\r\nconst injectStyles = () => {\r\n if (typeof document === \"undefined\") return;\r\n if (document.getElementById(\"react-admin-crud-manager-styles\")) return;\r\n\r\n const style = document.createElement(\"style\");\r\n style.id = \"react-admin-crud-manager-styles\";\r\n style.textContent = `\r\n .no-spinner::-webkit-outer-spin-button,\r\n .no-spinner::-webkit-inner-spin-button {\r\n -webkit-appearance: none;\r\n margin: 0;\r\n }\r\n\r\n .no-spinner {\r\n -moz-appearance: textfield;\r\n }\r\n\r\n .tox.tox-tinymce .tox-edit-area::before {\r\n border: 0 !important;\r\n box-shadow: none !important;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n};\r\n\r\nexport default function Crud(props) {\r\n useEffect(() => {\r\n injectStyles();\r\n }, []);\r\n\r\n return (\r\n <OptionalSnackbarProvider>\r\n <CrudPage config={props.config} />\r\n </OptionalSnackbarProvider>\r\n );\r\n}\r\n"],"names":["formatDate","dateString","format","date","pad","n","map","token","searchLocalData","data","searchTerm","searchKeys","lowerSearchTerm","extractValues","obj","item","valuesToSearch","key","val","Button","React","className","variant","color","size","fullWidth","children","props","ref","baseStyles","sizes","colorVariants","colorStyles","_a","sizeStyles","combinedClassName","jsx","InputLabel","label","required","infoText","Fragment","jsxs","Info","Select","options","value","defaultValue","onChange","placeholder","disabled","search","name","parentClass","multiple","dropdownMaxHeight","formData","dependencyKey","open","setOpen","useState","setSearchTerm","showAboveState","setShowAboveState","dropdownRef","useRef","searchInputRef","normalizedOptions","setNormalizedOptions","initialVal","normalize","useEffect","result","normalizedValue","filteredOptions","option","isSelected","optionValue","normalized","handleClickOutside","event","rect","spaceBelow","handleOptionClick","finalValue","exists","newValues","v","selectedLabels","opt","ChevronDown","Search","e","Check","Switch","countries","PhoneInput","countriesList","defaultCountry","find_country_with_code","selectedCountry","setSelectedCountry","fullNumber","setFullNumber","match","c","a","b","handleNumberChange","input","handleCountrySelect","country","filteredCountries","handleInputChange","formatted","TextArea","ImagePicker","accept","id","dragDrop","image","setImage","isDragging","setIsDragging","inputRef","handleFileChange","files","file","preview","imgObj","removeImage","handleDragOver","handleDragLeave","handleDrop","handleButtonClick","Icon","Input","type","onKeyDown","negativeNumberAllow","field","showPassword","setShowPassword","handleKeyDown","prev","TinyEditor","editorKey","height","inline","plugins","toolbar","menubar","fontFamily","initConfig","imageUploadHandler","defaultPlugins","defaultToolbar","handleImageUpload","blobInfo","resolve","reject","url","error","Editor","content","Checkbox","multiSelect","isChecked","handleSingleChange","handleMultipleChange","checked","newValue","index","idx","AudioPicker","audio","setAudio","cleanupAudio","removeAudio","ImagePreview","src","alt","isOpen","setIsOpen","closePreview","handleEsc","X","GroupRow","col","title","subtitle","fallback_icon","targetImage","setTargetImage","openPreview","User","CardGroup","BADGE_COLORS","BADGE_VARIANTS","Chip","colorConfig","variantKey","variantClasses","DetailRow","chipObj","Radio","text","radioOptions","RenderFields","handleChange","rows","inputClass","minLength","renderCondition","optionDependencyKey","pattern","renderType","finalPlaceholder","baseClass","FilterDrawer","onClose","config","onApply","filters","setFilters","handleApply","handleReset","TableSkeleton","columns","_","rowIndex","colIndex","Table","setShowAdd","buttonText","description","showAddButton","table_head","loading","filter","pagination","emptyMessage","onMenuAction","setServerSidePaginationData","onFilterApply","filterConfig","rowClick","activeMenu","setActiveMenu","menuList","setMenuList","menuPosition","setMenuPosition","showFilters","setShowFilters","appliedFilters","setAppliedFilters","filteredData","useMemo","currentPage","setCurrentPage","pageSize","setPageSize","totalRecords","setTotalRecords","totalPages","paginatedData","start","menuRef","buttonRefs","searchTimeoutRef","handleSearchChange","handleActionClick","action","handleMenuToggle","itemId","menu_list","button","menuWidth","menuHeight","viewportWidth","viewportHeight","left","top","calculateRowNumber","renderAvatar","imageSrc","imageAlt","row","renderAudio","audioSrc","Music","renderGroupCell","handleRenderChip","handleRenderCellValue","el","EllipsisVertical","handleRowClick","handleColumnClick","isRowClickable","isColumnClickable","handleScroll","Plus","Filter","newLimit","newPage","ChevronLeft","ChevronRight","createPortal","i","d","Modal","icon","actionButtons","actions","showDefaultClose","footerConfig","hideFooter","onFormSubmit","onCancel","loadingBtn","executeFunction","selectedItem","sizeClasses","btn","resp","Form","onSubmit","initialData","fetchRowDetails","formClass","formFields","setFormData","dataLoading","setDataLoading","handleGetDetails","enqueueSnackbar","handleSubmit","form","Details","fields","containerClass","detailsData","setDetailsData","CrudPage","fetchData","isStaticData","tableConfig","modalConfig","setLoading","formLoading","setFormLoading","listingData","setListingData","paginationData","setPaginationData","serverSidePaginationData","filterData","setFilterData","changeFilterData","setChangeFilterData","showAdd","showEdit","setShowEdit","showDelete","setShowDelete","showView","setShowView","setSelectedItem","handleMenuAction","executeAction","onSuccess","success_message","error_message","handleAddResult","newObj","handleGetListing","handleEditResult","updatedObj","targetObj","handleDeleteResult","handleAddFormSubmit","_b","handleEditFormSubmit","handleFilterData","filterByMatchingFields","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","_p","_q","_r","_s","optionType","PropTypes","actionButtonType","menuActionType","tableHeadType","formFieldType","viewFieldType","InnerCheck","useSnackbar","OptionalSnackbarProvider","SnackbarProvider","snackbarKey","injectStyles","style","Crud"],"mappings":"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"}