super-utilix 1.0.1 → 1.1.0
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.
- package/README.md +510 -41
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/{index.d.mts → index.d.cts} +29 -9
- package/dist/index.d.ts +29 -9
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +66 -40
- package/dist/index.mjs +0 -2
- package/dist/index.mjs.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../index.ts","../src/arabic.ts","../src/curdOperation.ts","../src/dateUtils.ts","../src/domUtils.ts","../src/eventHandlers.ts","../src/filter.ts","../src/objectUtils.tsx","../src/queryUtils.ts","../src/search.ts","../src/validationDate.ts"],"sourcesContent":["export * from './src/arabic';\r\nexport * from './src/curdOperation';\r\nexport * from './src/dateUtils';\r\nexport * from './src/domUtils';\r\nexport * from './src/eventHandlers';\r\nexport * from './src/filter';\r\nexport * from './src/objectUtils';\r\nexport * from './src/queryUtils';\r\nexport * from './src/search';\r\nexport * from './src/validationDate';","export const literalOrdinals = (num: number, lang: \"ar\" | \"en\"): string => {\n if (lang === \"ar\") {\n const ones = [\"\", \"الأول\", \"الثاني\", \"الثالث\", \"الرابع\", \"الخامس\", \"السادس\", \"السابع\", \"الثامن\", \"التاسع\"];\n const teens = [\"الحادي عشر\", \"الثاني عشر\", \"الثالث عشر\", \"الرابع عشر\", \"الخامس عشر\", \"السادس عشر\", \"السابع عشر\", \"الثامن عشر\", \"التاسع عشر\"];\n const tens = [\"\", \"العاشر\", \"العشرون\", \"الثلاثون\", \"الأربعون\", \"الخمسون\", \"الستون\", \"السبعون\", \"الثمانون\", \"التسعون\"];\n const hundreds = [\"\", \"المائة\", \"المئتان\", \"الثلاثمائة\", \"الأربعمائة\", \"الخمسمائة\", \"الستمائة\", \"السبعمائة\", \"الثمانمائة\", \"التسعمائة\"];\n\n if (num === 1) return \"الأول\";\n if (num >= 2 && num <= 9) return ones[num];\n if (num >= 11 && num <= 19) return teens[num - 11];\n if (num % 10 === 0 && num < 100) return tens[num / 10];\n\n const remainder = num % 10;\n const base = Math.floor(num / 10) * 10;\n\n if (base === 10) return `ال${ones[remainder]} عشر`;\n if (remainder === 1) return `الحادي ${tens[base / 10]}`;\n if (remainder === 2) return `الثاني ${tens[base / 10]}`;\n const result = `${ones[remainder]} و${tens[base / 10]}`;\n\n const hundredPart = Math.floor(num / 100);\n const remainderPart = num % 100;\n if (hundredPart > 0) {\n if (remainderPart === 0) return hundreds[hundredPart];\n return `${hundreds[hundredPart]} و${literalOrdinals(remainderPart, lang)}`;\n }\n\n return result;\n } else {\n const suffixes = [\"th\", \"st\", \"nd\", \"rd\"];\n const v = num % 100;\n return num + (suffixes[(v - 20) % 10] || suffixes[v] || suffixes[0]);\n }\n};\n","// Create\nexport const handleCreateFront = ({ items, setItems, itemData }: { items?: any[]; setItems?: any; itemData?: any }) => {\n if (!items || !setItems || !itemData) return;\n const newItem: any = {\n // id: items.length > 0 ? Math.max(...items.map((item) => item.id)) + 1 : 1,\n id: Number(new Date().getTime()),\n ...itemData,\n };\n newItem && setItems([...items, newItem]);\n};\n// CreateUnique\nexport const handleCreateFrontUnique = ({ items, setItems, itemData, uniqueField }: { items?: any[]; setItems?: any; itemData?: any; uniqueField?: string }) => {\n if (!items || !setItems || !itemData) return;\n\n // Check if the item already exists in the array\n const itemExists = items.some((item) => {\n // If uniqueField is provided and itemData is an object\n if (uniqueField && typeof itemData === \"object\" && itemData !== null) {\n return item[uniqueField] === itemData[uniqueField];\n }\n // For primitive types (string, number, boolean, etc.)\n return item === itemData;\n });\n\n // Only add the item if it doesn't already exist\n if (!itemExists) {\n // const newItem = {\n // id: Number(new Date().getTime()),\n // ...(typeof itemData === \"object\" && itemData !== null ? itemData : { value: itemData }),\n // };\n setItems([...items, itemData]);\n }\n};\n\n// Update\nexport const handleUpdateFront = ({ id, items, setItems, itemData }: { id?: number | string; items?: any[]; setItems?: any; itemData?: any }) => {\n if (!id || !items || !setItems || !itemData) return;\n setItems(items?.map((item) => (item.id === id ? { ...item, ...itemData } : item)));\n};\n\n// Delete\nexport const handleDeleteFront = ({ id, items, setItems }: { id?: number | string | null | (number | string | null)[]; items?: any[]; setItems?: any }) => {\n if (!id || !items || !setItems) return;\n setItems(\n items?.filter((item: any) => {\n if (typeof item === \"object\" && item !== null && !Array.isArray(id)) {\n return item.id !== id;\n } else if (Array.isArray(id)) {\n return !id.includes(item.id ?? item);\n } else {\n return item !== id;\n }\n }),\n );\n};\n","import dayjs from \"dayjs\";\n\nexport const formatDateTime = (date: string | Date | null | undefined) => {\n if (!date) return \"\";\n const newDate = new Date(date);\n //old: \"YYYY-MM-DD\"\n\n return dayjs(newDate).format(\"DD/MM/YYYY, h:mmA\");\n};\n\nexport const formatDate = (date: string | Date | null | undefined) => {\n if (!date) return \"\";\n // return date only\n const newDate = new Date(date);\n //old: \"YYYY-MM-DD\"\n return dayjs(newDate).format(\"DD/MM/YYYY\");\n};\n\nexport const isNotFutureDate = (date: string) => {\n const val = new Date(date);\n // Check if the date is not in the future based on day\n\n const now = new Date();\n now.setDate(now.getDate() + 1);\n now.setHours(0, 0, 0, 0);\n return val < now;\n};\n\nexport function getTime(inputDate: string | Date | null | undefined): string {\n if (!inputDate) return \"\";\n const date = new Date(inputDate);\n const pad = (num: number) => num.toString().padStart(2, \"0\");\n const formattedHours = pad(date.getHours());\n const formattedMinutes = pad(date.getMinutes());\n return `${formattedHours}:${formattedMinutes}`;\n}\n\ninterface Age {\n years: number;\n months: number;\n days: number;\n}\n\nexport const calculateDetailedAge = (birthDate?: Date | string | null, t = (key: string) => key, currentDate: Date | string = new Date(), gender?: string): { age: Age; message: string } => {\n const zeroAge = {\n age: {\n years: 0,\n months: 0,\n days: 0,\n },\n message: t(\"no_age\"),\n };\n if (birthDate === null || birthDate === undefined) {\n return zeroAge;\n }\n // Convert to Date objects if strings are passed\n const birth: Date = birthDate instanceof Date ? birthDate : isValidISODate(birthDate) ? new Date(birthDate) : new Date(Number(birthDate));\n\n const current: Date = currentDate instanceof Date ? currentDate : new Date(Number(currentDate));\n // Validate input dates\n if (isNaN(birth.getTime()) || isNaN(current.getTime())) {\n // throw new Error(\"Invalid date input\");\n return zeroAge;\n }\n\n // Ensure current date is not before birth date\n if (current < birth) {\n // throw new Error(\"Current date cannot be before birth date\");\n return zeroAge;\n }\n\n // Calculate years, months, and days\n let years = current.getFullYear() - birth.getFullYear();\n let months = current.getMonth() - birth.getMonth();\n let days = current.getDate() - birth.getDate();\n\n // Adjust calculations if needed\n if (days < 0) {\n // Borrow days from previous month\n const lastMonth = new Date(current.getFullYear(), current.getMonth(), 0);\n days += lastMonth.getDate();\n months--;\n }\n\n if (months < 0) {\n years--;\n months += 12;\n }\n\n return {\n age: {\n years,\n months,\n days,\n },\n message: `${years} ${t(\"years\")} - ${months} ${t(\"months\")} - ${days} ${t(\"days\")} / ${t(gender ?? \"\")}`,\n };\n};\n\nexport const birthDateToAge = (birthDate?: Date | string | null) => {\n if (!birthDate) return null;\n const birth = new Date(birthDate);\n const today = new Date();\n\n let years = today.getFullYear() - birth.getFullYear();\n let months = today.getMonth() - birth.getMonth();\n let days = today.getDate() - birth.getDate();\n\n if (days < 0) {\n months--;\n days += new Date(today.getFullYear(), today.getMonth(), 0).getDate();\n }\n if (months < 0) {\n years--;\n months += 12;\n }\n\n return { years, months, days };\n};\n\nexport const ageToBirthDate = (age: { years: number; months: number; days: number }) => {\n const today = new Date();\n const birthYear = today.getFullYear() - age.years;\n const birthMonth = today.getMonth() - age.months;\n const birthDay = today.getDate() - age.days;\n\n let birthDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());\n birthDate.setFullYear(birthYear);\n birthDate.setMonth(birthMonth);\n birthDate.setDate(birthDay);\n\n return birthDate;\n};\n\nexport const ageToBirthDateChangeSegment = (oldAge: { years: number; months: number; days: number } | null, age: { years: number; months: number; days: number }) => {\n const today = new Date();\n const birthYear = oldAge && oldAge.years ? oldAge.years - age.years : today.getFullYear() - age.years;\n const birthMonth = oldAge && oldAge.months ? oldAge.months - age.months : today.getMonth() - age.months;\n const birthDay = oldAge && oldAge.days ? oldAge.days - age.days : today.getDate() - age.days;\n\n let birthDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());\n birthDate.setFullYear(birthYear);\n birthDate.setMonth(birthMonth);\n birthDate.setDate(birthDay);\n\n return birthDate;\n};\n\nexport function convertTimeToTimestamp(timeString: string): number {\n // Split the input string into days and time components\n const [daysPart, timePart] = timeString.split(\" \");\n\n // Extract days (remove leading zeros)\n const days = parseInt(daysPart.replace(/^0+/, \"\"), 10);\n\n // Split time into hours, minutes, seconds\n const [hours, minutes, seconds] = timePart?.split(\":\").map((part) => parseInt(part, 10));\n\n // Calculate total milliseconds\n // 1 day = 24 * 60 * 60 * 1000 milliseconds\n const totalMilliseconds =\n days * 24 * 60 * 60 * 1000 + // days to milliseconds\n hours * 60 * 60 * 1000 + // hours to milliseconds\n minutes * 60 * 1000 + // minutes to milliseconds\n seconds * 1000; // seconds to milliseconds\n\n return totalMilliseconds;\n}\n\n// Calculate age function (accept iso format)\nexport const calculateAge = (birthDate: string): number => {\n const today = new Date();\n let birth: Date;\n\n if (birthDate.includes(\"/\")) {\n // DD/MM/YYYY\n const [day, month, year] = birthDate.split(\"/\").map(Number);\n birth = new Date(year, month - 1, day);\n } else if (!isNaN(Date.parse(birthDate))) {\n // ISO or any valid date string\n birth = new Date(birthDate);\n } else {\n throw new Error(\"Unsupported date format\");\n }\n\n let age = today.getFullYear() - birth.getFullYear();\n const m = today.getMonth() - birth.getMonth();\n\n if (m < 0 || (m === 0 && today.getDate() < birth.getDate())) {\n age--;\n }\n\n return age;\n};\n\nfunction isValidISODate(dateString: string): boolean {\n const date = new Date(dateString);\n // Check if the date is valid (not \"Invalid Date\") and if its ISO string representation matches the original.\n // The second check helps to ensure the string was correctly parsed as an ISO date and not some other format.\n return !isNaN(date.getTime()) && date.toISOString() === dateString;\n}\n","export const getTextOnlyFromHtml = (html?: string): string => {\n const parser = new DOMParser();\n const doc = html && parser.parseFromString(html, \"text/html\");\n return (doc && doc.body.textContent) ?? \"\";\n};\n","export const handleKeyDownArabic = (event: any) => {\n const { key, ctrlKey, metaKey } = event;\n // Allow control keys like backspace, delete, arrow keys, etc.\n if (\n key === \"Backspace\" ||\n key === \"Delete\" ||\n key === \"ArrowLeft\" ||\n key === \"ArrowRight\" ||\n key === \"ArrowUp\" ||\n key === \"ArrowDown\" ||\n key === \"Tab\" ||\n key === \"Enter\"\n ) {\n return; // Allow these keys without further checking\n }\n // Allow copy, paste, cut, select all (Ctrl/Command + C, V, X, A)\n if (\n (ctrlKey || metaKey) &&\n (key === \"c\" || key === \"v\" || key === \"x\" || key === \"a\")\n ) {\n return;\n }\n // Check if the key matches Arabic characters, numbers, symbols, or whitespace\n if (!/[\\u0600-\\u06FF0-9\\s!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~]/.test(key)) {\n event.preventDefault();\n }\n};\n\nexport const handleKeyDownEnglish = (event: any) => {\n const { key, ctrlKey, metaKey } = event;\n // Allow control keys like backspace, delete, arrow keys, etc.\n if (\n key === \"Backspace\" ||\n key === \"Delete\" ||\n key === \"ArrowLeft\" ||\n key === \"ArrowRight\" ||\n key === \"ArrowUp\" ||\n key === \"ArrowDown\" ||\n key === \"Tab\" ||\n key === \"Enter\"\n ) {\n return; // Allow these keys without further checking\n }\n // Allow copy, paste, cut, select all (Ctrl/Command + C, V, X, A)\n if (\n (ctrlKey || metaKey) &&\n (key === \"c\" || key === \"v\" || key === \"x\" || key === \"a\")\n ) {\n return;\n }\n\n // Check if the key matches English letters, numbers, or symbols\n if (!/[A-Za-z0-9\\s!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~]/.test(key)) {\n event.preventDefault();\n }\n};\n\nexport const handleKeyDownNumber = (event: any) => {\n const { key, ctrlKey, metaKey } = event;\n\n // Allow keys for navigation, deletion, tab, and enter\n if (\n key === \"Backspace\" ||\n key === \"Delete\" ||\n key === \"ArrowLeft\" ||\n key === \"ArrowRight\" ||\n key === \"ArrowUp\" ||\n key === \"ArrowDown\" ||\n key === \"Tab\" ||\n key === \"Enter\"\n ) {\n return;\n }\n\n // Allow copy, paste, cut, select all (Ctrl/Command + C, V, X, A)\n if (\n (ctrlKey || metaKey) &&\n (key === \"c\" || key === \"v\" || key === \"x\" || key === \"a\")\n ) {\n return;\n }\n\n // Prevent non-numeric input\n if (!/[0-9]/.test(key)) {\n event.preventDefault();\n }\n};\n\nexport const handleKeyDownNumberNoCopy = (event: any) => {\n const { key } = event;\n\n // Allow keys for navigation, deletion, tab, and enter\n if (\n key === \"Backspace\" ||\n key === \"Delete\" ||\n key === \"ArrowLeft\" ||\n key === \"ArrowRight\" ||\n key === \"ArrowUp\" ||\n key === \"ArrowDown\" ||\n key === \"Tab\" ||\n key === \"Enter\"\n ) {\n return;\n }\n // Prevent non-numeric input\n if (!/[0-9]/.test(key)) {\n event.preventDefault();\n }\n};\n\nexport const handleKeyDownFloatNumber = (event: any) => {\n const { key, ctrlKey, metaKey } = event;\n const input = event.currentTarget;\n\n // Allow keys for navigation, deletion, tab, and enter\n if (\n key === \"Backspace\" ||\n key === \"Delete\" ||\n key === \"ArrowLeft\" ||\n key === \"ArrowRight\" ||\n key === \"ArrowUp\" ||\n key === \"ArrowDown\" ||\n key === \"Tab\" ||\n key === \"Enter\"\n ) {\n return;\n }\n\n // Allow copy, paste, cut, select all (Ctrl/Command + C, V, X, A)\n if (\n (ctrlKey || metaKey) &&\n (key === \"c\" || key === \"v\" || key === \"x\" || key === \"a\")\n ) {\n return;\n }\n\n // Allow one decimal point if it doesn't already exist\n if (key === \".\" && !input.value.includes(\".\")) {\n return;\n }\n\n // Prevent non-numeric input (allow numbers and one decimal point)\n if (!/[0-9]/.test(key) && key !== \".\") {\n event.preventDefault();\n }\n};\n","export function filterInArray<T>(field: keyof T, values: T[keyof T][], data: T[]): T[] {\n if (values.length === 0) return data;\n return data.filter((item) => values.includes(item[field]));\n}\n\nexport function filterInObjects(\n data: any[] = [],\n query: string[],\n childrenField: string = \"children\",\n fieldsToFilter?: string[], // Optional array of fields to filter on\n): any[] {\n if (!data) return [];\n if (!query || query?.length === 0) return data;\n\n // Helper function to check if the specified field or all fields match the query.\n const matchesQuery = (obj: any): boolean => {\n const valuesToFilter = fieldsToFilter\n ? fieldsToFilter.map((field) => obj[field]).filter(Boolean) // Only valid fields\n : Object.values(obj); // Default to all fields\n\n return valuesToFilter.some((value) => typeof value === \"string\" && query.some((q) => value.includes(q)));\n };\n\n // Recursive function to filter objects and extract matching ones.\n const filter = (data: any[]): any[] => {\n let results: any[] = [];\n\n data.forEach((item) => {\n // If the current item matches, add it to the results.\n if (matchesQuery(item)) {\n results.push(item);\n }\n\n // Recursively filter the children and add their matches.\n if (item[childrenField]) {\n results = results.concat(filter(item[childrenField]));\n }\n });\n\n return results;\n };\n\n return filter(data);\n}\n","import { isArray, isDate, isEqual, isObject, omit } from \"lodash\";\n\nexport const capitalizeString = (str: string) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\nexport function removeEmptyFields<T extends Record<string, any>>(obj: T): Partial<T> {\n return Object.fromEntries(Object.entries(obj).filter(([, value]) => value?.length !== 0 && value !== null && value !== undefined)) as Partial<T>;\n}\n\ntype WithId = {\n _id?: string;\n\n [key: string]: any;\n};\n\nexport function removeIdFromObjects<T extends WithId>(objects: T[]): Omit<T, \"_id\">[] {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n return objects.map(({ _id, ...rest }) => rest);\n}\n\nexport function removeItemsWithIds(array: any[], idsToRemove: string[]): any[] {\n return array.filter((item) => !item?._id || !idsToRemove.includes(item?._id));\n}\n\nexport function createOptionsArray<T>(data: T[], valueField: keyof T, ...labelFields: (keyof T)[]) {\n return data.map((item) => ({\n value: item[valueField] as string | number,\n label: labelFields.map((field) => item[field]).join(\" \"),\n }));\n}\n\nexport function filterUsersOption(option: any, inputValue: string) {\n const fullNameLabel = `${option?.label?.props?.children?.[0]?.props?.children}`;\n const emailLabel = option?.label?.props?.children?.[1]?.props?.children;\n\n return fullNameLabel?.toLowerCase()?.includes(inputValue?.toLowerCase()) || emailLabel?.toLowerCase()?.includes(inputValue?.toLowerCase());\n}\n\nexport function removeKeys(obj: any, keys: string[]): any {\n const clonedObj = { ...obj };\n\n for (const key of keys) {\n delete clonedObj[key];\n }\n\n return clonedObj;\n}\n\nexport function getArrayKeys(obj: any) {\n const result = [];\n for (const key in obj) {\n if (Array.isArray(obj[key])) {\n result.push({ [key]: obj[key] });\n }\n }\n return result;\n}\n\nexport function convertObjectToArray(obj: any): any[] {\n if (!obj) return [];\n return Object.entries(obj).map(([key, value]) => ({\n [key]: value,\n }));\n}\n\ntype Permission = {\n [key: string]: string[];\n};\n\nexport function comparePermissionLists(list1: Permission[], list2: Permission[]): boolean {\n if (list1.length !== list2.length) {\n return false;\n }\n\n for (let i = 0; i < list1.length; i++) {\n const keys1 = Object.keys(list1[i]);\n const keys2 = Object.keys(list2[i]);\n\n if (keys1.length !== keys2.length) {\n return false;\n }\n\n for (const key of keys1) {\n if (!keys2.includes(key)) {\n return false;\n }\n\n const values1 = list1[i][key];\n const values2 = list2[i][key];\n\n if (values1.length !== values2.length) {\n return false;\n }\n\n for (const value of values1) {\n if (!values2.includes(value)) {\n return false;\n }\n }\n }\n }\n\n return true;\n}\n\nexport function objectToFormData(obj: Record<string, any>, formData: FormData = new FormData(), namespace: string = \"\"): FormData {\n for (let key in obj) {\n if (!obj.hasOwnProperty(key)) continue;\n\n const formKey = namespace ? `${namespace}[${key}]` : key;\n\n if (typeof obj[key] === \"object\" && !(obj[key] instanceof File)) {\n // If it's an array or object, call the function recursively\n objectToFormData(obj[key], formData, formKey);\n } else {\n // Otherwise append the value\n formData.append(formKey, obj[key]);\n }\n }\n\n return formData;\n}\n\n/**\n * Compares two objects and returns true if they are equivalent.\n * Ignores specified keys if provided.\n *\n * @param {any} original - The original object.\n * @param {any} updated - The updated object to compare with.\n * @param {string[]} [keysToIgnore=[]] - Optional keys to ignore during comparison.\n * @returns {boolean} - True if objects are equivalent, otherwise false.\n */\nexport function compareObjects(original: any, updated: any, keysToIgnore: string[] = []): boolean {\n const normalizedOriginal = omit(original, keysToIgnore);\n const normalizedUpdated = omit(updated, keysToIgnore);\n\n return isEqual(normalizedOriginal, normalizedUpdated);\n}\n\nexport function getChangedFields(original: any, updated: any): any {\n // Safety net\n if (original == null && updated == null) return {};\n if (original == null) return updated ?? {};\n if (updated == null) return {};\n\n const changedFields: any = {};\n\n Object.keys(updated).forEach((key) => {\n const originalValue = original?.[key];\n const updatedValue = updated?.[key];\n\n // Case 1: Dates\n if (isDate(updatedValue) && isDate(originalValue)) {\n if (originalValue.getTime() !== updatedValue.getTime()) {\n changedFields[key] = updatedValue;\n }\n return;\n }\n\n // Case 2: One is object, the other is not\n if (isObject(updatedValue) && !isObject(originalValue)) {\n changedFields[key] = updatedValue;\n return;\n }\n\n // Case 3: Nested objects (non-array)\n if (\n isObject(updatedValue) &&\n !isArray(updatedValue) &&\n isObject(originalValue) &&\n !isArray(originalValue)\n ) {\n const nestedChanges = getChangedFields(originalValue, updatedValue);\n if (Object.keys(nestedChanges).length > 0) {\n changedFields[key] = nestedChanges;\n }\n return;\n }\n\n // Case 4: Arrays\n if (isArray(updatedValue) || isArray(originalValue)) {\n if (!isEqual(originalValue, updatedValue)) {\n changedFields[key] = updatedValue;\n }\n return;\n }\n\n // Case 5: Primitive values\n if (!isEqual(originalValue, updatedValue)) {\n changedFields[key] = updatedValue;\n }\n });\n\n return changedFields;\n}\n\nexport function sortObjectByKeys<T extends Record<string, any>>(obj: T): T {\n const sortedEntries = Object.entries(obj).sort((a, b) => {\n return a[0].localeCompare(b[0]);\n });\n\n return Object.fromEntries(sortedEntries) as T;\n}\n\nexport function sortObjectByValues<T extends Record<string, any>>(obj: T): T {\n const sortedEntries = Object.entries(obj).sort((a, b) => {\n if (typeof a[1] === \"number\" && typeof b[1] === \"number\") {\n return a[1] - b[1];\n }\n return 0;\n });\n\n return Object.fromEntries(sortedEntries) as T;\n}\n\n// Example usage\n// const data = {\n// name: { ar: \"اختبار333333333\", \"en-US\": \"test333333333\" },\n// description: { ar: \"اختبار33333\", \"en-US\": \"test33333\" },\n// location: { lat: 12345, lng: 12345 },\n// status: { ar: \"test\", \"en-US\": \"test\" },\n// features: [\"66a92a500075488d302b2184\", \"66a92aab0075488d302b2190\"],\n// price: 5000,\n// // attachments: [ videoFile, pictureFile]\n// };\n\n// const formData = objectToFormData(data);\n\n// // Log the FormData keys and values for verification\n// for (let pair of formData.entries()) {\n//\n// }\n\n// const methodsOrder = [\"POST\", \"GET\", \"PATCH\", \"DELETE\", \"DATA\"];\n\n// export const toggleAndSortMethod = (method: string, methodArray: string[]) => {\n// const index = methodArray.indexOf(method);\n// if (index === -1) {\n// // Method not found, add it\n// methodArray.push(method);\n// } else {\n// // Method found, remove it\n// methodArray.splice(index, 1);\n// }\n// // Sort the array based on the defined order\n// methodArray.sort((a, b) => methodsOrder.indexOf(a) - methodsOrder.indexOf(b));\n// return methodArray;\n// };\n\ntype AnyObject = { [key: string]: any };\n\nexport function removeFields(obj: AnyObject, fieldsToRemove: string[]): AnyObject {\n if (Array.isArray(obj)) {\n // Recursively process each item in the array\n return obj.map((item) => removeFields(item, fieldsToRemove));\n } else if (typeof obj === \"object\" && obj !== null) {\n const newObj: AnyObject = {};\n\n // Iterate over each key-value pair in the object\n for (const key in obj) {\n if (!fieldsToRemove.includes(key)) {\n // Only add the key if it's not in fieldsToRemove, and process its value recursively\n newObj[key] = removeFields(obj[key], fieldsToRemove);\n }\n }\n\n return newObj;\n }\n\n // Return primitive types (strings, numbers, etc.) as is\n return obj;\n}\n\nexport function removeFieldsTopLevel(obj: AnyObject | AnyObject[] | null | undefined, fieldsToRemove?: string[]): any {\n if (obj === null || obj === undefined) {\n return obj;\n }\n if (Array.isArray(obj)) {\n // If it's an array, process each item in the array\n return obj.map((item) => {\n if (typeof item === \"object\" && item !== null) {\n return removeFieldsFromObject(item, fieldsToRemove);\n }\n return item; // Return non-object items as is\n });\n } else if (typeof obj === \"object\" && obj !== null) {\n // If it's a single object, remove fields at the top level\n return removeFieldsFromObject(obj, fieldsToRemove);\n }\n\n // If it's neither an object nor an array, return it as is\n return obj;\n}\n\n// Helper function to remove fields from a single object at the top level\nexport function removeFieldsFromObject(obj: AnyObject, fieldsToRemove?: string[]): AnyObject {\n const newObj: AnyObject = { ...obj };\n\n // Remove specified fields from the object\n for (const field of fieldsToRemove || []) {\n delete newObj[field];\n }\n\n return newObj;\n}\n\nexport const getLabelByItemsAndId = (id?: string | number, items?: any[], fields: string[] | string = \"name\") => {\n if (!items || !id) return undefined;\n const item = items?.find((item) => item.id === id);\n if (item) {\n if (Array.isArray(fields)) {\n return fields.map((field) => item[field]).join(\" \");\n }\n return item[fields];\n }\n return \"\";\n};\n// ex\n// {getLabelByItemsAndId(row.getValue(\"name\"), items, [\n// \"firstName\",\n// \"lastName\",\n// ])}\n\nexport const getLabelByItemsAndOptions = (id?: string | number | null, items?: any[]) => {\n if (!items || !id) return undefined;\n const item = items?.find((item) => item.value === id || item?.id === id || item?._id === id);\n if (item) {\n return item.label;\n }\n return \"\";\n};\n// ex {getLabelByItemsAndOptions(row.getValue(\"name\"), usersOptions)}\n","import { removeEmptyFields } from \"./objectUtils\";\n\nexport function toQueryString(params?: any): string {\n if (params)\n return Object.entries(removeEmptyFields(params))\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)\n .join(\"&\");\n return \"\";\n}\n\nexport function pureURLS3(url: string | undefined): string | undefined {\n if (url?.startsWith(\"http\")) {\n return url.split(\".com/\")[1].split(\"?\")[0];\n }\n return url;\n}\n\nexport const createSearchQuery = (params: Record<string, string | number | boolean | undefined | string[] | number[]>) => {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (Array.isArray(value)) {\n for (const v of value) {\n query.append(key, v.toString());\n }\n } else if (value !== undefined) {\n query.append(key, value.toString());\n }\n }\n\n return query.toString();\n};\n\nexport const serializeFormQuery = (params: Record<string, string | number | boolean | undefined | string[] | number[]>) => {\n return Object.entries(params)\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n if (value.length === 0) return \"\";\n return `${key}=${value.join(\",\")}`;\n }\n if (value === undefined || value === \"\") return \"\";\n return `${key}=${value}`;\n })\n .filter((val) => val !== \"\")\n .join(\"&\");\n};\n\nexport const arrFromQuery = (query: string | null) => (!query || query === null || query === \"\" ? [] : query.split(\",\").map((val) => parseInt(val)));\n\nexport const uniqueId = (): number => {\n return Date.now() + Math.floor(Math.random() * 10000);\n};\n\nexport const prePareFilters = (searchParams: URLSearchParams) => {\n const filtersParam = searchParams.get(\"filters\");\n if (!filtersParam) return null;\n\n try {\n const decoded = decodeURIComponent(filtersParam);\n const filtersArray = JSON.parse(decoded);\n\n // Convert filter format to backend format if needed\n // The filters come in format: { column, logic, value, fields, operatorGroup }\n // We need to send them as-is to trigger refetch\n return filtersArray;\n } catch (error) {\n console.error(\"Error parsing filters from URL:\", error);\n return null;\n }\n};\n","\nexport const addSearchParam = (searchParams: URLSearchParams, setSearchParams: any, key: string, value: string) => {\n const newSearchParams = new URLSearchParams(searchParams);\n newSearchParams.set(key, value);\n setSearchParams(newSearchParams);\n};\n\n/**\n * Recursively searches across all fields of objects and their [`${childrenField}`].\n * @param data - The array of objects to search.\n * @param query - The search query string.\n * @returns An array of objects that match the search query.\n */\nexport function searchInObjectsWithParents(\n data: any[] = [],\n query: string = \"\",\n childrenField: string = \"children\",\n fieldsToSearch?: string[], // Optional: Array of specific fields to search\n): any[] {\n if (!data) return [];\n if (!query) return data;\n\n const lowerQuery = query.trim()?.toLowerCase();\n\n // Helper function to check if the object matches the query within the specified fields.\n const matchesQuery = (obj: any): boolean => {\n const valuesToSearch = fieldsToSearch\n ? fieldsToSearch.map((field) => obj[field]).filter(Boolean) // Filter out invalid fields\n : Object.values(obj); // Default to all values\n\n return valuesToSearch.some((value) => typeof value === \"string\" && value?.toLowerCase().includes(lowerQuery));\n };\n\n // Recursive function to search objects and retain matching parents and children.\n const search = (data: any[]): any[] => {\n return data\n .map((item) => {\n const childResults = item[childrenField] ? search(item[childrenField]) : [];\n\n // If the item matches the query or any child matches, include it in the results.\n if (matchesQuery(item) || childResults.length > 0) {\n return {\n ...item,\n [childrenField]: childResults.length > 0 ? childResults : undefined, // Keep only matching children.\n };\n }\n return null; // Exclude non-matching items.\n })\n .filter((item) => item !== null); // Remove null values from the result.\n };\n\n return search(data);\n}\n\nexport function searchInObjects(\n data: any[] = [],\n query: string = \"\",\n childrenField: string = \"children\",\n fieldsToSearch?: string[], // Optional array of fields to search on\n): any[] {\n if (!data) return [];\n if (!query) return data;\n const lowerQuery = query?.trim()?.toLowerCase();\n\n // Helper function to check if the specified field or all fields match the query.\n const matchesQuery = (obj: any): boolean => {\n const valuesToSearch = fieldsToSearch\n ? fieldsToSearch.map((field) => obj[field]).filter(Boolean) // Only valid fields\n : Object.values(obj); // Default to all fields\n\n return valuesToSearch.some((value) => typeof value === \"string\" && value?.toLowerCase().includes(lowerQuery));\n };\n\n // Recursive function to search objects and extract matching ones.\n const search = (data: any[]): any[] => {\n let results: any[] = [];\n\n data.forEach((item) => {\n // If the current item matches, add it to the results.\n if (matchesQuery(item)) {\n results.push(item);\n }\n\n // Recursively search the children and add their matches.\n if (item[childrenField]) {\n results = results.concat(search(item[childrenField]));\n }\n });\n\n return results;\n };\n\n return search(data);\n}\n","export const validateDay = (value: string): string => {\n let sanitizedValue = value.replace(/\\D/g, \"\"); // Remove non-numeric characters\n if (!sanitizedValue) return \"\"; // Allow empty input\n return Math.min(Math.max(parseInt(sanitizedValue, 10), 1), 31).toString(); // Ensure between 1-31\n};\n\nexport const validateMonth = (value: string): string => {\n let sanitizedValue = value.replace(/\\D/g, \"\");\n if (!sanitizedValue) return \"\";\n return Math.min(Math.max(parseInt(sanitizedValue, 10), 1), 12).toString(); // Ensure between 1-12\n};\n\nexport const validateYear = (value: string): string => {\n let sanitizedValue = value.replace(/\\D/g, \"\"); // Remove non-numeric characters\n if (!sanitizedValue) return \"\";\n\n // Allow typing until 4 digits are reached\n if (sanitizedValue.length < 4) return sanitizedValue;\n\n // Ensure the year is at least 1900 when it reaches 4 digits\n const year = parseInt(sanitizedValue, 10);\n return year < 1900 ? \"1900\" : sanitizedValue;\n};\n"],"mappings":"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","names":["index_exports","__export","addSearchParam","ageToBirthDate","ageToBirthDateChangeSegment","arrFromQuery","birthDateToAge","calculateAge","calculateDetailedAge","capitalizeString","compareObjects","comparePermissionLists","convertObjectToArray","convertTimeToTimestamp","createOptionsArray","createSearchQuery","filterInArray","filterInObjects","filterUsersOption","formatDate","formatDateTime","getArrayKeys","getChangedFields","getLabelByItemsAndId","getLabelByItemsAndOptions","getTextOnlyFromHtml","getTime","handleCreateFront","handleCreateFrontUnique","handleDeleteFront","handleKeyDownArabic","handleKeyDownEnglish","handleKeyDownFloatNumber","handleKeyDownNumber","handleKeyDownNumberNoCopy","handleUpdateFront","isNotFutureDate","literalOrdinals","objectToFormData","prePareFilters","pureURLS3","removeEmptyFields","removeFields","removeFieldsFromObject","removeFieldsTopLevel","removeIdFromObjects","removeItemsWithIds","removeKeys","searchInObjects","searchInObjectsWithParents","serializeFormQuery","sortObjectByKeys","sortObjectByValues","toQueryString","uniqueId","validateDay","validateMonth","validateYear","__toCommonJS","literalOrdinals","num","lang","ones","teens","tens","hundreds","remainder","base","result","hundredPart","remainderPart","suffixes","v","handleCreateFront","items","setItems","itemData","newItem","__spreadValues","handleCreateFrontUnique","uniqueField","item","handleUpdateFront","id","handleDeleteFront","_a","import_dayjs","formatDateTime","date","newDate","dayjs","formatDate","isNotFutureDate","val","now","getTime","inputDate","pad","num","formattedHours","formattedMinutes","calculateDetailedAge","birthDate","t","key","currentDate","gender","zeroAge","birth","isValidISODate","current","years","months","days","lastMonth","birthDateToAge","today","ageToBirthDate","age","birthYear","birthMonth","birthDay","ageToBirthDateChangeSegment","oldAge","convertTimeToTimestamp","timeString","daysPart","timePart","hours","minutes","seconds","part","calculateAge","day","month","year","m","dateString","getTextOnlyFromHtml","html","_a","parser","doc","handleKeyDownArabic","event","key","ctrlKey","metaKey","handleKeyDownEnglish","handleKeyDownNumber","handleKeyDownNumberNoCopy","handleKeyDownFloatNumber","input","filterInArray","field","values","data","item","filterInObjects","query","childrenField","fieldsToFilter","matchesQuery","obj","value","q","filter","results","import_lodash","capitalizeString","str","removeEmptyFields","obj","value","removeIdFromObjects","objects","_a","_b","_id","rest","__objRest","removeItemsWithIds","array","idsToRemove","item","createOptionsArray","data","valueField","labelFields","field","filterUsersOption","option","inputValue","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","fullNameLabel","emailLabel","removeKeys","keys","clonedObj","__spreadValues","key","getArrayKeys","result","convertObjectToArray","comparePermissionLists","list1","list2","i","keys1","keys2","values1","values2","objectToFormData","formData","namespace","formKey","compareObjects","original","updated","keysToIgnore","normalizedOriginal","normalizedUpdated","getChangedFields","changedFields","originalValue","updatedValue","nestedChanges","sortObjectByKeys","sortedEntries","a","b","sortObjectByValues","removeFields","fieldsToRemove","newObj","removeFieldsTopLevel","removeFieldsFromObject","getLabelByItemsAndId","id","items","fields","getLabelByItemsAndOptions","toQueryString","params","removeEmptyFields","value","key","pureURLS3","url","createSearchQuery","query","v","serializeFormQuery","val","arrFromQuery","uniqueId","prePareFilters","searchParams","filtersParam","decoded","error","addSearchParam","searchParams","setSearchParams","key","value","newSearchParams","searchInObjectsWithParents","data","query","childrenField","fieldsToSearch","_a","lowerQuery","matchesQuery","obj","field","search","item","childResults","__spreadProps","__spreadValues","searchInObjects","results","validateDay","value","sanitizedValue","validateMonth","validateYear"]}
|
|
1
|
+
{"version":3,"sources":["../src/arabic.ts","../src/curdOperation.ts","../src/date.ts","../src/dom.ts","../src/eventHandlers.ts","../src/filter.ts","../src/object.ts","../src/query.ts","../src/search.ts","../src/validationDate.ts"],"sourcesContent":["export const literalOrdinals = (num: number, lang: 'ar' | 'en'): string => {\n if (lang === 'ar') {\n const ones = [\n '',\n 'الأول',\n 'الثاني',\n 'الثالث',\n 'الرابع',\n 'الخامس',\n 'السادس',\n 'السابع',\n 'الثامن',\n 'التاسع',\n ];\n const teens = [\n 'الحادي عشر',\n 'الثاني عشر',\n 'الثالث عشر',\n 'الرابع عشر',\n 'الخامس عشر',\n 'السادس عشر',\n 'السابع عشر',\n 'الثامن عشر',\n 'التاسع عشر',\n ];\n const tens = [\n '',\n 'العاشر',\n 'العشرون',\n 'الثلاثون',\n 'الأربعون',\n 'الخمسون',\n 'الستون',\n 'السبعون',\n 'الثمانون',\n 'التسعون',\n ];\n const hundreds = [\n '',\n 'المائة',\n 'المئتان',\n 'الثلاثمائة',\n 'الأربعمائة',\n 'الخمسمائة',\n 'الستمائة',\n 'السبعمائة',\n 'الثمانمائة',\n 'التسعمائة',\n ];\n\n if (num === 1) return 'الأول';\n\n // Check hundreds first to avoid incorrect matching in tens logic\n const hundredPart = Math.floor(num / 100);\n const remainderPart = num % 100;\n if (hundredPart > 0) {\n if (remainderPart === 0) return hundreds[hundredPart];\n return `${hundreds[hundredPart]} و${literalOrdinals(remainderPart, lang)}`;\n }\n\n if (num >= 2 && num <= 9) return ones[num];\n if (num >= 11 && num <= 19) return teens[num - 11];\n if (num % 10 === 0 && num < 100) return tens[num / 10];\n\n const remainder = num % 10;\n const base = Math.floor(num / 10) * 10;\n\n if (base === 10) return `ال${ones[remainder]} عشر`;\n if (remainder === 1) return `الحادي و${tens[base / 10]}`;\n if (remainder === 2) return `الثاني و${tens[base / 10]}`;\n const result = `${ones[remainder]} و${tens[base / 10]}`;\n\n return result;\n } else {\n const suffixes = ['th', 'st', 'nd', 'rd'];\n const v = num % 100;\n return num + (suffixes[(v - 20) % 10] || suffixes[v] || suffixes[0]);\n }\n};\n","// Create\nexport const handleCreateFront = ({\n items,\n setItems,\n itemData,\n}: {\n items?: any[];\n setItems?: any;\n itemData?: any;\n}) => {\n if (!items || !setItems || !itemData) return;\n const newItem: any = {\n // id: items.length > 0 ? Math.max(...items.map((item) => item.id)) + 1 : 1,\n id: Number(new Date().getTime()),\n ...itemData,\n };\n if (newItem) setItems([...items, newItem]);\n};\n// CreateUnique\nexport const handleCreateFrontUnique = ({\n items,\n setItems,\n itemData,\n uniqueField,\n}: {\n items?: any[];\n setItems?: any;\n itemData?: any;\n uniqueField?: string;\n}) => {\n if (!items || !setItems || !itemData) return;\n\n // Check if the item already exists in the array\n const itemExists = items.some((item) => {\n // If uniqueField is provided and itemData is an object\n if (uniqueField && typeof itemData === 'object' && itemData !== null) {\n return item[uniqueField] === itemData[uniqueField];\n }\n // For primitive types (string, number, boolean, etc.)\n return item === itemData;\n });\n\n // Only add the item if it doesn't already exist\n if (!itemExists) {\n // const newItem = {\n // id: Number(new Date().getTime()),\n // ...(typeof itemData === \"object\" && itemData !== null ? itemData : { value: itemData }),\n // };\n setItems([...items, itemData]);\n }\n};\n\n// Update\nexport const handleUpdateFront = ({\n id,\n items,\n setItems,\n itemData,\n}: {\n id?: number | string;\n items?: any[];\n setItems?: any;\n itemData?: any;\n}) => {\n if (!id || !items || !setItems || !itemData) return;\n setItems(items?.map((item) => (item.id === id ? { ...item, ...itemData } : item)));\n};\n\n// Delete\nexport const handleDeleteFront = ({\n id,\n items,\n setItems,\n}: {\n id?: number | string | null | (number | string | null)[];\n items?: any[];\n setItems?: any;\n}) => {\n if (!id || !items || !setItems) return;\n setItems(\n items?.filter((item: any) => {\n if (typeof item === 'object' && item !== null && !Array.isArray(id)) {\n return item.id !== id;\n } else if (Array.isArray(id)) {\n return !id.includes(item.id ?? item);\n } else {\n return item !== id;\n }\n }),\n );\n};\n","/**\n * Format tokens:\n * - YYYY: 4-digit year\n * - YY: 2-digit year\n * - MM: 2-digit month (01-12)\n * - M: month (1-12)\n * - DD: 2-digit day (01-31)\n * - D: day (1-31)\n * - HH: 2-digit hour 24h format (00-23)\n * - H: hour 24h format (0-23)\n * - hh: 2-digit hour 12h format (01-12)\n * - h: hour 12h format (1-12)\n * - mm: 2-digit minutes (00-59)\n * - m: minutes (0-59)\n * - ss: 2-digit seconds (00-59)\n * - s: seconds (0-59)\n * - A: AM/PM\n * - a: am/pm\n */\nexport const formatDateWithPattern = (date: Date, format: string): string => {\n const day = date.getDate();\n const month = date.getMonth() + 1;\n const year = date.getFullYear();\n const hours24 = date.getHours();\n const hours12 = hours24 % 12 || 12;\n const minutes = date.getMinutes();\n const seconds = date.getSeconds();\n const ampm = hours24 >= 12 ? 'PM' : 'AM';\n\n const tokens: { [key: string]: string } = {\n YYYY: String(year),\n YY: String(year).slice(-2),\n MM: String(month).padStart(2, '0'),\n M: String(month),\n DD: String(day).padStart(2, '0'),\n D: String(day),\n HH: String(hours24).padStart(2, '0'),\n H: String(hours24),\n hh: String(hours12).padStart(2, '0'),\n h: String(hours12),\n mm: String(minutes).padStart(2, '0'),\n m: String(minutes),\n ss: String(seconds).padStart(2, '0'),\n s: String(seconds),\n A: ampm,\n a: ampm.toLowerCase(),\n };\n\n return format.replace(/YYYY|YY|MM|M|DD|D|HH|H|hh|h|mm|m|ss|s|A|a/g, (match) => tokens[match]);\n};\n\nexport const formatDateTime = (\n date: string | Date | null | undefined,\n format: string = 'DD/MM/YYYY, h:mmA',\n) => {\n if (!date) return '';\n const newDate = new Date(date);\n return formatDateWithPattern(newDate, format);\n};\n\nexport const formatDate = (\n date: string | Date | null | undefined,\n format: string = 'DD/MM/YYYY',\n) => {\n if (!date) return '';\n const newDate = new Date(date);\n return formatDateWithPattern(newDate, format);\n};\n\nexport const isNotFutureDate = (date: string) => {\n const val = new Date(date);\n\n const now = new Date();\n now.setDate(now.getDate() + 1);\n now.setHours(0, 0, 0, 0);\n return val < now;\n};\n\nexport function getTime(inputDate: string | Date | null | undefined): string {\n if (!inputDate) return '';\n const date = new Date(inputDate);\n const pad = (num: number) => num.toString().padStart(2, '0');\n const formattedHours = pad(date.getHours());\n const formattedMinutes = pad(date.getMinutes());\n return `${formattedHours}:${formattedMinutes}`;\n}\n\ninterface Age {\n years: number;\n months: number;\n days: number;\n}\n\nexport const calculateDetailedAge = (\n birthDate?: Date | string | null,\n t: ((key: string) => string) | undefined = undefined,\n currentDate: Date | string = new Date(),\n gender?: string,\n): { age: Age; message: string } => {\n const zeroAge = {\n age: {\n years: 0,\n months: 0,\n days: 0,\n },\n message: t?.('no_age') ?? 'No age',\n };\n\n if (birthDate === null || birthDate === undefined) {\n return zeroAge;\n }\n\n const birth: Date =\n birthDate instanceof Date\n ? birthDate\n : isValidISODate(birthDate)\n ? new Date(birthDate)\n : new Date(Number(birthDate));\n\n const current: Date = currentDate instanceof Date ? currentDate : new Date(Number(currentDate));\n\n if (isNaN(birth.getTime()) || isNaN(current.getTime())) {\n return zeroAge;\n }\n\n if (current < birth) {\n return zeroAge;\n }\n\n let years = current.getFullYear() - birth.getFullYear();\n let months = current.getMonth() - birth.getMonth();\n let days = current.getDate() - birth.getDate();\n\n if (days < 0) {\n const lastMonth = new Date(current.getFullYear(), current.getMonth(), 0);\n days += lastMonth.getDate();\n months--;\n }\n\n if (months < 0) {\n years--;\n months += 12;\n }\n\n return {\n age: {\n years,\n months,\n days,\n },\n message: `${years} ${t?.('years') ?? 'years'} - ${months} ${\n t?.('months') ?? 'months'\n } - ${days} ${t?.('days') ?? 'days'} / ${t?.(gender ?? '') ?? gender}`,\n };\n};\n\nexport const birthDateToAge = (birthDate?: Date | string | null) => {\n if (!birthDate) return null;\n const birth = new Date(birthDate);\n const today = new Date();\n\n let years = today.getFullYear() - birth.getFullYear();\n let months = today.getMonth() - birth.getMonth();\n let days = today.getDate() - birth.getDate();\n\n if (days < 0) {\n months--;\n days += new Date(today.getFullYear(), today.getMonth(), 0).getDate();\n }\n if (months < 0) {\n years--;\n months += 12;\n }\n\n return { years, months, days };\n};\n\nexport const ageToBirthDate = (age: { years: number; months: number; days: number }) => {\n const today = new Date();\n const birthYear = today.getFullYear() - age.years;\n const birthMonth = today.getMonth() - age.months;\n const birthDay = today.getDate() - age.days;\n\n const birthDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());\n birthDate.setFullYear(birthYear);\n birthDate.setMonth(birthMonth);\n birthDate.setDate(birthDay);\n\n return birthDate;\n};\n\nexport const ageToBirthDateChangeSegment = (\n oldAge: { years: number; months: number; days: number } | null,\n age: { years: number; months: number; days: number },\n) => {\n const today = new Date();\n const birthYear =\n oldAge && oldAge.years ? oldAge.years - age.years : today.getFullYear() - age.years;\n const birthMonth =\n oldAge && oldAge.months ? oldAge.months - age.months : today.getMonth() - age.months;\n const birthDay = oldAge && oldAge.days ? oldAge.days - age.days : today.getDate() - age.days;\n\n const birthDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());\n birthDate.setFullYear(birthYear);\n birthDate.setMonth(birthMonth);\n birthDate.setDate(birthDay);\n\n return birthDate;\n};\n\nexport function convertTimeToTimestamp(timeString: string): number {\n const [daysPart, timePart] = timeString.split(' ');\n const days = parseInt(daysPart.replace(/^0+/, ''), 10);\n const [hours, minutes, seconds] = (timePart || '00:00:00')\n .split(':')\n .map((part) => parseInt(part, 10));\n\n const totalMilliseconds =\n days * 24 * 60 * 60 * 1000 + hours * 60 * 60 * 1000 + minutes * 60 * 1000 + seconds * 1000;\n\n return totalMilliseconds;\n}\n\nexport const calculateAge = (birthDate: string): number => {\n const today = new Date();\n let birth: Date;\n\n if (birthDate.includes('/')) {\n const [day, month, year] = birthDate.split('/').map(Number);\n birth = new Date(year, month - 1, day);\n } else if (!isNaN(Date.parse(birthDate))) {\n birth = new Date(birthDate);\n } else {\n throw new Error('Unsupported date format');\n }\n\n let age = today.getFullYear() - birth.getFullYear();\n const m = today.getMonth() - birth.getMonth();\n\n if (m < 0 || (m === 0 && today.getDate() < birth.getDate())) {\n age--;\n }\n\n return age;\n};\n\nfunction isValidISODate(dateString: string): boolean {\n const date = new Date(dateString);\n return !isNaN(date.getTime()) && date.toISOString() === dateString;\n}\n","export const getTextOnlyFromHtml = (html?: string): string => {\n const parser = new DOMParser();\n const doc = html && parser.parseFromString(html, 'text/html');\n return (doc && doc.body.textContent) ?? '';\n};\n","export const handleKeyDownArabic = (event: any) => {\n const { key, ctrlKey, metaKey } = event;\n // Allow control keys like backspace, delete, arrow keys, etc.\n if (\n key === 'Backspace' ||\n key === 'Delete' ||\n key === 'ArrowLeft' ||\n key === 'ArrowRight' ||\n key === 'ArrowUp' ||\n key === 'ArrowDown' ||\n key === 'Tab' ||\n key === 'Enter'\n ) {\n return; // Allow these keys without further checking\n }\n // Allow copy, paste, cut, select all (Ctrl/Command + C, V, X, A)\n if ((ctrlKey || metaKey) && (key === 'c' || key === 'v' || key === 'x' || key === 'a')) {\n return;\n }\n // Check if the key matches Arabic characters, numbers, symbols, or whitespace\n if (!/[\\u0600-\\u06FF0-9\\s!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~]/.test(key)) {\n event.preventDefault();\n }\n};\n\nexport const handleKeyDownEnglish = (event: any) => {\n const { key, ctrlKey, metaKey } = event;\n // Allow control keys like backspace, delete, arrow keys, etc.\n if (\n key === 'Backspace' ||\n key === 'Delete' ||\n key === 'ArrowLeft' ||\n key === 'ArrowRight' ||\n key === 'ArrowUp' ||\n key === 'ArrowDown' ||\n key === 'Tab' ||\n key === 'Enter'\n ) {\n return; // Allow these keys without further checking\n }\n // Allow copy, paste, cut, select all (Ctrl/Command + C, V, X, A)\n if ((ctrlKey || metaKey) && (key === 'c' || key === 'v' || key === 'x' || key === 'a')) {\n return;\n }\n\n // Check if the key matches English letters, numbers, or symbols\n if (!/[A-Za-z0-9\\s!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~]/.test(key)) {\n event.preventDefault();\n }\n};\n\nexport const handleKeyDownNumber = (event: any) => {\n const { key, ctrlKey, metaKey } = event;\n\n // Allow keys for navigation, deletion, tab, and enter\n if (\n key === 'Backspace' ||\n key === 'Delete' ||\n key === 'ArrowLeft' ||\n key === 'ArrowRight' ||\n key === 'ArrowUp' ||\n key === 'ArrowDown' ||\n key === 'Tab' ||\n key === 'Enter'\n ) {\n return;\n }\n\n // Allow copy, paste, cut, select all (Ctrl/Command + C, V, X, A)\n if ((ctrlKey || metaKey) && (key === 'c' || key === 'v' || key === 'x' || key === 'a')) {\n return;\n }\n\n // Prevent non-numeric input\n if (!/[0-9]/.test(key)) {\n event.preventDefault();\n }\n};\n\nexport const handleKeyDownNumberNoCopy = (event: any) => {\n const { key } = event;\n\n // Allow keys for navigation, deletion, tab, and enter\n if (\n key === 'Backspace' ||\n key === 'Delete' ||\n key === 'ArrowLeft' ||\n key === 'ArrowRight' ||\n key === 'ArrowUp' ||\n key === 'ArrowDown' ||\n key === 'Tab' ||\n key === 'Enter'\n ) {\n return;\n }\n // Prevent non-numeric input\n if (!/[0-9]/.test(key)) {\n event.preventDefault();\n }\n};\n\nexport const handleKeyDownFloatNumber = (event: any) => {\n const { key, ctrlKey, metaKey } = event;\n const input = event.currentTarget;\n\n // Allow keys for navigation, deletion, tab, and enter\n if (\n key === 'Backspace' ||\n key === 'Delete' ||\n key === 'ArrowLeft' ||\n key === 'ArrowRight' ||\n key === 'ArrowUp' ||\n key === 'ArrowDown' ||\n key === 'Tab' ||\n key === 'Enter'\n ) {\n return;\n }\n\n // Allow copy, paste, cut, select all (Ctrl/Command + C, V, X, A)\n if ((ctrlKey || metaKey) && (key === 'c' || key === 'v' || key === 'x' || key === 'a')) {\n return;\n }\n\n // Allow one decimal point if it doesn't already exist\n if (key === '.' && !input.value.includes('.')) {\n return;\n }\n\n // Prevent non-numeric input (allow numbers and one decimal point)\n if (!/[0-9]/.test(key) && key !== '.') {\n event.preventDefault();\n }\n};\n","export function filterInArray<T>(field: keyof T, values: T[keyof T][], data: T[]): T[] {\n if (values.length === 0) return data;\n return data.filter((item) => values.includes(item[field]));\n}\n\nexport function filterInObjects(\n data: any[] = [],\n query: string[],\n childrenField: string = 'children',\n fieldsToFilter?: string[], // Optional array of fields to filter on\n): any[] {\n if (!data) return [];\n if (!query || query?.length === 0) return data;\n\n // Helper function to check if the specified field or all fields match the query.\n const matchesQuery = (obj: any): boolean => {\n const valuesToFilter = fieldsToFilter\n ? fieldsToFilter.map((field) => obj[field]).filter(Boolean) // Only valid fields\n : Object.values(obj); // Default to all fields\n\n return valuesToFilter.some(\n (value) => typeof value === 'string' && query.some((q) => value.includes(q)),\n );\n };\n\n // Recursive function to filter objects and extract matching ones.\n const filter = (data: any[]): any[] => {\n let results: any[] = [];\n\n data.forEach((item) => {\n // If the current item matches, add it to the results.\n if (matchesQuery(item)) {\n results.push(item);\n }\n\n // Recursively filter the children and add their matches.\n if (item[childrenField]) {\n results = results.concat(filter(item[childrenField]));\n }\n });\n\n return results;\n };\n\n return filter(data);\n}\n","export const capitalizeString = (str: string) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\nexport function removeEmptyFields<T extends Record<string, any>>(obj: T): Partial<T> {\n return Object.fromEntries(\n Object.entries(obj).filter(\n ([, value]) => value?.length !== 0 && value !== null && value !== undefined,\n ),\n ) as Partial<T>;\n}\n\ntype WithId = {\n _id?: string;\n [key: string]: any;\n};\n\nexport function removeIdFromObjects<T extends WithId>(objects: T[]): Omit<T, '_id'>[] {\n return objects.map(({ _id, ...rest }) => rest);\n}\n\nexport function removeItemsWithIds(array: any[], idsToRemove: string[]): any[] {\n return array.filter((item) => !item?._id || !idsToRemove.includes(item?._id));\n}\n\nexport function createOptionsArray<T>(data: T[], valueField: keyof T, ...labelFields: (keyof T)[]) {\n return data.map((item) => ({\n value: item[valueField] as string | number,\n label: labelFields.map((field) => item[field]).join(' '),\n }));\n}\n\nexport function filterUsersOption(option: any, inputValue: string) {\n const fullNameLabel = `${option?.label?.props?.children?.[0]?.props?.children}`;\n const emailLabel = option?.label?.props?.children?.[1]?.props?.children;\n\n return (\n fullNameLabel?.toLowerCase()?.includes(inputValue?.toLowerCase()) ||\n emailLabel?.toLowerCase()?.includes(inputValue?.toLowerCase())\n );\n}\n\nexport function removeKeys(obj: any, keys: string[]): any {\n const clonedObj = { ...obj };\n\n for (const key of keys) {\n delete clonedObj[key];\n }\n\n return clonedObj;\n}\n\nexport function getArrayKeys(obj: any) {\n const result = [];\n for (const key in obj) {\n if (Array.isArray(obj[key])) {\n result.push({ [key]: obj[key] });\n }\n }\n return result;\n}\n\nexport function convertObjectToArray(obj: any): any[] {\n if (!obj) return [];\n return Object.entries(obj).map(([key, value]) => ({\n [key]: value,\n }));\n}\n\ntype Permission = {\n [key: string]: string[];\n};\n\nexport function comparePermissionLists(list1: Permission[], list2: Permission[]): boolean {\n if (list1.length !== list2.length) {\n return false;\n }\n\n for (let i = 0; i < list1.length; i++) {\n const keys1 = Object.keys(list1[i]);\n const keys2 = Object.keys(list2[i]);\n\n if (keys1.length !== keys2.length) {\n return false;\n }\n\n for (const key of keys1) {\n if (!keys2.includes(key)) {\n return false;\n }\n\n const values1 = list1[i][key];\n const values2 = list2[i][key];\n\n if (values1.length !== values2.length) {\n return false;\n }\n\n for (const value of values1) {\n if (!values2.includes(value)) {\n return false;\n }\n }\n }\n }\n\n return true;\n}\n\nexport function objectToFormData(\n obj: Record<string, any>,\n formData: FormData = new FormData(),\n namespace: string = '',\n): FormData {\n for (const key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n\n const formKey = namespace ? `${namespace}[${key}]` : key;\n\n if (typeof obj[key] === 'object' && !(obj[key] instanceof File)) {\n // If it's an array or object, call the function recursively\n objectToFormData(obj[key], formData, formKey);\n } else {\n // Otherwise append the value\n formData.append(formKey, obj[key]);\n }\n }\n\n return formData;\n}\n\n// Helper functions to replace lodash\nfunction isDate(value: any): value is Date {\n return value instanceof Date;\n}\n\nfunction isObject(value: any): boolean {\n return value !== null && typeof value === 'object';\n}\n\nfunction isArray(value: any): value is any[] {\n return Array.isArray(value);\n}\n\nfunction omit<T extends Record<string, any>>(obj: T, keysToOmit: string[]): Partial<T> {\n const result: any = {};\n for (const key in obj) {\n if (!keysToOmit.includes(key)) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n\nfunction isEqual(value1: any, value2: any): boolean {\n // Check if both are the same reference or both are primitive and equal\n if (value1 === value2) return true;\n\n // Check if either is null or undefined\n if (value1 == null || value2 == null) return false;\n\n // Check if types are different\n if (typeof value1 !== typeof value2) return false;\n\n // Handle Date objects\n if (value1 instanceof Date && value2 instanceof Date) {\n return value1.getTime() === value2.getTime();\n }\n\n // Handle Arrays\n if (Array.isArray(value1) && Array.isArray(value2)) {\n if (value1.length !== value2.length) return false;\n for (let i = 0; i < value1.length; i++) {\n if (!isEqual(value1[i], value2[i])) return false;\n }\n return true;\n }\n\n // Handle Objects\n if (typeof value1 === 'object' && typeof value2 === 'object') {\n const keys1 = Object.keys(value1);\n const keys2 = Object.keys(value2);\n\n if (keys1.length !== keys2.length) return false;\n\n for (const key of keys1) {\n if (!keys2.includes(key)) return false;\n if (!isEqual(value1[key], value2[key])) return false;\n }\n return true;\n }\n\n // For all other cases\n return false;\n}\n\n/**\n * Compares two objects and returns true if they are equivalent.\n * Ignores specified keys if provided.\n *\n * @param {any} original - The original object.\n * @param {any} updated - The updated object to compare with.\n * @param {string[]} [keysToIgnore=[]] - Optional keys to ignore during comparison.\n * @returns {boolean} - True if objects are equivalent, otherwise false.\n */\nexport function compareObjects(original: any, updated: any, keysToIgnore: string[] = []): boolean {\n const normalizedOriginal = omit(original, keysToIgnore);\n const normalizedUpdated = omit(updated, keysToIgnore);\n\n return isEqual(normalizedOriginal, normalizedUpdated);\n}\n\nexport function getChangedFields(original: any, updated: any): any {\n // Safety net\n if (!original && !updated) return {};\n if (!original) return updated ?? {};\n if (!updated) return {};\n\n const changedFields: any = {};\n\n Object.keys(updated).forEach((key) => {\n const originalValue = original?.[key];\n const updatedValue = updated?.[key];\n\n // Case 1: Dates\n if (isDate(updatedValue) && isDate(originalValue)) {\n if (originalValue.getTime() !== updatedValue.getTime()) {\n changedFields[key] = updatedValue;\n }\n return;\n }\n\n // Case 2: One is object, the other is not\n if (isObject(updatedValue) && !isObject(originalValue)) {\n changedFields[key] = updatedValue;\n return;\n }\n\n // Case 3: Nested objects (non-array)\n if (\n isObject(updatedValue) &&\n !isArray(updatedValue) &&\n isObject(originalValue) &&\n !isArray(originalValue)\n ) {\n const nestedChanges = getChangedFields(originalValue, updatedValue);\n if (Object.keys(nestedChanges).length > 0) {\n changedFields[key] = nestedChanges;\n }\n return;\n }\n\n // Case 4: Arrays\n if (isArray(updatedValue) || isArray(originalValue)) {\n if (!isEqual(originalValue, updatedValue)) {\n changedFields[key] = updatedValue;\n }\n return;\n }\n\n // Case 5: Primitive values\n if (!isEqual(originalValue, updatedValue)) {\n changedFields[key] = updatedValue;\n }\n });\n\n return changedFields;\n}\n\nexport function sortObjectByKeys<T extends Record<string, any>>(obj: T): T {\n const sortedEntries = Object.entries(obj).sort((a, b) => {\n return a[0].localeCompare(b[0]);\n });\n\n return Object.fromEntries(sortedEntries) as T;\n}\n\nexport function sortObjectByValues<T extends Record<string, any>>(obj: T): T {\n const sortedEntries = Object.entries(obj).sort((a, b) => {\n if (typeof a[1] === 'number' && typeof b[1] === 'number') {\n return a[1] - b[1];\n }\n return 0;\n });\n\n return Object.fromEntries(sortedEntries) as T;\n}\n\ntype AnyObject = { [key: string]: any };\n\nexport function removeFields(obj: AnyObject, fieldsToRemove: string[]): AnyObject {\n if (Array.isArray(obj)) {\n // Recursively process each item in the array\n return obj.map((item) => removeFields(item, fieldsToRemove));\n } else if (typeof obj === 'object' && obj !== null) {\n const newObj: AnyObject = {};\n\n // Iterate over each key-value pair in the object\n for (const key in obj) {\n if (!fieldsToRemove.includes(key)) {\n // Only add the key if it's not in fieldsToRemove, and process its value recursively\n newObj[key] = removeFields(obj[key], fieldsToRemove);\n }\n }\n\n return newObj;\n }\n\n // Return primitive types (strings, numbers, etc.) as is\n return obj;\n}\n\nexport function removeFieldsTopLevel(\n obj: AnyObject | AnyObject[] | null | undefined,\n fieldsToRemove?: string[],\n): any {\n if (obj === null || obj === undefined) {\n return obj;\n }\n if (Array.isArray(obj)) {\n // If it's an array, process each item in the array\n return obj.map((item) => {\n if (typeof item === 'object' && item !== null) {\n return removeFieldsFromObject(item, fieldsToRemove);\n }\n return item; // Return non-object items as is\n });\n } else if (typeof obj === 'object' && obj !== null) {\n // If it's a single object, remove fields at the top level\n return removeFieldsFromObject(obj, fieldsToRemove);\n }\n\n // If it's neither an object nor an array, return it as is\n return obj;\n}\n\n// Helper function to remove fields from a single object at the top level\nexport function removeFieldsFromObject(obj: AnyObject, fieldsToRemove?: string[]): AnyObject {\n const newObj: AnyObject = { ...obj };\n\n // Remove specified fields from the object\n for (const field of fieldsToRemove || []) {\n delete newObj[field];\n }\n\n return newObj;\n}\n\nexport const getLabelByItemsAndId = (\n id?: string | number,\n items?: any[],\n fields: string[] | string = 'name',\n) => {\n if (!items || !id) return undefined;\n const item = items?.find((item) => item.id === id);\n if (item) {\n if (Array.isArray(fields)) {\n return fields.map((field) => item[field]).join(' ');\n }\n return item[fields];\n }\n return '';\n};\n\nexport const getLabelByItemsAndOptions = (id?: string | number | null, items?: any[]) => {\n if (!items || !id) return undefined;\n const item = items?.find((item) => item.value === id || item?.id === id || item?._id === id);\n if (item) {\n return item.label;\n }\n return '';\n};\n","import { removeEmptyFields } from './object';\n\nexport function toQueryString(params?: any): string {\n if (params)\n return Object.entries(removeEmptyFields(params))\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)\n .join('&');\n return '';\n}\n\nexport function pureURLS3(url: string | undefined): string | undefined {\n if (url?.startsWith('http')) {\n return url.split('.com/')[1].split('?')[0];\n }\n return url;\n}\n\nexport const createSearchQuery = (\n params: Record<string, string | number | boolean | undefined | string[] | number[]>,\n) => {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (Array.isArray(value)) {\n for (const v of value) {\n query.append(key, v.toString());\n }\n } else if (value !== undefined) {\n query.append(key, value.toString());\n }\n }\n\n return query.toString();\n};\n\nexport const serializeFormQuery = (\n params: Record<string, string | number | boolean | undefined | string[] | number[]>,\n) => {\n return Object.entries(params)\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n if (value.length === 0) return '';\n return `${key}=${value.join(',')}`;\n }\n if (value === undefined || value === '') return '';\n return `${key}=${value}`;\n })\n .filter((val) => val !== '')\n .join('&');\n};\n\nexport const arrFromQuery = (query: string | null) =>\n !query || query === null || query === '' ? [] : query.split(',').map((val) => parseInt(val));\n\nexport const uniqueId = (): number => {\n return Date.now() + Math.floor(Math.random() * 10000);\n};\n\nexport const prePareFilters = (searchParams: URLSearchParams) => {\n const filtersParam = searchParams.get('filters');\n if (!filtersParam) return null;\n\n try {\n const decoded = decodeURIComponent(filtersParam);\n const filtersArray = JSON.parse(decoded);\n\n // Convert filter format to backend format if needed\n // The filters come in format: { column, logic, value, fields, operatorGroup }\n // We need to send them as-is to trigger refetch\n return filtersArray;\n } catch (error) {\n console.error('Error parsing filters from URL:', error);\n return null;\n }\n};\n","export const addSearchParam = (\n searchParams: URLSearchParams,\n setSearchParams: any,\n key: string,\n value: string,\n) => {\n const newSearchParams = new URLSearchParams(searchParams);\n newSearchParams.set(key, value);\n setSearchParams(newSearchParams);\n};\n\n/**\n * Recursively searches across all fields of objects and their [`${childrenField}`].\n * @param data - The array of objects to search.\n * @param query - The search query string.\n * @returns An array of objects that match the search query.\n */\nexport function searchInObjectsWithParents(\n data: any[] = [],\n query: string = '',\n childrenField: string = 'children',\n fieldsToSearch?: string[], // Optional: Array of specific fields to search\n): any[] {\n if (!data) return [];\n if (!query) return data;\n\n const lowerQuery = query.trim()?.toLowerCase();\n\n // Helper function to check if the object matches the query within the specified fields.\n const matchesQuery = (obj: any): boolean => {\n const valuesToSearch = fieldsToSearch\n ? fieldsToSearch.map((field) => obj[field]).filter(Boolean) // Filter out invalid fields\n : Object.values(obj); // Default to all values\n\n return valuesToSearch.some(\n (value) => typeof value === 'string' && value?.toLowerCase().includes(lowerQuery),\n );\n };\n\n // Recursive function to search objects and retain matching parents and children.\n const search = (data: any[]): any[] => {\n return data\n .map((item) => {\n const childResults = item[childrenField] ? search(item[childrenField]) : [];\n\n // If the item matches the query or any child matches, include it in the results.\n if (matchesQuery(item) || childResults.length > 0) {\n return {\n ...item,\n [childrenField]: childResults.length > 0 ? childResults : undefined, // Keep only matching children.\n };\n }\n return null; // Exclude non-matching items.\n })\n .filter((item) => item !== null); // Remove null values from the result.\n };\n\n return search(data);\n}\n\nexport function searchInObjects(\n data: any[] = [],\n query: string = '',\n childrenField: string = 'children',\n fieldsToSearch?: string[], // Optional array of fields to search on\n): any[] {\n if (!data) return [];\n if (!query) return data;\n const lowerQuery = query?.trim()?.toLowerCase();\n\n // Helper function to check if the specified field or all fields match the query.\n const matchesQuery = (obj: any): boolean => {\n const valuesToSearch = fieldsToSearch\n ? fieldsToSearch.map((field) => obj[field]).filter(Boolean) // Only valid fields\n : Object.values(obj); // Default to all fields\n\n return valuesToSearch.some(\n (value) => typeof value === 'string' && value?.toLowerCase().includes(lowerQuery),\n );\n };\n\n // Recursive function to search objects and extract matching ones.\n const search = (data: any[]): any[] => {\n let results: any[] = [];\n\n data.forEach((item) => {\n // If the current item matches, add it to the results.\n if (matchesQuery(item)) {\n results.push(item);\n }\n\n // Recursively search the children and add their matches.\n if (item[childrenField]) {\n results = results.concat(search(item[childrenField]));\n }\n });\n\n return results;\n };\n\n return search(data);\n}\n","export const validateDay = (value: string): string => {\n const sanitizedValue = value.replace(/\\D/g, ''); // Remove non-numeric characters\n if (!sanitizedValue) return ''; // Allow empty input\n return Math.min(Math.max(parseInt(sanitizedValue, 10), 1), 31).toString(); // Ensure between 1-31\n};\n\nexport const validateMonth = (value: string): string => {\n const sanitizedValue = value.replace(/\\D/g, '');\n if (!sanitizedValue) return '';\n return Math.min(Math.max(parseInt(sanitizedValue, 10), 1), 12).toString(); // Ensure between 1-12\n};\n\nexport const validateYear = (value: string): string => {\n const sanitizedValue = value.replace(/\\D/g, ''); // Remove non-numeric characters\n if (!sanitizedValue) return '';\n\n // Allow typing until 4 digits are reached\n if (sanitizedValue.length < 4) return sanitizedValue;\n\n // Ensure the year is at least 1900 when it reaches 4 digits\n const year = parseInt(sanitizedValue, 10);\n return year < 1900 ? '1900' : sanitizedValue;\n};\n"],"mappings":"+kBAAO,IAAMA,EAAkB,CAACC,EAAaC,IAA8B,CACzE,GAAIA,IAAS,KAAM,CACjB,IAAMC,EAAO,CACX,GACA,iCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,sCACF,EACMC,EAAQ,CACZ,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,yDACF,EACMC,EAAO,CACX,GACA,uCACA,6CACA,mDACA,mDACA,6CACA,uCACA,6CACA,mDACA,4CACF,EACMC,EAAW,CACf,GACA,uCACA,6CACA,+DACA,+DACA,yDACA,mDACA,yDACA,+DACA,wDACF,EAEA,GAAIL,IAAQ,EAAG,MAAO,iCAGtB,IAAMM,EAAc,KAAK,MAAMN,EAAM,GAAG,EAClCO,EAAgBP,EAAM,IAC5B,GAAIM,EAAc,EAChB,OAAIC,IAAkB,EAAUF,EAASC,CAAW,EAC7C,GAAGD,EAASC,CAAW,CAAC,UAAKP,EAAgBQ,EAAeN,CAAI,CAAC,GAG1E,GAAID,GAAO,GAAKA,GAAO,EAAG,OAAOE,EAAKF,CAAG,EACzC,GAAIA,GAAO,IAAMA,GAAO,GAAI,OAAOG,EAAMH,EAAM,EAAE,EACjD,GAAIA,EAAM,KAAO,GAAKA,EAAM,IAAK,OAAOI,EAAKJ,EAAM,EAAE,EAErD,IAAMQ,EAAYR,EAAM,GAClBS,EAAO,KAAK,MAAMT,EAAM,EAAE,EAAI,GAEpC,OAAIS,IAAS,GAAW,eAAKP,EAAKM,CAAS,CAAC,sBACxCA,IAAc,EAAU,8CAAWJ,EAAKK,EAAO,EAAE,CAAC,GAClDD,IAAc,EAAU,8CAAWJ,EAAKK,EAAO,EAAE,CAAC,GACvC,GAAGP,EAAKM,CAAS,CAAC,UAAKJ,EAAKK,EAAO,EAAE,CAAC,EAGvD,KAAO,CACL,IAAMC,EAAW,CAAC,KAAM,KAAM,KAAM,IAAI,EAClCC,EAAIX,EAAM,IAChB,OAAOA,GAAOU,GAAUC,EAAI,IAAM,EAAE,GAAKD,EAASC,CAAC,GAAKD,EAAS,CAAC,EACpE,CACF,EC7EO,IAAME,EAAoB,CAAC,CAChC,MAAAC,EACA,SAAAC,EACA,SAAAC,CACF,IAIM,CACJ,GAAI,CAACF,GAAS,CAACC,GAAY,CAACC,EAAU,OACtC,IAAMC,EAAeC,EAAA,CAEnB,GAAI,OAAO,IAAI,KAAK,EAAE,QAAQ,CAAC,GAC5BF,GAEDC,GAASF,EAAS,CAAC,GAAGD,EAAOG,CAAO,CAAC,CAC3C,EAEaE,EAA0B,CAAC,CACtC,MAAAL,EACA,SAAAC,EACA,SAAAC,EACA,YAAAI,CACF,IAKM,CACJ,GAAI,CAACN,GAAS,CAACC,GAAY,CAACC,EAAU,OAGnBF,EAAM,KAAMO,GAEzBD,GAAe,OAAOJ,GAAa,UAAYA,IAAa,KACvDK,EAAKD,CAAW,IAAMJ,EAASI,CAAW,EAG5CC,IAASL,CACjB,GAQCD,EAAS,CAAC,GAAGD,EAAOE,CAAQ,CAAC,CAEjC,EAGaM,EAAoB,CAAC,CAChC,GAAAC,EACA,MAAAT,EACA,SAAAC,EACA,SAAAC,CACF,IAKM,CACA,CAACO,GAAM,CAACT,GAAS,CAACC,GAAY,CAACC,GACnCD,EAASD,GAAA,YAAAA,EAAO,IAAKO,GAAUA,EAAK,KAAOE,EAAKL,IAAA,GAAKG,GAASL,GAAaK,EAAM,CACnF,EAGaG,EAAoB,CAAC,CAChC,GAAAD,EACA,MAAAT,EACA,SAAAC,CACF,IAIM,CACA,CAACQ,GAAM,CAACT,GAAS,CAACC,GACtBA,EACED,GAAA,YAAAA,EAAO,OAAQO,GAAc,CAhFjC,IAAAI,EAiFM,OAAI,OAAOJ,GAAS,UAAYA,IAAS,MAAQ,CAAC,MAAM,QAAQE,CAAE,EACzDF,EAAK,KAAOE,EACV,MAAM,QAAQA,CAAE,EAClB,CAACA,EAAG,UAASE,EAAAJ,EAAK,KAAL,KAAAI,EAAWJ,CAAI,EAE5BA,IAASE,CAEpB,EACF,CACF,ECvEO,IAAMG,EAAwB,CAACC,EAAYC,IAA2B,CAC3E,IAAMC,EAAMF,EAAK,QAAQ,EACnBG,EAAQH,EAAK,SAAS,EAAI,EAC1BI,EAAOJ,EAAK,YAAY,EACxBK,EAAUL,EAAK,SAAS,EACxBM,EAAUD,EAAU,IAAM,GAC1BE,EAAUP,EAAK,WAAW,EAC1BQ,EAAUR,EAAK,WAAW,EAC1BS,EAAOJ,GAAW,GAAK,KAAO,KAE9BK,EAAoC,CACxC,KAAM,OAAON,CAAI,EACjB,GAAI,OAAOA,CAAI,EAAE,MAAM,EAAE,EACzB,GAAI,OAAOD,CAAK,EAAE,SAAS,EAAG,GAAG,EACjC,EAAG,OAAOA,CAAK,EACf,GAAI,OAAOD,CAAG,EAAE,SAAS,EAAG,GAAG,EAC/B,EAAG,OAAOA,CAAG,EACb,GAAI,OAAOG,CAAO,EAAE,SAAS,EAAG,GAAG,EACnC,EAAG,OAAOA,CAAO,EACjB,GAAI,OAAOC,CAAO,EAAE,SAAS,EAAG,GAAG,EACnC,EAAG,OAAOA,CAAO,EACjB,GAAI,OAAOC,CAAO,EAAE,SAAS,EAAG,GAAG,EACnC,EAAG,OAAOA,CAAO,EACjB,GAAI,OAAOC,CAAO,EAAE,SAAS,EAAG,GAAG,EACnC,EAAG,OAAOA,CAAO,EACjB,EAAGC,EACH,EAAGA,EAAK,YAAY,CACtB,EAEA,OAAOR,EAAO,QAAQ,6CAA+CU,GAAUD,EAAOC,CAAK,CAAC,CAC9F,EAEaC,EAAiB,CAC5BZ,EACAC,EAAiB,sBACd,CACH,GAAI,CAACD,EAAM,MAAO,GAClB,IAAMa,EAAU,IAAI,KAAKb,CAAI,EAC7B,OAAOD,EAAsBc,EAASZ,CAAM,CAC9C,EAEaa,EAAa,CACxBd,EACAC,EAAiB,eACd,CACH,GAAI,CAACD,EAAM,MAAO,GAClB,IAAMa,EAAU,IAAI,KAAKb,CAAI,EAC7B,OAAOD,EAAsBc,EAASZ,CAAM,CAC9C,EAEac,EAAmBf,GAAiB,CAC/C,IAAMgB,EAAM,IAAI,KAAKhB,CAAI,EAEnBiB,EAAM,IAAI,KAChB,OAAAA,EAAI,QAAQA,EAAI,QAAQ,EAAI,CAAC,EAC7BA,EAAI,SAAS,EAAG,EAAG,EAAG,CAAC,EAChBD,EAAMC,CACf,EAEO,SAASC,EAAQC,EAAqD,CAC3E,GAAI,CAACA,EAAW,MAAO,GACvB,IAAMnB,EAAO,IAAI,KAAKmB,CAAS,EACzBC,EAAOC,GAAgBA,EAAI,SAAS,EAAE,SAAS,EAAG,GAAG,EACrDC,EAAiBF,EAAIpB,EAAK,SAAS,CAAC,EACpCuB,EAAmBH,EAAIpB,EAAK,WAAW,CAAC,EAC9C,MAAO,GAAGsB,CAAc,IAAIC,CAAgB,EAC9C,CAQO,IAAMC,EAAuB,CAClCC,EACA,EAA2C,OAC3CC,EAA6B,IAAI,KACjCC,IACkC,CAlGpC,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAmGE,IAAMC,EAAU,CACd,IAAK,CACH,MAAO,EACP,OAAQ,EACR,KAAM,CACR,EACA,SAASL,EAAA,iBAAI,YAAJ,KAAAA,EAAiB,QAC5B,EAEA,GAAIH,GAAc,KAChB,OAAOQ,EAGT,IAAMC,EACJT,aAAqB,KACjBA,EACAU,EAAeV,CAAS,EACtB,IAAI,KAAKA,CAAS,EAClB,IAAI,KAAK,OAAOA,CAAS,CAAC,EAE5BW,EAAgBV,aAAuB,KAAOA,EAAc,IAAI,KAAK,OAAOA,CAAW,CAAC,EAM9F,GAJI,MAAMQ,EAAM,QAAQ,CAAC,GAAK,MAAME,EAAQ,QAAQ,CAAC,GAIjDA,EAAUF,EACZ,OAAOD,EAGT,IAAII,EAAQD,EAAQ,YAAY,EAAIF,EAAM,YAAY,EAClDI,EAASF,EAAQ,SAAS,EAAIF,EAAM,SAAS,EAC7CK,EAAOH,EAAQ,QAAQ,EAAIF,EAAM,QAAQ,EAE7C,GAAIK,EAAO,EAAG,CACZ,IAAMC,EAAY,IAAI,KAAKJ,EAAQ,YAAY,EAAGA,EAAQ,SAAS,EAAG,CAAC,EACvEG,GAAQC,EAAU,QAAQ,EAC1BF,GACF,CAEA,OAAIA,EAAS,IACXD,IACAC,GAAU,IAGL,CACL,IAAK,CACH,MAAAD,EACA,OAAAC,EACA,KAAAC,CACF,EACA,QAAS,GAAGF,CAAK,KAAIR,EAAA,iBAAI,WAAJ,KAAAA,EAAgB,OAAO,MAAMS,CAAM,KACtDR,EAAA,iBAAI,YAAJ,KAAAA,EAAiB,QACnB,MAAMS,CAAI,KAAIR,EAAA,iBAAI,UAAJ,KAAAA,EAAe,MAAM,OAAMC,EAAA,iBAAIL,GAAA,KAAAA,EAAU,MAAd,KAAAK,EAAqBL,CAAM,EACtE,CACF,EAEac,EAAkBhB,GAAqC,CAClE,GAAI,CAACA,EAAW,OAAO,KACvB,IAAMS,EAAQ,IAAI,KAAKT,CAAS,EAC1BiB,EAAQ,IAAI,KAEdL,EAAQK,EAAM,YAAY,EAAIR,EAAM,YAAY,EAChDI,EAASI,EAAM,SAAS,EAAIR,EAAM,SAAS,EAC3CK,EAAOG,EAAM,QAAQ,EAAIR,EAAM,QAAQ,EAE3C,OAAIK,EAAO,IACTD,IACAC,GAAQ,IAAI,KAAKG,EAAM,YAAY,EAAGA,EAAM,SAAS,EAAG,CAAC,EAAE,QAAQ,GAEjEJ,EAAS,IACXD,IACAC,GAAU,IAGL,CAAE,MAAAD,EAAO,OAAAC,EAAQ,KAAAC,CAAK,CAC/B,EAEaI,EAAkBC,GAAyD,CACtF,IAAMF,EAAQ,IAAI,KACZG,EAAYH,EAAM,YAAY,EAAIE,EAAI,MACtCE,EAAaJ,EAAM,SAAS,EAAIE,EAAI,OACpCG,EAAWL,EAAM,QAAQ,EAAIE,EAAI,KAEjCnB,EAAY,IAAI,KAAKiB,EAAM,YAAY,EAAGA,EAAM,SAAS,EAAGA,EAAM,QAAQ,CAAC,EACjF,OAAAjB,EAAU,YAAYoB,CAAS,EAC/BpB,EAAU,SAASqB,CAAU,EAC7BrB,EAAU,QAAQsB,CAAQ,EAEnBtB,CACT,EAEauB,GAA8B,CACzCC,EACAL,IACG,CACH,IAAMF,EAAQ,IAAI,KACZG,EACJI,GAAUA,EAAO,MAAQA,EAAO,MAAQL,EAAI,MAAQF,EAAM,YAAY,EAAIE,EAAI,MAC1EE,EACJG,GAAUA,EAAO,OAASA,EAAO,OAASL,EAAI,OAASF,EAAM,SAAS,EAAIE,EAAI,OAC1EG,EAAWE,GAAUA,EAAO,KAAOA,EAAO,KAAOL,EAAI,KAAOF,EAAM,QAAQ,EAAIE,EAAI,KAElFnB,EAAY,IAAI,KAAKiB,EAAM,YAAY,EAAGA,EAAM,SAAS,EAAGA,EAAM,QAAQ,CAAC,EACjF,OAAAjB,EAAU,YAAYoB,CAAS,EAC/BpB,EAAU,SAASqB,CAAU,EAC7BrB,EAAU,QAAQsB,CAAQ,EAEnBtB,CACT,EAEO,SAASyB,GAAuBC,EAA4B,CACjE,GAAM,CAACC,EAAUC,CAAQ,EAAIF,EAAW,MAAM,GAAG,EAC3CZ,EAAO,SAASa,EAAS,QAAQ,MAAO,EAAE,EAAG,EAAE,EAC/C,CAACE,EAAO/C,EAASC,CAAO,GAAK6C,GAAY,YAC5C,MAAM,GAAG,EACT,IAAKE,GAAS,SAASA,EAAM,EAAE,CAAC,EAKnC,OAFEhB,EAAO,GAAK,GAAK,GAAK,IAAOe,EAAQ,GAAK,GAAK,IAAO/C,EAAU,GAAK,IAAOC,EAAU,GAG1F,CAEO,IAAMgD,GAAgB/B,GAA8B,CACzD,IAAMiB,EAAQ,IAAI,KACdR,EAEJ,GAAIT,EAAU,SAAS,GAAG,EAAG,CAC3B,GAAM,CAACvB,EAAKC,EAAOC,CAAI,EAAIqB,EAAU,MAAM,GAAG,EAAE,IAAI,MAAM,EAC1DS,EAAQ,IAAI,KAAK9B,EAAMD,EAAQ,EAAGD,CAAG,CACvC,SAAW,CAAC,MAAM,KAAK,MAAMuB,CAAS,CAAC,EACrCS,EAAQ,IAAI,KAAKT,CAAS,MAE1B,OAAM,IAAI,MAAM,yBAAyB,EAG3C,IAAImB,EAAMF,EAAM,YAAY,EAAIR,EAAM,YAAY,EAC5CuB,EAAIf,EAAM,SAAS,EAAIR,EAAM,SAAS,EAE5C,OAAIuB,EAAI,GAAMA,IAAM,GAAKf,EAAM,QAAQ,EAAIR,EAAM,QAAQ,IACvDU,IAGKA,CACT,EAEA,SAAST,EAAeuB,EAA6B,CACnD,IAAM1D,EAAO,IAAI,KAAK0D,CAAU,EAChC,MAAO,CAAC,MAAM1D,EAAK,QAAQ,CAAC,GAAKA,EAAK,YAAY,IAAM0D,CAC1D,CCzPO,IAAMC,GAAuBC,GAA0B,CAA9D,IAAAC,EACE,IAAMC,EAAS,IAAI,UACbC,EAAMH,GAAQE,EAAO,gBAAgBF,EAAM,WAAW,EAC5D,OAAQC,EAAAE,GAAOA,EAAI,KAAK,cAAhB,KAAAF,EAAgC,EAC1C,ECJO,IAAMG,GAAuBC,GAAe,CACjD,GAAM,CAAE,IAAAC,EAAK,QAAAC,EAAS,QAAAC,CAAQ,EAAIH,EAGhCC,IAAQ,aACRA,IAAQ,UACRA,IAAQ,aACRA,IAAQ,cACRA,IAAQ,WACRA,IAAQ,aACRA,IAAQ,OACRA,IAAQ,UAKLC,GAAWC,KAAaF,IAAQ,KAAOA,IAAQ,KAAOA,IAAQ,KAAOA,IAAQ,MAI7E,uDAAuD,KAAKA,CAAG,GAClED,EAAM,eAAe,CAEzB,EAEaI,GAAwBJ,GAAe,CAClD,GAAM,CAAE,IAAAC,EAAK,QAAAC,EAAS,QAAAC,CAAQ,EAAIH,EAGhCC,IAAQ,aACRA,IAAQ,UACRA,IAAQ,aACRA,IAAQ,cACRA,IAAQ,WACRA,IAAQ,aACRA,IAAQ,OACRA,IAAQ,UAKLC,GAAWC,KAAaF,IAAQ,KAAOA,IAAQ,KAAOA,IAAQ,KAAOA,IAAQ,MAK7E,gDAAgD,KAAKA,CAAG,GAC3DD,EAAM,eAAe,CAEzB,EAEaK,GAAuBL,GAAe,CACjD,GAAM,CAAE,IAAAC,EAAK,QAAAC,EAAS,QAAAC,CAAQ,EAAIH,EAIhCC,IAAQ,aACRA,IAAQ,UACRA,IAAQ,aACRA,IAAQ,cACRA,IAAQ,WACRA,IAAQ,aACRA,IAAQ,OACRA,IAAQ,UAMLC,GAAWC,KAAaF,IAAQ,KAAOA,IAAQ,KAAOA,IAAQ,KAAOA,IAAQ,MAK7E,QAAQ,KAAKA,CAAG,GACnBD,EAAM,eAAe,CAEzB,EAEaM,GAA6BN,GAAe,CACvD,GAAM,CAAE,IAAAC,CAAI,EAAID,EAIdC,IAAQ,aACRA,IAAQ,UACRA,IAAQ,aACRA,IAAQ,cACRA,IAAQ,WACRA,IAAQ,aACRA,IAAQ,OACRA,IAAQ,SAKL,QAAQ,KAAKA,CAAG,GACnBD,EAAM,eAAe,CAEzB,EAEaO,GAA4BP,GAAe,CACtD,GAAM,CAAE,IAAAC,EAAK,QAAAC,EAAS,QAAAC,CAAQ,EAAIH,EAC5BQ,EAAQR,EAAM,cAIlBC,IAAQ,aACRA,IAAQ,UACRA,IAAQ,aACRA,IAAQ,cACRA,IAAQ,WACRA,IAAQ,aACRA,IAAQ,OACRA,IAAQ,UAMLC,GAAWC,KAAaF,IAAQ,KAAOA,IAAQ,KAAOA,IAAQ,KAAOA,IAAQ,MAK9EA,IAAQ,KAAO,CAACO,EAAM,MAAM,SAAS,GAAG,GAKxC,CAAC,QAAQ,KAAKP,CAAG,GAAKA,IAAQ,KAChCD,EAAM,eAAe,CAEzB,ECrIO,SAASS,GAAiBC,EAAgBC,EAAsBC,EAAgB,CACrF,OAAID,EAAO,SAAW,EAAUC,EACzBA,EAAK,OAAQC,GAASF,EAAO,SAASE,EAAKH,CAAK,CAAC,CAAC,CAC3D,CAEO,SAASI,GACdF,EAAc,CAAC,EACfG,EACAC,EAAwB,WACxBC,EACO,CACP,GAAI,CAACL,EAAM,MAAO,CAAC,EACnB,GAAI,CAACG,IAASA,GAAA,YAAAA,EAAO,UAAW,EAAG,OAAOH,EAG1C,IAAMM,EAAgBC,IACGF,EACnBA,EAAe,IAAKP,GAAUS,EAAIT,CAAK,CAAC,EAAE,OAAO,OAAO,EACxD,OAAO,OAAOS,CAAG,GAEC,KACnBC,GAAU,OAAOA,GAAU,UAAYL,EAAM,KAAMM,GAAMD,EAAM,SAASC,CAAC,CAAC,CAC7E,EAIIC,EAAUV,GAAuB,CACrC,IAAIW,EAAiB,CAAC,EAEtB,OAAAX,EAAK,QAASC,GAAS,CAEjBK,EAAaL,CAAI,GACnBU,EAAQ,KAAKV,CAAI,EAIfA,EAAKG,CAAa,IACpBO,EAAUA,EAAQ,OAAOD,EAAOT,EAAKG,CAAa,CAAC,CAAC,EAExD,CAAC,EAEMO,CACT,EAEA,OAAOD,EAAOV,CAAI,CACpB,CC7CO,IAAMY,GAAoBC,GACxBA,EAAI,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAI,MAAM,CAAC,EAG3C,SAASC,EAAiDC,EAAoB,CACnF,OAAO,OAAO,YACZ,OAAO,QAAQA,CAAG,EAAE,OAClB,CAAC,CAAC,CAAEC,CAAK,KAAMA,GAAA,YAAAA,EAAO,UAAW,GAAKA,IAAU,MAAQA,IAAU,MACpE,CACF,CACF,CAOO,SAASC,GAAsCC,EAAgC,CACpF,OAAOA,EAAQ,IAAKC,GAAkB,CAAlB,IAAAC,EAAAD,EAAE,KAAAE,CAlBxB,EAkBsBD,EAAUE,EAAAC,EAAVH,EAAU,CAAR,QAAmB,OAAAE,EAAI,CAC/C,CAEO,SAASE,GAAmBC,EAAcC,EAA8B,CAC7E,OAAOD,EAAM,OAAQE,GAAS,EAACA,GAAA,MAAAA,EAAM,MAAO,CAACD,EAAY,SAASC,GAAA,YAAAA,EAAM,GAAG,CAAC,CAC9E,CAEO,SAASC,GAAsBC,EAAWC,KAAwBC,EAA0B,CACjG,OAAOF,EAAK,IAAKF,IAAU,CACzB,MAAOA,EAAKG,CAAU,EACtB,MAAOC,EAAY,IAAKC,GAAUL,EAAKK,CAAK,CAAC,EAAE,KAAK,GAAG,CACzD,EAAE,CACJ,CAEO,SAASC,GAAkBC,EAAaC,EAAoB,CAhCnE,IAAAhB,EAAAC,EAAAgB,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAiCE,IAAMC,EAAgB,IAAGR,GAAAD,GAAAD,GAAAhB,GAAAD,EAAAe,GAAA,YAAAA,EAAQ,QAAR,YAAAf,EAAe,QAAf,YAAAC,EAAsB,WAAtB,YAAAgB,EAAiC,KAAjC,YAAAC,EAAqC,QAArC,YAAAC,EAA4C,QAAQ,GACvES,GAAaJ,GAAAD,GAAAD,GAAAD,GAAAD,EAAAL,GAAA,YAAAA,EAAQ,QAAR,YAAAK,EAAe,QAAf,YAAAC,EAAsB,WAAtB,YAAAC,EAAiC,KAAjC,YAAAC,EAAqC,QAArC,YAAAC,EAA4C,SAE/D,QACEC,EAAAE,GAAA,YAAAA,EAAe,gBAAf,YAAAF,EAA8B,SAAST,GAAA,YAAAA,EAAY,mBACnDU,EAAAE,GAAA,YAAAA,EAAY,gBAAZ,YAAAF,EAA2B,SAASV,GAAA,YAAAA,EAAY,eAEpD,CAEO,SAASa,GAAWjC,EAAUkC,EAAqB,CACxD,IAAMC,EAAYC,EAAA,GAAKpC,GAEvB,QAAWqC,KAAOH,EAChB,OAAOC,EAAUE,CAAG,EAGtB,OAAOF,CACT,CAEO,SAASG,GAAatC,EAAU,CACrC,IAAMuC,EAAS,CAAC,EAChB,QAAWF,KAAOrC,EACZ,MAAM,QAAQA,EAAIqC,CAAG,CAAC,GACxBE,EAAO,KAAK,CAAE,CAACF,CAAG,EAAGrC,EAAIqC,CAAG,CAAE,CAAC,EAGnC,OAAOE,CACT,CAEO,SAASC,GAAqBxC,EAAiB,CACpD,OAAKA,EACE,OAAO,QAAQA,CAAG,EAAE,IAAI,CAAC,CAACqC,EAAKpC,CAAK,KAAO,CAChD,CAACoC,CAAG,EAAGpC,CACT,EAAE,EAHe,CAAC,CAIpB,CAMO,SAASwC,GAAuBC,EAAqBC,EAA8B,CACxF,GAAID,EAAM,SAAWC,EAAM,OACzB,MAAO,GAGT,QAASC,EAAI,EAAGA,EAAIF,EAAM,OAAQE,IAAK,CACrC,IAAMC,EAAQ,OAAO,KAAKH,EAAME,CAAC,CAAC,EAC5BE,EAAQ,OAAO,KAAKH,EAAMC,CAAC,CAAC,EAElC,GAAIC,EAAM,SAAWC,EAAM,OACzB,MAAO,GAGT,QAAWT,KAAOQ,EAAO,CACvB,GAAI,CAACC,EAAM,SAAST,CAAG,EACrB,MAAO,GAGT,IAAMU,EAAUL,EAAME,CAAC,EAAEP,CAAG,EACtBW,EAAUL,EAAMC,CAAC,EAAEP,CAAG,EAE5B,GAAIU,EAAQ,SAAWC,EAAQ,OAC7B,MAAO,GAGT,QAAW/C,KAAS8C,EAClB,GAAI,CAACC,EAAQ,SAAS/C,CAAK,EACzB,MAAO,EAGb,CACF,CAEA,MAAO,EACT,CAEO,SAASgD,EACdjD,EACAkD,EAAqB,IAAI,SACzBC,EAAoB,GACV,CACV,QAAWd,KAAOrC,EAAK,CACrB,GAAI,CAAC,OAAO,UAAU,eAAe,KAAKA,EAAKqC,CAAG,EAAG,SAErD,IAAMe,EAAUD,EAAY,GAAGA,CAAS,IAAId,CAAG,IAAMA,EAEjD,OAAOrC,EAAIqC,CAAG,GAAM,UAAY,EAAErC,EAAIqC,CAAG,YAAa,MAExDY,EAAiBjD,EAAIqC,CAAG,EAAGa,EAAUE,CAAO,EAG5CF,EAAS,OAAOE,EAASpD,EAAIqC,CAAG,CAAC,CAErC,CAEA,OAAOa,CACT,CAGA,SAASG,EAAOpD,EAA2B,CACzC,OAAOA,aAAiB,IAC1B,CAEA,SAASqD,EAASrD,EAAqB,CACrC,OAAOA,IAAU,MAAQ,OAAOA,GAAU,QAC5C,CAEA,SAASsD,EAAQtD,EAA4B,CAC3C,OAAO,MAAM,QAAQA,CAAK,CAC5B,CAEA,SAASuD,EAAoCxD,EAAQyD,EAAkC,CACrF,IAAMlB,EAAc,CAAC,EACrB,QAAWF,KAAOrC,EACXyD,EAAW,SAASpB,CAAG,IAC1BE,EAAOF,CAAG,EAAIrC,EAAIqC,CAAG,GAGzB,OAAOE,CACT,CAEA,SAASmB,EAAQC,EAAaC,EAAsB,CAElD,GAAID,IAAWC,EAAQ,MAAO,GAM9B,GAHID,GAAU,MAAQC,GAAU,MAG5B,OAAOD,GAAW,OAAOC,EAAQ,MAAO,GAG5C,GAAID,aAAkB,MAAQC,aAAkB,KAC9C,OAAOD,EAAO,QAAQ,IAAMC,EAAO,QAAQ,EAI7C,GAAI,MAAM,QAAQD,CAAM,GAAK,MAAM,QAAQC,CAAM,EAAG,CAClD,GAAID,EAAO,SAAWC,EAAO,OAAQ,MAAO,GAC5C,QAAShB,EAAI,EAAGA,EAAIe,EAAO,OAAQf,IACjC,GAAI,CAACc,EAAQC,EAAOf,CAAC,EAAGgB,EAAOhB,CAAC,CAAC,EAAG,MAAO,GAE7C,MAAO,EACT,CAGA,GAAI,OAAOe,GAAW,UAAY,OAAOC,GAAW,SAAU,CAC5D,IAAMf,EAAQ,OAAO,KAAKc,CAAM,EAC1Bb,EAAQ,OAAO,KAAKc,CAAM,EAEhC,GAAIf,EAAM,SAAWC,EAAM,OAAQ,MAAO,GAE1C,QAAWT,KAAOQ,EAEhB,GADI,CAACC,EAAM,SAAST,CAAG,GACnB,CAACqB,EAAQC,EAAOtB,CAAG,EAAGuB,EAAOvB,CAAG,CAAC,EAAG,MAAO,GAEjD,MAAO,EACT,CAGA,MAAO,EACT,CAWO,SAASwB,GAAeC,EAAeC,EAAcC,EAAyB,CAAC,EAAY,CAChG,IAAMC,EAAqBT,EAAKM,EAAUE,CAAY,EAChDE,EAAoBV,EAAKO,EAASC,CAAY,EAEpD,OAAON,EAAQO,EAAoBC,CAAiB,CACtD,CAEO,SAASC,EAAiBL,EAAeC,EAAmB,CAEjE,GAAI,CAACD,GAAY,CAACC,EAAS,MAAO,CAAC,EACnC,GAAI,CAACD,EAAU,OAAOC,GAAA,KAAAA,EAAW,CAAC,EAClC,GAAI,CAACA,EAAS,MAAO,CAAC,EAEtB,IAAMK,EAAqB,CAAC,EAE5B,cAAO,KAAKL,CAAO,EAAE,QAAS1B,GAAQ,CACpC,IAAMgC,EAAgBP,GAAA,YAAAA,EAAWzB,GAC3BiC,EAAeP,GAAA,YAAAA,EAAU1B,GAG/B,GAAIgB,EAAOiB,CAAY,GAAKjB,EAAOgB,CAAa,EAAG,CAC7CA,EAAc,QAAQ,IAAMC,EAAa,QAAQ,IACnDF,EAAc/B,CAAG,EAAIiC,GAEvB,MACF,CAGA,GAAIhB,EAASgB,CAAY,GAAK,CAAChB,EAASe,CAAa,EAAG,CACtDD,EAAc/B,CAAG,EAAIiC,EACrB,MACF,CAGA,GACEhB,EAASgB,CAAY,GACrB,CAACf,EAAQe,CAAY,GACrBhB,EAASe,CAAa,GACtB,CAACd,EAAQc,CAAa,EACtB,CACA,IAAME,EAAgBJ,EAAiBE,EAAeC,CAAY,EAC9D,OAAO,KAAKC,CAAa,EAAE,OAAS,IACtCH,EAAc/B,CAAG,EAAIkC,GAEvB,MACF,CAGA,GAAIhB,EAAQe,CAAY,GAAKf,EAAQc,CAAa,EAAG,CAC9CX,EAAQW,EAAeC,CAAY,IACtCF,EAAc/B,CAAG,EAAIiC,GAEvB,MACF,CAGKZ,EAAQW,EAAeC,CAAY,IACtCF,EAAc/B,CAAG,EAAIiC,EAEzB,CAAC,EAEMF,CACT,CAEO,SAASI,GAAgDxE,EAAW,CACzE,IAAMyE,EAAgB,OAAO,QAAQzE,CAAG,EAAE,KAAK,CAAC0E,EAAGC,IAC1CD,EAAE,CAAC,EAAE,cAAcC,EAAE,CAAC,CAAC,CAC/B,EAED,OAAO,OAAO,YAAYF,CAAa,CACzC,CAEO,SAASG,GAAkD5E,EAAW,CAC3E,IAAMyE,EAAgB,OAAO,QAAQzE,CAAG,EAAE,KAAK,CAAC0E,EAAGC,IAC7C,OAAOD,EAAE,CAAC,GAAM,UAAY,OAAOC,EAAE,CAAC,GAAM,SACvCD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAEZ,CACR,EAED,OAAO,OAAO,YAAYF,CAAa,CACzC,CAIO,SAASI,EAAa7E,EAAgB8E,EAAqC,CAChF,GAAI,MAAM,QAAQ9E,CAAG,EAEnB,OAAOA,EAAI,IAAKY,GAASiE,EAAajE,EAAMkE,CAAc,CAAC,EACtD,GAAI,OAAO9E,GAAQ,UAAYA,IAAQ,KAAM,CAClD,IAAM+E,EAAoB,CAAC,EAG3B,QAAW1C,KAAOrC,EACX8E,EAAe,SAASzC,CAAG,IAE9B0C,EAAO1C,CAAG,EAAIwC,EAAa7E,EAAIqC,CAAG,EAAGyC,CAAc,GAIvD,OAAOC,CACT,CAGA,OAAO/E,CACT,CAEO,SAASgF,GACdhF,EACA8E,EACK,CACL,OAAI9E,GAAQ,KACHA,EAEL,MAAM,QAAQA,CAAG,EAEZA,EAAI,IAAKY,GACV,OAAOA,GAAS,UAAYA,IAAS,KAChCqE,EAAuBrE,EAAMkE,CAAc,EAE7ClE,CACR,EACQ,OAAOZ,GAAQ,UAAYA,IAAQ,KAErCiF,EAAuBjF,EAAK8E,CAAc,EAI5C9E,CACT,CAGO,SAASiF,EAAuBjF,EAAgB8E,EAAsC,CAC3F,IAAMC,EAAoB3C,EAAA,GAAKpC,GAG/B,QAAWiB,KAAS6D,GAAkB,CAAC,EACrC,OAAOC,EAAO9D,CAAK,EAGrB,OAAO8D,CACT,CAEO,IAAMG,GAAuB,CAClCC,EACAC,EACAC,EAA4B,SACzB,CACH,GAAI,CAACD,GAAS,CAACD,EAAI,OACnB,IAAMvE,EAAOwE,GAAA,YAAAA,EAAO,KAAMxE,GAASA,EAAK,KAAOuE,GAC/C,OAAIvE,EACE,MAAM,QAAQyE,CAAM,EACfA,EAAO,IAAKpE,GAAUL,EAAKK,CAAK,CAAC,EAAE,KAAK,GAAG,EAE7CL,EAAKyE,CAAM,EAEb,EACT,EAEaC,GAA4B,CAACH,EAA6BC,IAAkB,CACvF,GAAI,CAACA,GAAS,CAACD,EAAI,OACnB,IAAMvE,EAAOwE,GAAA,YAAAA,EAAO,KAAMxE,GAASA,EAAK,QAAUuE,IAAMvE,GAAA,YAAAA,EAAM,MAAOuE,IAAMvE,GAAA,YAAAA,EAAM,OAAQuE,GACzF,OAAIvE,EACKA,EAAK,MAEP,EACT,ECjXO,SAAS2E,GAAcC,EAAsB,CAClD,OAAIA,EACK,OAAO,QAAQC,EAAkBD,CAAM,CAAC,EAC5C,OAAO,CAAC,CAAC,CAAEE,CAAK,IAAMA,IAAU,MAAS,EACzC,IAAI,CAAC,CAACC,EAAKD,CAAK,IAAM,GAAG,mBAAmBC,CAAG,CAAC,IAAI,mBAAmB,OAAOD,CAAK,CAAC,CAAC,EAAE,EACvF,KAAK,GAAG,EACN,EACT,CAEO,SAASE,GAAUC,EAA6C,CACrE,OAAIA,GAAA,MAAAA,EAAK,WAAW,QACXA,EAAI,MAAM,OAAO,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,EAEpCA,CACT,CAEO,IAAMC,GACXN,GACG,CACH,IAAMO,EAAQ,IAAI,gBAClB,OAAW,CAACJ,EAAKD,CAAK,IAAK,OAAO,QAAQF,CAAM,EAC9C,GAAI,MAAM,QAAQE,CAAK,EACrB,QAAWM,KAAKN,EACdK,EAAM,OAAOJ,EAAKK,EAAE,SAAS,CAAC,OAEvBN,IAAU,QACnBK,EAAM,OAAOJ,EAAKD,EAAM,SAAS,CAAC,EAItC,OAAOK,EAAM,SAAS,CACxB,EAEaE,GACXT,GAEO,OAAO,QAAQA,CAAM,EACzB,IAAI,CAAC,CAACG,EAAKD,CAAK,IACX,MAAM,QAAQA,CAAK,EACjBA,EAAM,SAAW,EAAU,GACxB,GAAGC,CAAG,IAAID,EAAM,KAAK,GAAG,CAAC,GAE9BA,IAAU,QAAaA,IAAU,GAAW,GACzC,GAAGC,CAAG,IAAID,CAAK,EACvB,EACA,OAAQQ,GAAQA,IAAQ,EAAE,EAC1B,KAAK,GAAG,EAGAC,GAAgBJ,GAC3B,CAACA,GAASA,IAAU,MAAQA,IAAU,GAAK,CAAC,EAAIA,EAAM,MAAM,GAAG,EAAE,IAAKG,GAAQ,SAASA,CAAG,CAAC,EAEhFE,GAAW,IACf,KAAK,IAAI,EAAI,KAAK,MAAM,KAAK,OAAO,EAAI,GAAK,EAGzCC,GAAkBC,GAAkC,CAC/D,IAAMC,EAAeD,EAAa,IAAI,SAAS,EAC/C,GAAI,CAACC,EAAc,OAAO,KAE1B,GAAI,CACF,IAAMC,EAAU,mBAAmBD,CAAY,EAM/C,OALqB,KAAK,MAAMC,CAAO,CAMzC,OAASC,EAAO,CACd,eAAQ,MAAM,kCAAmCA,CAAK,EAC/C,IACT,CACF,EC1EO,IAAMC,GAAiB,CAC5BC,EACAC,EACAC,EACAC,IACG,CACH,IAAMC,EAAkB,IAAI,gBAAgBJ,CAAY,EACxDI,EAAgB,IAAIF,EAAKC,CAAK,EAC9BF,EAAgBG,CAAe,CACjC,EAQO,SAASC,GACdC,EAAc,CAAC,EACfC,EAAgB,GAChBC,EAAwB,WACxBC,EACO,CAtBT,IAAAC,EAuBE,GAAI,CAACJ,EAAM,MAAO,CAAC,EACnB,GAAI,CAACC,EAAO,OAAOD,EAEnB,IAAMK,GAAaD,EAAAH,EAAM,KAAK,IAAX,YAAAG,EAAc,cAG3BE,EAAgBC,IACGJ,EACnBA,EAAe,IAAKK,GAAUD,EAAIC,CAAK,CAAC,EAAE,OAAO,OAAO,EACxD,OAAO,OAAOD,CAAG,GAEC,KACnBV,GAAU,OAAOA,GAAU,WAAYA,GAAA,YAAAA,EAAO,cAAc,SAASQ,GACxE,EAIII,EAAUT,GACPA,EACJ,IAAKU,GAAS,CACb,IAAMC,EAAeD,EAAKR,CAAa,EAAIO,EAAOC,EAAKR,CAAa,CAAC,EAAI,CAAC,EAG1E,OAAII,EAAaI,CAAI,GAAKC,EAAa,OAAS,EACvCC,EAAAC,EAAA,GACFH,GADE,CAEL,CAACR,CAAa,EAAGS,EAAa,OAAS,EAAIA,EAAe,MAC5D,GAEK,IACT,CAAC,EACA,OAAQD,GAASA,IAAS,IAAI,EAGnC,OAAOD,EAAOT,CAAI,CACpB,CAEO,SAASc,GACdd,EAAc,CAAC,EACfC,EAAgB,GAChBC,EAAwB,WACxBC,EACO,CAjET,IAAAC,EAkEE,GAAI,CAACJ,EAAM,MAAO,CAAC,EACnB,GAAI,CAACC,EAAO,OAAOD,EACnB,IAAMK,GAAaD,EAAAH,GAAA,YAAAA,EAAO,SAAP,YAAAG,EAAe,cAG5BE,EAAgBC,IACGJ,EACnBA,EAAe,IAAKK,GAAUD,EAAIC,CAAK,CAAC,EAAE,OAAO,OAAO,EACxD,OAAO,OAAOD,CAAG,GAEC,KACnBV,GAAU,OAAOA,GAAU,WAAYA,GAAA,YAAAA,EAAO,cAAc,SAASQ,GACxE,EAIII,EAAUT,GAAuB,CACrC,IAAIe,EAAiB,CAAC,EAEtB,OAAAf,EAAK,QAASU,GAAS,CAEjBJ,EAAaI,CAAI,GACnBK,EAAQ,KAAKL,CAAI,EAIfA,EAAKR,CAAa,IACpBa,EAAUA,EAAQ,OAAON,EAAOC,EAAKR,CAAa,CAAC,CAAC,EAExD,CAAC,EAEMa,CACT,EAEA,OAAON,EAAOT,CAAI,CACpB,CCrGO,IAAMgB,GAAeC,GAA0B,CACpD,IAAMC,EAAiBD,EAAM,QAAQ,MAAO,EAAE,EAC9C,OAAKC,EACE,KAAK,IAAI,KAAK,IAAI,SAASA,EAAgB,EAAE,EAAG,CAAC,EAAG,EAAE,EAAE,SAAS,EAD5C,EAE9B,EAEaC,GAAiBF,GAA0B,CACtD,IAAMC,EAAiBD,EAAM,QAAQ,MAAO,EAAE,EAC9C,OAAKC,EACE,KAAK,IAAI,KAAK,IAAI,SAASA,EAAgB,EAAE,EAAG,CAAC,EAAG,EAAE,EAAE,SAAS,EAD5C,EAE9B,EAEaE,GAAgBH,GAA0B,CACrD,IAAMC,EAAiBD,EAAM,QAAQ,MAAO,EAAE,EAC9C,OAAKC,EAGDA,EAAe,OAAS,EAAUA,EAGzB,SAASA,EAAgB,EAAE,EAC1B,KAAO,OAASA,EAPF,EAQ9B","names":["literalOrdinals","num","lang","ones","teens","tens","hundreds","hundredPart","remainderPart","remainder","base","suffixes","v","handleCreateFront","items","setItems","itemData","newItem","__spreadValues","handleCreateFrontUnique","uniqueField","item","handleUpdateFront","id","handleDeleteFront","_a","formatDateWithPattern","date","format","day","month","year","hours24","hours12","minutes","seconds","ampm","tokens","match","formatDateTime","newDate","formatDate","isNotFutureDate","val","now","getTime","inputDate","pad","num","formattedHours","formattedMinutes","calculateDetailedAge","birthDate","currentDate","gender","_a","_b","_c","_d","_e","zeroAge","birth","isValidISODate","current","years","months","days","lastMonth","birthDateToAge","today","ageToBirthDate","age","birthYear","birthMonth","birthDay","ageToBirthDateChangeSegment","oldAge","convertTimeToTimestamp","timeString","daysPart","timePart","hours","part","calculateAge","m","dateString","getTextOnlyFromHtml","html","_a","parser","doc","handleKeyDownArabic","event","key","ctrlKey","metaKey","handleKeyDownEnglish","handleKeyDownNumber","handleKeyDownNumberNoCopy","handleKeyDownFloatNumber","input","filterInArray","field","values","data","item","filterInObjects","query","childrenField","fieldsToFilter","matchesQuery","obj","value","q","filter","results","capitalizeString","str","removeEmptyFields","obj","value","removeIdFromObjects","objects","_a","_b","_id","rest","__objRest","removeItemsWithIds","array","idsToRemove","item","createOptionsArray","data","valueField","labelFields","field","filterUsersOption","option","inputValue","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","fullNameLabel","emailLabel","removeKeys","keys","clonedObj","__spreadValues","key","getArrayKeys","result","convertObjectToArray","comparePermissionLists","list1","list2","i","keys1","keys2","values1","values2","objectToFormData","formData","namespace","formKey","isDate","isObject","isArray","omit","keysToOmit","isEqual","value1","value2","compareObjects","original","updated","keysToIgnore","normalizedOriginal","normalizedUpdated","getChangedFields","changedFields","originalValue","updatedValue","nestedChanges","sortObjectByKeys","sortedEntries","a","b","sortObjectByValues","removeFields","fieldsToRemove","newObj","removeFieldsTopLevel","removeFieldsFromObject","getLabelByItemsAndId","id","items","fields","getLabelByItemsAndOptions","toQueryString","params","removeEmptyFields","value","key","pureURLS3","url","createSearchQuery","query","v","serializeFormQuery","val","arrFromQuery","uniqueId","prePareFilters","searchParams","filtersParam","decoded","error","addSearchParam","searchParams","setSearchParams","key","value","newSearchParams","searchInObjectsWithParents","data","query","childrenField","fieldsToSearch","_a","lowerQuery","matchesQuery","obj","field","search","item","childResults","__spreadProps","__spreadValues","searchInObjects","results","validateDay","value","sanitizedValue","validateMonth","validateYear"]}
|
package/package.json
CHANGED
|
@@ -1,40 +1,66 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "super-utilix",
|
|
3
|
-
"version": "1.0
|
|
4
|
-
"description": "A collection of utility functions",
|
|
5
|
-
"main": "dist/index.js",
|
|
6
|
-
"module": "dist/index.mjs",
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
"
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "super-utilix",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "A collection of utility functions",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.mjs",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"require": "./dist/index.js",
|
|
13
|
+
"import": "./dist/index.mjs"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsup",
|
|
21
|
+
"lint": "eslint .",
|
|
22
|
+
"format": "prettier --write .",
|
|
23
|
+
"test": "vitest run",
|
|
24
|
+
"test:watch": "vitest",
|
|
25
|
+
"test:coverage": "vitest run --coverage",
|
|
26
|
+
"prepare": "husky",
|
|
27
|
+
"prepublishOnly": "npm run lint && npm run test && npm run build",
|
|
28
|
+
"release:minor": "npm version minor && npm publish",
|
|
29
|
+
"release:patch": "npm version patch && npm publish",
|
|
30
|
+
"release:major": "npm version major && npm publish"
|
|
31
|
+
},
|
|
32
|
+
"lint-staged": {
|
|
33
|
+
"*.{js,ts,tsx}": [
|
|
34
|
+
"eslint --fix",
|
|
35
|
+
"prettier --write"
|
|
36
|
+
],
|
|
37
|
+
"*.{json,md}": [
|
|
38
|
+
"prettier --write"
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
"keywords": [
|
|
42
|
+
"utils",
|
|
43
|
+
"typescript",
|
|
44
|
+
"power-utils"
|
|
45
|
+
],
|
|
46
|
+
"author": "",
|
|
47
|
+
"license": "ISC",
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/node": "^20.10.0",
|
|
50
|
+
"@typescript-eslint/eslint-plugin": "^8.50.1",
|
|
51
|
+
"@typescript-eslint/parser": "^8.50.1",
|
|
52
|
+
"@vitest/coverage-v8": "^4.0.16",
|
|
53
|
+
"typescript-eslint": "^8.50.1",
|
|
54
|
+
"eslint": "^9.39.2",
|
|
55
|
+
"eslint-config-prettier": "^10.1.8",
|
|
56
|
+
"eslint-plugin-prettier": "^5.5.4",
|
|
57
|
+
"globals": "^16.5.0",
|
|
58
|
+
"husky": "^9.1.7",
|
|
59
|
+
"lint-staged": "^16.2.7",
|
|
60
|
+
"prettier": "^3.7.4",
|
|
61
|
+
"rimraf": "^5.0.5",
|
|
62
|
+
"tsup": "^8.5.1",
|
|
63
|
+
"typescript": "^5.3.3",
|
|
64
|
+
"vitest": "^4.0.16"
|
|
65
|
+
}
|
|
66
|
+
}
|
package/dist/index.mjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
var k=Object.defineProperty,E=Object.defineProperties;var L=Object.getOwnPropertyDescriptors;var y=Object.getOwnPropertySymbols;var A=Object.prototype.hasOwnProperty,O=Object.prototype.propertyIsEnumerable;var w=(t,e,r)=>e in t?k(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,l=(t,e)=>{for(var r in e||(e={}))A.call(e,r)&&w(t,r,e[r]);if(y)for(var r of y(e))O.call(e,r)&&w(t,r,e[r]);return t},T=(t,e)=>E(t,L(e));var F=(t,e)=>{var r={};for(var n in t)A.call(t,n)&&e.indexOf(n)<0&&(r[n]=t[n]);if(t!=null&&y)for(var n of y(t))e.indexOf(n)<0&&O.call(t,n)&&(r[n]=t[n]);return r};var C=(t,e)=>{if(e==="ar"){let r=["","\u0627\u0644\u0623\u0648\u0644","\u0627\u0644\u062B\u0627\u0646\u064A","\u0627\u0644\u062B\u0627\u0644\u062B","\u0627\u0644\u0631\u0627\u0628\u0639","\u0627\u0644\u062E\u0627\u0645\u0633","\u0627\u0644\u0633\u0627\u062F\u0633","\u0627\u0644\u0633\u0627\u0628\u0639","\u0627\u0644\u062B\u0627\u0645\u0646","\u0627\u0644\u062A\u0627\u0633\u0639"],n=["\u0627\u0644\u062D\u0627\u062F\u064A \u0639\u0634\u0631","\u0627\u0644\u062B\u0627\u0646\u064A \u0639\u0634\u0631","\u0627\u0644\u062B\u0627\u0644\u062B \u0639\u0634\u0631","\u0627\u0644\u0631\u0627\u0628\u0639 \u0639\u0634\u0631","\u0627\u0644\u062E\u0627\u0645\u0633 \u0639\u0634\u0631","\u0627\u0644\u0633\u0627\u062F\u0633 \u0639\u0634\u0631","\u0627\u0644\u0633\u0627\u0628\u0639 \u0639\u0634\u0631","\u0627\u0644\u062B\u0627\u0645\u0646 \u0639\u0634\u0631","\u0627\u0644\u062A\u0627\u0633\u0639 \u0639\u0634\u0631"],o=["","\u0627\u0644\u0639\u0627\u0634\u0631","\u0627\u0644\u0639\u0634\u0631\u0648\u0646","\u0627\u0644\u062B\u0644\u0627\u062B\u0648\u0646","\u0627\u0644\u0623\u0631\u0628\u0639\u0648\u0646","\u0627\u0644\u062E\u0645\u0633\u0648\u0646","\u0627\u0644\u0633\u062A\u0648\u0646","\u0627\u0644\u0633\u0628\u0639\u0648\u0646","\u0627\u0644\u062B\u0645\u0627\u0646\u0648\u0646","\u0627\u0644\u062A\u0633\u0639\u0648\u0646"],s=["","\u0627\u0644\u0645\u0627\u0626\u0629","\u0627\u0644\u0645\u0626\u062A\u0627\u0646","\u0627\u0644\u062B\u0644\u0627\u062B\u0645\u0627\u0626\u0629","\u0627\u0644\u0623\u0631\u0628\u0639\u0645\u0627\u0626\u0629","\u0627\u0644\u062E\u0645\u0633\u0645\u0627\u0626\u0629","\u0627\u0644\u0633\u062A\u0645\u0627\u0626\u0629","\u0627\u0644\u0633\u0628\u0639\u0645\u0627\u0626\u0629","\u0627\u0644\u062B\u0645\u0627\u0646\u0645\u0627\u0626\u0629","\u0627\u0644\u062A\u0633\u0639\u0645\u0627\u0626\u0629"];if(t===1)return"\u0627\u0644\u0623\u0648\u0644";if(t>=2&&t<=9)return r[t];if(t>=11&&t<=19)return n[t-11];if(t%10===0&&t<100)return o[t/10];let a=t%10,u=Math.floor(t/10)*10;if(u===10)return`\u0627\u0644${r[a]} \u0639\u0634\u0631`;if(a===1)return`\u0627\u0644\u062D\u0627\u062F\u064A ${o[u/10]}`;if(a===2)return`\u0627\u0644\u062B\u0627\u0646\u064A ${o[u/10]}`;let i=`${r[a]} \u0648${o[u/10]}`,f=Math.floor(t/100),c=t%100;return f>0?c===0?s[f]:`${s[f]} \u0648${C(c,e)}`:i}else{let r=["th","st","nd","rd"],n=t%100;return t+(r[(n-20)%10]||r[n]||r[0])}};var B=({items:t,setItems:e,itemData:r})=>{if(!t||!e||!r)return;let n=l({id:Number(new Date().getTime())},r);n&&e([...t,n])},v=({items:t,setItems:e,itemData:r,uniqueField:n})=>{if(!t||!e||!r)return;t.some(s=>n&&typeof r=="object"&&r!==null?s[n]===r[n]:s===r)||e([...t,r])},z=({id:t,items:e,setItems:r,itemData:n})=>{!t||!e||!r||!n||r(e==null?void 0:e.map(o=>o.id===t?l(l({},o),n):o))},Q=({id:t,items:e,setItems:r})=>{!t||!e||!r||r(e==null?void 0:e.filter(n=>{var o;return typeof n=="object"&&n!==null&&!Array.isArray(t)?n.id!==t:Array.isArray(t)?!t.includes((o=n.id)!=null?o:n):n!==t}))};import M from"dayjs";var J=t=>{if(!t)return"";let e=new Date(t);return M(e).format("DD/MM/YYYY, h:mmA")},Z=t=>{if(!t)return"";let e=new Date(t);return M(e).format("DD/MM/YYYY")},G=t=>{let e=new Date(t),r=new Date;return r.setDate(r.getDate()+1),r.setHours(0,0,0,0),e<r};function X(t){if(!t)return"";let e=new Date(t),r=s=>s.toString().padStart(2,"0"),n=r(e.getHours()),o=r(e.getMinutes());return`${n}:${o}`}var V=(t,e=o=>o,r=new Date,n)=>{let o={age:{years:0,months:0,days:0},message:e("no_age")};if(t==null)return o;let s=t instanceof Date?t:U(t)?new Date(t):new Date(Number(t)),a=r instanceof Date?r:new Date(Number(r));if(isNaN(s.getTime())||isNaN(a.getTime())||a<s)return o;let u=a.getFullYear()-s.getFullYear(),i=a.getMonth()-s.getMonth(),f=a.getDate()-s.getDate();if(f<0){let c=new Date(a.getFullYear(),a.getMonth(),0);f+=c.getDate(),i--}return i<0&&(u--,i+=12),{age:{years:u,months:i,days:f},message:`${u} ${e("years")} - ${i} ${e("months")} - ${f} ${e("days")} / ${e(n!=null?n:"")}`}},q=t=>{if(!t)return null;let e=new Date(t),r=new Date,n=r.getFullYear()-e.getFullYear(),o=r.getMonth()-e.getMonth(),s=r.getDate()-e.getDate();return s<0&&(o--,s+=new Date(r.getFullYear(),r.getMonth(),0).getDate()),o<0&&(n--,o+=12),{years:n,months:o,days:s}},ee=t=>{let e=new Date,r=e.getFullYear()-t.years,n=e.getMonth()-t.months,o=e.getDate()-t.days,s=new Date(e.getFullYear(),e.getMonth(),e.getDate());return s.setFullYear(r),s.setMonth(n),s.setDate(o),s},te=(t,e)=>{let r=new Date,n=t&&t.years?t.years-e.years:r.getFullYear()-e.years,o=t&&t.months?t.months-e.months:r.getMonth()-e.months,s=t&&t.days?t.days-e.days:r.getDate()-e.days,a=new Date(r.getFullYear(),r.getMonth(),r.getDate());return a.setFullYear(n),a.setMonth(o),a.setDate(s),a};function re(t){let[e,r]=t.split(" "),n=parseInt(e.replace(/^0+/,""),10),[o,s,a]=r==null?void 0:r.split(":").map(i=>parseInt(i,10));return n*24*60*60*1e3+o*60*60*1e3+s*60*1e3+a*1e3}var ne=t=>{let e=new Date,r;if(t.includes("/")){let[s,a,u]=t.split("/").map(Number);r=new Date(u,a-1,s)}else if(!isNaN(Date.parse(t)))r=new Date(t);else throw new Error("Unsupported date format");let n=e.getFullYear()-r.getFullYear(),o=e.getMonth()-r.getMonth();return(o<0||o===0&&e.getDate()<r.getDate())&&n--,n};function U(t){let e=new Date(t);return!isNaN(e.getTime())&&e.toISOString()===t}var se=t=>{var n;let e=new DOMParser,r=t&&e.parseFromString(t,"text/html");return(n=r&&r.body.textContent)!=null?n:""};var ie=t=>{let{key:e,ctrlKey:r,metaKey:n}=t;e==="Backspace"||e==="Delete"||e==="ArrowLeft"||e==="ArrowRight"||e==="ArrowUp"||e==="ArrowDown"||e==="Tab"||e==="Enter"||(r||n)&&(e==="c"||e==="v"||e==="x"||e==="a")||/[\u0600-\u06FF0-9\s!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]/.test(e)||t.preventDefault()},ce=t=>{let{key:e,ctrlKey:r,metaKey:n}=t;e==="Backspace"||e==="Delete"||e==="ArrowLeft"||e==="ArrowRight"||e==="ArrowUp"||e==="ArrowDown"||e==="Tab"||e==="Enter"||(r||n)&&(e==="c"||e==="v"||e==="x"||e==="a")||/[A-Za-z0-9\s!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]/.test(e)||t.preventDefault()},ue=t=>{let{key:e,ctrlKey:r,metaKey:n}=t;e==="Backspace"||e==="Delete"||e==="ArrowLeft"||e==="ArrowRight"||e==="ArrowUp"||e==="ArrowDown"||e==="Tab"||e==="Enter"||(r||n)&&(e==="c"||e==="v"||e==="x"||e==="a")||/[0-9]/.test(e)||t.preventDefault()},fe=t=>{let{key:e}=t;e==="Backspace"||e==="Delete"||e==="ArrowLeft"||e==="ArrowRight"||e==="ArrowUp"||e==="ArrowDown"||e==="Tab"||e==="Enter"||/[0-9]/.test(e)||t.preventDefault()},le=t=>{let{key:e,ctrlKey:r,metaKey:n}=t,o=t.currentTarget;e==="Backspace"||e==="Delete"||e==="ArrowLeft"||e==="ArrowRight"||e==="ArrowUp"||e==="ArrowDown"||e==="Tab"||e==="Enter"||(r||n)&&(e==="c"||e==="v"||e==="x"||e==="a")||e==="."&&!o.value.includes(".")||!/[0-9]/.test(e)&&e!=="."&&t.preventDefault()};function ge(t,e,r){return e.length===0?r:r.filter(n=>e.includes(n[t]))}function pe(t=[],e,r="children",n){if(!t)return[];if(!e||(e==null?void 0:e.length)===0)return t;let o=a=>(n?n.map(i=>a[i]).filter(Boolean):Object.values(a)).some(i=>typeof i=="string"&&e.some(f=>i.includes(f))),s=a=>{let u=[];return a.forEach(i=>{o(i)&&u.push(i),i[r]&&(u=u.concat(s(i[r])))}),u};return s(t)}import{isArray as g,isDate as j,isEqual as h,isObject as p,omit as $}from"lodash";var me=t=>t.charAt(0).toUpperCase()+t.slice(1);function I(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>(e==null?void 0:e.length)!==0&&e!==null&&e!==void 0))}function xe(t){return t.map(n=>{var o=n,{_id:e}=o,r=F(o,["_id"]);return r})}function De(t,e){return t.filter(r=>!(r!=null&&r._id)||!e.includes(r==null?void 0:r._id))}function be(t,e,...r){return t.map(n=>({value:n[e],label:r.map(o=>n[o]).join(" ")}))}function we(t,e){var o,s,a,u,i,f,c,d,m,x,D,b;let r=`${(i=(u=(a=(s=(o=t==null?void 0:t.label)==null?void 0:o.props)==null?void 0:s.children)==null?void 0:a[0])==null?void 0:u.props)==null?void 0:i.children}`,n=(x=(m=(d=(c=(f=t==null?void 0:t.label)==null?void 0:f.props)==null?void 0:c.children)==null?void 0:d[1])==null?void 0:m.props)==null?void 0:x.children;return((D=r==null?void 0:r.toLowerCase())==null?void 0:D.includes(e==null?void 0:e.toLowerCase()))||((b=n==null?void 0:n.toLowerCase())==null?void 0:b.includes(e==null?void 0:e.toLowerCase()))}function Ae(t,e){let r=l({},t);for(let n of e)delete r[n];return r}function Oe(t){let e=[];for(let r in t)Array.isArray(t[r])&&e.push({[r]:t[r]});return e}function Te(t){return t?Object.entries(t).map(([e,r])=>({[e]:r})):[]}function Fe(t,e){if(t.length!==e.length)return!1;for(let r=0;r<t.length;r++){let n=Object.keys(t[r]),o=Object.keys(e[r]);if(n.length!==o.length)return!1;for(let s of n){if(!o.includes(s))return!1;let a=t[r][s],u=e[r][s];if(a.length!==u.length)return!1;for(let i of a)if(!u.includes(i))return!1}}return!0}function P(t,e=new FormData,r=""){for(let n in t){if(!t.hasOwnProperty(n))continue;let o=r?`${r}[${n}]`:n;typeof t[n]=="object"&&!(t[n]instanceof File)?P(t[n],e,o):e.append(o,t[n])}return e}function Me(t,e,r=[]){let n=$(t,r),o=$(e,r);return h(n,o)}function R(t,e){if(t==null&&e==null)return{};if(t==null)return e!=null?e:{};if(e==null)return{};let r={};return Object.keys(e).forEach(n=>{let o=t==null?void 0:t[n],s=e==null?void 0:e[n];if(j(s)&&j(o)){o.getTime()!==s.getTime()&&(r[n]=s);return}if(p(s)&&!p(o)){r[n]=s;return}if(p(s)&&!g(s)&&p(o)&&!g(o)){let a=R(o,s);Object.keys(a).length>0&&(r[n]=a);return}if(g(s)||g(o)){h(o,s)||(r[n]=s);return}h(o,s)||(r[n]=s)}),r}function je(t){let e=Object.entries(t).sort((r,n)=>r[0].localeCompare(n[0]));return Object.fromEntries(e)}function $e(t){let e=Object.entries(t).sort((r,n)=>typeof r[1]=="number"&&typeof n[1]=="number"?r[1]-n[1]:0);return Object.fromEntries(e)}function S(t,e){if(Array.isArray(t))return t.map(r=>S(r,e));if(typeof t=="object"&&t!==null){let r={};for(let n in t)e.includes(n)||(r[n]=S(t[n],e));return r}return t}function Se(t,e){return t==null?t:Array.isArray(t)?t.map(r=>typeof r=="object"&&r!==null?Y(r,e):r):typeof t=="object"&&t!==null?Y(t,e):t}function Y(t,e){let r=l({},t);for(let n of e||[])delete r[n];return r}var Ye=(t,e,r="name")=>{if(!e||!t)return;let n=e==null?void 0:e.find(o=>o.id===t);return n?Array.isArray(r)?r.map(o=>n[o]).join(" "):n[r]:""},Ie=(t,e)=>{if(!e||!t)return;let r=e==null?void 0:e.find(n=>n.value===t||(n==null?void 0:n.id)===t||(n==null?void 0:n._id)===t);return r?r.label:""};function Ce(t){return t?Object.entries(I(t)).filter(([,e])=>e!==void 0).map(([e,r])=>`${encodeURIComponent(e)}=${encodeURIComponent(String(r))}`).join("&"):""}function Ue(t){return t!=null&&t.startsWith("http")?t.split(".com/")[1].split("?")[0]:t}var Pe=t=>{let e=new URLSearchParams;for(let[r,n]of Object.entries(t))if(Array.isArray(n))for(let o of n)e.append(r,o.toString());else n!==void 0&&e.append(r,n.toString());return e.toString()},Re=t=>Object.entries(t).map(([e,r])=>Array.isArray(r)?r.length===0?"":`${e}=${r.join(",")}`:r===void 0||r===""?"":`${e}=${r}`).filter(e=>e!=="").join("&"),Ke=t=>!t||t===null||t===""?[]:t.split(",").map(e=>parseInt(e)),Ne=()=>Date.now()+Math.floor(Math.random()*1e4),Be=t=>{let e=t.get("filters");if(!e)return null;try{let r=decodeURIComponent(e);return JSON.parse(r)}catch(r){return console.error("Error parsing filters from URL:",r),null}};var ze=(t,e,r,n)=>{let o=new URLSearchParams(t);o.set(r,n),e(o)};function Qe(t=[],e="",r="children",n){var u;if(!t)return[];if(!e)return t;let o=(u=e.trim())==null?void 0:u.toLowerCase(),s=i=>(n?n.map(c=>i[c]).filter(Boolean):Object.values(i)).some(c=>typeof c=="string"&&(c==null?void 0:c.toLowerCase().includes(o))),a=i=>i.map(f=>{let c=f[r]?a(f[r]):[];return s(f)||c.length>0?T(l({},f),{[r]:c.length>0?c:void 0}):null}).filter(f=>f!==null);return a(t)}function _e(t=[],e="",r="children",n){var u;if(!t)return[];if(!e)return t;let o=(u=e==null?void 0:e.trim())==null?void 0:u.toLowerCase(),s=i=>(n?n.map(c=>i[c]).filter(Boolean):Object.values(i)).some(c=>typeof c=="string"&&(c==null?void 0:c.toLowerCase().includes(o))),a=i=>{let f=[];return i.forEach(c=>{s(c)&&f.push(c),c[r]&&(f=f.concat(a(c[r])))}),f};return a(t)}var Je=t=>{let e=t.replace(/\D/g,"");return e?Math.min(Math.max(parseInt(e,10),1),31).toString():""},Ze=t=>{let e=t.replace(/\D/g,"");return e?Math.min(Math.max(parseInt(e,10),1),12).toString():""},Ge=t=>{let e=t.replace(/\D/g,"");return e?e.length<4?e:parseInt(e,10)<1900?"1900":e:""};export{ze as addSearchParam,ee as ageToBirthDate,te as ageToBirthDateChangeSegment,Ke as arrFromQuery,q as birthDateToAge,ne as calculateAge,V as calculateDetailedAge,me as capitalizeString,Me as compareObjects,Fe as comparePermissionLists,Te as convertObjectToArray,re as convertTimeToTimestamp,be as createOptionsArray,Pe as createSearchQuery,ge as filterInArray,pe as filterInObjects,we as filterUsersOption,Z as formatDate,J as formatDateTime,Oe as getArrayKeys,R as getChangedFields,Ye as getLabelByItemsAndId,Ie as getLabelByItemsAndOptions,se as getTextOnlyFromHtml,X as getTime,B as handleCreateFront,v as handleCreateFrontUnique,Q as handleDeleteFront,ie as handleKeyDownArabic,ce as handleKeyDownEnglish,le as handleKeyDownFloatNumber,ue as handleKeyDownNumber,fe as handleKeyDownNumberNoCopy,z as handleUpdateFront,G as isNotFutureDate,C as literalOrdinals,P as objectToFormData,Be as prePareFilters,Ue as pureURLS3,I as removeEmptyFields,S as removeFields,Y as removeFieldsFromObject,Se as removeFieldsTopLevel,xe as removeIdFromObjects,De as removeItemsWithIds,Ae as removeKeys,_e as searchInObjects,Qe as searchInObjectsWithParents,Re as serializeFormQuery,je as sortObjectByKeys,$e as sortObjectByValues,Ce as toQueryString,Ne as uniqueId,Je as validateDay,Ze as validateMonth,Ge as validateYear};
|
|
2
|
-
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/arabic.ts","../src/curdOperation.ts","../src/dateUtils.ts","../src/domUtils.ts","../src/eventHandlers.ts","../src/filter.ts","../src/objectUtils.tsx","../src/queryUtils.ts","../src/search.ts","../src/validationDate.ts"],"sourcesContent":["export const literalOrdinals = (num: number, lang: \"ar\" | \"en\"): string => {\n if (lang === \"ar\") {\n const ones = [\"\", \"الأول\", \"الثاني\", \"الثالث\", \"الرابع\", \"الخامس\", \"السادس\", \"السابع\", \"الثامن\", \"التاسع\"];\n const teens = [\"الحادي عشر\", \"الثاني عشر\", \"الثالث عشر\", \"الرابع عشر\", \"الخامس عشر\", \"السادس عشر\", \"السابع عشر\", \"الثامن عشر\", \"التاسع عشر\"];\n const tens = [\"\", \"العاشر\", \"العشرون\", \"الثلاثون\", \"الأربعون\", \"الخمسون\", \"الستون\", \"السبعون\", \"الثمانون\", \"التسعون\"];\n const hundreds = [\"\", \"المائة\", \"المئتان\", \"الثلاثمائة\", \"الأربعمائة\", \"الخمسمائة\", \"الستمائة\", \"السبعمائة\", \"الثمانمائة\", \"التسعمائة\"];\n\n if (num === 1) return \"الأول\";\n if (num >= 2 && num <= 9) return ones[num];\n if (num >= 11 && num <= 19) return teens[num - 11];\n if (num % 10 === 0 && num < 100) return tens[num / 10];\n\n const remainder = num % 10;\n const base = Math.floor(num / 10) * 10;\n\n if (base === 10) return `ال${ones[remainder]} عشر`;\n if (remainder === 1) return `الحادي ${tens[base / 10]}`;\n if (remainder === 2) return `الثاني ${tens[base / 10]}`;\n const result = `${ones[remainder]} و${tens[base / 10]}`;\n\n const hundredPart = Math.floor(num / 100);\n const remainderPart = num % 100;\n if (hundredPart > 0) {\n if (remainderPart === 0) return hundreds[hundredPart];\n return `${hundreds[hundredPart]} و${literalOrdinals(remainderPart, lang)}`;\n }\n\n return result;\n } else {\n const suffixes = [\"th\", \"st\", \"nd\", \"rd\"];\n const v = num % 100;\n return num + (suffixes[(v - 20) % 10] || suffixes[v] || suffixes[0]);\n }\n};\n","// Create\nexport const handleCreateFront = ({ items, setItems, itemData }: { items?: any[]; setItems?: any; itemData?: any }) => {\n if (!items || !setItems || !itemData) return;\n const newItem: any = {\n // id: items.length > 0 ? Math.max(...items.map((item) => item.id)) + 1 : 1,\n id: Number(new Date().getTime()),\n ...itemData,\n };\n newItem && setItems([...items, newItem]);\n};\n// CreateUnique\nexport const handleCreateFrontUnique = ({ items, setItems, itemData, uniqueField }: { items?: any[]; setItems?: any; itemData?: any; uniqueField?: string }) => {\n if (!items || !setItems || !itemData) return;\n\n // Check if the item already exists in the array\n const itemExists = items.some((item) => {\n // If uniqueField is provided and itemData is an object\n if (uniqueField && typeof itemData === \"object\" && itemData !== null) {\n return item[uniqueField] === itemData[uniqueField];\n }\n // For primitive types (string, number, boolean, etc.)\n return item === itemData;\n });\n\n // Only add the item if it doesn't already exist\n if (!itemExists) {\n // const newItem = {\n // id: Number(new Date().getTime()),\n // ...(typeof itemData === \"object\" && itemData !== null ? itemData : { value: itemData }),\n // };\n setItems([...items, itemData]);\n }\n};\n\n// Update\nexport const handleUpdateFront = ({ id, items, setItems, itemData }: { id?: number | string; items?: any[]; setItems?: any; itemData?: any }) => {\n if (!id || !items || !setItems || !itemData) return;\n setItems(items?.map((item) => (item.id === id ? { ...item, ...itemData } : item)));\n};\n\n// Delete\nexport const handleDeleteFront = ({ id, items, setItems }: { id?: number | string | null | (number | string | null)[]; items?: any[]; setItems?: any }) => {\n if (!id || !items || !setItems) return;\n setItems(\n items?.filter((item: any) => {\n if (typeof item === \"object\" && item !== null && !Array.isArray(id)) {\n return item.id !== id;\n } else if (Array.isArray(id)) {\n return !id.includes(item.id ?? item);\n } else {\n return item !== id;\n }\n }),\n );\n};\n","import dayjs from \"dayjs\";\n\nexport const formatDateTime = (date: string | Date | null | undefined) => {\n if (!date) return \"\";\n const newDate = new Date(date);\n //old: \"YYYY-MM-DD\"\n\n return dayjs(newDate).format(\"DD/MM/YYYY, h:mmA\");\n};\n\nexport const formatDate = (date: string | Date | null | undefined) => {\n if (!date) return \"\";\n // return date only\n const newDate = new Date(date);\n //old: \"YYYY-MM-DD\"\n return dayjs(newDate).format(\"DD/MM/YYYY\");\n};\n\nexport const isNotFutureDate = (date: string) => {\n const val = new Date(date);\n // Check if the date is not in the future based on day\n\n const now = new Date();\n now.setDate(now.getDate() + 1);\n now.setHours(0, 0, 0, 0);\n return val < now;\n};\n\nexport function getTime(inputDate: string | Date | null | undefined): string {\n if (!inputDate) return \"\";\n const date = new Date(inputDate);\n const pad = (num: number) => num.toString().padStart(2, \"0\");\n const formattedHours = pad(date.getHours());\n const formattedMinutes = pad(date.getMinutes());\n return `${formattedHours}:${formattedMinutes}`;\n}\n\ninterface Age {\n years: number;\n months: number;\n days: number;\n}\n\nexport const calculateDetailedAge = (birthDate?: Date | string | null, t = (key: string) => key, currentDate: Date | string = new Date(), gender?: string): { age: Age; message: string } => {\n const zeroAge = {\n age: {\n years: 0,\n months: 0,\n days: 0,\n },\n message: t(\"no_age\"),\n };\n if (birthDate === null || birthDate === undefined) {\n return zeroAge;\n }\n // Convert to Date objects if strings are passed\n const birth: Date = birthDate instanceof Date ? birthDate : isValidISODate(birthDate) ? new Date(birthDate) : new Date(Number(birthDate));\n\n const current: Date = currentDate instanceof Date ? currentDate : new Date(Number(currentDate));\n // Validate input dates\n if (isNaN(birth.getTime()) || isNaN(current.getTime())) {\n // throw new Error(\"Invalid date input\");\n return zeroAge;\n }\n\n // Ensure current date is not before birth date\n if (current < birth) {\n // throw new Error(\"Current date cannot be before birth date\");\n return zeroAge;\n }\n\n // Calculate years, months, and days\n let years = current.getFullYear() - birth.getFullYear();\n let months = current.getMonth() - birth.getMonth();\n let days = current.getDate() - birth.getDate();\n\n // Adjust calculations if needed\n if (days < 0) {\n // Borrow days from previous month\n const lastMonth = new Date(current.getFullYear(), current.getMonth(), 0);\n days += lastMonth.getDate();\n months--;\n }\n\n if (months < 0) {\n years--;\n months += 12;\n }\n\n return {\n age: {\n years,\n months,\n days,\n },\n message: `${years} ${t(\"years\")} - ${months} ${t(\"months\")} - ${days} ${t(\"days\")} / ${t(gender ?? \"\")}`,\n };\n};\n\nexport const birthDateToAge = (birthDate?: Date | string | null) => {\n if (!birthDate) return null;\n const birth = new Date(birthDate);\n const today = new Date();\n\n let years = today.getFullYear() - birth.getFullYear();\n let months = today.getMonth() - birth.getMonth();\n let days = today.getDate() - birth.getDate();\n\n if (days < 0) {\n months--;\n days += new Date(today.getFullYear(), today.getMonth(), 0).getDate();\n }\n if (months < 0) {\n years--;\n months += 12;\n }\n\n return { years, months, days };\n};\n\nexport const ageToBirthDate = (age: { years: number; months: number; days: number }) => {\n const today = new Date();\n const birthYear = today.getFullYear() - age.years;\n const birthMonth = today.getMonth() - age.months;\n const birthDay = today.getDate() - age.days;\n\n let birthDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());\n birthDate.setFullYear(birthYear);\n birthDate.setMonth(birthMonth);\n birthDate.setDate(birthDay);\n\n return birthDate;\n};\n\nexport const ageToBirthDateChangeSegment = (oldAge: { years: number; months: number; days: number } | null, age: { years: number; months: number; days: number }) => {\n const today = new Date();\n const birthYear = oldAge && oldAge.years ? oldAge.years - age.years : today.getFullYear() - age.years;\n const birthMonth = oldAge && oldAge.months ? oldAge.months - age.months : today.getMonth() - age.months;\n const birthDay = oldAge && oldAge.days ? oldAge.days - age.days : today.getDate() - age.days;\n\n let birthDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());\n birthDate.setFullYear(birthYear);\n birthDate.setMonth(birthMonth);\n birthDate.setDate(birthDay);\n\n return birthDate;\n};\n\nexport function convertTimeToTimestamp(timeString: string): number {\n // Split the input string into days and time components\n const [daysPart, timePart] = timeString.split(\" \");\n\n // Extract days (remove leading zeros)\n const days = parseInt(daysPart.replace(/^0+/, \"\"), 10);\n\n // Split time into hours, minutes, seconds\n const [hours, minutes, seconds] = timePart?.split(\":\").map((part) => parseInt(part, 10));\n\n // Calculate total milliseconds\n // 1 day = 24 * 60 * 60 * 1000 milliseconds\n const totalMilliseconds =\n days * 24 * 60 * 60 * 1000 + // days to milliseconds\n hours * 60 * 60 * 1000 + // hours to milliseconds\n minutes * 60 * 1000 + // minutes to milliseconds\n seconds * 1000; // seconds to milliseconds\n\n return totalMilliseconds;\n}\n\n// Calculate age function (accept iso format)\nexport const calculateAge = (birthDate: string): number => {\n const today = new Date();\n let birth: Date;\n\n if (birthDate.includes(\"/\")) {\n // DD/MM/YYYY\n const [day, month, year] = birthDate.split(\"/\").map(Number);\n birth = new Date(year, month - 1, day);\n } else if (!isNaN(Date.parse(birthDate))) {\n // ISO or any valid date string\n birth = new Date(birthDate);\n } else {\n throw new Error(\"Unsupported date format\");\n }\n\n let age = today.getFullYear() - birth.getFullYear();\n const m = today.getMonth() - birth.getMonth();\n\n if (m < 0 || (m === 0 && today.getDate() < birth.getDate())) {\n age--;\n }\n\n return age;\n};\n\nfunction isValidISODate(dateString: string): boolean {\n const date = new Date(dateString);\n // Check if the date is valid (not \"Invalid Date\") and if its ISO string representation matches the original.\n // The second check helps to ensure the string was correctly parsed as an ISO date and not some other format.\n return !isNaN(date.getTime()) && date.toISOString() === dateString;\n}\n","export const getTextOnlyFromHtml = (html?: string): string => {\n const parser = new DOMParser();\n const doc = html && parser.parseFromString(html, \"text/html\");\n return (doc && doc.body.textContent) ?? \"\";\n};\n","export const handleKeyDownArabic = (event: any) => {\n const { key, ctrlKey, metaKey } = event;\n // Allow control keys like backspace, delete, arrow keys, etc.\n if (\n key === \"Backspace\" ||\n key === \"Delete\" ||\n key === \"ArrowLeft\" ||\n key === \"ArrowRight\" ||\n key === \"ArrowUp\" ||\n key === \"ArrowDown\" ||\n key === \"Tab\" ||\n key === \"Enter\"\n ) {\n return; // Allow these keys without further checking\n }\n // Allow copy, paste, cut, select all (Ctrl/Command + C, V, X, A)\n if (\n (ctrlKey || metaKey) &&\n (key === \"c\" || key === \"v\" || key === \"x\" || key === \"a\")\n ) {\n return;\n }\n // Check if the key matches Arabic characters, numbers, symbols, or whitespace\n if (!/[\\u0600-\\u06FF0-9\\s!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~]/.test(key)) {\n event.preventDefault();\n }\n};\n\nexport const handleKeyDownEnglish = (event: any) => {\n const { key, ctrlKey, metaKey } = event;\n // Allow control keys like backspace, delete, arrow keys, etc.\n if (\n key === \"Backspace\" ||\n key === \"Delete\" ||\n key === \"ArrowLeft\" ||\n key === \"ArrowRight\" ||\n key === \"ArrowUp\" ||\n key === \"ArrowDown\" ||\n key === \"Tab\" ||\n key === \"Enter\"\n ) {\n return; // Allow these keys without further checking\n }\n // Allow copy, paste, cut, select all (Ctrl/Command + C, V, X, A)\n if (\n (ctrlKey || metaKey) &&\n (key === \"c\" || key === \"v\" || key === \"x\" || key === \"a\")\n ) {\n return;\n }\n\n // Check if the key matches English letters, numbers, or symbols\n if (!/[A-Za-z0-9\\s!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~]/.test(key)) {\n event.preventDefault();\n }\n};\n\nexport const handleKeyDownNumber = (event: any) => {\n const { key, ctrlKey, metaKey } = event;\n\n // Allow keys for navigation, deletion, tab, and enter\n if (\n key === \"Backspace\" ||\n key === \"Delete\" ||\n key === \"ArrowLeft\" ||\n key === \"ArrowRight\" ||\n key === \"ArrowUp\" ||\n key === \"ArrowDown\" ||\n key === \"Tab\" ||\n key === \"Enter\"\n ) {\n return;\n }\n\n // Allow copy, paste, cut, select all (Ctrl/Command + C, V, X, A)\n if (\n (ctrlKey || metaKey) &&\n (key === \"c\" || key === \"v\" || key === \"x\" || key === \"a\")\n ) {\n return;\n }\n\n // Prevent non-numeric input\n if (!/[0-9]/.test(key)) {\n event.preventDefault();\n }\n};\n\nexport const handleKeyDownNumberNoCopy = (event: any) => {\n const { key } = event;\n\n // Allow keys for navigation, deletion, tab, and enter\n if (\n key === \"Backspace\" ||\n key === \"Delete\" ||\n key === \"ArrowLeft\" ||\n key === \"ArrowRight\" ||\n key === \"ArrowUp\" ||\n key === \"ArrowDown\" ||\n key === \"Tab\" ||\n key === \"Enter\"\n ) {\n return;\n }\n // Prevent non-numeric input\n if (!/[0-9]/.test(key)) {\n event.preventDefault();\n }\n};\n\nexport const handleKeyDownFloatNumber = (event: any) => {\n const { key, ctrlKey, metaKey } = event;\n const input = event.currentTarget;\n\n // Allow keys for navigation, deletion, tab, and enter\n if (\n key === \"Backspace\" ||\n key === \"Delete\" ||\n key === \"ArrowLeft\" ||\n key === \"ArrowRight\" ||\n key === \"ArrowUp\" ||\n key === \"ArrowDown\" ||\n key === \"Tab\" ||\n key === \"Enter\"\n ) {\n return;\n }\n\n // Allow copy, paste, cut, select all (Ctrl/Command + C, V, X, A)\n if (\n (ctrlKey || metaKey) &&\n (key === \"c\" || key === \"v\" || key === \"x\" || key === \"a\")\n ) {\n return;\n }\n\n // Allow one decimal point if it doesn't already exist\n if (key === \".\" && !input.value.includes(\".\")) {\n return;\n }\n\n // Prevent non-numeric input (allow numbers and one decimal point)\n if (!/[0-9]/.test(key) && key !== \".\") {\n event.preventDefault();\n }\n};\n","export function filterInArray<T>(field: keyof T, values: T[keyof T][], data: T[]): T[] {\n if (values.length === 0) return data;\n return data.filter((item) => values.includes(item[field]));\n}\n\nexport function filterInObjects(\n data: any[] = [],\n query: string[],\n childrenField: string = \"children\",\n fieldsToFilter?: string[], // Optional array of fields to filter on\n): any[] {\n if (!data) return [];\n if (!query || query?.length === 0) return data;\n\n // Helper function to check if the specified field or all fields match the query.\n const matchesQuery = (obj: any): boolean => {\n const valuesToFilter = fieldsToFilter\n ? fieldsToFilter.map((field) => obj[field]).filter(Boolean) // Only valid fields\n : Object.values(obj); // Default to all fields\n\n return valuesToFilter.some((value) => typeof value === \"string\" && query.some((q) => value.includes(q)));\n };\n\n // Recursive function to filter objects and extract matching ones.\n const filter = (data: any[]): any[] => {\n let results: any[] = [];\n\n data.forEach((item) => {\n // If the current item matches, add it to the results.\n if (matchesQuery(item)) {\n results.push(item);\n }\n\n // Recursively filter the children and add their matches.\n if (item[childrenField]) {\n results = results.concat(filter(item[childrenField]));\n }\n });\n\n return results;\n };\n\n return filter(data);\n}\n","import { isArray, isDate, isEqual, isObject, omit } from \"lodash\";\n\nexport const capitalizeString = (str: string) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\nexport function removeEmptyFields<T extends Record<string, any>>(obj: T): Partial<T> {\n return Object.fromEntries(Object.entries(obj).filter(([, value]) => value?.length !== 0 && value !== null && value !== undefined)) as Partial<T>;\n}\n\ntype WithId = {\n _id?: string;\n\n [key: string]: any;\n};\n\nexport function removeIdFromObjects<T extends WithId>(objects: T[]): Omit<T, \"_id\">[] {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n return objects.map(({ _id, ...rest }) => rest);\n}\n\nexport function removeItemsWithIds(array: any[], idsToRemove: string[]): any[] {\n return array.filter((item) => !item?._id || !idsToRemove.includes(item?._id));\n}\n\nexport function createOptionsArray<T>(data: T[], valueField: keyof T, ...labelFields: (keyof T)[]) {\n return data.map((item) => ({\n value: item[valueField] as string | number,\n label: labelFields.map((field) => item[field]).join(\" \"),\n }));\n}\n\nexport function filterUsersOption(option: any, inputValue: string) {\n const fullNameLabel = `${option?.label?.props?.children?.[0]?.props?.children}`;\n const emailLabel = option?.label?.props?.children?.[1]?.props?.children;\n\n return fullNameLabel?.toLowerCase()?.includes(inputValue?.toLowerCase()) || emailLabel?.toLowerCase()?.includes(inputValue?.toLowerCase());\n}\n\nexport function removeKeys(obj: any, keys: string[]): any {\n const clonedObj = { ...obj };\n\n for (const key of keys) {\n delete clonedObj[key];\n }\n\n return clonedObj;\n}\n\nexport function getArrayKeys(obj: any) {\n const result = [];\n for (const key in obj) {\n if (Array.isArray(obj[key])) {\n result.push({ [key]: obj[key] });\n }\n }\n return result;\n}\n\nexport function convertObjectToArray(obj: any): any[] {\n if (!obj) return [];\n return Object.entries(obj).map(([key, value]) => ({\n [key]: value,\n }));\n}\n\ntype Permission = {\n [key: string]: string[];\n};\n\nexport function comparePermissionLists(list1: Permission[], list2: Permission[]): boolean {\n if (list1.length !== list2.length) {\n return false;\n }\n\n for (let i = 0; i < list1.length; i++) {\n const keys1 = Object.keys(list1[i]);\n const keys2 = Object.keys(list2[i]);\n\n if (keys1.length !== keys2.length) {\n return false;\n }\n\n for (const key of keys1) {\n if (!keys2.includes(key)) {\n return false;\n }\n\n const values1 = list1[i][key];\n const values2 = list2[i][key];\n\n if (values1.length !== values2.length) {\n return false;\n }\n\n for (const value of values1) {\n if (!values2.includes(value)) {\n return false;\n }\n }\n }\n }\n\n return true;\n}\n\nexport function objectToFormData(obj: Record<string, any>, formData: FormData = new FormData(), namespace: string = \"\"): FormData {\n for (let key in obj) {\n if (!obj.hasOwnProperty(key)) continue;\n\n const formKey = namespace ? `${namespace}[${key}]` : key;\n\n if (typeof obj[key] === \"object\" && !(obj[key] instanceof File)) {\n // If it's an array or object, call the function recursively\n objectToFormData(obj[key], formData, formKey);\n } else {\n // Otherwise append the value\n formData.append(formKey, obj[key]);\n }\n }\n\n return formData;\n}\n\n/**\n * Compares two objects and returns true if they are equivalent.\n * Ignores specified keys if provided.\n *\n * @param {any} original - The original object.\n * @param {any} updated - The updated object to compare with.\n * @param {string[]} [keysToIgnore=[]] - Optional keys to ignore during comparison.\n * @returns {boolean} - True if objects are equivalent, otherwise false.\n */\nexport function compareObjects(original: any, updated: any, keysToIgnore: string[] = []): boolean {\n const normalizedOriginal = omit(original, keysToIgnore);\n const normalizedUpdated = omit(updated, keysToIgnore);\n\n return isEqual(normalizedOriginal, normalizedUpdated);\n}\n\nexport function getChangedFields(original: any, updated: any): any {\n // Safety net\n if (original == null && updated == null) return {};\n if (original == null) return updated ?? {};\n if (updated == null) return {};\n\n const changedFields: any = {};\n\n Object.keys(updated).forEach((key) => {\n const originalValue = original?.[key];\n const updatedValue = updated?.[key];\n\n // Case 1: Dates\n if (isDate(updatedValue) && isDate(originalValue)) {\n if (originalValue.getTime() !== updatedValue.getTime()) {\n changedFields[key] = updatedValue;\n }\n return;\n }\n\n // Case 2: One is object, the other is not\n if (isObject(updatedValue) && !isObject(originalValue)) {\n changedFields[key] = updatedValue;\n return;\n }\n\n // Case 3: Nested objects (non-array)\n if (\n isObject(updatedValue) &&\n !isArray(updatedValue) &&\n isObject(originalValue) &&\n !isArray(originalValue)\n ) {\n const nestedChanges = getChangedFields(originalValue, updatedValue);\n if (Object.keys(nestedChanges).length > 0) {\n changedFields[key] = nestedChanges;\n }\n return;\n }\n\n // Case 4: Arrays\n if (isArray(updatedValue) || isArray(originalValue)) {\n if (!isEqual(originalValue, updatedValue)) {\n changedFields[key] = updatedValue;\n }\n return;\n }\n\n // Case 5: Primitive values\n if (!isEqual(originalValue, updatedValue)) {\n changedFields[key] = updatedValue;\n }\n });\n\n return changedFields;\n}\n\nexport function sortObjectByKeys<T extends Record<string, any>>(obj: T): T {\n const sortedEntries = Object.entries(obj).sort((a, b) => {\n return a[0].localeCompare(b[0]);\n });\n\n return Object.fromEntries(sortedEntries) as T;\n}\n\nexport function sortObjectByValues<T extends Record<string, any>>(obj: T): T {\n const sortedEntries = Object.entries(obj).sort((a, b) => {\n if (typeof a[1] === \"number\" && typeof b[1] === \"number\") {\n return a[1] - b[1];\n }\n return 0;\n });\n\n return Object.fromEntries(sortedEntries) as T;\n}\n\n// Example usage\n// const data = {\n// name: { ar: \"اختبار333333333\", \"en-US\": \"test333333333\" },\n// description: { ar: \"اختبار33333\", \"en-US\": \"test33333\" },\n// location: { lat: 12345, lng: 12345 },\n// status: { ar: \"test\", \"en-US\": \"test\" },\n// features: [\"66a92a500075488d302b2184\", \"66a92aab0075488d302b2190\"],\n// price: 5000,\n// // attachments: [ videoFile, pictureFile]\n// };\n\n// const formData = objectToFormData(data);\n\n// // Log the FormData keys and values for verification\n// for (let pair of formData.entries()) {\n//\n// }\n\n// const methodsOrder = [\"POST\", \"GET\", \"PATCH\", \"DELETE\", \"DATA\"];\n\n// export const toggleAndSortMethod = (method: string, methodArray: string[]) => {\n// const index = methodArray.indexOf(method);\n// if (index === -1) {\n// // Method not found, add it\n// methodArray.push(method);\n// } else {\n// // Method found, remove it\n// methodArray.splice(index, 1);\n// }\n// // Sort the array based on the defined order\n// methodArray.sort((a, b) => methodsOrder.indexOf(a) - methodsOrder.indexOf(b));\n// return methodArray;\n// };\n\ntype AnyObject = { [key: string]: any };\n\nexport function removeFields(obj: AnyObject, fieldsToRemove: string[]): AnyObject {\n if (Array.isArray(obj)) {\n // Recursively process each item in the array\n return obj.map((item) => removeFields(item, fieldsToRemove));\n } else if (typeof obj === \"object\" && obj !== null) {\n const newObj: AnyObject = {};\n\n // Iterate over each key-value pair in the object\n for (const key in obj) {\n if (!fieldsToRemove.includes(key)) {\n // Only add the key if it's not in fieldsToRemove, and process its value recursively\n newObj[key] = removeFields(obj[key], fieldsToRemove);\n }\n }\n\n return newObj;\n }\n\n // Return primitive types (strings, numbers, etc.) as is\n return obj;\n}\n\nexport function removeFieldsTopLevel(obj: AnyObject | AnyObject[] | null | undefined, fieldsToRemove?: string[]): any {\n if (obj === null || obj === undefined) {\n return obj;\n }\n if (Array.isArray(obj)) {\n // If it's an array, process each item in the array\n return obj.map((item) => {\n if (typeof item === \"object\" && item !== null) {\n return removeFieldsFromObject(item, fieldsToRemove);\n }\n return item; // Return non-object items as is\n });\n } else if (typeof obj === \"object\" && obj !== null) {\n // If it's a single object, remove fields at the top level\n return removeFieldsFromObject(obj, fieldsToRemove);\n }\n\n // If it's neither an object nor an array, return it as is\n return obj;\n}\n\n// Helper function to remove fields from a single object at the top level\nexport function removeFieldsFromObject(obj: AnyObject, fieldsToRemove?: string[]): AnyObject {\n const newObj: AnyObject = { ...obj };\n\n // Remove specified fields from the object\n for (const field of fieldsToRemove || []) {\n delete newObj[field];\n }\n\n return newObj;\n}\n\nexport const getLabelByItemsAndId = (id?: string | number, items?: any[], fields: string[] | string = \"name\") => {\n if (!items || !id) return undefined;\n const item = items?.find((item) => item.id === id);\n if (item) {\n if (Array.isArray(fields)) {\n return fields.map((field) => item[field]).join(\" \");\n }\n return item[fields];\n }\n return \"\";\n};\n// ex\n// {getLabelByItemsAndId(row.getValue(\"name\"), items, [\n// \"firstName\",\n// \"lastName\",\n// ])}\n\nexport const getLabelByItemsAndOptions = (id?: string | number | null, items?: any[]) => {\n if (!items || !id) return undefined;\n const item = items?.find((item) => item.value === id || item?.id === id || item?._id === id);\n if (item) {\n return item.label;\n }\n return \"\";\n};\n// ex {getLabelByItemsAndOptions(row.getValue(\"name\"), usersOptions)}\n","import { removeEmptyFields } from \"./objectUtils\";\n\nexport function toQueryString(params?: any): string {\n if (params)\n return Object.entries(removeEmptyFields(params))\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)\n .join(\"&\");\n return \"\";\n}\n\nexport function pureURLS3(url: string | undefined): string | undefined {\n if (url?.startsWith(\"http\")) {\n return url.split(\".com/\")[1].split(\"?\")[0];\n }\n return url;\n}\n\nexport const createSearchQuery = (params: Record<string, string | number | boolean | undefined | string[] | number[]>) => {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (Array.isArray(value)) {\n for (const v of value) {\n query.append(key, v.toString());\n }\n } else if (value !== undefined) {\n query.append(key, value.toString());\n }\n }\n\n return query.toString();\n};\n\nexport const serializeFormQuery = (params: Record<string, string | number | boolean | undefined | string[] | number[]>) => {\n return Object.entries(params)\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n if (value.length === 0) return \"\";\n return `${key}=${value.join(\",\")}`;\n }\n if (value === undefined || value === \"\") return \"\";\n return `${key}=${value}`;\n })\n .filter((val) => val !== \"\")\n .join(\"&\");\n};\n\nexport const arrFromQuery = (query: string | null) => (!query || query === null || query === \"\" ? [] : query.split(\",\").map((val) => parseInt(val)));\n\nexport const uniqueId = (): number => {\n return Date.now() + Math.floor(Math.random() * 10000);\n};\n\nexport const prePareFilters = (searchParams: URLSearchParams) => {\n const filtersParam = searchParams.get(\"filters\");\n if (!filtersParam) return null;\n\n try {\n const decoded = decodeURIComponent(filtersParam);\n const filtersArray = JSON.parse(decoded);\n\n // Convert filter format to backend format if needed\n // The filters come in format: { column, logic, value, fields, operatorGroup }\n // We need to send them as-is to trigger refetch\n return filtersArray;\n } catch (error) {\n console.error(\"Error parsing filters from URL:\", error);\n return null;\n }\n};\n","\nexport const addSearchParam = (searchParams: URLSearchParams, setSearchParams: any, key: string, value: string) => {\n const newSearchParams = new URLSearchParams(searchParams);\n newSearchParams.set(key, value);\n setSearchParams(newSearchParams);\n};\n\n/**\n * Recursively searches across all fields of objects and their [`${childrenField}`].\n * @param data - The array of objects to search.\n * @param query - The search query string.\n * @returns An array of objects that match the search query.\n */\nexport function searchInObjectsWithParents(\n data: any[] = [],\n query: string = \"\",\n childrenField: string = \"children\",\n fieldsToSearch?: string[], // Optional: Array of specific fields to search\n): any[] {\n if (!data) return [];\n if (!query) return data;\n\n const lowerQuery = query.trim()?.toLowerCase();\n\n // Helper function to check if the object matches the query within the specified fields.\n const matchesQuery = (obj: any): boolean => {\n const valuesToSearch = fieldsToSearch\n ? fieldsToSearch.map((field) => obj[field]).filter(Boolean) // Filter out invalid fields\n : Object.values(obj); // Default to all values\n\n return valuesToSearch.some((value) => typeof value === \"string\" && value?.toLowerCase().includes(lowerQuery));\n };\n\n // Recursive function to search objects and retain matching parents and children.\n const search = (data: any[]): any[] => {\n return data\n .map((item) => {\n const childResults = item[childrenField] ? search(item[childrenField]) : [];\n\n // If the item matches the query or any child matches, include it in the results.\n if (matchesQuery(item) || childResults.length > 0) {\n return {\n ...item,\n [childrenField]: childResults.length > 0 ? childResults : undefined, // Keep only matching children.\n };\n }\n return null; // Exclude non-matching items.\n })\n .filter((item) => item !== null); // Remove null values from the result.\n };\n\n return search(data);\n}\n\nexport function searchInObjects(\n data: any[] = [],\n query: string = \"\",\n childrenField: string = \"children\",\n fieldsToSearch?: string[], // Optional array of fields to search on\n): any[] {\n if (!data) return [];\n if (!query) return data;\n const lowerQuery = query?.trim()?.toLowerCase();\n\n // Helper function to check if the specified field or all fields match the query.\n const matchesQuery = (obj: any): boolean => {\n const valuesToSearch = fieldsToSearch\n ? fieldsToSearch.map((field) => obj[field]).filter(Boolean) // Only valid fields\n : Object.values(obj); // Default to all fields\n\n return valuesToSearch.some((value) => typeof value === \"string\" && value?.toLowerCase().includes(lowerQuery));\n };\n\n // Recursive function to search objects and extract matching ones.\n const search = (data: any[]): any[] => {\n let results: any[] = [];\n\n data.forEach((item) => {\n // If the current item matches, add it to the results.\n if (matchesQuery(item)) {\n results.push(item);\n }\n\n // Recursively search the children and add their matches.\n if (item[childrenField]) {\n results = results.concat(search(item[childrenField]));\n }\n });\n\n return results;\n };\n\n return search(data);\n}\n","export const validateDay = (value: string): string => {\n let sanitizedValue = value.replace(/\\D/g, \"\"); // Remove non-numeric characters\n if (!sanitizedValue) return \"\"; // Allow empty input\n return Math.min(Math.max(parseInt(sanitizedValue, 10), 1), 31).toString(); // Ensure between 1-31\n};\n\nexport const validateMonth = (value: string): string => {\n let sanitizedValue = value.replace(/\\D/g, \"\");\n if (!sanitizedValue) return \"\";\n return Math.min(Math.max(parseInt(sanitizedValue, 10), 1), 12).toString(); // Ensure between 1-12\n};\n\nexport const validateYear = (value: string): string => {\n let sanitizedValue = value.replace(/\\D/g, \"\"); // Remove non-numeric characters\n if (!sanitizedValue) return \"\";\n\n // Allow typing until 4 digits are reached\n if (sanitizedValue.length < 4) return sanitizedValue;\n\n // Ensure the year is at least 1900 when it reaches 4 digits\n const year = parseInt(sanitizedValue, 10);\n return year < 1900 ? \"1900\" : sanitizedValue;\n};\n"],"mappings":"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","names":["literalOrdinals","num","lang","ones","teens","tens","hundreds","remainder","base","result","hundredPart","remainderPart","suffixes","v","handleCreateFront","items","setItems","itemData","newItem","__spreadValues","handleCreateFrontUnique","uniqueField","item","handleUpdateFront","id","handleDeleteFront","_a","dayjs","formatDateTime","date","newDate","formatDate","isNotFutureDate","val","now","getTime","inputDate","pad","num","formattedHours","formattedMinutes","calculateDetailedAge","birthDate","t","key","currentDate","gender","zeroAge","birth","isValidISODate","current","years","months","days","lastMonth","birthDateToAge","today","ageToBirthDate","age","birthYear","birthMonth","birthDay","ageToBirthDateChangeSegment","oldAge","convertTimeToTimestamp","timeString","daysPart","timePart","hours","minutes","seconds","part","calculateAge","day","month","year","m","dateString","getTextOnlyFromHtml","html","_a","parser","doc","handleKeyDownArabic","event","key","ctrlKey","metaKey","handleKeyDownEnglish","handleKeyDownNumber","handleKeyDownNumberNoCopy","handleKeyDownFloatNumber","input","filterInArray","field","values","data","item","filterInObjects","query","childrenField","fieldsToFilter","matchesQuery","obj","value","q","filter","results","isArray","isDate","isEqual","isObject","omit","capitalizeString","str","removeEmptyFields","obj","value","removeIdFromObjects","objects","_a","_b","_id","rest","__objRest","removeItemsWithIds","array","idsToRemove","item","createOptionsArray","data","valueField","labelFields","field","filterUsersOption","option","inputValue","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","fullNameLabel","emailLabel","removeKeys","keys","clonedObj","__spreadValues","key","getArrayKeys","result","convertObjectToArray","comparePermissionLists","list1","list2","i","keys1","keys2","values1","values2","objectToFormData","formData","namespace","formKey","compareObjects","original","updated","keysToIgnore","normalizedOriginal","omit","normalizedUpdated","isEqual","getChangedFields","changedFields","originalValue","updatedValue","isDate","isObject","isArray","nestedChanges","sortObjectByKeys","sortedEntries","a","b","sortObjectByValues","removeFields","fieldsToRemove","newObj","removeFieldsTopLevel","removeFieldsFromObject","getLabelByItemsAndId","id","items","fields","getLabelByItemsAndOptions","toQueryString","params","removeEmptyFields","value","key","pureURLS3","url","createSearchQuery","query","v","serializeFormQuery","val","arrFromQuery","uniqueId","prePareFilters","searchParams","filtersParam","decoded","error","addSearchParam","searchParams","setSearchParams","key","value","newSearchParams","searchInObjectsWithParents","data","query","childrenField","fieldsToSearch","_a","lowerQuery","matchesQuery","obj","field","search","item","childResults","__spreadProps","__spreadValues","searchInObjects","results","validateDay","value","sanitizedValue","validateMonth","validateYear"]}
|