funda-ui 4.7.615 → 4.7.624
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitattributes +2 -0
- package/README.md +116 -2
- package/README_PUBLISH.md +328 -0
- package/lib/cjs/Date/index.js +39 -2
- package/lib/cjs/DynamicFields/index.js +11 -3
- package/lib/esm/Date/index.tsx +47 -2
- package/lib/esm/DynamicFields/index.tsx +9 -4
- package/logo.png +0 -0
- package/package.json +589 -43
- package/preview.png +0 -0
- package/{Date → publish/Date}/index.js +39 -2
- package/{DynamicFields → publish/DynamicFields}/index.js +11 -3
- package/publish/LICENSE +21 -0
- package/publish/README.md +328 -0
- package/publish/lib/cjs/Accordion/index.d.ts +2 -0
- package/publish/lib/cjs/Accordion/index.js +667 -0
- package/publish/lib/cjs/BackToTop/index.d.ts +17 -0
- package/publish/lib/cjs/BackToTop/index.js +904 -0
- package/publish/lib/cjs/CascadingSelect/index.d.ts +80 -0
- package/publish/lib/cjs/CascadingSelect/index.js +3383 -0
- package/publish/lib/cjs/CascadingSelectE2E/index.d.ts +91 -0
- package/publish/lib/cjs/CascadingSelectE2E/index.js +3988 -0
- package/publish/lib/cjs/Chatbox/index.d.ts +101 -0
- package/publish/lib/cjs/Chatbox/index.js +7037 -0
- package/publish/lib/cjs/Checkbox/index.d.ts +28 -0
- package/publish/lib/cjs/Checkbox/index.js +673 -0
- package/publish/lib/cjs/ColorPicker/index.d.ts +27 -0
- package/publish/lib/cjs/ColorPicker/index.js +662 -0
- package/publish/lib/cjs/Date/index.d.ts +70 -0
- package/publish/lib/cjs/Date/index.js +6368 -0
- package/publish/lib/cjs/DigitalClock/index.d.ts +7 -0
- package/publish/lib/cjs/DigitalClock/index.js +402 -0
- package/publish/lib/cjs/DragDropList/index.d.ts +45 -0
- package/publish/lib/cjs/DragDropList/index.js +1586 -0
- package/publish/lib/cjs/DropdownMenu/index.d.ts +38 -0
- package/publish/lib/cjs/DropdownMenu/index.js +1507 -0
- package/publish/lib/cjs/DynamicFields/index.d.ts +40 -0
- package/publish/lib/cjs/DynamicFields/index.js +818 -0
- package/publish/lib/cjs/EventCalendar/index.d.ts +61 -0
- package/publish/lib/cjs/EventCalendar/index.js +3789 -0
- package/publish/lib/cjs/EventCalendarTimeline/index.d.ts +100 -0
- package/publish/lib/cjs/EventCalendarTimeline/index.js +6141 -0
- package/publish/lib/cjs/File/index.d.ts +40 -0
- package/publish/lib/cjs/File/index.js +1751 -0
- package/publish/lib/cjs/HorizontalScrollContent/index.d.ts +14 -0
- package/publish/lib/cjs/HorizontalScrollContent/index.js +426 -0
- package/publish/lib/cjs/Input/index.d.ts +59 -0
- package/publish/lib/cjs/Input/index.js +1486 -0
- package/publish/lib/cjs/LiveSearch/index.d.ts +70 -0
- package/publish/lib/cjs/LiveSearch/index.js +4180 -0
- package/publish/lib/cjs/MasonryLayout/index.d.ts +14 -0
- package/publish/lib/cjs/MasonryLayout/index.js +689 -0
- package/publish/lib/cjs/ModalDialog/index.d.ts +83 -0
- package/publish/lib/cjs/ModalDialog/index.js +1719 -0
- package/publish/lib/cjs/ModeSwitch/index.d.ts +17 -0
- package/publish/lib/cjs/ModeSwitch/index.js +202 -0
- package/publish/lib/cjs/MultilevelDropdownMenu/index.d.ts +20 -0
- package/publish/lib/cjs/MultilevelDropdownMenu/index.js +930 -0
- package/publish/lib/cjs/MultipleCheckboxes/index.d.ts +66 -0
- package/publish/lib/cjs/MultipleCheckboxes/index.js +2337 -0
- package/publish/lib/cjs/MultipleSelect/index.d.ts +65 -0
- package/publish/lib/cjs/MultipleSelect/index.js +4197 -0
- package/publish/lib/cjs/NativeSelect/index.d.ts +37 -0
- package/publish/lib/cjs/NativeSelect/index.js +2052 -0
- package/publish/lib/cjs/NumberInput/index.d.ts +40 -0
- package/publish/lib/cjs/NumberInput/index.js +1191 -0
- package/publish/lib/cjs/Pagination/index.d.ts +51 -0
- package/publish/lib/cjs/Pagination/index.js +612 -0
- package/publish/lib/cjs/Radio/index.d.ts +45 -0
- package/publish/lib/cjs/Radio/index.js +1838 -0
- package/publish/lib/cjs/RangeSlider/index.d.ts +22 -0
- package/publish/lib/cjs/RangeSlider/index.js +2696 -0
- package/publish/lib/cjs/Refresher/index.d.ts +22 -0
- package/publish/lib/cjs/Refresher/index.js +564 -0
- package/publish/lib/cjs/RootPortal/index.d.ts +9 -0
- package/publish/lib/cjs/RootPortal/index.js +148 -0
- package/publish/lib/cjs/ScrollReveal/index.d.ts +21 -0
- package/publish/lib/cjs/ScrollReveal/index.js +401 -0
- package/publish/lib/cjs/Scrollbar/index.d.ts +17 -0
- package/publish/lib/cjs/Scrollbar/index.js +1107 -0
- package/publish/lib/cjs/SearchBar/index.d.ts +41 -0
- package/publish/lib/cjs/SearchBar/index.js +701 -0
- package/publish/lib/cjs/Select/index.d.ts +107 -0
- package/publish/lib/cjs/Select/index.js +6540 -0
- package/publish/lib/cjs/ShowMoreLess/index.d.ts +36 -0
- package/publish/lib/cjs/ShowMoreLess/index.js +387 -0
- package/publish/lib/cjs/SplitterPanel/index.d.ts +20 -0
- package/publish/lib/cjs/SplitterPanel/index.js +800 -0
- package/publish/lib/cjs/Stepper/index.d.ts +26 -0
- package/publish/lib/cjs/Stepper/index.js +568 -0
- package/publish/lib/cjs/Switch/index.d.ts +25 -0
- package/publish/lib/cjs/Switch/index.js +630 -0
- package/publish/lib/cjs/Table/index.d.ts +12 -0
- package/publish/lib/cjs/Table/index.js +2311 -0
- package/publish/lib/cjs/Tabs/index.d.ts +3 -0
- package/publish/lib/cjs/Tabs/index.js +771 -0
- package/publish/lib/cjs/TagInput/index.d.ts +37 -0
- package/publish/lib/cjs/TagInput/index.js +1227 -0
- package/publish/lib/cjs/Textarea/index.d.ts +50 -0
- package/publish/lib/cjs/Textarea/index.js +1795 -0
- package/publish/lib/cjs/Toast/index.d.ts +3 -0
- package/publish/lib/cjs/Toast/index.js +1345 -0
- package/publish/lib/cjs/Tooltip/index.d.ts +38 -0
- package/publish/lib/cjs/Tooltip/index.js +1778 -0
- package/publish/lib/cjs/Tree/index.d.ts +78 -0
- package/publish/lib/cjs/Tree/index.js +2330 -0
- package/publish/lib/cjs/Utils/anim.d.ts +11 -0
- package/publish/lib/cjs/Utils/anim.js +846 -0
- package/publish/lib/cjs/Utils/bodyScrollLock.d.ts +8 -0
- package/publish/lib/cjs/Utils/bodyScrollLock.js +311 -0
- package/publish/lib/cjs/Utils/buffer.d.ts +67 -0
- package/publish/lib/cjs/Utils/buffer.js +343 -0
- package/publish/lib/cjs/Utils/cls.d.ts +15 -0
- package/publish/lib/cjs/Utils/cls.js +124 -0
- package/publish/lib/cjs/Utils/convert.d.ts +25 -0
- package/publish/lib/cjs/Utils/convert.js +109 -0
- package/publish/lib/cjs/Utils/date.d.ts +227 -0
- package/publish/lib/cjs/Utils/date.js +587 -0
- package/publish/lib/cjs/Utils/dom.d.ts +13 -0
- package/publish/lib/cjs/Utils/dom.js +215 -0
- package/publish/lib/cjs/Utils/easing.d.ts +29 -0
- package/publish/lib/cjs/Utils/easing.js +221 -0
- package/publish/lib/cjs/Utils/extract.d.ts +66 -0
- package/publish/lib/cjs/Utils/extract.js +195 -0
- package/publish/lib/cjs/Utils/format-string.d.ts +65 -0
- package/publish/lib/cjs/Utils/format-string.js +167 -0
- package/publish/lib/cjs/Utils/formdata.d.ts +13 -0
- package/publish/lib/cjs/Utils/formdata.js +131 -0
- package/publish/lib/cjs/Utils/getElementProperty.d.ts +52 -0
- package/publish/lib/cjs/Utils/getElementProperty.js +189 -0
- package/publish/lib/cjs/Utils/guid.d.ts +7 -0
- package/publish/lib/cjs/Utils/guid.js +67 -0
- package/publish/lib/cjs/Utils/initDefaultOptions.d.ts +10 -0
- package/publish/lib/cjs/Utils/initDefaultOptions.js +607 -0
- package/publish/lib/cjs/Utils/inputsCalculation.d.ts +28 -0
- package/publish/lib/cjs/Utils/inputsCalculation.js +188 -0
- package/publish/lib/cjs/Utils/math.d.ts +77 -0
- package/publish/lib/cjs/Utils/math.js +305 -0
- package/publish/lib/cjs/Utils/object.d.ts +18 -0
- package/publish/lib/cjs/Utils/object.js +120 -0
- package/publish/lib/cjs/Utils/os.d.ts +2 -0
- package/publish/lib/cjs/Utils/os.js +104 -0
- package/publish/lib/cjs/Utils/performance.d.ts +3 -0
- package/publish/lib/cjs/Utils/performance.js +94 -0
- package/publish/lib/cjs/Utils/sanitize.d.ts +14 -0
- package/publish/lib/cjs/Utils/sanitize.js +87 -0
- package/publish/lib/cjs/Utils/time.d.ts +40 -0
- package/publish/lib/cjs/Utils/time.js +177 -0
- package/publish/lib/cjs/Utils/tree.d.ts +40 -0
- package/publish/lib/cjs/Utils/tree.js +195 -0
- package/publish/lib/cjs/Utils/useAutosizeTextArea.d.ts +10 -0
- package/publish/lib/cjs/Utils/useAutosizeTextArea.js +231 -0
- package/publish/lib/cjs/Utils/useBoundedDrag.d.ts +125 -0
- package/publish/lib/cjs/Utils/useBoundedDrag.js +380 -0
- package/publish/lib/cjs/Utils/useClickOutside.d.ts +33 -0
- package/publish/lib/cjs/Utils/useClickOutside.js +166 -0
- package/publish/lib/cjs/Utils/useComId.d.ts +6 -0
- package/publish/lib/cjs/Utils/useComId.js +114 -0
- package/publish/lib/cjs/Utils/useDebounce.d.ts +20 -0
- package/publish/lib/cjs/Utils/useDebounce.js +138 -0
- package/publish/lib/cjs/Utils/useDragDropPosition.d.ts +166 -0
- package/publish/lib/cjs/Utils/useDragDropPosition.js +453 -0
- package/publish/lib/cjs/Utils/useDraggable.d.ts +62 -0
- package/publish/lib/cjs/Utils/useDraggable.js +348 -0
- package/publish/lib/cjs/Utils/useHistoryTracker.d.ts +166 -0
- package/publish/lib/cjs/Utils/useHistoryTracker.js +649 -0
- package/publish/lib/cjs/Utils/useInterval.d.ts +5 -0
- package/publish/lib/cjs/Utils/useInterval.js +168 -0
- package/publish/lib/cjs/Utils/useIsMobile.d.ts +2 -0
- package/publish/lib/cjs/Utils/useIsMobile.js +232 -0
- package/publish/lib/cjs/Utils/useKeyPress.d.ts +44 -0
- package/publish/lib/cjs/Utils/useKeyPress.js +200 -0
- package/publish/lib/cjs/Utils/useSessionStorageListener.d.ts +2 -0
- package/publish/lib/cjs/Utils/useSessionStorageListener.js +157 -0
- package/publish/lib/cjs/Utils/useStreamController.d.ts +71 -0
- package/publish/lib/cjs/Utils/useStreamController.js +494 -0
- package/publish/lib/cjs/Utils/useThrottle.d.ts +2 -0
- package/publish/lib/cjs/Utils/useThrottle.js +136 -0
- package/publish/lib/cjs/Utils/useWindowScroll.d.ts +12 -0
- package/publish/lib/cjs/Utils/useWindowScroll.js +217 -0
- package/publish/lib/cjs/Utils/validate.d.ts +53 -0
- package/publish/lib/cjs/Utils/validate.js +536 -0
- package/publish/lib/cjs/Utils/viewport.d.ts +7 -0
- package/publish/lib/cjs/Utils/viewport.js +64 -0
- package/publish/lib/cjs/index.d.ts +49 -0
- package/publish/lib/cjs/index.js +50 -0
- package/publish/lib/css/BackToTop/index.css +34 -0
- package/publish/lib/css/CascadingSelect/index.css +245 -0
- package/publish/lib/css/CascadingSelectE2E/index.css +245 -0
- package/publish/lib/css/Chatbox/index.css +774 -0
- package/publish/lib/css/ColorPicker/index.css +58 -0
- package/publish/lib/css/Date/index.css +434 -0
- package/publish/lib/css/DragDropList/index.css +188 -0
- package/publish/lib/css/DropdownMenu/index.css +151 -0
- package/publish/lib/css/EventCalendar/index.css +300 -0
- package/publish/lib/css/EventCalendarTimeline/index.css +694 -0
- package/publish/lib/css/HorizontalScrollContent/index.css +70 -0
- package/publish/lib/css/LiveSearch/index.css +88 -0
- package/publish/lib/css/MultilevelDropdownMenu/index.css +38 -0
- package/publish/lib/css/MultipleSelect/index.css +313 -0
- package/publish/lib/css/RangeSlider/index.css +150 -0
- package/publish/lib/css/Scrollbar/index.css +176 -0
- package/publish/lib/css/Select/index.css +434 -0
- package/publish/lib/css/ShowMoreLess/index.css +23 -0
- package/publish/lib/css/SplitterPanel/index.css +63 -0
- package/publish/lib/css/Stepper/index.css +250 -0
- package/publish/lib/css/Table/index.css +584 -0
- package/publish/lib/css/TagInput/index.css +91 -0
- package/publish/lib/css/Toast/index.css +149 -0
- package/publish/lib/css/Tooltip/index.css +198 -0
- package/publish/lib/css/Tree/index.css +237 -0
- package/publish/lib/esm/Accordion/Accordion.tsx +185 -0
- package/publish/lib/esm/Accordion/AccordionItem.tsx +248 -0
- package/publish/lib/esm/Accordion/index.tsx +2 -0
- package/publish/lib/esm/BackToTop/index.scss +47 -0
- package/publish/lib/esm/BackToTop/index.tsx +177 -0
- package/publish/lib/esm/CascadingSelect/Group.tsx +83 -0
- package/publish/lib/esm/CascadingSelect/index.scss +330 -0
- package/publish/lib/esm/CascadingSelect/index.tsx +1397 -0
- package/publish/lib/esm/CascadingSelectE2E/Group.tsx +87 -0
- package/publish/lib/esm/CascadingSelectE2E/index.scss +333 -0
- package/publish/lib/esm/CascadingSelectE2E/index.tsx +1684 -0
- package/publish/lib/esm/Chatbox/PureLoader.tsx +47 -0
- package/publish/lib/esm/Chatbox/TypingEffect.tsx +56 -0
- package/publish/lib/esm/Chatbox/index.scss +966 -0
- package/publish/lib/esm/Chatbox/index.tsx +1742 -0
- package/publish/lib/esm/Chatbox/utils/func.ts +180 -0
- package/publish/lib/esm/Checkbox/index.tsx +206 -0
- package/publish/lib/esm/ColorPicker/index.scss +91 -0
- package/publish/lib/esm/ColorPicker/index.tsx +204 -0
- package/publish/lib/esm/Date/Calendar.tsx +723 -0
- package/publish/lib/esm/Date/index.scss +567 -0
- package/publish/lib/esm/Date/index.tsx +1797 -0
- package/publish/lib/esm/Date/localization/en_US.js +13 -0
- package/publish/lib/esm/Date/localization/zh_CN.js +12 -0
- package/publish/lib/esm/DigitalClock/index.tsx +74 -0
- package/publish/lib/esm/DragDropList/index.scss +245 -0
- package/publish/lib/esm/DragDropList/index.tsx +504 -0
- package/publish/lib/esm/DropdownMenu/Option.tsx +55 -0
- package/publish/lib/esm/DropdownMenu/index.scss +205 -0
- package/publish/lib/esm/DropdownMenu/index.tsx +378 -0
- package/publish/lib/esm/DynamicFields/index.tsx +409 -0
- package/publish/lib/esm/EventCalendar/index.scss +407 -0
- package/publish/lib/esm/EventCalendar/index.tsx +1005 -0
- package/publish/lib/esm/EventCalendarTimeline/index.scss +926 -0
- package/publish/lib/esm/EventCalendarTimeline/index.tsx +2686 -0
- package/publish/lib/esm/File/index.tsx +477 -0
- package/publish/lib/esm/HorizontalScrollContent/index.scss +87 -0
- package/publish/lib/esm/HorizontalScrollContent/index.tsx +171 -0
- package/publish/lib/esm/Input/index.tsx +641 -0
- package/publish/lib/esm/LiveSearch/index.scss +129 -0
- package/publish/lib/esm/LiveSearch/index.tsx +1058 -0
- package/publish/lib/esm/MasonryLayout/index.tsx +326 -0
- package/publish/lib/esm/ModalDialog/index.tsx +572 -0
- package/publish/lib/esm/ModeSwitch/index.tsx +82 -0
- package/publish/lib/esm/MultilevelDropdownMenu/ItemList.tsx +265 -0
- package/publish/lib/esm/MultilevelDropdownMenu/index.scss +79 -0
- package/publish/lib/esm/MultilevelDropdownMenu/index.tsx +77 -0
- package/publish/lib/esm/MultipleCheckboxes/index.tsx +849 -0
- package/publish/lib/esm/MultipleSelect/index.scss +398 -0
- package/publish/lib/esm/MultipleSelect/index.tsx +769 -0
- package/publish/lib/esm/MultipleSelect/utils/func.ts +63 -0
- package/publish/lib/esm/NativeSelect/index.tsx +396 -0
- package/publish/lib/esm/NativeSelect/utils/func.ts +51 -0
- package/publish/lib/esm/NumberInput/index.tsx +425 -0
- package/publish/lib/esm/Pagination/index.tsx +286 -0
- package/publish/lib/esm/Pagination/pagination-navigators.tsx +60 -0
- package/publish/lib/esm/Radio/index.tsx +694 -0
- package/publish/lib/esm/RangeSlider/index.scss +186 -0
- package/publish/lib/esm/RangeSlider/index.tsx +241 -0
- package/publish/lib/esm/Refresher/index.tsx +121 -0
- package/publish/lib/esm/RootPortal/index.tsx +59 -0
- package/publish/lib/esm/ScrollReveal/index.tsx +148 -0
- package/publish/lib/esm/Scrollbar/index.scss +221 -0
- package/publish/lib/esm/Scrollbar/index.tsx +561 -0
- package/publish/lib/esm/SearchBar/index.tsx +252 -0
- package/publish/lib/esm/Select/index.scss +639 -0
- package/publish/lib/esm/Select/index.tsx +3104 -0
- package/publish/lib/esm/Select/utils/func.ts +98 -0
- package/publish/lib/esm/ShowMoreLess/index.scss +27 -0
- package/publish/lib/esm/ShowMoreLess/index.tsx +145 -0
- package/publish/lib/esm/SplitterPanel/index.scss +82 -0
- package/publish/lib/esm/SplitterPanel/index.tsx +174 -0
- package/publish/lib/esm/Stepper/index.scss +315 -0
- package/publish/lib/esm/Stepper/index.tsx +325 -0
- package/publish/lib/esm/Switch/index.tsx +149 -0
- package/publish/lib/esm/Table/Table.tsx +351 -0
- package/publish/lib/esm/Table/TableBody.tsx +41 -0
- package/publish/lib/esm/Table/TableCaption.tsx +34 -0
- package/publish/lib/esm/Table/TableCell.tsx +126 -0
- package/publish/lib/esm/Table/TableColgroup.tsx +38 -0
- package/publish/lib/esm/Table/TableContext.tsx +26 -0
- package/publish/lib/esm/Table/TableFoot.tsx +28 -0
- package/publish/lib/esm/Table/TableHead.tsx +28 -0
- package/publish/lib/esm/Table/TableRow.tsx +76 -0
- package/publish/lib/esm/Table/index.scss +418 -0
- package/publish/lib/esm/Table/index.tsx +14 -0
- package/publish/lib/esm/Table/utils/DragHandleSprite.tsx +46 -0
- package/publish/lib/esm/Table/utils/SortSprite.tsx +63 -0
- package/publish/lib/esm/Table/utils/TableFilter.tsx +56 -0
- package/publish/lib/esm/Table/utils/ToggleSelection.tsx +255 -0
- package/publish/lib/esm/Table/utils/func.ts +182 -0
- package/publish/lib/esm/Table/utils/hooks/useTableDraggable.tsx +342 -0
- package/publish/lib/esm/Table/utils/hooks/useTableKeyPress.tsx +255 -0
- package/publish/lib/esm/Table/utils/hooks/useTableResponsive.tsx +92 -0
- package/publish/lib/esm/Table/utils/hooks/useTableSort.tsx +187 -0
- package/publish/lib/esm/Tabs/TabList.tsx +50 -0
- package/publish/lib/esm/Tabs/TabPanel.tsx +44 -0
- package/publish/lib/esm/Tabs/Tabs.tsx +282 -0
- package/publish/lib/esm/Tabs/index.tsx +3 -0
- package/publish/lib/esm/TagInput/index.scss +126 -0
- package/publish/lib/esm/TagInput/index.tsx +379 -0
- package/publish/lib/esm/Textarea/index.tsx +621 -0
- package/publish/lib/esm/Toast/Item.tsx +165 -0
- package/publish/lib/esm/Toast/Toast.tsx +391 -0
- package/publish/lib/esm/Toast/ToastContext.tsx +104 -0
- package/publish/lib/esm/Toast/__toast.vanilla.js +422 -0
- package/publish/lib/esm/Toast/index.scss +197 -0
- package/publish/lib/esm/Toast/index.tsx +3 -0
- package/publish/lib/esm/Toast/types.ts +60 -0
- package/publish/lib/esm/Toast/useToast.tsx +72 -0
- package/publish/lib/esm/Tooltip/index.scss +272 -0
- package/publish/lib/esm/Tooltip/index.tsx +416 -0
- package/publish/lib/esm/Tree/TreeList.tsx +600 -0
- package/publish/lib/esm/Tree/index.scss +384 -0
- package/publish/lib/esm/Tree/index.tsx +661 -0
- package/publish/lib/esm/Tree/init-height.tsx +40 -0
- package/publish/lib/esm/Tree/utils/func.ts +15 -0
- package/publish/lib/esm/Utils/hooks/useAutosizeTextArea.tsx +131 -0
- package/publish/lib/esm/Utils/hooks/useBoundedDrag.tsx +301 -0
- package/publish/lib/esm/Utils/hooks/useClickOutside.tsx +69 -0
- package/publish/lib/esm/Utils/hooks/useComId.tsx +13 -0
- package/publish/lib/esm/Utils/hooks/useDebounce.tsx +40 -0
- package/publish/lib/esm/Utils/hooks/useDragDropPosition.tsx +417 -0
- package/publish/lib/esm/Utils/hooks/useDraggable.tsx +265 -0
- package/publish/lib/esm/Utils/hooks/useHistoryTracker.tsx +554 -0
- package/publish/lib/esm/Utils/hooks/useInterval.tsx +74 -0
- package/publish/lib/esm/Utils/hooks/useIsMobile.tsx +139 -0
- package/publish/lib/esm/Utils/hooks/useKeyPress.tsx +104 -0
- package/publish/lib/esm/Utils/hooks/useSessionStorageListener.tsx +45 -0
- package/publish/lib/esm/Utils/hooks/useStreamController.tsx +277 -0
- package/publish/lib/esm/Utils/hooks/useThrottle.tsx +39 -0
- package/publish/lib/esm/Utils/hooks/useWindowScroll.tsx +83 -0
- package/publish/lib/esm/Utils/libs/anim.ts +96 -0
- package/publish/lib/esm/Utils/libs/buffer.ts +262 -0
- package/publish/lib/esm/Utils/libs/cls.ts +64 -0
- package/publish/lib/esm/Utils/libs/convert.ts +59 -0
- package/publish/lib/esm/Utils/libs/date.ts +598 -0
- package/publish/lib/esm/Utils/libs/dom.ts +150 -0
- package/publish/lib/esm/Utils/libs/easing.ts +201 -0
- package/publish/lib/esm/Utils/libs/extract.ts +160 -0
- package/publish/lib/esm/Utils/libs/format-string.ts +116 -0
- package/publish/lib/esm/Utils/libs/formdata.ts +93 -0
- package/publish/lib/esm/Utils/libs/getElementProperty.ts +150 -0
- package/publish/lib/esm/Utils/libs/guid.ts +16 -0
- package/publish/lib/esm/Utils/libs/initDefaultOptions.ts +43 -0
- package/publish/lib/esm/Utils/libs/inputsCalculation.ts +160 -0
- package/publish/lib/esm/Utils/libs/math.ts +276 -0
- package/publish/lib/esm/Utils/libs/object.ts +68 -0
- package/publish/lib/esm/Utils/libs/os.ts +63 -0
- package/publish/lib/esm/Utils/libs/performance.ts +47 -0
- package/publish/lib/esm/Utils/libs/sanitize.ts +55 -0
- package/publish/lib/esm/Utils/libs/time.ts +139 -0
- package/publish/lib/esm/Utils/libs/tree.ts +119 -0
- package/publish/lib/esm/Utils/libs/validate.ts +434 -0
- package/publish/lib/esm/Utils/libs/viewport.ts +20 -0
- package/publish/lib/esm/Utils/plugins/bodyScrollLock.ts +286 -0
- package/publish/lib/esm/index.js +47 -0
- package/publish/package.json +1 -0
- /package/{Accordion → publish/Accordion}/index.d.ts +0 -0
- /package/{Accordion → publish/Accordion}/index.js +0 -0
- /package/{BackToTop → publish/BackToTop}/index.css +0 -0
- /package/{BackToTop → publish/BackToTop}/index.d.ts +0 -0
- /package/{BackToTop → publish/BackToTop}/index.js +0 -0
- /package/{CascadingSelect → publish/CascadingSelect}/index.css +0 -0
- /package/{CascadingSelect → publish/CascadingSelect}/index.d.ts +0 -0
- /package/{CascadingSelect → publish/CascadingSelect}/index.js +0 -0
- /package/{CascadingSelectE2E → publish/CascadingSelectE2E}/index.css +0 -0
- /package/{CascadingSelectE2E → publish/CascadingSelectE2E}/index.d.ts +0 -0
- /package/{CascadingSelectE2E → publish/CascadingSelectE2E}/index.js +0 -0
- /package/{Chatbox → publish/Chatbox}/index.css +0 -0
- /package/{Chatbox → publish/Chatbox}/index.d.ts +0 -0
- /package/{Chatbox → publish/Chatbox}/index.js +0 -0
- /package/{Checkbox → publish/Checkbox}/index.d.ts +0 -0
- /package/{Checkbox → publish/Checkbox}/index.js +0 -0
- /package/{ColorPicker → publish/ColorPicker}/index.css +0 -0
- /package/{ColorPicker → publish/ColorPicker}/index.d.ts +0 -0
- /package/{ColorPicker → publish/ColorPicker}/index.js +0 -0
- /package/{Date → publish/Date}/index.css +0 -0
- /package/{Date → publish/Date}/index.d.ts +0 -0
- /package/{DigitalClock → publish/DigitalClock}/index.d.ts +0 -0
- /package/{DigitalClock → publish/DigitalClock}/index.js +0 -0
- /package/{DragDropList → publish/DragDropList}/index.css +0 -0
- /package/{DragDropList → publish/DragDropList}/index.d.ts +0 -0
- /package/{DragDropList → publish/DragDropList}/index.js +0 -0
- /package/{DropdownMenu → publish/DropdownMenu}/index.css +0 -0
- /package/{DropdownMenu → publish/DropdownMenu}/index.d.ts +0 -0
- /package/{DropdownMenu → publish/DropdownMenu}/index.js +0 -0
- /package/{DynamicFields → publish/DynamicFields}/index.d.ts +0 -0
- /package/{EventCalendar → publish/EventCalendar}/index.css +0 -0
- /package/{EventCalendar → publish/EventCalendar}/index.d.ts +0 -0
- /package/{EventCalendar → publish/EventCalendar}/index.js +0 -0
- /package/{EventCalendarTimeline → publish/EventCalendarTimeline}/index.css +0 -0
- /package/{EventCalendarTimeline → publish/EventCalendarTimeline}/index.d.ts +0 -0
- /package/{EventCalendarTimeline → publish/EventCalendarTimeline}/index.js +0 -0
- /package/{File → publish/File}/index.d.ts +0 -0
- /package/{File → publish/File}/index.js +0 -0
- /package/{HorizontalScrollContent → publish/HorizontalScrollContent}/index.css +0 -0
- /package/{HorizontalScrollContent → publish/HorizontalScrollContent}/index.d.ts +0 -0
- /package/{HorizontalScrollContent → publish/HorizontalScrollContent}/index.js +0 -0
- /package/{Input → publish/Input}/index.d.ts +0 -0
- /package/{Input → publish/Input}/index.js +0 -0
- /package/{LiveSearch → publish/LiveSearch}/index.css +0 -0
- /package/{LiveSearch → publish/LiveSearch}/index.d.ts +0 -0
- /package/{LiveSearch → publish/LiveSearch}/index.js +0 -0
- /package/{MasonryLayout → publish/MasonryLayout}/index.d.ts +0 -0
- /package/{MasonryLayout → publish/MasonryLayout}/index.js +0 -0
- /package/{ModalDialog → publish/ModalDialog}/index.d.ts +0 -0
- /package/{ModalDialog → publish/ModalDialog}/index.js +0 -0
- /package/{ModeSwitch → publish/ModeSwitch}/index.d.ts +0 -0
- /package/{ModeSwitch → publish/ModeSwitch}/index.js +0 -0
- /package/{MultilevelDropdownMenu → publish/MultilevelDropdownMenu}/index.css +0 -0
- /package/{MultilevelDropdownMenu → publish/MultilevelDropdownMenu}/index.d.ts +0 -0
- /package/{MultilevelDropdownMenu → publish/MultilevelDropdownMenu}/index.js +0 -0
- /package/{MultipleCheckboxes → publish/MultipleCheckboxes}/index.d.ts +0 -0
- /package/{MultipleCheckboxes → publish/MultipleCheckboxes}/index.js +0 -0
- /package/{MultipleSelect → publish/MultipleSelect}/index.css +0 -0
- /package/{MultipleSelect → publish/MultipleSelect}/index.d.ts +0 -0
- /package/{MultipleSelect → publish/MultipleSelect}/index.js +0 -0
- /package/{NativeSelect → publish/NativeSelect}/index.d.ts +0 -0
- /package/{NativeSelect → publish/NativeSelect}/index.js +0 -0
- /package/{NumberInput → publish/NumberInput}/index.d.ts +0 -0
- /package/{NumberInput → publish/NumberInput}/index.js +0 -0
- /package/{Pagination → publish/Pagination}/index.d.ts +0 -0
- /package/{Pagination → publish/Pagination}/index.js +0 -0
- /package/{Radio → publish/Radio}/index.d.ts +0 -0
- /package/{Radio → publish/Radio}/index.js +0 -0
- /package/{RangeSlider → publish/RangeSlider}/index.css +0 -0
- /package/{RangeSlider → publish/RangeSlider}/index.d.ts +0 -0
- /package/{RangeSlider → publish/RangeSlider}/index.js +0 -0
- /package/{Refresher → publish/Refresher}/index.d.ts +0 -0
- /package/{Refresher → publish/Refresher}/index.js +0 -0
- /package/{RootPortal → publish/RootPortal}/index.d.ts +0 -0
- /package/{RootPortal → publish/RootPortal}/index.js +0 -0
- /package/{ScrollReveal → publish/ScrollReveal}/index.d.ts +0 -0
- /package/{ScrollReveal → publish/ScrollReveal}/index.js +0 -0
- /package/{Scrollbar → publish/Scrollbar}/index.css +0 -0
- /package/{Scrollbar → publish/Scrollbar}/index.d.ts +0 -0
- /package/{Scrollbar → publish/Scrollbar}/index.js +0 -0
- /package/{SearchBar → publish/SearchBar}/index.d.ts +0 -0
- /package/{SearchBar → publish/SearchBar}/index.js +0 -0
- /package/{Select → publish/Select}/index.css +0 -0
- /package/{Select → publish/Select}/index.d.ts +0 -0
- /package/{Select → publish/Select}/index.js +0 -0
- /package/{ShowMoreLess → publish/ShowMoreLess}/index.css +0 -0
- /package/{ShowMoreLess → publish/ShowMoreLess}/index.d.ts +0 -0
- /package/{ShowMoreLess → publish/ShowMoreLess}/index.js +0 -0
- /package/{SplitterPanel → publish/SplitterPanel}/index.css +0 -0
- /package/{SplitterPanel → publish/SplitterPanel}/index.d.ts +0 -0
- /package/{SplitterPanel → publish/SplitterPanel}/index.js +0 -0
- /package/{Stepper → publish/Stepper}/index.css +0 -0
- /package/{Stepper → publish/Stepper}/index.d.ts +0 -0
- /package/{Stepper → publish/Stepper}/index.js +0 -0
- /package/{Switch → publish/Switch}/index.d.ts +0 -0
- /package/{Switch → publish/Switch}/index.js +0 -0
- /package/{Table → publish/Table}/index.css +0 -0
- /package/{Table → publish/Table}/index.d.ts +0 -0
- /package/{Table → publish/Table}/index.js +0 -0
- /package/{Tabs → publish/Tabs}/index.d.ts +0 -0
- /package/{Tabs → publish/Tabs}/index.js +0 -0
- /package/{TagInput → publish/TagInput}/index.css +0 -0
- /package/{TagInput → publish/TagInput}/index.d.ts +0 -0
- /package/{TagInput → publish/TagInput}/index.js +0 -0
- /package/{Textarea → publish/Textarea}/index.d.ts +0 -0
- /package/{Textarea → publish/Textarea}/index.js +0 -0
- /package/{Toast → publish/Toast}/index.css +0 -0
- /package/{Toast → publish/Toast}/index.d.ts +0 -0
- /package/{Toast → publish/Toast}/index.js +0 -0
- /package/{Tooltip → publish/Tooltip}/index.css +0 -0
- /package/{Tooltip → publish/Tooltip}/index.d.ts +0 -0
- /package/{Tooltip → publish/Tooltip}/index.js +0 -0
- /package/{Tree → publish/Tree}/index.css +0 -0
- /package/{Tree → publish/Tree}/index.d.ts +0 -0
- /package/{Tree → publish/Tree}/index.js +0 -0
- /package/{Utils → publish/Utils}/anim.d.ts +0 -0
- /package/{Utils → publish/Utils}/anim.js +0 -0
- /package/{Utils → publish/Utils}/bodyScrollLock.d.ts +0 -0
- /package/{Utils → publish/Utils}/bodyScrollLock.js +0 -0
- /package/{Utils → publish/Utils}/buffer.d.ts +0 -0
- /package/{Utils → publish/Utils}/buffer.js +0 -0
- /package/{Utils → publish/Utils}/cls.d.ts +0 -0
- /package/{Utils → publish/Utils}/cls.js +0 -0
- /package/{Utils → publish/Utils}/convert.d.ts +0 -0
- /package/{Utils → publish/Utils}/convert.js +0 -0
- /package/{Utils → publish/Utils}/date.d.ts +0 -0
- /package/{Utils → publish/Utils}/date.js +0 -0
- /package/{Utils → publish/Utils}/dom.d.ts +0 -0
- /package/{Utils → publish/Utils}/dom.js +0 -0
- /package/{Utils → publish/Utils}/easing.d.ts +0 -0
- /package/{Utils → publish/Utils}/easing.js +0 -0
- /package/{Utils → publish/Utils}/extract.d.ts +0 -0
- /package/{Utils → publish/Utils}/extract.js +0 -0
- /package/{Utils → publish/Utils}/format-string.d.ts +0 -0
- /package/{Utils → publish/Utils}/format-string.js +0 -0
- /package/{Utils → publish/Utils}/formdata.d.ts +0 -0
- /package/{Utils → publish/Utils}/formdata.js +0 -0
- /package/{Utils → publish/Utils}/getElementProperty.d.ts +0 -0
- /package/{Utils → publish/Utils}/getElementProperty.js +0 -0
- /package/{Utils → publish/Utils}/guid.d.ts +0 -0
- /package/{Utils → publish/Utils}/guid.js +0 -0
- /package/{Utils → publish/Utils}/initDefaultOptions.d.ts +0 -0
- /package/{Utils → publish/Utils}/initDefaultOptions.js +0 -0
- /package/{Utils → publish/Utils}/inputsCalculation.d.ts +0 -0
- /package/{Utils → publish/Utils}/inputsCalculation.js +0 -0
- /package/{Utils → publish/Utils}/math.d.ts +0 -0
- /package/{Utils → publish/Utils}/math.js +0 -0
- /package/{Utils → publish/Utils}/object.d.ts +0 -0
- /package/{Utils → publish/Utils}/object.js +0 -0
- /package/{Utils → publish/Utils}/os.d.ts +0 -0
- /package/{Utils → publish/Utils}/os.js +0 -0
- /package/{Utils → publish/Utils}/performance.d.ts +0 -0
- /package/{Utils → publish/Utils}/performance.js +0 -0
- /package/{Utils → publish/Utils}/sanitize.d.ts +0 -0
- /package/{Utils → publish/Utils}/sanitize.js +0 -0
- /package/{Utils → publish/Utils}/time.d.ts +0 -0
- /package/{Utils → publish/Utils}/time.js +0 -0
- /package/{Utils → publish/Utils}/tree.d.ts +0 -0
- /package/{Utils → publish/Utils}/tree.js +0 -0
- /package/{Utils → publish/Utils}/useAutosizeTextArea.d.ts +0 -0
- /package/{Utils → publish/Utils}/useAutosizeTextArea.js +0 -0
- /package/{Utils → publish/Utils}/useBoundedDrag.d.ts +0 -0
- /package/{Utils → publish/Utils}/useBoundedDrag.js +0 -0
- /package/{Utils → publish/Utils}/useClickOutside.d.ts +0 -0
- /package/{Utils → publish/Utils}/useClickOutside.js +0 -0
- /package/{Utils → publish/Utils}/useComId.d.ts +0 -0
- /package/{Utils → publish/Utils}/useComId.js +0 -0
- /package/{Utils → publish/Utils}/useDebounce.d.ts +0 -0
- /package/{Utils → publish/Utils}/useDebounce.js +0 -0
- /package/{Utils → publish/Utils}/useDragDropPosition.d.ts +0 -0
- /package/{Utils → publish/Utils}/useDragDropPosition.js +0 -0
- /package/{Utils → publish/Utils}/useDraggable.d.ts +0 -0
- /package/{Utils → publish/Utils}/useDraggable.js +0 -0
- /package/{Utils → publish/Utils}/useHistoryTracker.d.ts +0 -0
- /package/{Utils → publish/Utils}/useHistoryTracker.js +0 -0
- /package/{Utils → publish/Utils}/useInterval.d.ts +0 -0
- /package/{Utils → publish/Utils}/useInterval.js +0 -0
- /package/{Utils → publish/Utils}/useIsMobile.d.ts +0 -0
- /package/{Utils → publish/Utils}/useIsMobile.js +0 -0
- /package/{Utils → publish/Utils}/useKeyPress.d.ts +0 -0
- /package/{Utils → publish/Utils}/useKeyPress.js +0 -0
- /package/{Utils → publish/Utils}/useSessionStorageListener.d.ts +0 -0
- /package/{Utils → publish/Utils}/useSessionStorageListener.js +0 -0
- /package/{Utils → publish/Utils}/useStreamController.d.ts +0 -0
- /package/{Utils → publish/Utils}/useStreamController.js +0 -0
- /package/{Utils → publish/Utils}/useThrottle.d.ts +0 -0
- /package/{Utils → publish/Utils}/useThrottle.js +0 -0
- /package/{Utils → publish/Utils}/useWindowScroll.d.ts +0 -0
- /package/{Utils → publish/Utils}/useWindowScroll.js +0 -0
- /package/{Utils → publish/Utils}/validate.d.ts +0 -0
- /package/{Utils → publish/Utils}/validate.js +0 -0
- /package/{Utils → publish/Utils}/viewport.d.ts +0 -0
- /package/{Utils → publish/Utils}/viewport.js +0 -0
- /package/{all.d.ts → publish/all.d.ts} +0 -0
- /package/{all.js → publish/all.js} +0 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert Tree
|
|
3
|
+
* @param {Array} arr - Flat array
|
|
4
|
+
* @param {?string | ?number} parentId - Parent id
|
|
5
|
+
* @param {?string} keyId - Key value of id.
|
|
6
|
+
* @param {?string} keyParentId - Key value of parent id.
|
|
7
|
+
* @returns Array
|
|
8
|
+
*/
|
|
9
|
+
function convertTree(arr: any[], parentId: string | number = '', keyId: string = 'id', keyParentId: string = 'parent_id'): any[] {
|
|
10
|
+
|
|
11
|
+
if (!parentId) {
|
|
12
|
+
|
|
13
|
+
// If there is no parent id (when recursing for the first time), all parents will be queried
|
|
14
|
+
return arr.filter(item => !item[keyParentId]).map(item => {
|
|
15
|
+
// Query all child nodes by parent node ID
|
|
16
|
+
item.children = convertTree(arr, item[keyId], keyId, keyParentId);
|
|
17
|
+
return item;
|
|
18
|
+
})
|
|
19
|
+
} else {
|
|
20
|
+
return arr.filter(item => item[keyParentId] === parentId).map(item => {
|
|
21
|
+
// Query all child nodes by parent node ID
|
|
22
|
+
item.children = convertTree(arr, item[keyId], keyId, keyParentId);
|
|
23
|
+
return item;
|
|
24
|
+
})
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Flat tree
|
|
31
|
+
* @param {Array} arr - Hierarchical array
|
|
32
|
+
* @returns Array
|
|
33
|
+
*/
|
|
34
|
+
function flatTree(arr: any[]): any[] {
|
|
35
|
+
const flatData = ({...rest}: any) => {
|
|
36
|
+
const { children = [] } = rest;
|
|
37
|
+
return [{...rest}, ...children.flatMap(flatData)];
|
|
38
|
+
};
|
|
39
|
+
let result = arr.flatMap(flatData);
|
|
40
|
+
|
|
41
|
+
//remove children from item
|
|
42
|
+
result = result.map((item) => {
|
|
43
|
+
delete item.children;
|
|
44
|
+
return item;
|
|
45
|
+
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Get all depth
|
|
53
|
+
* @param {Object} node
|
|
54
|
+
* @returns Number
|
|
55
|
+
*/
|
|
56
|
+
function getAllDepth(arr: any[]): number {
|
|
57
|
+
const count = (children: any[]): number => {
|
|
58
|
+
return children.reduce((depth, child) => {
|
|
59
|
+
return Math.max(depth, 1 + count(child.children)); // increment depth of children by 1, and compare it with accumulated depth of other children within the same element
|
|
60
|
+
}, 0); //default value 0 that's returned if there are no children
|
|
61
|
+
}
|
|
62
|
+
return count(arr);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Add depth to each item in the tree
|
|
70
|
+
* @param {Array} arr - Hierarchical array
|
|
71
|
+
* @param {?string} keyId - Key value of id.
|
|
72
|
+
* @param {?string} keyParentId - Key value of parent id.
|
|
73
|
+
* @param {?number} depth - Depth of the item.
|
|
74
|
+
* @returns Number
|
|
75
|
+
*/
|
|
76
|
+
function addTreeDepth(arr: any[], keyId: string = 'id', parentItem: string = '', depth: number = 0): any[] {
|
|
77
|
+
return arr.reduce((acc, el) => {
|
|
78
|
+
const { children, ...otherProps } = el;
|
|
79
|
+
acc.push({ ...otherProps, parentItem, depth });
|
|
80
|
+
if (children) {
|
|
81
|
+
return acc.concat(addTreeDepth(children, keyId, el[keyId], depth + 1));
|
|
82
|
+
}
|
|
83
|
+
return acc;
|
|
84
|
+
}, []);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Add indent placeholder
|
|
91
|
+
* @param {Array} arr - Flat array
|
|
92
|
+
* @param {?string} placeholder - String of placeholder
|
|
93
|
+
* @param {?string} lastPlaceholder - Last String of placeholder
|
|
94
|
+
* @param {?string} keyName - Key value of name.
|
|
95
|
+
* @returns Array
|
|
96
|
+
*/
|
|
97
|
+
function addTreeIndent(arr: any[], placeholder: string = ' ', lastPlaceholder: string = '', keyName: string = 'label'): void {
|
|
98
|
+
|
|
99
|
+
arr.forEach((item) => {
|
|
100
|
+
let indent = '';
|
|
101
|
+
if (item.depth) {
|
|
102
|
+
Array(item.depth).fill(0).forEach((k, i) => {
|
|
103
|
+
indent += placeholder;
|
|
104
|
+
if (i === item.depth-1) {
|
|
105
|
+
item[keyName] = indent + lastPlaceholder + item[keyName];
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export {
|
|
113
|
+
getAllDepth,
|
|
114
|
+
convertTree,
|
|
115
|
+
flatTree,
|
|
116
|
+
addTreeDepth,
|
|
117
|
+
addTreeIndent
|
|
118
|
+
};
|
|
119
|
+
|
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fix And Parse JSON (Support for handling complex escape JSON strings)
|
|
3
|
+
* @desc recursively fix top-level key/value (recursively handles when encountering top-level values that are objects/arrays)
|
|
4
|
+
* @private
|
|
5
|
+
*/
|
|
6
|
+
/*
|
|
7
|
+
- Still prioritize JSON.parse first;
|
|
8
|
+
- After parse fails, do unescaping (\\" → ");
|
|
9
|
+
- Then process the outermost layer (object or array) key by key, value by value;
|
|
10
|
+
- If a top-level value is an unquoted object or array (e.g., messages: [ {...} ]), recursively treat that value as a new outermost layer for fixing;
|
|
11
|
+
- For strings wrapped in quotes ('...' or "..."), only extract the outer layer and re-encode with JSON.stringify (ensuring internal single/double quotes won't be mistakenly changed);
|
|
12
|
+
- Set MAX_DEPTH to prevent infinite recursion.
|
|
13
|
+
*/
|
|
14
|
+
/*
|
|
15
|
+
@Examples:
|
|
16
|
+
|
|
17
|
+
// ✅ Valid JSON (contains svg and single quote content)
|
|
18
|
+
const okJson = `{
|
|
19
|
+
"label":"<svg width='16' height='16'><path fill='currentColor' d='M19 13h-6'/></svg> 新建会话",
|
|
20
|
+
"value":"new",
|
|
21
|
+
"onClick":"method.setVal(''); method.clearData();"
|
|
22
|
+
}`;
|
|
23
|
+
|
|
24
|
+
const okJson2 = `{
|
|
25
|
+
label:"<svg width='16' height='16'><path fill='currentColor' d='M19 13h-6'/></svg> 新建会话",
|
|
26
|
+
value:"new",
|
|
27
|
+
onClick:"method.setVal(''); method.clearData();"
|
|
28
|
+
}`;
|
|
29
|
+
|
|
30
|
+
// ⚠️ Single quote JSON
|
|
31
|
+
const badJson = "{'model':'{model}','messages':[{'role':'user','content':'{message}'}],'stream': true}";
|
|
32
|
+
|
|
33
|
+
// ⚠️ Escaped JSON
|
|
34
|
+
const badJson2 = "{\\\"label\\\":\\\"<svg width='16' height='16' viewBox='0 0 24 24'><path fill='currentColor' d='M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z'/></svg> 新建会话\\\",\\\"value\\\":\\\"new\\\",\\\"onClick\\\":\\\"method.setVal(''); method.clearData();\\\"}";
|
|
35
|
+
|
|
36
|
+
const badJson3 = "{\"label\":\"<svg width='16' height='16' viewBox='0 0 24 24'><path fill='currentColor' d='M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z'/></svg> 新建会话\",\"value\":\"new\",\"onClick\":\"method.setVal(''); method.clearData();\"}";
|
|
37
|
+
|
|
38
|
+
const badJson4 = "[{\"label\":\"<svg fill='currentColor' width='12' height='12' viewBox='0 0 24 24'><path d='M20.5 9a3.49 3.49 0 0 0-3.45 3h-1.1a2.49 2.49 0 0 0-4.396-1.052L8.878 9.731l3.143-4.225a2.458 2.458 0 0 0 2.98-.019L17.339 8H16v1h3V6h-1v1.243l-2.336-2.512A2.473 2.473 0 0 0 16 3.5a2.5 2.5 0 0 0-5 0 2.474 2.474 0 0 0 .343 1.243L7.947 9.308 4.955 7.947a2.404 2.404 0 0 0-.161-1.438l3.704-1.385-.44 1.371.942.333L10 4 7.172 3l-.334.943 1.01.357-3.659 1.368a2.498 2.498 0 1 0-.682 4.117l2.085 2.688-2.053 2.76a2.5 2.5 0 1 0 .87 3.864l3.484 1.587-1.055.373.334.943L10 21l-1-2.828-.943.333.435 1.354-3.608-1.645A2.471 2.471 0 0 0 5 17.5a2.5 2.5 0 0 0-.058-.527l3.053-1.405 3.476 4.48a2.498 2.498 0 1 0 4.113.075L18 17.707V19h1v-3h-3v1h1.293l-2.416 2.416a2.466 2.466 0 0 0-2.667-.047l-3.283-4.23 2.554-1.176A2.494 2.494 0 0 0 15.95 13h1.1a3.493 3.493 0 1 0 3.45-4zm-7-7A1.5 1.5 0 1 1 12 3.5 1.502 1.502 0 0 1 13.5 2zm0 18a1.5 1.5 0 1 1-1.5 1.5 1.502 1.502 0 0 1 1.5-1.5zM1 7.5a1.5 1.5 0 1 1 2.457 1.145l-.144.112A1.496 1.496 0 0 1 1 7.5zm3.32 1.703a2.507 2.507 0 0 0 .264-.326l2.752 1.251-1.124 1.512zM2.5 19A1.5 1.5 0 1 1 4 17.5 1.502 1.502 0 0 1 2.5 19zm2.037-2.941a2.518 2.518 0 0 0-.193-.234l1.885-2.532 1.136 1.464zm3.76-1.731L6.849 12.46l1.42-1.908L11.1 11.84a2.29 2.29 0 0 0-.033 1.213zM13.5 14a1.5 1.5 0 1 1 1.5-1.5 1.502 1.502 0 0 1-1.5 1.5zm7 1a2.5 2.5 0 1 1 2.5-2.5 2.502 2.502 0 0 1-2.5 2.5zm1.5-2.5a1.5 1.5 0 1 1-1.5-1.5 1.502 1.502 0 0 1 1.5 1.5z'/><path fill='none' d='M0 0h24v24H0z'/></svg> 深度思考\",\"value\":\"brief\",\"onClick\":\"if(isActive){method.executeCustomMethod('changeModel', true)}else{method.executeCustomMethod('changeModel', false)}\"},{\"label\":\"<svg fill='currentColor' width='12' height='12' viewBox='0 0 24 24'><path d='M19 2H5c-1.103 0-2 .897-2 2v12c0 1.103.897 2 2 2h3.586L12 21.414 15.414 18H19c1.103 0 2-.897 2-2V4c0-1.103-.897-2-2-2zm0 14h-4.414L12 18.586 9.414 16H5V4h14v12z'/></svg> 精简回答\",\"value\":\"brief\",\"onClick\":\"if(isActive){method.setContextData({systemPrompt:'请精简回答,字数控制在150个字左右, 思考过程请简洁简短',mergedText:method.getContextData().mergedText,analyzeMetrics:method.getContextData().analyzeMetrics});}else{method.setContextData({mergedText:method.getContextData().mergedText,analyzeMetrics:method.getContextData().analyzeMetrics});}\"},{\"label\":\"<svg fill='none' width='12' height='12' viewBox='0 0 16 16'><path d='M7 0.0618896V9H15.9381C15.446 12.9463 12.0796 16 8 16C3.58172 16 0 12.4183 0 8C0 3.92038 3.05369 0.553988 7 0.0618896Z' fill='currentColor'/><path d='M9 0.0618897V7H15.9381C15.4869 3.38128 12.6187 0.513137 9 0.0618897Z' fill='currentColor'/></svg> 指标分析\",\"value\":\"lab\",\"onClick\":\"return method.executeCustomMethod('getLibList')\",\"isSelect\":true,\"dynamicOptions\":true}]";
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
// ❌ Invalid JSON with missing } or ]
|
|
42
|
+
const errorJson001 = "{'model':'qwen-plus','base_url':'https://dashscope.aliyuncs.com/compatible-mode/v1/','api_key':'sk-0989fb9baab8450682af4d000f5b7cba','message':'{message}','stream':'true','chatId': '{chatId}', 'token': '{token}'";
|
|
43
|
+
|
|
44
|
+
const errorJson002 = "[{'model':'qwen-plus','base_url':'https://dashscope.aliyuncs.com/compatible-mode/v1/','api_key':'sk-0989fb9baab8450682af4d000f5b7cba','message':'{message}','stream':'true','chatId': '{chatId}', 'token': '{token}'}";
|
|
45
|
+
|
|
46
|
+
// ❌ Invalid JSON with missing quotes
|
|
47
|
+
const errorJson003 = "{'model':'qwen-plus','base_url':'https://dashscope.aliyuncs.com/compatible-mode/v1/','api_key':'sk-0989fb9baab8450682af4d000f5b7cba','message':'{message}','stream':'true','chatId': {chatId}', 'token': '{token}'}";
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
console.log('okJson =>', fixAndParseJSON(okJson)); // Can parse normally success = true
|
|
52
|
+
console.log('okJson =>', fixAndParseJSON(okJson2)); // Can parse normally success = true
|
|
53
|
+
console.log('badJson =>', fixAndParseJSON(badJson)); // Can parse after fixing success = true
|
|
54
|
+
console.log('badJson =>', fixAndParseJSON(badJson2)); // Can parse after fixing success = true
|
|
55
|
+
console.log('badJson =>', fixAndParseJSON(badJson3)); // Can parse after fixing success = true
|
|
56
|
+
console.log('badJson =>', fixAndParseJSON(badJson4)); // Can parse after fixing success = true
|
|
57
|
+
console.log('errorJson =>', fixAndParseJSON(errorJson001)); // {success: false, error: 'Invalid JSON format', details: 'Invalid object: mismatched braces'}
|
|
58
|
+
console.log('errorJson =>', fixAndParseJSON(errorJson002)); // {success: false, error: 'Invalid JSON format', details: "Expected property name or '}' in JSON at position 2 (line 1 column 3)"}
|
|
59
|
+
console.log('errorJson =>', fixAndParseJSON(errorJson003)); // {success: false, error: 'Invalid JSON format', details: 'Invalid object: mismatched braces'}
|
|
60
|
+
|
|
61
|
+
*/
|
|
62
|
+
|
|
63
|
+
// Type definitions
|
|
64
|
+
interface ParseResult {
|
|
65
|
+
success: boolean;
|
|
66
|
+
data?: any;
|
|
67
|
+
error?: string;
|
|
68
|
+
details?: string;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function fixAndParseJSON(input: string): ParseResult {
|
|
72
|
+
const MAX_DEPTH = 6;
|
|
73
|
+
|
|
74
|
+
// 1. Quick attempt
|
|
75
|
+
try {
|
|
76
|
+
return { success: true, data: JSON.parse(input) };
|
|
77
|
+
} catch (e) {
|
|
78
|
+
// Continue with fixing
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// 2. Simple unescaping of escaped \" (common case from pasted JS literals)
|
|
82
|
+
let s = input;
|
|
83
|
+
if (s.includes('\\"')) s = s.replace(/\\"/g, '"');
|
|
84
|
+
s = s.trim();
|
|
85
|
+
|
|
86
|
+
try {
|
|
87
|
+
if (s.startsWith('{')) {
|
|
88
|
+
s = processTopObject(s, 0, MAX_DEPTH);
|
|
89
|
+
} else if (s.startsWith('[')) {
|
|
90
|
+
s = processTopArray(s, 0, MAX_DEPTH);
|
|
91
|
+
} else {
|
|
92
|
+
throw new Error('Input is not an object or array');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return { success: true, data: JSON.parse(s) };
|
|
96
|
+
} catch (err) {
|
|
97
|
+
const error = err instanceof Error ? err : new Error('Unknown error');
|
|
98
|
+
return { success: false, error: 'Invalid JSON format', details: error.message };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* ---------- Helper (Recursive) Functions ---------- */
|
|
103
|
+
|
|
104
|
+
function processTopObject(str: string, depth: number, MAX_DEPTH: number): string {
|
|
105
|
+
if (depth > MAX_DEPTH) return str;
|
|
106
|
+
str = str.trim();
|
|
107
|
+
|
|
108
|
+
// First check if braces match
|
|
109
|
+
let braceCount = 0;
|
|
110
|
+
let inString = false;
|
|
111
|
+
let escapeNext = false;
|
|
112
|
+
|
|
113
|
+
for (let i = 0; i < str.length; i++) {
|
|
114
|
+
const ch = str[i];
|
|
115
|
+
|
|
116
|
+
if (escapeNext) {
|
|
117
|
+
escapeNext = false;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (ch === '\\') {
|
|
122
|
+
escapeNext = true;
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if ((ch === '"' || ch === "'") && !escapeNext) {
|
|
127
|
+
inString = !inString;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (!inString) {
|
|
132
|
+
if (ch === '{') braceCount++;
|
|
133
|
+
else if (ch === '}') braceCount--;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (braceCount !== 0) {
|
|
138
|
+
throw new Error('Invalid object: mismatched braces');
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Ensure both ends are { ... }
|
|
142
|
+
if (!(str.startsWith('{') && str.endsWith('}'))) {
|
|
143
|
+
const f = str.indexOf('{'), l = str.lastIndexOf('}');
|
|
144
|
+
if (f === -1 || l === -1 || l <= f) {
|
|
145
|
+
throw new Error('Invalid object format: missing or mismatched braces');
|
|
146
|
+
}
|
|
147
|
+
str = str.slice(f, l + 1);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const inner = str.slice(1, -1);
|
|
151
|
+
const pairs = splitTopLevel(inner);
|
|
152
|
+
|
|
153
|
+
const repairedPairs = pairs.map(pair => {
|
|
154
|
+
if (!pair || pair.trim() === '') return '';
|
|
155
|
+
const idx = findTopLevelColon(pair);
|
|
156
|
+
if (idx === -1) {
|
|
157
|
+
return pair; // Non key:value fragment, keep as is (rare case)
|
|
158
|
+
}
|
|
159
|
+
const rawKey = pair.slice(0, idx).trim();
|
|
160
|
+
const rawVal = pair.slice(idx + 1);
|
|
161
|
+
|
|
162
|
+
const keyContent = extractKeyContent(rawKey);
|
|
163
|
+
const keyJson = JSON.stringify(keyContent);
|
|
164
|
+
|
|
165
|
+
const repairedValue = repairPossiblyQuotedValue(rawVal, depth + 1, MAX_DEPTH);
|
|
166
|
+
|
|
167
|
+
return keyJson + ':' + repairedValue;
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
return '{' + repairedPairs.join(',') + '}';
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function processTopArray(str: string, depth: number, MAX_DEPTH: number): string {
|
|
174
|
+
if (depth > MAX_DEPTH) return str;
|
|
175
|
+
str = str.trim();
|
|
176
|
+
if (!(str.startsWith('[') && str.endsWith(']'))) {
|
|
177
|
+
const f = str.indexOf('['), l = str.lastIndexOf(']');
|
|
178
|
+
if (f === -1 || l === -1 || l <= f) return str;
|
|
179
|
+
str = str.slice(f, l + 1);
|
|
180
|
+
}
|
|
181
|
+
const inner = str.slice(1, -1);
|
|
182
|
+
const elements = splitTopLevel(inner);
|
|
183
|
+
|
|
184
|
+
const processed = elements.map(el => {
|
|
185
|
+
const t = el.trim();
|
|
186
|
+
if (t === '') return '';
|
|
187
|
+
if (t.startsWith('{')) return processTopObject(t, depth + 1, MAX_DEPTH);
|
|
188
|
+
if (t.startsWith('[')) return processTopArray(t, depth + 1, MAX_DEPTH);
|
|
189
|
+
return repairPossiblyQuotedValue(t, depth + 1, MAX_DEPTH);
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
return '[' + processed.join(',') + ']';
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// If it's a string wrapped in quotes, extract the inner content and JSON.stringify (safe escaping)
|
|
196
|
+
// If it's an object/array literal (not wrapped in quotes), recursively process (treat as new outermost layer)
|
|
197
|
+
// Otherwise return the original fragment directly (numbers/true/false/null or JS expressions)
|
|
198
|
+
function repairPossiblyQuotedValue(rawVal: string, depth: number, MAX_DEPTH: number): string {
|
|
199
|
+
const v = rawVal.trim();
|
|
200
|
+
if (v === '') return v;
|
|
201
|
+
|
|
202
|
+
if (v[0] === '"' || v[0] === "'") {
|
|
203
|
+
const quote = v[0];
|
|
204
|
+
// Find the last unescaped same quote
|
|
205
|
+
let lastPos = -1;
|
|
206
|
+
for (let i = v.length - 1; i >= 0; i--) {
|
|
207
|
+
if (v[i] === quote) {
|
|
208
|
+
// check escaped
|
|
209
|
+
let bs = 0, k = i - 1;
|
|
210
|
+
while (k >= 0 && v[k] === '\\') { bs++; k--; }
|
|
211
|
+
if (bs % 2 === 0) { lastPos = i; break; }
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
const inner = lastPos > 0 ? v.slice(1, lastPos) : v.slice(1);
|
|
215
|
+
return JSON.stringify(inner); // Use JSON.stringify to generate valid JSON string (automatically escape internal quotes, etc.)
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// If it's an object or array literal (not wrapped in quotes) -> recursively treat as new outermost layer
|
|
219
|
+
if (v.startsWith('{')) {
|
|
220
|
+
return processTopObject(v, depth, MAX_DEPTH);
|
|
221
|
+
}
|
|
222
|
+
if (v.startsWith('[')) {
|
|
223
|
+
return processTopArray(v, depth, MAX_DEPTH);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// Others (numbers, boolean, null, or JS expressions): return as-is
|
|
227
|
+
return v;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/* --------- Utilities: Split by top-level commas, find top-level colon, extract key --------- */
|
|
231
|
+
|
|
232
|
+
// Split by top-level commas (ignore strings, sub-objects, sub-arrays, commas inside parentheses)
|
|
233
|
+
function splitTopLevel(str: string): string[] {
|
|
234
|
+
const parts: string[] = [];
|
|
235
|
+
let buf = '';
|
|
236
|
+
let depthCurly = 0, depthSquare = 0, depthParen = 0;
|
|
237
|
+
let inSingle = false, inDouble = false, esc = false;
|
|
238
|
+
|
|
239
|
+
for (let i = 0; i < str.length; i++) {
|
|
240
|
+
const ch = str[i];
|
|
241
|
+
|
|
242
|
+
if (esc) {
|
|
243
|
+
buf += ch;
|
|
244
|
+
esc = false;
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
if (ch === '\\') {
|
|
248
|
+
buf += ch;
|
|
249
|
+
esc = true;
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if (ch === "'" && !inDouble) { inSingle = !inSingle; buf += ch; continue; }
|
|
254
|
+
if (ch === '"' && !inSingle) { inDouble = !inDouble; buf += ch; continue; }
|
|
255
|
+
|
|
256
|
+
if (!inSingle && !inDouble) {
|
|
257
|
+
if (ch === '{') { depthCurly++; buf += ch; continue; }
|
|
258
|
+
if (ch === '}') { depthCurly--; buf += ch; continue; }
|
|
259
|
+
if (ch === '[') { depthSquare++; buf += ch; continue; }
|
|
260
|
+
if (ch === ']') { depthSquare--; buf += ch; continue; }
|
|
261
|
+
if (ch === '(') { depthParen++; buf += ch; continue; }
|
|
262
|
+
if (ch === ')') { depthParen--; buf += ch; continue; }
|
|
263
|
+
|
|
264
|
+
if (ch === ',' && depthCurly === 0 && depthSquare === 0 && depthParen === 0) {
|
|
265
|
+
parts.push(buf);
|
|
266
|
+
buf = '';
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
buf += ch;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// Check for unclosed brackets or quotes
|
|
275
|
+
if (depthCurly !== 0 || depthSquare !== 0 || depthParen !== 0 || inSingle || inDouble) {
|
|
276
|
+
throw new Error('Invalid JSON: unclosed brackets or quotes');
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
if (buf.trim() !== '') parts.push(buf);
|
|
280
|
+
return parts;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Find the first "top-level" colon index (ignore inside strings & sub-levels)
|
|
284
|
+
function findTopLevelColon(str: string): number {
|
|
285
|
+
let inSingle = false, inDouble = false, esc = false;
|
|
286
|
+
let depthCurly = 0, depthSquare = 0, depthParen = 0;
|
|
287
|
+
for (let i = 0; i < str.length; i++) {
|
|
288
|
+
const ch = str[i];
|
|
289
|
+
if (esc) { esc = false; continue; }
|
|
290
|
+
if (ch === '\\') { esc = true; continue; }
|
|
291
|
+
if (ch === "'" && !inDouble) { inSingle = !inSingle; continue; }
|
|
292
|
+
if (ch === '"' && !inSingle) { inDouble = !inDouble; continue; }
|
|
293
|
+
|
|
294
|
+
if (!inSingle && !inDouble) {
|
|
295
|
+
if (ch === '{') { depthCurly++; continue; }
|
|
296
|
+
if (ch === '}') { depthCurly--; continue; }
|
|
297
|
+
if (ch === '[') { depthSquare++; continue; }
|
|
298
|
+
if (ch === ']') { depthSquare--; continue; }
|
|
299
|
+
if (ch === '(') { depthParen++; continue; }
|
|
300
|
+
if (ch === ')') { depthParen--; continue; }
|
|
301
|
+
|
|
302
|
+
if (ch === ':' && depthCurly === 0 && depthSquare === 0 && depthParen === 0) {
|
|
303
|
+
return i;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return -1;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// Extract key content (supports "key", 'key', key), returns pure key string
|
|
311
|
+
function extractKeyContent(rawKey: string): string {
|
|
312
|
+
const r = rawKey.trim();
|
|
313
|
+
if ((r.startsWith('"') && r.endsWith('"')) || (r.startsWith("'") && r.endsWith("'"))) {
|
|
314
|
+
const inner = r.slice(1, -1).replace(/\\"/g, '"').replace(/\\'/g, "'");
|
|
315
|
+
return inner;
|
|
316
|
+
}
|
|
317
|
+
return r;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Determine whether it is in JSON format
|
|
323
|
+
* @private
|
|
324
|
+
*/
|
|
325
|
+
function isJSON(input: any): boolean {
|
|
326
|
+
if (typeof (input) === 'string' && input.length > 0) {
|
|
327
|
+
return fixAndParseJSON(input).success;
|
|
328
|
+
} else {
|
|
329
|
+
if (
|
|
330
|
+
typeof (input) === 'object' &&
|
|
331
|
+
Object.prototype.toString.call(input) === '[object Object]' &&
|
|
332
|
+
!(input as any).length
|
|
333
|
+
) {
|
|
334
|
+
return true;
|
|
335
|
+
} else {
|
|
336
|
+
return false;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Check if a string is a valid number
|
|
345
|
+
* @param str - The string to check
|
|
346
|
+
* @returns boolean indicating if the string is a valid number
|
|
347
|
+
*/
|
|
348
|
+
function isValidNumeric(str: unknown): boolean {
|
|
349
|
+
if (typeof str !== "string") return false; // we only process strings!
|
|
350
|
+
if (
|
|
351
|
+
!isNaN(Number(str)) && // use type coercion to parse the _entirety_ of the string
|
|
352
|
+
!isNaN(parseFloat(str)) // ensure strings of whitespace fail
|
|
353
|
+
) {
|
|
354
|
+
return true;
|
|
355
|
+
}
|
|
356
|
+
return false;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Check if input is empty
|
|
362
|
+
* @param input - The input to check (string or array of strings)
|
|
363
|
+
* @returns boolean indicating if the input is empty
|
|
364
|
+
*/
|
|
365
|
+
function isEmpty(input: string | string[]): boolean {
|
|
366
|
+
if (Array.isArray(input)) {
|
|
367
|
+
return input.some((str) => !str.replace(/\s/g, '').length === true);
|
|
368
|
+
}
|
|
369
|
+
return !input.replace(/\s/g, '').length === true;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Check if input is a valid number
|
|
374
|
+
* @param input - The input to check
|
|
375
|
+
* @returns boolean indicating if the input is a valid number
|
|
376
|
+
*/
|
|
377
|
+
function isNumber(input: string): boolean {
|
|
378
|
+
const reg = /^[\d|\.|,]+$/;
|
|
379
|
+
return reg.test(input);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Check if input is a valid integer
|
|
384
|
+
* @param input - The input to check
|
|
385
|
+
* @returns boolean indicating if the input is a valid integer
|
|
386
|
+
*/
|
|
387
|
+
function isInt(input: string): boolean {
|
|
388
|
+
if (input === "") {
|
|
389
|
+
return false;
|
|
390
|
+
}
|
|
391
|
+
const reg = /\D+/;
|
|
392
|
+
return !reg.test(input);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* Check if input is a valid email address
|
|
397
|
+
* @param input - The input to check
|
|
398
|
+
* @returns boolean indicating if the input is a valid email
|
|
399
|
+
*/
|
|
400
|
+
function isEmail(input: string): boolean {
|
|
401
|
+
const reg = /^\s*([A-Za-z0-9_-]+(\.\w+)*@(\w+\.)+\w{2,3})\s*$/;
|
|
402
|
+
return reg.test(input);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* Check if input is a valid telephone number
|
|
407
|
+
* @param input - The input to check
|
|
408
|
+
* @returns boolean indicating if the input is a valid telephone number
|
|
409
|
+
*/
|
|
410
|
+
function isTel(input: string): boolean {
|
|
411
|
+
const reg = /^[0-9- ]{7,20}$/;
|
|
412
|
+
return reg.test(input);
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Check if input is a valid mobile number
|
|
417
|
+
* @param input - The input to check
|
|
418
|
+
* @returns boolean indicating if the input is a valid mobile number
|
|
419
|
+
*/
|
|
420
|
+
function isMobile(input: string): boolean {
|
|
421
|
+
const reg = /^1[0-9]{10}$/;
|
|
422
|
+
return reg.test(input);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
export {
|
|
426
|
+
isValidNumeric,
|
|
427
|
+
isJSON,
|
|
428
|
+
isEmpty,
|
|
429
|
+
isNumber,
|
|
430
|
+
isInt,
|
|
431
|
+
isEmail,
|
|
432
|
+
isTel,
|
|
433
|
+
isMobile
|
|
434
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if an element is in the viewport
|
|
3
|
+
* @param {HTMLElement} elem
|
|
4
|
+
* @returns {Boolean}
|
|
5
|
+
*/
|
|
6
|
+
function isInViewport(elem: HTMLElement) {
|
|
7
|
+
const bounding = elem.getBoundingClientRect();
|
|
8
|
+
return (
|
|
9
|
+
bounding.top >= 0 &&
|
|
10
|
+
bounding.left >= 0 &&
|
|
11
|
+
bounding.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
|
|
12
|
+
bounding.right <= (window.innerWidth || document.documentElement.clientWidth)
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
export {
|
|
18
|
+
isInViewport
|
|
19
|
+
}
|
|
20
|
+
|