@gravity-ui/markdown-editor 15.20.0 → 15.22.0
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/build/cjs/extensions/additional/FoldingHeading/plugins/folding.css +12 -9
- package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.d.ts +2 -0
- package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +11 -9
- package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
- package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
- package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +3 -1
- package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
- package/build/cjs/extensions/additional/Mermaid/index.d.ts +4 -0
- package/build/cjs/extensions/additional/Mermaid/index.js +4 -4
- package/build/cjs/extensions/additional/Mermaid/index.js.map +1 -1
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +11 -8
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
- package/build/cjs/extensions/additional/YfmHtmlBlock/index.d.ts +4 -0
- package/build/cjs/extensions/additional/YfmHtmlBlock/index.js.map +1 -1
- package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +2 -1
- package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmConfigs/index.d.ts +5 -1
- package/build/cjs/extensions/yfm/YfmConfigs/index.js +7 -1
- package/build/cjs/extensions/yfm/YfmConfigs/index.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.d.ts +1 -1
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js +1 -0
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/PlusButton.js +10 -7
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/PlusButton.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/const.d.ts +2 -2
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/const.js +2 -2
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/const.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.d.ts +31 -0
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.js +177 -0
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.js.map +1 -0
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.css +71 -6
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.d.ts +1 -0
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js +40 -25
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.js +4 -7
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.d.ts +13 -4
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.js +11 -9
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.d.ts +4 -0
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.js +50 -0
- package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.js.map +1 -0
- package/build/cjs/react-utils/hooks/useAutoSave.d.ts +23 -0
- package/build/cjs/react-utils/hooks/useAutoSave.js +59 -0
- package/build/cjs/react-utils/hooks/useAutoSave.js.map +1 -0
- package/build/cjs/react-utils/hooks.d.ts +1 -1
- package/build/cjs/react-utils/hooks.js +3 -1
- package/build/cjs/react-utils/hooks.js.map +1 -1
- package/build/cjs/version.js +1 -1
- package/build/cjs/version.js.map +1 -1
- package/build/cjs/view/components/YfmHtml/YfmStaticView.d.ts +13 -0
- package/build/cjs/view/components/YfmHtml/YfmStaticView.js +10 -4
- package/build/cjs/view/components/YfmHtml/YfmStaticView.js.map +1 -1
- package/build/cjs/view/components/YfmHtml/index.d.ts +1 -1
- package/build/cjs/view/components/YfmHtml/index.js.map +1 -1
- package/build/esm/extensions/additional/FoldingHeading/plugins/folding.css +12 -9
- package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.d.ts +2 -0
- package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +12 -10
- package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
- package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
- package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +3 -1
- package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
- package/build/esm/extensions/additional/Mermaid/index.d.ts +4 -0
- package/build/esm/extensions/additional/Mermaid/index.js +4 -4
- package/build/esm/extensions/additional/Mermaid/index.js.map +1 -1
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +12 -9
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
- package/build/esm/extensions/additional/YfmHtmlBlock/index.d.ts +4 -0
- package/build/esm/extensions/additional/YfmHtmlBlock/index.js.map +1 -1
- package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +2 -1
- package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js.map +1 -1
- package/build/esm/extensions/yfm/YfmConfigs/index.d.ts +5 -1
- package/build/esm/extensions/yfm/YfmConfigs/index.js +7 -1
- package/build/esm/extensions/yfm/YfmConfigs/index.js.map +1 -1
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.d.ts +1 -1
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.js.map +1 -1
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js +1 -0
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js.map +1 -1
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/PlusButton.js +10 -7
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/PlusButton.js.map +1 -1
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/const.d.ts +2 -2
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/const.js +2 -2
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/const.js.map +1 -1
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.d.ts +31 -0
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.js +173 -0
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.js.map +1 -0
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.css +71 -6
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.d.ts +1 -0
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js +41 -26
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js.map +1 -1
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.js +4 -7
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.js.map +1 -1
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.d.ts +13 -4
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.js +11 -9
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.js.map +1 -1
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.d.ts +4 -0
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.js +46 -0
- package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.js.map +1 -0
- package/build/esm/react-utils/hooks/useAutoSave.d.ts +23 -0
- package/build/esm/react-utils/hooks/useAutoSave.js +55 -0
- package/build/esm/react-utils/hooks/useAutoSave.js.map +1 -0
- package/build/esm/react-utils/hooks.d.ts +1 -1
- package/build/esm/react-utils/hooks.js +1 -0
- package/build/esm/react-utils/hooks.js.map +1 -1
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/build/esm/view/components/YfmHtml/YfmStaticView.d.ts +13 -0
- package/build/esm/view/components/YfmHtml/YfmStaticView.js +9 -3
- package/build/esm/view/components/YfmHtml/YfmStaticView.js.map +1 -1
- package/build/esm/view/components/YfmHtml/index.d.ts +1 -1
- package/build/esm/view/components/YfmHtml/index.js.map +1 -1
- package/build/styles.css +83 -15
- package/package.json +1 -1
package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"YfmHtmlBlockView.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useEffect, useMemo, useRef, useState} from 'react';\n\nimport {getStyles} from '@diplodoc/html-extension';\nimport type {IHTMLIFrameElementConfig} from '@diplodoc/html-extension/runtime';\nimport {Ellipsis as DotsIcon, Eye} from '@gravity-ui/icons';\nimport {Button, Icon, Label, Menu, Popup} from '@gravity-ui/uikit';\nimport type {Node} from 'prosemirror-model';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {cn} from 'src/classname';\nimport {SharedStateKey} from 'src/extensions/behavior/SharedState';\nimport {TextAreaFixed as TextArea} from 'src/forms/TextInput';\nimport {i18n} from 'src/i18n/common';\nimport {debounce} from 'src/lodash';\nimport {useBooleanState, useElementState} from 'src/react-utils/hooks';\nimport {useSharedEditingState} from 'src/react-utils/useSharedEditingState';\nimport {removeNode} from 'src/utils/remove-node';\n\nimport {YfmHtmlBlockConsts} from '../YfmHtmlBlockSpecs/const';\nimport type {YfmHtmlBlockOptions} from '../index';\nimport type {YfmHtmlBlockEntitySharedState} from '../types';\n\nimport './YfmHtmlBlock.scss';\n\nexport const cnYfmHtmlBlock = cn('yfm-html-block');\nexport const STOP_EVENT_CLASSNAME = 'prosemirror-stop-event';\n\nconst b = cnYfmHtmlBlock;\n\ninterface YfmHtmlBlockViewProps {\n html: string;\n onClick: () => void;\n config?: IHTMLIFrameElementConfig;\n}\n\nexport function generateID() {\n return Math.random().toString(36).substr(2, 8);\n}\n\nconst DEFAULT_PADDING = 20;\nconst DEFAULT_DELAY = 100;\n\nconst createLinkCLickHandler = (value: Element, document: Document) => (event: Event) => {\n event.preventDefault();\n const targetId = value.getAttribute('href');\n\n if (targetId) {\n const targetElement = document.querySelector(targetId);\n if (targetElement) {\n targetElement.scrollIntoView({behavior: 'smooth'});\n }\n }\n};\n\nconst YfmHtmlBlockPreview: React.FC<YfmHtmlBlockViewProps> = ({html, onClick, config}) => {\n const ref = useRef<HTMLIFrameElement>(null);\n const styles = useRef<Record<string, string>>({});\n const classNames = useRef<string[]>([]);\n const resizeConfig = useRef<Record<string, number>>({});\n\n const [height, setHeight] = useState('100%');\n\n useEffect(() => {\n setStyles(config?.styles);\n setClassNames(config?.classNames);\n }, [config, ref.current?.contentWindow?.document?.body]);\n\n const handleLoadIFrame = () => {\n const contentWindow = ref.current?.contentWindow;\n\n handleResizeIFrame();\n\n if (contentWindow) {\n const frameDocument = contentWindow.document;\n frameDocument.addEventListener('dblclick', () => {\n onClick();\n });\n }\n };\n\n const handleResizeIFrame = () => {\n if (ref.current) {\n const contentWindow = ref.current?.contentWindow;\n if (contentWindow) {\n const body = contentWindow.document.body;\n if (body) {\n const height =\n body.scrollHeight +\n (resizeConfig.current?.padding || DEFAULT_PADDING) +\n 'px';\n\n setHeight(height);\n }\n }\n }\n };\n\n const setClassNames = (newClassNames: string[] | undefined) => {\n const body = ref.current?.contentWindow?.document.body;\n\n if (body && newClassNames) {\n const previousClassNames = classNames.current;\n\n // remove all classes that were in previousClassNames but are not in classNames\n previousClassNames.forEach((className) => {\n if (!newClassNames.includes(className)) {\n body.classList.remove(className);\n }\n });\n\n // add classes that are in classNames\n newClassNames.forEach((className) => {\n if (!body.classList.contains(className)) {\n body.classList.add(className);\n }\n });\n\n classNames.current = newClassNames;\n }\n };\n\n const setStyles = (newStyles: Record<string, string> | undefined) => {\n const body = ref.current?.contentWindow?.document.body;\n\n if (body && newStyles) {\n const previousStyles = styles.current;\n\n // remove all styles that are in previousStyles but not in styles\n Object.keys(previousStyles).forEach((property) => {\n if (!Object.prototype.hasOwnProperty.call(newStyles, property)) {\n body.style.removeProperty(property);\n }\n });\n\n // sdd or update styles that are in styles\n Object.keys(newStyles).forEach((property) => {\n body.style.setProperty(property, newStyles[property]);\n });\n\n // update current styles to the new styles\n styles.current = newStyles;\n }\n };\n\n // finds all relative links (href^=\"#\") and changes their click behavior\n const createAnchorLinkHandlers = (type: 'add' | 'remove') => () => {\n const document = ref.current?.contentWindow!.document;\n\n if (document) {\n document.querySelectorAll('a[href^=\"#\"]').forEach((value: Element) => {\n const handler = createLinkCLickHandler(value, document);\n if (type === 'add') {\n value.addEventListener('click', handler);\n } else {\n value.removeEventListener('click', handler);\n }\n });\n }\n };\n\n useEffect(() => {\n ref.current?.addEventListener('load', handleLoadIFrame);\n ref.current?.addEventListener('load', createAnchorLinkHandlers('add'));\n return () => {\n ref.current?.removeEventListener('load', handleLoadIFrame);\n ref.current?.removeEventListener('load', createAnchorLinkHandlers('remove'));\n };\n }, [html]);\n\n useEffect(() => {\n if (ref.current) {\n const resizeObserver = new window.ResizeObserver(\n debounce(handleResizeIFrame, DEFAULT_DELAY),\n );\n resizeObserver.observe(ref.current);\n }\n }, [ref.current?.contentWindow?.document?.body]);\n\n return (\n <iframe\n style={{\n height,\n }}\n ref={ref}\n title={generateID()}\n frameBorder={0}\n className={b('content')}\n srcDoc={html}\n />\n );\n};\n\nconst CodeEditMode: React.FC<{\n initialText: string;\n onSave: (v: string) => void;\n onCancel: () => void;\n}> = ({initialText, onSave, onCancel}) => {\n const [text, setText] = useState(initialText || '\\n');\n\n return (\n <div className={b({editing: true})}>\n <div className={b('editor')}>\n <TextArea\n controlProps={{\n className: STOP_EVENT_CLASSNAME,\n }}\n value={text}\n onUpdate={(v) => {\n setText(v);\n }}\n autoFocus\n />\n\n <div className={b('controls')}>\n <div>\n <Button onClick={onCancel} view={'flat'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('cancel')}</span>\n </Button>\n <Button onClick={() => onSave(text)} view={'action'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('save')}</span>\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport const YfmHtmlBlockView: React.FC<{\n getPos: () => number | undefined;\n node: Node;\n onChange: (attrs: {[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: string}) => void;\n options: YfmHtmlBlockOptions;\n view: EditorView;\n}> = ({\n onChange,\n node,\n getPos,\n view,\n options: {useConfig, sanitize, styles, baseTarget = '_parent', head: headContent = ''},\n}) => {\n const entityId: string = node.attrs[YfmHtmlBlockConsts.NodeAttrs.EntityId];\n const entityKey = useMemo(\n () => SharedStateKey.define<YfmHtmlBlockEntitySharedState>({name: entityId}),\n [entityId],\n );\n\n const config = useConfig?.();\n\n const [editing, setEditing, unsetEditing] = useSharedEditingState(view, entityKey);\n const [menuOpen, _openMenu, closeMenu, toggleMenuOpen] = useBooleanState(false);\n const [anchorElement, setAnchorElement] = useElementState();\n\n if (editing) {\n return (\n <CodeEditMode\n initialText={node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc]}\n onCancel={unsetEditing}\n onSave={(v) => {\n onChange({[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: v});\n unsetEditing();\n }}\n />\n );\n }\n\n let additional = baseTarget ? `<base target=\"${baseTarget}\">` : '';\n if (styles) {\n const stylesContent =\n typeof styles === 'string'\n ? `<link rel=\"stylesheet\" href=\"${styles}\" />`\n : `<style>${getStyles(styles)}</style>`;\n additional += stylesContent;\n }\n\n const head = `<head>${headContent || additional}</head>`;\n const body = `<body>${node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc] ?? ''}</body>`;\n const html = `<!DOCTYPE html><html>${head}${body}</html>`;\n\n const sanitizeFunction = typeof sanitize === 'function' ? sanitize : sanitize?.body;\n\n const resultHtml = sanitizeFunction ? sanitizeFunction(html) : html;\n\n return (\n <div className={b()} onDoubleClick={setEditing}>\n <Label className={b('label')} icon={<Icon size={16} data={Eye} />}>\n {i18n('preview')}\n </Label>\n <YfmHtmlBlockPreview html={resultHtml} onClick={setEditing} config={config} />\n\n <div className={b('menu')}>\n <Button\n onClick={toggleMenuOpen}\n ref={setAnchorElement}\n size=\"s\"\n className={STOP_EVENT_CLASSNAME}\n >\n <Icon data={DotsIcon} className={STOP_EVENT_CLASSNAME} />\n </Button>\n <Popup\n anchorElement={anchorElement}\n open={menuOpen}\n onOpenChange={closeMenu}\n placement=\"bottom-end\"\n >\n <Menu>\n <Menu.Item\n onClick={() => {\n setEditing();\n closeMenu();\n }}\n >\n {i18n('edit')}\n </Menu.Item>\n <Menu.Item\n onClick={() => {\n const pos = getPos();\n if (pos === undefined) return;\n removeNode({\n node,\n pos,\n tr: view.state.tr,\n dispatch: view.dispatch,\n });\n }}\n >\n {i18n('remove')}\n </Menu.Item>\n </Menu>\n </Popup>\n </div>\n </div>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"YfmHtmlBlockView.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useEffect, useMemo, useRef, useState} from 'react';\n\nimport {getStyles} from '@diplodoc/html-extension';\nimport type {IHTMLIFrameElementConfig} from '@diplodoc/html-extension/runtime';\nimport {Ellipsis as DotsIcon, Eye} from '@gravity-ui/icons';\nimport {Button, Icon, Label, Menu, Popup} from '@gravity-ui/uikit';\nimport type {Node} from 'prosemirror-model';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {cn} from 'src/classname';\nimport {SharedStateKey} from 'src/extensions/behavior/SharedState';\nimport {TextAreaFixed as TextArea} from 'src/forms/TextInput';\nimport {i18n} from 'src/i18n/common';\nimport {debounce} from 'src/lodash';\nimport {useAutoSave, useBooleanState, useElementState} from 'src/react-utils/hooks';\nimport {useSharedEditingState} from 'src/react-utils/useSharedEditingState';\nimport {removeNode} from 'src/utils/remove-node';\n\nimport {YfmHtmlBlockConsts} from '../YfmHtmlBlockSpecs/const';\nimport type {YfmHtmlBlockOptions} from '../index';\nimport type {YfmHtmlBlockEntitySharedState} from '../types';\n\nimport './YfmHtmlBlock.scss';\n\nexport const cnYfmHtmlBlock = cn('yfm-html-block');\nexport const STOP_EVENT_CLASSNAME = 'prosemirror-stop-event';\n\nconst b = cnYfmHtmlBlock;\n\ninterface YfmHtmlBlockViewProps {\n html: string;\n onClick: () => void;\n config?: IHTMLIFrameElementConfig;\n}\n\nexport function generateID() {\n return Math.random().toString(36).substr(2, 8);\n}\n\nconst DEFAULT_PADDING = 20;\nconst DEFAULT_DELAY = 100;\n\nconst createLinkCLickHandler = (value: Element, document: Document) => (event: Event) => {\n event.preventDefault();\n const targetId = value.getAttribute('href');\n\n if (targetId) {\n const targetElement = document.querySelector(targetId);\n if (targetElement) {\n targetElement.scrollIntoView({behavior: 'smooth'});\n }\n }\n};\n\nconst YfmHtmlBlockPreview: React.FC<YfmHtmlBlockViewProps> = ({html, onClick, config}) => {\n const ref = useRef<HTMLIFrameElement>(null);\n const styles = useRef<Record<string, string>>({});\n const classNames = useRef<string[]>([]);\n const resizeConfig = useRef<Record<string, number>>({});\n\n const [height, setHeight] = useState('100%');\n\n useEffect(() => {\n setStyles(config?.styles);\n setClassNames(config?.classNames);\n }, [config, ref.current?.contentWindow?.document?.body]);\n\n const handleLoadIFrame = () => {\n const contentWindow = ref.current?.contentWindow;\n\n handleResizeIFrame();\n\n if (contentWindow) {\n const frameDocument = contentWindow.document;\n frameDocument.addEventListener('dblclick', () => {\n onClick();\n });\n }\n };\n\n const handleResizeIFrame = () => {\n if (ref.current) {\n const contentWindow = ref.current?.contentWindow;\n if (contentWindow) {\n const body = contentWindow.document.body;\n if (body) {\n const height =\n body.scrollHeight +\n (resizeConfig.current?.padding || DEFAULT_PADDING) +\n 'px';\n\n setHeight(height);\n }\n }\n }\n };\n\n const setClassNames = (newClassNames: string[] | undefined) => {\n const body = ref.current?.contentWindow?.document.body;\n\n if (body && newClassNames) {\n const previousClassNames = classNames.current;\n\n // remove all classes that were in previousClassNames but are not in classNames\n previousClassNames.forEach((className) => {\n if (!newClassNames.includes(className)) {\n body.classList.remove(className);\n }\n });\n\n // add classes that are in classNames\n newClassNames.forEach((className) => {\n if (!body.classList.contains(className)) {\n body.classList.add(className);\n }\n });\n\n classNames.current = newClassNames;\n }\n };\n\n const setStyles = (newStyles: Record<string, string> | undefined) => {\n const body = ref.current?.contentWindow?.document.body;\n\n if (body && newStyles) {\n const previousStyles = styles.current;\n\n // remove all styles that are in previousStyles but not in styles\n Object.keys(previousStyles).forEach((property) => {\n if (!Object.prototype.hasOwnProperty.call(newStyles, property)) {\n body.style.removeProperty(property);\n }\n });\n\n // sdd or update styles that are in styles\n Object.keys(newStyles).forEach((property) => {\n body.style.setProperty(property, newStyles[property]);\n });\n\n // update current styles to the new styles\n styles.current = newStyles;\n }\n };\n\n // finds all relative links (href^=\"#\") and changes their click behavior\n const createAnchorLinkHandlers = (type: 'add' | 'remove') => () => {\n const document = ref.current?.contentWindow!.document;\n\n if (document) {\n document.querySelectorAll('a[href^=\"#\"]').forEach((value: Element) => {\n const handler = createLinkCLickHandler(value, document);\n if (type === 'add') {\n value.addEventListener('click', handler);\n } else {\n value.removeEventListener('click', handler);\n }\n });\n }\n };\n\n useEffect(() => {\n ref.current?.addEventListener('load', handleLoadIFrame);\n ref.current?.addEventListener('load', createAnchorLinkHandlers('add'));\n return () => {\n ref.current?.removeEventListener('load', handleLoadIFrame);\n ref.current?.removeEventListener('load', createAnchorLinkHandlers('remove'));\n };\n }, [html]);\n\n useEffect(() => {\n if (ref.current) {\n const resizeObserver = new window.ResizeObserver(\n debounce(handleResizeIFrame, DEFAULT_DELAY),\n );\n resizeObserver.observe(ref.current);\n }\n }, [ref.current?.contentWindow?.document?.body]);\n\n return (\n <iframe\n style={{\n height,\n }}\n ref={ref}\n title={generateID()}\n frameBorder={0}\n className={b('content')}\n srcDoc={html}\n />\n );\n};\n\nconst CodeEditMode: React.FC<{\n initialText: string;\n onSave: (v: string) => void;\n onCancel: () => void;\n options: YfmHtmlBlockOptions;\n}> = ({initialText, onSave, onCancel, options: {autoSave}}) => {\n const {value, handleChange, handleManualSave, isSaveDisabled} = useAutoSave({\n initialValue: initialText || '\\n',\n onSave,\n onClose: onCancel,\n autoSave,\n });\n\n return (\n <div className={b({editing: true})}>\n <div className={b('editor')}>\n <TextArea\n controlProps={{\n className: STOP_EVENT_CLASSNAME,\n }}\n value={value}\n onUpdate={handleChange}\n autoFocus\n />\n\n <div className={b('controls')}>\n <div>\n <Button onClick={onCancel} view={'flat'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('cancel')}</span>\n </Button>\n <Button\n onClick={handleManualSave}\n view={'action'}\n disabled={isSaveDisabled}\n >\n <span className={STOP_EVENT_CLASSNAME}>{i18n('save')}</span>\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport const YfmHtmlBlockView: React.FC<{\n getPos: () => number | undefined;\n node: Node;\n onChange: (attrs: {[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: string}) => void;\n options: YfmHtmlBlockOptions;\n view: EditorView;\n}> = ({onChange, node, getPos, view, options}) => {\n const {useConfig, sanitize, styles, baseTarget = '_parent', head: headContent = ''} = options;\n const entityId: string = node.attrs[YfmHtmlBlockConsts.NodeAttrs.EntityId];\n const entityKey = useMemo(\n () => SharedStateKey.define<YfmHtmlBlockEntitySharedState>({name: entityId}),\n [entityId],\n );\n\n const config = useConfig?.();\n\n const [editing, setEditing, unsetEditing] = useSharedEditingState(view, entityKey);\n const [menuOpen, _openMenu, closeMenu, toggleMenuOpen] = useBooleanState(false);\n const [anchorElement, setAnchorElement] = useElementState();\n\n if (editing) {\n return (\n <CodeEditMode\n initialText={node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc]}\n onCancel={unsetEditing}\n onSave={(v) => {\n onChange({[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: v});\n }}\n options={options}\n />\n );\n }\n\n let additional = baseTarget ? `<base target=\"${baseTarget}\">` : '';\n if (styles) {\n const stylesContent =\n typeof styles === 'string'\n ? `<link rel=\"stylesheet\" href=\"${styles}\" />`\n : `<style>${getStyles(styles)}</style>`;\n additional += stylesContent;\n }\n\n const head = `<head>${headContent || additional}</head>`;\n const body = `<body>${node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc] ?? ''}</body>`;\n const html = `<!DOCTYPE html><html>${head}${body}</html>`;\n\n const sanitizeFunction = typeof sanitize === 'function' ? sanitize : sanitize?.body;\n\n const resultHtml = sanitizeFunction ? sanitizeFunction(html) : html;\n\n return (\n <div className={b()} onDoubleClick={setEditing}>\n <Label className={b('label')} icon={<Icon size={16} data={Eye} />}>\n {i18n('preview')}\n </Label>\n <YfmHtmlBlockPreview html={resultHtml} onClick={setEditing} config={config} />\n\n <div className={b('menu')}>\n <Button\n onClick={toggleMenuOpen}\n ref={setAnchorElement}\n size=\"s\"\n className={STOP_EVENT_CLASSNAME}\n >\n <Icon data={DotsIcon} className={STOP_EVENT_CLASSNAME} />\n </Button>\n <Popup\n anchorElement={anchorElement}\n open={menuOpen}\n onOpenChange={closeMenu}\n placement=\"bottom-end\"\n >\n <Menu>\n <Menu.Item\n onClick={() => {\n setEditing();\n closeMenu();\n }}\n >\n {i18n('edit')}\n </Menu.Item>\n <Menu.Item\n onClick={() => {\n const pos = getPos();\n if (pos === undefined) return;\n removeNode({\n node,\n pos,\n tr: view.state.tr,\n dispatch: view.dispatch,\n });\n }}\n >\n {i18n('remove')}\n </Menu.Item>\n </Menu>\n </Popup>\n </div>\n </div>\n );\n};\n"]}
|
|
@@ -4,6 +4,10 @@ import type { Action, ExtensionAuto } from "../../../core/index.js";
|
|
|
4
4
|
import { YfmHtmlBlockAction } from "./YfmHtmlBlockSpecs/const.js";
|
|
5
5
|
export interface YfmHtmlBlockOptions extends Omit<PluginOptions, 'runtimeJsPath' | 'containerClasses' | 'bundle' | 'embeddingMode'> {
|
|
6
6
|
useConfig?: () => IHTMLIFrameElementConfig | undefined;
|
|
7
|
+
autoSave?: {
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
delay?: number;
|
|
10
|
+
};
|
|
7
11
|
}
|
|
8
12
|
export declare const YfmHtmlBlock: ExtensionAuto<YfmHtmlBlockOptions>;
|
|
9
13
|
declare global {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/additional/YfmHtmlBlock/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,qBAAqB,EAAC,wCAA+B;AAC7D,OAAO,EAAC,iBAAiB,EAAC,qCAA4B;AACtD,OAAO,EAAC,kBAAkB,EAAC,qCAAkC;AAC7D,OAAO,EAAC,eAAe,EAAC,qBAAkB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/additional/YfmHtmlBlock/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,qBAAqB,EAAC,wCAA+B;AAC7D,OAAO,EAAC,iBAAiB,EAAC,qCAA4B;AACtD,OAAO,EAAC,kBAAkB,EAAC,qCAAkC;AAC7D,OAAO,EAAC,eAAe,EAAC,qBAAkB;AAW1C,MAAM,CAAC,MAAM,YAAY,GAAuC,CAC5D,OAAO,EACP,EAAC,SAAS,EAAE,CAAC,EAAE,GAAG,OAAO,EAAC,EAC5B,EAAE;IACA,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE;QAC3B,QAAQ,EAAE,2BAA2B,CAAC,OAAO,CAAC;QAC9C,GAAG,OAAO;KACb,CAAC,CAAC;IAEH,OAAO,CAAC,SAAS,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC;AACjE,CAAC,CAAC;AAEF,MAAM,2BAA2B,GAEmB,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;IAC1F,OAAO,IAAI,qBAAqB,CAAC,EAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAC,CAAC,CAAC;AACpE,CAAC,CAAC","sourcesContent":["import type {PluginOptions} from '@diplodoc/html-extension';\nimport type {IHTMLIFrameElementConfig} from '@diplodoc/html-extension/runtime';\n\nimport type {Action, ExtensionAuto, ExtensionDeps, NodeViewConstructor} from '../../../core';\n\nimport {WYfmHtmlBlockNodeView} from './YfmHtmlBlockNodeView';\nimport {YfmHtmlBlockSpecs} from './YfmHtmlBlockSpecs';\nimport {YfmHtmlBlockAction} from './YfmHtmlBlockSpecs/const';\nimport {addYfmHtmlBlock} from './actions';\n\nexport interface YfmHtmlBlockOptions\n extends Omit<PluginOptions, 'runtimeJsPath' | 'containerClasses' | 'bundle' | 'embeddingMode'> {\n useConfig?: () => IHTMLIFrameElementConfig | undefined;\n autoSave?: {\n enabled: boolean;\n delay?: number; // по умолчанию 1000ms\n };\n}\n\nexport const YfmHtmlBlock: ExtensionAuto<YfmHtmlBlockOptions> = (\n builder,\n {useConfig: _, ...options},\n) => {\n builder.use(YfmHtmlBlockSpecs, {\n nodeView: YfmHtmlBlockNodeViewFactory(options),\n ...options,\n });\n\n builder.addAction(YfmHtmlBlockAction, () => addYfmHtmlBlock);\n};\n\nconst YfmHtmlBlockNodeViewFactory: (\n options: YfmHtmlBlockOptions,\n) => (deps: ExtensionDeps) => NodeViewConstructor = (options) => () => (node, view, getPos) => {\n return new WYfmHtmlBlockNodeView({node, view, getPos, options});\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [YfmHtmlBlockAction]: Action;\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/base/BaseSchema/BaseSchemaSpecs/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/base/BaseSchema/BaseSchemaSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {NodeSpec} from 'prosemirror-model';\n\nimport {isEmptyString} from 'src/utils';\n\nimport type {ExtensionAuto} from '../../../../core';\nimport {nodeTypeFactory} from '../../../../utils/schema';\n\nexport enum BaseNode {\n Doc = 'doc',\n Text = 'text',\n Paragraph = 'paragraph',\n}\n\nconst paragraphLineNumberAttr = 'data-line';\n\nexport const pType = nodeTypeFactory(BaseNode.Paragraph);\n\nexport type BaseSchemaSpecsOptions = {\n // This cannot be passed through placeholder option of BehaviorPreset because BasePreset initializes first\n paragraphPlaceholder?: NonNullable<NodeSpec['placeholder']>['content'];\n preserveEmptyRows?: boolean;\n};\n\nexport const BaseSchemaSpecs: ExtensionAuto<BaseSchemaSpecsOptions> = (builder, opts) => {\n builder\n .addNode(BaseNode.Doc, () => ({\n spec: {\n content: 'block+',\n },\n fromMd: {tokenSpec: {name: BaseNode.Doc, type: 'block', ignore: true}},\n toMd: () => {\n throw new Error('Unexpected toMd() call on doc node');\n },\n }))\n .addNode(BaseNode.Text, () => ({\n spec: {\n group: 'inline',\n },\n fromMd: {tokenSpec: {name: BaseNode.Text, type: 'node', ignore: true}},\n toMd: (state, node, parent) => {\n const {escapeText} = parent.type.spec;\n state.text(node.text ?? '', escapeText ?? !state.isAutolink);\n },\n }))\n .addNode(BaseNode.Paragraph, () => ({\n spec: {\n attrs: {[paragraphLineNumberAttr]: {default: null}},\n content: 'inline*',\n group: 'block',\n parseDOM: [{tag: 'p'}],\n toDOM(node) {\n const lineNumber = node.attrs[paragraphLineNumberAttr];\n\n return [\n 'p',\n lineNumber === null ? {} : {[paragraphLineNumberAttr]: lineNumber},\n 0,\n ];\n },\n selectable: true,\n placeholder: opts.paragraphPlaceholder\n ? {\n content: opts.paragraphPlaceholder,\n alwaysVisible: false,\n }\n : undefined,\n },\n fromMd: {tokenSpec: {name: BaseNode.Paragraph, type: 'block'}},\n toMd: (state, node, parent) => {\n /*\n An empty line is added only if there is some content in the parent element.\n This is necessary in order to prevent an empty document with empty lines\n */\n if (opts.preserveEmptyRows && isEmptyString(node)) {\n let isParentEmpty = true;\n\n for (let index = 0; index < parent.content.childCount; index++) {\n const parentChild = parent.content.child(index);\n if (\n parentChild.content.size !== 0 ||\n parentChild.type.name !== 'paragraph'\n ) {\n isParentEmpty = false;\n }\n }\n\n if (!isParentEmpty) {\n state.write(' \\n');\n state.write('\\n');\n }\n } else {\n state.renderInline(node);\n state.closeBlock(node);\n }\n },\n }));\n};\n"]}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import '@diplodoc/transform/dist/js/base.js';
|
|
2
2
|
import '@diplodoc/transform/dist/js/_yfm-only.js';
|
|
3
3
|
import type { ExtensionAuto } from "../../../core/index.js";
|
|
4
|
+
import { type YfmMods } from "../../../view/components/YfmHtml/YfmStaticView.js";
|
|
4
5
|
import { type YfmConfigsSpecsOptions } from "./YfmConfigsSpecs/index.js";
|
|
5
6
|
import '@diplodoc/transform/dist/css/base.css';
|
|
6
7
|
import '@diplodoc/transform/dist/css/_yfm-only.css';
|
|
7
8
|
import "./yfm.css";
|
|
8
|
-
export type YfmConfigsOptions = YfmConfigsSpecsOptions & {
|
|
9
|
+
export type YfmConfigsOptions = YfmConfigsSpecsOptions & {
|
|
10
|
+
mods?: YfmMods;
|
|
11
|
+
mix?: string;
|
|
12
|
+
};
|
|
9
13
|
export declare const YfmConfigs: ExtensionAuto<YfmConfigsOptions>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import '@diplodoc/transform/dist/js/base.js';
|
|
2
2
|
import '@diplodoc/transform/dist/js/_yfm-only.js'; // eslint-disable-line import/order
|
|
3
3
|
import { Plugin } from 'prosemirror-state';
|
|
4
|
+
import { b } from "../../../view/components/YfmHtml/YfmStaticView.js";
|
|
4
5
|
import { YfmConfigsSpecs } from "./YfmConfigsSpecs/index.js";
|
|
5
6
|
import '@diplodoc/transform/dist/css/base.css';
|
|
6
7
|
import '@diplodoc/transform/dist/css/_yfm-only.css'; // eslint-disable-line import/order
|
|
@@ -8,10 +9,15 @@ import "./yfm.css"; // eslint-disable-line import/order
|
|
|
8
9
|
export const YfmConfigs = (builder, opts) => {
|
|
9
10
|
// apply md-it-attrs plugin and ignore yfm lint token
|
|
10
11
|
builder.use(YfmConfigsSpecs, opts);
|
|
12
|
+
const { mix } = opts;
|
|
13
|
+
const mods = { ...opts.mods };
|
|
14
|
+
// by default mods['no-list-reset']===true
|
|
15
|
+
if (mods['no-list-reset'] !== false)
|
|
16
|
+
mods['no-list-reset'] = true;
|
|
11
17
|
builder.addPlugin(() => new Plugin({
|
|
12
18
|
props: {
|
|
13
19
|
attributes: {
|
|
14
|
-
class:
|
|
20
|
+
class: `${b(mods, mix)} yfm-editor`,
|
|
15
21
|
},
|
|
16
22
|
},
|
|
17
23
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/YfmConfigs/index.ts"],"names":[],"mappings":"AAAA,OAAO,qCAAqC,CAAC;AAC7C,OAAO,0CAA0C,CAAC,CAAC,mCAAmC;AACtF,OAAO,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/YfmConfigs/index.ts"],"names":[],"mappings":"AAAA,OAAO,qCAAqC,CAAC;AAC7C,OAAO,0CAA0C,CAAC,CAAC,mCAAmC;AACtF,OAAO,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAC;AAGzC,OAAO,EAAe,CAAC,EAAC,0DAAkD;AAE1E,OAAO,EAAC,eAAe,EAA8B,mCAA0B;AAE/E,OAAO,uCAAuC,CAAC;AAC/C,OAAO,4CAA4C,CAAC,CAAC,mCAAmC;AACxF,mBAAoB,CAAC,mCAAmC;AAOxD,MAAM,CAAC,MAAM,UAAU,GAAqC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC1E,qDAAqD;IACrD,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAEnC,MAAM,EAAC,GAAG,EAAC,GAAG,IAAI,CAAC;IACnB,MAAM,IAAI,GAAG,EAAC,GAAG,IAAI,CAAC,IAAI,EAAC,CAAC;IAC5B,0CAA0C;IAC1C,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,KAAK;QAAE,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;IAElE,OAAO,CAAC,SAAS,CACb,GAAG,EAAE,CACD,IAAI,MAAM,CAAC;QACP,KAAK,EAAE;YACH,UAAU,EAAE;gBACR,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,aAAa;aACtC;SACJ;KACJ,CAAC,CACT,CAAC;AACN,CAAC,CAAC","sourcesContent":["import '@diplodoc/transform/dist/js/base.js';\nimport '@diplodoc/transform/dist/js/_yfm-only.js'; // eslint-disable-line import/order\nimport {Plugin} from 'prosemirror-state';\n\nimport type {ExtensionAuto} from '#core';\nimport {type YfmMods, b} from 'src/view/components/YfmHtml/YfmStaticView';\n\nimport {YfmConfigsSpecs, type YfmConfigsSpecsOptions} from './YfmConfigsSpecs';\n\nimport '@diplodoc/transform/dist/css/base.css';\nimport '@diplodoc/transform/dist/css/_yfm-only.css'; // eslint-disable-line import/order\nimport './yfm.scss'; // eslint-disable-line import/order\n\nexport type YfmConfigsOptions = YfmConfigsSpecsOptions & {\n mods?: YfmMods;\n mix?: string;\n};\n\nexport const YfmConfigs: ExtensionAuto<YfmConfigsOptions> = (builder, opts) => {\n // apply md-it-attrs plugin and ignore yfm lint token\n builder.use(YfmConfigsSpecs, opts);\n\n const {mix} = opts;\n const mods = {...opts.mods};\n // by default mods['no-list-reset']===true\n if (mods['no-list-reset'] !== false) mods['no-list-reset'] = true;\n\n builder.addPlugin(\n () =>\n new Plugin({\n props: {\n attributes: {\n class: `${b(mods, mix)} yfm-editor`,\n },\n },\n }),\n );\n};\n"]}
|
|
@@ -4,7 +4,7 @@ export type FloatingMenuProps = {
|
|
|
4
4
|
canDrag: boolean;
|
|
5
5
|
anchorElement: Element;
|
|
6
6
|
dropdownItems: DropdownMenuProps<unknown>['items'];
|
|
7
|
-
switcherMouseProps?: Pick<ButtonButtonProps, 'onMouseDown' | 'onMouseMove' | 'onMouseUp'>;
|
|
7
|
+
switcherMouseProps?: Pick<ButtonButtonProps, 'onMouseDown' | 'onMouseMove' | 'onMouseUp' | 'onMouseLeave'>;
|
|
8
8
|
onOpenToggle: NonNullable<DropdownMenuProps<unknown>['onOpenToggle']>;
|
|
9
9
|
};
|
|
10
10
|
export declare const FloatingMenu: React.FC<FloatingMenuProps>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FloatingMenu.js","sourceRoot":"../../../../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAC,QAAQ,IAAI,UAAU,EAAE,cAAc,IAAI,UAAU,EAAC,MAAM,mBAAmB,CAAC;AACvF,OAAO,EACH,MAAM,EAEN,YAAY,EAEZ,IAAI,EACJ,IAAI,GACP,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAC,eAAe,EAAC,kDAAwB;AAEhD,OAAO,EAAC,aAAa,EAA0B,kCAAyB;AAExE,MAAM,WAAW,GAAiC;IAC9C,QAAQ,EAAE,CAAC,GAAG;CACjB,CAAC;
|
|
1
|
+
{"version":3,"file":"FloatingMenu.js","sourceRoot":"../../../../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAC,QAAQ,IAAI,UAAU,EAAE,cAAc,IAAI,UAAU,EAAC,MAAM,mBAAmB,CAAC;AACvF,OAAO,EACH,MAAM,EAEN,YAAY,EAEZ,IAAI,EACJ,IAAI,GACP,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAC,eAAe,EAAC,kDAAwB;AAEhD,OAAO,EAAC,aAAa,EAA0B,kCAAyB;AAExE,MAAM,WAAW,GAAiC;IAC9C,QAAQ,EAAE,CAAC,GAAG;CACjB,CAAC;AAcF,MAAM,CAAC,MAAM,YAAY,GAAgC,SAAS,oBAAoB,CAAC,KAAK;IACxF,MAAM,EAAC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,YAAY,EAAC,GACpF,KAAK,CAAC;IAEV,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,YAAY,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAErE,MAAM,cAAc,GAAG,YAAY,IAAI,SAAS,CAAC;IACjD,MAAM,SAAS,GAAG,OAAO,KAAK,KAAK,CAAC;IAEpC,OAAO,CACH,KAAC,aAAa,IACV,IAAI,QACJ,MAAM,EAAE,WAAW,EACnB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EACrC,cAAc,EAAE;YACZ,UAAU,EAAE,SAAS;SACxB,EACD,KAAK,EAAE;YACH,eAAe,EAAE,aAAa;SACjC,YAED,KAAC,YAAY,IACT,YAAY,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;gBACtB,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC;gBACvB,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC;YAC1B,CAAC,EACD,cAAc,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,CAC/B,KAAC,IAAI,IACD,aAAa,QACb,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,KAAK,EAAE;oBACH,YAAY,EAAE,2BAA2B;oBACzC,eAAe,EAAE,cAAc;wBAC3B,CAAC,CAAC,gCAAgC;wBAClC,CAAC,CAAC,SAAS;iBAClB,EACD,YAAY,EAAE,UAAU,EACxB,YAAY,EAAE,YAAY,YAE1B,KAAC,MAAM,IACH,KAAK,EAAE;wBACH,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;wBACpC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;wBAClD,mBAAmB,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK;wBACvD,uBAAuB,EAAE,cAAc;4BACnC,CAAC,CAAC,SAAS;4BACX,CAAC,CAAC,gCAAgC;qBACzC,EACD,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,UAAU,EACnD,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,EACrD,IAAI,EAAC,IAAI,EACT,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,2BAA2B,KAClE,aAAa,KACb,kBAAkB,YAErB,cAAc,CAAC,CAAC,CAAC,CACd,KAAC,IAAI,IAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,GAAI,CACpD,CAAC,CAAC,CAAC,CACA,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW;qBACxC,GACI,GACN,CACV,EACD,UAAU,EAAE;gBACR,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc;aACxD,EACD,SAAS,EAAE,EAAC,EAAE,EAAE,kBAAkB,OAAO,OAAO,EAAC,EACjD,KAAK,EAAE,aAAa,GACtB,GACU,CACnB,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {useState} from 'react';\n\nimport {Ellipsis as DotsColumn, GripHorizontal as GripColumn} from '@gravity-ui/icons';\nimport {\n Button,\n type ButtonButtonProps,\n DropdownMenu,\n type DropdownMenuProps,\n Flex,\n Icon,\n} from '@gravity-ui/uikit';\n\nimport {useBooleanState} from 'src/react-utils';\n\nimport {FloatingPopup, type FloatingPopupProps} from '../FloatingPopup';\n\nconst popupOffset: FloatingPopupProps['offset'] = {\n mainAxis: -9.5,\n};\n\nexport type FloatingMenuProps = {\n dirtype: 'row' | 'column';\n canDrag: boolean;\n anchorElement: Element;\n dropdownItems: DropdownMenuProps<unknown>['items'];\n switcherMouseProps?: Pick<\n ButtonButtonProps,\n 'onMouseDown' | 'onMouseMove' | 'onMouseUp' | 'onMouseLeave'\n >;\n onOpenToggle: NonNullable<DropdownMenuProps<unknown>['onOpenToggle']>;\n};\n\nexport const FloatingMenu: React.FC<FloatingMenuProps> = function YfmTableFloatingMenu(props) {\n const {dirtype, canDrag, anchorElement, dropdownItems, switcherMouseProps, onOpenToggle} =\n props;\n\n const [isMenuOpened, setMenuOpened] = useState(false);\n const [isHovered, setHovered, unsetHovered] = useBooleanState(false);\n\n const showActionView = isMenuOpened || isHovered;\n const isRowType = dirtype === 'row';\n\n return (\n <FloatingPopup\n open\n offset={popupOffset}\n anchorElement={anchorElement}\n placement={isRowType ? 'left' : 'top'}\n floatingStyles={{\n lineHeight: 'initial',\n }}\n style={{\n backgroundColor: 'transparent',\n }}\n >\n <DropdownMenu\n onOpenToggle={(...args) => {\n setMenuOpened(...args);\n onOpenToggle(...args);\n }}\n renderSwitcher={(switcherProps) => (\n <Flex\n centerContent\n width={20} // xs button\n height={20} // xs button\n style={{\n borderRadius: 'var(--g-border-radius-xs)',\n backgroundColor: showActionView\n ? 'var(--g-color-base-background)'\n : undefined,\n }}\n onMouseEnter={setHovered}\n onMouseLeave={unsetHovered}\n >\n <Button\n style={{\n cursor: canDrag ? 'grab' : undefined,\n transform: isRowType ? 'rotate(90deg)' : undefined,\n '--g-button-height': showActionView ? undefined : '5px',\n '--_--background-color': showActionView\n ? undefined\n : 'var(--g-color-base-background)',\n }}\n view={isMenuOpened ? 'outlined-action' : 'outlined'}\n pin={showActionView ? 'round-round' : 'circle-circle'}\n size=\"xs\"\n qa={isRowType ? 'g-md-yfm-table-row-btn' : 'g-md-yfm-table-column-btn'}\n {...switcherProps}\n {...switcherMouseProps}\n >\n {showActionView ? (\n <Icon data={canDrag ? GripColumn : DotsColumn} />\n ) : (\n String.fromCharCode(8194) // en space\n )}\n </Button>\n </Flex>\n )}\n popupProps={{\n zIndex: 1010,\n placement: isRowType ? 'right-start' : 'bottom-start',\n }}\n menuProps={{qa: `g-md-yfm-table-${dirtype}-menu`}}\n items={dropdownItems}\n />\n </FloatingPopup>\n );\n};\n"]}
|
|
@@ -54,6 +54,7 @@ export const FloatingMenuControl = function YfmTableFloatingMenuControl({ type,
|
|
|
54
54
|
]);
|
|
55
55
|
return (_jsx(FloatingMenu, { dirtype: type, canDrag: dndHandler ? dndHandler.canDrag() : false, onOpenToggle: onMenuOpenToggle, anchorElement: acnhorElement, switcherMouseProps: dndHandler
|
|
56
56
|
? {
|
|
57
|
+
onMouseLeave: dndHandler.control_handleMouseLeave,
|
|
57
58
|
onMouseDown: dndHandler.control_handleMouseDown,
|
|
58
59
|
onMouseMove: dndHandler.control_handleMouseMove,
|
|
59
60
|
onMouseUp: dndHandler.control_handleMouseUp,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FloatingMenuControl.js","sourceRoot":"../../../../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,OAAO,CAAC;AAE9B,OAAO,EACH,SAAS,EACT,SAAS,EACT,UAAU,EACV,OAAO,EACP,WAAW,IAAI,UAAU,EACzB,QAAQ,EACR,KAAK,GACR,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAC,IAAI,EAAC,MAAM,mBAAmB,CAAC;AAEvC,OAAO,EAAC,IAAI,EAAC,qDAA2B;AAGxC,OAAO,EAAC,YAAY,EAAyB,wCAAqC;AAelF,MAAM,CAAC,MAAM,mBAAmB,GAC5B,SAAS,2BAA2B,CAAC,EACjC,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACrB;IACG,MAAM,aAAa,GAAG,OAAO,CACzB,GAAG,EAAE,CACD;QACI;YACI;gBACI,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,aAAa,CAAC;gBAChC,EAAE,EAAE,6BAA6B,IAAI,SAAS;gBAC9C,MAAM,EAAE,mBAAmB;gBAC3B,SAAS,EAAE,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,GAAI;aAClE;YACD;gBACI,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,YAAY,CAAC;gBAC/B,EAAE,EAAE,6BAA6B,IAAI,QAAQ;gBAC7C,MAAM,EAAE,kBAAkB;gBAC1B,SAAS,EAAE,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,GAAI;aACrE;SACJ;QACD;YACI;gBACI,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC;gBACzB,EAAE,EAAE,kBAAkB,IAAI,cAAc;gBACxC,MAAM,EAAE,iBAAiB;gBACzB,SAAS,EAAE,KAAC,IAAI,IAAC,IAAI,EAAE,UAAU,GAAI;aACxC;SACJ;QACD;YACI;gBACI,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,UAAU,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC1D,EAAE,EAAE,gCAAgC,IAAI,EAAE;gBAC1C,MAAM,EAAE,kBAAkB;gBAC1B,SAAS,EAAE,KAAC,IAAI,IAAC,IAAI,EAAE,KAAK,GAAI;aACnC;YACD;gBACI,KAAK,EAAE,QAAQ;gBACf,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC;gBAC1B,EAAE,EAAE,oCAAoC;gBACxC,MAAM,EAAE,kBAAkB;gBAC1B,SAAS,EAAE,KAAC,IAAI,IAAC,IAAI,EAAE,QAAQ,GAAI;aACtC;SACJ;KACyC,EAClD;QACI,IAAI;QACJ,QAAQ;QACR,iBAAiB;QACjB,kBAAkB;QAClB,mBAAmB;QACnB,kBAAkB;QAClB,kBAAkB;KACrB,CACJ,CAAC;IAEF,OAAO,CACH,KAAC,YAAY,IACT,OAAO,EAAE,IAAI,EACb,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,EAClD,YAAY,EAAE,gBAAgB,EAC9B,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EACd,UAAU;YACN,CAAC,CAAC;gBACI,WAAW,EAAE,UAAU,CAAC,uBAAuB;gBAC/C,WAAW,EAAE,UAAU,CAAC,uBAAuB;gBAC/C,SAAS,EAAE,UAAU,CAAC,qBAAqB;aAC9C;YACH,CAAC,CAAC,SAAS,EAEnB,aAAa,EAAE,aAAa,GAC9B,CACL,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {useMemo} from 'react';\n\nimport {\n ArrowDown,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n BroomMotion as ClearCells,\n TrashBin,\n Xmark,\n} from '@gravity-ui/icons';\nimport {Icon} from '@gravity-ui/uikit';\n\nimport {i18n} from 'src/i18n/yfm-table';\n\nimport type {DnDControlHandler} from '../../dnd/dnd';\nimport {FloatingMenu, type FloatingMenuProps} from '../FloatingMenu/FloatingMenu';\n\nexport type FloatingMenuControlProps = {\n acnhorElement: Element;\n multiple: boolean;\n type: FloatingMenuProps['dirtype'];\n dndHandler?: DnDControlHandler;\n onMenuOpenToggle: FloatingMenuProps['onOpenToggle'];\n onClearCellsClick: () => void;\n onInsertBeforeClick: () => void;\n onInsertAfterClick: () => void;\n onRemoveRangeClick: () => void;\n onRemoveTableClick: () => void;\n};\n\nexport const FloatingMenuControl: React.FC<FloatingMenuControlProps> =\n function YfmTableFloatingMenuControl({\n type,\n multiple,\n dndHandler,\n acnhorElement,\n onMenuOpenToggle,\n onClearCellsClick,\n onInsertBeforeClick,\n onInsertAfterClick,\n onRemoveRangeClick,\n onRemoveTableClick,\n }) {\n const dropdownItems = useMemo<FloatingMenuProps['dropdownItems']>(\n () =>\n [\n [\n {\n text: i18n(`${type}.add.before`),\n qa: `g-md-yfm-table-action-add-${type}-before`,\n action: onInsertBeforeClick,\n iconStart: <Icon data={type === 'row' ? ArrowUp : ArrowLeft} />,\n },\n {\n text: i18n(`${type}.add.after`),\n qa: `g-md-yfm-table-action-add-${type}-after`,\n action: onInsertAfterClick,\n iconStart: <Icon data={type === 'row' ? ArrowDown : ArrowRight} />,\n },\n ],\n [\n {\n text: i18n('cells.clear'),\n qa: `g-md-yfm-table-${type}-clear-cells`,\n action: onClearCellsClick,\n iconStart: <Icon data={ClearCells} />,\n },\n ],\n [\n {\n text: i18n(`${type}.remove${multiple ? '.multiple' : ''}`),\n qa: `g-md-yfm-table-action-remove-${type}`,\n action: onRemoveRangeClick,\n iconStart: <Icon data={Xmark} />,\n },\n {\n theme: 'danger',\n text: i18n('table.remove'),\n qa: 'g-md-yfm-table-action-remove-table',\n action: onRemoveTableClick,\n iconStart: <Icon data={TrashBin} />,\n },\n ],\n ] satisfies FloatingMenuProps['dropdownItems'],\n [\n type,\n multiple,\n onClearCellsClick,\n onInsertAfterClick,\n onInsertBeforeClick,\n onRemoveRangeClick,\n onRemoveTableClick,\n ],\n );\n\n return (\n <FloatingMenu\n dirtype={type}\n canDrag={dndHandler ? dndHandler.canDrag() : false}\n onOpenToggle={onMenuOpenToggle}\n anchorElement={acnhorElement}\n switcherMouseProps={\n dndHandler\n ? {\n onMouseDown: dndHandler.control_handleMouseDown,\n onMouseMove: dndHandler.control_handleMouseMove,\n onMouseUp: dndHandler.control_handleMouseUp,\n }\n : undefined\n }\n dropdownItems={dropdownItems}\n />\n );\n };\n"]}
|
|
1
|
+
{"version":3,"file":"FloatingMenuControl.js","sourceRoot":"../../../../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useMemo} from 'react';\n\nimport {\n ArrowDown,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n BroomMotion as ClearCells,\n TrashBin,\n Xmark,\n} from '@gravity-ui/icons';\nimport {Icon} from '@gravity-ui/uikit';\n\nimport {i18n} from 'src/i18n/yfm-table';\n\nimport type {DnDControlHandler} from '../../dnd/dnd';\nimport {FloatingMenu, type FloatingMenuProps} from '../FloatingMenu/FloatingMenu';\n\nexport type FloatingMenuControlProps = {\n acnhorElement: Element;\n multiple: boolean;\n type: FloatingMenuProps['dirtype'];\n dndHandler?: DnDControlHandler;\n onMenuOpenToggle: FloatingMenuProps['onOpenToggle'];\n onClearCellsClick: () => void;\n onInsertBeforeClick: () => void;\n onInsertAfterClick: () => void;\n onRemoveRangeClick: () => void;\n onRemoveTableClick: () => void;\n};\n\nexport const FloatingMenuControl: React.FC<FloatingMenuControlProps> =\n function YfmTableFloatingMenuControl({\n type,\n multiple,\n dndHandler,\n acnhorElement,\n onMenuOpenToggle,\n onClearCellsClick,\n onInsertBeforeClick,\n onInsertAfterClick,\n onRemoveRangeClick,\n onRemoveTableClick,\n }) {\n const dropdownItems = useMemo<FloatingMenuProps['dropdownItems']>(\n () =>\n [\n [\n {\n text: i18n(`${type}.add.before`),\n qa: `g-md-yfm-table-action-add-${type}-before`,\n action: onInsertBeforeClick,\n iconStart: <Icon data={type === 'row' ? ArrowUp : ArrowLeft} />,\n },\n {\n text: i18n(`${type}.add.after`),\n qa: `g-md-yfm-table-action-add-${type}-after`,\n action: onInsertAfterClick,\n iconStart: <Icon data={type === 'row' ? ArrowDown : ArrowRight} />,\n },\n ],\n [\n {\n text: i18n('cells.clear'),\n qa: `g-md-yfm-table-${type}-clear-cells`,\n action: onClearCellsClick,\n iconStart: <Icon data={ClearCells} />,\n },\n ],\n [\n {\n text: i18n(`${type}.remove${multiple ? '.multiple' : ''}`),\n qa: `g-md-yfm-table-action-remove-${type}`,\n action: onRemoveRangeClick,\n iconStart: <Icon data={Xmark} />,\n },\n {\n theme: 'danger',\n text: i18n('table.remove'),\n qa: 'g-md-yfm-table-action-remove-table',\n action: onRemoveTableClick,\n iconStart: <Icon data={TrashBin} />,\n },\n ],\n ] satisfies FloatingMenuProps['dropdownItems'],\n [\n type,\n multiple,\n onClearCellsClick,\n onInsertAfterClick,\n onInsertBeforeClick,\n onRemoveRangeClick,\n onRemoveTableClick,\n ],\n );\n\n return (\n <FloatingMenu\n dirtype={type}\n canDrag={dndHandler ? dndHandler.canDrag() : false}\n onOpenToggle={onMenuOpenToggle}\n anchorElement={acnhorElement}\n switcherMouseProps={\n dndHandler\n ? {\n onMouseLeave: dndHandler.control_handleMouseLeave,\n onMouseDown: dndHandler.control_handleMouseDown,\n onMouseMove: dndHandler.control_handleMouseMove,\n onMouseUp: dndHandler.control_handleMouseUp,\n }\n : undefined\n }\n dropdownItems={dropdownItems}\n />\n );\n };\n"]}
|
|
@@ -11,12 +11,15 @@ export const PlusButton = function YfmTablePlusButton({ qa, onClick, onHoverChan
|
|
|
11
11
|
return (_jsx(Flex, { centerContent: true, width: 20, height: 20, onMouseEnter: setHovered, onMouseLeave: unsetHovered, style: {
|
|
12
12
|
borderRadius: '100px', // button circle border radius
|
|
13
13
|
backgroundColor: hovered ? 'var(--g-color-base-background)' : undefined,
|
|
14
|
-
}, children: _jsx(Button, { qa: qa, size: "xs", pin: "circle-circle", view: hovered ? 'outlined-action' : 'normal', onClick: onClick, style:
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
14
|
+
}, children: _jsx(Button, { qa: qa, size: "xs", pin: "circle-circle", view: hovered ? 'outlined-action' : 'normal', onClick: onClick, style: hovered
|
|
15
|
+
? {
|
|
16
|
+
'--g-button-background-color-hover': 'var(--g-color-base-background)',
|
|
17
|
+
}
|
|
18
|
+
: {
|
|
19
|
+
color: 'transparent',
|
|
20
|
+
'--g-button-height': '4px',
|
|
21
|
+
'--g-button-background-color': 'var(--g-color-line-generic-accent)',
|
|
22
|
+
'--g-button-border-color': 'var(--g-color-line-generic-accent)',
|
|
23
|
+
}, children: _jsx(Icon, { data: PlusIcon }) }) }));
|
|
21
24
|
};
|
|
22
25
|
//# sourceMappingURL=PlusButton.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlusButton.js","sourceRoot":"../../../../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/PlusButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAEhC,OAAO,EAAC,IAAI,IAAI,QAAQ,EAAC,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAAC,eAAe,EAAC,kDAAwB;AAOhD,MAAM,CAAC,MAAM,UAAU,GAA8B,SAAS,kBAAkB,CAAC,EAC7E,EAAE,EACF,OAAO,EACP,aAAa,GAChB;IACG,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACnE,SAAS,CAAC,GAAG,EAAE;QACX,aAAa,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IAE7B,OAAO,CACH,KAAC,IAAI,IACD,aAAa,QACb,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,YAAY,EAAE,UAAU,EACxB,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE;YACH,YAAY,EAAE,OAAO,EAAE,8BAA8B;YACrD,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,SAAS;SAC1E,YAED,KAAC,MAAM,IACH,EAAE,EAAE,EAAE,EACN,IAAI,EAAC,IAAI,EACT,GAAG,EAAC,eAAe,EACnB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAC5C,OAAO,EAAE,OAAO,EAChB,KAAK,
|
|
1
|
+
{"version":3,"file":"PlusButton.js","sourceRoot":"../../../../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/PlusButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAEhC,OAAO,EAAC,IAAI,IAAI,QAAQ,EAAC,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAAC,eAAe,EAAC,kDAAwB;AAOhD,MAAM,CAAC,MAAM,UAAU,GAA8B,SAAS,kBAAkB,CAAC,EAC7E,EAAE,EACF,OAAO,EACP,aAAa,GAChB;IACG,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACnE,SAAS,CAAC,GAAG,EAAE;QACX,aAAa,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IAE7B,OAAO,CACH,KAAC,IAAI,IACD,aAAa,QACb,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,YAAY,EAAE,UAAU,EACxB,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE;YACH,YAAY,EAAE,OAAO,EAAE,8BAA8B;YACrD,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,SAAS;SAC1E,YAED,KAAC,MAAM,IACH,EAAE,EAAE,EAAE,EACN,IAAI,EAAC,IAAI,EACT,GAAG,EAAC,eAAe,EACnB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAC5C,OAAO,EAAE,OAAO,EAChB,KAAK,EACD,OAAO;gBACH,CAAC,CAAC;oBACI,mCAAmC,EAAE,gCAAgC;iBACxE;gBACH,CAAC,CAAC;oBACI,KAAK,EAAE,aAAa;oBACpB,mBAAmB,EAAE,KAAK;oBAC1B,6BAA6B,EAAE,oCAAoC;oBACnE,yBAAyB,EAAE,oCAAoC;iBAClE,YAGX,KAAC,IAAI,IAAC,IAAI,EAAE,QAAQ,GAAI,GACnB,GACN,CACV,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {useEffect} from 'react';\n\nimport {Plus as PlusIcon} from '@gravity-ui/icons';\nimport {Button, Flex, Icon, type QAProps} from '@gravity-ui/uikit';\n\nimport {useBooleanState} from 'src/react-utils';\n\nexport type PlusButtonProps = QAProps & {\n onClick: () => void;\n onHoverChange: (hover: boolean) => void;\n};\n\nexport const PlusButton: React.FC<PlusButtonProps> = function YfmTablePlusButton({\n qa,\n onClick,\n onHoverChange,\n}) {\n const [hovered, setHovered, unsetHovered] = useBooleanState(false);\n useEffect(() => {\n onHoverChange(hovered);\n }, [hovered, onHoverChange]);\n\n return (\n <Flex\n centerContent\n width={20} // xs button\n height={20} // xs button\n onMouseEnter={setHovered}\n onMouseLeave={unsetHovered}\n style={{\n borderRadius: '100px', // button circle border radius\n backgroundColor: hovered ? 'var(--g-color-base-background)' : undefined,\n }}\n >\n <Button\n qa={qa}\n size=\"xs\"\n pin=\"circle-circle\"\n view={hovered ? 'outlined-action' : 'normal'}\n onClick={onClick}\n style={\n hovered\n ? {\n '--g-button-background-color-hover': 'var(--g-color-base-background)',\n }\n : {\n color: 'transparent',\n '--g-button-height': '4px',\n '--g-button-background-color': 'var(--g-color-line-generic-accent)',\n '--g-button-border-color': 'var(--g-color-line-generic-accent)',\n }\n }\n >\n <Icon data={PlusIcon} />\n </Button>\n </Flex>\n );\n};\n"]}
|
|
@@ -6,8 +6,8 @@ export declare enum YfmTableDecorationType {
|
|
|
6
6
|
ShowColumnControl = "cell--show-column-control",// to show the column control in the cell
|
|
7
7
|
OpenRowMenu = "cell--open-row-menu",// sign of opening the row menu in the cell
|
|
8
8
|
OpenColumnMenu = "cell--open-column-menu",// sign of opening the column menu in the cell
|
|
9
|
-
|
|
9
|
+
ActivateRowCells = "cell--active-row",
|
|
10
10
|
ActivateColumnCells = "cell--active-column",
|
|
11
|
-
|
|
11
|
+
ActivateDangerRowCells = "cell--danger-row",
|
|
12
12
|
ActivateDangerColumnCells = "cell--danger-column"
|
|
13
13
|
}
|
|
@@ -7,9 +7,9 @@ export var YfmTableDecorationType;
|
|
|
7
7
|
YfmTableDecorationType["ShowColumnControl"] = "cell--show-column-control";
|
|
8
8
|
YfmTableDecorationType["OpenRowMenu"] = "cell--open-row-menu";
|
|
9
9
|
YfmTableDecorationType["OpenColumnMenu"] = "cell--open-column-menu";
|
|
10
|
-
YfmTableDecorationType["
|
|
10
|
+
YfmTableDecorationType["ActivateRowCells"] = "cell--active-row";
|
|
11
11
|
YfmTableDecorationType["ActivateColumnCells"] = "cell--active-column";
|
|
12
|
-
YfmTableDecorationType["
|
|
12
|
+
YfmTableDecorationType["ActivateDangerRowCells"] = "cell--danger-row";
|
|
13
13
|
YfmTableDecorationType["ActivateDangerColumnCells"] = "cell--danger-column";
|
|
14
14
|
})(YfmTableDecorationType || (YfmTableDecorationType = {}));
|
|
15
15
|
//# sourceMappingURL=const.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"../../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/YfmTableControls/const.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,yBAAyB,GAAG,uBAAuB,CAAC;AACjE,MAAM,CAAC,MAAM,yBAAyB,GAAG,2BAA2B,CAAC;AAErE,MAAM,CAAN,IAAY,sBAcX;AAdD,WAAY,sBAAsB;IAC9B,qDAA2B,CAAA;IAE3B,mEAAyC,CAAA;IACzC,yEAA+C,CAAA;IAE/C,6DAAmC,CAAA;IACnC,mEAAyC,CAAA;IAEzC,
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"../../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/YfmTableControls/const.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,yBAAyB,GAAG,uBAAuB,CAAC;AACjE,MAAM,CAAC,MAAM,yBAAyB,GAAG,2BAA2B,CAAC;AAErE,MAAM,CAAN,IAAY,sBAcX;AAdD,WAAY,sBAAsB;IAC9B,qDAA2B,CAAA;IAE3B,mEAAyC,CAAA;IACzC,yEAA+C,CAAA;IAE/C,6DAAmC,CAAA;IACnC,mEAAyC,CAAA;IAEzC,+DAAqC,CAAA;IACrC,qEAA2C,CAAA;IAE3C,qEAA2C,CAAA;IAC3C,2EAAiD,CAAA;AACrD,CAAC,EAdW,sBAAsB,KAAtB,sBAAsB,QAcjC","sourcesContent":["export const YfmTableDecorationTypeKey = '__yfm-table-deco-type';\nexport const YfmTableDecorationUniqKey = '__yfm-table-deco-uniq-key';\n\nexport enum YfmTableDecorationType {\n FocusTable = 'table--focus',\n\n ShowRowControl = 'cell--show-row-control', // to show the row control in the cell\n ShowColumnControl = 'cell--show-column-control', // to show the column control in the cell\n\n OpenRowMenu = 'cell--open-row-menu', // sign of opening the row menu in the cell\n OpenColumnMenu = 'cell--open-column-menu', // sign of opening the column menu in the cell\n\n ActivateRowCells = 'cell--active-row',\n ActivateColumnCells = 'cell--active-column',\n\n ActivateDangerRowCells = 'cell--danger-row',\n ActivateDangerColumnCells = 'cell--danger-column',\n}\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { EditorView } from "../../../../../../pm/view.js";
|
|
2
|
+
import type { TableDescBinded } from "../../../../../../table-utils/table-desc.js";
|
|
3
|
+
type Event = Pick<MouseEvent, 'clientX' | 'clientY' | 'target'>;
|
|
4
|
+
export type YfmTableDnDGhostParams = {
|
|
5
|
+
initial: Event;
|
|
6
|
+
type: 'row' | 'column';
|
|
7
|
+
rangeIdx: number;
|
|
8
|
+
tableDesc: TableDescBinded;
|
|
9
|
+
};
|
|
10
|
+
export declare class YfmTableDnDGhost {
|
|
11
|
+
private _x;
|
|
12
|
+
private _y;
|
|
13
|
+
private readonly _dndBackgroundElem;
|
|
14
|
+
private readonly _ghostTable;
|
|
15
|
+
private readonly _ghostButton;
|
|
16
|
+
private readonly _tblShiftX;
|
|
17
|
+
private readonly _tblShiftY;
|
|
18
|
+
private readonly _btnShiftX;
|
|
19
|
+
private readonly _btnShiftY;
|
|
20
|
+
private _rafId;
|
|
21
|
+
constructor(view: EditorView, params: YfmTableDnDGhostParams);
|
|
22
|
+
move(event: Event): void;
|
|
23
|
+
destroy(): void;
|
|
24
|
+
private _startAnimation;
|
|
25
|
+
private _updatePositions;
|
|
26
|
+
private _buildRowGhost;
|
|
27
|
+
private _buildColumnGhost;
|
|
28
|
+
private _buildGhostButton;
|
|
29
|
+
private _buildGhostContainer;
|
|
30
|
+
}
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
export class YfmTableDnDGhost {
|
|
2
|
+
_x;
|
|
3
|
+
_y;
|
|
4
|
+
_dndBackgroundElem;
|
|
5
|
+
_ghostTable;
|
|
6
|
+
_ghostButton = null;
|
|
7
|
+
_tblShiftX;
|
|
8
|
+
_tblShiftY;
|
|
9
|
+
_btnShiftX = 0;
|
|
10
|
+
_btnShiftY = 0;
|
|
11
|
+
_rafId;
|
|
12
|
+
constructor(view, params) {
|
|
13
|
+
this._x = params.initial.clientX;
|
|
14
|
+
this._y = params.initial.clientY;
|
|
15
|
+
const document = view.dom.ownerDocument;
|
|
16
|
+
this._dndBackgroundElem = document.createElement('div');
|
|
17
|
+
this._dndBackgroundElem.classList.add('g-md-yfm-table-dnd-cursor-background');
|
|
18
|
+
{
|
|
19
|
+
const res = this._buildGhostButton(params);
|
|
20
|
+
if (res) {
|
|
21
|
+
this._ghostButton = res.domElement;
|
|
22
|
+
this._btnShiftX = res.shiftX;
|
|
23
|
+
this._btnShiftY = res.shiftY;
|
|
24
|
+
this._dndBackgroundElem.appendChild(this._ghostButton);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
{
|
|
28
|
+
const { domElement, shiftX, shiftY } = params.type === 'row'
|
|
29
|
+
? this._buildRowGhost(view, params)
|
|
30
|
+
: this._buildColumnGhost(view, params);
|
|
31
|
+
this._ghostTable = domElement;
|
|
32
|
+
this._tblShiftX = shiftX;
|
|
33
|
+
this._tblShiftY = shiftY;
|
|
34
|
+
this._dndBackgroundElem.appendChild(this._ghostTable);
|
|
35
|
+
}
|
|
36
|
+
this._updatePositions();
|
|
37
|
+
this._rafId = requestAnimationFrame(() => {
|
|
38
|
+
document.body.append(this._dndBackgroundElem);
|
|
39
|
+
this._startAnimation();
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
move(event) {
|
|
43
|
+
this._x = event.clientX;
|
|
44
|
+
this._y = event.clientY;
|
|
45
|
+
}
|
|
46
|
+
destroy() {
|
|
47
|
+
cancelAnimationFrame(this._rafId);
|
|
48
|
+
this._dndBackgroundElem.remove();
|
|
49
|
+
}
|
|
50
|
+
_startAnimation() {
|
|
51
|
+
const self = this;
|
|
52
|
+
let last = { x: self._x, y: self._y };
|
|
53
|
+
self._rafId = requestAnimationFrame(function update() {
|
|
54
|
+
if (self._x !== last.x || self._y !== last.y) {
|
|
55
|
+
last = { x: self._x, y: self._y };
|
|
56
|
+
self._updatePositions();
|
|
57
|
+
}
|
|
58
|
+
self._rafId = requestAnimationFrame(update);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
_updatePositions() {
|
|
62
|
+
{
|
|
63
|
+
const tx = this._x + this._tblShiftX;
|
|
64
|
+
const ty = this._y + this._tblShiftY;
|
|
65
|
+
this._ghostTable.style.transform = `translate(${tx}px, ${ty}px)`;
|
|
66
|
+
}
|
|
67
|
+
if (this._ghostButton) {
|
|
68
|
+
const tx = this._x + this._btnShiftX;
|
|
69
|
+
const ty = this._y + this._btnShiftY;
|
|
70
|
+
this._ghostButton.style.transform = `translate(${tx}px, ${ty}px)`;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
_buildRowGhost(view, { tableDesc, rangeIdx }) {
|
|
74
|
+
let shiftX = 0;
|
|
75
|
+
let shiftY = 0;
|
|
76
|
+
const document = view.dom.ownerDocument;
|
|
77
|
+
const container = this._buildGhostContainer(view);
|
|
78
|
+
const table = container.appendChild(document.createElement('table'));
|
|
79
|
+
const tbody = table.appendChild(document.createElement('tbody'));
|
|
80
|
+
{
|
|
81
|
+
const tablePos = tableDesc.pos;
|
|
82
|
+
const tableNode = view.domAtPos(tablePos + 1).node;
|
|
83
|
+
const rect = tableNode.getBoundingClientRect();
|
|
84
|
+
table.style.width = rect.width + 'px';
|
|
85
|
+
}
|
|
86
|
+
const range = tableDesc.base.getRowRanges()[rangeIdx];
|
|
87
|
+
for (let rowIdx = range.startIdx; rowIdx <= range.endIdx; rowIdx++) {
|
|
88
|
+
const tr = tbody.appendChild(document.createElement('tr'));
|
|
89
|
+
for (let colIdx = 0; colIdx < tableDesc.cols; colIdx++) {
|
|
90
|
+
const cellPos = tableDesc.getPosForCell(rowIdx, colIdx);
|
|
91
|
+
if (cellPos.type === 'real') {
|
|
92
|
+
const origNode = view.domAtPos(cellPos.from + 1).node;
|
|
93
|
+
const cloned = tr.appendChild(origNode.cloneNode(true));
|
|
94
|
+
const rect = origNode.getBoundingClientRect();
|
|
95
|
+
cloned.style.width = rect.width + 'px';
|
|
96
|
+
cloned.style.height = rect.height + 'px';
|
|
97
|
+
if (rowIdx === range.startIdx && colIdx === 0) {
|
|
98
|
+
shiftX = rect.left - this._x;
|
|
99
|
+
shiftY = rect.top - this._y;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
removeIdAttributes(table);
|
|
105
|
+
return { domElement: container, shiftX, shiftY };
|
|
106
|
+
}
|
|
107
|
+
_buildColumnGhost(view, { tableDesc, rangeIdx }) {
|
|
108
|
+
let shiftX = 0;
|
|
109
|
+
let shiftY = 0;
|
|
110
|
+
const document = view.dom.ownerDocument;
|
|
111
|
+
const container = this._buildGhostContainer(view);
|
|
112
|
+
{
|
|
113
|
+
const tablePos = tableDesc.pos;
|
|
114
|
+
const table = view.domAtPos(tablePos + 1).node;
|
|
115
|
+
const rect = table.getBoundingClientRect();
|
|
116
|
+
container.style.height = rect.height + 'px';
|
|
117
|
+
}
|
|
118
|
+
const table = container.appendChild(document.createElement('table'));
|
|
119
|
+
const tbody = table.appendChild(document.createElement('tbody'));
|
|
120
|
+
const range = tableDesc.base.getColumnRanges()[rangeIdx];
|
|
121
|
+
for (let rowIdx = 0; rowIdx < tableDesc.rows; rowIdx++) {
|
|
122
|
+
const tr = tbody.appendChild(document.createElement('tr'));
|
|
123
|
+
for (let colIdx = range.startIdx; colIdx <= range.endIdx; colIdx++) {
|
|
124
|
+
const cellPos = tableDesc.getPosForCell(rowIdx, colIdx);
|
|
125
|
+
if (cellPos.type === 'real') {
|
|
126
|
+
const origNode = view.domAtPos(cellPos.from + 1).node;
|
|
127
|
+
const cloned = tr.appendChild(origNode.cloneNode(true));
|
|
128
|
+
const rect = origNode.getBoundingClientRect();
|
|
129
|
+
cloned.style.width = rect.width + 'px';
|
|
130
|
+
cloned.style.height = rect.height + 'px';
|
|
131
|
+
if (rowIdx === 0 && colIdx === range.startIdx) {
|
|
132
|
+
container.style.minWidth = rect.width + 'px';
|
|
133
|
+
shiftX = rect.left - this._x;
|
|
134
|
+
shiftY = rect.top - this._y;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
removeIdAttributes(table);
|
|
140
|
+
return { domElement: container, shiftX, shiftY };
|
|
141
|
+
}
|
|
142
|
+
_buildGhostButton({ initial: { target }, }) {
|
|
143
|
+
if (!(target instanceof Element))
|
|
144
|
+
return null;
|
|
145
|
+
const button = target.closest('.g-button');
|
|
146
|
+
if (!button)
|
|
147
|
+
return null;
|
|
148
|
+
const container = button.ownerDocument.createElement('div');
|
|
149
|
+
container.classList.add('g-md-yfm-table-dnd-ghost-button');
|
|
150
|
+
const rect = button.getBoundingClientRect();
|
|
151
|
+
const cloned = container.appendChild(button.cloneNode(true));
|
|
152
|
+
removeIdAttributes(cloned);
|
|
153
|
+
cloned.style.cursor = '';
|
|
154
|
+
cloned.style.pointerEvents = 'none';
|
|
155
|
+
return {
|
|
156
|
+
domElement: container,
|
|
157
|
+
shiftX: rect.left - this._x,
|
|
158
|
+
shiftY: rect.top - this._y,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
_buildGhostContainer(view) {
|
|
162
|
+
const container = view.dom.ownerDocument.createElement('div');
|
|
163
|
+
container.setAttribute('aria-hidden', 'true');
|
|
164
|
+
const yfmClasses = Array.from(view.dom.classList).filter((val) => val.startsWith('yfm_'));
|
|
165
|
+
container.classList.add('g-md-yfm-table-dnd-ghost', 'yfm', ...yfmClasses);
|
|
166
|
+
return container;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
function removeIdAttributes(elem) {
|
|
170
|
+
elem.removeAttribute('id');
|
|
171
|
+
elem.querySelectorAll('[id]').forEach((el) => el.removeAttribute('id'));
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=dnd-ghost.js.map
|