intelicoreact 2.0.20 → 2.0.21

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 (210) hide show
  1. package/dist/es/Atomic/FormElements/ActionAlert/ActionAlert.js.map +1 -1
  2. package/dist/es/Atomic/FormElements/AdvancedStatus/AdvancedStatus.js.map +1 -1
  3. package/dist/es/Atomic/FormElements/Calendar/Calendar.js +2 -1
  4. package/dist/es/Atomic/FormElements/Calendar/Calendar.js.map +1 -1
  5. package/dist/es/Atomic/FormElements/CheckboxInput/CheckboxInput.js.map +1 -1
  6. package/dist/es/Atomic/FormElements/CheckboxesLine/CheckboxesLine.js.map +1 -1
  7. package/dist/es/Atomic/FormElements/Datepicker/Datepicker.js +5 -4
  8. package/dist/es/Atomic/FormElements/Datepicker/Datepicker.js.map +1 -1
  9. package/dist/es/Atomic/FormElements/Datepicker/components/DatepickerCalendar.js +2 -1
  10. package/dist/es/Atomic/FormElements/Datepicker/components/DatepickerCalendar.js.map +1 -1
  11. package/dist/es/Atomic/FormElements/Dropdown/Dropdown.js +35 -26
  12. package/dist/es/Atomic/FormElements/Dropdown/Dropdown.js.map +1 -1
  13. package/dist/es/Atomic/FormElements/Dropdown/_utils.js +14 -9
  14. package/dist/es/Atomic/FormElements/Dropdown/_utils.js.map +1 -1
  15. package/dist/es/Atomic/FormElements/DropdownLiveSearch/DropdownLiveSearch.js.map +1 -1
  16. package/dist/es/Atomic/FormElements/FileLoader/FileLoader.js.map +1 -1
  17. package/dist/es/Atomic/FormElements/FileLoader/partial/LoadZone.js +1 -1
  18. package/dist/es/Atomic/FormElements/FileLoader/partial/LoadZone.js.map +1 -1
  19. package/dist/es/Atomic/FormElements/FileLoader/partial/LoadedContent.js +15 -13
  20. package/dist/es/Atomic/FormElements/FileLoader/partial/LoadedContent.js.map +1 -1
  21. package/dist/es/Atomic/FormElements/FileLoaderDescription/FileLoaderDescription.js +1 -1
  22. package/dist/es/Atomic/FormElements/FileLoaderDescription/FileLoaderDescription.js.map +1 -1
  23. package/dist/es/Atomic/FormElements/FileLoaderLocal/FileLoaderLocal.js +23 -19
  24. package/dist/es/Atomic/FormElements/FileLoaderLocal/FileLoaderLocal.js.map +1 -1
  25. package/dist/es/Atomic/FormElements/FileLoaderLocalGroup/FileLoaderLocalGroup.js +1 -1
  26. package/dist/es/Atomic/FormElements/FileLoaderLocalGroup/FileLoaderLocalGroup.js.map +1 -1
  27. package/dist/es/Atomic/FormElements/FormattedRawSSN/FormattedRawSSN.js.map +1 -1
  28. package/dist/es/Atomic/FormElements/Input/Input.js.map +1 -1
  29. package/dist/es/Atomic/FormElements/Input/hooks/useInputValueProcessing.js +0 -1
  30. package/dist/es/Atomic/FormElements/Input/hooks/useInputValueProcessing.js.map +1 -1
  31. package/dist/es/Atomic/FormElements/InputCalendar/InputCalendar.js.map +1 -1
  32. package/dist/es/Atomic/FormElements/InputColor/InputColor.js.map +1 -1
  33. package/dist/es/Atomic/FormElements/InputCurrency/InputCurrency.js +28 -25
  34. package/dist/es/Atomic/FormElements/InputCurrency/InputCurrency.js.map +1 -1
  35. package/dist/es/Atomic/FormElements/InputDateRange/InputDateRange.js +2 -1
  36. package/dist/es/Atomic/FormElements/InputDateRange/InputDateRange.js.map +1 -1
  37. package/dist/es/Atomic/FormElements/InputDateRange/components/DateInput.js.map +1 -1
  38. package/dist/es/Atomic/FormElements/InputDateRange/components/Datepicker.js.map +1 -1
  39. package/dist/es/Atomic/FormElements/InputDateRange/components/OpenedPart.js.map +1 -1
  40. package/dist/es/Atomic/FormElements/InputDateRange/components/SelectItem.js.map +1 -1
  41. package/dist/es/Atomic/FormElements/InputLink/InputLink.js.map +1 -1
  42. package/dist/es/Atomic/FormElements/InputMask3/InputMask3.js +16 -14
  43. package/dist/es/Atomic/FormElements/InputMask3/InputMask3.js.map +1 -1
  44. package/dist/es/Atomic/FormElements/InputWithAction/InputWithAction.js.map +1 -1
  45. package/dist/es/Atomic/FormElements/InputsRow/InputsRow.js +3 -2
  46. package/dist/es/Atomic/FormElements/InputsRow/InputsRow.js.map +1 -1
  47. package/dist/es/Atomic/FormElements/Label/Label.js.map +1 -1
  48. package/dist/es/Atomic/FormElements/MobileCalendar/MobileCalendar.js.map +1 -1
  49. package/dist/es/Atomic/FormElements/MultiSelect/MultiSelect.js.map +1 -1
  50. package/dist/es/Atomic/FormElements/RadioGroup/RadioGroup.js.map +1 -1
  51. package/dist/es/Atomic/FormElements/RadioGroupWithInput/RadioGroupWithInput.js.map +1 -1
  52. package/dist/es/Atomic/FormElements/RadioInput/RadioInput.js.map +1 -1
  53. package/dist/es/Atomic/FormElements/RadioRowSwitcher/RadioRowSwitcher.js.map +1 -1
  54. package/dist/es/Atomic/FormElements/RangeCalendar/RangeCalendar.js +2 -1
  55. package/dist/es/Atomic/FormElements/RangeCalendar/RangeCalendar.js.map +1 -1
  56. package/dist/es/Atomic/FormElements/RangeInputs/RangeInputs.js.map +1 -1
  57. package/dist/es/Atomic/FormElements/RangeList/RangeList.js.map +1 -1
  58. package/dist/es/Atomic/FormElements/RangeList/partial/RangeListRow.js.map +1 -1
  59. package/dist/es/Atomic/FormElements/RangeSlider/RangeSlider.js +9 -6
  60. package/dist/es/Atomic/FormElements/RangeSlider/RangeSlider.js.map +1 -1
  61. package/dist/es/Atomic/FormElements/RangeSlider2/RangeSlider2.js +4 -2
  62. package/dist/es/Atomic/FormElements/RangeSlider2/RangeSlider2.js.map +1 -1
  63. package/dist/es/Atomic/FormElements/SwitchableRow/SwitchableRow.js.map +1 -1
  64. package/dist/es/Atomic/FormElements/Switcher/Switcher.js.map +1 -1
  65. package/dist/es/Atomic/FormElements/SwitcherCheckbox/SwitcherCheckbox.js.map +1 -1
  66. package/dist/es/Atomic/FormElements/SwitcherHide/SwitcherHide.js.map +1 -1
  67. package/dist/es/Atomic/FormElements/SwitcherRadio/SwitcherRadio.js.map +1 -1
  68. package/dist/es/Atomic/FormElements/SwitcherRange/SwitcherRange.js.map +1 -1
  69. package/dist/es/Atomic/FormElements/SwitcherRangeList/SwitcherRangeList.js.map +1 -1
  70. package/dist/es/Atomic/FormElements/SwitcherTagsDropdown/SwitcherTagsDropdown.js.map +1 -1
  71. package/dist/es/Atomic/FormElements/SwitcherTextarea/SwitcherTextarea.js.map +1 -1
  72. package/dist/es/Atomic/FormElements/TagsDropdown/TagsDropdown.js.map +1 -1
  73. package/dist/es/Atomic/FormElements/Text/Text.js.map +1 -1
  74. package/dist/es/Atomic/FormElements/TextSwitcher/TextSwitcher.js.map +1 -1
  75. package/dist/es/Atomic/FormElements/Textarea/Textarea.js.map +1 -1
  76. package/dist/es/Atomic/FormElements/TieredCheckboxes/TieredCheckboxes.js +4 -2
  77. package/dist/es/Atomic/FormElements/TieredCheckboxes/TieredCheckboxes.js.map +1 -1
  78. package/dist/es/Atomic/FormElements/TieredCheckboxes/partial/AccordionWithCheckbox.js.map +1 -1
  79. package/dist/es/Atomic/FormElements/TimeRange/TimeRange.js.map +1 -1
  80. package/dist/es/Atomic/FormElements/UserContacts/UserContacts.js.map +1 -1
  81. package/dist/es/Atomic/Layout/Header/Header.js.map +1 -1
  82. package/dist/es/Atomic/Layout/MainMenu/MainMenu.js.map +1 -1
  83. package/dist/es/Atomic/Layout/Spinner/Spinner.js.map +1 -1
  84. package/dist/es/Atomic/UI/Accordion/Accordion.js.map +1 -1
  85. package/dist/es/Atomic/UI/Accordion/AccordionItem.js.map +1 -1
  86. package/dist/es/Atomic/UI/AdvancedTag/AdvTag.js +2 -1
  87. package/dist/es/Atomic/UI/AdvancedTag/AdvTag.js.map +1 -1
  88. package/dist/es/Atomic/UI/AdvancedTag/AdvancedTags.js.map +1 -1
  89. package/dist/es/Atomic/UI/Alert/Alert.js.map +1 -1
  90. package/dist/es/Atomic/UI/Arrow/Arrow.js.map +1 -1
  91. package/dist/es/Atomic/UI/Button/Button.js.map +1 -1
  92. package/dist/es/Atomic/UI/ButtonsBar/ButtonsBar.js.map +1 -1
  93. package/dist/es/Atomic/UI/Chart/Chart.js +2 -1
  94. package/dist/es/Atomic/UI/Chart/Chart.js.map +1 -1
  95. package/dist/es/Atomic/UI/Chart/partial/ChartTypeSwitcherIcon/ChartTypeSwitcherIcon.js.map +1 -1
  96. package/dist/es/Atomic/UI/Chart/partial/utils.js +2 -1
  97. package/dist/es/Atomic/UI/Chart/partial/utils.js.map +1 -1
  98. package/dist/es/Atomic/UI/DateTime/DateTime.js.map +1 -1
  99. package/dist/es/Atomic/UI/DebugContainer/DebugContainer.js.map +1 -1
  100. package/dist/es/Atomic/UI/DoubleString/DoubleString.js.map +1 -1
  101. package/dist/es/Atomic/UI/Hint/Hint.js +4 -6
  102. package/dist/es/Atomic/UI/Hint/Hint.js.map +1 -1
  103. package/dist/es/Atomic/UI/Hint/partials/_utils.js.map +1 -1
  104. package/dist/es/Atomic/UI/Modal/Modal.js.map +1 -1
  105. package/dist/es/Atomic/UI/Modal/ModalHOC.js.map +1 -1
  106. package/dist/es/Atomic/UI/Modal/partials/ModalTitle.js.map +1 -1
  107. package/dist/es/Atomic/UI/Modal/partials/_constants.js.map +1 -1
  108. package/dist/es/Atomic/UI/Modal/partials/_utils.js +1 -4
  109. package/dist/es/Atomic/UI/Modal/partials/_utils.js.map +1 -1
  110. package/dist/es/Atomic/UI/Modal/partials/useMobileModal.js +8 -6
  111. package/dist/es/Atomic/UI/Modal/partials/useMobileModal.js.map +1 -1
  112. package/dist/es/Atomic/UI/NavLine/NavLine.js.map +1 -1
  113. package/dist/es/Atomic/UI/PageTitle/PageTitle.js.map +1 -1
  114. package/dist/es/Atomic/UI/Price/Price.js.map +1 -1
  115. package/dist/es/Atomic/UI/PriceRange/PriceRange.js.map +1 -1
  116. package/dist/es/Atomic/UI/ProgressLine/ProgressLine.js.map +1 -1
  117. package/dist/es/Atomic/UI/Status/Status.js.map +1 -1
  118. package/dist/es/Atomic/UI/Tag/Tag.js.map +1 -1
  119. package/dist/es/Atomic/UI/TagList/TagList.js.map +1 -1
  120. package/dist/es/Atomic/UI/UserBox/UserBox.js.map +1 -1
  121. package/dist/es/Atomic/UI/WizardStepper/ui/StateIcon/StateIcon.js.map +1 -1
  122. package/dist/es/Atomic/UI/WizardStepper/ui/StepRow/StepRow.js.map +1 -1
  123. package/dist/es/Atomic/UI/WizardStepper/ui/StepWrapper/StepWrapper.js.map +1 -1
  124. package/dist/es/Atomic/UI/WizardStepper/ui/icons.js.map +1 -1
  125. package/dist/es/Classes/RESTAPI/partials/CredentialsProcessing.js +4 -2
  126. package/dist/es/Classes/RESTAPI/partials/CredentialsProcessing.js.map +1 -1
  127. package/dist/es/Classes/RESTAPI/partials/sse.js +4 -7
  128. package/dist/es/Classes/RESTAPI/partials/sse.js.map +1 -1
  129. package/dist/es/Functions/fieldValueFormatters.js +1 -3
  130. package/dist/es/Functions/fieldValueFormatters.js.map +1 -1
  131. package/dist/es/Functions/operations.js +22 -20
  132. package/dist/es/Functions/operations.js.map +1 -1
  133. package/dist/es/Functions/useFormTools/form-drivers/ObjectWithIterableObjects.js +8 -6
  134. package/dist/es/Functions/useFormTools/form-drivers/ObjectWithIterableObjects.js.map +1 -1
  135. package/dist/es/Functions/useFormTools/functions/General.js +8 -6
  136. package/dist/es/Functions/useFormTools/functions/General.js.map +1 -1
  137. package/dist/es/Functions/useFormTools/functions/RenderFields.js +6 -5
  138. package/dist/es/Functions/useFormTools/functions/RenderFields.js.map +1 -1
  139. package/dist/es/Functions/useFormTools/index.js +1 -4
  140. package/dist/es/Functions/useFormTools/index.js.map +1 -1
  141. package/dist/es/Functions/utils.js +2 -1
  142. package/dist/es/Functions/utils.js.map +1 -1
  143. package/dist/es/Molecular/CustomIcons/components/AffiliateNetworks.js.map +1 -1
  144. package/dist/es/Molecular/CustomIcons/components/AlertCircle.js.map +1 -1
  145. package/dist/es/Molecular/CustomIcons/components/AppStore.js.map +1 -1
  146. package/dist/es/Molecular/CustomIcons/components/Arrow.js.map +1 -1
  147. package/dist/es/Molecular/CustomIcons/components/ArrowDown.js.map +1 -1
  148. package/dist/es/Molecular/CustomIcons/components/ArrowLeft.js.map +1 -1
  149. package/dist/es/Molecular/CustomIcons/components/ArrowRight.js.map +1 -1
  150. package/dist/es/Molecular/CustomIcons/components/ArrowUp.js.map +1 -1
  151. package/dist/es/Molecular/CustomIcons/components/Bell.js.map +1 -1
  152. package/dist/es/Molecular/CustomIcons/components/Button.js.map +1 -1
  153. package/dist/es/Molecular/CustomIcons/components/Campaigns.js.map +1 -1
  154. package/dist/es/Molecular/CustomIcons/components/Check.js.map +1 -1
  155. package/dist/es/Molecular/CustomIcons/components/Check2.js.map +1 -1
  156. package/dist/es/Molecular/CustomIcons/components/ChevronDown.js.map +1 -1
  157. package/dist/es/Molecular/CustomIcons/components/ChevronDownDisabled.js.map +1 -1
  158. package/dist/es/Molecular/CustomIcons/components/ChevronLeft.js.map +1 -1
  159. package/dist/es/Molecular/CustomIcons/components/ChevronRight.js.map +1 -1
  160. package/dist/es/Molecular/CustomIcons/components/ChevronUp.js.map +1 -1
  161. package/dist/es/Molecular/CustomIcons/components/ChevronUpDown.js.map +1 -1
  162. package/dist/es/Molecular/CustomIcons/components/Close.js.map +1 -1
  163. package/dist/es/Molecular/CustomIcons/components/ColumnsOrder.js.map +1 -1
  164. package/dist/es/Molecular/CustomIcons/components/Delete.js.map +1 -1
  165. package/dist/es/Molecular/CustomIcons/components/Edit.js.map +1 -1
  166. package/dist/es/Molecular/CustomIcons/components/Email.js.map +1 -1
  167. package/dist/es/Molecular/CustomIcons/components/FinturfLogo.js.map +1 -1
  168. package/dist/es/Molecular/CustomIcons/components/FinturfLogo2.js.map +1 -1
  169. package/dist/es/Molecular/CustomIcons/components/Flows.js.map +1 -1
  170. package/dist/es/Molecular/CustomIcons/components/Gift.js.map +1 -1
  171. package/dist/es/Molecular/CustomIcons/components/GoogleAuth.js.map +1 -1
  172. package/dist/es/Molecular/CustomIcons/components/GooglePlay.js.map +1 -1
  173. package/dist/es/Molecular/CustomIcons/components/HelpCircle.js.map +1 -1
  174. package/dist/es/Molecular/CustomIcons/components/HelpCircle2.js.map +1 -1
  175. package/dist/es/Molecular/CustomIcons/components/HelpCircleFilled.js.map +1 -1
  176. package/dist/es/Molecular/CustomIcons/components/Home.js.map +1 -1
  177. package/dist/es/Molecular/CustomIcons/components/Home2.js.map +1 -1
  178. package/dist/es/Molecular/CustomIcons/components/Key.js.map +1 -1
  179. package/dist/es/Molecular/CustomIcons/components/Landers.js.map +1 -1
  180. package/dist/es/Molecular/CustomIcons/components/Lock.js.map +1 -1
  181. package/dist/es/Molecular/CustomIcons/components/Mail.js.map +1 -1
  182. package/dist/es/Molecular/CustomIcons/components/Mastercard.js.map +1 -1
  183. package/dist/es/Molecular/CustomIcons/components/Minus.js.map +1 -1
  184. package/dist/es/Molecular/CustomIcons/components/Offers.js.map +1 -1
  185. package/dist/es/Molecular/CustomIcons/components/Pause.js.map +1 -1
  186. package/dist/es/Molecular/CustomIcons/components/PayPal.js.map +1 -1
  187. package/dist/es/Molecular/CustomIcons/components/PayPalLightLarge.js.map +1 -1
  188. package/dist/es/Molecular/CustomIcons/components/Phone.js.map +1 -1
  189. package/dist/es/Molecular/CustomIcons/components/Play.js.map +1 -1
  190. package/dist/es/Molecular/CustomIcons/components/Plus.js.map +1 -1
  191. package/dist/es/Molecular/CustomIcons/components/Profile.js.map +1 -1
  192. package/dist/es/Molecular/CustomIcons/components/QRCode.js.map +1 -1
  193. package/dist/es/Molecular/CustomIcons/components/Rectangle.js.map +1 -1
  194. package/dist/es/Molecular/CustomIcons/components/Revert.js.map +1 -1
  195. package/dist/es/Molecular/CustomIcons/components/Star.js.map +1 -1
  196. package/dist/es/Molecular/CustomIcons/components/Star2.js.map +1 -1
  197. package/dist/es/Molecular/CustomIcons/components/TrafficSources.js.map +1 -1
  198. package/dist/es/Molecular/CustomIcons/components/Trash.js.map +1 -1
  199. package/dist/es/Molecular/CustomIcons/components/TrashRed.js.map +1 -1
  200. package/dist/es/Molecular/CustomIcons/components/Triggers.js.map +1 -1
  201. package/dist/es/Molecular/CustomIcons/components/User.js.map +1 -1
  202. package/dist/es/Molecular/CustomIcons/components/Visa.js.map +1 -1
  203. package/dist/es/Molecular/CustomIcons/components/X.js.map +1 -1
  204. package/dist/es/Molecular/FormElement/FormElement.js.map +1 -1
  205. package/dist/es/Molecular/InputAddress/InputAddress.js +24 -19
  206. package/dist/es/Molecular/InputAddress/InputAddress.js.map +1 -1
  207. package/dist/es/Molecular/InputCustomFetch/InputCustomFetch.js +17 -11
  208. package/dist/es/Molecular/InputCustomFetch/InputCustomFetch.js.map +1 -1
  209. package/dist/es/Molecular/InputPassword/InputPassword.js.map +1 -1
  210. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"UserBox.js","names":[],"sources":["../../../../../src/Atomic/UI/UserBox/UserBox.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { IUserBoxProps } from './UserBox.interface';\nimport cn from 'classnames';\n\nimport React from 'react';\nimport { getColorById } from '../../../Functions/utils';\n\nimport Label from '../../FormElements/Label/Label';\nimport Button from '../Button/Button';\n\nimport './UserBox.scss';\n\nconst UserBox: React.FC<IUserBoxProps> = ({\n name = 'Username',\n role,\n id,\n onClick,\n isModal,\n className,\n colors,\n testId = 'userbox',\n}) => {\n const getNameFirstLetter = name.charAt(0).toUpperCase();\n\n const renderUser = (): ReactNode => {\n if (isModal) {\n return (\n <>\n <div style={{ backgroundColor: getColorById(id, colors) }} className=\"td-user-box__avatar\">\n {getNameFirstLetter}\n </div>\n <div className=\"td-user-box__user-data\">\n <Button className=\"p0 no-shadow\" onClick={onClick} label={name} variant=\"link\" />\n {role && <span>{role}</span>}\n </div>\n </>\n );\n }\n else {\n return (\n <>\n <div style={{ backgroundColor: getColorById(id) }} className=\"td-user-box__avatar\">\n {getNameFirstLetter}\n </div>\n <div className=\"td-user-box__user-data\">\n <Label label={name} />\n {role && <span aria-label={`User role: ${role}`}>{role}</span>}\n </div>\n </>\n );\n }\n };\n\n return (\n <div\n data-testid={testId}\n className={cn('td-user-box', className)}\n role=\"region\"\n aria-label={`User box for ${name}`}\n >\n {renderUser()}\n </div>\n );\n};\n\nexport default UserBox;\n"],"mappings":";;;;;;;;AAYA,IAAM,WAAoC,EACxC,OAAO,YACP,MACA,IACA,SACA,SACA,WACA,QACA,SAAS,gBACL;CACJ,MAAM,qBAAqB,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY;CAEtD,MAAM,mBAA8B;EAClC,IAAI,SACF,OACE,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,OAAD;GAAK,OAAO,EAAE,iBAAiB,aAAa,IAAI,MAAM,EAAE;GAAG,WAAU;aAClE;EACE,CAAA,GACL,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,QAAD;IAAQ,WAAU;IAAwB;IAAS,OAAO;IAAM,SAAQ;GAAQ,CAAA,GAC/E,QAAQ,oBAAC,QAAD,EAAA,UAAO,KAAW,CAAA,CACxB;IACL,EAAA,CAAA;OAIJ,OACE,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,OAAD;GAAK,OAAO,EAAE,iBAAiB,aAAa,EAAE,EAAE;GAAG,WAAU;aAC1D;EACE,CAAA,GACL,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,OAAD,EAAO,OAAO,KAAO,CAAA,GACpB,QAAQ,oBAAC,QAAD;IAAM,cAAY,cAAc;cAAS;GAAW,CAAA,CAC1D;IACL,EAAA,CAAA;CAGR;CAEA,OACE,oBAAC,OAAD;EACE,eAAa;EACb,WAAW,GAAG,eAAe,SAAS;EACtC,MAAK;EACL,cAAY,gBAAgB;YAE3B,WAAW;CACT,CAAA;AAET"}
1
+ {"version":3,"file":"UserBox.js","names":[],"sources":["../../../../../src/Atomic/UI/UserBox/UserBox.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { IUserBoxProps } from './UserBox.interface';\nimport cn from 'classnames';\n\nimport React from 'react';\nimport { getColorById } from '../../../Functions/utils';\n\nimport Label from '../../FormElements/Label/Label';\nimport Button from '../Button/Button';\n\nimport './UserBox.scss';\n\nconst UserBox: React.FC<IUserBoxProps> = ({\n name = 'Username',\n role,\n id,\n onClick,\n isModal,\n className,\n colors,\n testId = 'userbox',\n}) => {\n const getNameFirstLetter = name.charAt(0).toUpperCase();\n\n const renderUser = (): ReactNode => {\n if (isModal) {\n return (\n <>\n <div style={{ backgroundColor: getColorById(id, colors) }} className=\"td-user-box__avatar\">\n {getNameFirstLetter}\n </div>\n <div className=\"td-user-box__user-data\">\n <Button className=\"p0 no-shadow\" onClick={onClick} label={name} variant=\"link\" />\n {role && <span>{role}</span>}\n </div>\n </>\n );\n }\n else {\n return (\n <>\n <div style={{ backgroundColor: getColorById(id) }} className=\"td-user-box__avatar\">\n {getNameFirstLetter}\n </div>\n <div className=\"td-user-box__user-data\">\n <Label label={name} />\n {role && <span aria-label={`User role: ${role}`}>{role}</span>}\n </div>\n </>\n );\n }\n };\n\n return (\n <div\n data-testid={testId}\n className={cn('td-user-box', className)}\n role=\"region\"\n aria-label={`User box for ${name}`}\n >\n {renderUser()}\n </div>\n );\n};\n\nexport default UserBox;\n"],"mappings":";;;;;;;;AAYA,IAAM,WAAoC,EACxC,OAAO,YACP,MACA,IACA,SACA,SACA,WACA,QACA,SAAS,gBACL;CACJ,MAAM,qBAAqB,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY;CAEtD,MAAM,mBAA8B;EAClC,IAAI,SACF,OACE,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,OAAD;GAAK,OAAO,EAAE,iBAAiB,aAAa,IAAI,MAAM,EAAE;GAAG,WAAU;GAClE,UAAA;EACE,CAAA,GACL,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,oBAAC,QAAD;IAAQ,WAAU;IAAwB;IAAS,OAAO;IAAM,SAAQ;GAAQ,CAAA,GAC/E,QAAQ,oBAAC,QAAD,EAAA,UAAO,KAAW,CAAA,CACxB;EACL,CAAA,CAAA,EAAA,CAAA;OAIJ,OACE,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,OAAD;GAAK,OAAO,EAAE,iBAAiB,aAAa,EAAE,EAAE;GAAG,WAAU;GAC1D,UAAA;EACE,CAAA,GACL,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,oBAAC,OAAD,EAAO,OAAO,KAAO,CAAA,GACpB,QAAQ,oBAAC,QAAD;IAAM,cAAY,cAAc;IAAS,UAAA;GAAW,CAAA,CAC1D;EACL,CAAA,CAAA,EAAA,CAAA;CAGR;CAEA,OACE,oBAAC,OAAD;EACE,eAAa;EACb,WAAW,GAAG,eAAe,SAAS;EACtC,MAAK;EACL,cAAY,gBAAgB;EAE3B,UAAA,WAAW;CACT,CAAA;AAET"}
@@ -1 +1 @@
1
- {"version":3,"file":"StateIcon.js","names":[],"sources":["../../../../../../../src/Atomic/UI/WizardStepper/ui/StateIcon/StateIcon.tsx"],"sourcesContent":["import type { IStateIconProps } from '../../WizardStepper.interface';\nimport cn from 'classnames';\n\nimport React from 'react';\nimport { WIZARD_STEP_VARIANTS } from '../../constructor';\n\nimport './StateIcon.scss';\n\nconst DefaultPoint: React.FC = () => {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <circle cx=\"8\" cy=\"8\" r=\"4\" />\n </svg>\n );\n};\n\nconst DonePoint: React.FC = () => {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M12.5 5L7 10.5L4 7.5\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n};\n\nconst RC = 'state-icon';\n\nconst { ACTIVE, DEFAULT, DONE } = WIZARD_STEP_VARIANTS;\n\nexport const StateIcon: React.FC<IStateIconProps> = ({ variant = DEFAULT, className }) => {\n const computedState = variant === ACTIVE || variant === DONE ? variant : DEFAULT;\n\n const Inner = {\n [DEFAULT]: <DefaultPoint />,\n [ACTIVE]: <DefaultPoint />,\n [DONE]: <DonePoint />,\n };\n\n return <div className={cn(RC, `${RC}--${computedState}`, className)}>{Inner[computedState]}</div>;\n};\n"],"mappings":";;;;;;AAQA,IAAM,qBAA+B;CACnC,OACE,oBAAC,OAAD;EAAK,OAAM;EAAK,QAAO;EAAK,SAAQ;EAAY,MAAK;YACnD,oBAAC,UAAD;GAAQ,IAAG;GAAI,IAAG;GAAI,GAAE;EAAK,CAAA;CAC1B,CAAA;AAET;AAEA,IAAM,kBAA4B;CAChC,OACE,oBAAC,OAAD;EAAK,OAAM;EAAK,QAAO;EAAK,SAAQ;EAAY,MAAK;YACnD,oBAAC,QAAD;GAAM,GAAE;GAAuB,aAAY;GAAI,eAAc;GAAQ,gBAAe;EAAS,CAAA;CAC1F,CAAA;AAET;AAEA,IAAM,KAAK;AAEX,IAAM,EAAE,QAAQ,SAAS,SAAS;AAElC,IAAa,aAAwC,EAAE,UAAU,SAAS,gBAAgB;CACxF,MAAM,gBAAgB,YAAY,UAAU,YAAY,OAAO,UAAU;CAEzE,MAAM,QAAQ;GACX,UAAU,oBAAC,cAAD,CAAe,CAAA;GACzB,SAAS,oBAAC,cAAD,CAAe,CAAA;GACxB,OAAO,oBAAC,WAAD,CAAY,CAAA;CACtB;CAEA,OAAO,oBAAC,OAAD;EAAK,WAAW,GAAG,IAAI,GAAG,GAAG,IAAI,iBAAiB,SAAS;YAAI,MAAM;CAAoB,CAAA;AAClG"}
1
+ {"version":3,"file":"StateIcon.js","names":[],"sources":["../../../../../../../src/Atomic/UI/WizardStepper/ui/StateIcon/StateIcon.tsx"],"sourcesContent":["import type { IStateIconProps } from '../../WizardStepper.interface';\nimport cn from 'classnames';\n\nimport React from 'react';\nimport { WIZARD_STEP_VARIANTS } from '../../constructor';\n\nimport './StateIcon.scss';\n\nconst DefaultPoint: React.FC = () => {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <circle cx=\"8\" cy=\"8\" r=\"4\" />\n </svg>\n );\n};\n\nconst DonePoint: React.FC = () => {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M12.5 5L7 10.5L4 7.5\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n};\n\nconst RC = 'state-icon';\n\nconst { ACTIVE, DEFAULT, DONE } = WIZARD_STEP_VARIANTS;\n\nexport const StateIcon: React.FC<IStateIconProps> = ({ variant = DEFAULT, className }) => {\n const computedState = variant === ACTIVE || variant === DONE ? variant : DEFAULT;\n\n const Inner = {\n [DEFAULT]: <DefaultPoint />,\n [ACTIVE]: <DefaultPoint />,\n [DONE]: <DonePoint />,\n };\n\n return <div className={cn(RC, `${RC}--${computedState}`, className)}>{Inner[computedState]}</div>;\n};\n"],"mappings":";;;;;;AAQA,IAAM,qBAA+B;CACnC,OACE,oBAAC,OAAD;EAAK,OAAM;EAAK,QAAO;EAAK,SAAQ;EAAY,MAAK;EACnD,UAAA,oBAAC,UAAD;GAAQ,IAAG;GAAI,IAAG;GAAI,GAAE;EAAK,CAAA;CAC1B,CAAA;AAET;AAEA,IAAM,kBAA4B;CAChC,OACE,oBAAC,OAAD;EAAK,OAAM;EAAK,QAAO;EAAK,SAAQ;EAAY,MAAK;EACnD,UAAA,oBAAC,QAAD;GAAM,GAAE;GAAuB,aAAY;GAAI,eAAc;GAAQ,gBAAe;EAAS,CAAA;CAC1F,CAAA;AAET;AAEA,IAAM,KAAK;AAEX,IAAM,EAAE,QAAQ,SAAS,SAAS;AAElC,IAAa,aAAwC,EAAE,UAAU,SAAS,gBAAgB;CACxF,MAAM,gBAAgB,YAAY,UAAU,YAAY,OAAO,UAAU;CAEzE,MAAM,QAAQ;GACX,UAAU,oBAAC,cAAD,CAAe,CAAA;GACzB,SAAS,oBAAC,cAAD,CAAe,CAAA;GACxB,OAAO,oBAAC,WAAD,CAAY,CAAA;CACtB;CAEA,OAAO,oBAAC,OAAD;EAAK,WAAW,GAAG,IAAI,GAAG,GAAG,IAAI,iBAAiB,SAAS;EAAI,UAAA,MAAM;CAAoB,CAAA;AAClG"}
@@ -1 +1 @@
1
- {"version":3,"file":"StepRow.js","names":[],"sources":["../../../../../../../src/Atomic/UI/WizardStepper/ui/StepRow/StepRow.tsx"],"sourcesContent":["import type { IStepRowProps } from '../../WizardStepper.interface';\nimport cn from 'classnames';\nimport React from 'react';\nimport Status from '../../../Status/Status';\nimport { WIZARD_STEP_VARIANTS } from '../../constructor';\nimport StateIcon from '../StateIcon';\nimport './StepRow.scss';\n\nconst RC = 'step-row';\n\nconst { DEFAULT, ACTIVE, DONE } = WIZARD_STEP_VARIANTS;\n\nconst StepRow: React.FC<IStepRowProps> = ({\n label,\n description,\n className,\n isOptional,\n isFinished,\n isActive,\n titleSlot,\n contentSlot,\n customIcons,\n}) => {\n const title = label;\n\n const rowVariant = (() => {\n if (isActive) return ACTIVE;\n if (isFinished) return DONE;\n return DEFAULT;\n })();\n\n const alternaviteIconFromProps = (() => {\n if (isActive) return customIcons?.activeIcon;\n if (isFinished) return customIcons?.doneIcon;\n return customIcons?.defaultIcon;\n })();\n\n const CorrectIcon: React.FC = () => {\n if (!customIcons || Object?.values(customIcons)?.every(icon => !icon)) {\n return <StateIcon variant={rowVariant} />;\n }\n\n return alternaviteIconFromProps as React.ReactElement<any, any> || null;\n };\n\n return (\n <div key={label} className={cn(RC, `${RC}--${rowVariant}`, className)}>\n <div className={cn(`${RC}__state-point`, `${RC}__state-point--${rowVariant}`)}>\n <CorrectIcon />\n </div>\n\n <div className={`${RC}__content`}>\n <div className={`${RC}__title`}>\n <div className={`${RC}__title-left`}>\n <div className={cn(`${RC}__title-text`, { 'text-muted': rowVariant === DEFAULT })}>\n {title}\n </div>\n {isOptional && <Status label=\"Optional\" status=\"draft\" />}\n </div>\n\n {titleSlot && (\n <div className={`${RC}__title-right`}>\n {titleSlot}\n </div>\n )}\n </div>\n\n {description && <div className={`${RC}__description`}>{description}</div>}\n {contentSlot && <div className={`${RC}__body`}>{contentSlot}</div>}\n </div>\n </div>\n );\n};\n\nexport default StepRow;\n"],"mappings":";;;;;;;;AAQA,IAAM,KAAK;AAEX,IAAM,EAAE,SAAS,QAAQ,SAAS;AAElC,IAAM,WAAoC,EACxC,OACA,aACA,WACA,YACA,YACA,UACA,WACA,aACA,kBACI;CACJ,MAAM,QAAQ;CAEd,MAAM,oBAAoB;EACxB,IAAI,UAAU,OAAO;EACrB,IAAI,YAAY,OAAO;EACvB,OAAO;CACT,EAAA,CAAG;CAEH,MAAM,kCAAkC;EACtC,IAAI,UAAU,OAAO,aAAa;EAClC,IAAI,YAAY,OAAO,aAAa;EACpC,OAAO,aAAa;CACtB,EAAA,CAAG;CAEH,MAAM,oBAA8B;EAClC,IAAI,CAAC,eAAe,QAAQ,OAAO,WAAW,CAAC,EAAE,OAAM,SAAQ,CAAC,IAAI,GAClE,OAAO,oBAAC,mBAAD,EAAW,SAAS,WAAa,CAAA;EAG1C,OAAO,4BAA4D;CACrE;CAEA,OACE,qBAAC,OAAD;EAAiB,WAAW,GAAG,IAAI,GAAG,GAAG,IAAI,cAAc,SAAS;YAApE,CACE,oBAAC,OAAD;GAAK,WAAW,GAAG,GAAG,GAAG,gBAAgB,GAAG,GAAG,iBAAiB,YAAY;aAC1E,oBAAC,aAAD,CAAc,CAAA;EACX,CAAA,GAEL,qBAAC,OAAD;GAAK,WAAW,GAAG,GAAG;aAAtB;IACE,qBAAC,OAAD;KAAK,WAAW,GAAG,GAAG;eAAtB,CACE,qBAAC,OAAD;MAAK,WAAW,GAAG,GAAG;gBAAtB,CACE,oBAAC,OAAD;OAAK,WAAW,GAAG,GAAG,GAAG,eAAe,EAAE,cAAc,eAAe,QAAQ,CAAC;iBAC7E;MACE,CAAA,GACJ,cAAc,oBAAC,QAAD;OAAQ,OAAM;OAAW,QAAO;MAAS,CAAA,CACrD;SAEJ,aACC,oBAAC,OAAD;MAAK,WAAW,GAAG,GAAG;gBACnB;KACE,CAAA,CAEJ;;IAEJ,eAAe,oBAAC,OAAD;KAAK,WAAW,GAAG,GAAG;eAAiB;IAAiB,CAAA;IACvE,eAAe,oBAAC,OAAD;KAAK,WAAW,GAAG,GAAG;eAAU;IAAiB,CAAA;GAC9D;IACF;IAxBK,KAwBL;AAET"}
1
+ {"version":3,"file":"StepRow.js","names":[],"sources":["../../../../../../../src/Atomic/UI/WizardStepper/ui/StepRow/StepRow.tsx"],"sourcesContent":["import type { IStepRowProps } from '../../WizardStepper.interface';\nimport cn from 'classnames';\nimport React from 'react';\nimport Status from '../../../Status/Status';\nimport { WIZARD_STEP_VARIANTS } from '../../constructor';\nimport StateIcon from '../StateIcon';\nimport './StepRow.scss';\n\nconst RC = 'step-row';\n\nconst { DEFAULT, ACTIVE, DONE } = WIZARD_STEP_VARIANTS;\n\nconst StepRow: React.FC<IStepRowProps> = ({\n label,\n description,\n className,\n isOptional,\n isFinished,\n isActive,\n titleSlot,\n contentSlot,\n customIcons,\n}) => {\n const title = label;\n\n const rowVariant = (() => {\n if (isActive) return ACTIVE;\n if (isFinished) return DONE;\n return DEFAULT;\n })();\n\n const alternaviteIconFromProps = (() => {\n if (isActive) return customIcons?.activeIcon;\n if (isFinished) return customIcons?.doneIcon;\n return customIcons?.defaultIcon;\n })();\n\n const CorrectIcon: React.FC = () => {\n if (!customIcons || Object?.values(customIcons)?.every(icon => !icon)) {\n return <StateIcon variant={rowVariant} />;\n }\n\n return alternaviteIconFromProps as React.ReactElement<any, any> || null;\n };\n\n return (\n <div key={label} className={cn(RC, `${RC}--${rowVariant}`, className)}>\n <div className={cn(`${RC}__state-point`, `${RC}__state-point--${rowVariant}`)}>\n <CorrectIcon />\n </div>\n\n <div className={`${RC}__content`}>\n <div className={`${RC}__title`}>\n <div className={`${RC}__title-left`}>\n <div className={cn(`${RC}__title-text`, { 'text-muted': rowVariant === DEFAULT })}>\n {title}\n </div>\n {isOptional && <Status label=\"Optional\" status=\"draft\" />}\n </div>\n\n {titleSlot && (\n <div className={`${RC}__title-right`}>\n {titleSlot}\n </div>\n )}\n </div>\n\n {description && <div className={`${RC}__description`}>{description}</div>}\n {contentSlot && <div className={`${RC}__body`}>{contentSlot}</div>}\n </div>\n </div>\n );\n};\n\nexport default StepRow;\n"],"mappings":";;;;;;;;AAQA,IAAM,KAAK;AAEX,IAAM,EAAE,SAAS,QAAQ,SAAS;AAElC,IAAM,WAAoC,EACxC,OACA,aACA,WACA,YACA,YACA,UACA,WACA,aACA,kBACI;CACJ,MAAM,QAAQ;CAEd,MAAM,oBAAoB;EACxB,IAAI,UAAU,OAAO;EACrB,IAAI,YAAY,OAAO;EACvB,OAAO;CACT,EAAA,CAAG;CAEH,MAAM,kCAAkC;EACtC,IAAI,UAAU,OAAO,aAAa;EAClC,IAAI,YAAY,OAAO,aAAa;EACpC,OAAO,aAAa;CACtB,EAAA,CAAG;CAEH,MAAM,oBAA8B;EAClC,IAAI,CAAC,eAAe,QAAQ,OAAO,WAAW,CAAC,EAAE,OAAM,SAAQ,CAAC,IAAI,GAClE,OAAO,oBAAC,mBAAD,EAAW,SAAS,WAAa,CAAA;EAG1C,OAAO,4BAA4D;CACrE;CAEA,OACE,qBAAC,OAAD;EAAiB,WAAW,GAAG,IAAI,GAAG,GAAG,IAAI,cAAc,SAAS;EAApE,UAAA,CACE,oBAAC,OAAD;GAAK,WAAW,GAAG,GAAG,GAAG,gBAAgB,GAAG,GAAG,iBAAiB,YAAY;GAC1E,UAAA,oBAAC,aAAD,CAAc,CAAA;EACX,CAAA,GAEL,qBAAC,OAAD;GAAK,WAAW,GAAG,GAAG;GAAtB,UAAA;IACE,qBAAC,OAAD;KAAK,WAAW,GAAG,GAAG;KAAtB,UAAA,CACE,qBAAC,OAAD;MAAK,WAAW,GAAG,GAAG;MAAtB,UAAA,CACE,oBAAC,OAAD;OAAK,WAAW,GAAG,GAAG,GAAG,eAAe,EAAE,cAAc,eAAe,QAAQ,CAAC;OAC7E,UAAA;MACE,CAAA,GACJ,cAAc,oBAAC,QAAD;OAAQ,OAAM;OAAW,QAAO;MAAS,CAAA,CACrD;KAEJ,CAAA,GAAA,aACC,oBAAC,OAAD;MAAK,WAAW,GAAG,GAAG;MACnB,UAAA;KACE,CAAA,CAEJ;;IAEJ,eAAe,oBAAC,OAAD;KAAK,WAAW,GAAG,GAAG;KAAiB,UAAA;IAAiB,CAAA;IACvE,eAAe,oBAAC,OAAD;KAAK,WAAW,GAAG,GAAG;KAAU,UAAA;IAAiB,CAAA;GAC9D;EACF,CAAA,CAAA;CAxBK,GAAA,KAwBL;AAET"}
@@ -1 +1 @@
1
- {"version":3,"file":"StepWrapper.js","names":[],"sources":["../../../../../../../src/Atomic/UI/WizardStepper/ui/StepWrapper/StepWrapper.tsx"],"sourcesContent":["import type { IStepWrapperProps } from '../../WizardStepper.interface';\nimport classNames from 'classnames';\n\nimport React from 'react';\nimport Box from '../../../Box/Box';\nimport { alternativeIconSet } from '../icons';\nimport StepRow from '../StepRow/StepRow';\n\nimport './StepWrapper.scss';\n\nconst StepWrapper: React.FC<IStepWrapperProps> = ({\n steps,\n customIcons,\n variant = 'default',\n className,\n testId = 'step-wrapper',\n}) => {\n if (!steps?.length) return <div data-testid=\"empty-state\">No steps available</div>;\n\n const renderStepRow = (step: IStepWrapperProps['steps'][number]): JSX.Element => {\n const { key, ...stepProps } = step;\n return (\n <StepRow\n key={key}\n {...stepProps}\n customIcons={customIcons || alternativeIconSet}\n />\n );\n };\n\n switch (variant) {\n case 'ghost':\n return (\n <Box\n className={classNames('step-wrapper', 'step-wrapper-ghost', className)}\n data-testid={testId}\n >\n {steps?.map(renderStepRow)}\n </Box>\n );\n case 'cardActive':\n return (\n <div\n className={classNames('step-wrapper', 'step-wrapper-card-active', className)}\n data-testid={testId}\n >\n {steps?.map(renderStepRow)}\n </div>\n );\n default:\n return (\n <div\n className={classNames('step-wrapper', className)}\n data-testid={testId}\n >\n {steps?.map(renderStepRow)}\n </div>\n );\n }\n};\n\nexport default StepWrapper;\n"],"mappings":";;;;;;;;AAUA,IAAM,eAA4C,EAChD,OACA,aACA,UAAU,WACV,WACA,SAAS,qBACL;CACJ,IAAI,CAAC,OAAO,QAAQ,OAAO,oBAAC,OAAD;EAAK,eAAY;YAAc;CAAuB,CAAA;CAEjF,MAAM,iBAAiB,SAA0D;EAC/E,MAAM,EAAE,KAAK,GAAG,cAAc;EAC9B,OACE,oBAAC,SAAD;GAEE,GAAI;GACJ,aAAa,eAAe;EAC7B,GAHM,GAGN;CAEL;CAEA,QAAQ,SAAR;EACE,KAAK,SACH,OACE,oBAAC,KAAD;GACE,WAAW,GAAW,gBAAgB,sBAAsB,SAAS;GACrE,eAAa;aAEZ,OAAO,IAAI,aAAa;EACtB,CAAA;EAET,KAAK,cACH,OACE,oBAAC,OAAD;GACE,WAAW,GAAW,gBAAgB,4BAA4B,SAAS;GAC3E,eAAa;aAEZ,OAAO,IAAI,aAAa;EACtB,CAAA;EAET,SACE,OACE,oBAAC,OAAD;GACE,WAAW,GAAW,gBAAgB,SAAS;GAC/C,eAAa;aAEZ,OAAO,IAAI,aAAa;EACtB,CAAA;CAEX;AACF"}
1
+ {"version":3,"file":"StepWrapper.js","names":[],"sources":["../../../../../../../src/Atomic/UI/WizardStepper/ui/StepWrapper/StepWrapper.tsx"],"sourcesContent":["import type { IStepWrapperProps } from '../../WizardStepper.interface';\nimport classNames from 'classnames';\n\nimport React from 'react';\nimport Box from '../../../Box/Box';\nimport { alternativeIconSet } from '../icons';\nimport StepRow from '../StepRow/StepRow';\n\nimport './StepWrapper.scss';\n\nconst StepWrapper: React.FC<IStepWrapperProps> = ({\n steps,\n customIcons,\n variant = 'default',\n className,\n testId = 'step-wrapper',\n}) => {\n if (!steps?.length) return <div data-testid=\"empty-state\">No steps available</div>;\n\n const renderStepRow = (step: IStepWrapperProps['steps'][number]): JSX.Element => {\n const { key, ...stepProps } = step;\n return (\n <StepRow\n key={key}\n {...stepProps}\n customIcons={customIcons || alternativeIconSet}\n />\n );\n };\n\n switch (variant) {\n case 'ghost':\n return (\n <Box\n className={classNames('step-wrapper', 'step-wrapper-ghost', className)}\n data-testid={testId}\n >\n {steps?.map(renderStepRow)}\n </Box>\n );\n case 'cardActive':\n return (\n <div\n className={classNames('step-wrapper', 'step-wrapper-card-active', className)}\n data-testid={testId}\n >\n {steps?.map(renderStepRow)}\n </div>\n );\n default:\n return (\n <div\n className={classNames('step-wrapper', className)}\n data-testid={testId}\n >\n {steps?.map(renderStepRow)}\n </div>\n );\n }\n};\n\nexport default StepWrapper;\n"],"mappings":";;;;;;;;AAUA,IAAM,eAA4C,EAChD,OACA,aACA,UAAU,WACV,WACA,SAAS,qBACL;CACJ,IAAI,CAAC,OAAO,QAAQ,OAAO,oBAAC,OAAD;EAAK,eAAY;EAAc,UAAA;CAAuB,CAAA;CAEjF,MAAM,iBAAiB,SAA0D;EAC/E,MAAM,EAAE,KAAK,GAAG,cAAc;EAC9B,OACE,oBAAC,SAAD;GAEE,GAAI;GACJ,aAAa,eAAe;EAC7B,GAHM,GAGN;CAEL;CAEA,QAAQ,SAAR;EACE,KAAK,SACH,OACE,oBAAC,KAAD;GACE,WAAW,GAAW,gBAAgB,sBAAsB,SAAS;GACrE,eAAa;GAEZ,UAAA,OAAO,IAAI,aAAa;EACtB,CAAA;EAET,KAAK,cACH,OACE,oBAAC,OAAD;GACE,WAAW,GAAW,gBAAgB,4BAA4B,SAAS;GAC3E,eAAa;GAEZ,UAAA,OAAO,IAAI,aAAa;EACtB,CAAA;EAET,SACE,OACE,oBAAC,OAAD;GACE,WAAW,GAAW,gBAAgB,SAAS;GAC/C,eAAa;GAEZ,UAAA,OAAO,IAAI,aAAa;EACtB,CAAA;CAEX;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"icons.js","names":[],"sources":["../../../../../../src/Atomic/UI/WizardStepper/ui/icons.tsx"],"sourcesContent":["import React from 'react';\n\nconst DoneIcon: React.FC<React.SVGProps<SVGSVGElement>> = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"20\" height=\"20\" rx=\"10\" fill=\"#69A457\" />\n <mask id=\"mask0_54394_4001\" style={{ maskType: 'alpha' }} maskUnits=\"userSpaceOnUse\" x=\"2\" y=\"2\" width=\"16\" height=\"16\">\n <path d=\"M14.5 7L9 12.5L6 9.5\" stroke=\"black\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </mask>\n <g mask=\"url(#mask0_54394_4001)\">\n <rect x=\"2\" y=\"2\" width=\"16\" height=\"16\" fill=\"white\" />\n </g>\n </svg>\n)\n\nconst TodoIcon: React.FC<React.SVGProps<SVGSVGElement>> = () => {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clipPath=\"url(#clip0_54394_4448)\">\n <circle cx=\"10\" cy=\"10\" r=\"7\" fill=\"white\" stroke=\"#B3B8CB\" strokeWidth=\"2\" />\n </g>\n <defs>\n <clipPath id=\"clip0_54394_4448\">\n <rect width=\"16\" height=\"16\" fill=\"white\" transform=\"translate(2 2)\" />\n </clipPath>\n </defs>\n </svg>\n\n );\n};\n\nconst ActiveIcon: React.FC<React.SVGProps<SVGSVGElement>> = () => {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"20\" height=\"20\" rx=\"10\" fill=\"#E8F9E5\" />\n ii\n <mask id=\"mask0_54394_1459\" style={{ maskType: 'alpha' }} maskUnits=\"userSpaceOnUse\" x=\"2\" y=\"2\" width=\"16\" height=\"16\">\n <circle cx=\"10\" cy=\"10\" r=\"4\" fill=\"#171D33\" />\n </mask>\n <g mask=\"url(#mask0_54394_1459)\">\n <rect x=\"2\" y=\"2\" width=\"16\" height=\"16\" fill=\"#171D33\" />\n </g>\n </svg>\n\n );\n};\n\nexport const alternativeIconSet: {\n defaultIcon: React.ReactElement;\n doneIcon: React.ReactElement;\n activeIcon: React.ReactElement;\n} = {\n defaultIcon: <TodoIcon />,\n doneIcon: <DoneIcon />,\n activeIcon: <ActiveIcon />,\n};\n"],"mappings":";;;AAEA,IAAM,iBACJ,qBAAC,OAAD;CAAK,OAAM;CAAK,QAAO;CAAK,SAAQ;CAAY,MAAK;CAAO,OAAM;WAAlE;EACE,oBAAC,QAAD;GAAM,OAAM;GAAK,QAAO;GAAK,IAAG;GAAK,MAAK;EAAW,CAAA;EACrD,oBAAC,QAAD;GAAM,IAAG;GAAmB,OAAO,EAAE,UAAU,QAAQ;GAAG,WAAU;GAAiB,GAAE;GAAI,GAAE;GAAI,OAAM;GAAK,QAAO;aACjH,oBAAC,QAAD;IAAM,GAAE;IAAuB,QAAO;IAAQ,aAAY;IAAI,eAAc;IAAQ,gBAAe;GAAS,CAAA;EACxG,CAAA;EACN,oBAAC,KAAD;GAAG,MAAK;aACN,oBAAC,QAAD;IAAM,GAAE;IAAI,GAAE;IAAI,OAAM;IAAK,QAAO;IAAK,MAAK;GAAS,CAAA;EACtD,CAAA;CACA;;AAGP,IAAM,iBAA0D;CAC9D,OACE,qBAAC,OAAD;EAAK,OAAM;EAAK,QAAO;EAAK,SAAQ;EAAY,MAAK;EAAO,OAAM;YAAlE,CACE,oBAAC,KAAD;GAAG,UAAS;aACV,oBAAC,UAAD;IAAQ,IAAG;IAAK,IAAG;IAAK,GAAE;IAAI,MAAK;IAAQ,QAAO;IAAU,aAAY;GAAK,CAAA;EAC5E,CAAA,GACH,oBAAC,QAAD,EAAA,UACE,oBAAC,YAAD;GAAU,IAAG;aACX,oBAAC,QAAD;IAAM,OAAM;IAAK,QAAO;IAAK,MAAK;IAAQ,WAAU;GAAkB,CAAA;EAC9D,CAAA,EACN,CAAA,CACH;;AAGT;AAEA,IAAM,mBAA4D;CAChE,OACE,qBAAC,OAAD;EAAK,OAAM;EAAK,QAAO;EAAK,SAAQ;EAAY,MAAK;EAAO,OAAM;YAAlE;GACE,oBAAC,QAAD;IAAM,OAAM;IAAK,QAAO;IAAK,IAAG;IAAK,MAAK;GAAW,CAAA;GAAC;GAEtD,oBAAC,QAAD;IAAM,IAAG;IAAmB,OAAO,EAAE,UAAU,QAAQ;IAAG,WAAU;IAAiB,GAAE;IAAI,GAAE;IAAI,OAAM;IAAK,QAAO;cACjH,oBAAC,UAAD;KAAQ,IAAG;KAAK,IAAG;KAAK,GAAE;KAAI,MAAK;IAAW,CAAA;GAC1C,CAAA;GACN,oBAAC,KAAD;IAAG,MAAK;cACN,oBAAC,QAAD;KAAM,GAAE;KAAI,GAAE;KAAI,OAAM;KAAK,QAAO;KAAK,MAAK;IAAW,CAAA;GACxD,CAAA;EACA;;AAGT;AAEA,IAAa,qBAIT;CACF,aAAa,oBAAC,UAAD,CAAW,CAAA;CACxB,UAAU,oBAAC,UAAD,CAAW,CAAA;CACrB,YAAY,oBAAC,YAAD,CAAa,CAAA;AAC3B"}
1
+ {"version":3,"file":"icons.js","names":[],"sources":["../../../../../../src/Atomic/UI/WizardStepper/ui/icons.tsx"],"sourcesContent":["import React from 'react';\n\nconst DoneIcon: React.FC<React.SVGProps<SVGSVGElement>> = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"20\" height=\"20\" rx=\"10\" fill=\"#69A457\" />\n <mask id=\"mask0_54394_4001\" style={{ maskType: 'alpha' }} maskUnits=\"userSpaceOnUse\" x=\"2\" y=\"2\" width=\"16\" height=\"16\">\n <path d=\"M14.5 7L9 12.5L6 9.5\" stroke=\"black\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </mask>\n <g mask=\"url(#mask0_54394_4001)\">\n <rect x=\"2\" y=\"2\" width=\"16\" height=\"16\" fill=\"white\" />\n </g>\n </svg>\n)\n\nconst TodoIcon: React.FC<React.SVGProps<SVGSVGElement>> = () => {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clipPath=\"url(#clip0_54394_4448)\">\n <circle cx=\"10\" cy=\"10\" r=\"7\" fill=\"white\" stroke=\"#B3B8CB\" strokeWidth=\"2\" />\n </g>\n <defs>\n <clipPath id=\"clip0_54394_4448\">\n <rect width=\"16\" height=\"16\" fill=\"white\" transform=\"translate(2 2)\" />\n </clipPath>\n </defs>\n </svg>\n\n );\n};\n\nconst ActiveIcon: React.FC<React.SVGProps<SVGSVGElement>> = () => {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"20\" height=\"20\" rx=\"10\" fill=\"#E8F9E5\" />\n ii\n <mask id=\"mask0_54394_1459\" style={{ maskType: 'alpha' }} maskUnits=\"userSpaceOnUse\" x=\"2\" y=\"2\" width=\"16\" height=\"16\">\n <circle cx=\"10\" cy=\"10\" r=\"4\" fill=\"#171D33\" />\n </mask>\n <g mask=\"url(#mask0_54394_1459)\">\n <rect x=\"2\" y=\"2\" width=\"16\" height=\"16\" fill=\"#171D33\" />\n </g>\n </svg>\n\n );\n};\n\nexport const alternativeIconSet: {\n defaultIcon: React.ReactElement;\n doneIcon: React.ReactElement;\n activeIcon: React.ReactElement;\n} = {\n defaultIcon: <TodoIcon />,\n doneIcon: <DoneIcon />,\n activeIcon: <ActiveIcon />,\n};\n"],"mappings":";;;AAEA,IAAM,iBACJ,qBAAC,OAAD;CAAK,OAAM;CAAK,QAAO;CAAK,SAAQ;CAAY,MAAK;CAAO,OAAM;CAAlE,UAAA;EACE,oBAAC,QAAD;GAAM,OAAM;GAAK,QAAO;GAAK,IAAG;GAAK,MAAK;EAAW,CAAA;EACrD,oBAAC,QAAD;GAAM,IAAG;GAAmB,OAAO,EAAE,UAAU,QAAQ;GAAG,WAAU;GAAiB,GAAE;GAAI,GAAE;GAAI,OAAM;GAAK,QAAO;GACjH,UAAA,oBAAC,QAAD;IAAM,GAAE;IAAuB,QAAO;IAAQ,aAAY;IAAI,eAAc;IAAQ,gBAAe;GAAS,CAAA;EACxG,CAAA;EACN,oBAAC,KAAD;GAAG,MAAK;GACN,UAAA,oBAAC,QAAD;IAAM,GAAE;IAAI,GAAE;IAAI,OAAM;IAAK,QAAO;IAAK,MAAK;GAAS,CAAA;EACtD,CAAA;CACA;;AAGP,IAAM,iBAA0D;CAC9D,OACE,qBAAC,OAAD;EAAK,OAAM;EAAK,QAAO;EAAK,SAAQ;EAAY,MAAK;EAAO,OAAM;EAAlE,UAAA,CACE,oBAAC,KAAD;GAAG,UAAS;GACV,UAAA,oBAAC,UAAD;IAAQ,IAAG;IAAK,IAAG;IAAK,GAAE;IAAI,MAAK;IAAQ,QAAO;IAAU,aAAY;GAAK,CAAA;EAC5E,CAAA,GACH,oBAAC,QAAD,EAAA,UACE,oBAAC,YAAD;GAAU,IAAG;GACX,UAAA,oBAAC,QAAD;IAAM,OAAM;IAAK,QAAO;IAAK,MAAK;IAAQ,WAAU;GAAkB,CAAA;EAC9D,CAAA,EACN,CAAA,CACH;;AAGT;AAEA,IAAM,mBAA4D;CAChE,OACE,qBAAC,OAAD;EAAK,OAAM;EAAK,QAAO;EAAK,SAAQ;EAAY,MAAK;EAAO,OAAM;EAAlE,UAAA;GACE,oBAAC,QAAD;IAAM,OAAM;IAAK,QAAO;IAAK,IAAG;IAAK,MAAK;GAAW,CAAA;GAAC;GAEtD,oBAAC,QAAD;IAAM,IAAG;IAAmB,OAAO,EAAE,UAAU,QAAQ;IAAG,WAAU;IAAiB,GAAE;IAAI,GAAE;IAAI,OAAM;IAAK,QAAO;IACjH,UAAA,oBAAC,UAAD;KAAQ,IAAG;KAAK,IAAG;KAAK,GAAE;KAAI,MAAK;IAAW,CAAA;GAC1C,CAAA;GACN,oBAAC,KAAD;IAAG,MAAK;IACN,UAAA,oBAAC,QAAD;KAAM,GAAE;KAAI,GAAE;KAAI,OAAM;KAAK,QAAO;KAAK,MAAK;IAAW,CAAA;GACxD,CAAA;EACA;;AAGT;AAEA,IAAa,qBAIT;CACF,aAAa,oBAAC,UAAD,CAAW,CAAA;CACxB,UAAU,oBAAC,UAAD,CAAW,CAAA;CACrB,YAAY,oBAAC,YAAD,CAAa,CAAA;AAC3B"}
@@ -60,8 +60,10 @@ var CredentialsProcessing = class {
60
60
  return getIsOnlyAnObject(result) ? result : {};
61
61
  };
62
62
  if (typeof importCredentials === "function") this.importCredentials = (cred) => importCredentials(cred);
63
- if (saveCredentials || isUseRefreshTokensPropcessing) if (typeof saveCredentials !== "function") throw new Error("No saveCredentials method [CredentialsProcessing]");
64
- else this.saveCredentials = (cred) => saveCredentials(cred);
63
+ if (saveCredentials || isUseRefreshTokensPropcessing) {
64
+ if (typeof saveCredentials !== "function") throw new Error("No saveCredentials method [CredentialsProcessing]");
65
+ else this.saveCredentials = (cred) => saveCredentials(cred);
66
+ }
65
67
  if (isUseRefreshTokensPropcessing) {
66
68
  if (typeof refreshCredentials === "function") this.refreshCredentialsByOuter = (cred) => refreshCredentials(cred);
67
69
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"CredentialsProcessing.js","names":[],"sources":["../../../../../src/Classes/RESTAPI/partials/CredentialsProcessing.ts"],"sourcesContent":["import type { CredentialsState, RESTAPISettings, UnknownRecord } from './types';\nimport { getIsOnlyAnObject } from './_utils';\n\n/**\n * Декодирует payload JWT-токена.\n *\n * @param token - JWT-строка вида `header.payload.signature`.\n * @returns Распарсенный payload (объект) либо `null`, если декодирование не удалось.\n */\nexport function decodeJWT(token: string): UnknownRecord | null {\n try {\n const payload = token.split('.')[1] ?? '';\n const decoded: unknown = JSON.parse(atob(payload));\n return getIsOnlyAnObject(decoded) ? decoded : null;\n }\n catch {\n return null;\n }\n}\n\n/**\n * Обработчик учётных данных (токенов): добавляет токен в запросы и (опционально) реализует\n * флоу рефреша токенов. Конфигурируется через настройку `credentialsProcessing`.\n */\nclass CredentialsProcessing {\n // ? Индекс-сигнатура: getRESTAPIContext навешивается извне (из конструктора RESTAPI).\n [key: string]: unknown;\n\n /** Включён ли флоу рефреша токенов. */\n isUseRefreshTokensPropcessing = false;\n\n /** Учётные данные по умолчанию (пустые). */\n DEFAULT_CREDENTIALS: CredentialsState = {};\n\n /** Внешний метод получения учётных данных. */\n getCredentialsByOuter!: () => unknown;\n\n /** Внешний метод формирования заголовков авторизации по токену. */\n getHeadersForAuthorize!: (token: string) => UnknownRecord;\n\n /** Необязательный преобразователь учётных данных после getCredentials. */\n importCredentials?: (cred: unknown) => unknown;\n\n /** Необязательный метод сохранения учётных данных (обязателен для флоу рефреша). */\n saveCredentials?: (cred: unknown) => unknown;\n\n /** Внешний метод рефреша учётных данных. */\n refreshCredentialsByOuter?: (cred: CredentialsState) => unknown;\n\n /** Полный путь до эндпоинта рефреша токена. */\n REFRESH_TOKEN_PATH?: string;\n\n /** Коды ответа, по которым триггерится попытка рефреша. */\n CODES_USING_THE_REFRESH_ATTEMPT?: number[];\n\n /** Ключ флага «рефреш начат» в localStorage. */\n REFRESH_TOKEN_FLAG = 'refreshTokenFlag';\n\n /** Интервал опроса флага обновления токена, мс. */\n INTERVAL_FOR_CHECKING_TOKEN_UPDATE = 50;\n\n /** Колбэк, вызываемый после неудачного рефреша. */\n callbackAfterRejectRefresh?: () => unknown;\n\n /** Доступ к верхнему контексту RESTAPI (навешивается из конструктора RESTAPI). */\n getRESTAPIContext?: () => unknown;\n\n constructor(settings: RESTAPISettings) {\n const { credentialsProcessing } = settings;\n const {\n // ? Для корректной работы установки токенов в запросы от API\n // ? нужно передавать методы getCredentials и getHeadersForAuthorize\n getCredentials,\n getHeadersForAuthorize, // ? На вход получит токен, должна вернуть объект для коструктора Headers\n\n // ? Так же опционально можно передавать\n importCredentials, // ? если он передается, то он будет применяться к выводу от вызова getCredentials\n saveCredentials, // ? можно будет найти в объекте credentialsProcessing, чтобы использовать кастомными методами\n\n // ! Либо вызов getCredentials, либо цепочка вызовов importCredentials(getCredentials())\n // ! должна возвращать требуемую классом структуру\n // ! Класс требует структуры\n // ! - { token }, если флоу рефреш токена НЕ используется\n // ! - { token, refreshToken, expires }, если используется флоу рефреш токена\n\n // *********\n\n // ? Подключает флоу рефреша токенов\n isUseRefreshTokensPropcessing = false,\n\n // ! Для корректной работы флоу рефреша токенов передача метода saveCredentials становится ОБЯЗАТЕЛЬНОЙ\n\n // ? Так же для корректной работы флоу рефреша токенов нужно\n // ? - либо\n refreshCredentials, // ! метод должен возвращать такую же структуру как и метод getCredentials,\n // ? на вход получит текущие креды, к выходу будет применен importCredentials, если этот метод передавался\n // ? - либо\n REFRESH_TOKEN_PATH, // ! REFRESH_TOKEN_PATH передается ПОЛНОСТЬЮ (глобальная адресация)!\n CODES_USING_THE_REFRESH_ATTEMPT, // ? указывает по каким кодам ответа триггериться рефреш, массив чисел\n\n // ? Опционально\n REFRESH_TOKEN_FLAG = 'refreshTokenFlag',\n INTERVAL_FOR_CHECKING_TOKEN_UPDATE = 50, // ms\n callbackAfterRejectRefresh,\n } = credentialsProcessing || {};\n\n if (typeof getCredentials !== 'function') throw new Error('No getCredentials method [CredentialsProcessing]');\n if (typeof getHeadersForAuthorize !== 'function') {\n throw new TypeError('No getHeadersForAuthorize method [CredentialsProcessing]');\n }\n if (importCredentials && typeof importCredentials !== 'function') {\n throw new Error('Bad importCredentials method [CredentialsProcessing]');\n }\n\n this.isUseRefreshTokensPropcessing = Boolean(isUseRefreshTokensPropcessing);\n this.DEFAULT_CREDENTIALS = {};\n // ? Внешние функции оборачиваем в типизированные обёртки (без приведения типов / типа Function).\n this.getCredentialsByOuter = () => getCredentials();\n this.getHeadersForAuthorize = (token: string) => {\n const result = getHeadersForAuthorize(token);\n return getIsOnlyAnObject(result) ? result : {};\n };\n if (typeof importCredentials === 'function') this.importCredentials = (cred: unknown) => importCredentials(cred);\n\n // ? Если метод передан или если не передан, но включен флоу обновления токенов (тогда saveCredentials обязателен)\n if (saveCredentials || isUseRefreshTokensPropcessing) {\n if (typeof saveCredentials !== 'function') throw new Error('No saveCredentials method [CredentialsProcessing]');\n else this.saveCredentials = (cred: unknown) => saveCredentials(cred);\n }\n\n if (isUseRefreshTokensPropcessing) {\n if (typeof refreshCredentials === 'function') {\n this.refreshCredentialsByOuter = (cred: CredentialsState) => refreshCredentials(cred);\n }\n else {\n if (typeof this.refreshCredentialsByOuter === 'function' && typeof REFRESH_TOKEN_PATH !== 'string') {\n throw new TypeError('No REFRESH_TOKEN_PATH [CredentialsProcessing]');\n }\n this.REFRESH_TOKEN_PATH = typeof REFRESH_TOKEN_PATH === 'string' ? REFRESH_TOKEN_PATH : undefined;\n }\n\n if (!Array.isArray(CODES_USING_THE_REFRESH_ATTEMPT)) {\n throw new TypeError('No CODES_USING_THE_REFRESH_ATTEMPT [CredentialsProcessing]');\n }\n if (!CODES_USING_THE_REFRESH_ATTEMPT.every(i => typeof i === 'number')) {\n throw new Error('Invalid format of CODES_USING_THE_REFRESH_ATTEMPT elements [CredentialsProcessing]');\n }\n\n if (typeof REFRESH_TOKEN_FLAG !== 'string') throw new Error('Bad REFRESH_TOKEN_FLAG [CredentialsProcessing]');\n if (typeof INTERVAL_FOR_CHECKING_TOKEN_UPDATE !== 'number') {\n throw new TypeError('Bad INTERVAL_FOR_CHECKING_TOKEN_UPDATE [CredentialsProcessing]');\n }\n if (typeof INTERVAL_FOR_CHECKING_TOKEN_UPDATE !== 'number') {\n throw new TypeError('Bad INTERVAL_FOR_CHECKING_TOKEN_UPDATE [CredentialsProcessing]');\n }\n if (callbackAfterRejectRefresh && typeof callbackAfterRejectRefresh !== 'function') {\n throw new Error('Bad INTERVAL_FOR_CHECKING_TOKEN_UPDATE [CredentialsProcessing]');\n }\n\n this.CODES_USING_THE_REFRESH_ATTEMPT = CODES_USING_THE_REFRESH_ATTEMPT;\n this.REFRESH_TOKEN_FLAG = REFRESH_TOKEN_FLAG;\n this.INTERVAL_FOR_CHECKING_TOKEN_UPDATE = INTERVAL_FOR_CHECKING_TOKEN_UPDATE;\n\n if (typeof callbackAfterRejectRefresh === 'function') this.callbackAfterRejectRefresh = () => callbackAfterRejectRefresh();\n }\n }\n\n /** Возвращает значение флага «рефреш начат» из localStorage. */\n getIsTokenStartRefresh(): string | null {\n return localStorage.getItem(this.REFRESH_TOKEN_FLAG);\n }\n\n /** Выставляет флаг «рефреш начат» в localStorage. */\n setIsTokenStartRefresh(): void {\n localStorage.setItem(this.REFRESH_TOKEN_FLAG, String(true));\n }\n\n /** Снимает флаг «рефреш начат» из localStorage. */\n removeIsTokenStartRefresh(): void {\n localStorage.removeItem(this.REFRESH_TOKEN_FLAG);\n }\n\n /**\n * Возвращает текущие учётные данные (с учётом importCredentials и проверки истечения JWT).\n *\n * @param isCatchCallbackProcess - флаг процесса обработки ошибки (отключает проверку истечения).\n * @param callback - необязательный колбэк, получающий итоговые учётные данные.\n * @returns Промис с учётными данными.\n */\n async getCredentials(isCatchCallbackProcess?: boolean, callback?: (cred: CredentialsState) => unknown): Promise<CredentialsState> {\n let credentials: unknown = await this.getCredentialsByOuter();\n\n if (typeof this.importCredentials === 'function') credentials = await this.importCredentials(credentials);\n const credObj: CredentialsState = getIsOnlyAnObject(credentials) ? credentials : {};\n\n const token = credObj.token || null;\n\n if (token && !isCatchCallbackProcess) {\n let decoded: UnknownRecord | null;\n try {\n decoded = decodeJWT(token);\n }\n catch {\n decoded = null;\n }\n const currentTime = Date.now() / 1000;\n if (decoded !== null && Number(decoded.exp) < currentTime) credObj.isNeedRefresh = true;\n }\n\n if (callback) await callback({ ...credObj, isCatchCallbackProcess });\n return { ...credObj, isCatchCallbackProcess };\n }\n\n /**\n * Выполняет рефреш учётных данных (внешним методом либо дефолтным OAuth-флоу).\n *\n * @param currentCredentials - текущие учётные данные.\n * @param callback - необязательный колбэк сохранения новых учётных данных.\n * @returns Промис с новыми учётными данными.\n */\n async refreshCredentials(currentCredentials: CredentialsState, callback?: (cred: CredentialsState) => unknown): Promise<CredentialsState> {\n const CONTEXT = this;\n\n async function finalize(cred: CredentialsState): Promise<CredentialsState> {\n if (callback) await callback(cred);\n return Promise.resolve(cred).then(async (res) => {\n CONTEXT.removeIsTokenStartRefresh();\n return res;\n });\n }\n\n if (!currentCredentials?.token || !currentCredentials?.refreshToken) return finalize(CONTEXT.DEFAULT_CREDENTIALS);\n\n // ! ВНИМАНИЕ! Данный механизм рефреша принят на проекте finturfreactfrontend (админка)\n // ! На кабинете он ТОЧНО НЕ ТАКОЙ\n async function refreshCredentialsByDefault(): Promise<Response> {\n const { token, refreshToken } = currentCredentials;\n // ? Заголовки авторизации формируем через конструктор Headers из пар «ключ-значение».\n const headers = new Headers(Object.entries(CONTEXT.getHeadersForAuthorize(token || '')).map(([key, value]): [string, string] => [key, `${value}`]));\n\n const body = new FormData();\n body.append('grant_type', 'refresh_token');\n body.append('refresh_token', refreshToken || '');\n body.append('client_id', 'oauth');\n body.append('client_secret', 'secret');\n body.append('access_type', 'offline');\n\n return fetch(`${CONTEXT.REFRESH_TOKEN_PATH}`, {\n mode: 'cors',\n method: 'POST',\n headers,\n body,\n redirect: 'follow',\n });\n }\n\n // ? Передавайте собственный refreshCredentials при получении экземляра RESTAPI, если не уверены,\n // ? что механизм рефреша токенов ИМЕННО ТАКОЙ как в ф-и refreshCredentialsByDefault!\n // ! currentCredentials передаются в формате класса! ({ token, refreshToken, expires })\n const newCredentials\n = typeof CONTEXT.refreshCredentialsByOuter === 'function'\n ? await CONTEXT.refreshCredentialsByOuter(currentCredentials)\n : await refreshCredentialsByDefault();\n\n return finalize(getIsOnlyAnObject(newCredentials) ? newCredentials : CONTEXT.DEFAULT_CREDENTIALS);\n }\n\n /**\n * Ожидает завершения рефреша токена (или запускает его флаг при необходимости).\n *\n * @param isNeedRefresh - выставить ли флаг «рефреш начат» при отсутствии активного рефреша.\n * @returns Промис, который резолвится по завершении ожидания.\n */\n async waitRefresh(isNeedRefresh?: boolean): Promise<void> {\n return new Promise<void>((resolve) => {\n if (!this.getIsTokenStartRefresh()) {\n if (isNeedRefresh) this.setIsTokenStartRefresh();\n resolve();\n }\n else {\n const intervalId = setInterval(() => {\n if (!this.getIsTokenStartRefresh()) {\n clearInterval(intervalId);\n resolve();\n }\n }, this.INTERVAL_FOR_CHECKING_TOKEN_UPDATE);\n }\n });\n }\n\n /**\n * Обрабатывает учётные данные: при необходимости рефрешит токен и возвращает актуальные данные.\n *\n * @param cred - текущие учётные данные.\n * @returns Промис с актуальными учётными данными (с флагом isRefreshFailed при неудаче).\n */\n async processCredentials(cred: CredentialsState): Promise<CredentialsState> {\n if (!cred.isNeedRefresh && !cred.isCatchCallbackProcess) return cred;\n\n const CONTEXT = this;\n\n return CONTEXT.refreshCredentials(cred, response => CONTEXT.saveCredentials?.(response)).then(() => {\n return new Promise<CredentialsState>((resolve) => {\n setTimeout(async () => {\n const newCredentials = await CONTEXT.getCredentials();\n if (!newCredentials?.token) {\n newCredentials.isRefreshFailed = true;\n setTimeout(() => {\n CONTEXT?.callbackAfterRejectRefresh?.();\n }, 0);\n }\n resolve(newCredentials);\n }, 0);\n });\n });\n }\n}\n\nexport default CredentialsProcessing;\n"],"mappings":";;;;;;;;AASA,SAAgB,UAAU,OAAqC;CAC7D,IAAI;EACF,MAAM,UAAU,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM;EACvC,MAAM,UAAmB,KAAK,MAAM,KAAK,OAAO,CAAC;EACjD,OAAO,kBAAkB,OAAO,IAAI,UAAU;CAChD,QACM;EACJ,OAAO;CACT;AACF;;;;;AAMA,IAAM,wBAAN,MAA4B;;CAK1B,gCAAgC;;CAGhC,sBAAwC,CAAC;;CAGzC;;CAGA;;CAGA;;CAGA;;CAGA;;CAGA;;CAGA;;CAGA,qBAAqB;;CAGrB,qCAAqC;;CAGrC;;CAGA;CAEA,YAAY,UAA2B;EACrC,MAAM,EAAE,0BAA0B;EAClC,MAAM,EAGJ,gBACA,wBAGA,mBACA,iBAWA,gCAAgC,OAMhC,oBAGA,oBACA,iCAGA,qBAAqB,oBACrB,qCAAqC,IACrC,+BACE,yBAAyB,CAAC;EAE9B,IAAI,OAAO,mBAAmB,YAAY,MAAM,IAAI,MAAM,kDAAkD;EAC5G,IAAI,OAAO,2BAA2B,YACpC,MAAM,IAAI,UAAU,0DAA0D;EAEhF,IAAI,qBAAqB,OAAO,sBAAsB,YACpD,MAAM,IAAI,MAAM,sDAAsD;EAGxE,KAAK,gCAAgC,QAAQ,6BAA6B;EAC1E,KAAK,sBAAsB,CAAC;EAE5B,KAAK,8BAA8B,eAAe;EAClD,KAAK,0BAA0B,UAAkB;GAC/C,MAAM,SAAS,uBAAuB,KAAK;GAC3C,OAAO,kBAAkB,MAAM,IAAI,SAAS,CAAC;EAC/C;EACA,IAAI,OAAO,sBAAsB,YAAY,KAAK,qBAAqB,SAAkB,kBAAkB,IAAI;EAG/G,IAAI,mBAAmB,+BACrB,IAAI,OAAO,oBAAoB,YAAY,MAAM,IAAI,MAAM,mDAAmD;OACzG,KAAK,mBAAmB,SAAkB,gBAAgB,IAAI;EAGrE,IAAI,+BAA+B;GACjC,IAAI,OAAO,uBAAuB,YAChC,KAAK,6BAA6B,SAA2B,mBAAmB,IAAI;QAEjF;IACH,IAAI,OAAO,KAAK,8BAA8B,cAAc,OAAO,uBAAuB,UACxF,MAAM,IAAI,UAAU,+CAA+C;IAErE,KAAK,qBAAqB,OAAO,uBAAuB,WAAW,qBAAqB,KAAA;GAC1F;GAEA,IAAI,CAAC,MAAM,QAAQ,+BAA+B,GAChD,MAAM,IAAI,UAAU,4DAA4D;GAElF,IAAI,CAAC,gCAAgC,OAAM,MAAK,OAAO,MAAM,QAAQ,GACnE,MAAM,IAAI,MAAM,oFAAoF;GAGtG,IAAI,OAAO,uBAAuB,UAAU,MAAM,IAAI,MAAM,gDAAgD;GAC5G,IAAI,OAAO,uCAAuC,UAChD,MAAM,IAAI,UAAU,gEAAgE;GAEtF,IAAI,OAAO,uCAAuC,UAChD,MAAM,IAAI,UAAU,gEAAgE;GAEtF,IAAI,8BAA8B,OAAO,+BAA+B,YACtE,MAAM,IAAI,MAAM,gEAAgE;GAGlF,KAAK,kCAAkC;GACvC,KAAK,qBAAqB;GAC1B,KAAK,qCAAqC;GAE1C,IAAI,OAAO,+BAA+B,YAAY,KAAK,mCAAmC,2BAA2B;EAC3H;CACF;;CAGA,yBAAwC;EACtC,OAAO,aAAa,QAAQ,KAAK,kBAAkB;CACrD;;CAGA,yBAA+B;EAC7B,aAAa,QAAQ,KAAK,oBAAoB,OAAO,IAAI,CAAC;CAC5D;;CAGA,4BAAkC;EAChC,aAAa,WAAW,KAAK,kBAAkB;CACjD;;;;;;;;CASA,MAAM,eAAe,wBAAkC,UAA2E;EAChI,IAAI,cAAuB,MAAM,KAAK,sBAAsB;EAE5D,IAAI,OAAO,KAAK,sBAAsB,YAAY,cAAc,MAAM,KAAK,kBAAkB,WAAW;EACxG,MAAM,UAA4B,kBAAkB,WAAW,IAAI,cAAc,CAAC;EAElF,MAAM,QAAQ,QAAQ,SAAS;EAE/B,IAAI,SAAS,CAAC,wBAAwB;GACpC,IAAI;GACJ,IAAI;IACF,UAAU,UAAU,KAAK;GAC3B,QACM;IACJ,UAAU;GACZ;GACA,MAAM,cAAc,KAAK,IAAI,IAAI;GACjC,IAAI,YAAY,QAAQ,OAAO,QAAQ,GAAG,IAAI,aAAa,QAAQ,gBAAgB;EACrF;EAEA,IAAI,UAAU,MAAM,SAAS;GAAE,GAAG;GAAS;EAAuB,CAAC;EACnE,OAAO;GAAE,GAAG;GAAS;EAAuB;CAC9C;;;;;;;;CASA,MAAM,mBAAmB,oBAAsC,UAA2E;EACxI,MAAM,UAAU;EAEhB,eAAe,SAAS,MAAmD;GACzE,IAAI,UAAU,MAAM,SAAS,IAAI;GACjC,OAAO,QAAQ,QAAQ,IAAI,CAAC,CAAC,KAAK,OAAO,QAAQ;IAC/C,QAAQ,0BAA0B;IAClC,OAAO;GACT,CAAC;EACH;EAEA,IAAI,CAAC,oBAAoB,SAAS,CAAC,oBAAoB,cAAc,OAAO,SAAS,QAAQ,mBAAmB;EAIhH,eAAe,8BAAiD;GAC9D,MAAM,EAAE,OAAO,iBAAiB;GAEhC,MAAM,UAAU,IAAI,QAAQ,OAAO,QAAQ,QAAQ,uBAAuB,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,WAA6B,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC;GAElJ,MAAM,OAAO,IAAI,SAAS;GAC1B,KAAK,OAAO,cAAc,eAAe;GACzC,KAAK,OAAO,iBAAiB,gBAAgB,EAAE;GAC/C,KAAK,OAAO,aAAa,OAAO;GAChC,KAAK,OAAO,iBAAiB,QAAQ;GACrC,KAAK,OAAO,eAAe,SAAS;GAEpC,OAAO,MAAM,GAAG,QAAQ,sBAAsB;IAC5C,MAAM;IACN,QAAQ;IACR;IACA;IACA,UAAU;GACZ,CAAC;EACH;EAKA,MAAM,iBACF,OAAO,QAAQ,8BAA8B,aAC3C,MAAM,QAAQ,0BAA0B,kBAAkB,IAC1D,MAAM,4BAA4B;EAExC,OAAO,SAAS,kBAAkB,cAAc,IAAI,iBAAiB,QAAQ,mBAAmB;CAClG;;;;;;;CAQA,MAAM,YAAY,eAAwC;EACxD,OAAO,IAAI,SAAe,YAAY;GACpC,IAAI,CAAC,KAAK,uBAAuB,GAAG;IAClC,IAAI,eAAe,KAAK,uBAAuB;IAC/C,QAAQ;GACV,OACK;IACH,MAAM,aAAa,kBAAkB;KACnC,IAAI,CAAC,KAAK,uBAAuB,GAAG;MAClC,cAAc,UAAU;MACxB,QAAQ;KACV;IACF,GAAG,KAAK,kCAAkC;GAC5C;EACF,CAAC;CACH;;;;;;;CAQA,MAAM,mBAAmB,MAAmD;EAC1E,IAAI,CAAC,KAAK,iBAAiB,CAAC,KAAK,wBAAwB,OAAO;EAEhE,MAAM,UAAU;EAEhB,OAAO,QAAQ,mBAAmB,OAAM,aAAY,QAAQ,kBAAkB,QAAQ,CAAC,CAAC,CAAC,WAAW;GAClG,OAAO,IAAI,SAA2B,YAAY;IAChD,WAAW,YAAY;KACrB,MAAM,iBAAiB,MAAM,QAAQ,eAAe;KACpD,IAAI,CAAC,gBAAgB,OAAO;MAC1B,eAAe,kBAAkB;MACjC,iBAAiB;OACf,SAAS,6BAA6B;MACxC,GAAG,CAAC;KACN;KACA,QAAQ,cAAc;IACxB,GAAG,CAAC;GACN,CAAC;EACH,CAAC;CACH;AACF"}
1
+ {"version":3,"file":"CredentialsProcessing.js","names":[],"sources":["../../../../../src/Classes/RESTAPI/partials/CredentialsProcessing.ts"],"sourcesContent":["import type { CredentialsState, RESTAPISettings, UnknownRecord } from './types';\nimport { getIsOnlyAnObject } from './_utils';\n\n/**\n * Декодирует payload JWT-токена.\n *\n * @param token - JWT-строка вида `header.payload.signature`.\n * @returns Распарсенный payload (объект) либо `null`, если декодирование не удалось.\n */\nexport function decodeJWT(token: string): UnknownRecord | null {\n try {\n const payload = token.split('.')[1] ?? '';\n const decoded: unknown = JSON.parse(atob(payload));\n return getIsOnlyAnObject(decoded) ? decoded : null;\n }\n catch {\n return null;\n }\n}\n\n/**\n * Обработчик учётных данных (токенов): добавляет токен в запросы и (опционально) реализует\n * флоу рефреша токенов. Конфигурируется через настройку `credentialsProcessing`.\n */\nclass CredentialsProcessing {\n // ? Индекс-сигнатура: getRESTAPIContext навешивается извне (из конструктора RESTAPI).\n [key: string]: unknown;\n\n /** Включён ли флоу рефреша токенов. */\n isUseRefreshTokensPropcessing = false;\n\n /** Учётные данные по умолчанию (пустые). */\n DEFAULT_CREDENTIALS: CredentialsState = {};\n\n /** Внешний метод получения учётных данных. */\n getCredentialsByOuter!: () => unknown;\n\n /** Внешний метод формирования заголовков авторизации по токену. */\n getHeadersForAuthorize!: (token: string) => UnknownRecord;\n\n /** Необязательный преобразователь учётных данных после getCredentials. */\n importCredentials?: (cred: unknown) => unknown;\n\n /** Необязательный метод сохранения учётных данных (обязателен для флоу рефреша). */\n saveCredentials?: (cred: unknown) => unknown;\n\n /** Внешний метод рефреша учётных данных. */\n refreshCredentialsByOuter?: (cred: CredentialsState) => unknown;\n\n /** Полный путь до эндпоинта рефреша токена. */\n REFRESH_TOKEN_PATH?: string;\n\n /** Коды ответа, по которым триггерится попытка рефреша. */\n CODES_USING_THE_REFRESH_ATTEMPT?: number[];\n\n /** Ключ флага «рефреш начат» в localStorage. */\n REFRESH_TOKEN_FLAG = 'refreshTokenFlag';\n\n /** Интервал опроса флага обновления токена, мс. */\n INTERVAL_FOR_CHECKING_TOKEN_UPDATE = 50;\n\n /** Колбэк, вызываемый после неудачного рефреша. */\n callbackAfterRejectRefresh?: () => unknown;\n\n /** Доступ к верхнему контексту RESTAPI (навешивается из конструктора RESTAPI). */\n getRESTAPIContext?: () => unknown;\n\n constructor(settings: RESTAPISettings) {\n const { credentialsProcessing } = settings;\n const {\n // ? Для корректной работы установки токенов в запросы от API\n // ? нужно передавать методы getCredentials и getHeadersForAuthorize\n getCredentials,\n getHeadersForAuthorize, // ? На вход получит токен, должна вернуть объект для коструктора Headers\n\n // ? Так же опционально можно передавать\n importCredentials, // ? если он передается, то он будет применяться к выводу от вызова getCredentials\n saveCredentials, // ? можно будет найти в объекте credentialsProcessing, чтобы использовать кастомными методами\n\n // ! Либо вызов getCredentials, либо цепочка вызовов importCredentials(getCredentials())\n // ! должна возвращать требуемую классом структуру\n // ! Класс требует структуры\n // ! - { token }, если флоу рефреш токена НЕ используется\n // ! - { token, refreshToken, expires }, если используется флоу рефреш токена\n\n // *********\n\n // ? Подключает флоу рефреша токенов\n isUseRefreshTokensPropcessing = false,\n\n // ! Для корректной работы флоу рефреша токенов передача метода saveCredentials становится ОБЯЗАТЕЛЬНОЙ\n\n // ? Так же для корректной работы флоу рефреша токенов нужно\n // ? - либо\n refreshCredentials, // ! метод должен возвращать такую же структуру как и метод getCredentials,\n // ? на вход получит текущие креды, к выходу будет применен importCredentials, если этот метод передавался\n // ? - либо\n REFRESH_TOKEN_PATH, // ! REFRESH_TOKEN_PATH передается ПОЛНОСТЬЮ (глобальная адресация)!\n CODES_USING_THE_REFRESH_ATTEMPT, // ? указывает по каким кодам ответа триггериться рефреш, массив чисел\n\n // ? Опционально\n REFRESH_TOKEN_FLAG = 'refreshTokenFlag',\n INTERVAL_FOR_CHECKING_TOKEN_UPDATE = 50, // ms\n callbackAfterRejectRefresh,\n } = credentialsProcessing || {};\n\n if (typeof getCredentials !== 'function') throw new Error('No getCredentials method [CredentialsProcessing]');\n if (typeof getHeadersForAuthorize !== 'function') {\n throw new TypeError('No getHeadersForAuthorize method [CredentialsProcessing]');\n }\n if (importCredentials && typeof importCredentials !== 'function') {\n throw new Error('Bad importCredentials method [CredentialsProcessing]');\n }\n\n this.isUseRefreshTokensPropcessing = Boolean(isUseRefreshTokensPropcessing);\n this.DEFAULT_CREDENTIALS = {};\n // ? Внешние функции оборачиваем в типизированные обёртки (без приведения типов / типа Function).\n this.getCredentialsByOuter = () => getCredentials();\n this.getHeadersForAuthorize = (token: string) => {\n const result = getHeadersForAuthorize(token);\n return getIsOnlyAnObject(result) ? result : {};\n };\n if (typeof importCredentials === 'function') this.importCredentials = (cred: unknown) => importCredentials(cred);\n\n // ? Если метод передан или если не передан, но включен флоу обновления токенов (тогда saveCredentials обязателен)\n if (saveCredentials || isUseRefreshTokensPropcessing) {\n if (typeof saveCredentials !== 'function') throw new Error('No saveCredentials method [CredentialsProcessing]');\n else this.saveCredentials = (cred: unknown) => saveCredentials(cred);\n }\n\n if (isUseRefreshTokensPropcessing) {\n if (typeof refreshCredentials === 'function') {\n this.refreshCredentialsByOuter = (cred: CredentialsState) => refreshCredentials(cred);\n }\n else {\n if (typeof this.refreshCredentialsByOuter === 'function' && typeof REFRESH_TOKEN_PATH !== 'string') {\n throw new TypeError('No REFRESH_TOKEN_PATH [CredentialsProcessing]');\n }\n this.REFRESH_TOKEN_PATH = typeof REFRESH_TOKEN_PATH === 'string' ? REFRESH_TOKEN_PATH : undefined;\n }\n\n if (!Array.isArray(CODES_USING_THE_REFRESH_ATTEMPT)) {\n throw new TypeError('No CODES_USING_THE_REFRESH_ATTEMPT [CredentialsProcessing]');\n }\n if (!CODES_USING_THE_REFRESH_ATTEMPT.every(i => typeof i === 'number')) {\n throw new Error('Invalid format of CODES_USING_THE_REFRESH_ATTEMPT elements [CredentialsProcessing]');\n }\n\n if (typeof REFRESH_TOKEN_FLAG !== 'string') throw new Error('Bad REFRESH_TOKEN_FLAG [CredentialsProcessing]');\n if (typeof INTERVAL_FOR_CHECKING_TOKEN_UPDATE !== 'number') {\n throw new TypeError('Bad INTERVAL_FOR_CHECKING_TOKEN_UPDATE [CredentialsProcessing]');\n }\n if (typeof INTERVAL_FOR_CHECKING_TOKEN_UPDATE !== 'number') {\n throw new TypeError('Bad INTERVAL_FOR_CHECKING_TOKEN_UPDATE [CredentialsProcessing]');\n }\n if (callbackAfterRejectRefresh && typeof callbackAfterRejectRefresh !== 'function') {\n throw new Error('Bad INTERVAL_FOR_CHECKING_TOKEN_UPDATE [CredentialsProcessing]');\n }\n\n this.CODES_USING_THE_REFRESH_ATTEMPT = CODES_USING_THE_REFRESH_ATTEMPT;\n this.REFRESH_TOKEN_FLAG = REFRESH_TOKEN_FLAG;\n this.INTERVAL_FOR_CHECKING_TOKEN_UPDATE = INTERVAL_FOR_CHECKING_TOKEN_UPDATE;\n\n if (typeof callbackAfterRejectRefresh === 'function') this.callbackAfterRejectRefresh = () => callbackAfterRejectRefresh();\n }\n }\n\n /** Возвращает значение флага «рефреш начат» из localStorage. */\n getIsTokenStartRefresh(): string | null {\n return localStorage.getItem(this.REFRESH_TOKEN_FLAG);\n }\n\n /** Выставляет флаг «рефреш начат» в localStorage. */\n setIsTokenStartRefresh(): void {\n localStorage.setItem(this.REFRESH_TOKEN_FLAG, String(true));\n }\n\n /** Снимает флаг «рефреш начат» из localStorage. */\n removeIsTokenStartRefresh(): void {\n localStorage.removeItem(this.REFRESH_TOKEN_FLAG);\n }\n\n /**\n * Возвращает текущие учётные данные (с учётом importCredentials и проверки истечения JWT).\n *\n * @param isCatchCallbackProcess - флаг процесса обработки ошибки (отключает проверку истечения).\n * @param callback - необязательный колбэк, получающий итоговые учётные данные.\n * @returns Промис с учётными данными.\n */\n async getCredentials(isCatchCallbackProcess?: boolean, callback?: (cred: CredentialsState) => unknown): Promise<CredentialsState> {\n let credentials: unknown = await this.getCredentialsByOuter();\n\n if (typeof this.importCredentials === 'function') credentials = await this.importCredentials(credentials);\n const credObj: CredentialsState = getIsOnlyAnObject(credentials) ? credentials : {};\n\n const token = credObj.token || null;\n\n if (token && !isCatchCallbackProcess) {\n let decoded: UnknownRecord | null;\n try {\n decoded = decodeJWT(token);\n }\n catch {\n decoded = null;\n }\n const currentTime = Date.now() / 1000;\n if (decoded !== null && Number(decoded.exp) < currentTime) credObj.isNeedRefresh = true;\n }\n\n if (callback) await callback({ ...credObj, isCatchCallbackProcess });\n return { ...credObj, isCatchCallbackProcess };\n }\n\n /**\n * Выполняет рефреш учётных данных (внешним методом либо дефолтным OAuth-флоу).\n *\n * @param currentCredentials - текущие учётные данные.\n * @param callback - необязательный колбэк сохранения новых учётных данных.\n * @returns Промис с новыми учётными данными.\n */\n async refreshCredentials(currentCredentials: CredentialsState, callback?: (cred: CredentialsState) => unknown): Promise<CredentialsState> {\n const CONTEXT = this;\n\n async function finalize(cred: CredentialsState): Promise<CredentialsState> {\n if (callback) await callback(cred);\n return Promise.resolve(cred).then(async (res) => {\n CONTEXT.removeIsTokenStartRefresh();\n return res;\n });\n }\n\n if (!currentCredentials?.token || !currentCredentials?.refreshToken) return finalize(CONTEXT.DEFAULT_CREDENTIALS);\n\n // ! ВНИМАНИЕ! Данный механизм рефреша принят на проекте finturfreactfrontend (админка)\n // ! На кабинете он ТОЧНО НЕ ТАКОЙ\n async function refreshCredentialsByDefault(): Promise<Response> {\n const { token, refreshToken } = currentCredentials;\n // ? Заголовки авторизации формируем через конструктор Headers из пар «ключ-значение».\n const headers = new Headers(Object.entries(CONTEXT.getHeadersForAuthorize(token || '')).map(([key, value]): [string, string] => [key, `${value}`]));\n\n const body = new FormData();\n body.append('grant_type', 'refresh_token');\n body.append('refresh_token', refreshToken || '');\n body.append('client_id', 'oauth');\n body.append('client_secret', 'secret');\n body.append('access_type', 'offline');\n\n return fetch(`${CONTEXT.REFRESH_TOKEN_PATH}`, {\n mode: 'cors',\n method: 'POST',\n headers,\n body,\n redirect: 'follow',\n });\n }\n\n // ? Передавайте собственный refreshCredentials при получении экземляра RESTAPI, если не уверены,\n // ? что механизм рефреша токенов ИМЕННО ТАКОЙ как в ф-и refreshCredentialsByDefault!\n // ! currentCredentials передаются в формате класса! ({ token, refreshToken, expires })\n const newCredentials\n = typeof CONTEXT.refreshCredentialsByOuter === 'function'\n ? await CONTEXT.refreshCredentialsByOuter(currentCredentials)\n : await refreshCredentialsByDefault();\n\n return finalize(getIsOnlyAnObject(newCredentials) ? newCredentials : CONTEXT.DEFAULT_CREDENTIALS);\n }\n\n /**\n * Ожидает завершения рефреша токена (или запускает его флаг при необходимости).\n *\n * @param isNeedRefresh - выставить ли флаг «рефреш начат» при отсутствии активного рефреша.\n * @returns Промис, который резолвится по завершении ожидания.\n */\n async waitRefresh(isNeedRefresh?: boolean): Promise<void> {\n return new Promise<void>((resolve) => {\n if (!this.getIsTokenStartRefresh()) {\n if (isNeedRefresh) this.setIsTokenStartRefresh();\n resolve();\n }\n else {\n const intervalId = setInterval(() => {\n if (!this.getIsTokenStartRefresh()) {\n clearInterval(intervalId);\n resolve();\n }\n }, this.INTERVAL_FOR_CHECKING_TOKEN_UPDATE);\n }\n });\n }\n\n /**\n * Обрабатывает учётные данные: при необходимости рефрешит токен и возвращает актуальные данные.\n *\n * @param cred - текущие учётные данные.\n * @returns Промис с актуальными учётными данными (с флагом isRefreshFailed при неудаче).\n */\n async processCredentials(cred: CredentialsState): Promise<CredentialsState> {\n if (!cred.isNeedRefresh && !cred.isCatchCallbackProcess) return cred;\n\n const CONTEXT = this;\n\n return CONTEXT.refreshCredentials(cred, response => CONTEXT.saveCredentials?.(response)).then(() => {\n return new Promise<CredentialsState>((resolve) => {\n setTimeout(async () => {\n const newCredentials = await CONTEXT.getCredentials();\n if (!newCredentials?.token) {\n newCredentials.isRefreshFailed = true;\n setTimeout(() => {\n CONTEXT?.callbackAfterRejectRefresh?.();\n }, 0);\n }\n resolve(newCredentials);\n }, 0);\n });\n });\n }\n}\n\nexport default CredentialsProcessing;\n"],"mappings":"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"}
@@ -37,13 +37,10 @@ function parseSSEEvent(block) {
37
37
  event.id = value;
38
38
  hasField = true;
39
39
  break;
40
- case "retry":
41
- if (/^\d+$/.test(value)) {
42
- event.retry = Number(value);
43
- hasField = true;
44
- }
45
- break;
46
- default: break;
40
+ case "retry": if (/^\d+$/.test(value)) {
41
+ event.retry = Number(value);
42
+ hasField = true;
43
+ }
47
44
  }
48
45
  });
49
46
  if (!hasField) return null;
@@ -1 +1 @@
1
- {"version":3,"file":"sse.js","names":[],"sources":["../../../../../src/Classes/RESTAPI/partials/sse.ts"],"sourcesContent":["import type { SSEEvent, SSEReadOptions, StreamResponseLike } from './types';\n\n// ? Утилиты для обработки Server-Sent Events (text/event-stream).\n// ? Используются крейтером createRequest_sse (смотри класс ApiRequestCreators).\n// ? Реализация следует спецификации EventSource:\n// ? - события разделяются пустой строкой;\n// ? - строки вида \"field:value\" (один ведущий пробел в value отбрасывается);\n// ? - строка, начинающаяся с \":\", — комментарий (игнорируется);\n// ? - несколько полей data склеиваются через \"\\n\";\n// ? - поддерживаемые поля: event, data, id, retry.\n\n/**\n * Парсит один блок SSE (текст между пустыми строками) в объект события.\n *\n * Возвращает `null`, если в блоке не оказалось ни одного значимого поля\n * (например, блок состоял только из комментариев/heartbeat-а).\n *\n * @param block - сырой текстовый блок SSE (без завершающей пустой строки).\n * @returns Разобранное событие {@link SSEEvent} либо `null`.\n */\nexport function parseSSEEvent(block: string): SSEEvent | null {\n if (typeof block !== 'string') return null;\n\n const event: SSEEvent = { event: 'message', data: '', id: undefined, retry: undefined };\n const dataLines: string[] = [];\n let hasField = false;\n\n block.split('\\n').forEach((line) => {\n // ? Пустая строка внутри блока невозможна (по ней блок и режется), но на всякий случай пропускаем.\n // ? Строка-комментарий начинается с двоеточия.\n if (line === '' || line[0] === ':') return;\n\n const colonIdx = line.indexOf(':');\n const field = colonIdx === -1 ? line : line.slice(0, colonIdx);\n let value = colonIdx === -1 ? '' : line.slice(colonIdx + 1);\n // ? По спеке отбрасывается ровно один ведущий пробел значения.\n if (value[0] === ' ') value = value.slice(1);\n\n switch (field) {\n case 'event':\n event.event = value;\n hasField = true;\n break;\n case 'data':\n dataLines.push(value);\n hasField = true;\n break;\n case 'id':\n event.id = value;\n hasField = true;\n break;\n case 'retry':\n if (/^\\d+$/.test(value)) {\n event.retry = Number(value);\n hasField = true;\n }\n break;\n default:\n // ? Неизвестные поля по спеке игнорируются.\n break;\n }\n });\n\n if (!hasField) return null;\n event.data = dataLines.join('\\n');\n return event;\n}\n\n// ? Безопасный вызов пользовательского колбэка: его ошибка не должна рвать чтение потока.\nfunction safeCall(fn: unknown, ...args: unknown[]): void {\n if (typeof fn !== 'function') return;\n try {\n // ? fn сужен до функции type-guard-ом выше — вызываем без приведения типов.\n fn(...args);\n }\n catch {\n /* пользовательский колбэк не влияет на чтение потока */\n }\n}\n\n/**\n * Читает тело Response как поток Server-Sent Events.\n *\n * Резолвится массивом всех полученных событий ПОСЛЕ закрытия потока.\n * Прерывание потока через `AbortController` трактуется как штатное завершение\n * (возвращается то, что успели собрать); любая иная ошибка чтения пробрасывается выше.\n *\n * @param response - объект Response (или duck-typed с `body.getReader()`).\n * @param options - колбэки и опции обработки потока (см. {@link SSEReadOptions}).\n * @param options.onEvent - вызывается на каждое распарсенное событие.\n * @param options.onChunk - вызывается на полезную нагрузку (поле data) каждого события.\n * @param options.handlers - карта `{ имяСобытия: cb }` для обработки по полю `event`.\n * @param options.parseJson - если `true`, поле `data` прогоняется через `JSON.parse`.\n * @returns Промис с массивом всех распарсенных событий {@link SSEEvent}.\n */\nexport async function readSSE(response: StreamResponseLike, { onEvent, onChunk, handlers, parseJson }: SSEReadOptions = {}): Promise<SSEEvent[]> {\n const events: SSEEvent[] = [];\n // ? Нет тела — нечего читать (защита от null и для strictNullChecks).\n const stream = response.body;\n if (!stream) return events;\n\n const reader = stream.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n // ? Отложенный хвостовой \"\\r\": может оказаться первой половиной \"\\r\\n\", разорванного на границе чанков.\n // ? Без этого наивная нормализация превратила бы \"\\r\" + \"\\n\" в \"\\n\\n\" и создала ложный разделитель событий.\n let pendingCR = '';\n\n // ? Нормализует переводы строк в одном чанке (SSE допускает CR, LF и CRLF).\n const normalize = (chunk: string): string => chunk.replace(/\\r\\n|\\r/g, '\\n');\n\n // ? Диспетчер одного готового блока: парсит, аккумулирует и дёргает колбэки.\n const flush = (rawBlock: string): void => {\n const event = parseSSEEvent(rawBlock);\n if (!event) return;\n\n // ? Опциональный JSON-парсинг полезной нагрузки (под бэкенды, шлющие JSON в data).\n if (parseJson && typeof event.data === 'string' && event.data !== '') {\n try {\n event.data = JSON.parse(event.data);\n }\n catch {\n /* не валидный JSON — оставляем data строкой */\n }\n }\n\n events.push(event);\n safeCall(onEvent, event);\n safeCall(onChunk, event.data, event);\n // ? Типизированный обработчик по имени события (event: delta|status|done|...).\n if (handlers) safeCall(handlers[event.event], event.data, event);\n };\n\n try {\n // ? Читаем поток до закрытия, по мере прихода чанков нарезаем готовые события.\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n // ? Нормализуем только пришедший чанк (линейная сложность), переноса всего буфера не делаем.\n let chunk = pendingCR + decoder.decode(value, { stream: true });\n pendingCR = '';\n // ? Если чанк оканчивается на \"\\r\" — откладываем его: вдруг следующий чанк начнётся с \"\\n\" (CRLF на границе).\n if (chunk.endsWith('\\r')) {\n pendingCR = '\\r';\n chunk = chunk.slice(0, -1);\n }\n buffer += normalize(chunk);\n\n // ? Вырезаем все завершённые события (разделитель — пустая строка).\n let sepIdx;\n // eslint-disable-next-line no-cond-assign\n while ((sepIdx = buffer.indexOf('\\n\\n')) !== -1) {\n const rawBlock = buffer.slice(0, sepIdx);\n buffer = buffer.slice(sepIdx + 2);\n flush(rawBlock);\n }\n }\n\n // ? Добиваем декодер, отложенный \"\\r\" и хвост, если поток закрылся без финальной пустой строки.\n buffer += normalize(pendingCR + decoder.decode());\n buffer = buffer.replace(/\\n+$/g, '');\n if (buffer !== '') flush(buffer);\n }\n catch (error: unknown) {\n // ? Прерывание (abort) — это штатное завершение стрима: возвращаем то, что успели собрать.\n // ? Любую иную ошибку чтения пробрасываем выше (её обработает catchCallback/пользователь).\n // ? abort бросает DOMException с name === 'AbortError' (в Node он не instanceof Error) — проверяем поле через guard.\n const name = error && typeof error === 'object' && 'name' in error ? error.name : undefined;\n if (name !== 'AbortError') throw error;\n }\n finally {\n try {\n reader.releaseLock?.();\n }\n catch {\n /* releaseLock может бросить, если поток уже отпущен — игнорируем */\n }\n }\n\n return events;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sse.js","names":[],"sources":["../../../../../src/Classes/RESTAPI/partials/sse.ts"],"sourcesContent":["import type { SSEEvent, SSEReadOptions, StreamResponseLike } from './types';\n\n// ? Утилиты для обработки Server-Sent Events (text/event-stream).\n// ? Используются крейтером createRequest_sse (смотри класс ApiRequestCreators).\n// ? Реализация следует спецификации EventSource:\n// ? - события разделяются пустой строкой;\n// ? - строки вида \"field:value\" (один ведущий пробел в value отбрасывается);\n// ? - строка, начинающаяся с \":\", — комментарий (игнорируется);\n// ? - несколько полей data склеиваются через \"\\n\";\n// ? - поддерживаемые поля: event, data, id, retry.\n\n/**\n * Парсит один блок SSE (текст между пустыми строками) в объект события.\n *\n * Возвращает `null`, если в блоке не оказалось ни одного значимого поля\n * (например, блок состоял только из комментариев/heartbeat-а).\n *\n * @param block - сырой текстовый блок SSE (без завершающей пустой строки).\n * @returns Разобранное событие {@link SSEEvent} либо `null`.\n */\nexport function parseSSEEvent(block: string): SSEEvent | null {\n if (typeof block !== 'string') return null;\n\n const event: SSEEvent = { event: 'message', data: '', id: undefined, retry: undefined };\n const dataLines: string[] = [];\n let hasField = false;\n\n block.split('\\n').forEach((line) => {\n // ? Пустая строка внутри блока невозможна (по ней блок и режется), но на всякий случай пропускаем.\n // ? Строка-комментарий начинается с двоеточия.\n if (line === '' || line[0] === ':') return;\n\n const colonIdx = line.indexOf(':');\n const field = colonIdx === -1 ? line : line.slice(0, colonIdx);\n let value = colonIdx === -1 ? '' : line.slice(colonIdx + 1);\n // ? По спеке отбрасывается ровно один ведущий пробел значения.\n if (value[0] === ' ') value = value.slice(1);\n\n switch (field) {\n case 'event':\n event.event = value;\n hasField = true;\n break;\n case 'data':\n dataLines.push(value);\n hasField = true;\n break;\n case 'id':\n event.id = value;\n hasField = true;\n break;\n case 'retry':\n if (/^\\d+$/.test(value)) {\n event.retry = Number(value);\n hasField = true;\n }\n break;\n default:\n // ? Неизвестные поля по спеке игнорируются.\n break;\n }\n });\n\n if (!hasField) return null;\n event.data = dataLines.join('\\n');\n return event;\n}\n\n// ? Безопасный вызов пользовательского колбэка: его ошибка не должна рвать чтение потока.\nfunction safeCall(fn: unknown, ...args: unknown[]): void {\n if (typeof fn !== 'function') return;\n try {\n // ? fn сужен до функции type-guard-ом выше — вызываем без приведения типов.\n fn(...args);\n }\n catch {\n /* пользовательский колбэк не влияет на чтение потока */\n }\n}\n\n/**\n * Читает тело Response как поток Server-Sent Events.\n *\n * Резолвится массивом всех полученных событий ПОСЛЕ закрытия потока.\n * Прерывание потока через `AbortController` трактуется как штатное завершение\n * (возвращается то, что успели собрать); любая иная ошибка чтения пробрасывается выше.\n *\n * @param response - объект Response (или duck-typed с `body.getReader()`).\n * @param options - колбэки и опции обработки потока (см. {@link SSEReadOptions}).\n * @param options.onEvent - вызывается на каждое распарсенное событие.\n * @param options.onChunk - вызывается на полезную нагрузку (поле data) каждого события.\n * @param options.handlers - карта `{ имяСобытия: cb }` для обработки по полю `event`.\n * @param options.parseJson - если `true`, поле `data` прогоняется через `JSON.parse`.\n * @returns Промис с массивом всех распарсенных событий {@link SSEEvent}.\n */\nexport async function readSSE(response: StreamResponseLike, { onEvent, onChunk, handlers, parseJson }: SSEReadOptions = {}): Promise<SSEEvent[]> {\n const events: SSEEvent[] = [];\n // ? Нет тела — нечего читать (защита от null и для strictNullChecks).\n const stream = response.body;\n if (!stream) return events;\n\n const reader = stream.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n // ? Отложенный хвостовой \"\\r\": может оказаться первой половиной \"\\r\\n\", разорванного на границе чанков.\n // ? Без этого наивная нормализация превратила бы \"\\r\" + \"\\n\" в \"\\n\\n\" и создала ложный разделитель событий.\n let pendingCR = '';\n\n // ? Нормализует переводы строк в одном чанке (SSE допускает CR, LF и CRLF).\n const normalize = (chunk: string): string => chunk.replace(/\\r\\n|\\r/g, '\\n');\n\n // ? Диспетчер одного готового блока: парсит, аккумулирует и дёргает колбэки.\n const flush = (rawBlock: string): void => {\n const event = parseSSEEvent(rawBlock);\n if (!event) return;\n\n // ? Опциональный JSON-парсинг полезной нагрузки (под бэкенды, шлющие JSON в data).\n if (parseJson && typeof event.data === 'string' && event.data !== '') {\n try {\n event.data = JSON.parse(event.data);\n }\n catch {\n /* не валидный JSON — оставляем data строкой */\n }\n }\n\n events.push(event);\n safeCall(onEvent, event);\n safeCall(onChunk, event.data, event);\n // ? Типизированный обработчик по имени события (event: delta|status|done|...).\n if (handlers) safeCall(handlers[event.event], event.data, event);\n };\n\n try {\n // ? Читаем поток до закрытия, по мере прихода чанков нарезаем готовые события.\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n // ? Нормализуем только пришедший чанк (линейная сложность), переноса всего буфера не делаем.\n let chunk = pendingCR + decoder.decode(value, { stream: true });\n pendingCR = '';\n // ? Если чанк оканчивается на \"\\r\" — откладываем его: вдруг следующий чанк начнётся с \"\\n\" (CRLF на границе).\n if (chunk.endsWith('\\r')) {\n pendingCR = '\\r';\n chunk = chunk.slice(0, -1);\n }\n buffer += normalize(chunk);\n\n // ? Вырезаем все завершённые события (разделитель — пустая строка).\n let sepIdx;\n // eslint-disable-next-line no-cond-assign\n while ((sepIdx = buffer.indexOf('\\n\\n')) !== -1) {\n const rawBlock = buffer.slice(0, sepIdx);\n buffer = buffer.slice(sepIdx + 2);\n flush(rawBlock);\n }\n }\n\n // ? Добиваем декодер, отложенный \"\\r\" и хвост, если поток закрылся без финальной пустой строки.\n buffer += normalize(pendingCR + decoder.decode());\n buffer = buffer.replace(/\\n+$/g, '');\n if (buffer !== '') flush(buffer);\n }\n catch (error: unknown) {\n // ? Прерывание (abort) — это штатное завершение стрима: возвращаем то, что успели собрать.\n // ? Любую иную ошибку чтения пробрасываем выше (её обработает catchCallback/пользователь).\n // ? abort бросает DOMException с name === 'AbortError' (в Node он не instanceof Error) — проверяем поле через guard.\n const name = error && typeof error === 'object' && 'name' in error ? error.name : undefined;\n if (name !== 'AbortError') throw error;\n }\n finally {\n try {\n reader.releaseLock?.();\n }\n catch {\n /* releaseLock может бросить, если поток уже отпущен — игнорируем */\n }\n }\n\n return events;\n}\n"],"mappings":"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"}
@@ -31,9 +31,7 @@ var intlNumbersFormatter = (inputValue, settings = {}) => {
31
31
  case "currency":
32
32
  numberStyle = "currency";
33
33
  break;
34
- default:
35
- numberStyle = "decimal";
36
- break;
34
+ default: numberStyle = "decimal";
37
35
  }
38
36
  const { quantity, isRenderAlways = false, minimumFractionDigits: inputMinimumFractionDigits, maximumFractionDigits: inputMaximumFractionDigits, conditionallyMinimumFractionDigits } = fractionDigits;
39
37
  const dotIndex = safelyInputValue?.indexOf(".");
@@ -1 +1 @@
1
- {"version":3,"file":"fieldValueFormatters.js","names":["value"],"sources":["../../../src/Functions/fieldValueFormatters.js"],"sourcesContent":["import { getIsOnlyAnObject } from \"./utils\";\n\n//? The first word \"format\" in the function name means a logic\n//? in which the function transforms the incoming value in any case.\n\n//? The first word \"transform\" in the function name means a logic\n//? in which the function converts the whole value, but this is not suitable for sequential input\n\n//? The first word \"filter\" in the function name means a logic\n//? in which the function works as a changer for sequential input\n\n// ****************************\n// Base utils\n// ****************************\n\nexport const getSafelyValue = (value) =>\n value !== undefined && value !== null ? value?.toString?.() || \"\" : \"\";\n\n// базовая реализация\nexport const intlNumbersFormatter = (inputValue, settings = {}) => {\n const safelyInputValue = getSafelyValue(inputValue);\n const previousValue = safelyInputValue.slice(0, -1);\n const lastSym = safelyInputValue.slice(-1);\n const value = lastSym === \".\" ? previousValue : safelyInputValue;\n\n if (Number.isNaN(Number(value)) || !getSafelyValue(value)) return \"\";\n\n const {\n // локаль, даже региональная, влияет на отображение знаков и формата.\n locale = \"en-US\",\n // percent || currency(default case) || decimal(просто число) влияет на ТИП обработки.\n withSymbol,\n //группировка запятыми поразрядно.\n useGrouping = true,\n //!!работает только при withSymbol: 'currency' !! влияет на то, как именно будет выглядет формат валюты.\n currency = {},\n //сколько знаков после точки, и всегда ли они будут.\n // !!если поставить isAlwaysRender: true, но не дать центов, то будет 100.00\n fractionDigits = {},\n } = settings;\n\n const { currencyType = \"USD\", currencyDisplay: inputCurrencyDisplay } =\n currency;\n\n let currencyDisplay;\n switch (inputCurrencyDisplay) {\n case \"name\":\n currencyDisplay = \"name\";\n break;\n case \"code\":\n currencyDisplay = \"code\";\n break;\n case \"narrowSymbol\":\n currencyDisplay = \"narrowSymbol\";\n break;\n default:\n currencyDisplay = \"symbol\";\n }\n\n let numberStyle;\n switch (withSymbol) {\n case \"percent\":\n numberStyle = \"percent\";\n break;\n case \"currency\":\n numberStyle = \"currency\";\n break;\n default:\n numberStyle = \"decimal\";\n break;\n }\n\n const {\n quantity,\n isRenderAlways = false,\n minimumFractionDigits: inputMinimumFractionDigits,\n maximumFractionDigits: inputMaximumFractionDigits,\n conditionallyMinimumFractionDigits,\n } = fractionDigits;\n\n const dotIndex = safelyInputValue?.indexOf(\".\");\n const afterDot = dotIndex !== -1 ? safelyInputValue.slice(dotIndex + 1) : \"\";\n const minimumFractionDigits = (() => {\n //? Безусловное минимальное количество. Всегда отрендерит дробную часть, в количестве символов сколько указано\n if (typeof inputMinimumFractionDigits === \"number\")\n return inputMinimumFractionDigits;\n //? Условное минимальное количество. Если есть дробная часть, то отрендерит дробных символов сколько указано\n if (typeof conditionallyMinimumFractionDigits === \"number\") {\n return afterDot && lastSym !== \".\"\n ? conditionallyMinimumFractionDigits\n : 0;\n }\n //? Дефолтное минимальное количество. Если есть дробная часть, то отрендерит дробных символов столько, сколько есть\n //? Флаг isRenderAlways превращает дефолтный кейс в безусловное минимальное количество\n return afterDot && lastSym !== \".\"\n ? safelyInputValue.slice(dotIndex).length - 1\n : isRenderAlways\n ? quantity\n : 0;\n })();\n\n const priceSettings = {\n useGrouping, //группировка разрядов\n style: numberStyle, //тип форматирования (валюта или число). decimal - без знака валюты\n currency: currencyType, //валюта\n currencyDisplay, //валюта в виде символа\n //минимально не надо отображать центы, если их нет, иначе всегда будет .00\n minimumFractionDigits,\n //! Важно! Если придет велью с количеством дробных разрядов БОЛЬШИМ\n //! чем указано в (inputMaximumFractionDigits ?? quantity) - округлит по правилам округления\n //максимально отображать 2 цифры после запятой, если центы всё же есть\n maximumFractionDigits: inputMaximumFractionDigits ?? quantity,\n };\n\n let output;\n\n try {\n output = new Intl.NumberFormat(locale, priceSettings).format(value);\n } catch (e) {\n output = value;\n // eslint-disable-next-line no-console\n console.warn(\"Intl.NumberFormat error\", e);\n }\n return lastSym === \".\" ? output + lastSym : output;\n};\n\n// ****************************\n// format\n// ****************************\n\nexport const formatOnlyNumbers = (value) =>\n getSafelyValue(value).replace(/\\D/g, \"\");\nexport const formatToRemoveComa = (value) =>\n getSafelyValue(value).replace(/,/g, \"\");\nexport const formatToAddBitDepthPoints = (value, settings) =>\n intlNumbersFormatter(getSafelyValue(value), {\n fractionDigits: {\n quantity: settings?.type === \"int\" ? 0 : settings?.decimalPlaces,\n },\n });\n\n//! Важно! Если придет велью с количеством дробных разрядов БОЛЬШИМ\n//! чем указано в quantity - округлит по правилам округления\nexport const formatToPriceWithUSD = (value) => {\n if (isNaN(Number(value))) return value;\n return intlNumbersFormatter(getSafelyValue(value), {\n withSymbol: \"currency\",\n currency: { currencyType: \"USD\" },\n fractionDigits: { quantity: 2, conditionallyMinimumFractionDigits: 2 },\n });\n};\n\n//! Важно! Если придет велью с количеством дробных разрядов БОЛЬШИМ\n//! чем указано в quantity - округлит по правилам округления\n\n// ToDo - symbolPosition временно не реализовано\nexport const formatToPriceWithCurrency = (\n value,\n currencyCode,\n symbolPosition = \"before\",\n) => {\n if (isNaN(Number(value))) return value;\n return intlNumbersFormatter(getSafelyValue(value), {\n withSymbol: \"currency\",\n currency: { currencyType: currencyCode },\n fractionDigits: { quantity: 2, conditionallyMinimumFractionDigits: 2 },\n });\n};\n\n//? Добавляет в конец знак %. Работает как с одиночными значениями, так и с диапазонами.\n\n//? value может быть любое, но ожидается что будет\n//? - числом\n//? - строкой в формате \"значение\"\n//? - строкой в формате \"значение - значение\" (значение_пробел_тире_пробел_значение)\n//? - объект в формате { from: значение, to: значение }\n\n//? Предполагается, что \"значение\" может быть приведено к числу операторм + (пример: +значение приводится к числу).\n//? Если не может быть приведено, то \"значение\" вернется как есть, к результату добавится %\n\n//? Если \"значение\" пустое (getSafelyValue(значение) вернет пустую строку),\n//? то это воспринимается как 0, приводится к 0.00%\n\n//? Одиноково работает как для \".\", так и \",\" в качестве разделителя дробных разрядов\n\n//! Важно! Если придет велью с количеством дробных разрядов БОЛЬШИМ\n//! чем указано в decimalPlaces - округлит по правилам округления\n\nexport const formatAsPercentage = (value, settings) => {\n const {\n isCommonPercentageSymbol = true,\n decimalPlaces = 2,\n beforeValueSymbol = \"\",\n afterValueSymbol = \"\",\n isGlueSameRangesTogether = false,\n\n // ? Тут удобный ф-л, поэтому иной раз удобно обработать обычный диапазан (НЕ проценты).\n // ? Добавил возможность выпиливать значек процентов.\n // todo(VL) - вообще правильно заренеймить (formatAsDiapason), а добавление процентов сделать как опцию,\n // todo(VL) - но как обычно нет времени, нужно будет перечекать по всем проектам где тянется со старым неймингом\n isUseAsSimpleDiapason = false,\n } = getIsOnlyAnObject(settings) ? settings : {};\n let safelyInputValue;\n\n const checkValue = (value) => getSafelyValue(value) || \"0\";\n\n const transform = (valueAsSting) => {\n const processedValue = valueAsSting.replace(/,/g, \".\");\n if (Number.isNaN(Number(processedValue))) return processedValue;\n return `${intlNumbersFormatter(getSafelyValue(Number(processedValue)), {\n fractionDigits: {\n quantity: decimalPlaces,\n minimumFractionDigits: decimalPlaces,\n },\n })}`;\n };\n\n if (getIsOnlyAnObject(value)) {\n safelyInputValue = {\n from: checkValue(value.from),\n to: checkValue(value.to),\n };\n } else {\n safelyInputValue = checkValue(value);\n\n if (safelyInputValue.includes(\" - \")) {\n const valuesArr = safelyInputValue\n .split(\" - \")\n .map((partOfValue) => partOfValue.trim());\n safelyInputValue = {\n from: checkValue(valuesArr[0]),\n to: checkValue(valuesArr[1]),\n };\n } else {\n // Вариант когда велью передано строкой (НЕ объектом) и оно не содержит сепаратора \" - \"\n // - одиночные велью\n // - некорректный диапазон\n return `${beforeValueSymbol}${transform(safelyInputValue)}${afterValueSymbol}${isUseAsSimpleDiapason ? '' : '%'}`;\n }\n }\n\n if (safelyInputValue.from === safelyInputValue.to && !!isGlueSameRangesTogether) {\n return `${beforeValueSymbol}${transform(safelyInputValue.from)}${afterValueSymbol}${isUseAsSimpleDiapason ? '' : '%'}`;\n }\n\n if (isCommonPercentageSymbol)\n return `${beforeValueSymbol}${transform(safelyInputValue.from)} - ${transform(\n safelyInputValue.to,\n )}${afterValueSymbol}${isUseAsSimpleDiapason ? '' : '%'}`;\n else\n return `${beforeValueSymbol}${transform(safelyInputValue.from)}${isUseAsSimpleDiapason ? '' : '%'} - ${transform(\n safelyInputValue.to,\n )}${isUseAsSimpleDiapason ? '' : '%'}${afterValueSymbol}`;\n};\n\n// eslint-disable-next-line no-control-regex\nexport const formatToOnlyASCIICodeText = (text) =>\n getSafelyValue(text).replace(/[^\\x00-\\x7F]+/g, \"\");\n\n// eslint-disable-next-line default-param-last\nexport const formatNumberValueToMask = (inputValue, settings) => {\n const safelyInputValue = getSafelyValue(inputValue);\n\n // default valueSymbol === 'n', default mask === 'nnn-nnn-nnnn'\n const {\n mask = \"XXX-XXX-XXXX\",\n valueSymbol = \"X\",\n isReturnAdvanced = false,\n } = settings || {};\n const processing = mask.split(\"\").reduce(\n (acc, item) => {\n if (acc.value.length) ++acc.cursorPosition;\n acc.newValue.push(\n item === valueSymbol && acc.value.length ? acc.value.shift() : item,\n );\n return acc;\n },\n {\n value: safelyInputValue.split(\"\").filter((sym) => /[0-9]/g.test(sym)),\n newValue: [],\n cursorPosition: 0,\n },\n );\n\n return isReturnAdvanced\n ? {\n value: processing.newValue.join(\"\"),\n cursorPosition: processing.cursorPosition,\n }\n : processing.newValue.join(\"\");\n};\n\nexport const formatToLimitLength = (inputValue, limit) => {\n const value = getSafelyValue(inputValue);\n return limit &&\n typeof limit === \"number\" &&\n !Number.isNaN(limit) &&\n value?.length > limit\n ? value.substr(0, limit)\n : value;\n};\n\nexport const formatToHex = ({ inputValue, withSharp }) => {\n const value = getSafelyValue(inputValue);\n if (withSharp) return `#${value.replace(/[^a-f0-9]/gi, \"\")}`;\n\n return `${value.replace(/[^#a-f0-9]/gi, \"\")}`;\n};\n\nexport function formatToReplaceAllWhiteSpace(str) {\n const value = getSafelyValue(str);\n return value.replace(/\\s+/g, \"\");\n}\n\n// ****************************\n// transform\n// ****************************\n\n// ...\n\n// ****************************\n// filter\n// ****************************\n//? Намерянно выпилил определение дефолтного значение на уровне параметров, чтобы сделать null рабочим значением\n//? decimalPlaces === null теперь точно определяет режим ввода БЕЗ ограничей десятичных знаков\nexport const filterFloat = (inputValue, decimalPlaces) => {\n const replaser = input => ('' + input).replace(/[^\\.\\d]/g, '');\n const value = getSafelyValue(inputValue);\n \n //? safelyDecimalPlaces ТОЧНО либо null, либо целое число\n const safelyDecimalPlaces = (() => {\n if (decimalPlaces === null) return decimalPlaces;\n\n const DEFAULT_VALUE = 2;\n const isNumber = typeof decimalPlaces === 'number' || (typeof decimalPlaces === 'string' && !Number.isNaN(+decimalPlaces));\n\n //? защита от дробного значения decimalPlaces\n return isNumber ? Number((+decimalPlaces).toFixed()) : DEFAULT_VALUE;\n })();\n\n // Обработка кейса если первым символом нажата точка\n if (value.length === 1 && (value[0] === '.' || value[0] === ',')) return '0.';\n\n // Приводим запятые к корректному разделителю, но не выпиливаем\n let output = ('' + value)?.replace(/,/g, '.');\n\n // Выпилить первый ноль, если это не дробь\n if (value.length > 1 && value[0] === '0' && value[1] !== '.' && value[0] !== ',') output = value.slice(1);\n\n const previousValue = '' + output.slice(0, -1);\n const lastSym = '' + output.slice(-1);\n\n // Обработка кейса второй точки в дроби\n if (lastSym === '.' && previousValue.includes('.')) output = previousValue;\n\n // if (localStorage.getItem('useDeb')) debugger;\n\n // Логика ограничения по decimalPlaces\n if (typeof safelyDecimalPlaces === 'number') {\n if (!safelyDecimalPlaces && lastSym === '.') return replaser(previousValue);\n if (previousValue.includes('.') && (previousValue.indexOf('.') + 1 + safelyDecimalPlaces === previousValue?.length)) {\n return replaser(previousValue);\n }\n }\n\n return replaser(output);\n};\n\nexport const filterNumeric = (value, settings) => {\n value = getSafelyValue(value)?.replace(/,/g, \"\");\n const { type = \"float\", decimalPlaces } = settings || {};\n\n const executor = type === \"float\" ? filterFloat : formatOnlyNumbers;\n return executor(getSafelyValue(value), decimalPlaces);\n};\n\nexport const formatToHideValuePartially = (value, settings) => {\n const {\n showSymbolsCount = 4,\n isVisibleFromFront = false,\n isCutOutWhiteSpaces = true,\n } = settings || {};\n const safelyValue = getSafelyValue(value);\n\n const newValue = isCutOutWhiteSpaces\n ? safelyValue.replace(/\\s/g, \"\")\n : safelyValue;\n if (newValue.length <= showSymbolsCount) return newValue;\n\n const hide = (val) =>\n val\n .split(\"\")\n .map(() => \"*\")\n .join(\"\");\n const visiblePart = isVisibleFromFront\n ? newValue.slice(0, showSymbolsCount)\n : newValue.slice(-1 * showSymbolsCount);\n const hiddenPart = isVisibleFromFront\n ? newValue.slice(showSymbolsCount)\n : newValue.slice(0, -1 * showSymbolsCount);\n\n return isVisibleFromFront\n ? `${visiblePart}${hide(hiddenPart)}`\n : `${hide(hiddenPart)}${visiblePart}`;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"fieldValueFormatters.js","names":["value"],"sources":["../../../src/Functions/fieldValueFormatters.js"],"sourcesContent":["import { getIsOnlyAnObject } from \"./utils\";\n\n//? The first word \"format\" in the function name means a logic\n//? in which the function transforms the incoming value in any case.\n\n//? The first word \"transform\" in the function name means a logic\n//? in which the function converts the whole value, but this is not suitable for sequential input\n\n//? The first word \"filter\" in the function name means a logic\n//? in which the function works as a changer for sequential input\n\n// ****************************\n// Base utils\n// ****************************\n\nexport const getSafelyValue = (value) =>\n value !== undefined && value !== null ? value?.toString?.() || \"\" : \"\";\n\n// базовая реализация\nexport const intlNumbersFormatter = (inputValue, settings = {}) => {\n const safelyInputValue = getSafelyValue(inputValue);\n const previousValue = safelyInputValue.slice(0, -1);\n const lastSym = safelyInputValue.slice(-1);\n const value = lastSym === \".\" ? previousValue : safelyInputValue;\n\n if (Number.isNaN(Number(value)) || !getSafelyValue(value)) return \"\";\n\n const {\n // локаль, даже региональная, влияет на отображение знаков и формата.\n locale = \"en-US\",\n // percent || currency(default case) || decimal(просто число) влияет на ТИП обработки.\n withSymbol,\n //группировка запятыми поразрядно.\n useGrouping = true,\n //!!работает только при withSymbol: 'currency' !! влияет на то, как именно будет выглядет формат валюты.\n currency = {},\n //сколько знаков после точки, и всегда ли они будут.\n // !!если поставить isAlwaysRender: true, но не дать центов, то будет 100.00\n fractionDigits = {},\n } = settings;\n\n const { currencyType = \"USD\", currencyDisplay: inputCurrencyDisplay } =\n currency;\n\n let currencyDisplay;\n switch (inputCurrencyDisplay) {\n case \"name\":\n currencyDisplay = \"name\";\n break;\n case \"code\":\n currencyDisplay = \"code\";\n break;\n case \"narrowSymbol\":\n currencyDisplay = \"narrowSymbol\";\n break;\n default:\n currencyDisplay = \"symbol\";\n }\n\n let numberStyle;\n switch (withSymbol) {\n case \"percent\":\n numberStyle = \"percent\";\n break;\n case \"currency\":\n numberStyle = \"currency\";\n break;\n default:\n numberStyle = \"decimal\";\n break;\n }\n\n const {\n quantity,\n isRenderAlways = false,\n minimumFractionDigits: inputMinimumFractionDigits,\n maximumFractionDigits: inputMaximumFractionDigits,\n conditionallyMinimumFractionDigits,\n } = fractionDigits;\n\n const dotIndex = safelyInputValue?.indexOf(\".\");\n const afterDot = dotIndex !== -1 ? safelyInputValue.slice(dotIndex + 1) : \"\";\n const minimumFractionDigits = (() => {\n //? Безусловное минимальное количество. Всегда отрендерит дробную часть, в количестве символов сколько указано\n if (typeof inputMinimumFractionDigits === \"number\")\n return inputMinimumFractionDigits;\n //? Условное минимальное количество. Если есть дробная часть, то отрендерит дробных символов сколько указано\n if (typeof conditionallyMinimumFractionDigits === \"number\") {\n return afterDot && lastSym !== \".\"\n ? conditionallyMinimumFractionDigits\n : 0;\n }\n //? Дефолтное минимальное количество. Если есть дробная часть, то отрендерит дробных символов столько, сколько есть\n //? Флаг isRenderAlways превращает дефолтный кейс в безусловное минимальное количество\n return afterDot && lastSym !== \".\"\n ? safelyInputValue.slice(dotIndex).length - 1\n : isRenderAlways\n ? quantity\n : 0;\n })();\n\n const priceSettings = {\n useGrouping, //группировка разрядов\n style: numberStyle, //тип форматирования (валюта или число). decimal - без знака валюты\n currency: currencyType, //валюта\n currencyDisplay, //валюта в виде символа\n //минимально не надо отображать центы, если их нет, иначе всегда будет .00\n minimumFractionDigits,\n //! Важно! Если придет велью с количеством дробных разрядов БОЛЬШИМ\n //! чем указано в (inputMaximumFractionDigits ?? quantity) - округлит по правилам округления\n //максимально отображать 2 цифры после запятой, если центы всё же есть\n maximumFractionDigits: inputMaximumFractionDigits ?? quantity,\n };\n\n let output;\n\n try {\n output = new Intl.NumberFormat(locale, priceSettings).format(value);\n } catch (e) {\n output = value;\n // eslint-disable-next-line no-console\n console.warn(\"Intl.NumberFormat error\", e);\n }\n return lastSym === \".\" ? output + lastSym : output;\n};\n\n// ****************************\n// format\n// ****************************\n\nexport const formatOnlyNumbers = (value) =>\n getSafelyValue(value).replace(/\\D/g, \"\");\nexport const formatToRemoveComa = (value) =>\n getSafelyValue(value).replace(/,/g, \"\");\nexport const formatToAddBitDepthPoints = (value, settings) =>\n intlNumbersFormatter(getSafelyValue(value), {\n fractionDigits: {\n quantity: settings?.type === \"int\" ? 0 : settings?.decimalPlaces,\n },\n });\n\n//! Важно! Если придет велью с количеством дробных разрядов БОЛЬШИМ\n//! чем указано в quantity - округлит по правилам округления\nexport const formatToPriceWithUSD = (value) => {\n if (isNaN(Number(value))) return value;\n return intlNumbersFormatter(getSafelyValue(value), {\n withSymbol: \"currency\",\n currency: { currencyType: \"USD\" },\n fractionDigits: { quantity: 2, conditionallyMinimumFractionDigits: 2 },\n });\n};\n\n//! Важно! Если придет велью с количеством дробных разрядов БОЛЬШИМ\n//! чем указано в quantity - округлит по правилам округления\n\n// ToDo - symbolPosition временно не реализовано\nexport const formatToPriceWithCurrency = (\n value,\n currencyCode,\n symbolPosition = \"before\",\n) => {\n if (isNaN(Number(value))) return value;\n return intlNumbersFormatter(getSafelyValue(value), {\n withSymbol: \"currency\",\n currency: { currencyType: currencyCode },\n fractionDigits: { quantity: 2, conditionallyMinimumFractionDigits: 2 },\n });\n};\n\n//? Добавляет в конец знак %. Работает как с одиночными значениями, так и с диапазонами.\n\n//? value может быть любое, но ожидается что будет\n//? - числом\n//? - строкой в формате \"значение\"\n//? - строкой в формате \"значение - значение\" (значение_пробел_тире_пробел_значение)\n//? - объект в формате { from: значение, to: значение }\n\n//? Предполагается, что \"значение\" может быть приведено к числу операторм + (пример: +значение приводится к числу).\n//? Если не может быть приведено, то \"значение\" вернется как есть, к результату добавится %\n\n//? Если \"значение\" пустое (getSafelyValue(значение) вернет пустую строку),\n//? то это воспринимается как 0, приводится к 0.00%\n\n//? Одиноково работает как для \".\", так и \",\" в качестве разделителя дробных разрядов\n\n//! Важно! Если придет велью с количеством дробных разрядов БОЛЬШИМ\n//! чем указано в decimalPlaces - округлит по правилам округления\n\nexport const formatAsPercentage = (value, settings) => {\n const {\n isCommonPercentageSymbol = true,\n decimalPlaces = 2,\n beforeValueSymbol = \"\",\n afterValueSymbol = \"\",\n isGlueSameRangesTogether = false,\n\n // ? Тут удобный ф-л, поэтому иной раз удобно обработать обычный диапазан (НЕ проценты).\n // ? Добавил возможность выпиливать значек процентов.\n // todo(VL) - вообще правильно заренеймить (formatAsDiapason), а добавление процентов сделать как опцию,\n // todo(VL) - но как обычно нет времени, нужно будет перечекать по всем проектам где тянется со старым неймингом\n isUseAsSimpleDiapason = false,\n } = getIsOnlyAnObject(settings) ? settings : {};\n let safelyInputValue;\n\n const checkValue = (value) => getSafelyValue(value) || \"0\";\n\n const transform = (valueAsSting) => {\n const processedValue = valueAsSting.replace(/,/g, \".\");\n if (Number.isNaN(Number(processedValue))) return processedValue;\n return `${intlNumbersFormatter(getSafelyValue(Number(processedValue)), {\n fractionDigits: {\n quantity: decimalPlaces,\n minimumFractionDigits: decimalPlaces,\n },\n })}`;\n };\n\n if (getIsOnlyAnObject(value)) {\n safelyInputValue = {\n from: checkValue(value.from),\n to: checkValue(value.to),\n };\n } else {\n safelyInputValue = checkValue(value);\n\n if (safelyInputValue.includes(\" - \")) {\n const valuesArr = safelyInputValue\n .split(\" - \")\n .map((partOfValue) => partOfValue.trim());\n safelyInputValue = {\n from: checkValue(valuesArr[0]),\n to: checkValue(valuesArr[1]),\n };\n } else {\n // Вариант когда велью передано строкой (НЕ объектом) и оно не содержит сепаратора \" - \"\n // - одиночные велью\n // - некорректный диапазон\n return `${beforeValueSymbol}${transform(safelyInputValue)}${afterValueSymbol}${isUseAsSimpleDiapason ? '' : '%'}`;\n }\n }\n\n if (safelyInputValue.from === safelyInputValue.to && !!isGlueSameRangesTogether) {\n return `${beforeValueSymbol}${transform(safelyInputValue.from)}${afterValueSymbol}${isUseAsSimpleDiapason ? '' : '%'}`;\n }\n\n if (isCommonPercentageSymbol)\n return `${beforeValueSymbol}${transform(safelyInputValue.from)} - ${transform(\n safelyInputValue.to,\n )}${afterValueSymbol}${isUseAsSimpleDiapason ? '' : '%'}`;\n else\n return `${beforeValueSymbol}${transform(safelyInputValue.from)}${isUseAsSimpleDiapason ? '' : '%'} - ${transform(\n safelyInputValue.to,\n )}${isUseAsSimpleDiapason ? '' : '%'}${afterValueSymbol}`;\n};\n\n// eslint-disable-next-line no-control-regex\nexport const formatToOnlyASCIICodeText = (text) =>\n getSafelyValue(text).replace(/[^\\x00-\\x7F]+/g, \"\");\n\n// eslint-disable-next-line default-param-last\nexport const formatNumberValueToMask = (inputValue, settings) => {\n const safelyInputValue = getSafelyValue(inputValue);\n\n // default valueSymbol === 'n', default mask === 'nnn-nnn-nnnn'\n const {\n mask = \"XXX-XXX-XXXX\",\n valueSymbol = \"X\",\n isReturnAdvanced = false,\n } = settings || {};\n const processing = mask.split(\"\").reduce(\n (acc, item) => {\n if (acc.value.length) ++acc.cursorPosition;\n acc.newValue.push(\n item === valueSymbol && acc.value.length ? acc.value.shift() : item,\n );\n return acc;\n },\n {\n value: safelyInputValue.split(\"\").filter((sym) => /[0-9]/g.test(sym)),\n newValue: [],\n cursorPosition: 0,\n },\n );\n\n return isReturnAdvanced\n ? {\n value: processing.newValue.join(\"\"),\n cursorPosition: processing.cursorPosition,\n }\n : processing.newValue.join(\"\");\n};\n\nexport const formatToLimitLength = (inputValue, limit) => {\n const value = getSafelyValue(inputValue);\n return limit &&\n typeof limit === \"number\" &&\n !Number.isNaN(limit) &&\n value?.length > limit\n ? value.substr(0, limit)\n : value;\n};\n\nexport const formatToHex = ({ inputValue, withSharp }) => {\n const value = getSafelyValue(inputValue);\n if (withSharp) return `#${value.replace(/[^a-f0-9]/gi, \"\")}`;\n\n return `${value.replace(/[^#a-f0-9]/gi, \"\")}`;\n};\n\nexport function formatToReplaceAllWhiteSpace(str) {\n const value = getSafelyValue(str);\n return value.replace(/\\s+/g, \"\");\n}\n\n// ****************************\n// transform\n// ****************************\n\n// ...\n\n// ****************************\n// filter\n// ****************************\n//? Намерянно выпилил определение дефолтного значение на уровне параметров, чтобы сделать null рабочим значением\n//? decimalPlaces === null теперь точно определяет режим ввода БЕЗ ограничей десятичных знаков\nexport const filterFloat = (inputValue, decimalPlaces) => {\n const replaser = input => ('' + input).replace(/[^\\.\\d]/g, '');\n const value = getSafelyValue(inputValue);\n \n //? safelyDecimalPlaces ТОЧНО либо null, либо целое число\n const safelyDecimalPlaces = (() => {\n if (decimalPlaces === null) return decimalPlaces;\n\n const DEFAULT_VALUE = 2;\n const isNumber = typeof decimalPlaces === 'number' || (typeof decimalPlaces === 'string' && !Number.isNaN(+decimalPlaces));\n\n //? защита от дробного значения decimalPlaces\n return isNumber ? Number((+decimalPlaces).toFixed()) : DEFAULT_VALUE;\n })();\n\n // Обработка кейса если первым символом нажата точка\n if (value.length === 1 && (value[0] === '.' || value[0] === ',')) return '0.';\n\n // Приводим запятые к корректному разделителю, но не выпиливаем\n let output = ('' + value)?.replace(/,/g, '.');\n\n // Выпилить первый ноль, если это не дробь\n if (value.length > 1 && value[0] === '0' && value[1] !== '.' && value[0] !== ',') output = value.slice(1);\n\n const previousValue = '' + output.slice(0, -1);\n const lastSym = '' + output.slice(-1);\n\n // Обработка кейса второй точки в дроби\n if (lastSym === '.' && previousValue.includes('.')) output = previousValue;\n\n // if (localStorage.getItem('useDeb')) debugger;\n\n // Логика ограничения по decimalPlaces\n if (typeof safelyDecimalPlaces === 'number') {\n if (!safelyDecimalPlaces && lastSym === '.') return replaser(previousValue);\n if (previousValue.includes('.') && (previousValue.indexOf('.') + 1 + safelyDecimalPlaces === previousValue?.length)) {\n return replaser(previousValue);\n }\n }\n\n return replaser(output);\n};\n\nexport const filterNumeric = (value, settings) => {\n value = getSafelyValue(value)?.replace(/,/g, \"\");\n const { type = \"float\", decimalPlaces } = settings || {};\n\n const executor = type === \"float\" ? filterFloat : formatOnlyNumbers;\n return executor(getSafelyValue(value), decimalPlaces);\n};\n\nexport const formatToHideValuePartially = (value, settings) => {\n const {\n showSymbolsCount = 4,\n isVisibleFromFront = false,\n isCutOutWhiteSpaces = true,\n } = settings || {};\n const safelyValue = getSafelyValue(value);\n\n const newValue = isCutOutWhiteSpaces\n ? safelyValue.replace(/\\s/g, \"\")\n : safelyValue;\n if (newValue.length <= showSymbolsCount) return newValue;\n\n const hide = (val) =>\n val\n .split(\"\")\n .map(() => \"*\")\n .join(\"\");\n const visiblePart = isVisibleFromFront\n ? newValue.slice(0, showSymbolsCount)\n : newValue.slice(-1 * showSymbolsCount);\n const hiddenPart = isVisibleFromFront\n ? newValue.slice(showSymbolsCount)\n : newValue.slice(0, -1 * showSymbolsCount);\n\n return isVisibleFromFront\n ? `${visiblePart}${hide(hiddenPart)}`\n : `${hide(hiddenPart)}${visiblePart}`;\n};\n"],"mappings":"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"}
@@ -50,29 +50,31 @@ var addRangeDefault = (from, to, currentValues, decimalPlaces) => {
50
50
  };
51
51
  if (!acc.from && !acc.to) acc.result = [...acc.result, range];
52
52
  else if (!acc.from && acc.to) processTo();
53
- else if (acc.from && acc.to) if (acc.from <= range.from) {
54
- acc.result = [...acc.result, { from: acc.from }];
55
- acc.from = null;
56
- processTo();
57
- } else if (isIncludesFrom) {
58
- acc.result = [
53
+ else if (acc.from && acc.to) {
54
+ if (acc.from <= range.from) {
55
+ acc.result = [...acc.result, { from: acc.from }];
56
+ acc.from = null;
57
+ processTo();
58
+ } else if (isIncludesFrom) {
59
+ acc.result = [
60
+ ...acc.result,
61
+ {
62
+ from: range.from,
63
+ to: Math.round10(acc.from - step, -1 * decimalPlaces)
64
+ },
65
+ { from: acc.from }
66
+ ];
67
+ acc.from = null;
68
+ processTo();
69
+ } else acc.result = [
59
70
  ...acc.result,
71
+ ...!isRangeMustBeIncludet ? [range] : [],
60
72
  {
61
- from: range.from,
62
- to: Math.round10(acc.from - step, -1 * decimalPlaces)
63
- },
64
- { from: acc.from }
73
+ from: Math.round10(acc.from, -1 * decimalPlaces),
74
+ to: Math.round10(acc.to, -1 * decimalPlaces)
75
+ }
65
76
  ];
66
- acc.from = null;
67
- processTo();
68
- } else acc.result = [
69
- ...acc.result,
70
- ...!isRangeMustBeIncludet ? [range] : [],
71
- {
72
- from: Math.round10(acc.from, -1 * decimalPlaces),
73
- to: Math.round10(acc.to, -1 * decimalPlaces)
74
- }
75
- ];
77
+ }
76
78
  return acc;
77
79
  }, {
78
80
  from,
@@ -1 +1 @@
1
- {"version":3,"file":"operations.js","names":[],"sources":["../../../src/Functions/operations.js"],"sourcesContent":["// Взято из https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Math/round\n// При импорте любой ф-и из этого файла отработает самовызывающаяся ф-я и расширит\n// объект Math 3-мя ф-ми: round10, floor10, ceil10\n(function () {\n /**\n * Корректировка округления десятичных дробей.\n *\n * @param {String} type Тип корректировки.\n * @param {Number} value Число.\n * @param {Integer} exp Показатель степени (десятичный логарифм основания корректировки).\n * @returns {Number} Скорректированное значение.\n */\n function decimalAdjust(type, value, exp) {\n // Если степень не определена, либо равна нулю...\n if (typeof exp === \"undefined\" || Number(exp) === 0) {\n return Math[type](value);\n }\n value = Number(value);\n exp = Number(exp);\n // Если значение не является числом, либо степень не является целым числом...\n if (isNaN(value) || !(typeof exp === \"number\" && exp % 1 === 0)) {\n return NaN;\n }\n // Сдвиг разрядов\n value = value.toString().split(\"e\");\n value = Math[type](\n Number(value[0] + \"e\" + (value[1] ? Number(value[1]) - exp : -exp)),\n );\n // Обратный сдвиг\n value = value.toString().split(\"e\");\n return Number(value[0] + \"e\" + (value[1] ? Number(value[1]) + exp : exp));\n }\n\n // Десятичное округление к ближайшему\n if (!Math.round10) {\n Math.round10 = function (value, exp) {\n return decimalAdjust(\"round\", value, exp);\n };\n }\n // Десятичное округление вниз\n if (!Math.floor10) {\n Math.floor10 = function (value, exp) {\n return decimalAdjust(\"floor\", value, exp);\n };\n }\n // Десятичное округление вверх\n if (!Math.ceil10) {\n Math.ceil10 = function (value, exp) {\n return decimalAdjust(\"ceil\", value, exp);\n };\n }\n})();\n\nexport const addRangeDefault = (from, to, currentValues, decimalPlaces) => {\n if (!currentValues?.length) return [{ from, to }];\n const step = decimalPlaces ? Math.pow(10, -1 * decimalPlaces) : 1;\n\n const resultOfProcessAddingRange = currentValues.reduce(\n (acc, range) => {\n const isIncludesFrom =\n Boolean(acc.from) && range.from < acc.from && range.to >= acc.from;\n const isIncludesTo =\n Boolean(acc.to) && range.from <= acc.to && range.to > acc.to;\n const isRangeMustBeIncludet =\n Boolean(acc.from) &&\n Boolean(acc.to) &&\n acc.from <= range.from &&\n acc.to >= range.to;\n\n const processTo = () => {\n const lastAccRange = acc.result[acc.result.length - 1];\n\n if (acc.to < range.from) {\n lastAccRange.to = acc.to;\n acc.to = null;\n acc.result = [...acc.result, range];\n } else if (isIncludesTo) {\n lastAccRange.to = acc.to;\n acc.result = [\n ...acc.result,\n {\n from: Math.round10(acc.to + step, -1 * decimalPlaces),\n to: range.to,\n },\n ];\n acc.to = null;\n } else if (acc.to === range.to) {\n lastAccRange.to = acc.to;\n acc.to = null;\n }\n };\n\n if (!acc.from && !acc.to) acc.result = [...acc.result, range];\n else if (!acc.from && acc.to) processTo();\n else if (acc.from && acc.to) {\n if (acc.from <= range.from) {\n acc.result = [...acc.result, { from: acc.from }];\n acc.from = null;\n processTo();\n } else if (isIncludesFrom) {\n acc.result = [\n ...acc.result,\n {\n from: range.from,\n to: Math.round10(acc.from - step, -1 * decimalPlaces),\n },\n { from: acc.from },\n ];\n acc.from = null;\n processTo();\n } else {\n acc.result = [\n ...acc.result,\n ...(!isRangeMustBeIncludet ? [range] : []),\n {\n from: Math.round10(acc.from, -1 * decimalPlaces),\n to: Math.round10(acc.to, -1 * decimalPlaces),\n },\n ];\n }\n }\n return acc;\n },\n { from, to, result: [] },\n );\n\n const result = resultOfProcessAddingRange.result;\n if (!result[result.length - 1].to) result[result.length - 1].to = to;\n return result;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"operations.js","names":[],"sources":["../../../src/Functions/operations.js"],"sourcesContent":["// Взято из https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Math/round\n// При импорте любой ф-и из этого файла отработает самовызывающаяся ф-я и расширит\n// объект Math 3-мя ф-ми: round10, floor10, ceil10\n(function () {\n /**\n * Корректировка округления десятичных дробей.\n *\n * @param {String} type Тип корректировки.\n * @param {Number} value Число.\n * @param {Integer} exp Показатель степени (десятичный логарифм основания корректировки).\n * @returns {Number} Скорректированное значение.\n */\n function decimalAdjust(type, value, exp) {\n // Если степень не определена, либо равна нулю...\n if (typeof exp === \"undefined\" || Number(exp) === 0) {\n return Math[type](value);\n }\n value = Number(value);\n exp = Number(exp);\n // Если значение не является числом, либо степень не является целым числом...\n if (isNaN(value) || !(typeof exp === \"number\" && exp % 1 === 0)) {\n return NaN;\n }\n // Сдвиг разрядов\n value = value.toString().split(\"e\");\n value = Math[type](\n Number(value[0] + \"e\" + (value[1] ? Number(value[1]) - exp : -exp)),\n );\n // Обратный сдвиг\n value = value.toString().split(\"e\");\n return Number(value[0] + \"e\" + (value[1] ? Number(value[1]) + exp : exp));\n }\n\n // Десятичное округление к ближайшему\n if (!Math.round10) {\n Math.round10 = function (value, exp) {\n return decimalAdjust(\"round\", value, exp);\n };\n }\n // Десятичное округление вниз\n if (!Math.floor10) {\n Math.floor10 = function (value, exp) {\n return decimalAdjust(\"floor\", value, exp);\n };\n }\n // Десятичное округление вверх\n if (!Math.ceil10) {\n Math.ceil10 = function (value, exp) {\n return decimalAdjust(\"ceil\", value, exp);\n };\n }\n})();\n\nexport const addRangeDefault = (from, to, currentValues, decimalPlaces) => {\n if (!currentValues?.length) return [{ from, to }];\n const step = decimalPlaces ? Math.pow(10, -1 * decimalPlaces) : 1;\n\n const resultOfProcessAddingRange = currentValues.reduce(\n (acc, range) => {\n const isIncludesFrom =\n Boolean(acc.from) && range.from < acc.from && range.to >= acc.from;\n const isIncludesTo =\n Boolean(acc.to) && range.from <= acc.to && range.to > acc.to;\n const isRangeMustBeIncludet =\n Boolean(acc.from) &&\n Boolean(acc.to) &&\n acc.from <= range.from &&\n acc.to >= range.to;\n\n const processTo = () => {\n const lastAccRange = acc.result[acc.result.length - 1];\n\n if (acc.to < range.from) {\n lastAccRange.to = acc.to;\n acc.to = null;\n acc.result = [...acc.result, range];\n } else if (isIncludesTo) {\n lastAccRange.to = acc.to;\n acc.result = [\n ...acc.result,\n {\n from: Math.round10(acc.to + step, -1 * decimalPlaces),\n to: range.to,\n },\n ];\n acc.to = null;\n } else if (acc.to === range.to) {\n lastAccRange.to = acc.to;\n acc.to = null;\n }\n };\n\n if (!acc.from && !acc.to) acc.result = [...acc.result, range];\n else if (!acc.from && acc.to) processTo();\n else if (acc.from && acc.to) {\n if (acc.from <= range.from) {\n acc.result = [...acc.result, { from: acc.from }];\n acc.from = null;\n processTo();\n } else if (isIncludesFrom) {\n acc.result = [\n ...acc.result,\n {\n from: range.from,\n to: Math.round10(acc.from - step, -1 * decimalPlaces),\n },\n { from: acc.from },\n ];\n acc.from = null;\n processTo();\n } else {\n acc.result = [\n ...acc.result,\n ...(!isRangeMustBeIncludet ? [range] : []),\n {\n from: Math.round10(acc.from, -1 * decimalPlaces),\n to: Math.round10(acc.to, -1 * decimalPlaces),\n },\n ];\n }\n }\n return acc;\n },\n { from, to, result: [] },\n );\n\n const result = resultOfProcessAddingRange.result;\n if (!result[result.length - 1].to) result[result.length - 1].to = to;\n return result;\n};\n"],"mappings":"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"}
@@ -6,9 +6,10 @@ function ObjectWithIterableObjects({ form, setForm, FormFields }) {
6
6
  const template = Array.isArray(mainArg) ? [] : typeof mainArg === "object" ? {} : null;
7
7
  if (!template) return void 0;
8
8
  return args.reduce((result, item) => {
9
- if (MainArgProto === "Array") if (Array.isArray(item)) return [...result, ...item];
10
- else return [...result, item];
11
- else if (MainArgProto === "Object") return {
9
+ if (MainArgProto === "Array") {
10
+ if (Array.isArray(item)) return [...result, ...item];
11
+ else return [...result, item];
12
+ } else if (MainArgProto === "Object") return {
12
13
  ...result,
13
14
  ...item
14
15
  };
@@ -51,9 +52,10 @@ function ObjectWithIterableObjects({ form, setForm, FormFields }) {
51
52
  };
52
53
  result.item = fields2[key2] || fields2.find((f) => f.key === key2);
53
54
  if (!result.item) return result;
54
- if (Array.isArray(fields2)) if (!isNaN(parseInt(key2, 10))) result.fields.splice(key2, 1);
55
- else result.fields = result.fields.filter((f) => f.key !== key2);
56
- else if (typeof fields2 === "object") result.fields = Object.values(fields2).reduce((object, { key: fKey }) => {
55
+ if (Array.isArray(fields2)) {
56
+ if (!isNaN(parseInt(key2, 10))) result.fields.splice(key2, 1);
57
+ else result.fields = result.fields.filter((f) => f.key !== key2);
58
+ } else if (typeof fields2 === "object") result.fields = Object.values(fields2).reduce((object, { key: fKey }) => {
57
59
  if (key2 !== fKey) object[key2] = fields2[key2];
58
60
  return object;
59
61
  }, {});
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectWithIterableObjects.js","names":["fields","key","field"],"sources":["../../../../../src/Functions/useFormTools/form-drivers/ObjectWithIterableObjects.js"],"sourcesContent":["export default function ObjectWithIterableObjects({\n form,\n setForm,\n FormFields,\n}) {\n const joinData = (...args) => {\n const [mainArg] = args;\n const MainArgProto = Array.isArray(mainArg)\n ? \"Array\"\n : typeof mainArg === \"object\"\n ? \"Object\"\n : undefined;\n const template = Array.isArray(mainArg)\n ? []\n : typeof mainArg === \"object\"\n ? {}\n : null;\n\n if (!template) return undefined;\n\n return args.reduce((result, item) => {\n if (MainArgProto === \"Array\") {\n if (Array.isArray(item)) {\n return [...result, ...item];\n } else {\n return [...result, item];\n }\n } else if (MainArgProto === \"Object\") {\n return { ...result, ...item };\n } else {\n return template;\n }\n }, template);\n };\n\n const getFieldData = (key) => {\n if (Array.isArray(FormFields)) {\n return FormFields[key] || FormFields.find((f) => f.key === key);\n } else if (typeof FormFields === \"object\") {\n return (\n FormFields[key] || Object.values(FormFields).find((f) => f.key === key)\n );\n } else {\n return undefined;\n }\n };\n const getFormFields = () => {\n return form.fields || form;\n };\n const getFormField = (key) => {\n // eslint-disable-next-line no-undef\n if (FormProto === \"Array\") {\n return getFormFields().find((field) => field.key === key);\n // eslint-disable-next-line no-undef\n } else if (FormProto === \"Object\") {\n return (\n Object.values(getFormFields()).find((field) => field.key === key) ||\n Object.keys(getFormFields()).reduce((result, field) => {\n if (field === key) result = getFormFields()[field];\n return result;\n }, {})\n );\n } else {\n return undefined;\n }\n };\n const setFormFields = (data) => {\n const isFunction = typeof data === \"function\";\n\n setForm((state) => {\n if (state.fields) {\n return {\n ...state,\n fields: isFunction ? data(state.fields) : data,\n };\n } else {\n return isFunction ? data(state) : data;\n }\n });\n };\n const setFormField = (data, key = null) => {\n const isFunction = typeof data === \"function\";\n\n setFormFields((fields) => {\n const pop = (fields, key) => {\n const result = { fields, item: undefined };\n\n result.item = fields[key] || fields.find((f) => f.key === key);\n\n if (!result.item) return result;\n\n if (Array.isArray(fields)) {\n const index = parseInt(key, 10);\n if (!isNaN(index)) {\n result.fields.splice(key, 1);\n } else {\n result.fields = result.fields.filter((f) => f.key !== key);\n }\n } else if (typeof fields === \"object\") {\n result.fields = Object.values(fields).reduce(\n (object, { key: fKey }) => {\n if (key !== fKey) {\n object[key] = fields[key];\n }\n return object;\n },\n {},\n );\n }\n\n return result;\n };\n const update = (fields) => {\n //KEY is NULLable\n if (!key) {\n return data.key\n ? Object.values(fields).reduce((result, field, i) => {\n const index = fields[field.key] ? field.key : i;\n\n return {\n ...result,\n [index]:\n data.key === field.key\n ? isFunction\n ? data(field)\n : data\n : field,\n };\n }, {})\n : {\n ...fields,\n [fields.length || 0]: isFunction ? data({}) : data,\n };\n }\n\n const { fields: filtered, item: field } = pop(fields, key);\n\n const updatedField = isFunction\n ? data(field || {})\n : { ...field, ...data };\n return joinData(\n filtered,\n fields[key] ? { [key]: updatedField } : updatedField,\n );\n };\n\n return update(fields);\n });\n };\n\n return {\n joinData,\n getFieldData,\n getFormFields,\n getFormField,\n setFormFields,\n setFormField,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ObjectWithIterableObjects.js","names":["fields","key","field"],"sources":["../../../../../src/Functions/useFormTools/form-drivers/ObjectWithIterableObjects.js"],"sourcesContent":["export default function ObjectWithIterableObjects({\n form,\n setForm,\n FormFields,\n}) {\n const joinData = (...args) => {\n const [mainArg] = args;\n const MainArgProto = Array.isArray(mainArg)\n ? \"Array\"\n : typeof mainArg === \"object\"\n ? \"Object\"\n : undefined;\n const template = Array.isArray(mainArg)\n ? []\n : typeof mainArg === \"object\"\n ? {}\n : null;\n\n if (!template) return undefined;\n\n return args.reduce((result, item) => {\n if (MainArgProto === \"Array\") {\n if (Array.isArray(item)) {\n return [...result, ...item];\n } else {\n return [...result, item];\n }\n } else if (MainArgProto === \"Object\") {\n return { ...result, ...item };\n } else {\n return template;\n }\n }, template);\n };\n\n const getFieldData = (key) => {\n if (Array.isArray(FormFields)) {\n return FormFields[key] || FormFields.find((f) => f.key === key);\n } else if (typeof FormFields === \"object\") {\n return (\n FormFields[key] || Object.values(FormFields).find((f) => f.key === key)\n );\n } else {\n return undefined;\n }\n };\n const getFormFields = () => {\n return form.fields || form;\n };\n const getFormField = (key) => {\n // eslint-disable-next-line no-undef\n if (FormProto === \"Array\") {\n return getFormFields().find((field) => field.key === key);\n // eslint-disable-next-line no-undef\n } else if (FormProto === \"Object\") {\n return (\n Object.values(getFormFields()).find((field) => field.key === key) ||\n Object.keys(getFormFields()).reduce((result, field) => {\n if (field === key) result = getFormFields()[field];\n return result;\n }, {})\n );\n } else {\n return undefined;\n }\n };\n const setFormFields = (data) => {\n const isFunction = typeof data === \"function\";\n\n setForm((state) => {\n if (state.fields) {\n return {\n ...state,\n fields: isFunction ? data(state.fields) : data,\n };\n } else {\n return isFunction ? data(state) : data;\n }\n });\n };\n const setFormField = (data, key = null) => {\n const isFunction = typeof data === \"function\";\n\n setFormFields((fields) => {\n const pop = (fields, key) => {\n const result = { fields, item: undefined };\n\n result.item = fields[key] || fields.find((f) => f.key === key);\n\n if (!result.item) return result;\n\n if (Array.isArray(fields)) {\n const index = parseInt(key, 10);\n if (!isNaN(index)) {\n result.fields.splice(key, 1);\n } else {\n result.fields = result.fields.filter((f) => f.key !== key);\n }\n } else if (typeof fields === \"object\") {\n result.fields = Object.values(fields).reduce(\n (object, { key: fKey }) => {\n if (key !== fKey) {\n object[key] = fields[key];\n }\n return object;\n },\n {},\n );\n }\n\n return result;\n };\n const update = (fields) => {\n //KEY is NULLable\n if (!key) {\n return data.key\n ? Object.values(fields).reduce((result, field, i) => {\n const index = fields[field.key] ? field.key : i;\n\n return {\n ...result,\n [index]:\n data.key === field.key\n ? isFunction\n ? data(field)\n : data\n : field,\n };\n }, {})\n : {\n ...fields,\n [fields.length || 0]: isFunction ? data({}) : data,\n };\n }\n\n const { fields: filtered, item: field } = pop(fields, key);\n\n const updatedField = isFunction\n ? data(field || {})\n : { ...field, ...data };\n return joinData(\n filtered,\n fields[key] ? { [key]: updatedField } : updatedField,\n );\n };\n\n return update(fields);\n });\n };\n\n return {\n joinData,\n getFieldData,\n getFormFields,\n getFormField,\n setFormFields,\n setFormField,\n };\n}\n"],"mappings":"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"}