UNPKG

@wordpress/block-editor

Version:
8 lines (7 loc) 4.09 kB
{ "version": 3, "sources": ["../../../../src/components/block-list/use-block-props/use-firefox-draggable-compatibility.js"], "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useRefEffect } from '@wordpress/compose';\n\nconst nodesByDocument = new Map();\n\nfunction add( doc, node ) {\n\tlet set = nodesByDocument.get( doc );\n\tif ( ! set ) {\n\t\tset = new Set();\n\t\tnodesByDocument.set( doc, set );\n\t\tdoc.addEventListener( 'pointerdown', down );\n\t}\n\tset.add( node );\n}\n\nfunction remove( doc, node ) {\n\tconst set = nodesByDocument.get( doc );\n\tif ( set ) {\n\t\tset.delete( node );\n\t\trestore( node );\n\t\tif ( set.size === 0 ) {\n\t\t\tnodesByDocument.delete( doc );\n\t\t\tdoc.removeEventListener( 'pointerdown', down );\n\t\t}\n\t}\n}\n\nfunction restore( node ) {\n\tconst prevDraggable = node.getAttribute( 'data-draggable' );\n\tif ( prevDraggable ) {\n\t\tnode.removeAttribute( 'data-draggable' );\n\t\t// Only restore if `draggable` is still removed. It could have been\n\t\t// changed by React in the meantime.\n\t\tif ( prevDraggable === 'true' && ! node.getAttribute( 'draggable' ) ) {\n\t\t\tnode.setAttribute( 'draggable', 'true' );\n\t\t}\n\t}\n}\n\nfunction down( event ) {\n\tconst { target } = event;\n\tconst { ownerDocument, isContentEditable, tagName } = target;\n\tconst isInputOrTextArea = [ 'INPUT', 'TEXTAREA' ].includes( tagName );\n\n\tconst nodes = nodesByDocument.get( ownerDocument );\n\n\tif ( isContentEditable || isInputOrTextArea ) {\n\t\t// Whenever an editable element or an input or textarea is clicked,\n\t\t// check which draggable blocks contain this element, and temporarily\n\t\t// disable draggability.\n\t\tfor ( const node of nodes ) {\n\t\t\tif (\n\t\t\t\tnode.getAttribute( 'draggable' ) === 'true' &&\n\t\t\t\tnode.contains( target )\n\t\t\t) {\n\t\t\t\tnode.removeAttribute( 'draggable' );\n\t\t\t\tnode.setAttribute( 'data-draggable', 'true' );\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Whenever a non-editable element or an input or textarea is clicked,\n\t\t// re-enable draggability for any blocks that were previously disabled.\n\t\tfor ( const node of nodes ) {\n\t\t\trestore( node );\n\t\t}\n\t}\n}\n\n/**\n * In Firefox, the `draggable` and `contenteditable` or `input` or `textarea`\n * elements don't play well together. When these elements are within a\n * `draggable` element, selection doesn't get set in the right place. The only\n * solution is to temporarily remove the `draggable` attribute clicking inside\n * these elements.\n * @return {Function} Cleanup function.\n */\nexport function useFirefoxDraggableCompatibility() {\n\treturn useRefEffect( ( node ) => {\n\t\tadd( node.ownerDocument, node );\n\t\treturn () => {\n\t\t\tremove( node.ownerDocument, node );\n\t\t};\n\t}, [] );\n}\n"], "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,qBAA6B;AAE7B,IAAM,kBAAkB,oBAAI,IAAI;AAEhC,SAAS,IAAK,KAAK,MAAO;AACzB,MAAI,MAAM,gBAAgB,IAAK,GAAI;AACnC,MAAK,CAAE,KAAM;AACZ,UAAM,oBAAI,IAAI;AACd,oBAAgB,IAAK,KAAK,GAAI;AAC9B,QAAI,iBAAkB,eAAe,IAAK;AAAA,EAC3C;AACA,MAAI,IAAK,IAAK;AACf;AAEA,SAAS,OAAQ,KAAK,MAAO;AAC5B,QAAM,MAAM,gBAAgB,IAAK,GAAI;AACrC,MAAK,KAAM;AACV,QAAI,OAAQ,IAAK;AACjB,YAAS,IAAK;AACd,QAAK,IAAI,SAAS,GAAI;AACrB,sBAAgB,OAAQ,GAAI;AAC5B,UAAI,oBAAqB,eAAe,IAAK;AAAA,IAC9C;AAAA,EACD;AACD;AAEA,SAAS,QAAS,MAAO;AACxB,QAAM,gBAAgB,KAAK,aAAc,gBAAiB;AAC1D,MAAK,eAAgB;AACpB,SAAK,gBAAiB,gBAAiB;AAGvC,QAAK,kBAAkB,UAAU,CAAE,KAAK,aAAc,WAAY,GAAI;AACrE,WAAK,aAAc,aAAa,MAAO;AAAA,IACxC;AAAA,EACD;AACD;AAEA,SAAS,KAAM,OAAQ;AACtB,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,EAAE,eAAe,mBAAmB,QAAQ,IAAI;AACtD,QAAM,oBAAoB,CAAE,SAAS,UAAW,EAAE,SAAU,OAAQ;AAEpE,QAAM,QAAQ,gBAAgB,IAAK,aAAc;AAEjD,MAAK,qBAAqB,mBAAoB;AAI7C,eAAY,QAAQ,OAAQ;AAC3B,UACC,KAAK,aAAc,WAAY,MAAM,UACrC,KAAK,SAAU,MAAO,GACrB;AACD,aAAK,gBAAiB,WAAY;AAClC,aAAK,aAAc,kBAAkB,MAAO;AAAA,MAC7C;AAAA,IACD;AAAA,EACD,OAAO;AAGN,eAAY,QAAQ,OAAQ;AAC3B,cAAS,IAAK;AAAA,IACf;AAAA,EACD;AACD;AAUO,SAAS,mCAAmC;AAClD,aAAO,6BAAc,CAAE,SAAU;AAChC,QAAK,KAAK,eAAe,IAAK;AAC9B,WAAO,MAAM;AACZ,aAAQ,KAAK,eAAe,IAAK;AAAA,IAClC;AAAA,EACD,GAAG,CAAC,CAAE;AACP;", "names": [] }