@uva-glass/component-library 3.55.4 → 3.55.6
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/dist/{Accordion-BpnBHYIx.js → Accordion-DvblEUVu.js} +16 -17
- package/dist/{Accordion-BpnBHYIx.js.map → Accordion-DvblEUVu.js.map} +1 -1
- package/dist/ActionList-O9w1hqNg.js.map +1 -1
- package/dist/{AddCatalogueLinkForm-Cy6fPNvN.js → AddCatalogueLinkForm-rph4K9P0.js} +24 -25
- package/dist/{AddCatalogueLinkForm-Cy6fPNvN.js.map → AddCatalogueLinkForm-rph4K9P0.js.map} +1 -1
- package/dist/{CheckboxButtonBar-CalU0IYK.js → CheckboxButtonBar-5UMIFMKH.js} +2 -2
- package/dist/{CheckboxButtonBar-CalU0IYK.js.map → CheckboxButtonBar-5UMIFMKH.js.map} +1 -1
- package/dist/{ControlsButton-zemVxTlg.js → ControlsButton-B1XRpMUM.js} +15 -16
- package/dist/{ControlsButton-zemVxTlg.js.map → ControlsButton-B1XRpMUM.js.map} +1 -1
- package/dist/{Drawer-Ggofac6y.js → Drawer-e7UFHVg9.js} +29 -30
- package/dist/{Drawer-Ggofac6y.js.map → Drawer-e7UFHVg9.js.map} +1 -1
- package/dist/{FieldHint-D0HtbTnt.js → FieldHint-fxnEOsVZ.js} +2 -2
- package/dist/{FieldHint-D0HtbTnt.js.map → FieldHint-fxnEOsVZ.js.map} +1 -1
- package/dist/Fieldset-0LFsZ3Mz.js +22 -0
- package/dist/{Fieldset-CoNu_Owa.js.map → Fieldset-0LFsZ3Mz.js.map} +1 -1
- package/dist/{Lexical.prod-DIglXatJ.js → Lexical.prod-CqPLSi0R.js} +1225 -1120
- package/dist/Lexical.prod-CqPLSi0R.js.map +1 -0
- package/dist/LexicalClipboard.prod-BVw_sFpo.js +651 -0
- package/dist/LexicalClipboard.prod-BVw_sFpo.js.map +1 -0
- package/dist/{LexicalExtension.prod-COPHoPpX.js → LexicalExtension.prod-CUQTgbur.js} +318 -291
- package/dist/LexicalExtension.prod-CUQTgbur.js.map +1 -0
- package/dist/{LexicalLink.prod-Bf9JUdMv.js → LexicalLink.prod-DMhcqD9x.js} +212 -205
- package/dist/LexicalLink.prod-DMhcqD9x.js.map +1 -0
- package/dist/{LexicalList.prod-DRz8vsM9.js → LexicalList.prod-eYlcb5Ao.js} +295 -255
- package/dist/LexicalList.prod-eYlcb5Ao.js.map +1 -0
- package/dist/{LexicalTable.prod-D16GW-aZ.js → LexicalTable.prod-DlOxUQou.js} +717 -703
- package/dist/LexicalTable.prod-DlOxUQou.js.map +1 -0
- package/dist/LexicalUtils.prod-BqcriFWV.js +343 -0
- package/dist/LexicalUtils.prod-BqcriFWV.js.map +1 -0
- package/dist/{LinkContextMenu-m_CGQEiX.js → LinkContextMenu-ePn1iZ_z.js} +2 -2
- package/dist/{LinkContextMenu-m_CGQEiX.js.map → LinkContextMenu-ePn1iZ_z.js.map} +1 -1
- package/dist/{ModalDialog-HUkDdAJ-.js → ModalDialog-N50NGnd4.js} +2 -2
- package/dist/{ModalDialog-HUkDdAJ-.js.map → ModalDialog-N50NGnd4.js.map} +1 -1
- package/dist/MultiSelectBox-Cuh_o-A1.js.map +1 -1
- package/dist/{PageOverlay-D_wG2oie.js → PageOverlay-S4xsqJha.js} +2 -2
- package/dist/{PageOverlay-D_wG2oie.js.map → PageOverlay-S4xsqJha.js.map} +1 -1
- package/dist/{PasteHandlerPlugin-DjD1wryY.js → PasteHandlerPlugin-BNp8ST0q.js} +5 -5
- package/dist/{PasteHandlerPlugin-DjD1wryY.js.map → PasteHandlerPlugin-BNp8ST0q.js.map} +1 -1
- package/dist/Periods-BYETtB6R.js.map +1 -1
- package/dist/{RteEditor.module-Jk80F1FA.js → RteEditor.module-BJLUYSpf.js} +9 -10
- package/dist/{RteEditor.module-Jk80F1FA.js.map → RteEditor.module-BJLUYSpf.js.map} +1 -1
- package/dist/Slider-BlLyrET9.js.map +1 -1
- package/dist/{Sortable.module-BTUOSbOU.js → Sortable.module-8SoaHfuE.js} +6 -7
- package/dist/{Sortable.module-BTUOSbOU.js.map → Sortable.module-8SoaHfuE.js.map} +1 -1
- package/dist/{SortableProvider-Dc7hwkb5.js → SortableProvider-8HYiBXJS.js} +2 -2
- package/dist/{SortableProvider-Dc7hwkb5.js.map → SortableProvider-8HYiBXJS.js.map} +1 -1
- package/dist/Spinner-BpElTDIu.js +30 -0
- package/dist/{Spinner-D8tWqg9j.js.map → Spinner-BpElTDIu.js.map} +1 -1
- package/dist/{TableCellResizerPlugin-CgYsYsuY.js → TableCellResizerPlugin-Bc5y-Qbx.js} +36 -36
- package/dist/{TableCellResizerPlugin-CgYsYsuY.js.map → TableCellResizerPlugin-Bc5y-Qbx.js.map} +1 -1
- package/dist/{TextArea-DqKIpOfT.js → TextArea-CuASC9bX.js} +16 -17
- package/dist/{TextArea-DqKIpOfT.js.map → TextArea-CuASC9bX.js.map} +1 -1
- package/dist/{Tooltip-BzB3jznk.js → Tooltip-D27p9kh4.js} +13 -14
- package/dist/{Tooltip-BzB3jznk.js.map → Tooltip-D27p9kh4.js.map} +1 -1
- package/dist/{chunk-DeC0fbbY.js → chunk-3e0lkp8x.js} +1 -1
- package/dist/{chunk-SZQXB3JV-D0XG4Tlp.js → chunk-SZQXB3JV-D6GR5B4F.js} +5 -5
- package/dist/chunk-SZQXB3JV-D6GR5B4F.js.map +1 -0
- package/dist/{client-UU-mS47K.js → client-8jeXrH7N.js} +10 -10
- package/dist/{client-UU-mS47K.js.map → client-8jeXrH7N.js.map} +1 -1
- package/dist/components/Accordion/Accordion.js +1 -1
- package/dist/components/Accordion/Accordion.stories.js +1 -1
- package/dist/components/Accordion/Accordion.stories.js.map +1 -1
- package/dist/components/Accordion/Accordion.test.js +4 -7
- package/dist/components/Accordion/Accordion.test.js.map +1 -1
- package/dist/components/Accordion/index.js +1 -1
- package/dist/components/AccordionCard/AccordionCard.stories.js.map +1 -1
- package/dist/components/AccordionCard/AccordionCard.test.js +3 -6
- package/dist/components/AccordionCard/AccordionCard.test.js.map +1 -1
- package/dist/components/ActionList/ActionList.stories.js.map +1 -1
- package/dist/components/ActionList/ActionList.test.js +3 -6
- package/dist/components/ActionList/ActionList.test.js.map +1 -1
- package/dist/components/AppStatusBar/AppStatusBar.stories.js.map +1 -1
- package/dist/components/AppStatusBar/AppStatusBar.test.js +2 -5
- package/dist/components/AppStatusBar/AppStatusBar.test.js.map +1 -1
- package/dist/components/Attention/Attention.stories.js.map +1 -1
- package/dist/components/Attention/Attention.test.js +2 -5
- package/dist/components/Attention/Attention.test.js.map +1 -1
- package/dist/components/Backdrop/Backdrop.stories.js.map +1 -1
- package/dist/components/Backdrop/Backdrop.test.js +2 -5
- package/dist/components/Backdrop/Backdrop.test.js.map +1 -1
- package/dist/components/ButtonGroup/ButtonGroup.stories.js.map +1 -1
- package/dist/components/Buttons/Button.stories.js +1 -1
- package/dist/components/Buttons/Button.stories.js.map +1 -1
- package/dist/components/Buttons/Button.test.js +2 -5
- package/dist/components/Buttons/Button.test.js.map +1 -1
- package/dist/components/Buttons/LinkButton.stories.js +1 -1
- package/dist/components/Buttons/LinkButton.stories.js.map +1 -1
- package/dist/components/Buttons/LinkButton.test.js +2 -5
- package/dist/components/Buttons/LinkButton.test.js.map +1 -1
- package/dist/components/Buttons/MenuButton.stories.js +1 -1
- package/dist/components/Buttons/MenuButton.stories.js.map +1 -1
- package/dist/components/Buttons/MenuButton.test.js +2 -5
- package/dist/components/Buttons/MenuButton.test.js.map +1 -1
- package/dist/components/Card/Card.stories.js.map +1 -1
- package/dist/components/Card/Card.test.js +2 -5
- package/dist/components/Card/Card.test.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.stories.js +1 -1
- package/dist/components/Checkbox/Checkbox.stories.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.test.js +3 -6
- package/dist/components/Checkbox/Checkbox.test.js.map +1 -1
- package/dist/components/CheckboxButtonBar/CheckboxButtonBar.js +1 -1
- package/dist/components/CheckboxButtonBar/CheckboxButtonBar.stories.js +2 -2
- package/dist/components/CheckboxButtonBar/CheckboxButtonBar.stories.js.map +1 -1
- package/dist/components/CheckboxButtonBar/CheckboxButtonBar.test.js +3 -6
- package/dist/components/CheckboxButtonBar/CheckboxButtonBar.test.js.map +1 -1
- package/dist/components/CheckboxButtonBar/index.js +1 -1
- package/dist/components/CheckboxTree/CheckboxTree.js +1 -2
- package/dist/components/CheckboxTree/CheckboxTree.stories.js +3 -4
- package/dist/components/CheckboxTree/CheckboxTree.stories.js.map +1 -1
- package/dist/components/CheckboxTree/index.js +1 -2
- package/dist/components/Chip/Chip.stories.js +1 -1
- package/dist/components/Chip/Chip.stories.js.map +1 -1
- package/dist/components/ControlsButton/ControlsButton.js +1 -1
- package/dist/components/ControlsButton/ControlsButton.stories.js +2 -2
- package/dist/components/ControlsButton/ControlsButton.stories.js.map +1 -1
- package/dist/components/ControlsButton/index.js +1 -1
- package/dist/components/Drawer/Drawer.js +1 -1
- package/dist/components/Drawer/Drawer.stories.js +2 -2
- package/dist/components/Drawer/Drawer.stories.js.map +1 -1
- package/dist/components/Drawer/index.js +1 -1
- package/dist/components/EmptyStateDataDisplay/EmptyStateDataDisplay.stories.js.map +1 -1
- package/dist/components/ExpandableInfoPanel/ExpandableInfoPanel.stories.js.map +1 -1
- package/dist/components/FeedbackBar/FeedbackBar.stories.js.map +1 -1
- package/dist/components/FeedbackBar/FeedbackBar.test.js +2 -5
- package/dist/components/FeedbackBar/FeedbackBar.test.js.map +1 -1
- package/dist/components/FeedbackBox/FeedbackBox.stories.js.map +1 -1
- package/dist/components/FieldHint/FieldHint.js +1 -1
- package/dist/components/FieldHint/FieldHint.stories.js +1 -1
- package/dist/components/FieldHint/FieldHint.stories.js.map +1 -1
- package/dist/components/FieldHint/index.js +1 -1
- package/dist/components/Fieldset/Fieldset.js +1 -1
- package/dist/components/Fieldset/Fieldset.stories.js +1 -1
- package/dist/components/Fieldset/Fieldset.stories.js.map +1 -1
- package/dist/components/Fieldset/index.js +1 -1
- package/dist/components/FormField/FormField.stories.js.map +1 -1
- package/dist/components/FormInput/FormInput.js +1 -2
- package/dist/components/FormInput/FormInput.stories.js +2 -3
- package/dist/components/FormInput/FormInput.stories.js.map +1 -1
- package/dist/components/FormInput/index.js +1 -2
- package/dist/components/GridRow/GridRow.stories.js.map +1 -1
- package/dist/components/HorizontalList/HorizontalList.stories.js.map +1 -1
- package/dist/components/Icon/Icon.stories.js.map +1 -1
- package/dist/components/IconButton/IconButton.stories.js +6 -7
- package/dist/components/IconButton/IconButton.stories.js.map +1 -1
- package/dist/components/InfoBanner/InfoBanner.stories.js.map +1 -1
- package/dist/components/InfoMessage/InfoMessage.stories.js.map +1 -1
- package/dist/components/Input/Input.stories.js.map +1 -1
- package/dist/components/InputField/InputField.stories.js +1 -3
- package/dist/components/InputField/InputField.stories.js.map +1 -1
- package/dist/components/Label/Label.stories.js.map +1 -1
- package/dist/components/Label/Label.test.js +2 -5
- package/dist/components/Label/Label.test.js.map +1 -1
- package/dist/components/MenuLink/MenuLink.stories.js.map +1 -1
- package/dist/components/MetaDataBar/MetaDataBar.stories.js.map +1 -1
- package/dist/components/MetaDataBar/MetaDataBar.test.js +1 -4
- package/dist/components/MetaDataBar/MetaDataBar.test.js.map +1 -1
- package/dist/components/MetaDataList/MetaDataList.stories.js.map +1 -1
- package/dist/components/ModalDialog/ModalDialog.js +1 -1
- package/dist/components/ModalDialog/ModalDialog.stories.js +2 -2
- package/dist/components/ModalDialog/ModalDialog.stories.js.map +1 -1
- package/dist/components/ModalDialog/index.js +1 -1
- package/dist/components/MultiSelect/MultiSelect.js +1 -2
- package/dist/components/MultiSelect/MultiSelect.stories.js +2 -3
- package/dist/components/MultiSelect/MultiSelect.stories.js.map +1 -1
- package/dist/components/MultiSelect/components/MultiSelectHeader.js +1 -2
- package/dist/components/MultiSelect/index.js +1 -2
- package/dist/components/MultiSelectBox/MultiSelectBox.stories.js +1 -1
- package/dist/components/MultiSelectBox/MultiSelectBox.stories.js.map +1 -1
- package/dist/components/MultiSelectBox/MultiSelectBox.test.js +2 -5
- package/dist/components/MultiSelectBox/MultiSelectBox.test.js.map +1 -1
- package/dist/components/Notification/Notification.stories.js +1 -1
- package/dist/components/Notification/Notification.stories.js.map +1 -1
- package/dist/components/Notification/Notification.test.js +2 -5
- package/dist/components/Notification/Notification.test.js.map +1 -1
- package/dist/components/OverlayCloseButton/OverlayCloseButton.stories.js +6 -7
- package/dist/components/OverlayCloseButton/OverlayCloseButton.stories.js.map +1 -1
- package/dist/components/OverlayStepBar/OverlayStepBar.stories.js.map +1 -1
- package/dist/components/PageOverlay/PageOverlay.js +1 -1
- package/dist/components/PageOverlay/PageOverlay.stories.js +1 -1
- package/dist/components/PageOverlay/PageOverlay.stories.js.map +1 -1
- package/dist/components/PageOverlay/index.js +1 -1
- package/dist/components/PeriodSelector/PeriodSelector.js +1 -2
- package/dist/components/PeriodSelector/PeriodSelector.stories.js +2 -3
- package/dist/components/PeriodSelector/PeriodSelector.stories.js.map +1 -1
- package/dist/components/PeriodSelector/index.js +1 -2
- package/dist/components/ProgrammeCard/ProgrammeCard.stories.js +0 -2
- package/dist/components/ProgrammeCard/ProgrammeCard.stories.js.map +1 -1
- package/dist/components/RadioButton/RadioButton.stories.js.map +1 -1
- package/dist/components/RadioGroup/RadioGroup.stories.js +1 -1
- package/dist/components/RadioGroup/RadioGroup.stories.js.map +1 -1
- package/dist/components/RadioGroup/Radiogroup.test.js +2 -5
- package/dist/components/RadioGroup/Radiogroup.test.js.map +1 -1
- package/dist/components/RadioTabSelector/RadioTabSelector.js +1 -2
- package/dist/components/RadioTabSelector/RadioTabSelector.stories.js +2 -3
- package/dist/components/RadioTabSelector/RadioTabSelector.stories.js.map +1 -1
- package/dist/components/RadioTabSelector/index.js +1 -2
- package/dist/components/Repeater/Repeater.stories.js.map +1 -1
- package/dist/components/RteEditor/EditorHeader/EditorHeader.js +1 -2
- package/dist/components/RteEditor/EditorHeader/index.js +1 -2
- package/dist/components/RteEditor/Plugins/BlockFormatPlugin/BlockFormatPlugin.js +5 -5
- package/dist/components/RteEditor/Plugins/CourseCataloguePlugin/AddCatalogueLinkForm/AddCatalogueLinkForm.js +1 -1
- package/dist/components/RteEditor/Plugins/CourseCataloguePlugin/AddCatalogueLinkForm/index.js +1 -1
- package/dist/components/RteEditor/Plugins/CourseCataloguePlugin/CourseCataloguePlugin.js +36 -36
- package/dist/components/RteEditor/Plugins/CourseCataloguePlugin/CourseCataloguePlugin.js.map +1 -1
- package/dist/components/RteEditor/Plugins/HistoryPlugin/HistoryPlugin.js +1 -2
- package/dist/components/RteEditor/Plugins/HistoryPlugin/index.js +1 -2
- package/dist/components/RteEditor/Plugins/LinkPlugin/AddLinkForm/AddLinkFrom.js +1 -2
- package/dist/components/RteEditor/Plugins/LinkPlugin/LinkContextMenu/LinkContextMenu.js +1 -1
- package/dist/components/RteEditor/Plugins/LinkPlugin/LinkPlugin.js +1 -2
- package/dist/components/RteEditor/Plugins/LinkPlugin/helpers.js +1 -1
- package/dist/components/RteEditor/Plugins/LinkPlugin/index.js +1 -2
- package/dist/components/RteEditor/Plugins/ListPlugin/ListPlugin.js +16 -16
- package/dist/components/RteEditor/Plugins/ListPlugin/ListPlugin.js.map +1 -1
- package/dist/components/RteEditor/Plugins/PasteHandlerPlugin/PasteHandlerPlugin.js +1 -1
- package/dist/components/RteEditor/Plugins/PasteHandlerPlugin/index.js +1 -1
- package/dist/components/RteEditor/Plugins/TableCellResizerPlugin/TableCellResizerPlugin.js +1 -1
- package/dist/components/RteEditor/Plugins/TableCellResizerPlugin/index.js +1 -1
- package/dist/components/RteEditor/Plugins/TablePlugin/AddTableFrom.js +1 -2
- package/dist/components/RteEditor/Plugins/TablePlugin/TablePlugin.js +1 -2
- package/dist/components/RteEditor/Plugins/TablePlugin/helpers.js +29 -29
- package/dist/components/RteEditor/Plugins/TablePlugin/helpers.js.map +1 -1
- package/dist/components/RteEditor/Plugins/TablePlugin/index.js +1 -2
- package/dist/components/RteEditor/Plugins/ToolbarPlugin/ToolbarPlugin.js +1 -2
- package/dist/components/RteEditor/Plugins/ToolbarPlugin/index.js +1 -2
- package/dist/components/RteEditor/Plugins/index.js +3 -3
- package/dist/components/RteEditor/RteEditor.js +1 -2
- package/dist/components/RteEditor/RteEditor.stories.js +1 -2
- package/dist/components/RteEditor/RteEditor.stories.js.map +1 -1
- package/dist/components/RteEditor/UvaTheme/UvaTheme.js +1 -1
- package/dist/components/RteEditor/helpers.js +5 -5
- package/dist/components/RteEditor/helpers.js.map +1 -1
- package/dist/components/RteEditor/hooks/useFlyout.js.map +1 -1
- package/dist/components/RteEditor/index.js +1 -2
- package/dist/components/RteEditor/nodes/CourseCatalogueNode/CourseCatalogueNode.js +17 -17
- package/dist/components/RteEditor/nodes/CourseCatalogueNode/CourseCatalogueNode.js.map +1 -1
- package/dist/components/RteEditor/nodes/TableWrapperNode/TableWrapperNode.js +19 -19
- package/dist/components/SearchField/SearcheField.stories.js.map +1 -1
- package/dist/components/SectionNotification/SectionNotification.stories.js.map +1 -1
- package/dist/components/SelectListbox/SelectListBox.stories.js +1 -1
- package/dist/components/SelectListbox/SelectListBox.stories.js.map +1 -1
- package/dist/components/SelectListbox/SelectProvider.js.map +1 -1
- package/dist/components/Slider/Slider.stories.js.map +1 -1
- package/dist/components/Sortable/Sortable.js +1 -1
- package/dist/components/Sortable/Sortable.stories.js +1 -1
- package/dist/components/Sortable/Sortable.stories.js.map +1 -1
- package/dist/components/Sortable/SortableProvider.js +1 -1
- package/dist/components/Sortable/components/SortableContainer.js +1 -1
- package/dist/components/Sortable/components/SortableHandle.js +1 -1
- package/dist/components/Sortable/components/SortableItem.js +2 -2
- package/dist/components/Spinner/Spinner.js +1 -1
- package/dist/components/Spinner/Spinner.stories.js +1 -1
- package/dist/components/Spinner/Spinner.stories.js.map +1 -1
- package/dist/components/Spinner/index.js +1 -1
- package/dist/components/StatusBadge/StatusBadge.stories.js.map +1 -1
- package/dist/components/StatusBadge/StatusBadge.test.js +2 -5
- package/dist/components/StatusBadge/StatusBadge.test.js.map +1 -1
- package/dist/components/StatusPill/StatusPill.stories.js.map +1 -1
- package/dist/components/TextArea/TextArea.js +1 -1
- package/dist/components/TextArea/TextArea.stories.js +2 -2
- package/dist/components/TextArea/TextArea.stories.js.map +1 -1
- package/dist/components/TextArea/TextArea.test.js +4 -7
- package/dist/components/TextArea/TextArea.test.js.map +1 -1
- package/dist/components/TextArea/index.js +1 -1
- package/dist/components/ToggleSwitch/ToggleSwitch.stories.js +1 -1
- package/dist/components/ToggleSwitch/ToggleSwitch.stories.js.map +1 -1
- package/dist/components/Tooltip/Tooltip.js +1 -1
- package/dist/components/Tooltip/Tooltip.stories.js +1 -1
- package/dist/components/Tooltip/Tooltip.stories.js.map +1 -1
- package/dist/components/Tooltip/index.js +1 -1
- package/dist/components/VarIndicator/VarIndicator.stories.js +1 -1
- package/dist/components/VarIndicator/VarIndicator.stories.js.map +1 -1
- package/dist/components/VarIndicator/VarIndicator.test.js +3 -6
- package/dist/components/VarIndicator/VarIndicator.test.js.map +1 -1
- package/dist/components/WeekSelector/WeekSelector.stories.js.map +1 -1
- package/dist/components/index.js +12 -13
- package/dist/{components-MNvdQLv1.js → components-BzxAULjf.js} +495 -495
- package/dist/components-BzxAULjf.js.map +1 -0
- package/dist/{dist-2TKCXdYZ.js → dist-V_v3kC0L.js} +183 -183
- package/dist/dist-V_v3kC0L.js.map +1 -0
- package/dist/{esm-UNe_gmRA.js → esm-BwHoYxVb.js} +5 -5
- package/dist/{esm-UNe_gmRA.js.map → esm-BwHoYxVb.js.map} +1 -1
- package/dist/{helpers-BBSxTGRl.js → helpers-B1VK8xTF.js} +7 -7
- package/dist/{helpers-BBSxTGRl.js.map → helpers-B1VK8xTF.js.map} +1 -1
- package/dist/index.js +12 -13
- package/dist/{lib-6BbFZdI7.js → lib-BvOQt8El.js} +2 -2
- package/dist/{lib-6BbFZdI7.js.map → lib-BvOQt8El.js.map} +1 -1
- package/dist/{react-18-CRbkdI-3.js → react-18-B7MZmX_Z.js} +3 -3
- package/dist/{react-18-CRbkdI-3.js.map → react-18-B7MZmX_Z.js.map} +1 -1
- package/dist/{react.esm-CzIhAqlo.js → react.esm-D_F72rY1.js} +590 -590
- package/dist/react.esm-D_F72rY1.js.map +1 -0
- package/dist/setupTests.js +2 -3
- package/dist/setupTests.js.map +1 -1
- package/dist/storybook__react.d.js +99 -99
- package/dist/storybook__react.d.js.map +1 -1
- package/dist/{test-DQruvi8i.js → test-Pa9Lwbsq.js} +13 -11
- package/dist/test-Pa9Lwbsq.js.map +1 -0
- package/dist/{test-utils-BSs0eZfL.js → test-utils-Cmn06m_x.js} +2 -2
- package/dist/{test-utils-BSs0eZfL.js.map → test-utils-Cmn06m_x.js.map} +1 -1
- package/package.json +30 -30
- package/dist/Fieldset-CoNu_Owa.js +0 -23
- package/dist/Lexical.prod-DIglXatJ.js.map +0 -1
- package/dist/LexicalClipboard.prod-Bnzu0sh_.js +0 -248
- package/dist/LexicalClipboard.prod-Bnzu0sh_.js.map +0 -1
- package/dist/LexicalExtension.prod-COPHoPpX.js.map +0 -1
- package/dist/LexicalLink.prod-Bf9JUdMv.js.map +0 -1
- package/dist/LexicalList.prod-DRz8vsM9.js.map +0 -1
- package/dist/LexicalTable.prod-D16GW-aZ.js.map +0 -1
- package/dist/LexicalUtils.prod-BBTLliac.js +0 -360
- package/dist/LexicalUtils.prod-BBTLliac.js.map +0 -1
- package/dist/Spinner-D8tWqg9j.js +0 -31
- package/dist/chunk-SZQXB3JV-D0XG4Tlp.js.map +0 -1
- package/dist/components-MNvdQLv1.js.map +0 -1
- package/dist/dist-2TKCXdYZ.js.map +0 -1
- package/dist/react.esm-CzIhAqlo.js.map +0 -1
- package/dist/test-DQruvi8i.js.map +0 -1
- /package/dist/assets/favicon/{android-chrome-192x192.png → src/assets/favicon/android-chrome-192x192.png} +0 -0
- /package/dist/assets/favicon/{android-chrome-512x512.png → src/assets/favicon/android-chrome-512x512.png} +0 -0
- /package/dist/assets/favicon/{apple-touch-icon.png → src/assets/favicon/apple-touch-icon.png} +0 -0
- /package/dist/assets/favicon/{favicon-16x16.png → src/assets/favicon/favicon-16x16.png} +0 -0
- /package/dist/assets/favicon/{favicon-32x32.png → src/assets/favicon/favicon-32x32.png} +0 -0
- /package/dist/assets/favicon/{favicon.ico → src/assets/favicon/favicon.ico} +0 -0
- /package/dist/assets/favicon/{favicon.svg → src/assets/favicon/favicon.svg} +0 -0
- /package/dist/assets/favicon/{site.webmanifest → src/assets/favicon/site.webmanifest} +0 -0
- /package/dist/assets/fonts/{SourceSans3-Regular.otf.woff → src/assets/fonts/SourceSans3-Regular.otf.woff} +0 -0
- /package/dist/assets/fonts/{SourceSans3-Regular.otf.woff2 → src/assets/fonts/SourceSans3-Regular.otf.woff2} +0 -0
- /package/dist/assets/fonts/{SourceSans3-Semibold.otf.woff → src/assets/fonts/SourceSans3-Semibold.otf.woff} +0 -0
- /package/dist/assets/fonts/{SourceSans3-Semibold.otf.woff2 → src/assets/fonts/SourceSans3-Semibold.otf.woff2} +0 -0
- /package/dist/assets/{fonts.css → src/css/fonts.css} +0 -0
- /package/dist/assets/{globals.css → src/css/globals.css} +0 -0
- /package/dist/assets/{variables.css → src/css/variables.css} +0 -0
package/dist/components/RteEditor/Plugins/CourseCataloguePlugin/CourseCataloguePlugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CourseCataloguePlugin.js","names":[],"sources":["../../../../../src/components/RteEditor/Plugins/CourseCataloguePlugin/CourseCataloguePlugin.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\r\nimport { clsx } from 'clsx';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $createRangeSelection,\r\n $createTextNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n $isTextNode,\r\n $setSelection,\r\n COMMAND_PRIORITY_CRITICAL,\r\n COMMAND_PRIORITY_LOW,\r\n COPY_COMMAND,\r\n KEY_DOWN_COMMAND,\r\n mergeRegister,\r\n} from 'lexical';\r\nimport { $getNearestNodeOfType } from '@lexical/utils';\r\n\r\nimport type { RefObject } from 'react';\r\nimport type { LexicalNode, TextNode } from 'lexical';\r\nimport type { SearchResponse } from './AddCatalogueLinkForm';\r\n\r\nimport { AddCatalogueLinkForm } from './AddCatalogueLinkForm';\r\n\r\nimport styles from 'components/RteEditor/RteEditor.module.css';\r\nimport { useTranslation } from 'components/RteEditor/hooks/useTranslation';\r\nimport {\r\n $getLinkTypeFromNode,\r\n CourseCatalogueNode,\r\n INSERT_COURSE_CATALOGUE_LINK,\r\n REMOVE_COURSE_CATALOGUE_LINK,\r\n} from 'components/RteEditor/nodes/CourseCatalogueNode';\r\nimport { useOnClickOutside } from 'components/hooks/useOnClickOutside';\r\n\r\ninterface CourseCataloguePluginProps {\r\n onSearch: (query: string, linkType: 'course' | 'programme') => void;\r\n searchResponse: SearchResponse;\r\n parentScrollPosition: number;\r\n}\r\n\r\nexport const CourseCataloguePlugin = ({\r\n onSearch,\r\n searchResponse,\r\n parentScrollPosition,\r\n}: CourseCataloguePluginProps) => {\r\n const [editor] = useLexicalComposerContext();\r\n const t = useTranslation();\r\n const [courseIsActive, setCourseIsActive] = useState(false);\r\n const [programmeIsActive, setProgrammeIsActive] = useState(false);\r\n const courseButtonRef = useRef<HTMLButtonElement>(null);\r\n const programmeButtonRef = useRef<HTMLButtonElement>(null);\r\n const flyoutRef = useRef<HTMLDivElement>(null);\r\n const [flyoutPosition, setFlyoutPosition] = useState<{ top: number; left: number } | null>(null);\r\n const [type, setType] = useState<'course' | 'programme'>('course');\r\n const isVisibleRef = useRef(flyoutPosition !== null);\r\n\r\n const openFlyout = (type: 'course' | 'programme') => {\r\n setType(type);\r\n const rect =\r\n type === 'course'\r\n ? courseButtonRef.current?.getBoundingClientRect()\r\n : programmeButtonRef.current?.getBoundingClientRect();\r\n if (rect) {\r\n setFlyoutPosition({ top: rect.bottom, left: rect.left });\r\n }\r\n };\r\n\r\n const closeFlyout = () => {\r\n onSearch('', type);\r\n setFlyoutPosition(null);\r\n };\r\n\r\n useEffect(() => {\r\n const removeKeyboardShortcut = editor.registerCommand(\r\n KEY_DOWN_COMMAND,\r\n (event: KeyboardEvent) => {\r\n if (event.ctrlKey && event.shiftKey && event.altKey && event.key === 'C') {\r\n event.preventDefault();\r\n openFlyout('course');\r\n return true;\r\n }\r\n if (event.ctrlKey && event.shiftKey && event.altKey && event.key === 'P') {\r\n event.preventDefault();\r\n openFlyout('programme');\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_CRITICAL\r\n );\r\n\r\n const removeStatusListener = editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const anchorNode = selection.anchor.getNode();\r\n const offset = selection.anchor.offset;\r\n\r\n if (\r\n $isTextNode(anchorNode) &&\r\n offset === anchorNode.getTextContentSize() &&\r\n anchorNode.getNextSibling() instanceof CourseCatalogueNode\r\n ) {\r\n // Cursor staat aan het begin van de link!\r\n const courseCatalogueLink = anchorNode.getNextSibling();\r\n if (courseCatalogueLink) {\r\n const linkType = $getLinkTypeFromNode(courseCatalogueLink);\r\n setCourseIsActive(linkType === 'course');\r\n setProgrammeIsActive(linkType === 'programme');\r\n return;\r\n }\r\n }\r\n\r\n const courseCatalogueLink = $getNearestNodeOfType(anchorNode, CourseCatalogueNode);\r\n if (courseCatalogueLink) {\r\n const linkType = $getLinkTypeFromNode(courseCatalogueLink);\r\n setCourseIsActive(linkType === 'course');\r\n setProgrammeIsActive(linkType === 'programme');\r\n return;\r\n }\r\n setCourseIsActive(false);\r\n setProgrammeIsActive(false);\r\n }\r\n });\r\n });\r\n\r\n const moveToEndOfWhiteSpace = (whiteSpace: TextNode) => {\r\n const selection = $createRangeSelection();\r\n const endOffset = whiteSpace.getTextContentSize();\r\n selection.setTextNodeRange(whiteSpace, endOffset, whiteSpace, endOffset);\r\n $setSelection(selection);\r\n };\r\n\r\n const isCursorBeforeLink = (anchorNode: LexicalNode, offset: number) =>\r\n $isTextNode(anchorNode) &&\r\n offset === anchorNode.getTextContentSize() &&\r\n anchorNode.getNextSibling() instanceof CourseCatalogueNode;\r\n\r\n const removeUnEditable = editor.registerCommand(\r\n KEY_DOWN_COMMAND,\r\n (event: KeyboardEvent) => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const key = event.key;\r\n const anchorNode = selection.anchor.getNode();\r\n const offset = selection.anchor.offset;\r\n let courseCatalogueLink = $getNearestNodeOfType(anchorNode, CourseCatalogueNode);\r\n\r\n // Detect if cursor is right before the link\r\n if (isCursorBeforeLink(anchorNode, offset)) {\r\n courseCatalogueLink = anchorNode.getNextSibling();\r\n }\r\n\r\n if (!courseCatalogueLink) {\r\n return false;\r\n }\r\n\r\n const nodeLength = courseCatalogueLink?.getTextContentSize();\r\n\r\n // Prevent Enter if in the middle of the link, allow only at start or end\r\n if (courseCatalogueLink && event.key === 'Enter') {\r\n event.preventDefault();\r\n editor.update(() => {\r\n if (isCursorBeforeLink(anchorNode, offset)) {\r\n const brNode = $createTextNode('\\n');\r\n courseCatalogueLink.insertBefore(brNode);\r\n }\r\n if (offset === nodeLength) {\r\n const brNode = $createTextNode('\\n');\r\n courseCatalogueLink.insertAfter(brNode);\r\n moveToEndOfWhiteSpace(brNode);\r\n }\r\n });\r\n return true;\r\n }\r\n\r\n // Allow add space before or after the link\r\n if (courseCatalogueLink && (key === ' ' || event.code === 'Space')) {\r\n event.preventDefault();\r\n editor.update(() => {\r\n const spaceToAdd = $createTextNode(' ');\r\n if (isCursorBeforeLink(anchorNode, offset)) {\r\n courseCatalogueLink.insertBefore(spaceToAdd);\r\n moveToEndOfWhiteSpace(spaceToAdd);\r\n }\r\n if (offset === nodeLength) {\r\n courseCatalogueLink.insertAfter(spaceToAdd);\r\n moveToEndOfWhiteSpace(spaceToAdd);\r\n }\r\n });\r\n return true;\r\n }\r\n\r\n // Delete link if selected and Backspace or Del is pressed\r\n if (courseCatalogueLink && (key === 'Backspace' || key === 'Delete')) {\r\n event.preventDefault();\r\n editor.update(\r\n () => {\r\n editor.dispatchCommand(REMOVE_COURSE_CATALOGUE_LINK, undefined);\r\n },\r\n { discrete: true }\r\n );\r\n return true;\r\n }\r\n\r\n // Allow Home, End and Arrow navigation\r\n if (\r\n courseCatalogueLink &&\r\n key !== 'ArrowLeft' &&\r\n key !== 'ArrowRight' &&\r\n key !== 'ArrowUp' &&\r\n key !== 'ArrowDown' &&\r\n key !== 'Home' &&\r\n key !== 'End' &&\r\n !(event.ctrlKey && (key.toLowerCase() === 'z' || key.toLowerCase() === 'y')) &&\r\n !(event.ctrlKey && key.toLowerCase() === 'c')\r\n ) {\r\n event.preventDefault();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_CRITICAL\r\n );\r\n\r\n const removeCopy = editor.registerCommand(\r\n COPY_COMMAND,\r\n (event: ClipboardEvent) => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const anchorNode = selection.anchor.getNode();\r\n const courseCatalogueLink = $getNearestNodeOfType(anchorNode, CourseCatalogueNode);\r\n if (courseCatalogueLink) {\r\n event.preventDefault();\r\n const domElement = editor.getElementByKey(courseCatalogueLink.getKey());\r\n if (domElement) {\r\n event.clipboardData?.setData('text/html', domElement.outerHTML);\r\n event.clipboardData?.setData('text/plain', courseCatalogueLink.getTextContent());\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW\r\n );\r\n return () => {\r\n removeKeyboardShortcut();\r\n removeStatusListener();\r\n removeUnEditable();\r\n removeCopy();\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [editor]);\r\n\r\n useOnClickOutside(flyoutRef as RefObject<HTMLElement>, () => setFlyoutPosition(null));\r\n\r\n const handleOnScroll = () => {\r\n closeFlyout();\r\n };\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerCommand(\r\n KEY_DOWN_COMMAND,\r\n (event: KeyboardEvent) => {\r\n if (event.key === 'Escape' && isVisibleRef.current) {\r\n event.preventDefault();\r\n closeFlyout();\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n\r\n editor.registerRootListener((rootElement, prevRootElement) => {\r\n if (prevRootElement) {\r\n prevRootElement.removeEventListener('scroll', handleOnScroll);\r\n }\r\n\r\n if (rootElement) {\r\n rootElement.addEventListener('scroll', handleOnScroll);\r\n }\r\n })\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [editor]);\r\n\r\n useEffect(() => {\r\n if (flyoutPosition) {\r\n closeFlyout();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [parentScrollPosition]);\r\n\r\n return (\r\n <div className={styles['editor__toolbar-button-group']}>\r\n <div className={styles['editor__toolbar-button-flyoutwrapper']}>\r\n <div className={styles['editor__toolbar-button-group--text']}>\r\n <button\r\n onClick={() => openFlyout('course')}\r\n title={t.cataloguelinks.courseTooltip}\r\n className={clsx(\r\n styles['editor__toolbar-button'],\r\n styles['editor__toolbar-button--text'],\r\n courseIsActive && styles[`editor__toolbar-button--active`]\r\n )}\r\n aria-label={t.aria.labels.courselink}\r\n aria-keyshortcuts={t.aria.keyshortcuts.courselink}\r\n type=\"button\"\r\n ref={courseButtonRef}\r\n >\r\n {t.cataloguelinks.courseButtonLabel}\r\n </button>\r\n <button\r\n onClick={() => openFlyout('programme')}\r\n title={t.cataloguelinks.programmeTooltip}\r\n className={clsx(\r\n styles['editor__toolbar-button'],\r\n styles['editor__toolbar-button--text'],\r\n programmeIsActive && styles[`editor__toolbar-button--active`]\r\n )}\r\n aria-label={t.aria.labels.programmelink}\r\n aria-keyshortcuts={t.aria.keyshortcuts.programmelink}\r\n type=\"button\"\r\n ref={programmeButtonRef}\r\n >\r\n {t.cataloguelinks.programmeButtonLabel}\r\n </button>\r\n </div>\r\n {flyoutPosition && (\r\n <div\r\n className={styles['editor__toolbar-flyout-wrapper']}\r\n style={{ top: flyoutPosition.top, left: flyoutPosition.left }}\r\n ref={flyoutRef}\r\n >\r\n <AddCatalogueLinkForm\r\n linkType={type}\r\n onCloseHandler={closeFlyout}\r\n onSearchHandler={onSearch}\r\n searchResponse={searchResponse}\r\n onSelect={(code, label, linkType) => {\r\n editor.dispatchCommand(INSERT_COURSE_CATALOGUE_LINK, {\r\n linkType,\r\n code,\r\n label,\r\n });\r\n closeFlyout();\r\n }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CourseCataloguePlugin.js","names":[],"sources":["../../../../../src/components/RteEditor/Plugins/CourseCataloguePlugin/CourseCataloguePlugin.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\r\nimport { clsx } from 'clsx';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $createRangeSelection,\r\n $createTextNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n $isTextNode,\r\n $setSelection,\r\n COMMAND_PRIORITY_CRITICAL,\r\n COMMAND_PRIORITY_LOW,\r\n COPY_COMMAND,\r\n KEY_DOWN_COMMAND,\r\n mergeRegister,\r\n} from 'lexical';\r\nimport { $getNearestNodeOfType } from '@lexical/utils';\r\n\r\nimport type { RefObject } from 'react';\r\nimport type { LexicalNode, TextNode } from 'lexical';\r\nimport type { SearchResponse } from './AddCatalogueLinkForm';\r\n\r\nimport { AddCatalogueLinkForm } from './AddCatalogueLinkForm';\r\n\r\nimport styles from 'components/RteEditor/RteEditor.module.css';\r\nimport { useTranslation } from 'components/RteEditor/hooks/useTranslation';\r\nimport {\r\n $getLinkTypeFromNode,\r\n CourseCatalogueNode,\r\n INSERT_COURSE_CATALOGUE_LINK,\r\n REMOVE_COURSE_CATALOGUE_LINK,\r\n} from 'components/RteEditor/nodes/CourseCatalogueNode';\r\nimport { useOnClickOutside } from 'components/hooks/useOnClickOutside';\r\n\r\ninterface CourseCataloguePluginProps {\r\n onSearch: (query: string, linkType: 'course' | 'programme') => void;\r\n searchResponse: SearchResponse;\r\n parentScrollPosition: number;\r\n}\r\n\r\nexport const CourseCataloguePlugin = ({\r\n onSearch,\r\n searchResponse,\r\n parentScrollPosition,\r\n}: CourseCataloguePluginProps) => {\r\n const [editor] = useLexicalComposerContext();\r\n const t = useTranslation();\r\n const [courseIsActive, setCourseIsActive] = useState(false);\r\n const [programmeIsActive, setProgrammeIsActive] = useState(false);\r\n const courseButtonRef = useRef<HTMLButtonElement>(null);\r\n const programmeButtonRef = useRef<HTMLButtonElement>(null);\r\n const flyoutRef = useRef<HTMLDivElement>(null);\r\n const [flyoutPosition, setFlyoutPosition] = useState<{ top: number; left: number } | null>(null);\r\n const [type, setType] = useState<'course' | 'programme'>('course');\r\n const isVisibleRef = useRef(flyoutPosition !== null);\r\n\r\n const openFlyout = (type: 'course' | 'programme') => {\r\n setType(type);\r\n const rect =\r\n type === 'course'\r\n ? courseButtonRef.current?.getBoundingClientRect()\r\n : programmeButtonRef.current?.getBoundingClientRect();\r\n if (rect) {\r\n setFlyoutPosition({ top: rect.bottom, left: rect.left });\r\n }\r\n };\r\n\r\n const closeFlyout = () => {\r\n onSearch('', type);\r\n setFlyoutPosition(null);\r\n };\r\n\r\n useEffect(() => {\r\n const removeKeyboardShortcut = editor.registerCommand(\r\n KEY_DOWN_COMMAND,\r\n (event: KeyboardEvent) => {\r\n if (event.ctrlKey && event.shiftKey && event.altKey && event.key === 'C') {\r\n event.preventDefault();\r\n openFlyout('course');\r\n return true;\r\n }\r\n if (event.ctrlKey && event.shiftKey && event.altKey && event.key === 'P') {\r\n event.preventDefault();\r\n openFlyout('programme');\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_CRITICAL\r\n );\r\n\r\n const removeStatusListener = editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const anchorNode = selection.anchor.getNode();\r\n const offset = selection.anchor.offset;\r\n\r\n if (\r\n $isTextNode(anchorNode) &&\r\n offset === anchorNode.getTextContentSize() &&\r\n anchorNode.getNextSibling() instanceof CourseCatalogueNode\r\n ) {\r\n // Cursor staat aan het begin van de link!\r\n const courseCatalogueLink = anchorNode.getNextSibling();\r\n if (courseCatalogueLink) {\r\n const linkType = $getLinkTypeFromNode(courseCatalogueLink);\r\n setCourseIsActive(linkType === 'course');\r\n setProgrammeIsActive(linkType === 'programme');\r\n return;\r\n }\r\n }\r\n\r\n const courseCatalogueLink = $getNearestNodeOfType(anchorNode, CourseCatalogueNode);\r\n if (courseCatalogueLink) {\r\n const linkType = $getLinkTypeFromNode(courseCatalogueLink);\r\n setCourseIsActive(linkType === 'course');\r\n setProgrammeIsActive(linkType === 'programme');\r\n return;\r\n }\r\n setCourseIsActive(false);\r\n setProgrammeIsActive(false);\r\n }\r\n });\r\n });\r\n\r\n const moveToEndOfWhiteSpace = (whiteSpace: TextNode) => {\r\n const selection = $createRangeSelection();\r\n const endOffset = whiteSpace.getTextContentSize();\r\n selection.setTextNodeRange(whiteSpace, endOffset, whiteSpace, endOffset);\r\n $setSelection(selection);\r\n };\r\n\r\n const isCursorBeforeLink = (anchorNode: LexicalNode, offset: number) =>\r\n $isTextNode(anchorNode) &&\r\n offset === anchorNode.getTextContentSize() &&\r\n anchorNode.getNextSibling() instanceof CourseCatalogueNode;\r\n\r\n const removeUnEditable = editor.registerCommand(\r\n KEY_DOWN_COMMAND,\r\n (event: KeyboardEvent) => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const key = event.key;\r\n const anchorNode = selection.anchor.getNode();\r\n const offset = selection.anchor.offset;\r\n let courseCatalogueLink = $getNearestNodeOfType(anchorNode, CourseCatalogueNode);\r\n\r\n // Detect if cursor is right before the link\r\n if (isCursorBeforeLink(anchorNode, offset)) {\r\n courseCatalogueLink = anchorNode.getNextSibling();\r\n }\r\n\r\n if (!courseCatalogueLink) {\r\n return false;\r\n }\r\n\r\n const nodeLength = courseCatalogueLink?.getTextContentSize();\r\n\r\n // Prevent Enter if in the middle of the link, allow only at start or end\r\n if (courseCatalogueLink && event.key === 'Enter') {\r\n event.preventDefault();\r\n editor.update(() => {\r\n if (isCursorBeforeLink(anchorNode, offset)) {\r\n const brNode = $createTextNode('\\n');\r\n courseCatalogueLink.insertBefore(brNode);\r\n }\r\n if (offset === nodeLength) {\r\n const brNode = $createTextNode('\\n');\r\n courseCatalogueLink.insertAfter(brNode);\r\n moveToEndOfWhiteSpace(brNode);\r\n }\r\n });\r\n return true;\r\n }\r\n\r\n // Allow add space before or after the link\r\n if (courseCatalogueLink && (key === ' ' || event.code === 'Space')) {\r\n event.preventDefault();\r\n editor.update(() => {\r\n const spaceToAdd = $createTextNode(' ');\r\n if (isCursorBeforeLink(anchorNode, offset)) {\r\n courseCatalogueLink.insertBefore(spaceToAdd);\r\n moveToEndOfWhiteSpace(spaceToAdd);\r\n }\r\n if (offset === nodeLength) {\r\n courseCatalogueLink.insertAfter(spaceToAdd);\r\n moveToEndOfWhiteSpace(spaceToAdd);\r\n }\r\n });\r\n return true;\r\n }\r\n\r\n // Delete link if selected and Backspace or Del is pressed\r\n if (courseCatalogueLink && (key === 'Backspace' || key === 'Delete')) {\r\n event.preventDefault();\r\n editor.update(\r\n () => {\r\n editor.dispatchCommand(REMOVE_COURSE_CATALOGUE_LINK, undefined);\r\n },\r\n { discrete: true }\r\n );\r\n return true;\r\n }\r\n\r\n // Allow Home, End and Arrow navigation\r\n if (\r\n courseCatalogueLink &&\r\n key !== 'ArrowLeft' &&\r\n key !== 'ArrowRight' &&\r\n key !== 'ArrowUp' &&\r\n key !== 'ArrowDown' &&\r\n key !== 'Home' &&\r\n key !== 'End' &&\r\n !(event.ctrlKey && (key.toLowerCase() === 'z' || key.toLowerCase() === 'y')) &&\r\n !(event.ctrlKey && key.toLowerCase() === 'c')\r\n ) {\r\n event.preventDefault();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_CRITICAL\r\n );\r\n\r\n const removeCopy = editor.registerCommand(\r\n COPY_COMMAND,\r\n (event: ClipboardEvent) => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const anchorNode = selection.anchor.getNode();\r\n const courseCatalogueLink = $getNearestNodeOfType(anchorNode, CourseCatalogueNode);\r\n if (courseCatalogueLink) {\r\n event.preventDefault();\r\n const domElement = editor.getElementByKey(courseCatalogueLink.getKey());\r\n if (domElement) {\r\n event.clipboardData?.setData('text/html', domElement.outerHTML);\r\n event.clipboardData?.setData('text/plain', courseCatalogueLink.getTextContent());\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW\r\n );\r\n return () => {\r\n removeKeyboardShortcut();\r\n removeStatusListener();\r\n removeUnEditable();\r\n removeCopy();\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [editor]);\r\n\r\n useOnClickOutside(flyoutRef as RefObject<HTMLElement>, () => setFlyoutPosition(null));\r\n\r\n const handleOnScroll = () => {\r\n closeFlyout();\r\n };\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerCommand(\r\n KEY_DOWN_COMMAND,\r\n (event: KeyboardEvent) => {\r\n if (event.key === 'Escape' && isVisibleRef.current) {\r\n event.preventDefault();\r\n closeFlyout();\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n\r\n editor.registerRootListener((rootElement, prevRootElement) => {\r\n if (prevRootElement) {\r\n prevRootElement.removeEventListener('scroll', handleOnScroll);\r\n }\r\n\r\n if (rootElement) {\r\n rootElement.addEventListener('scroll', handleOnScroll);\r\n }\r\n })\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [editor]);\r\n\r\n useEffect(() => {\r\n if (flyoutPosition) {\r\n closeFlyout();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [parentScrollPosition]);\r\n\r\n return (\r\n <div className={styles['editor__toolbar-button-group']}>\r\n <div className={styles['editor__toolbar-button-flyoutwrapper']}>\r\n <div className={styles['editor__toolbar-button-group--text']}>\r\n <button\r\n onClick={() => openFlyout('course')}\r\n title={t.cataloguelinks.courseTooltip}\r\n className={clsx(\r\n styles['editor__toolbar-button'],\r\n styles['editor__toolbar-button--text'],\r\n courseIsActive && styles[`editor__toolbar-button--active`]\r\n )}\r\n aria-label={t.aria.labels.courselink}\r\n aria-keyshortcuts={t.aria.keyshortcuts.courselink}\r\n type=\"button\"\r\n ref={courseButtonRef}\r\n >\r\n {t.cataloguelinks.courseButtonLabel}\r\n </button>\r\n <button\r\n onClick={() => openFlyout('programme')}\r\n title={t.cataloguelinks.programmeTooltip}\r\n className={clsx(\r\n styles['editor__toolbar-button'],\r\n styles['editor__toolbar-button--text'],\r\n programmeIsActive && styles[`editor__toolbar-button--active`]\r\n )}\r\n aria-label={t.aria.labels.programmelink}\r\n aria-keyshortcuts={t.aria.keyshortcuts.programmelink}\r\n type=\"button\"\r\n ref={programmeButtonRef}\r\n >\r\n {t.cataloguelinks.programmeButtonLabel}\r\n </button>\r\n </div>\r\n {flyoutPosition && (\r\n <div\r\n className={styles['editor__toolbar-flyout-wrapper']}\r\n style={{ top: flyoutPosition.top, left: flyoutPosition.left }}\r\n ref={flyoutRef}\r\n >\r\n <AddCatalogueLinkForm\r\n linkType={type}\r\n onCloseHandler={closeFlyout}\r\n onSearchHandler={onSearch}\r\n searchResponse={searchResponse}\r\n onSelect={(code, label, linkType) => {\r\n editor.dispatchCommand(INSERT_COURSE_CATALOGUE_LINK, {\r\n linkType,\r\n code,\r\n label,\r\n });\r\n closeFlyout();\r\n }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as e } from "../../../../../LinkContextMenu-
|
|
1
|
+
import { t as e } from "../../../../../LinkContextMenu-ePn1iZ_z.js";
|
|
2
2
|
export { e as LinkContextMenu };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { i as e, n as t, r as n, t as r } from "../../../../helpers-
|
|
1
|
+
import { i as e, n as t, r as n, t as r } from "../../../../helpers-B1VK8xTF.js";
|
|
2
2
|
export { r as MATCHERS, t as ensureHttps, n as validateUrl, e as validateUrlWithProtocol };
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { t as e } from "../../../../clsx-BD2qMUU1.js";
|
|
2
2
|
import { Icon as t } from "../../../Icon/Icon.js";
|
|
3
3
|
import { t as n } from "../../../../LexicalComposerContext.prod-Ca-YN_fj.js";
|
|
4
|
-
import {
|
|
5
|
-
import { s } from "../../../../LexicalUtils.prod-
|
|
6
|
-
import { a as c,
|
|
7
|
-
import { t as h } from "../../../../RteEditor.module-
|
|
4
|
+
import { g as r, ot as i, v as a, zn as o } from "../../../../Lexical.prod-CqPLSi0R.js";
|
|
5
|
+
import { n as s } from "../../../../LexicalUtils.prod-BqcriFWV.js";
|
|
6
|
+
import { a as c, c as l, i as u, l as d, n as f, o as p, t as m } from "../../../../LexicalList.prod-eYlcb5Ao.js";
|
|
7
|
+
import { t as h } from "../../../../RteEditor.module-BJLUYSpf.js";
|
|
8
8
|
import { useTranslation as g } from "../../hooks/useTranslation.js";
|
|
9
9
|
import { useEffect as _, useState as v } from "react";
|
|
10
10
|
import { jsx as y } from "react/jsx-runtime";
|
|
@@ -14,10 +14,10 @@ var b = {
|
|
|
14
14
|
number: "NumberedList"
|
|
15
15
|
}, x = ["bullet", "number"], S = () => {
|
|
16
16
|
let S = g(), [C] = n(), [w, T] = v(null), [E, D] = v(!1), [O, k] = v(!1), A = (e) => {
|
|
17
|
-
e === "number" && w !== "number" ? (C.dispatchCommand(
|
|
17
|
+
e === "number" && w !== "number" ? (C.dispatchCommand(u, void 0), T("number")) : e === "bullet" && w !== "bullet" ? (C.dispatchCommand(f, void 0), T("bullet")) : (C.dispatchCommand(m, void 0), T(null));
|
|
18
18
|
};
|
|
19
19
|
return _(() => {
|
|
20
|
-
let e = C.registerCommand(
|
|
20
|
+
let e = C.registerCommand(o, (e) => e.ctrlKey && e.shiftKey && e.code === "Digit7" ? (e.preventDefault(), O ? C.dispatchCommand(m, void 0) : C.dispatchCommand(u, void 0), !0) : e.ctrlKey && e.shiftKey && e.code === "Digit8" ? (e.preventDefault(), E ? C.dispatchCommand(m, void 0) : C.dispatchCommand(f, void 0), !0) : !1, 4);
|
|
21
21
|
return () => {
|
|
22
22
|
e();
|
|
23
23
|
};
|
|
@@ -26,21 +26,21 @@ var b = {
|
|
|
26
26
|
O,
|
|
27
27
|
E
|
|
28
28
|
]), _(() => {
|
|
29
|
-
let e = C.registerCommand(
|
|
30
|
-
let e =
|
|
31
|
-
if (!
|
|
29
|
+
let e = C.registerCommand(r, (e) => (e.preventDefault(), C.update(() => {
|
|
30
|
+
let e = i();
|
|
31
|
+
if (!a(e)) return;
|
|
32
32
|
let t = e.anchor.getNode(), n = t.getParent();
|
|
33
|
-
if (!
|
|
34
|
-
let
|
|
35
|
-
if (
|
|
36
|
-
let e = p(
|
|
33
|
+
if (!d(n)) return;
|
|
34
|
+
let r = n.getParent();
|
|
35
|
+
if (c(r)) {
|
|
36
|
+
let e = p(c(r) ? r.getListType() : "bullet");
|
|
37
37
|
n.append(e), e.append(t);
|
|
38
38
|
}
|
|
39
39
|
}), !0), 1), t = C.registerUpdateListener(({ editorState: e }) => {
|
|
40
40
|
e.read(() => {
|
|
41
|
-
let e =
|
|
42
|
-
if (
|
|
43
|
-
let t = s(e.anchor.getNode(),
|
|
41
|
+
let e = i();
|
|
42
|
+
if (a(e)) {
|
|
43
|
+
let t = s(e.anchor.getNode(), l);
|
|
44
44
|
if (t) {
|
|
45
45
|
let e = t.getTag();
|
|
46
46
|
D(e === "ul"), k(e === "ol"), e === "ul" && T("bullet"), e === "ol" && T("number");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListPlugin.js","names":[],"sources":["../../../../../src/components/RteEditor/Plugins/ListPlugin/ListPlugin.tsx"],"sourcesContent":["import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport {\n $createListNode,\n $isListItemNode,\n $isListNode,\n INSERT_ORDERED_LIST_COMMAND,\n INSERT_UNORDERED_LIST_COMMAND,\n ListNode,\n REMOVE_LIST_COMMAND,\n} from '@lexical/list';\nimport { useEffect, useState } from 'react';\nimport { clsx } from 'clsx';\nimport {\n $getSelection,\n $isRangeSelection,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_LOW,\n KEY_DOWN_COMMAND,\n KEY_TAB_COMMAND,\n} from 'lexical';\nimport { $getNearestNodeOfType } from '@lexical/utils';\n\nimport type { RangeSelection } from 'lexical';\n\nimport { Icon } from 'components/Icon';\nimport styles from 'components/RteEditor/RteEditor.module.css';\nimport { useTranslation } from 'components/RteEditor/hooks/useTranslation';\n\ntype ListTypesType = 'bullet' | 'number' | null;\nconst LIST_TYPE_ICONS = {\n bullet: 'BulletList',\n number: 'NumberedList',\n};\n\nconst ListTypes = ['bullet', 'number'];\n\nexport const ListPlugin = () => {\n const t = useTranslation();\n const [editor] = useLexicalComposerContext();\n const [blockType, setBlockType] = useState<ListTypesType>(null);\n const [isUList, setIsUList] = useState<boolean>(false);\n const [isOList, setIsOList] = useState<boolean>(false);\n\n const formatList = (listType: ListTypesType): void => {\n if (listType === 'number' && blockType !== 'number') {\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined);\n setBlockType('number');\n } else if (listType === 'bullet' && blockType !== 'bullet') {\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined);\n setBlockType('bullet');\n } else {\n editor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n setBlockType(null);\n }\n };\n\n useEffect(() => {\n const removeKeyboardShortcut = editor.registerCommand(\n KEY_DOWN_COMMAND,\n (event: KeyboardEvent) => {\n if (event.ctrlKey && event.shiftKey && event.code === 'Digit7') {\n event.preventDefault();\n if (isOList) {\n editor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n } else {\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined);\n }\n return true;\n }\n if (event.ctrlKey && event.shiftKey && event.code === 'Digit8') {\n event.preventDefault();\n if (isUList) {\n editor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n } else {\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined);\n }\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n );\n\n return () => {\n removeKeyboardShortcut();\n };\n }, [editor, isOList, isUList]);\n\n useEffect(() => {\n const removeTabCommand = editor.registerCommand(\n KEY_TAB_COMMAND,\n (event) => {\n event.preventDefault();\n editor.update(() => {\n const selection = $getSelection() as RangeSelection;\n if (!$isRangeSelection(selection)) {\n return;\n }\n\n const currentNode = selection.anchor.getNode();\n const parent = currentNode.getParent();\n if (!$isListItemNode(parent)) {\n return;\n }\n\n const listParent = parent.getParent();\n if ($isListNode(listParent)) {\n const newList = $createListNode($isListNode(listParent) ? listParent.getListType() : 'bullet');\n parent.append(newList);\n newList.append(currentNode);\n }\n });\n return true;\n },\n COMMAND_PRIORITY_LOW\n );\n\n const removeStatusListener = editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const anchorNode = selection.anchor.getNode();\n const listNode = $getNearestNodeOfType(anchorNode, ListNode);\n if (listNode) {\n const tag = listNode.getTag();\n setIsUList(tag === 'ul');\n setIsOList(tag === 'ol');\n if (tag === 'ul') {\n setBlockType('bullet');\n }\n if (tag === 'ol') {\n setBlockType('number');\n }\n return;\n }\n setIsUList(false);\n setIsOList(false);\n setBlockType(null);\n }\n return false;\n });\n });\n\n return () => {\n removeStatusListener();\n removeTabCommand();\n };\n }, [editor]);\n\n return (\n <div className={styles['editor__toolbar-button-group']}>\n {ListTypes.map((listType) => (\n <button\n onClick={() => formatList(listType as ListTypesType)}\n key={listType}\n title={t.format[`${listType}Tooltip` as keyof typeof t.format]}\n className={clsx(\n styles['editor__toolbar-button'],\n styles[`editor__toolbar-button--${listType}`],\n listType === 'bullet' && isUList && styles['editor__toolbar-button--active'],\n listType === 'number' && isOList && styles['editor__toolbar-button--active']\n )}\n aria-label={t.aria.labels[listType as keyof typeof t.aria.labels]}\n aria-keyshortcuts={t.aria.keyshortcuts[listType as keyof typeof t.aria.keyshortcuts]}\n type=\"button\"\n >\n <Icon name={LIST_TYPE_ICONS[listType as keyof typeof Icon]} size={24} />\n </button>\n ))}\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;AA6BA,IAAM,IAAkB;CACtB,QAAQ;CACR,QAAQ;CACT,EAEK,IAAY,CAAC,UAAU,SAAS,EAEzB,UAAmB;CAC9B,IAAM,IAAI,GAAgB,EACpB,CAAC,KAAU,GAA2B,EACtC,CAAC,GAAW,KAAgB,EAAwB,KAAK,EACzD,CAAC,GAAS,KAAc,EAAkB,GAAM,EAChD,CAAC,GAAS,KAAc,EAAkB,GAAM,EAEhD,KAAc,MAAkC;AACpD,EAAI,MAAa,YAAY,MAAc,YACzC,EAAO,gBAAgB,GAA6B,KAAA,EAAU,EAC9D,EAAa,SAAS,IACb,MAAa,YAAY,MAAc,YAChD,EAAO,gBAAgB,GAA+B,KAAA,EAAU,EAChE,EAAa,SAAS,KAEtB,EAAO,gBAAgB,GAAqB,KAAA,EAAU,EACtD,EAAa,KAAK;;AAiGtB,QA7FA,QAAgB;EACd,IAAM,IAAyB,EAAO,gBACpC,IACC,MACK,EAAM,WAAW,EAAM,YAAY,EAAM,SAAS,YACpD,EAAM,gBAAgB,EAClB,IACF,EAAO,gBAAgB,GAAqB,KAAA,EAAU,GAEtD,EAAO,gBAAgB,GAA6B,KAAA,EAAU,EAEzD,MAEL,EAAM,WAAW,EAAM,YAAY,EAAM,SAAS,YACpD,EAAM,gBAAgB,EAClB,IACF,EAAO,gBAAgB,GAAqB,KAAA,EAAU,GAEtD,EAAO,gBAAgB,GAA+B,KAAA,EAAU,EAE3D,MAEF,MAGV;AAED,eAAa;AACX,MAAwB;;IAEzB;EAAC;EAAQ;EAAS;EAAQ,CAAC,EAE9B,QAAgB;EACd,IAAM,IAAmB,EAAO,gBAC9B,IACC,OACC,EAAM,gBAAgB,EACtB,EAAO,aAAa;GAClB,IAAM,IAAY,GAAe;AACjC,OAAI,CAAC,EAAkB,EAAU,CAC/B;GAGF,IAAM,IAAc,EAAU,OAAO,SAAS,EACxC,IAAS,EAAY,WAAW;AACtC,OAAI,CAAC,EAAgB,EAAO,CAC1B;GAGF,IAAM,IAAa,EAAO,WAAW;AACrC,OAAI,EAAY,EAAW,EAAE;IAC3B,IAAM,IAAU,EAAgB,EAAY,EAAW,GAAG,EAAW,aAAa,GAAG,SAAS;AAE9F,IADA,EAAO,OAAO,EAAQ,EACtB,EAAQ,OAAO,EAAY;;IAE7B,EACK,OAGV,EAEK,IAAuB,EAAO,wBAAwB,EAAE,qBAAkB;AAC9E,KAAY,WAAW;IACrB,IAAM,IAAY,GAAe;AACjC,QAAI,EAAkB,EAAU,EAAE;KAEhC,IAAM,IAAW,EADE,EAAU,OAAO,
|
|
1
|
+
{"version":3,"file":"ListPlugin.js","names":[],"sources":["../../../../../src/components/RteEditor/Plugins/ListPlugin/ListPlugin.tsx"],"sourcesContent":["import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport {\n $createListNode,\n $isListItemNode,\n $isListNode,\n INSERT_ORDERED_LIST_COMMAND,\n INSERT_UNORDERED_LIST_COMMAND,\n ListNode,\n REMOVE_LIST_COMMAND,\n} from '@lexical/list';\nimport { useEffect, useState } from 'react';\nimport { clsx } from 'clsx';\nimport {\n $getSelection,\n $isRangeSelection,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_LOW,\n KEY_DOWN_COMMAND,\n KEY_TAB_COMMAND,\n} from 'lexical';\nimport { $getNearestNodeOfType } from '@lexical/utils';\n\nimport type { RangeSelection } from 'lexical';\n\nimport { Icon } from 'components/Icon';\nimport styles from 'components/RteEditor/RteEditor.module.css';\nimport { useTranslation } from 'components/RteEditor/hooks/useTranslation';\n\ntype ListTypesType = 'bullet' | 'number' | null;\nconst LIST_TYPE_ICONS = {\n bullet: 'BulletList',\n number: 'NumberedList',\n};\n\nconst ListTypes = ['bullet', 'number'];\n\nexport const ListPlugin = () => {\n const t = useTranslation();\n const [editor] = useLexicalComposerContext();\n const [blockType, setBlockType] = useState<ListTypesType>(null);\n const [isUList, setIsUList] = useState<boolean>(false);\n const [isOList, setIsOList] = useState<boolean>(false);\n\n const formatList = (listType: ListTypesType): void => {\n if (listType === 'number' && blockType !== 'number') {\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined);\n setBlockType('number');\n } else if (listType === 'bullet' && blockType !== 'bullet') {\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined);\n setBlockType('bullet');\n } else {\n editor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n setBlockType(null);\n }\n };\n\n useEffect(() => {\n const removeKeyboardShortcut = editor.registerCommand(\n KEY_DOWN_COMMAND,\n (event: KeyboardEvent) => {\n if (event.ctrlKey && event.shiftKey && event.code === 'Digit7') {\n event.preventDefault();\n if (isOList) {\n editor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n } else {\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined);\n }\n return true;\n }\n if (event.ctrlKey && event.shiftKey && event.code === 'Digit8') {\n event.preventDefault();\n if (isUList) {\n editor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n } else {\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined);\n }\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n );\n\n return () => {\n removeKeyboardShortcut();\n };\n }, [editor, isOList, isUList]);\n\n useEffect(() => {\n const removeTabCommand = editor.registerCommand(\n KEY_TAB_COMMAND,\n (event) => {\n event.preventDefault();\n editor.update(() => {\n const selection = $getSelection() as RangeSelection;\n if (!$isRangeSelection(selection)) {\n return;\n }\n\n const currentNode = selection.anchor.getNode();\n const parent = currentNode.getParent();\n if (!$isListItemNode(parent)) {\n return;\n }\n\n const listParent = parent.getParent();\n if ($isListNode(listParent)) {\n const newList = $createListNode($isListNode(listParent) ? listParent.getListType() : 'bullet');\n parent.append(newList);\n newList.append(currentNode);\n }\n });\n return true;\n },\n COMMAND_PRIORITY_LOW\n );\n\n const removeStatusListener = editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const anchorNode = selection.anchor.getNode();\n const listNode = $getNearestNodeOfType(anchorNode, ListNode);\n if (listNode) {\n const tag = listNode.getTag();\n setIsUList(tag === 'ul');\n setIsOList(tag === 'ol');\n if (tag === 'ul') {\n setBlockType('bullet');\n }\n if (tag === 'ol') {\n setBlockType('number');\n }\n return;\n }\n setIsUList(false);\n setIsOList(false);\n setBlockType(null);\n }\n return false;\n });\n });\n\n return () => {\n removeStatusListener();\n removeTabCommand();\n };\n }, [editor]);\n\n return (\n <div className={styles['editor__toolbar-button-group']}>\n {ListTypes.map((listType) => (\n <button\n onClick={() => formatList(listType as ListTypesType)}\n key={listType}\n title={t.format[`${listType}Tooltip` as keyof typeof t.format]}\n className={clsx(\n styles['editor__toolbar-button'],\n styles[`editor__toolbar-button--${listType}`],\n listType === 'bullet' && isUList && styles['editor__toolbar-button--active'],\n listType === 'number' && isOList && styles['editor__toolbar-button--active']\n )}\n aria-label={t.aria.labels[listType as keyof typeof t.aria.labels]}\n aria-keyshortcuts={t.aria.keyshortcuts[listType as keyof typeof t.aria.keyshortcuts]}\n type=\"button\"\n >\n <Icon name={LIST_TYPE_ICONS[listType as keyof typeof Icon]} size={24} />\n </button>\n ))}\n </div>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as e } from "../../../../PasteHandlerPlugin-
|
|
1
|
+
import { t as e } from "../../../../PasteHandlerPlugin-BNp8ST0q.js";
|
|
2
2
|
export { e as PasteHandlerPlugin };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as e } from "../../../../PasteHandlerPlugin-
|
|
1
|
+
import { t as e } from "../../../../PasteHandlerPlugin-BNp8ST0q.js";
|
|
2
2
|
export { e as PasteHandlerPlugin };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as e } from "../../../../TableCellResizerPlugin-
|
|
1
|
+
import { t as e } from "../../../../TableCellResizerPlugin-Bc5y-Qbx.js";
|
|
2
2
|
export { e as TableCellResizerPlugin };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as e } from "../../../../TableCellResizerPlugin-
|
|
1
|
+
import { t as e } from "../../../../TableCellResizerPlugin-Bc5y-Qbx.js";
|
|
2
2
|
export { e as TableCellResizerPlugin };
|
|
@@ -1,50 +1,50 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { Gt as e } from "../../../../Lexical.prod-CqPLSi0R.js";
|
|
2
|
+
import { C as t, S as n, _ as r, a as i, d as a, f as o, m as s, t as c, u as l, v as u, x as d, y as f } from "../../../../LexicalTable.prod-DlOxUQou.js";
|
|
3
3
|
import { TableWrapperNode as p } from "../../nodes/TableWrapperNode/TableWrapperNode.js";
|
|
4
4
|
//#region src/components/RteEditor/Plugins/TablePlugin/helpers.ts
|
|
5
|
-
var m = 32, h = 48, g = 1, _ = 200, v = 320, y = (t,
|
|
6
|
-
let
|
|
7
|
-
for (let
|
|
8
|
-
let t =
|
|
9
|
-
for (let
|
|
5
|
+
var m = 32, h = 48, g = 1, _ = 200, v = 320, y = (t, n) => {
|
|
6
|
+
let r = s(0, 0, !1);
|
|
7
|
+
for (let i = 0; i < t; i++) {
|
|
8
|
+
let t = l();
|
|
9
|
+
for (let r = 0; r < n; r++) {
|
|
10
10
|
let n = c(0, void 0, void 0);
|
|
11
11
|
n.append(e()), t.append(n);
|
|
12
12
|
}
|
|
13
|
-
|
|
13
|
+
r.append(t);
|
|
14
14
|
}
|
|
15
|
-
return
|
|
15
|
+
return r;
|
|
16
16
|
}, b = (e) => {
|
|
17
|
-
let t =
|
|
18
|
-
if (
|
|
19
|
-
let e =
|
|
17
|
+
let t = n(e), r = t.getNextSibling() || t.getPreviousSibling(), i = t.getParentOrThrow();
|
|
18
|
+
if (i.getChildrenSize() > 1 ? t.remove() : i.remove(), r !== null) {
|
|
19
|
+
let e = r.getFirstDescendant();
|
|
20
20
|
e && e.select();
|
|
21
21
|
}
|
|
22
22
|
}, x = (e) => {
|
|
23
|
-
let
|
|
24
|
-
if (!
|
|
25
|
-
let
|
|
26
|
-
|
|
23
|
+
let t = u(e);
|
|
24
|
+
if (!t) throw Error("Selected node is not a TableCellNode");
|
|
25
|
+
let n = t.getParent();
|
|
26
|
+
n instanceof p ? n.remove() : t.remove();
|
|
27
27
|
}, S = (e, t) => {
|
|
28
|
-
if (!
|
|
29
|
-
let n =
|
|
28
|
+
if (!o(e)) throw Error("Selected node is not a TableCellNode");
|
|
29
|
+
let n = l();
|
|
30
30
|
d(t === "insertRowBelow");
|
|
31
31
|
let r = n.getFirstDescendant();
|
|
32
32
|
r && r.select();
|
|
33
|
-
}, C = (e,
|
|
34
|
-
if (!
|
|
35
|
-
let
|
|
36
|
-
if (!
|
|
37
|
-
let d =
|
|
33
|
+
}, C = (e, n) => {
|
|
34
|
+
if (!o(e)) throw Error("Selected node is not a TableCellNode");
|
|
35
|
+
let r = f(e), s = i(e), c = r.getChildren(), l = a(e), u = t(n === "insertColumnLeft");
|
|
36
|
+
if (!u) return;
|
|
37
|
+
let d = i(u);
|
|
38
38
|
if (d === -1) return;
|
|
39
|
-
let p =
|
|
39
|
+
let p = r.getColWidths();
|
|
40
40
|
if (!p) return;
|
|
41
41
|
let m = p.map((e, t) => t === d ? 48 : e - Math.ceil(48 / (p.length - 1)));
|
|
42
|
-
|
|
43
|
-
let h =
|
|
42
|
+
r.setColWidths(m), s = n === "insertColumnLeft" ? s : s + 1;
|
|
43
|
+
let h = c[l].getChildren()[s];
|
|
44
44
|
h && h.select();
|
|
45
45
|
}, w = (e) => {
|
|
46
|
-
if (!
|
|
47
|
-
(f(e).getFirstChild()?.getChildrenSize() || 0) === 1 ? x(e) :
|
|
46
|
+
if (!o(e)) throw Error("Selected node is not a TableCellNode");
|
|
47
|
+
(f(e).getFirstChild()?.getChildrenSize() || 0) === 1 ? x(e) : r();
|
|
48
48
|
}, T = (e) => {
|
|
49
49
|
let t = e.getRootElement();
|
|
50
50
|
if (!t || typeof window > "u") return 0;
|
|
@@ -60,7 +60,7 @@ var m = 32, h = 48, g = 1, _ = 200, v = 320, y = (t, r) => {
|
|
|
60
60
|
let t = e.getChildren();
|
|
61
61
|
for (let e of t) {
|
|
62
62
|
let t = e.getChildren();
|
|
63
|
-
for (let e of t) if (
|
|
63
|
+
for (let e of t) if (o(e) && e.getTextContent().trim().length > 0) return !0;
|
|
64
64
|
}
|
|
65
65
|
return !1;
|
|
66
66
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","names":[],"sources":["../../../../../src/components/RteEditor/Plugins/TablePlugin/helpers.ts"],"sourcesContent":["import {\n $createTableNodeWithDimensions,\n $createTableRowNode,\n $createTableCellNode,\n $deleteTableColumnAtSelection,\n $isTableCellNode,\n $getTableNodeFromLexicalNodeOrThrow,\n $getTableRowNodeFromTableCellNodeOrThrow,\n $getTableRowIndexFromTableCellNode,\n $getTableColumnIndexFromTableCellNode,\n $insertTableColumnAtSelection,\n $insertTableRowAtSelection,\n $findTableNode,\n} from '@lexical/table';\nimport { $createParagraphNode } from 'lexical';\n\nimport type { TableCellNode, TableNode, TableRowNode } from '@lexical/table';\nimport type { TextNode, ElementNode, LexicalEditor } from 'lexical';\n\nimport { TableWrapperNode } from 'components/RteEditor/nodes';\n\nexport const MIN_COLUMN_WIDTH = 32;\nexport const DEFAULT_COL_WIDTH = 48;\nexport const BORDER_WIDTHS = 1;\nexport const PREVENT_OPEN_DELAY = 200;\nexport const DEFAULT_EDITOR_WIDTH = 320;\n\nexport const createTable = (nrOfRows: number, nrOfColumns: number): ElementNode => {\n const tableNode = $createTableNodeWithDimensions(0, 0, false);\n for (let rowIndex = 0; rowIndex < nrOfRows; rowIndex++) {\n const rowNode = $createTableRowNode();\n for (let colIndex = 0; colIndex < nrOfColumns; colIndex++) {\n const cellNode = $createTableCellNode(0, undefined, undefined);\n cellNode.append($createParagraphNode());\n rowNode.append(cellNode);\n }\n tableNode.append(rowNode);\n }\n return tableNode;\n};\n\nexport const deleteRow = (selectedNode: ElementNode) => {\n const currentRow = $getTableRowNodeFromTableCellNodeOrThrow(selectedNode);\n const nextRow = currentRow.getNextSibling() || currentRow.getPreviousSibling();\n const currentTable = currentRow.getParentOrThrow();\n currentTable.getChildrenSize() > 1 ? currentRow.remove() : currentTable.remove();\n\n if (nextRow !== null) {\n const firstDescendant = (nextRow as ElementNode).getFirstDescendant();\n if (firstDescendant) {\n (firstDescendant as TextNode).select();\n }\n }\n};\n\nexport const deleteTable = (selectedNode: ElementNode) => {\n const tableNode = $findTableNode(selectedNode);\n if (!tableNode) {\n throw new Error('Selected node is not a TableCellNode');\n }\n\n const wrapperNode = tableNode.getParent();\n if (wrapperNode instanceof TableWrapperNode) {\n wrapperNode.remove();\n } else {\n tableNode.remove();\n }\n};\n\nexport const insertRow = (selectedNode: ElementNode, position: 'insertRowAbove' | 'insertRowBelow') => {\n if (!$isTableCellNode(selectedNode)) {\n throw new Error('Selected node is not a TableCellNode');\n }\n const newRow = $createTableRowNode();\n\n $insertTableRowAtSelection(position === 'insertRowBelow');\n\n const firstDescendant = newRow.getFirstDescendant();\n if (firstDescendant) {\n (firstDescendant as TextNode).select();\n }\n};\n\nexport const insertColumn = (selectedNode: ElementNode, position: 'insertColumnLeft' | 'insertColumnRight') => {\n if (!$isTableCellNode(selectedNode)) {\n throw new Error('Selected node is not a TableCellNode');\n }\n const currentTable = $getTableNodeFromLexicalNodeOrThrow(selectedNode);\n let columnIndex = $getTableColumnIndexFromTableCellNode(selectedNode);\n const rowsInTable: TableCellNode[] = currentTable.getChildren();\n const rowIndex = $getTableRowIndexFromTableCellNode(selectedNode);\n const insertedCellNode = $insertTableColumnAtSelection(position === 'insertColumnLeft');\n\n if (!insertedCellNode) return;\n const insertedColumnIndex = $getTableColumnIndexFromTableCellNode(insertedCellNode);\n\n if (insertedColumnIndex === -1) return;\n const colWidths = currentTable.getColWidths();\n\n if (!colWidths) return;\n const newColWidths = colWidths.map((width, index) =>\n index === insertedColumnIndex ? DEFAULT_COL_WIDTH : width - Math.ceil(DEFAULT_COL_WIDTH / (colWidths.length - 1))\n );\n\n currentTable.setColWidths(newColWidths);\n\n columnIndex = position === 'insertColumnLeft' ? columnIndex : columnIndex + 1;\n const firstDescendant = rowsInTable[rowIndex].getChildren()[columnIndex];\n if (firstDescendant) {\n (firstDescendant as TextNode).select();\n }\n};\n\nexport const deleteColumn = (selectedNode: ElementNode) => {\n if (!$isTableCellNode(selectedNode)) {\n throw new Error('Selected node is not a TableCellNode');\n }\n const currentTable = $getTableNodeFromLexicalNodeOrThrow(selectedNode);\n const numberOfColumns = (currentTable.getFirstChild() as ElementNode)?.getChildrenSize() || 0;\n\n if (numberOfColumns === 1) {\n deleteTable(selectedNode);\n } else {\n $deleteTableColumnAtSelection();\n }\n};\n\nexport const getEditorContentWidth = (editor: LexicalEditor): number => {\n const rootEl = editor.getRootElement();\n if (!rootEl || typeof window === 'undefined') return 0;\n const rect = rootEl.getBoundingClientRect();\n const styles = window.getComputedStyle(rootEl);\n const insertX = parseFloat(styles.paddingLeft || '0') + parseFloat(styles.paddingRight || '0') + DEFAULT_COL_WIDTH;\n return Math.max(0, rect.width - insertX);\n};\n\nexport const getEditorParrentCellWidth = (\n node: TableCellNode | null,\n nrOfColumns: number,\n editor: LexicalEditor\n): number => {\n if (!node) return 0;\n\n const cell = editor.getElementByKey(node.getKey());\n if (!cell) return 0;\n\n const computedStyles = window.getComputedStyle(cell);\n return parseInt(computedStyles.width) - nrOfColumns * BORDER_WIDTHS - 1;\n};\n\nexport const tableHasContent = (tableNode: TableNode): boolean => {\n const rows = tableNode.getChildren();\n for (const row of rows) {\n const cells = (row as TableRowNode).getChildren();\n for (const cell of cells) {\n if ($isTableCellNode(cell)) {\n const cellText = cell.getTextContent().trim();\n if (cellText.length > 0) {\n return true;\n }\n }\n }\n }\n return false;\n};\n"],"mappings":";;;;AAqBA,IAAa,IAAmB,IACnB,IAAoB,IACpB,IAAgB,GAChB,IAAqB,KACrB,IAAuB,KAEvB,KAAe,GAAkB,MAAqC;CACjF,IAAM,IAAY,EAA+B,GAAG,GAAG,GAAM;AAC7D,MAAK,IAAI,IAAW,GAAG,IAAW,GAAU,KAAY;EACtD,IAAM,IAAU,GAAqB;AACrC,OAAK,IAAI,IAAW,GAAG,IAAW,GAAa,KAAY;GACzD,IAAM,IAAW,EAAqB,GAAG,KAAA,GAAW,KAAA,EAAU;AAE9D,GADA,EAAS,OAAO,GAAsB,CAAC,EACvC,EAAQ,OAAO,EAAS;;AAE1B,IAAU,OAAO,EAAQ;;AAE3B,QAAO;GAGI,KAAa,MAA8B;CACtD,IAAM,IAAa,EAAyC,EAAa,EACnE,IAAU,EAAW,gBAAgB,IAAI,EAAW,oBAAoB,EACxE,IAAe,EAAW,kBAAkB;AAGlD,KAFA,EAAa,iBAAiB,GAAG,IAAI,EAAW,QAAQ,GAAG,EAAa,QAAQ,EAE5E,MAAY,MAAM;EACpB,IAAM,IAAmB,EAAwB,oBAAoB;AACrE,EAAI,KACD,EAA6B,QAAQ;;GAK/B,KAAe,MAA8B;CACxD,IAAM,IAAY,EAAe,EAAa;AAC9C,KAAI,CAAC,EACH,OAAU,MAAM,uCAAuC;CAGzD,IAAM,IAAc,EAAU,WAAW;AACzC,CAAI,aAAuB,IACzB,EAAY,QAAQ,GAEpB,EAAU,QAAQ;GAIT,KAAa,GAA2B,MAAkD;AACrG,KAAI,CAAC,EAAiB,EAAa,CACjC,OAAU,MAAM,uCAAuC;CAEzD,IAAM,IAAS,GAAqB;AAEpC,GAA2B,MAAa,iBAAiB;CAEzD,IAAM,IAAkB,EAAO,oBAAoB;AACnD,CAAI,KACD,EAA6B,QAAQ;GAI7B,KAAgB,GAA2B,MAAuD;AAC7G,KAAI,CAAC,EAAiB,EAAa,CACjC,OAAU,MAAM,uCAAuC;CAEzD,IAAM,IAAe,EAAoC,EAAa,EAClE,IAAc,EAAsC,EAAa,EAC/D,IAA+B,EAAa,aAAa,EACzD,IAAW,EAAmC,EAAa,EAC3D,IAAmB,EAA8B,MAAa,mBAAmB;AAEvF,KAAI,CAAC,EAAkB;CACvB,IAAM,IAAsB,EAAsC,EAAiB;AAEnF,KAAI,MAAwB,GAAI;CAChC,IAAM,IAAY,EAAa,cAAc;AAE7C,KAAI,CAAC,EAAW;CAChB,IAAM,IAAe,EAAU,KAAK,GAAO,MACzC,MAAU,IAAA,KAA0C,IAAQ,KAAK,KAAA,MAA0B,EAAU,SAAS,GAAG,CAClH;AAID,CAFA,EAAa,aAAa,EAAa,EAEvC,IAAc,MAAa,qBAAqB,IAAc,IAAc;CAC5E,IAAM,IAAkB,EAAY,GAAU,aAAa,CAAC;AAC5D,CAAI,KACD,EAA6B,QAAQ;GAI7B,KAAgB,MAA8B;AACzD,KAAI,CAAC,EAAiB,EAAa,CACjC,OAAU,MAAM,uCAAuC;AAKzD,EAHqB,EAAoC,
|
|
1
|
+
{"version":3,"file":"helpers.js","names":[],"sources":["../../../../../src/components/RteEditor/Plugins/TablePlugin/helpers.ts"],"sourcesContent":["import {\n $createTableNodeWithDimensions,\n $createTableRowNode,\n $createTableCellNode,\n $deleteTableColumnAtSelection,\n $isTableCellNode,\n $getTableNodeFromLexicalNodeOrThrow,\n $getTableRowNodeFromTableCellNodeOrThrow,\n $getTableRowIndexFromTableCellNode,\n $getTableColumnIndexFromTableCellNode,\n $insertTableColumnAtSelection,\n $insertTableRowAtSelection,\n $findTableNode,\n} from '@lexical/table';\nimport { $createParagraphNode } from 'lexical';\n\nimport type { TableCellNode, TableNode, TableRowNode } from '@lexical/table';\nimport type { TextNode, ElementNode, LexicalEditor } from 'lexical';\n\nimport { TableWrapperNode } from 'components/RteEditor/nodes';\n\nexport const MIN_COLUMN_WIDTH = 32;\nexport const DEFAULT_COL_WIDTH = 48;\nexport const BORDER_WIDTHS = 1;\nexport const PREVENT_OPEN_DELAY = 200;\nexport const DEFAULT_EDITOR_WIDTH = 320;\n\nexport const createTable = (nrOfRows: number, nrOfColumns: number): ElementNode => {\n const tableNode = $createTableNodeWithDimensions(0, 0, false);\n for (let rowIndex = 0; rowIndex < nrOfRows; rowIndex++) {\n const rowNode = $createTableRowNode();\n for (let colIndex = 0; colIndex < nrOfColumns; colIndex++) {\n const cellNode = $createTableCellNode(0, undefined, undefined);\n cellNode.append($createParagraphNode());\n rowNode.append(cellNode);\n }\n tableNode.append(rowNode);\n }\n return tableNode;\n};\n\nexport const deleteRow = (selectedNode: ElementNode) => {\n const currentRow = $getTableRowNodeFromTableCellNodeOrThrow(selectedNode);\n const nextRow = currentRow.getNextSibling() || currentRow.getPreviousSibling();\n const currentTable = currentRow.getParentOrThrow();\n currentTable.getChildrenSize() > 1 ? currentRow.remove() : currentTable.remove();\n\n if (nextRow !== null) {\n const firstDescendant = (nextRow as ElementNode).getFirstDescendant();\n if (firstDescendant) {\n (firstDescendant as TextNode).select();\n }\n }\n};\n\nexport const deleteTable = (selectedNode: ElementNode) => {\n const tableNode = $findTableNode(selectedNode);\n if (!tableNode) {\n throw new Error('Selected node is not a TableCellNode');\n }\n\n const wrapperNode = tableNode.getParent();\n if (wrapperNode instanceof TableWrapperNode) {\n wrapperNode.remove();\n } else {\n tableNode.remove();\n }\n};\n\nexport const insertRow = (selectedNode: ElementNode, position: 'insertRowAbove' | 'insertRowBelow') => {\n if (!$isTableCellNode(selectedNode)) {\n throw new Error('Selected node is not a TableCellNode');\n }\n const newRow = $createTableRowNode();\n\n $insertTableRowAtSelection(position === 'insertRowBelow');\n\n const firstDescendant = newRow.getFirstDescendant();\n if (firstDescendant) {\n (firstDescendant as TextNode).select();\n }\n};\n\nexport const insertColumn = (selectedNode: ElementNode, position: 'insertColumnLeft' | 'insertColumnRight') => {\n if (!$isTableCellNode(selectedNode)) {\n throw new Error('Selected node is not a TableCellNode');\n }\n const currentTable = $getTableNodeFromLexicalNodeOrThrow(selectedNode);\n let columnIndex = $getTableColumnIndexFromTableCellNode(selectedNode);\n const rowsInTable: TableCellNode[] = currentTable.getChildren();\n const rowIndex = $getTableRowIndexFromTableCellNode(selectedNode);\n const insertedCellNode = $insertTableColumnAtSelection(position === 'insertColumnLeft');\n\n if (!insertedCellNode) return;\n const insertedColumnIndex = $getTableColumnIndexFromTableCellNode(insertedCellNode);\n\n if (insertedColumnIndex === -1) return;\n const colWidths = currentTable.getColWidths();\n\n if (!colWidths) return;\n const newColWidths = colWidths.map((width, index) =>\n index === insertedColumnIndex ? DEFAULT_COL_WIDTH : width - Math.ceil(DEFAULT_COL_WIDTH / (colWidths.length - 1))\n );\n\n currentTable.setColWidths(newColWidths);\n\n columnIndex = position === 'insertColumnLeft' ? columnIndex : columnIndex + 1;\n const firstDescendant = rowsInTable[rowIndex].getChildren()[columnIndex];\n if (firstDescendant) {\n (firstDescendant as TextNode).select();\n }\n};\n\nexport const deleteColumn = (selectedNode: ElementNode) => {\n if (!$isTableCellNode(selectedNode)) {\n throw new Error('Selected node is not a TableCellNode');\n }\n const currentTable = $getTableNodeFromLexicalNodeOrThrow(selectedNode);\n const numberOfColumns = (currentTable.getFirstChild() as ElementNode)?.getChildrenSize() || 0;\n\n if (numberOfColumns === 1) {\n deleteTable(selectedNode);\n } else {\n $deleteTableColumnAtSelection();\n }\n};\n\nexport const getEditorContentWidth = (editor: LexicalEditor): number => {\n const rootEl = editor.getRootElement();\n if (!rootEl || typeof window === 'undefined') return 0;\n const rect = rootEl.getBoundingClientRect();\n const styles = window.getComputedStyle(rootEl);\n const insertX = parseFloat(styles.paddingLeft || '0') + parseFloat(styles.paddingRight || '0') + DEFAULT_COL_WIDTH;\n return Math.max(0, rect.width - insertX);\n};\n\nexport const getEditorParrentCellWidth = (\n node: TableCellNode | null,\n nrOfColumns: number,\n editor: LexicalEditor\n): number => {\n if (!node) return 0;\n\n const cell = editor.getElementByKey(node.getKey());\n if (!cell) return 0;\n\n const computedStyles = window.getComputedStyle(cell);\n return parseInt(computedStyles.width) - nrOfColumns * BORDER_WIDTHS - 1;\n};\n\nexport const tableHasContent = (tableNode: TableNode): boolean => {\n const rows = tableNode.getChildren();\n for (const row of rows) {\n const cells = (row as TableRowNode).getChildren();\n for (const cell of cells) {\n if ($isTableCellNode(cell)) {\n const cellText = cell.getTextContent().trim();\n if (cellText.length > 0) {\n return true;\n }\n }\n }\n }\n return false;\n};\n"],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { i as e } from "../../../../components-
|
|
1
|
+
import { i as e } from "../../../../components-BzxAULjf.js";
|
|
2
2
|
import { t } from "../../../../TableCellContextMenu-D0IMQr3E.js";
|
|
3
|
-
import "../../../../PasteHandlerPlugin-DjD1wryY.js";
|
|
4
3
|
export { t as TableCellContextMenu, e as TablePlugin };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { i as e, l as t, o as n, s as r } from "../../../components-
|
|
2
|
-
import { t as i } from "../../../TableCellResizerPlugin-
|
|
1
|
+
import { i as e, l as t, o as n, s as r } from "../../../components-BzxAULjf.js";
|
|
2
|
+
import { t as i } from "../../../TableCellResizerPlugin-Bc5y-Qbx.js";
|
|
3
3
|
import { BlockFormatPlugin as a } from "./BlockFormatPlugin/BlockFormatPlugin.js";
|
|
4
4
|
import { ListPlugin as o } from "./ListPlugin/ListPlugin.js";
|
|
5
5
|
import { t as s } from "../../../TableCellContextMenu-D0IMQr3E.js";
|
|
6
|
-
import { t as c } from "../../../PasteHandlerPlugin-
|
|
6
|
+
import { t as c } from "../../../PasteHandlerPlugin-BNp8ST0q.js";
|
|
7
7
|
export { a as BlockFormatPlugin, n as HistoryPlugin, r as LinkPlugin, o as ListPlugin, c as PasteHandlerPlugin, s as TableCellContextMenu, i as TableCellResizerPlugin, e as TablePlugin, t as ToolBarPlugin };
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { n as e } from "../../components-
|
|
2
|
-
import "../../PasteHandlerPlugin-DjD1wryY.js";
|
|
1
|
+
import { n as e } from "../../components-BzxAULjf.js";
|
|
3
2
|
import { t } from "../../Container-BLjtYDqq.js";
|
|
4
3
|
import "../../storyComponents/Container/index.js";
|
|
5
4
|
import { MOCK_RTE_CONTENT as n } from "./mockRteContent.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RteEditor.stories.js","names":[],"sources":["../../../src/components/RteEditor/RteEditor.stories.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\n\nimport type { PropsWithChildren } from 'react';\nimport type { Meta, StoryFn } from '@storybook/react';\nimport type { RteEditorProps } from './RteEditor';\nimport type { SearchResponse } from './Plugins/CourseCataloguePlugin/AddCatalogueLinkForm';\n\nimport { RteEditor } from './RteEditor';\nimport { MOCK_RTE_CONTENT } from './mockRteContent';\nimport { MOCK_SEARCH_COURSES, MOCK_SEARCH_PROGRAMMES } from './mockCatalogueSearchData';\n\nimport { Container } from 'storyComponents/Container';\n\nconst QUERY_SPEED = 1000; // ms\nconst CHARACTER_THRESHOLD = 3;\n\nconst codeString = `<RteEditor\n editorId=\"editor-id\"\n initialValue=\"\"\n currentLanguage=\"NL\"\n label=\"\"\n info=\"\"\n placeholder=\"\"\n notValidatedText=\"\"\n onChange={handleChange}\n onCatalogueLinkSearch={handleCatalogueLinkSearch}\n catalogueSearchResponse={{ state: 'idle', results: [] }}\n />`;\n\n// eslint-disable-next-line import/no-default-export\nexport default {\n title: 'Organisms/RteEditor',\n component: RteEditor,\n parameters: {\n inspectComponent: RteEditor,\n codeString: codeString,\n },\n} as Meta<PropsWithChildren<RteEditorProps>>;\n\nconst Template: StoryFn<PropsWithChildren<RteEditorProps>> = (args) => {\n const [result, setResult] = useState<string>(args.initialValue || '');\n const [catalogueSearchResponse, setCatalogueSearchResponse] = useState<SearchResponse>({\n state: 'idle',\n results: [],\n });\n const networkTimer = useRef<NodeJS.Timeout | null>(null);\n\n const handleSearch = (query: string, linkType: 'course' | 'programme') => {\n if (query.length < CHARACTER_THRESHOLD) {\n clearTimeout(networkTimer.current!);\n setCatalogueSearchResponse({ state: 'idle', results: [] });\n return;\n }\n\n if (networkTimer.current !== null) {\n clearTimeout(networkTimer.current);\n }\n\n const lowerCaseQuery = query.toLowerCase();\n if (query.length >= CHARACTER_THRESHOLD) {\n setCatalogueSearchResponse({ state: 'pending', results: [] });\n const mockResults =\n linkType === 'course'\n ? MOCK_SEARCH_COURSES.filter(\n (item) =>\n item.name.NL.toLowerCase().includes(lowerCaseQuery) || item.code.toLowerCase().includes(lowerCaseQuery)\n )\n : MOCK_SEARCH_PROGRAMMES.filter(\n (item) =>\n item.name.NL.toLowerCase().includes(lowerCaseQuery) || item.code.toLowerCase().includes(lowerCaseQuery)\n );\n\n networkTimer.current = setTimeout(\n () =>\n setCatalogueSearchResponse({\n state: 'ready',\n results: mockResults,\n }),\n QUERY_SPEED\n );\n }\n };\n\n return (\n <>\n <Container size=\"large-full-height\">\n <RteEditor\n {...args}\n onChange={(evt) => setResult(evt)}\n onCatalogueLinkSearch={handleSearch}\n catalogueSearchResponse={catalogueSearchResponse}\n />\n </Container>\n <br />\n <br />\n\n <p style={{ margin: '0', marginTop: '2rem' }}>HTML Output:</p>\n <div\n style={{\n marginTop: '0rem',\n padding: '1rem',\n backgroundColor: '#F9F9F9',\n borderRadius: '0.25rem',\n color: '#666',\n }}\n >\n {result}\n </div>\n </>\n );\n};\n\nexport const RteEditorExample = Template.bind({});\n\nRteEditorExample.args = {\n editorId: 'test-editor',\n placeholder: 'Voeg hier tekst in...',\n currentLanguage: 'NL',\n label: 'Studiemateriaal',\n info: \"Studiemateriaal is essentieel voor succesvol leren. Het omvat boeken, artikelen, video's en oefeningen die studenten helpen hun kennis te vergroten, vaardigheden te ontwikkelen en hun studieprestaties te verbeteren.\",\n required: true,\n initialValue: MOCK_RTE_CONTENT,\n};\n\nexport const MultipleRteEditors = () => {\n const [result01, setResult01] = useState<string>(\n 'Students will:<br>• demonstrate digital literacy in an academic context<br>• learn to read and engage with texts from a range of disciplinary perspectives<br>• develop writing and argumentation skills appropriate to different disciplines<br>• learn to recognize and apply different research methodologies<br>• learn how to recognize and practice different genres and modes of academic discourse<br>• develop vocabulary appropriate to an academic environment<br>• improve analytic and critical thinking skills<br>• work independently and as part of a collaborative group<br>• learn to review and critique their own work and that of their peers <br>• improve listening comprehension and develop presentation skills<br>• participate in discussions, workshops and debates'\n );\n const [result02, setResult02] = useState<string>(\n `<p>Editor 2</p>\n <ul>\n <li>nesting</li>\n <li>\n <ol>\n <li>nested 1</li>\n <li>nested 2</li>\n </ol>\n </li>\n <li>nesting 2</li>\n <li>\n <ul>\n <li>deep nested 1</li>\n <li>deep nested 2</li>\n <li>\n <ol>\n <li>deeper nested 1</li>\n <li>\n <ul>\n <li>deepest nested 1</li>\n <li>deepest nested 2</li>\n </ul>\n </li>\n <li>deeper nested 2</li>\n <li>\n <ol>\n <li>deepest nested 1</li>\n <li>deepest nested 2</li>\n </ol>\n </li>\n </ol>\n </li>\n </ul>\n </li>\n <li>nesting end</li>\n </ul>`\n );\n\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'row',\n gap: '1rem',\n width: '100%',\n padding: '1rem',\n backgroundColor: '#FFF',\n }}\n >\n <div style={{ flex: '1' }}>\n <RteEditor\n initialValue={result01}\n editorId=\"editor-one\"\n label=\"Editor 1\"\n info=\"Uitleg over editor 1\"\n placeholder=\"Voeg hier tekst in...\"\n notValidatedText=\"\"\n onChange={(evt) => setResult01(evt)}\n />\n <br />\n <p style={{ margin: '0', marginTop: '2rem' }}>HTML Output:</p>\n <div\n style={{\n marginTop: '0rem',\n padding: '1rem',\n backgroundColor: '#F9F9F9',\n borderRadius: '0.25rem',\n color: '#666',\n }}\n >\n {result01}\n </div>\n </div>\n <div style={{ flex: '1' }}>\n <RteEditor\n initialValue={result02}\n editorId=\"editor-two\"\n label=\"Editor 2\"\n info=\"Uitleg over editor 2 wat langer om te kijken of dat ook goed gaat, want je weet maar nooit.\"\n placeholder=\"Voeg hier tekst in...\"\n notValidatedText=\"\"\n onChange={(evt) => setResult02(evt)}\n />\n <br />\n <p style={{ margin: '0', marginTop: '2rem' }}>HTML Output:</p>\n <div\n style={{\n marginTop: '0rem',\n padding: '1rem',\n backgroundColor: '#F9F9F9',\n borderRadius: '0.25rem',\n color: '#666',\n }}\n >\n {result02}\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"RteEditor.stories.js","names":[],"sources":["../../../src/components/RteEditor/RteEditor.stories.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\n\nimport type { PropsWithChildren } from 'react';\nimport type { Meta, StoryFn } from '@storybook/react';\nimport type { RteEditorProps } from './RteEditor';\nimport type { SearchResponse } from './Plugins/CourseCataloguePlugin/AddCatalogueLinkForm';\n\nimport { RteEditor } from './RteEditor';\nimport { MOCK_RTE_CONTENT } from './mockRteContent';\nimport { MOCK_SEARCH_COURSES, MOCK_SEARCH_PROGRAMMES } from './mockCatalogueSearchData';\n\nimport { Container } from 'storyComponents/Container';\n\nconst QUERY_SPEED = 1000; // ms\nconst CHARACTER_THRESHOLD = 3;\n\nconst codeString = `<RteEditor\n editorId=\"editor-id\"\n initialValue=\"\"\n currentLanguage=\"NL\"\n label=\"\"\n info=\"\"\n placeholder=\"\"\n notValidatedText=\"\"\n onChange={handleChange}\n onCatalogueLinkSearch={handleCatalogueLinkSearch}\n catalogueSearchResponse={{ state: 'idle', results: [] }}\n />`;\n\n// eslint-disable-next-line import/no-default-export\nexport default {\n title: 'Organisms/RteEditor',\n component: RteEditor,\n parameters: {\n inspectComponent: RteEditor,\n codeString: codeString,\n },\n} as Meta<PropsWithChildren<RteEditorProps>>;\n\nconst Template: StoryFn<PropsWithChildren<RteEditorProps>> = (args) => {\n const [result, setResult] = useState<string>(args.initialValue || '');\n const [catalogueSearchResponse, setCatalogueSearchResponse] = useState<SearchResponse>({\n state: 'idle',\n results: [],\n });\n const networkTimer = useRef<NodeJS.Timeout | null>(null);\n\n const handleSearch = (query: string, linkType: 'course' | 'programme') => {\n if (query.length < CHARACTER_THRESHOLD) {\n clearTimeout(networkTimer.current!);\n setCatalogueSearchResponse({ state: 'idle', results: [] });\n return;\n }\n\n if (networkTimer.current !== null) {\n clearTimeout(networkTimer.current);\n }\n\n const lowerCaseQuery = query.toLowerCase();\n if (query.length >= CHARACTER_THRESHOLD) {\n setCatalogueSearchResponse({ state: 'pending', results: [] });\n const mockResults =\n linkType === 'course'\n ? MOCK_SEARCH_COURSES.filter(\n (item) =>\n item.name.NL.toLowerCase().includes(lowerCaseQuery) || item.code.toLowerCase().includes(lowerCaseQuery)\n )\n : MOCK_SEARCH_PROGRAMMES.filter(\n (item) =>\n item.name.NL.toLowerCase().includes(lowerCaseQuery) || item.code.toLowerCase().includes(lowerCaseQuery)\n );\n\n networkTimer.current = setTimeout(\n () =>\n setCatalogueSearchResponse({\n state: 'ready',\n results: mockResults,\n }),\n QUERY_SPEED\n );\n }\n };\n\n return (\n <>\n <Container size=\"large-full-height\">\n <RteEditor\n {...args}\n onChange={(evt) => setResult(evt)}\n onCatalogueLinkSearch={handleSearch}\n catalogueSearchResponse={catalogueSearchResponse}\n />\n </Container>\n <br />\n <br />\n\n <p style={{ margin: '0', marginTop: '2rem' }}>HTML Output:</p>\n <div\n style={{\n marginTop: '0rem',\n padding: '1rem',\n backgroundColor: '#F9F9F9',\n borderRadius: '0.25rem',\n color: '#666',\n }}\n >\n {result}\n </div>\n </>\n );\n};\n\nexport const RteEditorExample = Template.bind({});\n\nRteEditorExample.args = {\n editorId: 'test-editor',\n placeholder: 'Voeg hier tekst in...',\n currentLanguage: 'NL',\n label: 'Studiemateriaal',\n info: \"Studiemateriaal is essentieel voor succesvol leren. Het omvat boeken, artikelen, video's en oefeningen die studenten helpen hun kennis te vergroten, vaardigheden te ontwikkelen en hun studieprestaties te verbeteren.\",\n required: true,\n initialValue: MOCK_RTE_CONTENT,\n};\n\nexport const MultipleRteEditors = () => {\n const [result01, setResult01] = useState<string>(\n 'Students will:<br>• demonstrate digital literacy in an academic context<br>• learn to read and engage with texts from a range of disciplinary perspectives<br>• develop writing and argumentation skills appropriate to different disciplines<br>• learn to recognize and apply different research methodologies<br>• learn how to recognize and practice different genres and modes of academic discourse<br>• develop vocabulary appropriate to an academic environment<br>• improve analytic and critical thinking skills<br>• work independently and as part of a collaborative group<br>• learn to review and critique their own work and that of their peers <br>• improve listening comprehension and develop presentation skills<br>• participate in discussions, workshops and debates'\n );\n const [result02, setResult02] = useState<string>(\n `<p>Editor 2</p>\n <ul>\n <li>nesting</li>\n <li>\n <ol>\n <li>nested 1</li>\n <li>nested 2</li>\n </ol>\n </li>\n <li>nesting 2</li>\n <li>\n <ul>\n <li>deep nested 1</li>\n <li>deep nested 2</li>\n <li>\n <ol>\n <li>deeper nested 1</li>\n <li>\n <ul>\n <li>deepest nested 1</li>\n <li>deepest nested 2</li>\n </ul>\n </li>\n <li>deeper nested 2</li>\n <li>\n <ol>\n <li>deepest nested 1</li>\n <li>deepest nested 2</li>\n </ol>\n </li>\n </ol>\n </li>\n </ul>\n </li>\n <li>nesting end</li>\n </ul>`\n );\n\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'row',\n gap: '1rem',\n width: '100%',\n padding: '1rem',\n backgroundColor: '#FFF',\n }}\n >\n <div style={{ flex: '1' }}>\n <RteEditor\n initialValue={result01}\n editorId=\"editor-one\"\n label=\"Editor 1\"\n info=\"Uitleg over editor 1\"\n placeholder=\"Voeg hier tekst in...\"\n notValidatedText=\"\"\n onChange={(evt) => setResult01(evt)}\n />\n <br />\n <p style={{ margin: '0', marginTop: '2rem' }}>HTML Output:</p>\n <div\n style={{\n marginTop: '0rem',\n padding: '1rem',\n backgroundColor: '#F9F9F9',\n borderRadius: '0.25rem',\n color: '#666',\n }}\n >\n {result01}\n </div>\n </div>\n <div style={{ flex: '1' }}>\n <RteEditor\n initialValue={result02}\n editorId=\"editor-two\"\n label=\"Editor 2\"\n info=\"Uitleg over editor 2 wat langer om te kijken of dat ook goed gaat, want je weet maar nooit.\"\n placeholder=\"Voeg hier tekst in...\"\n notValidatedText=\"\"\n onChange={(evt) => setResult02(evt)}\n />\n <br />\n <p style={{ margin: '0', marginTop: '2rem' }}>HTML Output:</p>\n <div\n style={{\n marginTop: '0rem',\n padding: '1rem',\n backgroundColor: '#F9F9F9',\n borderRadius: '0.25rem',\n color: '#666',\n }}\n >\n {result02}\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { c as n,
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { Zt as e, jt as t } from "../../Lexical.prod-CqPLSi0R.js";
|
|
2
|
+
import { c as n, s as r } from "../../LexicalList.prod-eYlcb5Ao.js";
|
|
3
|
+
import { t as i } from "../../LexicalLink.prod-DMhcqD9x.js";
|
|
4
|
+
import { i as a } from "../../LexicalTable.prod-DlOxUQou.js";
|
|
5
5
|
import { CourseCatalogueNode as o } from "./nodes/CourseCatalogueNode/CourseCatalogueNode.js";
|
|
6
6
|
//#region src/components/RteEditor/helpers.ts
|
|
7
7
|
var s = (e) => {
|
|
@@ -14,8 +14,8 @@ var s = (e) => {
|
|
|
14
14
|
}, u = new Map([
|
|
15
15
|
[t, l],
|
|
16
16
|
[e, l],
|
|
17
|
-
[r, l],
|
|
18
17
|
[n, l],
|
|
18
|
+
[r, l],
|
|
19
19
|
[a, l],
|
|
20
20
|
[i, l],
|
|
21
21
|
[o, l]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","names":[],"sources":["../../../src/components/RteEditor/helpers.ts"],"sourcesContent":["import { LinkNode } from '@lexical/link';\nimport { ListNode, ListItemNode } from '@lexical/list';\nimport { ParagraphNode, TextNode } from 'lexical';\nimport { TableCellNode } from '@lexical/table';\n\nimport type { DOMExportOutput, Klass, LexicalEditor, LexicalNode } from 'lexical';\n\nimport { CourseCatalogueNode } from './nodes';\n\nexport const mergeBoldStrongTags = (html: string): string => {\n let mergedHtml = html.replace(/<b><strong>/gi, '<strong>');\n mergedHtml = mergedHtml.replace(/<\\/strong><\\/b>/gi, '</strong>');\n return mergedHtml;\n};\n\nexport const cleanUpTable = (html: string): string =>\n html.replace(/<div[^>]*>\\s*(<table[\\s\\S]*?<\\/table>)\\s*<\\/div>/gi, '$1');\n\nexport const removeStylesExportDOM = (editor: LexicalEditor, target: LexicalNode): DOMExportOutput => {\n const output = target.exportDOM(editor);\n if (output && output.element instanceof HTMLElement) {\n for (const el of [output.element, ...output.element.querySelectorAll('[style],[class],[dir=\"ltr\"]')]) {\n el.removeAttribute('class');\n if (el.getAttribute('style')) {\n el.setAttribute('style', '');\n el.removeAttribute('style');\n }\n if (el.getAttribute('dir') === 'ltr') {\n el.removeAttribute('dir');\n }\n }\n }\n return output;\n};\n\nexport const exportMap = new Map<Klass<LexicalNode>, (editor: LexicalEditor, target: LexicalNode) => DOMExportOutput>([\n [ParagraphNode, removeStylesExportDOM],\n [TextNode, removeStylesExportDOM],\n [ListNode, removeStylesExportDOM],\n [ListItemNode, removeStylesExportDOM],\n [TableCellNode, removeStylesExportDOM],\n [LinkNode, removeStylesExportDOM],\n [CourseCatalogueNode, removeStylesExportDOM],\n]);\n\nexport const setScrollableContainers = (fn: (event: Event) => void) => {\n const scrollableContainers = document.querySelectorAll('*');\n scrollableContainers.forEach((container) => {\n if (container.scrollHeight > container.clientHeight) {\n container.addEventListener('scroll', fn);\n }\n });\n};\n\nexport const removeScrollableContainers = (fn: (event: Event) => void) => {\n const scrollableContainers = document.querySelectorAll('*');\n scrollableContainers.forEach((container) => {\n if (container.scrollHeight > container.clientHeight) {\n container.removeEventListener('scroll', fn);\n }\n });\n};\n"],"mappings":";;;;;;AASA,IAAa,KAAuB,MAAyB;CAC3D,IAAI,IAAa,EAAK,QAAQ,iBAAiB,WAAW;AAE1D,QADA,IAAa,EAAW,QAAQ,qBAAqB,YAAY,EAC1D;GAGI,KAAgB,MAC3B,EAAK,QAAQ,sDAAsD,KAAK,EAE7D,KAAyB,GAAuB,MAAyC;CACpG,IAAM,IAAS,EAAO,UAAU,EAAO;AACvC,KAAI,KAAU,EAAO,mBAAmB,YACtC,MAAK,IAAM,KAAM,CAAC,EAAO,SAAS,GAAG,EAAO,QAAQ,iBAAiB,gCAA8B,CAAC,CAMlG,CALA,EAAG,gBAAgB,QAAQ,EACvB,EAAG,aAAa,QAAQ,KAC1B,EAAG,aAAa,SAAS,GAAG,EAC5B,EAAG,gBAAgB,QAAQ,GAEzB,EAAG,aAAa,MAAM,KAAK,SAC7B,EAAG,gBAAgB,MAAM;AAI/B,QAAO;GAGI,IAAY,IAAI,IAAyF;CACpH,CAAC,GAAe,EAAsB;CACtC,CAAC,GAAU,EAAsB;CACjC,CAAC,GAAU,EAAsB;CACjC,CAAC,GAAc,EAAsB;CACrC,CAAC,GAAe,EAAsB;CACtC,CAAC,GAAU,EAAsB;CACjC,CAAC,GAAqB,EAAsB;CAC7C,CAAC,EAEW,KAA2B,MAA+B;AACxC,UAAS,iBAAiB,
|
|
1
|
+
{"version":3,"file":"helpers.js","names":[],"sources":["../../../src/components/RteEditor/helpers.ts"],"sourcesContent":["import { LinkNode } from '@lexical/link';\nimport { ListNode, ListItemNode } from '@lexical/list';\nimport { ParagraphNode, TextNode } from 'lexical';\nimport { TableCellNode } from '@lexical/table';\n\nimport type { DOMExportOutput, Klass, LexicalEditor, LexicalNode } from 'lexical';\n\nimport { CourseCatalogueNode } from './nodes';\n\nexport const mergeBoldStrongTags = (html: string): string => {\n let mergedHtml = html.replace(/<b><strong>/gi, '<strong>');\n mergedHtml = mergedHtml.replace(/<\\/strong><\\/b>/gi, '</strong>');\n return mergedHtml;\n};\n\nexport const cleanUpTable = (html: string): string =>\n html.replace(/<div[^>]*>\\s*(<table[\\s\\S]*?<\\/table>)\\s*<\\/div>/gi, '$1');\n\nexport const removeStylesExportDOM = (editor: LexicalEditor, target: LexicalNode): DOMExportOutput => {\n const output = target.exportDOM(editor);\n if (output && output.element instanceof HTMLElement) {\n for (const el of [output.element, ...output.element.querySelectorAll('[style],[class],[dir=\"ltr\"]')]) {\n el.removeAttribute('class');\n if (el.getAttribute('style')) {\n el.setAttribute('style', '');\n el.removeAttribute('style');\n }\n if (el.getAttribute('dir') === 'ltr') {\n el.removeAttribute('dir');\n }\n }\n }\n return output;\n};\n\nexport const exportMap = new Map<Klass<LexicalNode>, (editor: LexicalEditor, target: LexicalNode) => DOMExportOutput>([\n [ParagraphNode, removeStylesExportDOM],\n [TextNode, removeStylesExportDOM],\n [ListNode, removeStylesExportDOM],\n [ListItemNode, removeStylesExportDOM],\n [TableCellNode, removeStylesExportDOM],\n [LinkNode, removeStylesExportDOM],\n [CourseCatalogueNode, removeStylesExportDOM],\n]);\n\nexport const setScrollableContainers = (fn: (event: Event) => void) => {\n const scrollableContainers = document.querySelectorAll('*');\n scrollableContainers.forEach((container) => {\n if (container.scrollHeight > container.clientHeight) {\n container.addEventListener('scroll', fn);\n }\n });\n};\n\nexport const removeScrollableContainers = (fn: (event: Event) => void) => {\n const scrollableContainers = document.querySelectorAll('*');\n scrollableContainers.forEach((container) => {\n if (container.scrollHeight > container.clientHeight) {\n container.removeEventListener('scroll', fn);\n }\n });\n};\n"],"mappings":";;;;;;AASA,IAAa,KAAuB,MAAyB;CAC3D,IAAI,IAAa,EAAK,QAAQ,iBAAiB,WAAW;AAE1D,QADA,IAAa,EAAW,QAAQ,qBAAqB,YAAY,EAC1D;GAGI,KAAgB,MAC3B,EAAK,QAAQ,sDAAsD,KAAK,EAE7D,KAAyB,GAAuB,MAAyC;CACpG,IAAM,IAAS,EAAO,UAAU,EAAO;AACvC,KAAI,KAAU,EAAO,mBAAmB,YACtC,MAAK,IAAM,KAAM,CAAC,EAAO,SAAS,GAAG,EAAO,QAAQ,iBAAiB,gCAA8B,CAAC,CAMlG,CALA,EAAG,gBAAgB,QAAQ,EACvB,EAAG,aAAa,QAAQ,KAC1B,EAAG,aAAa,SAAS,GAAG,EAC5B,EAAG,gBAAgB,QAAQ,GAEzB,EAAG,aAAa,MAAM,KAAK,SAC7B,EAAG,gBAAgB,MAAM;AAI/B,QAAO;GAGI,IAAY,IAAI,IAAyF;CACpH,CAAC,GAAe,EAAsB;CACtC,CAAC,GAAU,EAAsB;CACjC,CAAC,GAAU,EAAsB;CACjC,CAAC,GAAc,EAAsB;CACrC,CAAC,GAAe,EAAsB;CACtC,CAAC,GAAU,EAAsB;CACjC,CAAC,GAAqB,EAAsB;CAC7C,CAAC,EAEW,KAA2B,MAA+B;AACxC,UAAS,iBAAiB,IACvD,CAAqB,SAAS,MAAc;AAC1C,EAAI,EAAU,eAAe,EAAU,gBACrC,EAAU,iBAAiB,UAAU,EAAG;GAE1C;GAGS,KAA8B,MAA+B;AAC3C,UAAS,iBAAiB,IACvD,CAAqB,SAAS,MAAc;AAC1C,EAAI,EAAU,eAAe,EAAU,gBACrC,EAAU,oBAAoB,UAAU,EAAG;GAE7C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFlyout.js","names":[],"sources":["../../../../src/components/RteEditor/hooks/useFlyout.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\n\nimport type { ReactNode, RefObject } from 'react';\n\nimport { Flyout } from './components/Flyout';\n\nimport { useOnClickOutside } from 'components/hooks/useOnClickOutside';\n\ninterface FlyoutOptions {\n position: { top: number; left: number };\n children?: ReactNode;\n}\n\nexport interface FlyoutHookResult {\n flyout: ReactNode;\n showFlyout: (options: FlyoutOptions) => void;\n hideFlyout: () => void;\n isVisible: boolean;\n}\n\nexport const useFlyout = (): FlyoutHookResult => {\n const flyoutRef = useRef<HTMLDivElement>(null);\n const [visible, setVisible] = useState(false);\n const [options, setOptions] = useState<FlyoutOptions>({\n position: { top: 0, left: 0 },\n children: null,\n });\n\n const showFlyout = (customOptions: FlyoutOptions): void => {\n setVisible(true);\n setOptions({ ...options, ...customOptions });\n };\n\n const hideFlyout = (): void => {\n setVisible(false);\n setOptions({ ...options });\n };\n\n useOnClickOutside(flyoutRef as RefObject<HTMLElement>, hideFlyout);\n\n const flyout = (\n <Flyout visible={visible} position={options.position} ref={flyoutRef}>\n {options.children}\n </Flyout>\n );\n\n return {\n flyout,\n showFlyout,\n hideFlyout,\n isVisible: visible,\n };\n};\n"],"mappings":";;;;;AAoBA,IAAa,UAAoC;CAC/C,IAAM,IAAY,EAAuB,KAAK,EACxC,CAAC,GAAS,KAAc,EAAS,GAAM,EACvC,CAAC,GAAS,KAAc,EAAwB;EACpD,UAAU;GAAE,KAAK;GAAG,MAAM;GAAG;EAC7B,UAAU;EACX,CAAC,EAEI,KAAc,MAAuC;AAEzD,EADA,EAAW,GAAK,EAChB,EAAW;GAAE,GAAG;GAAS,GAAG;GAAe,CAAC;IAGxC,UAAyB;AAE7B,EADA,EAAW,GAAM,EACjB,EAAW,EAAE,GAAG,GAAS,CAAC;;AAW5B,QARA,EAAkB,GAAqC,EAAW,EAQ3D;EACL,QANA,kBAAC,GAAD;GAAiB;GAAS,UAAU,EAAQ;GAAU,KAAK;aACxD,EAAQ;GACF,
|
|
1
|
+
{"version":3,"file":"useFlyout.js","names":[],"sources":["../../../../src/components/RteEditor/hooks/useFlyout.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\n\nimport type { ReactNode, RefObject } from 'react';\n\nimport { Flyout } from './components/Flyout';\n\nimport { useOnClickOutside } from 'components/hooks/useOnClickOutside';\n\ninterface FlyoutOptions {\n position: { top: number; left: number };\n children?: ReactNode;\n}\n\nexport interface FlyoutHookResult {\n flyout: ReactNode;\n showFlyout: (options: FlyoutOptions) => void;\n hideFlyout: () => void;\n isVisible: boolean;\n}\n\nexport const useFlyout = (): FlyoutHookResult => {\n const flyoutRef = useRef<HTMLDivElement>(null);\n const [visible, setVisible] = useState(false);\n const [options, setOptions] = useState<FlyoutOptions>({\n position: { top: 0, left: 0 },\n children: null,\n });\n\n const showFlyout = (customOptions: FlyoutOptions): void => {\n setVisible(true);\n setOptions({ ...options, ...customOptions });\n };\n\n const hideFlyout = (): void => {\n setVisible(false);\n setOptions({ ...options });\n };\n\n useOnClickOutside(flyoutRef as RefObject<HTMLElement>, hideFlyout);\n\n const flyout = (\n <Flyout visible={visible} position={options.position} ref={flyoutRef}>\n {options.children}\n </Flyout>\n );\n\n return {\n flyout,\n showFlyout,\n hideFlyout,\n isVisible: visible,\n };\n};\n"],"mappings":";;;;;AAoBA,IAAa,UAAoC;CAC/C,IAAM,IAAY,EAAuB,KAAK,EACxC,CAAC,GAAS,KAAc,EAAS,GAAM,EACvC,CAAC,GAAS,KAAc,EAAwB;EACpD,UAAU;GAAE,KAAK;GAAG,MAAM;GAAG;EAC7B,UAAU;EACX,CAAC,EAEI,KAAc,MAAuC;AAEzD,EADA,EAAW,GAAK,EAChB,EAAW;GAAE,GAAG;GAAS,GAAG;GAAe,CAAC;IAGxC,UAAyB;AAE7B,EADA,EAAW,GAAM,EACjB,EAAW,EAAE,GAAG,GAAS,CAAC;;AAW5B,QARA,EAAkB,GAAqC,EAAW,EAQ3D;EACL,QANA,kBAAC,GAAD;GAAiB;GAAS,UAAU,EAAQ;GAAU,KAAK;aACxD,EAAQ;GACF,CAIT;EACA;EACA;EACA,WAAW;EACZ"}
|