UNPKG

@wordpress/block-editor

Version:
8 lines (7 loc) 5.88 kB
{ "version": 3, "sources": ["../../../src/components/block-visibility/utils.js"], "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { __, sprintf } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport { BLOCK_VISIBILITY_VIEWPORT_ENTRIES } from './constants';\n\n/**\n * Checks if a block is hidden for a specific viewport.\n *\n * @param {Object} block The block to check.\n * @param {string} viewport The viewport to check (e.g., 'mobile', 'tablet', 'desktop').\n * @return {boolean} Whether the block is hidden for the viewport.\n */\nfunction isBlockHiddenForViewport( block, viewport ) {\n\tif ( ! block ) {\n\t\treturn false;\n\t}\n\n\tconst blockVisibility = block.attributes?.metadata?.blockVisibility;\n\n\t// If explicitly visible everywhere (true), return false for all viewports.\n\tif ( blockVisibility === true ) {\n\t\treturn false;\n\t}\n\n\t// If null or not an object, block is not hidden for any specific viewport.\n\tif ( 'object' !== typeof blockVisibility ) {\n\t\treturn false;\n\t}\n\n\t// Get viewport configuration from nested structure.\n\tconst viewportConfig = blockVisibility.viewport;\n\n\t// If no viewport config, block is not hidden for any specific viewport.\n\tif ( ! viewportConfig || 'object' !== typeof viewportConfig ) {\n\t\treturn false;\n\t}\n\n\t// Check if the viewport is valid.\n\tif (\n\t\t! BLOCK_VISIBILITY_VIEWPORT_ENTRIES.some(\n\t\t\t( [ , { key } ] ) => key === viewport\n\t\t)\n\t) {\n\t\treturn false;\n\t}\n\n\t// Check if the specific viewport is hidden.\n\treturn viewportConfig[ viewport ] === false;\n}\n\n/**\n * Gets the checkbox state for a viewport across multiple blocks.\n * Returns `true` if all blocks are hidden, `null` if some are hidden, `false` if none are hidden.\n *\n * @param {Array} blocks Array of blocks to check.\n * @param {string} viewport The viewport to check (e.g., 'mobile', 'tablet', 'desktop').\n * @return {boolean|null} `true` if all hidden, `null` if some hidden, `false` if none hidden.\n */\nexport function getViewportCheckboxState( blocks, viewport ) {\n\tif ( ! blocks?.length ) {\n\t\treturn false;\n\t}\n\n\tconst hiddenCount = blocks.filter( ( block ) =>\n\t\tisBlockHiddenForViewport( block, viewport )\n\t).length;\n\n\tif ( hiddenCount === 0 ) {\n\t\treturn false;\n\t}\n\tif ( hiddenCount === blocks.length ) {\n\t\treturn true;\n\t}\n\n\treturn null; // Indeterminate: some hidden, some visible (normal mixed state)\n}\n\n/**\n * Gets the checkbox state for \"hide everywhere\" across multiple blocks.\n * Returns `true` if all blocks are hidden everywhere, `null` if some are hidden everywhere, `false` if none are.\n *\n * @param {Array} blocks Array of blocks to check.\n * @return {boolean|null} `true` if all hidden everywhere, `null` if some hidden everywhere, `false` if none.\n */\nexport function getHideEverywhereCheckboxState( blocks ) {\n\tif ( ! blocks?.length ) {\n\t\treturn false;\n\t}\n\n\tconst hiddenEverywhereCount = blocks.filter(\n\t\t( block ) =>\n\t\t\tblock && block.attributes?.metadata?.blockVisibility === false\n\t).length;\n\n\tif ( hiddenEverywhereCount === 0 ) {\n\t\treturn false;\n\t}\n\tif ( hiddenEverywhereCount === blocks.length ) {\n\t\treturn true;\n\t}\n\n\treturn null; // Indeterminate: some but not all\n}\n\n/**\n * Get a human-readable label describing which viewports a block is hidden on.\n *\n * @param {boolean|Object} blockVisibility The block's visibility metadata.\n * @return {string|null} A descriptive label, or null if the block is not hidden.\n */\nexport function getBlockVisibilityLabel( blockVisibility ) {\n\t// Not hidden at all\n\tif ( ! blockVisibility && blockVisibility !== false ) {\n\t\treturn null;\n\t}\n\n\tif ( blockVisibility === false ) {\n\t\t// Hidden on all viewports\n\t\treturn __( 'Block is hidden' );\n\t}\n\n\tif ( blockVisibility?.viewport ) {\n\t\t// Hidden on specific viewports - list them\n\t\tconst hiddenViewports = BLOCK_VISIBILITY_VIEWPORT_ENTRIES.filter(\n\t\t\t( [ key ] ) => blockVisibility.viewport?.[ key ] === false\n\t\t).map( ( [ , viewport ] ) => viewport.label );\n\n\t\tif ( hiddenViewports.length > 0 ) {\n\t\t\treturn sprintf(\n\t\t\t\t/* translators: %s: comma-separated list of viewport names (Desktop, Tablet, Mobile) */\n\t\t\t\t__( 'Block is hidden on %s' ),\n\t\t\t\thiddenViewports.join( ', ' )\n\t\t\t);\n\t\t}\n\t}\n\n\treturn null;\n}\n"], "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kBAA4B;AAK5B,uBAAkD;AASlD,SAAS,yBAA0B,OAAO,UAAW;AACpD,MAAK,CAAE,OAAQ;AACd,WAAO;AAAA,EACR;AAEA,QAAM,kBAAkB,MAAM,YAAY,UAAU;AAGpD,MAAK,oBAAoB,MAAO;AAC/B,WAAO;AAAA,EACR;AAGA,MAAK,aAAa,OAAO,iBAAkB;AAC1C,WAAO;AAAA,EACR;AAGA,QAAM,iBAAiB,gBAAgB;AAGvC,MAAK,CAAE,kBAAkB,aAAa,OAAO,gBAAiB;AAC7D,WAAO;AAAA,EACR;AAGA,MACC,CAAE,mDAAkC;AAAA,IACnC,CAAE,CAAE,EAAE,EAAE,IAAI,CAAE,MAAO,QAAQ;AAAA,EAC9B,GACC;AACD,WAAO;AAAA,EACR;AAGA,SAAO,eAAgB,QAAS,MAAM;AACvC;AAUO,SAAS,yBAA0B,QAAQ,UAAW;AAC5D,MAAK,CAAE,QAAQ,QAAS;AACvB,WAAO;AAAA,EACR;AAEA,QAAM,cAAc,OAAO;AAAA,IAAQ,CAAE,UACpC,yBAA0B,OAAO,QAAS;AAAA,EAC3C,EAAE;AAEF,MAAK,gBAAgB,GAAI;AACxB,WAAO;AAAA,EACR;AACA,MAAK,gBAAgB,OAAO,QAAS;AACpC,WAAO;AAAA,EACR;AAEA,SAAO;AACR;AASO,SAAS,+BAAgC,QAAS;AACxD,MAAK,CAAE,QAAQ,QAAS;AACvB,WAAO;AAAA,EACR;AAEA,QAAM,wBAAwB,OAAO;AAAA,IACpC,CAAE,UACD,SAAS,MAAM,YAAY,UAAU,oBAAoB;AAAA,EAC3D,EAAE;AAEF,MAAK,0BAA0B,GAAI;AAClC,WAAO;AAAA,EACR;AACA,MAAK,0BAA0B,OAAO,QAAS;AAC9C,WAAO;AAAA,EACR;AAEA,SAAO;AACR;AAQO,SAAS,wBAAyB,iBAAkB;AAE1D,MAAK,CAAE,mBAAmB,oBAAoB,OAAQ;AACrD,WAAO;AAAA,EACR;AAEA,MAAK,oBAAoB,OAAQ;AAEhC,eAAO,gBAAI,iBAAkB;AAAA,EAC9B;AAEA,MAAK,iBAAiB,UAAW;AAEhC,UAAM,kBAAkB,mDAAkC;AAAA,MACzD,CAAE,CAAE,GAAI,MAAO,gBAAgB,WAAY,GAAI,MAAM;AAAA,IACtD,EAAE,IAAK,CAAE,CAAE,EAAE,QAAS,MAAO,SAAS,KAAM;AAE5C,QAAK,gBAAgB,SAAS,GAAI;AACjC,iBAAO;AAAA;AAAA,YAEN,gBAAI,uBAAwB;AAAA,QAC5B,gBAAgB,KAAM,IAAK;AAAA,MAC5B;AAAA,IACD;AAAA,EACD;AAEA,SAAO;AACR;", "names": [] }