@antscorp/antsomi-ui 2.0.89 → 2.0.91-text-editor-beta.1
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/es/assets/css/main.scss +4 -2
- package/es/components/icons/ALignRightIcon.d.ts +3 -0
- package/es/components/icons/ALignRightIcon.js +7 -0
- package/es/components/icons/AlignCenterIcon.d.ts +3 -0
- package/es/components/icons/AlignCenterIcon.js +7 -0
- package/es/components/icons/AlignJustifyIcon.d.ts +3 -0
- package/es/components/icons/AlignJustifyIcon.js +7 -0
- package/es/components/icons/AlignLeftIcon.d.ts +3 -0
- package/es/components/icons/AlignLeftIcon.js +7 -0
- package/es/components/icons/AntsomiAIIcon.d.ts +3 -0
- package/es/components/icons/AntsomiAIIcon.js +7 -0
- package/es/components/icons/ArrowDropDownIcon.d.ts +3 -0
- package/es/components/icons/ArrowDropDownIcon.js +7 -0
- package/es/components/icons/ChevronRightIcon.d.ts +3 -0
- package/es/components/icons/ChevronRightIcon.js +7 -0
- package/es/components/icons/EmotionFeedbackIcon.d.ts +6 -0
- package/es/components/icons/EmotionFeedbackIcon.js +8 -0
- package/es/components/icons/FeedbackRatingIcon.d.ts +3 -0
- package/es/components/icons/FeedbackRatingIcon.js +7 -0
- package/es/components/icons/LazyIcon/LazyIcon.d.ts +17 -0
- package/es/components/icons/LazyIcon/LazyIcon.js +14 -0
- package/es/components/icons/LinkOffIcon.d.ts +3 -0
- package/es/components/icons/LinkOffIcon.js +7 -0
- package/es/components/icons/MinusIcon.d.ts +3 -0
- package/es/components/icons/MinusIcon.js +7 -0
- package/es/components/icons/NoteNewIcon.d.ts +3 -0
- package/es/components/icons/NoteNewIcon.js +7 -0
- package/es/components/icons/SearchNotFoundIcon.d.ts +3 -0
- package/es/components/icons/SearchNotFoundIcon.js +7 -0
- package/es/components/icons/SummarizeIcon.d.ts +3 -0
- package/es/components/icons/SummarizeIcon.js +7 -0
- package/es/components/icons/index.d.ts +14 -0
- package/es/components/icons/index.js +14 -0
- package/es/components/index.scss +2 -0
- package/es/components/molecules/ColorSetting/index.js +2 -11
- package/es/components/molecules/ColorSetting/styled.d.ts +1 -1
- package/es/components/molecules/ColorSetting/styled.js +9 -1
- package/es/components/molecules/EmojiCollections/CommonCollection/index.js +2 -2
- package/es/components/molecules/EmojiCollections/types.d.ts +1 -0
- package/es/components/molecules/EmojiPopover/EmojiPopover.d.ts +1 -0
- package/es/components/molecules/EmojiPopover/EmojiPopover.js +10 -6
- package/es/components/molecules/EmojiPopover/styled.d.ts +2 -2
- package/es/components/molecules/EmojiPopover/styled.js +1 -1
- package/es/components/molecules/FontSizeInput/FontSizeInput.d.ts +3 -0
- package/es/components/molecules/FontSizeInput/FontSizeInput.js +127 -0
- package/es/components/molecules/FontSizeInput/components/FontSizeControl.d.ts +8 -0
- package/es/components/molecules/FontSizeInput/components/FontSizeControl.js +14 -0
- package/es/components/molecules/FontSizeInput/components/FontSizeDropdown.d.ts +20 -0
- package/es/components/molecules/FontSizeInput/components/FontSizeDropdown.js +19 -0
- package/es/components/molecules/FontSizeInput/constants.d.ts +2 -0
- package/es/components/molecules/FontSizeInput/constants.js +5 -0
- package/es/components/molecules/FontSizeInput/index.d.ts +2 -0
- package/es/components/molecules/FontSizeInput/index.js +1 -0
- package/es/components/molecules/FontSizeInput/styled.d.ts +7 -0
- package/es/components/molecules/FontSizeInput/styled.js +36 -0
- package/es/components/molecules/FontSizeInput/styles.scss +15 -0
- package/es/components/molecules/FontSizeInput/types.d.ts +23 -0
- package/es/components/molecules/FontSizeInput/types.js +1 -0
- package/es/components/molecules/FontSizeInput/utils.d.ts +7 -0
- package/es/components/molecules/FontSizeInput/utils.js +9 -0
- package/es/components/molecules/ItemNotFound/ItemNotFound.d.ts +6 -0
- package/es/components/molecules/ItemNotFound/ItemNotFound.js +9 -0
- package/es/components/molecules/ItemNotFound/index.d.ts +1 -0
- package/es/components/molecules/ItemNotFound/index.js +1 -0
- package/es/components/molecules/ItemNotFound/styled.d.ts +4 -0
- package/es/components/molecules/ItemNotFound/styled.js +29 -0
- package/es/components/molecules/MatchAnySelect/MatchesAnySelect.js +23 -7
- package/es/components/molecules/MatchAnySelect/components/ExtendValuePopup.d.ts +1 -0
- package/es/components/molecules/MatchAnySelect/components/ExtendValuePopup.js +7 -2
- package/es/components/molecules/MatchAnySelect/types.d.ts +2 -1
- package/es/components/molecules/MatchAnySelect/utils.d.ts +1 -0
- package/es/components/molecules/MatchAnySelect/utils.js +2 -0
- package/es/components/molecules/QuillEditor/EditorToolbar.js +1 -0
- package/es/components/molecules/QuillEditor/QuillEditor.d.ts +6 -1
- package/es/components/molecules/QuillEditor/QuillEditor.js +90 -55
- package/es/components/molecules/QuillEditor/styled.d.ts +5 -0
- package/es/components/molecules/QuillEditor/styled.js +29 -0
- package/es/components/molecules/VirtualizedMenu/VirtualizedMenu.d.ts +6 -3
- package/es/components/molecules/VirtualizedMenu/__mocks__/index.js +2550 -938
- package/es/components/molecules/VirtualizedMenu/components/Item/Item.d.ts +1 -11
- package/es/components/molecules/VirtualizedMenu/components/Item/Item.js +53 -25
- package/es/components/molecules/VirtualizedMenu/components/MenuInline/MenuInline.d.ts +8 -5
- package/es/components/molecules/VirtualizedMenu/components/MenuInline/MenuInline.js +289 -46
- package/es/components/molecules/VirtualizedMenu/components/MenuInline/index.js +1 -0
- package/es/components/molecules/VirtualizedMenu/styled.d.ts +2 -2
- package/es/components/molecules/VirtualizedMenu/styled.js +23 -4
- package/es/components/molecules/VirtualizedMenu/types.d.ts +27 -10
- package/es/components/molecules/VirtualizedMenu/utils.d.ts +8 -5
- package/es/components/molecules/VirtualizedMenu/utils.js +13 -18
- package/es/components/molecules/index.d.ts +2 -0
- package/es/components/molecules/index.js +2 -0
- package/es/components/molecules/index.scss +1 -0
- package/es/components/organism/ActivityTimeline/ActivityTimeline.js +15 -9
- package/es/components/organism/ActivityTimeline/__mocks__/event_tracking.json +1290 -0
- package/es/components/organism/ActivityTimeline/__mocks__/timeline.json +3059 -0
- package/es/components/organism/ActivityTimeline/components/ItemEvent/ItemEvent.d.ts +3 -4
- package/es/components/organism/ActivityTimeline/components/ItemEvent/ItemEvent.js +4 -3
- package/es/components/organism/ActivityTimeline/components/ItemGroupEvent/ItemGroupEvent.d.ts +4 -6
- package/es/components/organism/ActivityTimeline/components/ItemGroupEvent/ItemGroupEvent.js +4 -4
- package/es/components/organism/ActivityTimeline/components/TimeLineTitle/TimelineTitle.js +1 -1
- package/es/components/organism/ActivityTimeline/types.d.ts +2 -1
- package/es/components/organism/ActivityTimeline/utils.d.ts +1 -1
- package/es/components/organism/ActivityTimeline/utils.js +1 -1
- package/es/components/organism/Help/Help.js +47 -10
- package/es/components/organism/TextEditor/TextEditor.d.ts +3 -0
- package/es/components/organism/TextEditor/TextEditor.js +257 -0
- package/es/components/organism/TextEditor/__mocks__/text-block.settings.json +320 -0
- package/es/components/organism/TextEditor/__mocks__/text-contennt.d.ts +1 -0
- package/es/components/organism/TextEditor/__mocks__/text-contennt.js +38 -0
- package/es/components/organism/TextEditor/constants.d.ts +175 -0
- package/es/components/organism/TextEditor/constants.js +321 -0
- package/es/components/organism/TextEditor/extensions/BackgroundColor.d.ts +25 -0
- package/es/components/organism/TextEditor/extensions/BackgroundColor.js +46 -0
- package/es/components/organism/TextEditor/extensions/BubbleMenu/bubble-menu-plugin.d.ts +130 -0
- package/es/components/organism/TextEditor/extensions/BubbleMenu/bubble-menu-plugin.js +247 -0
- package/es/components/organism/TextEditor/extensions/BubbleMenu/bubble-menu.d.ts +15 -0
- package/es/components/organism/TextEditor/extensions/BubbleMenu/bubble-menu.js +31 -0
- package/es/components/organism/TextEditor/extensions/BubbleMenu/index.d.ts +2 -0
- package/es/components/organism/TextEditor/extensions/BubbleMenu/index.js +2 -0
- package/es/components/organism/TextEditor/extensions/Color.d.ts +6 -0
- package/es/components/organism/TextEditor/extensions/Color.js +34 -0
- package/es/components/organism/TextEditor/extensions/Emoji.d.ts +57 -0
- package/es/components/organism/TextEditor/extensions/Emoji.js +184 -0
- package/es/components/organism/TextEditor/extensions/FontFamily.d.ts +6 -0
- package/es/components/organism/TextEditor/extensions/FontFamily.js +36 -0
- package/es/components/organism/TextEditor/extensions/FontSize.d.ts +32 -0
- package/es/components/organism/TextEditor/extensions/FontSize.js +47 -0
- package/es/components/organism/TextEditor/extensions/FontWeight.d.ts +23 -0
- package/es/components/organism/TextEditor/extensions/FontWeight.js +41 -0
- package/es/components/organism/TextEditor/extensions/Highlight.d.ts +1 -0
- package/es/components/organism/TextEditor/extensions/Highlight.js +14 -0
- package/es/components/organism/TextEditor/extensions/Indent.d.ts +21 -0
- package/es/components/organism/TextEditor/extensions/Indent.js +63 -0
- package/es/components/organism/TextEditor/extensions/LetterSpacing.d.ts +32 -0
- package/es/components/organism/TextEditor/extensions/LetterSpacing.js +48 -0
- package/es/components/organism/TextEditor/extensions/LineHeight.d.ts +20 -0
- package/es/components/organism/TextEditor/extensions/LineHeight.js +36 -0
- package/es/components/organism/TextEditor/extensions/Link.d.ts +16 -0
- package/es/components/organism/TextEditor/extensions/Link.js +48 -0
- package/es/components/organism/TextEditor/extensions/ListItemMarker.d.ts +13 -0
- package/es/components/organism/TextEditor/extensions/ListItemMarker.js +174 -0
- package/es/components/organism/TextEditor/extensions/OrderedList.d.ts +56 -0
- package/es/components/organism/TextEditor/extensions/OrderedList.js +187 -0
- package/es/components/organism/TextEditor/extensions/SmartTag.d.ts +39 -0
- package/es/components/organism/TextEditor/extensions/SmartTag.js +167 -0
- package/es/components/organism/TextEditor/extensions/StyleMemory.d.ts +36 -0
- package/es/components/organism/TextEditor/extensions/StyleMemory.js +163 -0
- package/es/components/organism/TextEditor/extensions/TextTransform.d.ts +31 -0
- package/es/components/organism/TextEditor/extensions/TextTransform.js +37 -0
- package/es/components/organism/TextEditor/extensions/UnorderedList.d.ts +55 -0
- package/es/components/organism/TextEditor/extensions/UnorderedList.js +176 -0
- package/es/components/organism/TextEditor/hooks/index.d.ts +7 -0
- package/es/components/organism/TextEditor/hooks/index.js +7 -0
- package/es/components/organism/TextEditor/hooks/useColorSet.d.ts +4 -0
- package/es/components/organism/TextEditor/hooks/useColorSet.js +22 -0
- package/es/components/organism/TextEditor/hooks/useDocumentState.d.ts +18 -0
- package/es/components/organism/TextEditor/hooks/useDocumentState.js +42 -0
- package/es/components/organism/TextEditor/hooks/useLinkHandler.d.ts +11 -0
- package/es/components/organism/TextEditor/hooks/useLinkHandler.js +125 -0
- package/es/components/organism/TextEditor/hooks/useMarkTracking.d.ts +26 -0
- package/es/components/organism/TextEditor/hooks/useMarkTracking.js +68 -0
- package/es/components/organism/TextEditor/hooks/usePersistence.d.ts +31 -0
- package/es/components/organism/TextEditor/hooks/usePersistence.js +169 -0
- package/es/components/organism/TextEditor/hooks/useStyleMemory.d.ts +6 -0
- package/es/components/organism/TextEditor/hooks/useStyleMemory.js +42 -0
- package/es/components/organism/TextEditor/hooks/useStylePresets.d.ts +34 -0
- package/es/components/organism/TextEditor/hooks/useStylePresets.js +83 -0
- package/es/components/organism/TextEditor/index.d.ts +14 -0
- package/es/components/organism/TextEditor/index.js +6 -0
- package/es/components/organism/TextEditor/index.scss +61 -0
- package/es/components/organism/TextEditor/provider.d.ts +15 -0
- package/es/components/organism/TextEditor/provider.js +33 -0
- package/es/components/organism/TextEditor/store.d.ts +13 -0
- package/es/components/organism/TextEditor/store.js +20 -0
- package/es/components/organism/TextEditor/styled.d.ts +10 -0
- package/es/components/organism/TextEditor/styled.js +94 -0
- package/es/components/organism/TextEditor/types.d.ts +96 -0
- package/es/components/organism/TextEditor/types.js +3 -0
- package/es/components/organism/TextEditor/ui/BubbleMenu/BubbleMenu.d.ts +6 -0
- package/es/components/organism/TextEditor/ui/BubbleMenu/BubbleMenu.js +85 -0
- package/es/components/organism/TextEditor/ui/BubbleMenu/index.d.ts +1 -0
- package/es/components/organism/TextEditor/ui/BubbleMenu/index.js +1 -0
- package/es/components/organism/TextEditor/ui/BubbleToolbar/BubbleToolbar.d.ts +1 -0
- package/es/components/organism/TextEditor/ui/BubbleToolbar/BubbleToolbar.js +1 -0
- package/es/components/organism/TextEditor/ui/BubbleToolbar/index.d.ts +0 -0
- package/es/components/organism/TextEditor/ui/BubbleToolbar/index.js +1 -0
- package/es/components/organism/TextEditor/ui/Button/Button.d.ts +2 -0
- package/es/components/organism/TextEditor/ui/Button/Button.js +31 -0
- package/es/components/organism/TextEditor/ui/Button/index.d.ts +2 -0
- package/es/components/organism/TextEditor/ui/Button/index.js +1 -0
- package/es/components/organism/TextEditor/ui/Button/types.d.ts +10 -0
- package/es/components/organism/TextEditor/ui/Button/types.js +1 -0
- package/es/components/organism/TextEditor/ui/ColorPicker/ColorPicker.d.ts +39 -0
- package/es/components/organism/TextEditor/ui/ColorPicker/ColorPicker.js +131 -0
- package/es/components/organism/TextEditor/ui/ColorPicker/index.d.ts +1 -0
- package/es/components/organism/TextEditor/ui/ColorPicker/index.js +1 -0
- package/es/components/organism/TextEditor/ui/DropdownButton/DropdownButton.d.ts +17 -0
- package/es/components/organism/TextEditor/ui/DropdownButton/DropdownButton.js +51 -0
- package/es/components/organism/TextEditor/ui/DropdownButton/index.d.ts +1 -0
- package/es/components/organism/TextEditor/ui/DropdownButton/index.js +1 -0
- package/es/components/organism/TextEditor/ui/Emoji/EmojiList.d.ts +11 -0
- package/es/components/organism/TextEditor/ui/Emoji/EmojiList.js +66 -0
- package/es/components/organism/TextEditor/ui/Emoji/index.d.ts +2 -0
- package/es/components/organism/TextEditor/ui/Emoji/index.js +2 -0
- package/es/components/organism/TextEditor/ui/Emoji/suggestion.d.ts +4 -0
- package/es/components/organism/TextEditor/ui/Emoji/suggestion.js +71 -0
- package/es/components/organism/TextEditor/ui/FontPopover/FontPopover.d.ts +12 -0
- package/es/components/organism/TextEditor/ui/FontPopover/FontPopover.js +69 -0
- package/es/components/organism/TextEditor/ui/FontPopover/styled.d.ts +1 -0
- package/es/components/organism/TextEditor/ui/FontPopover/styled.js +22 -0
- package/es/components/organism/TextEditor/ui/Popover/Popover.d.ts +6 -0
- package/es/components/organism/TextEditor/ui/Popover/Popover.js +9 -0
- package/es/components/organism/TextEditor/ui/Popover/index.d.ts +1 -0
- package/es/components/organism/TextEditor/ui/Popover/index.js +1 -0
- package/es/components/organism/TextEditor/ui/Select/Select.d.ts +4 -0
- package/es/components/organism/TextEditor/ui/Select/Select.js +7 -0
- package/es/components/organism/TextEditor/ui/Select/index.d.ts +1 -0
- package/es/components/organism/TextEditor/ui/Select/index.js +1 -0
- package/es/components/organism/TextEditor/ui/SplitButtonDropdown/SplitButtonDropdown.d.ts +2 -0
- package/es/components/organism/TextEditor/ui/SplitButtonDropdown/SplitButtonDropdown.js +44 -0
- package/es/components/organism/TextEditor/ui/SplitButtonDropdown/index.d.ts +1 -0
- package/es/components/organism/TextEditor/ui/SplitButtonDropdown/index.js +1 -0
- package/es/components/organism/TextEditor/ui/SplitButtonDropdown/styled.d.ts +2 -0
- package/es/components/organism/TextEditor/ui/SplitButtonDropdown/styled.js +52 -0
- package/es/components/organism/TextEditor/ui/SplitButtonDropdown/types.d.ts +19 -0
- package/es/components/organism/TextEditor/ui/SplitButtonDropdown/types.js +1 -0
- package/es/components/organism/TextEditor/ui/TextAlignSelect/TextAlignSelect.d.ts +30 -0
- package/es/components/organism/TextEditor/ui/TextAlignSelect/TextAlignSelect.js +77 -0
- package/es/components/organism/TextEditor/ui/TextAlignSelect/index.d.ts +1 -0
- package/es/components/organism/TextEditor/ui/TextAlignSelect/index.js +1 -0
- package/es/components/organism/TextEditor/ui/Toolbar/Toolbar.d.ts +15 -0
- package/es/components/organism/TextEditor/ui/Toolbar/Toolbar.js +41 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/BoldAction.d.ts +5 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/BoldAction.js +18 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/BulletListAction.d.ts +6 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/BulletListAction.js +84 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/ClearFormattingAction.d.ts +5 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/ClearFormattingAction.js +27 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/EmojiAction.d.ts +4 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/EmojiAction.js +31 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/FontFamilyAction.d.ts +7 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/FontFamilyAction.js +28 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/FontSizeAction.d.ts +7 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/FontSizeAction.js +47 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/HistoryAction.d.ts +5 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/HistoryAction.js +21 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/IndentAction.d.ts +5 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/IndentAction.js +17 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/ItalicAction.d.ts +5 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/ItalicAction.js +18 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/LetterSpacing.d.ts +5 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/LetterSpacing.js +28 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/LinkAction.d.ts +6 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/LinkAction.js +17 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/OrderedListAction.d.ts +5 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/OrderedListAction.js +67 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/OutdentAction.d.ts +5 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/OutdentAction.js +17 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/SmartTagAction.d.ts +7 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/SmartTagAction.js +18 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/SpacingAction.d.ts +10 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/SpacingAction.js +45 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/StrikeAction.d.ts +5 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/StrikeAction.js +18 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/SubscriptAction.d.ts +5 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/SubscriptAction.js +26 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/SuperscriptAction.d.ts +5 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/SuperscriptAction.js +26 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/TextAlignAction.d.ts +5 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/TextAlignAction.js +3 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/TextBackgroundColorAction.d.ts +5 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/TextBackgroundColorAction.js +29 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/TextColorAction.d.ts +14 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/TextColorAction.js +22 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/TextTransformAction.d.ts +5 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/TextTransformAction.js +36 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/UnderlineAction.d.ts +5 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/UnderlineAction.js +18 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/UnsetLink.d.ts +6 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/UnsetLink.js +19 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/index.d.ts +19 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/index.js +19 -0
- package/es/components/organism/TextEditor/ui/Toolbar/index.d.ts +1 -0
- package/es/components/organism/TextEditor/ui/Toolbar/index.js +1 -0
- package/es/components/organism/TextEditor/utils/documentState.d.ts +57 -0
- package/es/components/organism/TextEditor/utils/documentState.js +100 -0
- package/es/components/organism/TextEditor/utils/font.d.ts +73 -0
- package/es/components/organism/TextEditor/utils/font.js +160 -0
- package/es/components/organism/TextEditor/utils/htmlProcessing.d.ts +63 -0
- package/es/components/organism/TextEditor/utils/htmlProcessing.js +319 -0
- package/es/components/organism/TextEditor/utils/indent.d.ts +11 -0
- package/es/components/organism/TextEditor/utils/indent.js +56 -0
- package/es/components/organism/TextEditor/utils/index.d.ts +8 -0
- package/es/components/organism/TextEditor/utils/index.js +16 -0
- package/es/components/organism/TextEditor/utils/link.d.ts +100 -0
- package/es/components/organism/TextEditor/utils/link.js +149 -0
- package/es/components/organism/TextEditor/utils/menu.d.ts +134 -0
- package/es/components/organism/TextEditor/utils/menu.js +317 -0
- package/es/components/organism/TextEditor/utils/selection.d.ts +25 -0
- package/es/components/organism/TextEditor/utils/selection.js +57 -0
- package/es/components/organism/TextEditor/utils/shared.d.ts +1 -0
- package/es/components/organism/TextEditor/utils/shared.js +9 -0
- package/es/components/organism/TextEditor/utils/smartTag.d.ts +49 -0
- package/es/components/organism/TextEditor/utils/smartTag.js +89 -0
- package/es/components/organism/TextEditor/utils/style.d.ts +78 -0
- package/es/components/organism/TextEditor/utils/style.js +193 -0
- package/es/components/organism/TicketEditor/Content.js +47 -33
- package/es/components/organism/TicketEditor/components/MessageComponent.js +1 -0
- package/es/components/organism/TicketEditor/index.js +24 -16
- package/es/components/organism/TicketEditor/styled.js +1 -0
- package/es/components/organism/TicketEditorV2/Content.js +41 -7
- package/es/components/organism/TicketEditorV2/components/MessageComponent.js +1 -0
- package/es/components/organism/TicketEditorV2/styled.js +2 -1
- package/es/components/organism/index.d.ts +1 -0
- package/es/components/organism/index.js +1 -0
- package/es/components/organism/index.scss +1 -0
- package/es/hooks/index.d.ts +3 -0
- package/es/hooks/index.js +3 -0
- package/es/hooks/useBroadcastedLocalStorage.d.ts +5 -0
- package/es/hooks/useBroadcastedLocalStorage.js +71 -0
- package/es/hooks/useElementSize.d.ts +7 -0
- package/es/hooks/useElementSize.js +56 -0
- package/es/hooks/useIsMounted.d.ts +1 -0
- package/es/hooks/useIsMounted.js +11 -0
- package/es/locales/en/translation.json +2 -1
- package/es/locales/i18n.d.ts +3 -1
- package/es/locales/vi/translation.json +2 -1
- package/es/utils/common.d.ts +6 -9
- package/es/utils/common.js +44 -23
- package/es/utils/index.d.ts +1 -0
- package/es/utils/index.js +1 -0
- package/es/utils/tree.d.ts +225 -0
- package/es/utils/tree.js +469 -0
- package/es/utils/web.d.ts +15 -0
- package/es/utils/web.js +39 -0
- package/package.json +25 -4
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useEffect, useState } from 'react';
|
|
2
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
3
3
|
import Content from './Content';
|
|
4
4
|
import Service from './Service';
|
|
5
5
|
import TicketIcon from './components/icons/TicketIcon';
|
|
6
6
|
import AddTicketIcon from './components/icons/AddTicketIcon';
|
|
7
|
-
import { Button, Modal, Popover, Typography, DrawerDetail, message, Icon, } from '@antscorp/antsomi-ui/es/components/';
|
|
7
|
+
import { Button, Modal, Popover, Typography, DrawerDetail, message, Icon, ItemNotFound, Spin, } from '@antscorp/antsomi-ui/es/components/';
|
|
8
8
|
import { WrapperModalHeader, TicketButton, TicketEditorWrapper } from './styled';
|
|
9
|
+
import { isEmpty } from 'lodash';
|
|
10
|
+
import { Flex } from 'antd/lib';
|
|
9
11
|
// import Message from './components/Message';
|
|
10
12
|
const defaultProps = {
|
|
11
13
|
isOpen: false,
|
|
@@ -189,14 +191,8 @@ export const TicketEditor = props => {
|
|
|
189
191
|
fetchAccountManage();
|
|
190
192
|
fetchAccountPermission();
|
|
191
193
|
}, []);
|
|
192
|
-
const toggleModal = () => {
|
|
193
|
-
setIsOpenModal(!isOpenModal);
|
|
194
|
-
};
|
|
195
194
|
useEffect(() => {
|
|
196
195
|
setOpenDrawer(isOpen);
|
|
197
|
-
// if (isOpen) {
|
|
198
|
-
// setIsSuccessCreated(false);
|
|
199
|
-
// }
|
|
200
196
|
}, [isOpen]);
|
|
201
197
|
const handleClose = (isCancle, isRulesEdit) => {
|
|
202
198
|
if (isCancle) {
|
|
@@ -223,18 +219,30 @@ export const TicketEditor = props => {
|
|
|
223
219
|
}
|
|
224
220
|
setAnchorEl(null);
|
|
225
221
|
};
|
|
222
|
+
const isExistTicket = useMemo(() => (!isEmpty(ticketDetails) && !isLoadingDetails) || action === 'create', [ticketDetails, isLoadingDetails, action]);
|
|
223
|
+
const renderContent = () => {
|
|
224
|
+
if (isLoadingDetails) {
|
|
225
|
+
return (_jsx(Flex, { style: { height: '100vh' }, align: "center", justify: "center", children: _jsx(Spin, { spinning: true }) }));
|
|
226
|
+
}
|
|
227
|
+
if (!isExistTicket) {
|
|
228
|
+
return _jsx(ItemNotFound, {});
|
|
229
|
+
}
|
|
230
|
+
return (_jsx(Content, { portalId: portalId, token: token, action: action, listUsers: listUsers, domainTicket: domainTicket, domainUpload: domainUpload, config: config, ticketDetails: ticketDetails, listComment: listComment, ticketId: ticketId, userId: userId, fetchgetTicketComments: fetchgetTicketComments, isLoadingComment: isLoadingComment, isLoadingDetails: isLoadingDetails, isLoadingDataSouce: isLoadingDataSouce, handleCloseDrawer: handleCloseDrawer, setIsSuccessCreated: setIsSuccessCreated, accountManage: accountManage, timeZone: timeZone, isLoadingSelectedAccount: isLoadingSelectedAccount, accountEdit: accountEdit, initOwnerId: ownerId, isAllAccount: isAllAccount, openDrawer: openDrawer, dataSelectInput: dataSelectInput, setDataSelectInput: setDataSelectInput }));
|
|
231
|
+
};
|
|
226
232
|
return (_jsxs(TicketEditorWrapper, { children: [!!useIcon && (_jsxs(TicketButton, { onClick: e => (useChat ? setOpenPopover(true) : setOpenDrawer(true)), children: [_jsx(TicketIcon, {}), _jsx(AddTicketIcon, { className: "add-icon" })] })), !!useChat && (_jsx(_Fragment, { children: _jsxs(Popover, { open: isOpenPopover, className: "popoverBody", children: [_jsx(Typography, { className: "popoverItem", onClick: () => handleSelectPopover('DRAWER'), children: "Create ticket" }), _jsx(Typography, { className: "popoverItem", onClick: () => handleSelectPopover('CHAT'), children: "Chat with us" })] }) })), _jsx(DrawerDetail, { open: openDrawer, onClose: () => handleClose(true, false), menuProps: {
|
|
227
|
-
items:
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
233
|
+
items: !isExistTicket
|
|
234
|
+
? []
|
|
235
|
+
: [
|
|
236
|
+
{
|
|
237
|
+
icon: _jsx(Icon, { type: "icon-ants-pencil" }),
|
|
238
|
+
label: 'Settings',
|
|
239
|
+
key: 'settings',
|
|
240
|
+
},
|
|
241
|
+
],
|
|
234
242
|
selectedKeys: ['settings'],
|
|
235
243
|
}, headerProps: {
|
|
236
244
|
showBorderBottom: true,
|
|
237
|
-
}, name: "ticket-editor-drawer", children: openDrawer && (
|
|
245
|
+
}, name: "ticket-editor-drawer", children: openDrawer && renderContent() }), _jsx(Modal, { open: isOpenModal, onCancel: () => setIsOpenModal(false), className: "modal", children: _jsxs("div", { className: "wrapperBody", children: [_jsx(WrapperModalHeader, { children: "Confirm deletion of this ticket" }), _jsx("div", { className: "modalBody", children: _jsx("span", { style: { fontSize: '12px', color: '#000' }, children: "Once you confirm cancel, this ticket will NOT be saved." }) }), _jsxs("div", { className: "modalFooter", children: [_jsx(Button, { style: {
|
|
238
246
|
height: '28px',
|
|
239
247
|
background: '#1f5fac',
|
|
240
248
|
color: '#fff',
|
|
@@ -10,6 +10,7 @@ import Service from './Service';
|
|
|
10
10
|
import { WrapperContent, WrapperContentInput, WrapperEditor, WrapperIconEditor, WrapperInputFile, WrapperLable, WrapperLeftContent, WrapperLinkItemFiles, WrapperMessageContent, WrapperRightContent, WrapperTextEdit, WrapperTextInput, } from './styled';
|
|
11
11
|
import { formatDatarender, handleValidateContent } from './util';
|
|
12
12
|
import { get, keyBy } from 'lodash';
|
|
13
|
+
import { TCallBack } from '../../molecules/QuillEditor/QuillEditor';
|
|
13
14
|
const initValueInput = {
|
|
14
15
|
originTitle: 'Create new ticket',
|
|
15
16
|
title: '',
|
|
@@ -137,7 +138,7 @@ const Content = ({ apiKey, domain, portalId, token, action, ticketId, listUsers,
|
|
|
137
138
|
const handleEditorChange = content => {
|
|
138
139
|
setTextValue(content);
|
|
139
140
|
updateValueInput({ message: content });
|
|
140
|
-
setIsLoadingUpload(content.includes('<img src="data:image/png;base64'));
|
|
141
|
+
// setIsLoadingUpload(content.includes('<img src="data:image/png;base64'));
|
|
141
142
|
};
|
|
142
143
|
const handleUpdateFollowers = arrFolowers => {
|
|
143
144
|
const params = {
|
|
@@ -221,12 +222,17 @@ const Content = ({ apiKey, domain, portalId, token, action, ticketId, listUsers,
|
|
|
221
222
|
};
|
|
222
223
|
}, [isOpenToast]);
|
|
223
224
|
const handleOnchangeFile = e => {
|
|
224
|
-
const
|
|
225
|
-
|
|
225
|
+
const file = e.target?.files[0];
|
|
226
|
+
if (!file)
|
|
227
|
+
return;
|
|
228
|
+
const sizeFile = file.size;
|
|
229
|
+
const fileType = file.type;
|
|
230
|
+
const isImage = fileType.startsWith('image/');
|
|
231
|
+
const limitSize = isImage ? 10 * 1024 * 1024 : 50 * 1024 * 1024;
|
|
226
232
|
if (sizeFile >= limitSize) {
|
|
227
233
|
setErrFile({
|
|
228
234
|
isError: true,
|
|
229
|
-
message:
|
|
235
|
+
message: `Maximum file size is reached (10MB for image & 50MB for other types).`,
|
|
230
236
|
});
|
|
231
237
|
}
|
|
232
238
|
else {
|
|
@@ -267,15 +273,43 @@ const Content = ({ apiKey, domain, portalId, token, action, ticketId, listUsers,
|
|
|
267
273
|
? '--'
|
|
268
274
|
: dataSelectOptions[ticketDetails[info?.value]]?.name }) })] }, info.id));
|
|
269
275
|
};
|
|
276
|
+
const callbackEditor = (type, value) => {
|
|
277
|
+
switch (type) {
|
|
278
|
+
case TCallBack.LOADING_UPLOAD:
|
|
279
|
+
setIsLoadingUpload(value);
|
|
280
|
+
break;
|
|
281
|
+
case TCallBack.ERROR: {
|
|
282
|
+
switch (value) {
|
|
283
|
+
case 'FILE_TOO_LARGE':
|
|
284
|
+
setErrFile({
|
|
285
|
+
isError: true,
|
|
286
|
+
message: '*Maximum upload file size: 10MB',
|
|
287
|
+
});
|
|
288
|
+
break;
|
|
289
|
+
case 'RESET':
|
|
290
|
+
setErrFile({
|
|
291
|
+
isError: false,
|
|
292
|
+
message: '',
|
|
293
|
+
});
|
|
294
|
+
break;
|
|
295
|
+
default:
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
break;
|
|
299
|
+
}
|
|
300
|
+
default:
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
};
|
|
270
304
|
return (_jsxs("div", { style: { height: '100%' }, children: [_jsxs(Helmet, { children: [_jsx("meta", { charSet: "utf-8" }), _jsx("title", { children: browserTitle })] }), _jsx(Spin, { style: { height: '100vh' }, spinning: isLoading || isLoadingDetails || isLoadingDataSouce || isLoadingFollower, children: _jsxs(WrapperContent, { style: { height: '100%' }, children: [_jsxs(WrapperLeftContent, { children: [_jsxs(WrapperContentInput, { style: { alignItems: 'flex-start' }, children: [_jsxs(WrapperLable, { children: ["Owner", _jsx("span", { style: { color: '#ff0000' }, children: "*" })] }), _jsx("div", { children: ownerEmail })] }), _jsxs(WrapperContentInput, { style: { marginTop: '15px', alignItems: 'flex-start' }, children: [_jsx(WrapperLable, { children: "Follower(s)" }), _jsx(SelectAccount, { type: "default", initData: ticketDetails?.followers || [], nameKey: "userName", userIdKey: "userId", users: listUsers, onChange: (_, followers) => onChangeFollowers(followers) })] }), dataSelects?.map((data) => _jsx(_Fragment, { children: renderOptions(data) })), _jsxs(WrapperContentInput, { style: { marginTop: '15px' }, children: [_jsx(WrapperLable, { htmlFor: "referenceUrl", children: "Reference URL" }), isUpdate ? (ticketDetails.referenceUrl ? (_jsx(Tooltip, { title: ticketDetails.referenceUrl, placement: "top", children: _jsx(WrapperTextEdit, { color: "#005fb8", href: ticketDetails.referenceUrl, target: "_blank", children: ticketDetails.referenceUrl }) })) : (_jsx(WrapperTextEdit, { color: "#005fb8", href: ticketDetails.referenceUrl, target: "_blank", children: ticketDetails.referenceUrl }))) : (_jsx(WrapperTextInput, { placeholder: "Reference URL", id: "referenceUrl",
|
|
271
305
|
// width="300px"
|
|
272
|
-
onChange: handleOnchangeInput, name: "referenceUrl", value: valueInput.referenceUrl }))] })] }), _jsxs(WrapperRightContent, { children: [_jsxs(WrapperEditor, { children: [_jsxs(
|
|
306
|
+
onChange: handleOnchangeInput, name: "referenceUrl", value: valueInput.referenceUrl }))] })] }), _jsxs(WrapperRightContent, { children: [_jsxs(WrapperEditor, { children: [_jsxs(_Fragment, { children: [_jsx(QuillEditor, { value: textValue, uploadService: Service.tickets.callApi.uploadFile({
|
|
273
307
|
domain: domainUpload,
|
|
274
|
-
}), onChange: handleEditorChange, placeholder: "Enter your comment...", height: 195 }), _jsxs("div", { children: [valueInput.files?.length > 0 && (_jsx(WrapperLinkItemFiles, { children: valueInput.files?.map((file, index) => (_jsxs("div", { className: "file-item", children: [_jsxs("div", { className: "file-name-group", children: [_jsx(Icon, { className: "file-icon", type: "icon-ants-attachment" }), _jsx(Tooltip, { title: file?.file_name, children: _jsx("span", { className: "file-name", children: file?.file_name }) })] }), _jsx(Icon, { onClick: () => handleRemoveFileV2(index), className: "remove-btn", type: "icon-ants-remove-slim" })] }, file?.token))) })), _jsxs(WrapperIconEditor, { borderTop: !!valueInput.files?.length, children: [_jsxs(WrapperInputFile, { children: [_jsx("label", { htmlFor: `fileImage-${fileInputKey}`, className: "upload-wrapper-label", children: _jsx(Icon, { type: "icon-ants-attachment", className: "upload-icon" }) }), _jsx("input", { type: "file", style: { position: 'absolute', top: 0, right: 0, display: 'none' }, name: `fileImage-${fileInputKey}`, id: `fileImage-${fileInputKey}`, onChange: handleOnchangeFile }, fileInputKey)] }), isUpdate && (_jsx(Button, { type: "primary", disabled: !handleValidateContent(textValue) || isLoadingUpload, className: "reply-btn", style: {
|
|
308
|
+
}), onChange: handleEditorChange, placeholder: "Enter your comment...", height: 195, callback: callbackEditor }), _jsxs("div", { children: [valueInput.files?.length > 0 && (_jsx(WrapperLinkItemFiles, { children: valueInput.files?.map((file, index) => (_jsxs("div", { className: "file-item", children: [_jsxs("div", { className: "file-name-group", children: [_jsx(Icon, { className: "file-icon", type: "icon-ants-attachment" }), _jsx(Tooltip, { title: file?.file_name, children: _jsx("span", { className: "file-name", children: file?.file_name }) })] }), _jsx(Icon, { onClick: () => handleRemoveFileV2(index), className: "remove-btn", type: "icon-ants-remove-slim" })] }, file?.token))) })), _jsxs(WrapperIconEditor, { borderTop: !!valueInput.files?.length, children: [_jsxs(WrapperInputFile, { children: [_jsx("label", { htmlFor: `fileImage-${fileInputKey}`, className: "upload-wrapper-label", children: _jsx(Icon, { type: "icon-ants-attachment", className: "upload-icon" }) }), _jsx("input", { type: "file", style: { position: 'absolute', top: 0, right: 0, display: 'none' }, name: `fileImage-${fileInputKey}`, id: `fileImage-${fileInputKey}`, onChange: handleOnchangeFile }, fileInputKey)] }), isUpdate && (_jsx(Button, { type: "primary", disabled: !handleValidateContent(textValue) || isLoadingUpload, className: "reply-btn", style: {
|
|
275
309
|
background: `${!handleValidateContent(textValue) || isLoadingUpload
|
|
276
310
|
? '#ccc'
|
|
277
311
|
: '#1f5fac'}`,
|
|
278
|
-
}, onClick: handleUpdateComment,
|
|
312
|
+
}, onClick: handleUpdateComment, children: "Reply" }))] })] })] }), errFile.isError ? (_jsx("div", { className: "error-message", children: errFile.message })) : (isEmptyField &&
|
|
279
313
|
!valueInput?.message && (_jsx("div", { className: "error-message", children: "* This field can't be empty" })))] }), isUpdate && (_jsx(Spin, { spinning: isLoadingComment, children: _jsx(WrapperMessageContent, { children: listComment?.map(comment => (_jsx(MessageComponent, { toUser: comment?.toUser, fromUser: comment?.fromUser, followers: comment?.followers,
|
|
280
314
|
// mailFollower={comment?.mailFollower}
|
|
281
315
|
message: comment?.message, date: comment?.createdDate, attachments: comment?.attachments, timeZone: timeZone, submitterEmail: comment?.submitterEmail }, comment?.id))) }) }))] })] }) })] }));
|
|
@@ -18,6 +18,7 @@ const MessageComponent = ({ toUser, fromUser, followers, attachments, message, d
|
|
|
18
18
|
if (refMesage.current) {
|
|
19
19
|
refMesage.current.querySelectorAll('img')?.forEach(img => {
|
|
20
20
|
img.style.cursor = 'pointer';
|
|
21
|
+
img.style.width = '100%';
|
|
21
22
|
img.addEventListener('click', () => {
|
|
22
23
|
setModalImg({
|
|
23
24
|
...modalImg,
|
|
@@ -34,7 +34,7 @@ export const WrapperLeftContent = styled.div `
|
|
|
34
34
|
`;
|
|
35
35
|
export const WrapperRightContent = styled.div `
|
|
36
36
|
flex: 2;
|
|
37
|
-
width:
|
|
37
|
+
max-width: 66.67%;
|
|
38
38
|
::-webkit-scrollbar {
|
|
39
39
|
width: 8px;
|
|
40
40
|
height: 8px;
|
|
@@ -423,6 +423,7 @@ export const WrapperLinkItemFiles = styled.div `
|
|
|
423
423
|
display: flex;
|
|
424
424
|
align-items: center;
|
|
425
425
|
gap: 10px;
|
|
426
|
+
overflow: hidden;
|
|
426
427
|
}
|
|
427
428
|
.file-icon {
|
|
428
429
|
font-size: 20.5px;
|
|
@@ -15,4 +15,5 @@ export { AccountProfile, type AccountSettingProps } from './AccountProfile';
|
|
|
15
15
|
export * from './Login';
|
|
16
16
|
export * from './Filter';
|
|
17
17
|
export { ActivityTimeline, type ActivityTimeLineProps } from './ActivityTimeline';
|
|
18
|
+
export { TextEditor, TextEditorProvider, type TextEditorProps, type TextEditorRef, type TextEditorJSONContent, type TextEditorProviderProps, type TextEditorProviderRefHandler, } from './TextEditor';
|
|
18
19
|
export { WhatsappMobile, SAMPLE_PREVIEW } from './PreviewCollections';
|
|
@@ -15,4 +15,5 @@ export { AccountProfile } from './AccountProfile';
|
|
|
15
15
|
export * from './Login';
|
|
16
16
|
export * from './Filter';
|
|
17
17
|
export { ActivityTimeline } from './ActivityTimeline';
|
|
18
|
+
export { TextEditor, TextEditorProvider, } from './TextEditor';
|
|
18
19
|
export { WhatsappMobile, SAMPLE_PREVIEW } from './PreviewCollections';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import url('./TextEditor/index.scss');
|
package/es/hooks/index.d.ts
CHANGED
|
@@ -26,3 +26,6 @@ export * from './useCustomRouter';
|
|
|
26
26
|
export * from './useUpdateEffect';
|
|
27
27
|
export * from './useOutsideClick';
|
|
28
28
|
export * from './useDebouncedCallbackV2';
|
|
29
|
+
export * from './useElementSize';
|
|
30
|
+
export * from './useIsMounted';
|
|
31
|
+
export * from './useBroadcastedLocalStorage';
|
package/es/hooks/index.js
CHANGED
|
@@ -45,3 +45,6 @@ export * from './useCustomRouter';
|
|
|
45
45
|
export * from './useUpdateEffect';
|
|
46
46
|
export * from './useOutsideClick';
|
|
47
47
|
export * from './useDebouncedCallbackV2';
|
|
48
|
+
export * from './useElementSize';
|
|
49
|
+
export * from './useIsMounted';
|
|
50
|
+
export * from './useBroadcastedLocalStorage';
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
import { useEffect, useState, useRef } from 'react';
|
|
3
|
+
import { useDeepCompareEffect } from './useDeepCompareEffect';
|
|
4
|
+
export function useBroadcastedLocalStorage(key, initialValue) {
|
|
5
|
+
const [value, setValue] = useState(() => {
|
|
6
|
+
if (typeof window === 'undefined')
|
|
7
|
+
return initialValue;
|
|
8
|
+
try {
|
|
9
|
+
const saved = window.localStorage.getItem(key);
|
|
10
|
+
return saved != null ? JSON.parse(saved) : initialValue;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return initialValue;
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
// We keep a ref to avoid re-creating the channel on every render
|
|
17
|
+
const channelRef = useRef(null);
|
|
18
|
+
// Initialize BroadcastChannel once
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
if (typeof window === 'undefined' || !('BroadcastChannel' in window)) {
|
|
21
|
+
console.warn('BroadcastChannel not supported in this environment');
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const channel = new BroadcastChannel(`localstorage_${key}`);
|
|
25
|
+
channelRef.current = channel;
|
|
26
|
+
// Listen for incoming messages
|
|
27
|
+
const onMessage = (event) => {
|
|
28
|
+
setValue(event.data.value);
|
|
29
|
+
};
|
|
30
|
+
channel.addEventListener('message', onMessage);
|
|
31
|
+
return () => {
|
|
32
|
+
channel.removeEventListener('message', onMessage);
|
|
33
|
+
channel.close();
|
|
34
|
+
};
|
|
35
|
+
}, [key]);
|
|
36
|
+
// Whenever `value` changes, persist and broadcast
|
|
37
|
+
useDeepCompareEffect(() => {
|
|
38
|
+
if (typeof window === 'undefined')
|
|
39
|
+
return;
|
|
40
|
+
try {
|
|
41
|
+
window.localStorage.setItem(key, JSON.stringify(value));
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
console.error('Failed to write to localStorage:', err);
|
|
45
|
+
}
|
|
46
|
+
if (channelRef.current) {
|
|
47
|
+
channelRef.current.postMessage({ value });
|
|
48
|
+
}
|
|
49
|
+
}, [key, value]);
|
|
50
|
+
// Expose setter that mirrors functional API of useState
|
|
51
|
+
const setValueAndBroadcast = (next) => {
|
|
52
|
+
setValue(prev => {
|
|
53
|
+
const computed = next instanceof Function ? next(prev) : next;
|
|
54
|
+
return computed;
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
// Optional: a remove function
|
|
58
|
+
const remove = () => {
|
|
59
|
+
try {
|
|
60
|
+
window.localStorage.removeItem(key);
|
|
61
|
+
setValue(initialValue);
|
|
62
|
+
if (channelRef.current) {
|
|
63
|
+
channelRef.current.postMessage({ value: initialValue });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
console.error('Failed to remove localStorage item:', err);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
return { value, setValue: setValueAndBroadcast, remove };
|
|
71
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { useState, useEffect, useRef, useCallback } from 'react';
|
|
2
|
+
export const useElementSize = (options = { type: 'offset' }) => {
|
|
3
|
+
const { type = 'offset' } = options;
|
|
4
|
+
const [size, setSize] = useState({
|
|
5
|
+
width: 0,
|
|
6
|
+
height: 0,
|
|
7
|
+
});
|
|
8
|
+
const ref = useRef(null);
|
|
9
|
+
const updateSize = useCallback(() => {
|
|
10
|
+
if (ref.current) {
|
|
11
|
+
let width;
|
|
12
|
+
let height;
|
|
13
|
+
switch (type) {
|
|
14
|
+
case 'client':
|
|
15
|
+
width = ref.current.clientWidth; // excludes padding, border, scrollbar
|
|
16
|
+
height = ref.current.clientHeight;
|
|
17
|
+
break;
|
|
18
|
+
case 'scroll':
|
|
19
|
+
width = ref.current.scrollWidth; // includes all scrollable content
|
|
20
|
+
height = ref.current.scrollHeight;
|
|
21
|
+
break;
|
|
22
|
+
case 'offset':
|
|
23
|
+
default:
|
|
24
|
+
width = ref.current.offsetWidth; // includes padding and border
|
|
25
|
+
height = ref.current.offsetHeight;
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
setSize({ width, height });
|
|
29
|
+
}
|
|
30
|
+
}, [type]);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
const element = ref.current;
|
|
33
|
+
if (!element)
|
|
34
|
+
return;
|
|
35
|
+
// Set initial size
|
|
36
|
+
updateSize();
|
|
37
|
+
// Use ResizeObserver if available
|
|
38
|
+
if (typeof ResizeObserver !== 'undefined') {
|
|
39
|
+
const resizeObserver = new ResizeObserver(() => {
|
|
40
|
+
// Always use the same measurement method as updateSize
|
|
41
|
+
updateSize();
|
|
42
|
+
});
|
|
43
|
+
resizeObserver.observe(element);
|
|
44
|
+
return () => {
|
|
45
|
+
resizeObserver.unobserve(element);
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// Fallback to window resize event
|
|
49
|
+
const handleResize = () => updateSize();
|
|
50
|
+
window.addEventListener('resize', handleResize);
|
|
51
|
+
return () => {
|
|
52
|
+
window.removeEventListener('resize', handleResize);
|
|
53
|
+
};
|
|
54
|
+
}, [updateSize]);
|
|
55
|
+
return [ref, size];
|
|
56
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const useIsMounted: () => () => boolean;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
2
|
+
export const useIsMounted = () => {
|
|
3
|
+
const isMountedRef = useRef(false);
|
|
4
|
+
useEffect(() => {
|
|
5
|
+
isMountedRef.current = true;
|
|
6
|
+
return () => {
|
|
7
|
+
isMountedRef.current = false;
|
|
8
|
+
};
|
|
9
|
+
}, []);
|
|
10
|
+
return useCallback(() => isMountedRef.current, []);
|
|
11
|
+
};
|
|
@@ -597,7 +597,8 @@
|
|
|
597
597
|
"noData": "No data",
|
|
598
598
|
"extendValue": {
|
|
599
599
|
"title": "Extend Value",
|
|
600
|
-
"placeholder": "Input or paste multiple values separated by Enter"
|
|
600
|
+
"placeholder": "Input or paste multiple values separated by Enter",
|
|
601
|
+
"placeholderNumber": "Input or paste multiple values separated by Enter. Only accept numeric values."
|
|
601
602
|
},
|
|
602
603
|
"leftMenu": {
|
|
603
604
|
"pageTitle": {
|
package/es/locales/i18n.d.ts
CHANGED
|
@@ -3770,6 +3770,7 @@ export declare const translationsJson: {
|
|
|
3770
3770
|
extendValue: {
|
|
3771
3771
|
title: string;
|
|
3772
3772
|
placeholder: string;
|
|
3773
|
+
placeholderNumber: string;
|
|
3773
3774
|
};
|
|
3774
3775
|
leftMenu: {
|
|
3775
3776
|
pageTitle: {
|
|
@@ -7176,6 +7177,7 @@ export declare const translationsJson: {
|
|
|
7176
7177
|
extendValue: {
|
|
7177
7178
|
title: string;
|
|
7178
7179
|
placeholder: string;
|
|
7180
|
+
placeholderNumber: string;
|
|
7179
7181
|
};
|
|
7180
7182
|
matchesAnySelect: {
|
|
7181
7183
|
noData: string;
|
|
@@ -10661,6 +10663,6 @@ export declare const translationsJson: {
|
|
|
10661
10663
|
};
|
|
10662
10664
|
};
|
|
10663
10665
|
};
|
|
10664
|
-
declare const i18nInstance: import("i18next").i18n;
|
|
10666
|
+
declare const i18nInstance: import("node_modules/i18next").i18n;
|
|
10665
10667
|
export declare const getTranslateMessage: (id: string, defaultMessage?: string, value?: Record<string, unknown>) => string;
|
|
10666
10668
|
export default i18nInstance;
|
|
@@ -144,7 +144,8 @@
|
|
|
144
144
|
"noData": "Không có dữ liệu",
|
|
145
145
|
"extendValue": {
|
|
146
146
|
"title": "Mở rộng giá trị",
|
|
147
|
-
"placeholder": "Nhập hoặc dán nhiều giá trị cách nhau bằng Enter"
|
|
147
|
+
"placeholder": "Nhập hoặc dán nhiều giá trị cách nhau bằng Enter",
|
|
148
|
+
"placeholderNumber": "Nhập hoặc dán nhiều giá trị cách nhau bằng Enter. Chỉ chấp nhận giá trị số "
|
|
148
149
|
},
|
|
149
150
|
"matchesAnySelect": {
|
|
150
151
|
"noData": "Bạn không có giá trị nào <br /> Bấm vào Extend Value để thêm giá trị"
|
package/es/utils/common.d.ts
CHANGED
|
@@ -66,17 +66,14 @@ export declare const searchParamsToObject: (searchParams?: string) => Record<str
|
|
|
66
66
|
export declare const getShuffleArray: <T>(array: T[]) => T[];
|
|
67
67
|
export declare const snakeCaseToCamelCase: <T = Record<string, any>>(object: Record<string, any> | Record<string, any>[], recursive?: boolean) => T;
|
|
68
68
|
export declare const camelCaseToSnakeCase: <T = Record<string, any>>(object: Record<string, any>, recursive?: boolean) => T;
|
|
69
|
-
export declare function generateKey():
|
|
69
|
+
export declare function generateKey(): string;
|
|
70
70
|
export declare const formatUserId: (userId?: number) => string;
|
|
71
71
|
/**
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
/** Remove all accents and convert string to lower case, remove leading and trailing white space */
|
|
78
|
-
export declare const simplifyString: (str: string) => string;
|
|
79
|
-
/**
|
|
72
|
+
* Checks string matching based on a query, supporting fuzzy matching,
|
|
73
|
+
* where the query characters must appear in order within the target string.
|
|
74
|
+
* Allows for missing characters in the query relative to the target,
|
|
75
|
+
* and ignores case, diacritics, and spaces.
|
|
76
|
+
*
|
|
80
77
|
* @param str target string
|
|
81
78
|
* @param queryStr search query
|
|
82
79
|
* @returns true if target string includes search query
|
package/es/utils/common.js
CHANGED
|
@@ -430,35 +430,56 @@ export function generateKey() {
|
|
|
430
430
|
}
|
|
431
431
|
export const formatUserId = (userId) => String(userId || '').replace(/(\d{3})(\d{3})(\d{0,})/, `$1-$2-$3`);
|
|
432
432
|
/**
|
|
433
|
-
*
|
|
434
|
-
*
|
|
435
|
-
*
|
|
433
|
+
* Normalizes a string for searching by:
|
|
434
|
+
* 1. Converting to NFD Unicode form and removing diacritics.
|
|
435
|
+
* 2. Converting to lowercase.
|
|
436
|
+
* 3. Removing all whitespace.
|
|
437
|
+
* @param str The string to normalize.
|
|
438
|
+
* @returns The normalized string.
|
|
436
439
|
*/
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
str = str.replace(/[ÌÍỊỈĨ]/g, 'I');
|
|
448
|
-
str = str.replace(/[ÒÓỌỎÕÔỒỐỘỔỖƠỜỚỢỞỠ]/g, 'O');
|
|
449
|
-
str = str.replace(/Ù|Ú|Ụ|Ủ|Ũ|Ư|Ừ|Ứ|Ự|Ử|Ữ/g, 'U');
|
|
450
|
-
str = str.replace(/Ỳ|Ý|Ỵ|Ỷ|Ỹ/g, 'Y');
|
|
451
|
-
str = str.replace(/Đ/g, 'D');
|
|
452
|
-
return str;
|
|
453
|
-
};
|
|
454
|
-
/** Remove all accents and convert string to lower case, remove leading and trailing white space */
|
|
455
|
-
export const simplifyString = (str) => removeAccent(`${str || ''}`.toLowerCase().trim()) || '';
|
|
440
|
+
function normalizeStringForSearch(str) {
|
|
441
|
+
if (!str) {
|
|
442
|
+
return ''; // Handle null, undefined, or empty string inputs
|
|
443
|
+
}
|
|
444
|
+
return str
|
|
445
|
+
.normalize('NFD') // Decompose accented characters (e.g., "á" -> "a" + "´")
|
|
446
|
+
.replace(/[\u0300-\u036f]/g, '') // Remove diacritical marks
|
|
447
|
+
.toLowerCase() // Convert to lowercase
|
|
448
|
+
.replace(/\s+/g, ''); // Remove all whitespace
|
|
449
|
+
}
|
|
456
450
|
/**
|
|
451
|
+
* Checks string matching based on a query, supporting fuzzy matching,
|
|
452
|
+
* where the query characters must appear in order within the target string.
|
|
453
|
+
* Allows for missing characters in the query relative to the target,
|
|
454
|
+
* and ignores case, diacritics, and spaces.
|
|
455
|
+
*
|
|
457
456
|
* @param str target string
|
|
458
457
|
* @param queryStr search query
|
|
459
458
|
* @returns true if target string includes search query
|
|
460
459
|
*/
|
|
461
|
-
export const searchStringQuery = (str, queryStr) =>
|
|
460
|
+
export const searchStringQuery = (str, queryStr) => {
|
|
461
|
+
const normalizedQuery = normalizeStringForSearch(queryStr);
|
|
462
|
+
const normalizedItem = normalizeStringForSearch(str);
|
|
463
|
+
// Optimization: if normalized query is longer than normalized item,
|
|
464
|
+
// it cannot be a subsequence.
|
|
465
|
+
if (normalizedQuery.length > normalizedItem.length) {
|
|
466
|
+
return false;
|
|
467
|
+
}
|
|
468
|
+
// Subsequence check:
|
|
469
|
+
// Iterate through both normalized strings.
|
|
470
|
+
// If characters match, advance the query pointer.
|
|
471
|
+
// Always advance the item pointer.
|
|
472
|
+
let queryIndex = 0;
|
|
473
|
+
let itemIndex = 0;
|
|
474
|
+
while (queryIndex < normalizedQuery.length && itemIndex < normalizedItem.length) {
|
|
475
|
+
if (normalizedQuery[queryIndex] === normalizedItem[itemIndex]) {
|
|
476
|
+
queryIndex++;
|
|
477
|
+
}
|
|
478
|
+
itemIndex++;
|
|
479
|
+
}
|
|
480
|
+
// If queryIndex reached the end of normalizedQuery, all its characters were found in order.
|
|
481
|
+
return queryIndex === normalizedQuery.length;
|
|
482
|
+
};
|
|
462
483
|
/**
|
|
463
484
|
* Checks if any of the provided values match the search value.
|
|
464
485
|
*
|
package/es/utils/index.d.ts
CHANGED
package/es/utils/index.js
CHANGED