intelicoreact 2.0.16 → 2.0.17

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.
Files changed (99) hide show
  1. package/dist/css/accordion.css +1 -1
  2. package/dist/css/advanced-status.css +1 -1
  3. package/dist/css/datepicker.css +1 -1
  4. package/dist/css/dropdown-live-search.css +1 -1
  5. package/dist/css/dropdown.css +1 -1
  6. package/dist/css/input-date-range.css +1 -1
  7. package/dist/css/main-menu.css +1 -1
  8. package/dist/css/switcher-radio.css +1 -1
  9. package/dist/css/switcher-range-list.css +1 -1
  10. package/dist/css/switcher-tags-dropdown.css +1 -1
  11. package/dist/css/switcher-textarea.css +1 -1
  12. package/dist/css/table.css +1 -1
  13. package/dist/css/tags-dropdown.css +1 -1
  14. package/dist/css/wizard-stepper.css +1 -1
  15. package/dist/es/_virtual/_rolldown/runtime.js +27 -0
  16. package/dist/es/charts.js +4 -0
  17. package/dist/es/classes.js +4 -0
  18. package/dist/es/form.js +99 -0
  19. package/dist/es/hooks.js +32 -0
  20. package/dist/es/icons.js +10 -0
  21. package/dist/es/icons.js.map +1 -0
  22. package/dist/es/index.js +71 -0
  23. package/dist/es/layout.js +3 -0
  24. package/dist/es/presets.js +6 -0
  25. package/dist/es/router-ui.js +8 -0
  26. package/dist/es/sdk.js +1 -0
  27. package/dist/es/styles/base.css +1 -0
  28. package/dist/es/types/index.js +2 -0
  29. package/dist/es/ui.js +42 -0
  30. package/dist/es/utils.js +6 -0
  31. package/dist/intelicoreact.css +1 -1
  32. package/dist/scss/_mixins.scss +2 -2
  33. package/dist/scss/_vars.scss +1 -1
  34. package/dist/scss/main.scss +4 -1
  35. package/package.json +46 -64
  36. package/charts/package.json +0 -5
  37. package/classes/package.json +0 -5
  38. package/dist/charts.cjs +0 -927
  39. package/dist/charts.cjs.map +0 -7
  40. package/dist/charts.js +0 -911
  41. package/dist/charts.js.map +0 -7
  42. package/dist/classes.cjs +0 -1858
  43. package/dist/classes.cjs.map +0 -7
  44. package/dist/classes.js +0 -1836
  45. package/dist/classes.js.map +0 -7
  46. package/dist/form.cjs +0 -15167
  47. package/dist/form.cjs.map +0 -7
  48. package/dist/form.js +0 -15182
  49. package/dist/form.js.map +0 -7
  50. package/dist/hooks.cjs +0 -2330
  51. package/dist/hooks.cjs.map +0 -7
  52. package/dist/hooks.js +0 -2298
  53. package/dist/hooks.js.map +0 -7
  54. package/dist/icons.cjs +0 -1807
  55. package/dist/icons.cjs.map +0 -7
  56. package/dist/icons.js +0 -1785
  57. package/dist/icons.js.map +0 -7
  58. package/dist/index.cjs +0 -22917
  59. package/dist/index.cjs.map +0 -7
  60. package/dist/index.js +0 -22938
  61. package/dist/index.js.map +0 -7
  62. package/dist/layout.cjs +0 -458
  63. package/dist/layout.cjs.map +0 -7
  64. package/dist/layout.js +0 -426
  65. package/dist/layout.js.map +0 -7
  66. package/dist/presets.cjs +0 -262
  67. package/dist/presets.cjs.map +0 -7
  68. package/dist/presets.js +0 -240
  69. package/dist/presets.js.map +0 -7
  70. package/dist/router-ui.cjs +0 -989
  71. package/dist/router-ui.cjs.map +0 -7
  72. package/dist/router-ui.js +0 -957
  73. package/dist/router-ui.js.map +0 -7
  74. package/dist/sdk.cjs +0 -451
  75. package/dist/sdk.cjs.map +0 -7
  76. package/dist/sdk.js +0 -429
  77. package/dist/sdk.js.map +0 -7
  78. package/dist/types/index.cjs +0 -18
  79. package/dist/types/index.cjs.map +0 -7
  80. package/dist/types/index.js +0 -1
  81. package/dist/types/index.js.map +0 -7
  82. package/dist/ui.cjs +0 -4090
  83. package/dist/ui.cjs.map +0 -7
  84. package/dist/ui.js +0 -4064
  85. package/dist/ui.js.map +0 -7
  86. package/dist/utils.cjs +0 -653
  87. package/dist/utils.cjs.map +0 -7
  88. package/dist/utils.js +0 -621
  89. package/dist/utils.js.map +0 -7
  90. package/form/package.json +0 -5
  91. package/hooks/package.json +0 -5
  92. package/icons/package.json +0 -5
  93. package/layout/package.json +0 -5
  94. package/presets/package.json +0 -5
  95. package/router-ui/package.json +0 -5
  96. package/sdk/package.json +0 -5
  97. package/types/package.json +0 -5
  98. package/ui/package.json +0 -5
  99. package/utils/package.json +0 -5
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/Atomic/UI/Accordion/Accordion.tsx", "../src/Functions/utils.js", "../src/Constants/index.constants.js", "../src/Atomic/UI/Accordion/AccordionItem.tsx", "../src/Atomic/UI/Status/Status.tsx", "../src/Atomic/UI/Status/index.ts", "../src/Atomic/UI/Accordion/index.ts", "../src/Atomic/UI/ButtonsBar/ButtonsBar.tsx", "../src/Atomic/UI/Button/Button.tsx", "../src/Atomic/UI/ButtonsBar/index.ts", "../src/Atomic/Layout/MainMenu/MainMenu.tsx", "../src/Langs.js", "../src/Atomic/UI/NavLine/NavLine.tsx", "../src/Atomic/UI/NavLine/index.ts"],
4
- "sourcesContent": ["import type { IAccordionProps } from './Accordion.interface';\nimport cn from 'classnames';\nimport React, { useState } from 'react';\nimport * as Icons from 'react-feather';\n\nimport { NavLink } from 'react-router-dom';\n\nimport { handleObjectChange } from '../../../Functions/utils';\nimport AccordionItem from './AccordionItem';\n\nimport './Accordion.scss';\n\nconst CN = 'accordion';\n\nconst Accordion: React.FC<IAccordionProps> = ({\n items,\n className,\n itemClassName,\n isMenuHovered,\n isOpen,\n testId = CN,\n}) => {\n const [data, setData] = useState(items);\n\n const onChange = handleObjectChange(setData, () => setData([...data]));\n\n const handleArrayChange = (e: boolean, index: number, prop: keyof (typeof data)[0]): void => {\n // @ts-ignore\n data[index][prop] = e;\n onChange(data);\n };\n\n return (\n <div className={cn(CN, className)} data-testid={testId} role=\"list\" aria-label=\"Accordion list\">\n {items?.map((item, index) => {\n const Icon = Icons[item.icon as keyof typeof Icons];\n return item.link\n ? (\n <NavLink\n data-testid={`${testId}-link-${index}`}\n key={index}\n to={item.link}\n className={cn('main-menu--item main-menu--items-box-title')}\n >\n {item?.icon && <Icon className={cn('mr5', item?.className)} />}\n <span className={cn({ hidden: !isOpen && !isMenuHovered })}>{item?.title || 'Link'}</span>\n </NavLink>\n )\n : (\n <AccordionItem\n testId={`${testId}-item-${index}`}\n key={index}\n className={itemClassName}\n item={item}\n isOpen={!!item.isOpen}\n onClick={value => handleArrayChange(value, index, 'isOpen')}\n // router-aware \u0432\u0430\u0440\u0438\u0430\u043D\u0442: menu-\u0441\u0441\u044B\u043B\u043A\u0438 (item.children) \u0438\u0434\u0443\u0442 \u0447\u0435\u0440\u0435\u0437 NavLink,\n // \u0430 \u043D\u0435 \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u0444\u043E\u043B\u0442\u043D\u044B\u0439 <a> router-free AccordionItem'\u0430.\n linkComponent={NavLink}\n />\n );\n })}\n </div>\n );\n};\n\nexport default Accordion;\n", "import { useEffect } from \"react\";\n\nimport moment from \"moment-timezone\";\n\nimport { DEFAULT_COLORS, OS } from \"../Constants/index.constants\";\n\nexport const uuid = () => Date.now().toString(36) + Math.random().toString(36).substring(2);\n\nexport const getIsOnlyAnObject = (input) => {\n return (\n typeof input === \"object\" && // \"\u043E\u0442\u0431\u0438\u0432\u0430\u0435\u0442\" \u043F\u0440\u0438\u043C\u0438\u0442\u0438\u0432\u044B \u0438 \u0444\u0443\u043D\u043A\u0446\u0438\u0438\n input instanceof Object && // \"\u043E\u0442\u0431\u0438\u0432\u0430\u0435\u0442\" null\n !Array.isArray(input) && // \"\u043E\u0442\u0431\u0438\u0432\u0430\u0435\u0442\" \u043C\u0430\u0441\u0441\u0438\u0432\u044B\n !(input instanceof Set) && // \"\u043E\u0442\u0431\u0438\u0432\u0430\u0435\u0442\" \u0441\u0435\u0442\u044B\n !(input instanceof Map) // \"\u043E\u0442\u0431\u0438\u0432\u0430\u0435\u0442\" \u043C\u0430\u043F\u044B\n );\n};\n\n/* eslint-disable guard-for-in, no-unused-vars */\nexport const handleObjectChange =\n (updateObject, updateFunction) =>\n (data, prop = \"\", isNumber) => {\n let value;\n if (data?.target) {\n value =\n data.target.type === \"checkbox\"\n ? data.target.checked\n : data.target.value;\n } else value = data;\n\n value = isNumber ? Number(value) : value;\n\n const props = prop.split(\".\");\n const currentObject = props.reduce((res, chapter, index) => {\n if (props.length !== index + 1) res = res[chapter];\n return res;\n }, updateObject);\n\n currentObject[props.pop()] = value;\n updateFunction();\n };\n\nexport const useOutsideToggle = (ref, setOut, open) => {\n function handleClickOutside(event) {\n if (ref.current && !ref.current.contains(event.target)) {\n setOut(open);\n }\n }\n useEffect(() => {\n document.addEventListener(\"mouseup\", handleClickOutside);\n return () => {\n // Unbind the event listener on clean up\n document.removeEventListener(\"mouseup\", handleClickOutside);\n };\n }, [ref]);\n};\n\n// export const clone = obj => {\n// const data = obj instanceof Array ? [] : {};\n// for (const i in obj) data[i] = typeof obj[i] === 'object' && obj[i] != null ? clone(obj[i]) : obj[i];\n// return data;\n// };\n// ! \u042D\u0442\u043E\u0442 \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0435\u0435\nexport const clone = (input) => {\n if (input === null || typeof input !== \"object\") return input;\n const data = input instanceof Array ? [] : {};\n for (const i in input) data[i] = clone(input[i]);\n return data;\n};\n\nexport const getResponseClone = async (res) =>\n await (typeof res?.clone === \"function\" ? res.clone() : clone(res));\n\n//TimeUtils\nexport function transformUTCTimeToLocal(date, format = \"YYYY-MM-DD HH:mm:ss\") {\n if (!date) return;\n const utcDate = moment.utc(date).toDate();\n return moment(utcDate, format).local().format(format);\n}\nexport function transformLocalTimeToUTC(date, format = \"YYYY-MM-DD HH:mm:ss\") {\n if (!date) return;\n return moment(date, format).utc().format(format);\n}\nexport function transformUTCHoursToLocal(time, format = \"HH:mm:ss\") {\n if (!time) return;\n const splitedTime = time.split(\":\");\n const offset = moment().utcOffset();\n let HH = Number(splitedTime[0]);\n let mm = Number(splitedTime[1]);\n const ss = splitedTime[2];\n mm = mm + offset;\n while (mm > 59) {\n mm -= 60;\n HH += 1;\n }\n if (HH > 23) HH -= 24;\n while (mm < 0) {\n mm += 60;\n HH -= 1;\n }\n if (HH < 0) HH += 24;\n return `${HH}:${mm}:${ss}`;\n}\n\n//? \u041D\u0430\u043C\u0435\u0440\u044F\u043D\u043D\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435\u043C \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u043D\u0430\u0437\u043D\u0430\u0447\u0430\u044E \u0441\u0430\u043C\u044B\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E-\u043C\u0430\u043B\u0435\u043D\u044C\u043A\u0438\u0439 \u043F\u0430\u0442\u0442\u0435\u0440\u043D\nexport function transformDateOrTimeOrTogetherToFormat(\n data,\n outputFormat = \"HH:mm\",\n additional,\n) {\n const ERROR_VALUE = \"Invalid date\";\n const ERROR_MESSGE = `Invalid input data for ${outputFormat} format`;\n const { parseFormat, isReturnAsMomentInstance } = getIsOnlyAnObject(\n additional,\n )\n ? additional\n : {};\n\n if (typeof data !== \"string\" && typeof data !== \"number\") {\n return isReturnAsMomentInstance ? moment(\"error\") : ERROR_MESSGE;\n }\n\n //? \u0418\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u0435\u043C parseFormat, \u0435\u0441\u043B\u0438 data \u043F\u0440\u0438\u0448\u043B\u0430 \u043A\u0430\u043A timestamp \u0438\u043B\u0438 \u0435\u0441\u043B\u0438 parseFormat \u043D\u0435 \u0441\u0442\u0440\u043E\u043A\u0430\n const momentArgs = [\n data,\n ...(!Number.isNaN(Number(data)) || typeof parseFormat === \"string\"\n ? []\n : [parseFormat]),\n ];\n\n //? \u0417\u0430\u0434\u0430\u0447\u0430 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C moment-\u044D\u043A\u0437\u0435\u043C\u043F\u043B\u044F\u0440, \u0432\u0430\u043B\u0438\u0434\u043D\u044B\u0439 \u043B\u0438\u0431\u043E \u043D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u044B\u0439\n const momentInstance = (() => {\n let instance = moment(...momentArgs);\n\n //? \u041F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u043C \u0432\u0430\u043B\u0438\u0434\u043D\u043E\u0441\u0442\u044C moment-\u044D\u043A\u0437\u0435\u043C\u043F\u043B\u044F\u0440-\u0430 \u043F\u0443\u0442\u0435\u043C \u043F\u043E\u043F\u044B\u0442\u043A\u0438 \u043F\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0435\u0433\u043E \u043A \u0432\u044B\u0445\u043E\u0434\u043D\u043E\u043C\u0443 \u0444\u043E\u0440\u043C\u0430\u0442\u0443\n //? \u041F\u043E\u043F\u0430\u0434\u0435\u043C \u0432 \u044D\u0442\u043E\u0442 \u043A\u0435\u0439\u0441 \u0435\u0441\u043B\u0438\n //? - data \u044D\u0442\u043E timestamp\n //? - data \u044D\u0442\u043E \u0441\u0442\u0440\u043E\u043A\u0430 \u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0435 date-time\n //? - data \u044D\u0442\u043E \u0441\u0442\u0440\u043E\u043A\u0430 \u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0435 date (\u0432 \u044D\u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435 \u0432\u0440\u0435\u043C\u044F \u0432\u044B\u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044F 00:00:00)\n if (instance.format(outputFormat) !== ERROR_VALUE) return instance;\n //? \u0415\u0441\u043B\u0438 \u0436\u0435 \u043F\u0440\u0438\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C, \u0442\u043E \u043F\u0440\u0435\u0434\u043F\u043E\u043B\u0430\u0433\u0430\u0435\u043C, \u0447\u0442\u043E data \u043F\u0440\u0438\u0448\u043B\u0430 \u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0435 time\n //? \u0412 \u044D\u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435 \u0441\u043E\u0437\u0434\u0430\u0434\u0438\u043C \u043E\u0431\u044A\u0435\u043A\u0442 \u043E\u0442 \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0434\u0430\u0442\u044B, \u0440\u0430\u0441\u043F\u0430\u0440\u0441\u0438\u043C data \u0438 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u043C \u0432\u0440\u0435\u043C\u044F\n //? \u041A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u043E \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442\u0441\u044F \u043F\u0430\u0442\u0442\u0435\u0440\u043D\u044B: 'HH*mm', 'HH*mm*ss', 'HH*mm*ss*\u043B\u044E\u0431\u043E\u0435_\u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E_ms', \u0433\u0434\u0435 * - \u043B\u044E\u0431\u043E\u0439 \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C\n else if (/^\\d\\d.\\d\\d/.test(data)) {\n instance = moment();\n const symbols = data.split(\"\");\n\n const timeArr = symbols\n .reduce(\n (acc, symbol, idx) => {\n if (Number.isNaN(Number(symbol))) {\n if (acc.group) acc.result.push(acc.group);\n acc.group = \"\";\n } else acc.group = `${acc.group}${symbol}`;\n if (idx === symbols.length - 1 && acc.group)\n acc.result.push(acc.group);\n return acc;\n },\n { result: [], group: \"\" },\n )\n //? reverse \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0438\u0441\u043A\u043B\u044E\u0447\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u0434\u043B\u044F \u0442\u043E\u0433\u043E, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0441\u043B\u0435 \u043C\u043E\u0436\u043D\u043E \u0431\u044B\u043B\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043C\u0435\u0442\u043E\u0434 pop, \u0430 \u043D\u0435 shift,\n //? \u0442.\u043A. \u043C\u0435\u0442\u043E\u0434\u044B \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F/\u0438\u0437\u0432\u043B\u0435\u0447\u0435\u043D\u0438\u044F \u043E\u0442\u043D\u043E\u0441\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043A\u043E\u043D\u0446\u0430 \u043C\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 \u0431\u044B\u0441\u0442\u0440\u0435\u0435,\n //? \u0447\u0435\u043C \u0430\u043D\u0430\u043B\u043E\u0433\u0438\u0447\u043D\u044B\u0435 \u043E\u0442\u043D\u043E\u0441\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043D\u0430\u0447\u0430\u043B\u0430 \u043C\u0430\u0441\u0441\u0438\u0432\u0430\n .result.reverse();\n\n instance.hours(Number(timeArr.pop()));\n instance.minutes(Number(timeArr.pop()));\n instance.seconds(timeArr.length ? Number(timeArr.pop()) : 0);\n instance.milliseconds(timeArr.length ? Number(timeArr.pop()) : 0);\n } else instance = moment(\"error\"); //? \u0418\u043D\u0430\u0447\u0435 \u0441\u043E\u0437\u0434\u0430\u0435\u043C \u0437\u0430\u0432\u0435\u0434\u043E\u043C\u043E \u043D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u044B\u0439 moment-\u044D\u043A\u0437\u0435\u043C\u043F\u043B\u044F\u0440\n\n return instance;\n })();\n\n if (isReturnAsMomentInstance) return momentInstance;\n\n const output = momentInstance.format(outputFormat);\n return output === ERROR_VALUE ? ERROR_MESSGE : output;\n}\n\n//? \u041D\u0430\u043C\u0435\u0440\u044F\u043D\u043D\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435\u043C \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u043D\u0430\u0437\u043D\u0430\u0447\u0430\u044E \u0441\u0430\u043C\u044B\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E-\u043C\u0430\u043B\u0435\u043D\u044C\u043A\u0438\u0439 \u043F\u0430\u0442\u0442\u0435\u0440\u043D\nexport function transformDateOrTimeOrTogetherToFormattedLocal(\n data,\n outputFormat = \"HH:mm\",\n additional,\n) {\n const ERROR_VALUE = \"Invalid date\";\n const ERROR_MESSGE = `Invalid input data for ${outputFormat} format`;\n\n if (additional && !getIsOnlyAnObject(additional)) {\n throw new Error(\n \"Bad additional [transformDateOrTimeOrTogetherToFormattedLocal]\",\n );\n }\n\n const compositeAdditional = {\n ...(additional || {}),\n isReturnAsMomentInstance: true,\n };\n const date = transformDateOrTimeOrTogetherToFormat(\n data,\n outputFormat,\n compositeAdditional,\n );\n\n const dateWithLocale = date.add(moment().utcOffset(), \"minutes\");\n const output = dateWithLocale.format(outputFormat);\n\n return output === ERROR_VALUE ? ERROR_MESSGE : output;\n}\n\n//\u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442 \u043E\u0431\u044C\u0435\u043A\u0442 \u0438 \u043C\u0430\u0441\u0441\u0438\u0432 \u043A\u043B\u044E\u0447\u0435\u0439 \u043E\u0431\u044C\u0435\u043A\u0442\u0430\n//\u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043E\u0431\u044C\u0435\u043A\u0442 \u0441 \u0442\u0435\u043C\u0438 \u043F\u043E\u043B\u044F\u043C\u0438, \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u043D\u0435\u0442 \u0432 \u043C\u0430\u0441\u0441\u0438\u0432\u0435 \u043A\u043B\u044E\u0447\u0435\u0439\nexport const omitKeys = (obj = {}, keys = []) =>\n keys.reduce((acc, key) => {\n const { [key]: omit, ...rest } = acc;\n return rest;\n }, obj);\n\nexport const logout = () => {\n window.localStorage.removeItem(\"accessToken\");\n window.localStorage.removeItem(\"tokenExpires\");\n window.location.reload();\n};\n\nexport const getStyles = (el, prop) => {\n if (!el) return null;\n if (!prop) return window.getComputedStyle(el);\n return window.getComputedStyle(el).getPropertyValue(prop);\n};\n\nexport const getColorById = (id, colors) => {\n if (!id) return \"#FF7D00\";\n\n const idToArr = Array.from(id);\n const colorsArr = colors && colors.length > 0 ? colors : DEFAULT_COLORS;\n\n let number = idToArr.reduce((acc, item) => {\n if (Number(item)) {\n return acc + Number(item);\n }\n return acc;\n }, 0);\n\n while (number >= colorsArr.length) {\n number -= colorsArr.length;\n }\n\n return colorsArr[number];\n};\n\nexport const debounce = (fn, ms) => {\n let id = null;\n return (...args) => {\n clearTimeout(id);\n id = setTimeout(() => {\n clearTimeout(id);\n fn(...args);\n }, ms);\n };\n};\n\nexport const throttle = (fn, ms) => {\n let id = null;\n return (...args) => {\n if (id) return;\n fn(...args);\n id = setTimeout(() => {\n clearTimeout(id);\n id = null;\n }, ms);\n };\n};\n\nexport const addBitDepthPoints = (value, step = 3) => {\n //\u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u043B\u0438 value \u0442\u043E\u0447\u043A\u0443\n const isFraction = value?.includes(\".\");\n\n //\u0432\u0437\u044F\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0434\u043E \u0442\u043E\u0447\u043A\u0438\n const valueBeforeDot = isFraction\n ? value?.slice(0, value?.indexOf(\".\"))\n : value;\n\n //\u0440\u0430\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u0437\u0430\u043F\u044F\u0442\u044B\u0445 \u043F\u043E\u0441\u043B\u0435 \u043A\u0430\u0436\u0434\u043E\u0439 3\u0439 \u0446\u0438\u0444\u0440\u044B \u0441 \u043A\u043E\u043D\u0446\u0430\n const intPart = valueBeforeDot\n .split(\"\")\n .reverse()\n .reduce(\n (acc, item, idx) =>\n idx % step === 0 && idx !== 0 ? [...acc, \",\", item] : [...acc, item],\n [],\n )\n .reverse()\n .join(\"\");\n\n return isFraction ? intPart + value?.slice(value?.indexOf(\".\")) : intPart;\n};\n\nexport const changeMeta = (key, items = []) => {\n const defaultMeta = items.find((i) => i.key === \"default\");\n\n if (key) {\n const item = items.find((i) => i.key === key);\n document.title = item?.title ?? defaultMeta?.title;\n document\n .querySelector('meta[name=\"description\"]')\n .setAttribute(\"content\", item?.description ?? defaultMeta?.description);\n }\n};\n\nexport const firstLetterCapital = (str) =>\n typeof str === \"string\"\n ? `${str.charAt(0).toUpperCase()}${str.slice(1)}`\n : str;\nexport const capitalized = firstLetterCapital;\n\nexport const checkedRef = (ref) =>\n ref ? (typeof ref === \"function\" ? (node) => ref(node) : ref) : null;\n\nexport function downloadEmulation(data, filename, type = \"image/*\") {\n const file = new Blob([data], { type });\n if (window.navigator.msSaveOrOpenBlob)\n // IE10+\n window.navigator.msSaveOrOpenBlob(file, filename);\n else {\n // Others\n const a = document.createElement(\"a\"),\n url = URL.createObjectURL(file);\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n setTimeout(() => {\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n }, 0);\n }\n}\n\nexport const downloadFile = async ({ url, name, type = null }) => {\n const response = await fetch(url).then(async (res) => ({\n data: await res.blob(),\n type: type ?? res.headers.get(\"content-type\"),\n }));\n downloadEmulation(response.data, name, response.type);\n};\n\nexport const compare = (first, second, keys = []) => {\n //? \u0415\u0441\u043B\u0438 \u0442\u0438\u043F\u044B \u041D\u0415 \u0440\u0430\u0432\u043D\u044B - \u043D\u0435 \u0440\u0430\u0432\u043D\u044B \u0430\u043F\u0440\u0438\u043E\u0440\u0438\n if (typeof first !== typeof second) return false;\n //? \u0415\u0441\u043B\u0438 \u043E\u0442\u0432\u0435\u0442\u044B \u043D\u0430 \u0432\u043E\u043F\u0440\u043E\u0441 \"\u043C\u0430\u0441\u0441\u0438\u0432 \u043B\u0438?\" \u043D\u0435 \u0440\u0430\u0432\u043D\u044B, \u0442\u043E \u043D\u0435 \u0440\u0430\u0432\u043D\u044B \u0438 \u0442\u0438\u043F\u044B, \u0437\u043D\u0430\u0447\u0438\u0442 \u0442\u043E\u0436\u0435 \u043D\u0435 \u0440\u0430\u0432\u043D\u044B \u0430\u043F\u0440\u0438\u043E\u0440\u0438\n if (Array.isArray(first) !== Array.isArray(second)) return false;\n //? \u0415\u0441\u043B\u0438 \u043F\u0440\u043E\u0448\u043B\u0438 if-\u043A\u0443 - \u0442\u0438\u043F\u044B \u0443\u0441\u043B\u043E\u0432\u043D\u043E \u0440\u0430\u0432\u043D\u044B, \u043C\u043E\u0436\u0435\u043C \u043E\u0446\u0435\u043D\u0438\u0432\u0430\u0442\u044C \u0442\u0438\u043F \u043B\u0438\u0448\u044C \u043E\u0434\u043D\u043E\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430, \u044D\u0442\u043E \u0431\u0443\u0434\u0435\u0442 \u0441\u043F\u0440\u0430\u0432\u0435\u0434\u043B\u0438\u0432\u043E \u0438 \u0434\u043B\u044F \u0432\u0442\u043E\u0440\u043E\u0433\u043E\n\n //? \u0415\u0441\u043B\u0438 \u043F\u0440\u0438\u043C\u0438\u0442\u0438\u0432\u044B - \u043F\u0440\u043E\u0441\u0442\u043E \u0441\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u0435\u043C. \u041A\u0435\u0439\u0441 \u0441 null \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u0430\u043D \u0442\u0443\u0442.\n if (!(first instanceof Object)) return first === second;\n\n //? \u0415\u0441\u043B\u0438 \u041D\u0415 \u043F\u0440\u0438\u043C\u0435\u0442\u0438\u0432\u044B - \u043D\u0435 \u0432\u0430\u0436\u043D\u043E \u043C\u0430\u0441\u0441\u0438\u0432 \u0438\u043B\u0438 \u043D\u0435\u0442, \u043C\u0435\u0442\u043E\u0434\u044B \u043E\u0431\u044A\u0435\u043A\u0442\u0430 \u0434\u043B\u044F \u043C\u0430\u0441\u0441\u0438\u0432\u0430 \u0442\u043E\u0436\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\n\n const getComparationStructure = (data) => {\n if (typeof data === 'function') return data.toString();\n if (!(data instanceof Object)) return data;\n\n return Object.entries(data)\n .sort((a, b) => (a[0]).localeCompare(b[0]))\n .map(([key, value]) => ([key, getComparationStructure(data[key])]));\n };\n\n //? \u041F\u043E\u043B\u0443\u0447\u0430\u0435\u043C \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u044B \u0434\u043B\u044F \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u044F (\u0441 \u0443\u0447\u0435\u0442\u043E\u043C \u0433\u043B\u0443\u0431\u0438\u043D\u044B) - \u043C\u0430\u0441\u0441\u0438\u0432\u044B \u043C\u0430\u0441\u0441\u0438\u0432\u043E\u0432, \u0441\u043E\u0440\u0442\u0438\u0440\u0443\u0435\u043C \u043F\u043E \u043A\u043B\u044E\u0447\u0430\u043C,\n const structureForComparingOfFirst = getComparationStructure(first);\n const structureForComparingOfSecond = getComparationStructure(second);\n\n return (JSON.stringify(structureForComparingOfFirst) === JSON.stringify(structureForComparingOfSecond));\n};\n\n// Set Carret to the End of Input\nexport const setCarretToEnd = (input) => {\n setTimeout(() => {\n const tmp = input.value;\n input.value = \"\";\n input.value = tmp;\n }, 10);\n};\n\nexport const compareAlphabetical = (a, b, key = \"label\") => {\n let item1 = a?.[key];\n let item2 = b?.[key];\n\n if (typeof item1 !== \"string\" || typeof item2 !== \"string\") return 0;\n\n item1 = item1?.toLowerCase();\n item2 = item2?.toLowerCase();\n\n if (item1 < item2) {\n return -1;\n }\n if (item1 > item2) {\n return 1;\n }\n return 0;\n};\n\nexport const getBase64 = (file) => {\n if (file) {\n return new Promise(function (resolve, reject) {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = () => resolve(reader.result);\n reader.onerror = (error) => reject(\"Error: \", error);\n });\n }\n};\n\nexport const renderFileSize = (bytes, decimals = 2) => {\n if (!Number(bytes)) return \"0 Bytes\";\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;\n};\n\nexport const getUniqueFileExtensions = (extListString) => {\n // Split the extensions list into an array\n const extArray = extListString\n ?.split(\",\")\n .map((ext) => ext.trim().toUpperCase());\n\n // Remove duplicates using a Set\n const uniqueExts = [...new Set(extArray)];\n\n // Join the unique extensions into a string\n return uniqueExts.join(\", \");\n};\n\nexport const getOS = () => {\n let userAgent = window.navigator.userAgent,\n platform =\n window.navigator?.userAgentData?.platform || window.navigator.platform,\n macosPlatforms = [\"Macintosh\", \"MacIntel\", \"MacPPC\", \"Mac68K\"],\n windowsPlatforms = [\"Win32\", \"Win64\", \"Windows\", \"WinCE\"],\n iosPlatforms = [\"iPhone\", \"iPad\", \"iPod\"],\n os = OS.Unknown;\n\n if (macosPlatforms.indexOf(platform) !== -1) {\n os = OS.MacOS;\n } else if (iosPlatforms.indexOf(platform) !== -1) {\n os = OS.iOS;\n } else if (windowsPlatforms.indexOf(platform) !== -1) {\n os = OS.Windows;\n } else if (/Android/.test(userAgent)) {\n os = OS.Android;\n } else if (/Linux/.test(platform)) {\n os = OS.Linux;\n }\n\n return os;\n};\n\n\nString.prototype.longerThan = function (compareWith) {\n return this?.length > compareWith?.length;\n};\nString.prototype.lastIndexEqualsTo = function (index) {\n return this?.length - 1 === index;\n};\n\nexport const getCorrectTestId = ({ testId = \"\", withTier = true }) =>\n testId && testId !== undefined ? `${withTier ? \"-\" : \"\"}${testId}` : \"\";\n\n\n", "export const KEYBOARD_SERVICE_KEYS = [\n \"Escape\",\n \"F1\",\n \"F2\",\n \"F3\",\n \"F4\",\n \"F5\",\n \"F6\",\n \"F7\",\n \"F8\",\n \"F9\",\n \"F10\",\n \"F11\",\n \"F12\",\n \"Tab\",\n \"CapsLock\",\n \"Shift\",\n \"Control\",\n \"Meta\",\n \"Option\",\n \"Alt\",\n \"ContextMenu\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"ArrowUp\",\n \"ArrowDown\",\n \"NumLock\",\n \"Backspace\",\n \"Delete\",\n \"Enter\",\n \"Return\",\n \"Insert\",\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\",\n \"PrintScreen\",\n \"ScrollLock\",\n \"Pause\",\n];\n\nexport const MAX_PHONE_LENGTH = 10;\nexport const MAX_NAME_LENGTH = 128;\n\nexport const DEFAULT_DATE_MASK_NO_VALUE_SYMBOL = \"_\";\n\nexport const DEFAULT_COLORS = [\n \"#D9C1FF\",\n \"#FFBAF0\",\n \"#FFB8CE\",\n \"#FFC3A2\",\n \"#FFDB7C\",\n \"#F9F871\",\n \"#C3FCF1\",\n \"#F6F2CB\",\n \"#E0F8D1\",\n \"#B1DFFB\",\n \"#8DECFE\",\n \"#76F7ED\",\n \"#8AFEC8\",\n];\n\nexport const KEYBOARD_KEY_CODES = {\n Backspace: 8,\n Delete: 46,\n ARROW_LEFT: 37,\n ARROW_RIGHT: 39,\n};\n\nexport const OS = {\n iOS: \"iOS\",\n Android: \"Android\",\n WP: \"Windows Phone\",\n Linux: \"Linux\",\n Windows: \"Windows\",\n MacOS: \"MacOS\",\n Unknown: \"unknown\",\n};\n", "import type { AccordionLinkComponent, IAccordionItemProps } from './Accordion.interface';\nimport cn from 'classnames';\nimport React, { useEffect, useRef, useState } from 'react';\nimport * as Icons from 'react-feather';\n\nimport Status from '../Status';\n\nimport './Accordion.scss';\n\n/**\n * \u0414\u0435\u0444\u043E\u043B\u0442\u043D\u0430\u044F \u0441\u0441\u044B\u043B\u043A\u0430 menu-\u043F\u0443\u043D\u043A\u0442\u043E\u0432 \u2014 \u043E\u0431\u044B\u0447\u043D\u044B\u0439 <a href> \u0411\u0415\u0417 react-router-dom.\n * AccordionItem \u043E\u0431\u044F\u0437\u0430\u043D \u043E\u0441\u0442\u0430\u0432\u0430\u0442\u044C\u0441\u044F router-free: \u0435\u0433\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 Table -> TdCell\n * \u0438\u0437 subpath \"ui\". SPA-\u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 Accordion (subpath \"router-ui\"),\n * \u043F\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044F \u0441\u044E\u0434\u0430 NavLink \u0447\u0435\u0440\u0435\u0437 prop linkComponent.\n */\nconst DefaultLink: AccordionLinkComponent = ({ to, className, children }) => (\n <a href={to} className={className}>\n {children}\n </a>\n);\n\nconst AccordionItem: React.FC<IAccordionItemProps> = ({\n item,\n onClick,\n isOpen,\n className,\n children,\n noChevron,\n linkComponent: LinkComponent = DefaultLink,\n testId = 'accordion-item',\n}) => {\n const Icon = Icons[item.icon as keyof typeof Icons];\n const [maxHeight, setMaxHeight] = useState<number>(0);\n const ref = useRef<HTMLDivElement>(null);\n\n const getItemsHeight = (): number => {\n let itemHeight = 0;\n ref.current?.childNodes.forEach((el) => {\n itemHeight += (el as HTMLElement).offsetHeight;\n });\n\n return itemHeight + 20;\n };\n\n useEffect(() => {\n setMaxHeight(isOpen ? getItemsHeight() : 0);\n }, [isOpen]);\n\n const calculateStatusCount = (): {\n active: number;\n pause: number;\n } | undefined => {\n return item?.rows?.reduce(\n (acc, row) => {\n const result = row.cols.reduce(\n (accum, col) => ({\n active: accum.active + (col.status === 'active' ? 1 : 0),\n pause: accum.pause + (col.status === 'pause' ? 1 : 0),\n }),\n { active: 0, pause: 0 },\n );\n\n return {\n active: acc.active + result.active,\n pause: acc.pause + result.pause,\n };\n },\n { active: 0, pause: 0 },\n );\n };\n\n return (\n <div\n data-testid={testId}\n className={cn('accordion--item', className)}\n role=\"region\"\n aria-labelledby={`accordion-title-${item.title}`}\n >\n <div\n className={cn('accordion--title-box', {\n 'accordion--title-open': isOpen,\n })}\n onClick={() => onClick(!isOpen)}\n id={`accordion-title-${item.title}`}\n role=\"button\"\n aria-expanded={isOpen}\n aria-controls={`accordion-content-${item.title}`}\n tabIndex={0}\n >\n <div className=\"j4 no-wrap\">\n {item?.icon && <Icon className={cn('mr5', item?.className)} aria-hidden=\"true\" />}\n <span className=\"accordion--title\">{item.title || 'Menu Chapter'}</span>\n </div>\n\n <div className=\"j6 accordion-title__right-box\">\n {item.status && (\n <div className=\"mr5\">\n <Status\n type={item?.status.type}\n value={item?.status.value}\n status={item?.status.status}\n active={calculateStatusCount()?.active}\n pause={calculateStatusCount()?.pause}\n />\n </div>\n )}\n\n {!noChevron && (\n <Icons.ChevronRight\n aria-hidden=\"true\"\n className={cn('accordion--title-chevron', {\n 'accordion--title-chevron-open': isOpen,\n })}\n />\n )}\n </div>\n </div>\n\n <div\n ref={ref}\n style={{ maxHeight }}\n className={cn('accordion--content', {\n 'accordion--content-is-open': isOpen,\n })}\n id={`accordion-content-${item.title}`}\n role=\"region\"\n aria-labelledby={`accordion-title-${item.title}`}\n >\n {item.children\n ? item.children.map((el) => {\n return (\n <LinkComponent to={el.link} key={el.id} className=\"accordion--content-item accordion--menu-link\">\n {el?.title || 'Menu item'}\n </LinkComponent>\n );\n })\n : children}\n </div>\n </div>\n );\n};\n\nexport default AccordionItem;\n", "import type { IStatusProps } from './Status.interface';\nimport cn from 'classnames';\n\nimport React from 'react';\n\nimport './Status.scss';\n\nfunction defaultOnClick(): void {}\n\nconst Status: React.FC<IStatusProps> = ({\n icon,\n value,\n label,\n status,\n disabled,\n type,\n active = 0,\n pause = 0,\n className,\n noBackground,\n children,\n testId = 'status',\n onClick = defaultOnClick,\n}) => {\n if (!status) return null;\n\n const text = children && typeof children === 'string' ? children : value || label || status;\n const formattedLabel = text?.[0].toUpperCase() + text?.slice(1);\n\n return (\n <div onClick={onClick} data-testid={testId} className={cn({ disabled }, className)}>\n {type === 'number'\n ? (\n <div>\n {active === 0 && pause === 0\n ? (\n <div className=\"status status--error\">\n <span>{active}</span>\n </div>\n )\n : (\n <div className=\"status status--warning\">\n <span className=\"status--number-active\">{active}</span>\n <span className=\"color--gray-gull\"> / </span>\n <span className={pause > 0 ? 'color--froly' : 'color--gray-gull'}>{pause}</span>\n </div>\n )}\n </div>\n )\n : (\n <div\n className={cn(\n 'status',\n `status--${status}`,\n {\n 'status--no-bg': noBackground && status === 'pause',\n 'color--gray-gull': noBackground && status === 'pause' && !className,\n 'j4': !!icon,\n },\n className,\n )}\n >\n {icon}\n {formattedLabel}\n </div>\n )}\n </div>\n );\n};\n\nexport default Status;\n", "import Status from './Status';\n\nexport default Status;\nexport type { IStatusProps } from './Status.interface';\n", "import Accordion from './Accordion';\n\nexport default Accordion;\nexport type { AccordionLinkComponent, IAccordionItemProps, IAccordionProps } from './Accordion.interface';\n", "import type { IButtonsBarProps } from './ButtonsBar.interface';\nimport cn from 'classnames';\nimport React from 'react';\n\nimport { Link } from 'react-router-dom';\n\nimport Button from '../Button/Button';\n\nimport './ButtonsBar.scss';\n\nconst ButtonsBar: React.FC<IButtonsBarProps> = ({\n className,\n rejectBtnLabel,\n rejectBtnIcon,\n isRejectBtnIconRight,\n rejectBtnVariant,\n rejectBtnClass,\n isRejectBtnDisabled,\n rejectLink,\n onReject,\n confirmBtnLabel,\n confirmBtnIcon,\n isConfirmBtnIconRight,\n confirmBtnVariant,\n confirmBtnClass,\n isConfirmBtnDisabled,\n onConfirm,\n testIdFirstBtn = 'button-bar-first-item',\n testIdSecondBtn = 'button-bar-second-item',\n}) => {\n return (\n <div className={cn('button-bar', className)}>\n {rejectLink\n ? (\n <Link className=\"text-decoration-none\" to={rejectLink}>\n <Button\n testId={testIdFirstBtn}\n label={rejectBtnLabel}\n variant={rejectBtnVariant}\n onClick={onReject}\n disabled={isRejectBtnDisabled}\n icon={rejectBtnIcon}\n isIconRight={isRejectBtnIconRight}\n className={cn(rejectBtnClass, { mr5: confirmBtnLabel })}\n />\n </Link>\n )\n : (\n <Button\n testId={testIdFirstBtn}\n label={rejectBtnLabel}\n variant={rejectBtnVariant}\n onClick={onReject}\n disabled={isRejectBtnDisabled}\n icon={rejectBtnIcon}\n isIconRight={isRejectBtnIconRight}\n className={cn(rejectBtnClass, { mr5: confirmBtnLabel })}\n />\n )}\n\n <Button\n testId={testIdSecondBtn}\n label={confirmBtnLabel}\n variant={confirmBtnVariant}\n onClick={onConfirm}\n disabled={isConfirmBtnDisabled}\n icon={confirmBtnIcon}\n isIconRight={isConfirmBtnIconRight}\n className={confirmBtnClass}\n />\n </div>\n );\n};\n\nexport default ButtonsBar;\n", "import type { CSSProperties, ReactNode } from 'react';\nimport type { IUniProps } from '../../../types/base.interface';\nimport cn from 'classnames';\n\nimport './Button.scss';\n\nconst RC = 'button';\n\nexport type TButtonVariant = 'primary' | 'ellipse-apply' | 'ellipse-cancel' | string;\n\ninterface IProps extends IUniProps, Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type' | 'disabled'> {\n label?: string;\n onClick?: () => void;\n disabled?: boolean;\n icon?: ReactNode;\n children?: ReactNode;\n style?: CSSProperties;\n noIcon?: boolean;\n isIconRight?: boolean;\n tabIndex?: number;\n variant?: TButtonVariant;\n isTextEllipsis?: boolean;\n}\n\nconst Button: React.FC<IProps> = ({\n label,\n onClick,\n disabled,\n icon,\n className,\n children,\n style,\n noIcon,\n isIconRight,\n testId = 'button',\n tabIndex = 0,\n variant = 'primary',\n isTextEllipsis = false,\n ...props\n}) => {\n const noRenderIcon = noIcon || variant === 'ellipse-apply' || variant === 'ellipse-cancel';\n\n return (\n <button\n data-testid={testId}\n tabIndex={tabIndex}\n style={style}\n className={cn(\n RC,\n {\n [`${RC}_${variant}`]: variant,\n 'button_icon-left': icon && !isIconRight,\n 'button_icon-right': icon && isIconRight,\n },\n className,\n )}\n onClick={onClick}\n disabled={disabled}\n type=\"button\"\n {...props}\n\n >\n {!noRenderIcon && icon}\n {label && <div className={cn('button__text', { 'text-ellipsis': isTextEllipsis })}>{label}</div>}\n {!label && children ? children : null}\n </button>\n );\n};\n\nexport default Button;\n", "import type { IButtonsBarProps } from './ButtonsBar.interface';\nimport ButtonsBar from './ButtonsBar';\n\nexport type { IButtonsBarProps };\nexport default ButtonsBar;\n", "import type { ReactElement } from 'react';\n\nimport type { LangKey } from '../../FormElements/Input/types';\nimport type { IMainMenuProps } from './MainMenu.interface';\nimport cn from 'classnames';\nimport { useState } from 'react';\n\nimport * as Icons from 'react-feather';\nimport { NavLink } from 'react-router-dom';\n\nimport Langs from '../../../Langs';\nimport Accordion from '../../UI/Accordion/Accordion';\nimport './MainMenu.scss';\n\nfunction MainMenu(props: IMainMenuProps): ReactElement {\n const { items, className } = props;\n const lng = (globalThis as any).lng as LangKey;\n const txt = Langs[lng];\n const [isOpen, setIsOpen] = useState(true);\n const [isMenuHovered, setIsMenuHovered] = useState(false);\n const [isMenuIconHovered, setIsMenuIconHovered] = useState(false);\n\n const chapterClass = cn('main-menu--items-box-chapter', {\n 'main-menu--items-box-chapter-hidden': !isOpen && !isMenuHovered,\n });\n const accordionClass = cn('main-menu--accordion', {\n 'main-menu--accordion-hidden': !isOpen && !isMenuHovered,\n });\n const itemsBoxClass = cn('main-menu--items-box', {\n 'main-menu--items-box-closed': !isOpen && !isMenuHovered,\n });\n const mainMenuClass = cn('main-menu', className, {\n 'main-menu--closed': !isOpen && !isMenuHovered,\n });\n\n const onMenuHover = (): void => {\n if (!isOpen) {\n setIsMenuHovered(!isMenuHovered);\n items.mainMenu.forEach((item) => {\n item.isOpen = false;\n });\n items.partners.forEach((item) => {\n item.isOpen = false;\n });\n items.other.forEach((item) => {\n item.isOpen = false;\n });\n }\n };\n\n const onCloseMenu = (): void => {\n setIsOpen(!isOpen);\n items.mainMenu.forEach((item) => {\n item.isOpen = false;\n });\n items.partners.forEach((item) => {\n item.isOpen = false;\n });\n items.other.forEach((item) => {\n item.isOpen = false;\n });\n };\n\n const changeMenuIcon = (): ReactElement | null => {\n if (isOpen && !isMenuIconHovered) return <Icons.Menu />;\n if (isOpen && isMenuIconHovered) return <Icons.ChevronLeft />;\n if (!isOpen && isMenuHovered) return <Icons.ChevronRight />;\n if (!isOpen) return <div className=\"main-menu--logo-close\" />;\n return null;\n };\n\n return (\n <div\n className={mainMenuClass}\n onMouseEnter={() => onMenuHover()}\n onMouseLeave={() => setIsMenuHovered(false)}\n >\n <div\n className={cn('main-menu--header', {\n 'main-menu--header-closed': !isOpen && !isMenuHovered,\n })}\n >\n <div\n className={cn('main-menu--logo', {\n 'main-menu--logo-none': !isOpen && !isMenuHovered,\n })}\n />\n <div data-testid=\"main-menu--header-btn\" className=\"main-menu--header-btn\" onClick={() => onCloseMenu()}>\n <div\n className=\"j5\"\n onMouseEnter={() => setIsMenuIconHovered(true)}\n onMouseLeave={() => setIsMenuIconHovered(false)}\n >\n {changeMenuIcon()}\n </div>\n </div>\n </div>\n\n <div className={itemsBoxClass}>\n <div className={cn('main-menu--items-box-main')}>\n {items.main.map((item, index) => {\n const Icon = Icons[item.icon as keyof typeof Icons];\n return item.link\n ? (\n <NavLink\n to={item.link}\n key={index}\n className={cn('main-menu--items-box-title')}\n >\n <div className=\"main-menu--item\">\n <div className=\"df\">\n <Icon className={cn('mr5', item.className)} />\n </div>\n <span className={cn({ hidden: !isOpen && !isMenuHovered })}>\n {item?.title || 'Link'}\n </span>\n </div>\n </NavLink>\n )\n : (\n <span\n key={index}\n className={cn('main-menu--items-box-title', {\n hidden: !isOpen && !isMenuHovered,\n })}\n >\n {txt?.titles[item?.title as keyof typeof txt.titles]}\n </span>\n );\n })}\n </div>\n\n <div className={chapterClass}>\n <span>Main menu</span>\n </div>\n <Accordion\n className={accordionClass}\n items={items.mainMenu}\n />\n\n <div className={chapterClass}>\n <span>Partners</span>\n </div>\n <Accordion\n isOpen={isOpen}\n isMenuHovered={isMenuHovered}\n className={accordionClass}\n items={items.partners}\n />\n\n <div className={chapterClass}>\n <span>Other</span>\n </div>\n <Accordion\n className={accordionClass}\n isOpen={isOpen}\n isMenuHovered={isMenuHovered}\n items={items.other}\n />\n </div>\n </div>\n );\n}\n\nexport default MainMenu;\n", "const Langs = {\n en: {\n auth: {},\n settings: {},\n labels: {\n industries: \"Industries\",\n includedLenders: \"Included Lenders\",\n admin: \"Administrator\",\n user: \"User\",\n help: \"Help\",\n description: \"Description\",\n value: \"Value\",\n paramName: \"Parameter name(key)\",\n active: \"Active\",\n pause: \"Pause\",\n error: \"Error\",\n sold: \"Sold\",\n processing: \"Processing\",\n home: \"Home\",\n goods: \"Goods\",\n improvement: \"Improvement\",\n jewelry: \"Jewelry\",\n firstName: \"First Name\",\n lastName: \"Last Name\",\n dateOfBirth: \"Date of Birth\",\n militaryStatus: \"Military status\",\n ssn: \"SSN\",\n lengthAtAddress: \"Length At Address\",\n rentOrOwn: \"Rent or Own\",\n zip: \"ZIP\",\n city: \"City\",\n state: \"State\",\n address: \"Address\",\n email: \"E-mail\",\n homePhone: \"Home Phone\",\n cellPhone: \"Cell Phone\",\n contactTime: \"Contact Time\",\n dlState: \"DL state\",\n dlNumber: \"DL number\",\n ownCar: \"Do you own a car?\",\n tcpaOptin: \"TCPA OPTIN\",\n incomeSource: \"Income Source\",\n timeEmployed: \"Time Employed\",\n jobTitle: \"Job Title\",\n currentEmployer: \"Current Employer\",\n employersPhone: \"Employer's Phone\",\n netMonthlyIncome: \"Net monthly income\",\n howOftenIsPaid: \"How often is paid\",\n nextPayDate: \"Next Pay Date\",\n secondPayDate: \"Second Pay Date\",\n loanAmount: \"Loan amount\",\n ip: \"IP\",\n storyName: \"Story name\",\n channelName: \"Channel name\",\n employmentInfo: \"Employment Information\",\n personalDetails: \"Personal Details\",\n offer: \"Offer\",\n offers: \"Offers\",\n status: \"Status\",\n name: \"Name\",\n from: \"From\",\n to: \"to\",\n periodMonths: \"Period (months)\",\n loansSent: \"Loans Sent\",\n approved: \"Approved\",\n rejected: \"Rejected\",\n loanAmountApproved: \"Loan Amount Approved ($)\",\n loanAmountRejected: \"Loan Amount Rejected ($)\",\n approveRate: \"Approve Rate (%)\",\n actions: \"Actions\",\n locations: \"Locations\",\n score: \"Score\",\n priority: \"Priority\",\n lender: \"Lender\",\n weight: \"Weight\",\n selectLender: \"Select lender\",\n },\n singulars: {},\n titles: {\n pingTree: \"Ping tree\",\n edit: \"Edit\",\n create: \"Create\",\n add: \"Add\",\n consumerInfo: \"Consumer info\",\n personalDetails: \"Personal Details\",\n employmentInfo: \"Employment Information\",\n tools: \"Tools\",\n lenders: \"Lenders\",\n settings: \"Settings\",\n dashboard: \"Dashboard\",\n consumers: \"Consumers\",\n ticketDesk: \"Ticket desk\",\n accounting: \"Accounting\",\n users: \"Users\",\n merchants: \"Merchants\",\n lenderPingTree: \"Lender Ping Tree\",\n reports: \"Reports\",\n leads: \"Leads\",\n location: \"Location\",\n mainMenu: \"Main menu\",\n partners: \"Partners\",\n other: \"Other\",\n homeGoodsAndInteriorDesign: \"Home Goods and Interior Design\",\n },\n placeholders: {\n typeName: \"Type name\",\n params: \"Params placeholder\",\n value: \"Value placeholder\",\n description: \"Description placeholder\",\n },\n hints: {\n landerNotIncluded:\n \"Lender is not included in Ping Tree by the \u201CHome Goods\u201D industry\",\n noMerchants: \"No Merchants for the \u201CHome Goods\u201D industry\",\n },\n buttons: {\n create: \"Create\",\n edit: \"Edit\",\n add: \"Add\",\n close: \"Close\",\n apply: \"Apply\",\n pingTree: \"Ping tree\",\n addRow: \"Add row\",\n consumerInfo: \"Consumer Info\",\n deletePingTree: \"Delete Ping Tree\",\n cancel: \"Cancel\",\n },\n radioButtons: {},\n weekDays: {\n su: \"Su\",\n mo: \"Mo\",\n tu: \"Tu\",\n we: \"We\",\n th: \"Th\",\n fr: \"Fr\",\n sa: \"Sa\",\n },\n alerts: {\n lendersWillBeRemoved: \"lenders will be removed\",\n },\n checkboxes: {\n homeGoods: \"Home Goods\",\n travel: \"Travel\",\n energyImprovement: \"Energy Improvement\",\n jewelryIncluded: \"Jewelry (included in PingTree name 2)\",\n jewelry: \"Jewelry\",\n autoRepair: \"Auto Repair\",\n cosmetics: \"Cosmetics\",\n health: \"Health\",\n },\n errors: {},\n texts: {},\n tabs: {\n general: \"General\",\n payments: \"Payments\",\n filters: \"Filters\",\n offers: \"Offers\",\n merchants: \"Merchants\",\n integration: \"Integration\",\n customDetails: \"Custom details\",\n customerDetails: \"Customer details\",\n postsLog: \"Posts log\",\n },\n toasts: {},\n },\n};\n\nexport default Langs;\n", "import type { ReactNode } from 'react';\nimport type { HTMLElementOrAnchor, RefType } from '../../../types/base.types';\nimport type { INavLineItem, INavLineProps } from './NavLine.interface';\nimport cn from 'classnames';\nimport React, { createRef, useCallback, useEffect, useRef, useState } from 'react';\n\nimport * as Icons from 'react-feather';\n\nimport { NavLink } from 'react-router-dom';\n\nimport { KEYBOARD_KEY_CODES } from '../../../Constants/index.constants';\n\nimport './NavLine.scss';\n\nconst CN = 'nav-line';\n\n/**\n * \u041F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u0442 \u0438 \u043D\u043E\u0440\u043C\u0430\u043B\u0438\u0437\u0443\u0435\u0442 ref\n * @param ref - React ref \u043E\u0431\u044A\u0435\u043A\u0442 \u0438\u043B\u0438 \u0444\u0443\u043D\u043A\u0446\u0438\u044F \u043E\u0431\u0440\u0430\u0442\u043D\u043E\u0433\u043E \u0432\u044B\u0437\u043E\u0432\u0430\n * @returns \u041D\u043E\u0440\u043C\u0430\u043B\u0438\u0437\u043E\u0432\u0430\u043D\u043D\u044B\u0439 ref \u0438\u043B\u0438 null\n */\nfunction checkedRef<T extends HTMLElementOrAnchor = HTMLElement>(ref: RefType<T>): RefType<T> {\n if (!ref) return null;\n return typeof ref === 'function' ? (node: T) => ref(node) : ref;\n}\n\nconst NavLine: React.FC<INavLineProps> = ({\n root = '',\n activeTab,\n variant,\n onChange,\n className,\n items,\n children,\n isLocal = false,\n mode,\n isNavigateByKeys,\n isTabLoading,\n scrollMode = false,\n testId = CN,\n}) => {\n const [navLineItems, setNavLineItems] = useState<\n Array<INavLineItem & { ref: React.RefObject<HTMLElement> }>\n >([]);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const wrapperInnerRef = useRef<HTMLDivElement>(null);\n const [showScrollButtons, setShowScrollButtons] = useState(false);\n const [canScrollLeft, setCanScrollLeft] = useState(false);\n const [canScrollRight, setCanScrollRight] = useState(false);\n const [isScrollBlocked, setIsScrollBlocked] = useState(false);\n\n const checkScroll = useCallback(() => {\n const inner = wrapperInnerRef.current;\n if (!inner) return;\n\n const hasOverflow = inner.scrollWidth > inner.clientWidth;\n const canScrollLeft = inner.scrollLeft > 0;\n const canScrollRight = inner.scrollLeft < inner.scrollWidth - inner.clientWidth;\n\n setShowScrollButtons(hasOverflow);\n setCanScrollLeft(canScrollLeft);\n setCanScrollRight(canScrollRight);\n }, []);\n\n const scroll = useCallback(\n (direction: 'left' | 'right') => {\n if (isScrollBlocked || !wrapperInnerRef.current) return;\n\n setIsScrollBlocked(true);\n const scrollAmount = 100;\n const offset = direction === 'left' ? -scrollAmount : scrollAmount;\n\n try {\n wrapperInnerRef.current.scrollBy({\n left: offset,\n behavior: 'smooth',\n });\n }\n catch (error) {\n console.error('scrollBy is not supported', error);\n // Fallback \u0434\u043B\u044F \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043E\u0432, \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044E\u0449\u0438\u0445 scrollBy\n if (wrapperInnerRef.current) {\n wrapperInnerRef.current.scrollLeft += offset;\n }\n }\n\n setTimeout(() => {\n setIsScrollBlocked(false);\n checkScroll();\n }, 300);\n },\n [isScrollBlocked, checkScroll],\n );\n\n const handleWheel = useCallback(\n (e: WheelEvent) => {\n if (!scrollMode) return;\n e.preventDefault();\n\n if (e.deltaY > 0) {\n scroll('right');\n }\n else {\n scroll('left');\n }\n },\n [scroll, scrollMode],\n );\n\n const onTabChange = useCallback(\n (item: INavLineItem) => {\n if (!item.disabled && !(mode === 'create' && item.tabId !== 'general')) {\n onChange(item.tabId);\n }\n },\n [mode, onChange],\n );\n\n const navigateByKeys = useCallback(\n (event: KeyboardEvent) => {\n if (event.repeat) return;\n\n const activeTabIndex = items.findIndex(tab => tab.tabId === activeTab);\n const nextTabID = items[activeTabIndex + 1]?.tabId;\n const prevTabID = items[activeTabIndex - 1]?.tabId;\n\n if (event.keyCode === KEYBOARD_KEY_CODES.ARROW_RIGHT && nextTabID) {\n onChange(nextTabID);\n }\n else if (event.keyCode === KEYBOARD_KEY_CODES.ARROW_LEFT && prevTabID) {\n onChange(prevTabID);\n }\n },\n [activeTab, items, onChange],\n );\n\n // \u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u0442\u0430\u0431\u043E\u0432 \u0441 ref\n useEffect(() => {\n setNavLineItems(\n items.map(item => ({\n ...item,\n ref: createRef<HTMLElement>(),\n })),\n );\n }, [items]);\n\n // \u041E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0430 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u043D\u043E\u0439 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n useEffect(() => {\n if (isNavigateByKeys && !isTabLoading) {\n document.addEventListener('keydown', navigateByKeys);\n }\n\n return () => document.removeEventListener('keydown', navigateByKeys);\n }, [isNavigateByKeys, isTabLoading, navigateByKeys]);\n\n // \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u0441\u043A\u0440\u043E\u043B\u043B\u0430\n useEffect(() => {\n if (!scrollMode) return;\n\n const inner = wrapperInnerRef.current;\n if (!inner) return;\n\n const resizeObserver = new ResizeObserver(checkScroll);\n resizeObserver.observe(inner);\n\n inner.addEventListener('scroll', checkScroll);\n inner.addEventListener('wheel', handleWheel, { passive: false });\n\n checkScroll();\n\n return () => {\n resizeObserver.disconnect();\n inner.removeEventListener('scroll', checkScroll);\n inner.removeEventListener('wheel', handleWheel);\n };\n }, [scrollMode, checkScroll, handleWheel]);\n\n const renderNavItem = (item: INavLineItem & { ref: React.RefObject<HTMLElement> }): ReactNode => {\n const Icon = item.icon ? Icons[item.icon as keyof typeof Icons] : null;\n const isDisabled = item.disabled || (mode === 'create' && item.tabId !== 'general');\n\n const commonProps = {\n 'title': item.title,\n 'className': cn(\n { 'nav-line__item': !variant },\n { 'nav-line--simple__item': variant === 'simple' },\n { active: activeTab === item.tabId },\n { disabled: isDisabled },\n { 'nav-line__item--hidden': item.isHidden },\n ),\n 'role': 'tab',\n 'aria-selected': activeTab === item.tabId,\n 'aria-disabled': isDisabled,\n 'tabIndex': isDisabled ? -1 : 0,\n };\n\n const content = (\n <div className=\"nav-line__content\">\n {Icon && (\n <div className=\"nav-line__item--icon\" aria-hidden=\"true\">\n <Icon />\n </div>\n )}\n <span className={cn({ 'nav-line__item--label': variant !== 'simple' })}>{item.label}</span>\n {item.count !== undefined && (\n <span className=\"nav-line-count\" aria-label={`${item.count} items`}>\n (\n {item.count}\n )\n </span>\n )}\n </div>\n );\n if (isLocal) {\n return (\n <span\n key={`tab__${item.tabId}`}\n {...commonProps}\n ref={checkedRef(item.ref)}\n onClick={() => !isDisabled && onTabChange(item)}\n onKeyPress={(e: React.KeyboardEvent) => {\n if (!isDisabled && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onTabChange(item);\n }\n }}\n >\n {content}\n </span>\n );\n }\n\n return (\n <NavLink\n key={`tab__${item.tabId}`}\n {...commonProps}\n to={`${root}${item?.linkChapter || item.tabId}/`}\n onClick={(e) => {\n if (isDisabled) {\n e.preventDefault();\n }\n }}\n >\n {content}\n </NavLink>\n );\n };\n\n return (\n <div className=\"nav-line-wrapper\">\n <div\n data-testid={testId}\n className={cn(\n { [CN]: !variant },\n { [`${CN}--simple`]: variant === 'simple' },\n { [`${CN}--scroll-mode`]: scrollMode },\n className,\n )}\n ref={wrapperRef}\n >\n {scrollMode && showScrollButtons && (\n <button\n type=\"button\"\n data-testid=\"nav-line-scroll-prev\"\n className=\"nav-line--simple__arrow nav-line--simple__arrow--prev\"\n onClick={() => scroll('left')}\n aria-label=\"Scroll previous\"\n disabled={!canScrollLeft}\n >\n <Icons.ChevronLeft />\n </button>\n )}\n\n <div\n ref={wrapperInnerRef}\n className={cn({ 'nav-line__inner': !variant }, { 'nav-line--simple__inner': variant === 'simple' })}\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n >\n {navLineItems.map(renderNavItem)}\n </div>\n\n {scrollMode && showScrollButtons && (\n <button\n type=\"button\"\n data-testid=\"nav-line-scroll-next\"\n className=\"nav-line--simple__arrow nav-line--simple__arrow--next\"\n onClick={() => scroll('right')}\n aria-label=\"Scroll next\"\n disabled={!canScrollRight}\n >\n <Icons.ChevronRight />\n </button>\n )}\n\n {children && (\n <div className=\"nav-line__body\" role=\"tabpanel\">\n {children}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default NavLine;\n", "import NavLine from './NavLine';\n\nexport default NavLine;\nexport type { INavLineItem, INavLineProps } from './NavLine.interface';\n"],
5
- "mappings": "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",
6
- "names": ["cn", "useState", "Icons", "cn", "useEffect", "Status_default", "jsx", "jsxs", "useEffect", "cn", "Status_default", "jsx", "jsxs", "useState", "cn", "Icons", "Accordion_default", "cn", "cn", "jsx", "jsxs", "cn", "jsx", "jsxs", "cn", "ButtonsBar_default", "cn", "useState", "Icons", "NavLink", "jsx", "jsxs", "useState", "cn", "Icons", "NavLink", "cn", "useEffect", "useRef", "useState", "Icons", "NavLink", "jsx", "jsxs", "CN", "useState", "useRef", "canScrollLeft", "canScrollRight", "useEffect", "Icons", "cn", "NavLink", "NavLine_default"]
7
- }
package/dist/sdk.cjs DELETED
@@ -1,451 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
- var __getOwnPropNames = Object.getOwnPropertyNames;
4
- var __hasOwnProp = Object.prototype.hasOwnProperty;
5
- var __export = (target, all) => {
6
- for (var name in all)
7
- __defProp(target, name, { get: all[name], enumerable: true });
8
- };
9
- var __copyProps = (to, from, except, desc) => {
10
- if (from && typeof from === "object" || typeof from === "function") {
11
- for (let key of __getOwnPropNames(from))
12
- if (!__hasOwnProp.call(to, key) && key !== except)
13
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
- }
15
- return to;
16
- };
17
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
-
19
- // src/sdk.ts
20
- var sdk_exports = {};
21
- __export(sdk_exports, {
22
- HttpError: () => HttpError,
23
- createRuntimeClient: () => createRuntimeClient
24
- });
25
- module.exports = __toCommonJS(sdk_exports);
26
-
27
- // src/Functions/sdk/runtime-sdk/config.ts
28
- var noopLogger = () => {
29
- };
30
- var consoleLogger = (level, message, meta) => {
31
- const tag = "[runtime-sdk]";
32
- if (level === "error") console.error(tag, message, meta ?? "");
33
- else if (level === "warn") console.warn(tag, message, meta ?? "");
34
- else console.debug(tag, message, meta ?? "");
35
- };
36
- function resolveConfig(config) {
37
- if (!config.baseUrl || typeof config.baseUrl !== "string") {
38
- throw new Error("[runtime-sdk] baseUrl is required");
39
- }
40
- const baseUrl = config.baseUrl.replace(/\/+$/, "");
41
- const debug = config.debug ?? false;
42
- const fetchImpl = config.fetchImpl ?? (typeof fetch !== "undefined" ? fetch.bind(globalThis) : void 0);
43
- if (!fetchImpl) {
44
- throw new Error(
45
- "[runtime-sdk] fetch is not available; pass fetchImpl in config"
46
- );
47
- }
48
- return {
49
- baseUrl,
50
- apiKey: config.apiKey,
51
- enabled: config.enabled ?? true,
52
- debug,
53
- batchSize: clamp(config.batchSize ?? 25, 1, 200),
54
- flushIntervalMs: clamp(config.flushIntervalMs ?? 5e3, 500, 6e4),
55
- maxQueueSize: clamp(config.maxQueueSize ?? 1e3, 50, 1e4),
56
- maxRetries: clamp(config.maxRetries ?? 2, 0, 5),
57
- requestTimeoutMs: clamp(config.requestTimeoutMs ?? 8e3, 1e3, 3e4),
58
- flushOnUnload: config.flushOnUnload ?? true,
59
- fetchImpl,
60
- logger: config.logger ?? (debug ? consoleLogger : noopLogger),
61
- onError: config.onError,
62
- headers: { ...config.headers ?? {} }
63
- };
64
- }
65
- function clamp(value, min, max) {
66
- if (!Number.isFinite(value)) return min;
67
- return Math.min(Math.max(value, min), max);
68
- }
69
- function buildHeaders(config, extra) {
70
- const headers = {
71
- "Content-Type": "application/json",
72
- ...config.headers,
73
- ...extra ?? {}
74
- };
75
- if (config.apiKey) headers["X-API-Key"] = config.apiKey;
76
- return headers;
77
- }
78
-
79
- // src/Functions/sdk/runtime-sdk/transport.ts
80
- var HttpError = class extends Error {
81
- constructor(status, body, retryAfterMs) {
82
- super(`HTTP ${status}: ${body.slice(0, 200)}`);
83
- this.status = status;
84
- this.body = body;
85
- this.retryAfterMs = retryAfterMs;
86
- this.name = "HttpError";
87
- }
88
- };
89
- async function request(config, options) {
90
- const url = new URL(config.baseUrl + options.path);
91
- if (options.query) {
92
- for (const [k, v] of Object.entries(options.query))
93
- url.searchParams.set(k, v);
94
- }
95
- const controller = new AbortController();
96
- const timer = setTimeout(() => controller.abort(), config.requestTimeoutMs);
97
- const signal = options.signal ?? controller.signal;
98
- try {
99
- const res = await config.fetchImpl(url.toString(), {
100
- method: options.method,
101
- headers: buildHeaders(config),
102
- body: options.body !== void 0 ? JSON.stringify(options.body) : void 0,
103
- signal
104
- });
105
- if (!res.ok) {
106
- const text = await safeText(res);
107
- const retryAfter = parseRetryAfter(res.headers.get("Retry-After"));
108
- throw new HttpError(res.status, text, retryAfter);
109
- }
110
- if (res.status === 204) return void 0;
111
- const ct = res.headers.get("content-type") ?? "";
112
- if (ct.includes("application/json")) return await res.json();
113
- return await safeText(res);
114
- } finally {
115
- clearTimeout(timer);
116
- }
117
- }
118
- async function requestWithRetry(config, options, phase) {
119
- let attempt = 0;
120
- let lastError;
121
- while (attempt <= config.maxRetries) {
122
- try {
123
- return await request(config, options);
124
- } catch (err) {
125
- lastError = err;
126
- attempt += 1;
127
- const shouldRetry = isRetryable(err) && attempt <= config.maxRetries;
128
- config.logger(
129
- shouldRetry ? "warn" : "error",
130
- `${options.method} ${options.path} failed (attempt ${attempt})`,
131
- err
132
- );
133
- config.onError?.(err, { phase, attempt });
134
- if (!shouldRetry) break;
135
- const delayMs = computeBackoff(err, attempt);
136
- await sleep(delayMs);
137
- }
138
- }
139
- throw lastError;
140
- }
141
- function isRetryable(err) {
142
- if (err instanceof HttpError) {
143
- return err.status === 429 || err.status >= 500;
144
- }
145
- if (err instanceof Error && (err.name === "AbortError" || err.name === "TypeError")) {
146
- return true;
147
- }
148
- return false;
149
- }
150
- function computeBackoff(err, attempt) {
151
- if (err instanceof HttpError && err.retryAfterMs !== void 0) {
152
- return err.retryAfterMs;
153
- }
154
- const base = 300;
155
- const jitter = Math.random() * 200;
156
- return Math.min(base * 2 ** (attempt - 1) + jitter, 1e4);
157
- }
158
- function parseRetryAfter(header) {
159
- if (!header) return void 0;
160
- const asSeconds = Number(header);
161
- if (!Number.isNaN(asSeconds)) return asSeconds * 1e3;
162
- const asDate = Date.parse(header);
163
- if (!Number.isNaN(asDate)) return Math.max(asDate - Date.now(), 0);
164
- return void 0;
165
- }
166
- async function safeText(res) {
167
- try {
168
- return await res.text();
169
- } catch {
170
- return "";
171
- }
172
- }
173
- function sleep(ms) {
174
- return new Promise((resolve) => setTimeout(resolve, ms));
175
- }
176
-
177
- // src/Functions/sdk/runtime-sdk/queue.ts
178
- var BatchQueue = class {
179
- /**
180
- * Создаёт очередь и, если `flushIntervalMs > 0`, запускает
181
- * периодический таймер флаша. Таймер будет тикать до тех пор,
182
- * пока не вызовут `destroy()`.
183
- */
184
- constructor(config) {
185
- this.config = config;
186
- if (config.flushIntervalMs > 0) {
187
- this.timer = setInterval(() => {
188
- void this.flush();
189
- }, config.flushIntervalMs);
190
- }
191
- }
192
- buffer = [];
193
- timer = null;
194
- inflight = null;
195
- destroyed = false;
196
- /**
197
- * Текущее количество событий в буфере (ещё не отправленных).
198
- * Полезно для метрик/дебага.
199
- */
200
- size() {
201
- return this.buffer.length;
202
- }
203
- /**
204
- * Добавить события в буфер.
205
- *
206
- * Триггеры автоматического флаша:
207
- * - буфер достиг `batchSize` → сразу уходит HTTP-запрос
208
- * - буфер превысил `maxQueueSize` → лишние **старые** события
209
- * дропаются (FIFO), чтобы не раздувать память при сбое сети
210
- *
211
- * После `destroy()` вызов игнорируется.
212
- */
213
- enqueue(logs) {
214
- if (this.destroyed) return;
215
- if (logs.length === 0) return;
216
- this.buffer.push(...logs);
217
- if (this.buffer.length > this.config.maxQueueSize) {
218
- const overflow = this.buffer.length - this.config.maxQueueSize;
219
- this.buffer.splice(0, overflow);
220
- this.config.logger(
221
- "warn",
222
- `queue overflow; dropped ${overflow} oldest events`
223
- );
224
- }
225
- if (this.buffer.length >= this.config.batchSize) {
226
- void this.flush();
227
- }
228
- }
229
- /**
230
- * Забрать всё из буфера и отправить одним батчем в
231
- * `POST /api/runtime/ingest`.
232
- *
233
- * Если уже есть активный in-flight запрос — возвращаем его же
234
- * промис (защита от параллельных флашей по таймеру и по размеру).
235
- *
236
- * Ошибки HTTP/сети сюда не всплывают — они проглатываются
237
- * после всех retry-попыток и логируются как 'error'. Дроп
238
- * целого батча при окончательном фейле — осознанный компромисс:
239
- * лучше потерять часть телеметрии, чем заблокировать очередь.
240
- */
241
- async flush() {
242
- if (this.destroyed) return;
243
- if (this.buffer.length === 0) return;
244
- if (this.inflight) return this.inflight;
245
- const batch = this.buffer.splice(0, this.buffer.length);
246
- this.inflight = (async () => {
247
- try {
248
- const body = { logs: batch };
249
- const res = await requestWithRetry(
250
- this.config,
251
- { method: "POST", path: "/api/runtime/ingest", body },
252
- "ingest"
253
- );
254
- this.config.logger("debug", `flushed ${batch.length} logs`, res);
255
- } catch (err) {
256
- this.config.logger(
257
- "error",
258
- `flush failed; dropping ${batch.length} logs`,
259
- err
260
- );
261
- } finally {
262
- this.inflight = null;
263
- }
264
- })();
265
- return this.inflight;
266
- }
267
- /**
268
- * Отправить буфер через `navigator.sendBeacon` при закрытии вкладки.
269
- *
270
- * В отличие от обычного `flush()`:
271
- * - fire-and-forget: нет ответа и нет retry
272
- * - браузер гарантирует доставку даже после того как страница
273
- * уже уничтожается (unload / pagehide)
274
- * - нет заголовка `X-API-Key` (sendBeacon не даёт менять headers,
275
- * но `Content-Type` нам выставляет сам тип Blob)
276
- *
277
- * Возвращает `true` если браузер принял пачку в свою очередь,
278
- * `false` при отсутствии API или отказе (например слишком
279
- * большой payload — лимит обычно 64 КБ).
280
- */
281
- flushBeacon() {
282
- if (this.destroyed) return false;
283
- if (this.buffer.length === 0) return true;
284
- if (typeof navigator === "undefined" || typeof navigator.sendBeacon !== "function") {
285
- return false;
286
- }
287
- const batch = this.buffer.splice(0, this.buffer.length);
288
- const body = { logs: batch };
289
- const blob = new Blob([JSON.stringify(body)], { type: "application/json" });
290
- const url = `${this.config.baseUrl}/api/runtime/ingest`;
291
- const ok = navigator.sendBeacon(url, blob);
292
- if (!ok)
293
- this.config.logger("warn", `sendBeacon rejected ${batch.length} logs`);
294
- return ok;
295
- }
296
- /**
297
- * Остановить очередь и освободить ресурсы.
298
- *
299
- * Чистит таймер флаша, обнуляет буфер, помечает инстанс
300
- * уничтоженным — последующие `enqueue`/`flush`/`flushBeacon`
301
- * становятся no-op. Идемпотентна.
302
- *
303
- * Важно: in-flight запрос, если он был запущен до `destroy`,
304
- * не отменяется — он либо завершится штатно, либо по таймауту
305
- * `requestTimeoutMs`.
306
- */
307
- destroy() {
308
- if (this.destroyed) return;
309
- this.destroyed = true;
310
- if (this.timer) {
311
- clearInterval(this.timer);
312
- this.timer = null;
313
- }
314
- this.buffer = [];
315
- }
316
- };
317
-
318
- // src/Functions/sdk/runtime-sdk/client.ts
319
- function createRuntimeClient(rawConfig) {
320
- const config = resolveConfig(rawConfig);
321
- const queue = new BatchQueue(config);
322
- let enabled = config.enabled;
323
- let unloadHandler = null;
324
- if (config.flushOnUnload && typeof window !== "undefined" && typeof window.addEventListener === "function") {
325
- unloadHandler = () => {
326
- queue.flushBeacon();
327
- };
328
- window.addEventListener("pagehide", unloadHandler);
329
- window.addEventListener("beforeunload", unloadHandler);
330
- }
331
- const client = {
332
- /**
333
- * Поставить одно событие в очередь на отправку.
334
- *
335
- * Не делает HTTP-запрос сразу: событие попадает в батч и уйдёт
336
- * либо при достижении `batchSize`, либо по таймеру `flushIntervalMs`,
337
- * либо при закрытии вкладки (`sendBeacon`).
338
- *
339
- * Если клиент выключен (`enabled=false`) — вызов игнорируется.
340
- */
341
- track(log) {
342
- if (!enabled) return;
343
- queue.enqueue([log]);
344
- },
345
- /**
346
- * Поставить сразу пачку событий в очередь.
347
- *
348
- * Удобно когда набрали события где-то локально (interceptor,
349
- * буфер в компоненте и т.п.) и хотим отдать их все разом.
350
- * Если итоговый размер очереди превысил `maxQueueSize` —
351
- * старые события будут выброшены (FIFO drop).
352
- */
353
- trackMany(logs) {
354
- if (!enabled) return;
355
- queue.enqueue(logs);
356
- },
357
- /**
358
- * Принудительно отправить всё что сейчас в очереди.
359
- *
360
- * Возвращает промис, резолвящийся после завершения HTTP-запроса
361
- * (успешного или нет — SDK проглатывает ошибки). Полезно перед
362
- * критичными переходами: logout, route change, submit формы.
363
- *
364
- * Если очередь пуста или клиент выключен — no-op.
365
- */
366
- async flush() {
367
- if (!enabled) return;
368
- await queue.flush();
369
- },
370
- /**
371
- * Удалить накопленные runtime-логи на сервере по фильтру.
372
- *
373
- * В отличие от `track`, идёт напрямую в `DELETE /api/runtime/logs`
374
- * без очереди и батчинга — это низкочастотная административная
375
- * операция.
376
- *
377
- * Фильтр — дискриминированный union:
378
- * - REST: `{ service, type: 'rest', path, method }`
379
- * - WS: `{ service, type: 'ws', event }`
380
- *
381
- * Возвращает `{ deleted: N }`. При сетевой ошибке/5xx/429
382
- * произойдёт до `maxRetries` повторов с бэкоффом.
383
- */
384
- async deleteLogs(filter) {
385
- const query = toDeleteQuery(filter);
386
- return requestWithRetry(
387
- config,
388
- { method: "DELETE", path: "/api/runtime/logs", query },
389
- "delete"
390
- );
391
- },
392
- /**
393
- * Возвращает текущее состояние флага `enabled`.
394
- *
395
- * Пригодится для дев-тулзов/отладочных панелей, где видно
396
- * активен ли сбор телеметрии в рантайме.
397
- */
398
- isEnabled() {
399
- return enabled;
400
- },
401
- /**
402
- * Включить/выключить сбор событий на ходу.
403
- *
404
- * Используется для opt-out по согласию пользователя (cookie consent),
405
- * для временного отключения при инцидентах, или для точечного
406
- * включения через debug-панель.
407
- *
408
- * Выключение не чистит уже накопленную очередь — только перестаёт
409
- * принимать новые события. Полный сброс — через `destroy()`.
410
- */
411
- setEnabled(next) {
412
- enabled = next;
413
- config.logger("debug", `enabled=${next}`);
414
- },
415
- /**
416
- * Полностью освободить ресурсы клиента.
417
- *
418
- * Останавливает таймер флаша, отписывается от `pagehide`/
419
- * `beforeunload`, очищает буфер. Повторные вызовы безопасны.
420
- *
421
- * Обычно не требуется — клиент живёт всё время жизни вкладки.
422
- * Полезно в SSR/тестах и при hot-reload'е на деве, чтобы не
423
- * плодить дубликаты listener'ов.
424
- */
425
- destroy() {
426
- if (unloadHandler && typeof window !== "undefined") {
427
- window.removeEventListener("pagehide", unloadHandler);
428
- window.removeEventListener("beforeunload", unloadHandler);
429
- unloadHandler = null;
430
- }
431
- queue.destroy();
432
- }
433
- };
434
- return client;
435
- }
436
- function toDeleteQuery(filter) {
437
- if (filter.type === "rest") {
438
- return {
439
- service: filter.service,
440
- type: "rest",
441
- path: filter.path,
442
- method: filter.method
443
- };
444
- }
445
- return {
446
- service: filter.service,
447
- type: "ws",
448
- event: filter.event
449
- };
450
- }
451
- //# sourceMappingURL=sdk.cjs.map