@wordpress/block-library 9.40.2-next.v.202602241322.0 → 9.41.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/CHANGELOG.md +2 -0
- package/build/accordion/view.cjs +0 -34
- package/build/accordion/view.cjs.map +2 -2
- package/build/button/block.json +11 -3
- package/build/button/deprecated.cjs +246 -13
- package/build/button/deprecated.cjs.map +2 -2
- package/build/button/edit.cjs +45 -58
- package/build/button/edit.cjs.map +3 -3
- package/build/button/save.cjs +3 -7
- package/build/button/save.cjs.map +2 -2
- package/build/button/utils.cjs +59 -0
- package/build/button/utils.cjs.map +7 -0
- package/build/image/image.cjs +1 -1
- package/build/image/image.cjs.map +2 -2
- package/build/navigation/edit/index.cjs +4 -2
- package/build/navigation/edit/index.cjs.map +3 -3
- package/build/navigation/edit/leaf-more-menu.cjs +68 -6
- package/build/navigation/edit/leaf-more-menu.cjs.map +3 -3
- package/build/navigation/edit/menu-inspector-controls.cjs +20 -91
- package/build/navigation/edit/menu-inspector-controls.cjs.map +3 -3
- package/build/navigation/edit/navigation-link-ui.cjs +97 -0
- package/build/navigation/edit/navigation-link-ui.cjs.map +7 -0
- package/build/navigation/edit/navigation-list-view-header.cjs +86 -0
- package/build/navigation/edit/navigation-list-view-header.cjs.map +7 -0
- package/build/navigation/edit/navigation-menu-selector.cjs +4 -2
- package/build/navigation/edit/navigation-menu-selector.cjs.map +3 -3
- package/build/navigation/edit/placeholder/index.cjs +2 -2
- package/build/navigation/edit/placeholder/index.cjs.map +3 -3
- package/build/navigation-link/shared/controls.cjs +29 -52
- package/build/navigation-link/shared/controls.cjs.map +3 -3
- package/build/navigation-link/shared/use-link-preview.cjs +8 -9
- package/build/navigation-link/shared/use-link-preview.cjs.map +2 -2
- package/build/page-list-item/edit.cjs +6 -3
- package/build/page-list-item/edit.cjs.map +2 -2
- package/build/playlist/edit.cjs +43 -136
- package/build/playlist/edit.cjs.map +3 -3
- package/build/playlist/view.cjs +56 -38
- package/build/playlist/view.cjs.map +2 -2
- package/build/playlist-track/edit.cjs +0 -1
- package/build/playlist-track/edit.cjs.map +2 -2
- package/build/post-title/block.json +3 -0
- package/build/post-title/edit.cjs +2 -2
- package/build/post-title/edit.cjs.map +2 -2
- package/build/utils/waveform-player.cjs +68 -0
- package/build/utils/waveform-player.cjs.map +7 -0
- package/build/utils/waveform-utils.cjs +171 -0
- package/build/utils/waveform-utils.cjs.map +7 -0
- package/build-module/accordion/view.mjs +1 -35
- package/build-module/accordion/view.mjs.map +2 -2
- package/build-module/button/block.json +11 -3
- package/build-module/button/deprecated.mjs +246 -13
- package/build-module/button/deprecated.mjs.map +2 -2
- package/build-module/button/edit.mjs +47 -63
- package/build-module/button/edit.mjs.map +2 -2
- package/build-module/button/save.mjs +3 -7
- package/build-module/button/save.mjs.map +2 -2
- package/build-module/button/utils.mjs +33 -0
- package/build-module/button/utils.mjs.map +7 -0
- package/build-module/image/image.mjs +1 -1
- package/build-module/image/image.mjs.map +2 -2
- package/build-module/navigation/edit/index.mjs +4 -2
- package/build-module/navigation/edit/index.mjs.map +2 -2
- package/build-module/navigation/edit/leaf-more-menu.mjs +73 -7
- package/build-module/navigation/edit/leaf-more-menu.mjs.map +2 -2
- package/build-module/navigation/edit/menu-inspector-controls.mjs +21 -101
- package/build-module/navigation/edit/menu-inspector-controls.mjs.map +2 -2
- package/build-module/navigation/edit/navigation-link-ui.mjs +76 -0
- package/build-module/navigation/edit/navigation-link-ui.mjs.map +7 -0
- package/build-module/navigation/edit/navigation-list-view-header.mjs +58 -0
- package/build-module/navigation/edit/navigation-list-view-header.mjs.map +7 -0
- package/build-module/navigation/edit/navigation-menu-selector.mjs +5 -3
- package/build-module/navigation/edit/navigation-menu-selector.mjs.map +2 -2
- package/build-module/navigation/edit/placeholder/index.mjs +2 -2
- package/build-module/navigation/edit/placeholder/index.mjs.map +2 -2
- package/build-module/navigation-link/shared/controls.mjs +29 -53
- package/build-module/navigation-link/shared/controls.mjs.map +2 -2
- package/build-module/navigation-link/shared/use-link-preview.mjs +8 -9
- package/build-module/navigation-link/shared/use-link-preview.mjs.map +2 -2
- package/build-module/page-list-item/edit.mjs +6 -3
- package/build-module/page-list-item/edit.mjs.map +2 -2
- package/build-module/playlist/edit.mjs +41 -139
- package/build-module/playlist/edit.mjs.map +2 -2
- package/build-module/playlist/view.mjs +56 -38
- package/build-module/playlist/view.mjs.map +2 -2
- package/build-module/playlist-track/edit.mjs +0 -1
- package/build-module/playlist-track/edit.mjs.map +2 -2
- package/build-module/post-title/block.json +3 -0
- package/build-module/post-title/edit.mjs +2 -2
- package/build-module/post-title/edit.mjs.map +2 -2
- package/build-module/utils/waveform-player.mjs +43 -0
- package/build-module/utils/waveform-player.mjs.map +7 -0
- package/build-module/utils/waveform-utils.mjs +131 -0
- package/build-module/utils/waveform-utils.mjs.map +7 -0
- package/build-style/button/style-rtl.css +6 -0
- package/build-style/button/style.css +6 -0
- package/build-style/editor-rtl.css +13 -3
- package/build-style/editor.css +13 -3
- package/build-style/navigation-link/editor-rtl.css +10 -0
- package/build-style/navigation-link/editor.css +10 -0
- package/build-style/playlist/editor-rtl.css +3 -3
- package/build-style/playlist/editor.css +3 -3
- package/build-style/playlist/style-rtl.css +351 -17
- package/build-style/playlist/style.css +351 -17
- package/build-style/style-rtl.css +357 -17
- package/build-style/style.css +357 -17
- package/package.json +39 -38
- package/src/accordion/view.js +1 -44
- package/src/accordion-item/index.php +0 -1
- package/src/button/block.json +11 -3
- package/src/button/deprecated.js +254 -16
- package/src/button/edit.js +50 -61
- package/src/button/index.php +68 -0
- package/src/button/save.js +2 -8
- package/src/button/style.scss +49 -7
- package/src/button/test/utils.js +84 -0
- package/src/button/utils.js +42 -0
- package/src/cover/index.php +4 -4
- package/src/image/image.js +14 -15
- package/src/image/index.php +3 -1
- package/src/navigation/edit/index.js +4 -2
- package/src/navigation/edit/leaf-more-menu.js +86 -11
- package/src/navigation/edit/menu-inspector-controls.js +23 -142
- package/src/navigation/edit/navigation-link-ui.js +115 -0
- package/src/navigation/edit/navigation-list-view-header.js +62 -0
- package/src/navigation/edit/navigation-menu-selector.js +5 -3
- package/src/navigation/edit/placeholder/index.js +3 -2
- package/src/navigation/edit/test/navigation-menu-selector.js +23 -20
- package/src/navigation-link/editor.scss +18 -0
- package/src/navigation-link/shared/controls.js +35 -62
- package/src/navigation-link/shared/test/controls.js +5 -5
- package/src/navigation-link/shared/test/use-link-preview.test.js +19 -1
- package/src/navigation-link/shared/use-link-preview.js +14 -15
- package/src/page-list/index.php +1 -1
- package/src/page-list-item/edit.js +8 -7
- package/src/playlist/edit.js +60 -154
- package/src/playlist/editor.scss +3 -3
- package/src/playlist/index.php +15 -40
- package/src/playlist/style.scss +34 -27
- package/src/playlist/test/edit.js +137 -0
- package/src/playlist/view.js +97 -40
- package/src/playlist-track/edit.js +0 -1
- package/src/post-title/block.json +3 -0
- package/src/post-title/edit.js +4 -2
- package/src/query-title/index.php +1 -1
- package/src/search/index.php +1 -1
- package/src/utils/test/waveform-utils.js +328 -0
- package/src/utils/waveform-player.js +77 -0
- package/src/utils/waveform-utils.js +232 -0
- package/build/navigation/use-navigation-entities.cjs +0 -67
- package/build/navigation/use-navigation-entities.cjs.map +0 -7
- package/build-module/navigation/use-navigation-entities.mjs +0 -46
- package/build-module/navigation/use-navigation-entities.mjs.map +0 -7
- package/src/navigation/use-navigation-entities.js +0 -72
|
@@ -37,7 +37,7 @@ var { useRemoteUrlData, isHashLink, isRelativePath } = (0, import_lock_unlock.un
|
|
|
37
37
|
function capitalize(str) {
|
|
38
38
|
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
39
39
|
}
|
|
40
|
-
function computeDisplayUrl({ linkUrl,
|
|
40
|
+
function computeDisplayUrl({ linkUrl, homeUrl } = {}) {
|
|
41
41
|
if (!linkUrl) {
|
|
42
42
|
return { displayUrl: "", isExternal: false };
|
|
43
43
|
}
|
|
@@ -48,8 +48,8 @@ function computeDisplayUrl({ linkUrl, siteUrl } = {}) {
|
|
|
48
48
|
}
|
|
49
49
|
try {
|
|
50
50
|
const parsedUrl = new URL(linkUrl);
|
|
51
|
-
const
|
|
52
|
-
if (parsedUrl.
|
|
51
|
+
const siteHost = new URL(homeUrl).host;
|
|
52
|
+
if (parsedUrl.host === siteHost) {
|
|
53
53
|
let path = parsedUrl.pathname + parsedUrl.search + parsedUrl.hash;
|
|
54
54
|
if (path.endsWith("/") && path.length > 1) {
|
|
55
55
|
path = path.slice(0, -1);
|
|
@@ -126,18 +126,17 @@ function useLinkPreview({
|
|
|
126
126
|
hasBinding,
|
|
127
127
|
isEntityAvailable
|
|
128
128
|
}) {
|
|
129
|
-
const
|
|
130
|
-
|
|
129
|
+
const homeUrl = (0, import_data.useSelect)((select) => {
|
|
130
|
+
return select(import_core_data.store).getEntityRecord(
|
|
131
131
|
"root",
|
|
132
|
-
"
|
|
133
|
-
);
|
|
134
|
-
return siteEntity?.url;
|
|
132
|
+
"__unstableBase"
|
|
133
|
+
)?.home;
|
|
135
134
|
}, []);
|
|
136
135
|
const title = entityRecord?.title?.rendered || entityRecord?.title || entityRecord?.name;
|
|
137
136
|
const { richData } = useRemoteUrlData(title ? null : url);
|
|
138
137
|
const { displayUrl, isExternal } = computeDisplayUrl({
|
|
139
138
|
linkUrl: url,
|
|
140
|
-
|
|
139
|
+
homeUrl
|
|
141
140
|
});
|
|
142
141
|
const image = (0, import_data.useSelect)(
|
|
143
142
|
(select) => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/navigation-link/shared/use-link-preview.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { __, sprintf } from '@wordpress/i18n';\nimport { safeDecodeURI } from '@wordpress/url';\nimport { privateApis as blockEditorPrivateApis } from '@wordpress/block-editor';\nimport { useSelect } from '@wordpress/data';\nimport { store as coreDataStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { unlock } from '../../lock-unlock';\n\nconst { useRemoteUrlData, isHashLink, isRelativePath } = unlock(\n\tblockEditorPrivateApis\n);\n\n/**\n * Capitalize the first letter of a string.\n *\n * @param {string} str - The string to capitalize\n * @return {string} Capitalized string\n */\nfunction capitalize( str ) {\n\treturn str.charAt( 0 ).toUpperCase() + str.slice( 1 );\n}\n\n/**\n * Compute display URL - strips site URL if internal, shows full URL if external.\n *\n * @param {Object} options - Parameters object\n * @param {string} options.linkUrl - The URL to process\n * @param {string} options.
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kBAA4B;AAC5B,iBAA8B;AAC9B,0BAAsD;AACtD,kBAA0B;AAC1B,uBAAuC;AAKvC,yBAAuB;AAEvB,IAAM,EAAE,kBAAkB,YAAY,eAAe,QAAI;AAAA,EACxD,oBAAAA;AACD;AAQA,SAAS,WAAY,KAAM;AAC1B,SAAO,IAAI,OAAQ,CAAE,EAAE,YAAY,IAAI,IAAI,MAAO,CAAE;AACrD;AAUO,SAAS,kBAAmB,EAAE,SAAS,QAAQ,IAAI,CAAC,GAAI;AAC9D,MAAK,CAAE,SAAU;AAChB,WAAO,EAAE,YAAY,IAAI,YAAY,MAAM;AAAA,EAC5C;AAEA,MAAI,iBAAa,0BAAe,OAAQ;AACxC,MAAI,aAAa;AAGjB,MAAK,eAAgB,OAAQ,KAAK,WAAY,OAAQ,GAAI;AACzD,WAAO,EAAE,YAAY,YAAY,MAAM;AAAA,EACxC;AAIA,MAAI;AACH,UAAM,YAAY,IAAI,IAAK,OAAQ;AAEnC,UAAM,
|
|
4
|
+
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { __, sprintf } from '@wordpress/i18n';\nimport { safeDecodeURI } from '@wordpress/url';\nimport { privateApis as blockEditorPrivateApis } from '@wordpress/block-editor';\nimport { useSelect } from '@wordpress/data';\nimport { store as coreDataStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { unlock } from '../../lock-unlock';\n\nconst { useRemoteUrlData, isHashLink, isRelativePath } = unlock(\n\tblockEditorPrivateApis\n);\n\n/**\n * Capitalize the first letter of a string.\n *\n * @param {string} str - The string to capitalize\n * @return {string} Capitalized string\n */\nfunction capitalize( str ) {\n\treturn str.charAt( 0 ).toUpperCase() + str.slice( 1 );\n}\n\n/**\n * Compute display URL - strips site URL if internal, shows full URL if external.\n *\n * @param {Object} options - Parameters object\n * @param {string} options.linkUrl - The URL to process\n * @param {string} options.homeUrl - The WordPress site URL (required for internal/external detection)\n * @return {Object} Object with displayUrl and isExternal flag\n */\nexport function computeDisplayUrl( { linkUrl, homeUrl } = {} ) {\n\tif ( ! linkUrl ) {\n\t\treturn { displayUrl: '', isExternal: false };\n\t}\n\n\tlet displayUrl = safeDecodeURI( linkUrl );\n\tlet isExternal = false;\n\n\t// Check hash links and relative paths first - these are always internal\n\tif ( isRelativePath( linkUrl ) || isHashLink( linkUrl ) ) {\n\t\treturn { displayUrl, isExternal: false };\n\t}\n\n\t// Try to parse as a full URL to determine if it's actually external\n\t// This must happen before trusting the type attribute\n\ttry {\n\t\tconst parsedUrl = new URL( linkUrl );\n\t\t// Compare by host (not origin) so http/https to same site both count as internal\n\t\tconst siteHost = new URL( homeUrl ).host;\n\n\t\tif ( parsedUrl.host === siteHost ) {\n\t\t\t// Show only the pathname (and search/hash if present)\n\t\t\tlet path = parsedUrl.pathname + parsedUrl.search + parsedUrl.hash;\n\t\t\t// Remove trailing slash\n\t\t\tif ( path.endsWith( '/' ) && path.length > 1 ) {\n\t\t\t\tpath = path.slice( 0, -1 );\n\t\t\t}\n\t\t\tdisplayUrl = path;\n\t\t} else {\n\t\t\t// Different host - this is an external link\n\t\t\tisExternal = true;\n\t\t}\n\t} catch ( e ) {\n\t\t// URL parsing failed - treat as external (e.g. no homeUrl, or URL without protocol)\n\t\tisExternal = true;\n\t}\n\n\treturn { displayUrl, isExternal };\n}\n\n/**\n * Compute badges for the link preview.\n *\n * @param {Object} options - Options object\n * @param {string} options.url - Link URL\n * @param {string} options.type - Entity type (page, post, etc.)\n * @param {boolean} options.isExternal - Whether link is external\n * @param {string} options.entityStatus - Entity status (publish, draft, etc.)\n * @param {boolean} options.hasBinding - Whether link has entity binding\n * @param {boolean} options.isEntityAvailable - Whether bound entity exists\n * @return {Array} Array of badge objects with label and intent\n */\nexport function computeBadges( {\n\turl,\n\ttype,\n\tisExternal,\n\tentityStatus,\n\thasBinding,\n\tisEntityAvailable,\n} ) {\n\tconst badges = [];\n\n\t// Kind badge\n\tif ( url ) {\n\t\tif ( isExternal ) {\n\t\t\tbadges.push( {\n\t\t\t\tlabel: __( 'External link' ),\n\t\t\t\tintent: 'default',\n\t\t\t} );\n\t\t} else if ( isHashLink( url ) ) {\n\t\t\t// Hash links should be detected before type check\n\t\t\t// because they're not entity links even if type is set\n\t\t\tbadges.push( {\n\t\t\t\tlabel: __( 'Internal link' ),\n\t\t\t\tintent: 'default',\n\t\t\t} );\n\t\t} else if ( type && type !== 'custom' ) {\n\t\t\t// Show entity type badge (page, post, category, etc.)\n\t\t\t// but not 'custom' since that's just a manual link\n\t\t\tbadges.push( { label: capitalize( type ), intent: 'default' } );\n\t\t} else {\n\t\t\t// Internal link (not external, not hash, not entity)\n\t\t\tbadges.push( {\n\t\t\t\tlabel: __( 'Page' ),\n\t\t\t\tintent: 'default',\n\t\t\t} );\n\t\t}\n\t}\n\n\t// Status badge\n\tif ( hasBinding && ! isEntityAvailable ) {\n\t\tbadges.push( {\n\t\t\tlabel: sprintf(\n\t\t\t\t/* translators: %s is the entity type (e.g., \"page\", \"post\", \"category\") */\n\t\t\t\t__( 'Missing %s' ),\n\t\t\t\ttype\n\t\t\t),\n\t\t\tintent: 'error',\n\t\t} );\n\t} else if ( ! url ) {\n\t\tbadges.push( { label: __( 'No link selected' ), intent: 'error' } );\n\t} else if ( entityStatus ) {\n\t\tconst statusMap = {\n\t\t\tpublish: { label: __( 'Published' ), intent: 'success' },\n\t\t\tfuture: { label: __( 'Scheduled' ), intent: 'warning' },\n\t\t\tdraft: { label: __( 'Draft' ), intent: 'warning' },\n\t\t\tpending: { label: __( 'Pending' ), intent: 'warning' },\n\t\t\tprivate: { label: __( 'Private' ), intent: 'default' },\n\t\t\ttrash: { label: __( 'Trash' ), intent: 'error' },\n\t\t};\n\t\tconst badge = statusMap[ entityStatus ];\n\t\tif ( badge ) {\n\t\t\tbadges.push( badge );\n\t\t}\n\t}\n\n\treturn badges;\n}\n\n/**\n * Hook to compute link preview data for display.\n *\n * This hook takes raw link data and entity information and computes\n * presentation-ready preview data including formatted title, URL, and badges.\n *\n * @param {Object} options - Options object\n * @param {string} options.url - Link URL\n * @param {string} options.type - Entity type (page, post, etc.)\n * @param {Object} options.entityRecord - Entity record\n * @param {boolean} options.hasBinding - Whether link has entity binding\n * @param {boolean} options.isEntityAvailable - Whether bound entity exists\n * @return {Object} Preview data object with title, url, image, and badges\n */\nexport function useLinkPreview( {\n\turl,\n\tentityRecord,\n\ttype,\n\thasBinding,\n\tisEntityAvailable,\n} ) {\n\t// Get the WordPress homepage URL from settings\n\tconst homeUrl = useSelect( ( select ) => {\n\t\treturn select( coreDataStore ).getEntityRecord(\n\t\t\t'root',\n\t\t\t'__unstableBase'\n\t\t)?.home;\n\t}, [] );\n\n\tconst title =\n\t\tentityRecord?.title?.rendered ||\n\t\tentityRecord?.title ||\n\t\tentityRecord?.name;\n\n\t// Fetch rich URL data if we don't have a title. Internal links should have passed a title.\n\tconst { richData } = useRemoteUrlData( title ? null : url );\n\n\t// Compute display URL and external flag\n\tconst { displayUrl, isExternal } = computeDisplayUrl( {\n\t\tlinkUrl: url,\n\t\thomeUrl,\n\t} );\n\n\tconst image = useSelect(\n\t\t( select ) => {\n\t\t\t// Only fetch for post-type entities with featured media\n\t\t\tif ( ! entityRecord?.featured_media ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst { getEntityRecord } = select( coreDataStore );\n\n\t\t\t// Get the media entity to fetch the image URL\n\t\t\tconst media = getEntityRecord(\n\t\t\t\t'postType',\n\t\t\t\t'attachment',\n\t\t\t\tentityRecord.featured_media\n\t\t\t);\n\n\t\t\t// Return the thumbnail or medium size URL, fallback to source_url\n\t\t\treturn (\n\t\t\t\tmedia?.media_details?.sizes?.thumbnail?.source_url ||\n\t\t\t\tmedia?.media_details?.sizes?.medium?.source_url ||\n\t\t\t\tmedia?.source_url ||\n\t\t\t\tnull\n\t\t\t);\n\t\t},\n\t\t[ entityRecord?.featured_media ]\n\t);\n\n\t// Compute badges\n\tconst badges = computeBadges( {\n\t\turl,\n\t\ttype,\n\t\tisExternal,\n\t\tentityStatus: entityRecord?.status,\n\t\thasBinding,\n\t\tisEntityAvailable,\n\t} );\n\n\t// Get display title - use provided title, fallback to rich data, or URL\n\tconst displayTitle = url\n\t\t? title || richData?.title || safeDecodeURI( url )\n\t\t: __( 'Add link' );\n\n\treturn {\n\t\ttitle: displayTitle,\n\t\turl: displayUrl,\n\t\timage,\n\t\tbadges,\n\t};\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["blockEditorPrivateApis", "coreDataStore"]
|
|
7
7
|
}
|
|
@@ -37,7 +37,6 @@ var import_clsx = __toESM(require("clsx"));
|
|
|
37
37
|
var import_block_editor = require("@wordpress/block-editor");
|
|
38
38
|
var import_data = require("@wordpress/data");
|
|
39
39
|
var import_core_data = require("@wordpress/core-data");
|
|
40
|
-
var import_element = require("@wordpress/element");
|
|
41
40
|
var import_dom = require("@wordpress/dom");
|
|
42
41
|
var import_icons = require("../navigation-link/icons.cjs");
|
|
43
42
|
var import_utils = require("../navigation/edit/utils.cjs");
|
|
@@ -88,7 +87,9 @@ function PageListItemEdit({ context, attributes }) {
|
|
|
88
87
|
type: "button",
|
|
89
88
|
className: "wp-block-navigation-item__content wp-block-navigation-submenu__toggle",
|
|
90
89
|
"aria-expanded": "false",
|
|
91
|
-
|
|
90
|
+
dangerouslySetInnerHTML: {
|
|
91
|
+
__html: (0, import_dom.safeHTML)(label)
|
|
92
|
+
}
|
|
92
93
|
}
|
|
93
94
|
),
|
|
94
95
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "wp-block-page-list__submenu-icon wp-block-navigation__submenu-icon", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.ItemSubmenuIcon, {}) })
|
|
@@ -99,7 +100,9 @@ function PageListItemEdit({ context, attributes }) {
|
|
|
99
100
|
"wp-block-navigation-item__content": isNavigationChild
|
|
100
101
|
}),
|
|
101
102
|
href: link,
|
|
102
|
-
|
|
103
|
+
dangerouslySetInnerHTML: {
|
|
104
|
+
__html: (0, import_dom.safeHTML)(title)
|
|
105
|
+
}
|
|
103
106
|
}
|
|
104
107
|
),
|
|
105
108
|
hasChildren && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/page-list-item/edit.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n/**\n * WordPress dependencies\n */\nimport { useBlockProps, useInnerBlocksProps } from '@wordpress/block-editor';\nimport { useSelect } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\nimport {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kBAAiB;AAIjB,0BAAmD;AACnD,kBAA0B;AAC1B,uBAAmC;AACnC,
|
|
4
|
+
"sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n/**\n * WordPress dependencies\n */\nimport { useBlockProps, useInnerBlocksProps } from '@wordpress/block-editor';\nimport { useSelect } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { safeHTML } from '@wordpress/dom';\n\n/**\n * Internal dependencies\n */\nimport { ItemSubmenuIcon } from '../navigation-link/icons';\nimport {\n\tgetColors,\n\tgetNavigationChildBlockProps,\n} from '../navigation/edit/utils';\n\nfunction useFrontPageId() {\n\treturn useSelect( ( select ) => {\n\t\tconst canReadSettings = select( coreStore ).canUser( 'read', {\n\t\t\tkind: 'root',\n\t\t\tname: 'site',\n\t\t} );\n\t\tif ( ! canReadSettings ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst site = select( coreStore ).getEntityRecord( 'root', 'site' );\n\t\treturn site?.show_on_front === 'page' && site?.page_on_front;\n\t}, [] );\n}\n\nexport default function PageListItemEdit( { context, attributes } ) {\n\tconst { id, label, link, hasChildren, title } = attributes;\n\tconst isNavigationChild = 'showSubmenuIcon' in context;\n\tconst frontPageId = useFrontPageId();\n\n\t// Get submenu visibility from context. The Navigation block handles\n\t// backward compatibility by migrating openSubmenusOnClick to submenuVisibility\n\t// via its deprecation handler before this context is received.\n\tconst submenuVisibility = context.submenuVisibility;\n\n\tconst openOnClick = submenuVisibility === 'click';\n\n\tconst innerBlocksColors = getColors( context, true );\n\n\tconst navigationChildBlockProps =\n\t\tgetNavigationChildBlockProps( innerBlocksColors );\n\tconst blockProps = useBlockProps( navigationChildBlockProps, {\n\t\tclassName: 'wp-block-pages-list__item',\n\t} );\n\n\tconst innerBlocksProps = useInnerBlocksProps( blockProps );\n\n\treturn (\n\t\t<li\n\t\t\tkey={ id }\n\t\t\tclassName={ clsx( 'wp-block-pages-list__item', {\n\t\t\t\t'has-child': hasChildren,\n\t\t\t\t'wp-block-navigation-item': isNavigationChild,\n\t\t\t\t// Class assignment logic matches PHP rendering in page-list/index.php\n\t\t\t\t'open-on-click': openOnClick,\n\t\t\t\t'open-always': submenuVisibility === 'always',\n\t\t\t\t// Must check hover mode explicitly to match PHP elseif structure (index.php:212)\n\t\t\t\t'open-on-hover-click':\n\t\t\t\t\tsubmenuVisibility === 'hover' && context.showSubmenuIcon,\n\t\t\t\t'menu-item-home': id === frontPageId,\n\t\t\t} ) }\n\t\t>\n\t\t\t{ hasChildren && openOnClick ? (\n\t\t\t\t<>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"wp-block-navigation-item__content wp-block-navigation-submenu__toggle\"\n\t\t\t\t\t\taria-expanded=\"false\"\n\t\t\t\t\t\tdangerouslySetInnerHTML={ {\n\t\t\t\t\t\t\t__html: safeHTML( label ),\n\t\t\t\t\t\t} }\n\t\t\t\t\t/>\n\t\t\t\t\t<span className=\"wp-block-page-list__submenu-icon wp-block-navigation__submenu-icon\">\n\t\t\t\t\t\t<ItemSubmenuIcon />\n\t\t\t\t\t</span>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<a\n\t\t\t\t\tclassName={ clsx( 'wp-block-pages-list__item__link', {\n\t\t\t\t\t\t'wp-block-navigation-item__content': isNavigationChild,\n\t\t\t\t\t} ) }\n\t\t\t\t\thref={ link }\n\t\t\t\t\tdangerouslySetInnerHTML={ {\n\t\t\t\t\t\t__html: safeHTML( title ),\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ hasChildren && (\n\t\t\t\t<>\n\t\t\t\t\t{ ! openOnClick && context.showSubmenuIcon && (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclassName=\"wp-block-navigation-item__content wp-block-navigation-submenu__toggle wp-block-page-list__submenu-icon wp-block-navigation__submenu-icon\"\n\t\t\t\t\t\t\taria-expanded=\"false\"\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ItemSubmenuIcon />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) }\n\t\t\t\t\t<ul { ...innerBlocksProps }></ul>\n\t\t\t\t</>\n\t\t\t) }\n\t\t</li>\n\t);\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kBAAiB;AAIjB,0BAAmD;AACnD,kBAA0B;AAC1B,uBAAmC;AACnC,iBAAyB;AAKzB,mBAAgC;AAChC,mBAGO;AAuDH;AArDJ,SAAS,iBAAiB;AACzB,aAAO,uBAAW,CAAE,WAAY;AAC/B,UAAM,kBAAkB,OAAQ,iBAAAA,KAAU,EAAE,QAAS,QAAQ;AAAA,MAC5D,MAAM;AAAA,MACN,MAAM;AAAA,IACP,CAAE;AACF,QAAK,CAAE,iBAAkB;AACxB,aAAO;AAAA,IACR;AAEA,UAAM,OAAO,OAAQ,iBAAAA,KAAU,EAAE,gBAAiB,QAAQ,MAAO;AACjE,WAAO,MAAM,kBAAkB,UAAU,MAAM;AAAA,EAChD,GAAG,CAAC,CAAE;AACP;AAEe,SAAR,iBAAmC,EAAE,SAAS,WAAW,GAAI;AACnE,QAAM,EAAE,IAAI,OAAO,MAAM,aAAa,MAAM,IAAI;AAChD,QAAM,oBAAoB,qBAAqB;AAC/C,QAAM,cAAc,eAAe;AAKnC,QAAM,oBAAoB,QAAQ;AAElC,QAAM,cAAc,sBAAsB;AAE1C,QAAM,wBAAoB,wBAAW,SAAS,IAAK;AAEnD,QAAM,gCACL,2CAA8B,iBAAkB;AACjD,QAAM,iBAAa,mCAAe,2BAA2B;AAAA,IAC5D,WAAW;AAAA,EACZ,CAAE;AAEF,QAAM,uBAAmB,yCAAqB,UAAW;AAEzD,SACC;AAAA,IAAC;AAAA;AAAA,MAEA,eAAY,YAAAC,SAAM,6BAA6B;AAAA,QAC9C,aAAa;AAAA,QACb,4BAA4B;AAAA;AAAA,QAE5B,iBAAiB;AAAA,QACjB,eAAe,sBAAsB;AAAA;AAAA,QAErC,uBACC,sBAAsB,WAAW,QAAQ;AAAA,QAC1C,kBAAkB,OAAO;AAAA,MAC1B,CAAE;AAAA,MAEA;AAAA,uBAAe,cAChB,4EACC;AAAA;AAAA,YAAC;AAAA;AAAA,cACA,MAAK;AAAA,cACL,WAAU;AAAA,cACV,iBAAc;AAAA,cACd,yBAA0B;AAAA,gBACzB,YAAQ,qBAAU,KAAM;AAAA,cACzB;AAAA;AAAA,UACD;AAAA,UACA,4CAAC,UAAK,WAAU,sEACf,sDAAC,gCAAgB,GAClB;AAAA,WACD,IAEA;AAAA,UAAC;AAAA;AAAA,YACA,eAAY,YAAAA,SAAM,mCAAmC;AAAA,cACpD,qCAAqC;AAAA,YACtC,CAAE;AAAA,YACF,MAAO;AAAA,YACP,yBAA0B;AAAA,cACzB,YAAQ,qBAAU,KAAM;AAAA,YACzB;AAAA;AAAA,QACD;AAAA,QAEC,eACD,4EACG;AAAA,WAAE,eAAe,QAAQ,mBAC1B;AAAA,YAAC;AAAA;AAAA,cACA,WAAU;AAAA,cACV,iBAAc;AAAA,cACd,MAAK;AAAA,cAEL,sDAAC,gCAAgB;AAAA;AAAA,UAClB;AAAA,UAED,4CAAC,QAAK,GAAG,kBAAmB;AAAA,WAC7B;AAAA;AAAA;AAAA,IAlDK;AAAA,EAoDP;AAEF;",
|
|
6
6
|
"names": ["coreStore", "clsx"]
|
|
7
7
|
}
|
package/build/playlist/edit.cjs
CHANGED
|
@@ -30,7 +30,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
30
30
|
// packages/block-library/src/playlist/edit.js
|
|
31
31
|
var edit_exports = {};
|
|
32
32
|
__export(edit_exports, {
|
|
33
|
-
default: () => edit_default
|
|
33
|
+
default: () => edit_default,
|
|
34
|
+
getTrackAttributes: () => getTrackAttributes
|
|
34
35
|
});
|
|
35
36
|
module.exports = __toCommonJS(edit_exports);
|
|
36
37
|
var import_clsx = __toESM(require("clsx"));
|
|
@@ -42,101 +43,28 @@ var import_data = require("@wordpress/data");
|
|
|
42
43
|
var import_notices = require("@wordpress/notices");
|
|
43
44
|
var import_i18n = require("@wordpress/i18n");
|
|
44
45
|
var import_icons = require("@wordpress/icons");
|
|
45
|
-
var import_dom = require("@wordpress/dom");
|
|
46
46
|
var import_blocks = require("@wordpress/blocks");
|
|
47
47
|
var import_caption = require("../utils/caption.cjs");
|
|
48
48
|
var import_hooks = require("../utils/hooks.cjs");
|
|
49
|
+
var import_waveform_player = require("../utils/waveform-player.cjs");
|
|
49
50
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
50
51
|
var ALLOWED_MEDIA_TYPES = ["audio"];
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
function getTrackAttributes(media) {
|
|
53
|
+
return {
|
|
54
|
+
id: media.id || media.url,
|
|
55
|
+
// Attachment ID or URL.
|
|
56
|
+
uniqueId: (0, import_uuid.v4)(),
|
|
57
|
+
// Unique ID for the track.
|
|
58
|
+
src: media.url,
|
|
59
|
+
title: media.title,
|
|
60
|
+
artist: media.artist || media?.meta?.artist || media?.media_details?.artist || (0, import_i18n.__)("Unknown artist"),
|
|
61
|
+
album: media.album || media?.meta?.album || media?.media_details?.album || (0, import_i18n.__)("Unknown album"),
|
|
62
|
+
length: media?.fileLength || media?.media_details?.length_formatted,
|
|
63
|
+
// Prevent using the default media attachment icon as the track image.
|
|
64
|
+
// Note: Image is not available when a new track is uploaded.
|
|
65
|
+
image: media?.image?.src && media?.image?.src.endsWith("/images/media/audio.svg") ? "" : media?.image?.src
|
|
56
66
|
};
|
|
57
|
-
|
|
58
|
-
dangerouslySetInnerHTML: {
|
|
59
|
-
__html: (0, import_dom.safeHTML)(
|
|
60
|
-
track?.artist ? track.artist : (0, import_i18n.__)("Unknown artist")
|
|
61
|
-
)
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
const trackAlbum = {
|
|
65
|
-
dangerouslySetInnerHTML: {
|
|
66
|
-
__html: (0, import_dom.safeHTML)(
|
|
67
|
-
track?.album ? track.album : (0, import_i18n.__)("Unknown album")
|
|
68
|
-
)
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
let ariaLabel;
|
|
72
|
-
if (track?.title && track?.artist && track?.album) {
|
|
73
|
-
ariaLabel = (0, import_dom.__unstableStripHTML)(
|
|
74
|
-
(0, import_i18n.sprintf)(
|
|
75
|
-
/* translators: %1$s: track title, %2$s artist name, %3$s: album name. */
|
|
76
|
-
(0, import_i18n._x)(
|
|
77
|
-
"%1$s by %2$s from the album %3$s",
|
|
78
|
-
"track title, artist name, album name"
|
|
79
|
-
),
|
|
80
|
-
track?.title,
|
|
81
|
-
track?.artist,
|
|
82
|
-
track?.album
|
|
83
|
-
)
|
|
84
|
-
);
|
|
85
|
-
} else if (track?.title) {
|
|
86
|
-
ariaLabel = (0, import_dom.__unstableStripHTML)(track.title);
|
|
87
|
-
} else {
|
|
88
|
-
ariaLabel = (0, import_dom.__unstableStripHTML)((0, import_i18n.__)("Untitled"));
|
|
89
|
-
}
|
|
90
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
91
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "wp-block-playlist__current-item", children: [
|
|
92
|
-
showImages && track?.image && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
93
|
-
"img",
|
|
94
|
-
{
|
|
95
|
-
className: "wp-block-playlist__item-image",
|
|
96
|
-
src: track.image,
|
|
97
|
-
alt: "",
|
|
98
|
-
width: "70px",
|
|
99
|
-
height: "70px"
|
|
100
|
-
}
|
|
101
|
-
),
|
|
102
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
|
|
103
|
-
!track?.title ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "wp-block-playlist__item-title", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Spinner, {}) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
104
|
-
"span",
|
|
105
|
-
{
|
|
106
|
-
className: "wp-block-playlist__item-title",
|
|
107
|
-
...trackTitle
|
|
108
|
-
}
|
|
109
|
-
),
|
|
110
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "wp-block-playlist__current-item-artist-album", children: [
|
|
111
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
112
|
-
"span",
|
|
113
|
-
{
|
|
114
|
-
className: "wp-block-playlist__item-artist",
|
|
115
|
-
...trackArtist
|
|
116
|
-
}
|
|
117
|
-
),
|
|
118
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
119
|
-
"span",
|
|
120
|
-
{
|
|
121
|
-
className: "wp-block-playlist__item-album",
|
|
122
|
-
...trackAlbum
|
|
123
|
-
}
|
|
124
|
-
)
|
|
125
|
-
] })
|
|
126
|
-
] })
|
|
127
|
-
] }),
|
|
128
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
129
|
-
"audio",
|
|
130
|
-
{
|
|
131
|
-
controls: "controls",
|
|
132
|
-
src: track?.url ? track.url : "",
|
|
133
|
-
onEnded: onTrackEnd,
|
|
134
|
-
"aria-label": ariaLabel,
|
|
135
|
-
tabIndex: 0
|
|
136
|
-
}
|
|
137
|
-
)
|
|
138
|
-
] });
|
|
139
|
-
};
|
|
67
|
+
}
|
|
140
68
|
var PlaylistEdit = ({
|
|
141
69
|
attributes,
|
|
142
70
|
setAttributes,
|
|
@@ -152,7 +80,6 @@ var PlaylistEdit = ({
|
|
|
152
80
|
showArtists,
|
|
153
81
|
currentTrack
|
|
154
82
|
} = attributes;
|
|
155
|
-
const [trackListIndex, setTrackListIndex] = (0, import_element.useState)(0);
|
|
156
83
|
const blockProps = (0, import_block_editor.useBlockProps)();
|
|
157
84
|
const { replaceInnerBlocks, __unstableMarkNextChangeAsNotPersistent } = (0, import_data.useDispatch)(import_block_editor.store);
|
|
158
85
|
const { createErrorNotice } = (0, import_data.useDispatch)(import_notices.store);
|
|
@@ -222,21 +149,7 @@ var PlaylistEdit = ({
|
|
|
222
149
|
if (!Array.isArray(media)) {
|
|
223
150
|
media = [media];
|
|
224
151
|
}
|
|
225
|
-
const
|
|
226
|
-
id: track.id || track.url,
|
|
227
|
-
// Attachment ID or URL.
|
|
228
|
-
uniqueId: (0, import_uuid.v4)(),
|
|
229
|
-
// Unique ID for the track.
|
|
230
|
-
src: track.url,
|
|
231
|
-
title: track.title,
|
|
232
|
-
artist: track.artist || track?.meta?.artist || track?.media_details?.artist || (0, import_i18n.__)("Unknown artist"),
|
|
233
|
-
album: track.album || track?.meta?.album || track?.media_details?.album || (0, import_i18n.__)("Unknown album"),
|
|
234
|
-
length: track?.fileLength || track?.media_details?.length_formatted,
|
|
235
|
-
// Prevent using the default media attachment icon as the track image.
|
|
236
|
-
// Note: Image is not available when a new track is uploaded.
|
|
237
|
-
image: track?.image?.src && track?.image?.src.endsWith("/images/media/audio.svg") ? "" : track?.image?.src
|
|
238
|
-
});
|
|
239
|
-
const trackList = media.map(trackAttributes);
|
|
152
|
+
const trackList = media.map(getTrackAttributes);
|
|
240
153
|
__unstableMarkNextChangeAsNotPersistent();
|
|
241
154
|
setAttributes({
|
|
242
155
|
currentTrack: trackList.length > 0 ? trackList[0].uniqueId : null
|
|
@@ -253,28 +166,18 @@ var PlaylistEdit = ({
|
|
|
253
166
|
clientId
|
|
254
167
|
]
|
|
255
168
|
);
|
|
256
|
-
const
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
if (tracks[0].uniqueId) {
|
|
267
|
-
setAttributes({ currentTrack: tracks[0].uniqueId });
|
|
268
|
-
} else if (tracks.length > 0) {
|
|
269
|
-
const validTrack = tracks.find(
|
|
270
|
-
(track) => track.uniqueId !== void 0
|
|
271
|
-
);
|
|
272
|
-
if (validTrack) {
|
|
273
|
-
setAttributes({ currentTrack: validTrack.uniqueId });
|
|
274
|
-
}
|
|
275
|
-
}
|
|
169
|
+
const currentTrackData = tracks.find(
|
|
170
|
+
(track) => track.uniqueId === currentTrack
|
|
171
|
+
);
|
|
172
|
+
const onTrackEnded = (0, import_element.useCallback)(() => {
|
|
173
|
+
const currentIndex = tracks.findIndex(
|
|
174
|
+
(track) => track.uniqueId === currentTrack
|
|
175
|
+
);
|
|
176
|
+
const nextTrack = tracks[currentIndex + 1] || tracks[0];
|
|
177
|
+
if (nextTrack?.uniqueId) {
|
|
178
|
+
setAttributes({ currentTrack: nextTrack.uniqueId });
|
|
276
179
|
}
|
|
277
|
-
}, [
|
|
180
|
+
}, [currentTrack, tracks, setAttributes]);
|
|
278
181
|
const onChangeOrder = (0, import_element.useCallback)(
|
|
279
182
|
(trackOrder) => {
|
|
280
183
|
const sortedBlocks = [...innerBlockTracks].sort((a, b) => {
|
|
@@ -285,13 +188,11 @@ var PlaylistEdit = ({
|
|
|
285
188
|
}
|
|
286
189
|
return titleB.localeCompare(titleA);
|
|
287
190
|
});
|
|
288
|
-
const
|
|
289
|
-
(block) => block.attributes
|
|
290
|
-
);
|
|
191
|
+
const firstUniqueId = sortedBlocks[0]?.attributes?.uniqueId;
|
|
291
192
|
replaceInnerBlocks(clientId, sortedBlocks);
|
|
292
193
|
setAttributes({
|
|
293
194
|
order: trackOrder,
|
|
294
|
-
currentTrack:
|
|
195
|
+
currentTrack: firstUniqueId && firstUniqueId !== currentTrack ? firstUniqueId : currentTrack
|
|
295
196
|
});
|
|
296
197
|
},
|
|
297
198
|
[
|
|
@@ -316,7 +217,7 @@ var PlaylistEdit = ({
|
|
|
316
217
|
__experimentalAppenderTagName: "li",
|
|
317
218
|
renderAppender: hasAnySelected && import_block_editor.InnerBlocks.ButtonBlockAppender
|
|
318
219
|
});
|
|
319
|
-
if (
|
|
220
|
+
if (tracks.length === 0) {
|
|
320
221
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
321
222
|
"div",
|
|
322
223
|
{
|
|
@@ -473,11 +374,13 @@ var PlaylistEdit = ({
|
|
|
473
374
|
) }),
|
|
474
375
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("figure", { ...blockProps, children: [
|
|
475
376
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Disabled, { isDisabled: !isSelected, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
476
|
-
|
|
377
|
+
import_waveform_player.WaveformPlayer,
|
|
477
378
|
{
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
379
|
+
src: currentTrackData?.src,
|
|
380
|
+
title: currentTrackData?.title,
|
|
381
|
+
artist: currentTrackData?.artist,
|
|
382
|
+
image: currentTrackData?.image,
|
|
383
|
+
onEnded: onTrackEnded
|
|
481
384
|
}
|
|
482
385
|
) }),
|
|
483
386
|
showTracklist && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
@@ -505,4 +408,8 @@ var PlaylistEdit = ({
|
|
|
505
408
|
] });
|
|
506
409
|
};
|
|
507
410
|
var edit_default = PlaylistEdit;
|
|
411
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
412
|
+
0 && (module.exports = {
|
|
413
|
+
getTrackAttributes
|
|
414
|
+
});
|
|
508
415
|
//# sourceMappingURL=edit.cjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/playlist/edit.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\nimport { v4 as uuid } from 'uuid';\n\n/**\n * WordPress dependencies\n */\nimport { useState, useCallback, useEffect } from '@wordpress/element';\nimport {\n\tstore as blockEditorStore,\n\tMediaPlaceholder,\n\tMediaReplaceFlow,\n\tBlockIcon,\n\tuseBlockProps,\n\tuseInnerBlocksProps,\n\tBlockControls,\n\tInspectorControls,\n\tInnerBlocks,\n} from '@wordpress/block-editor';\nimport {\n\tToggleControl,\n\tDisabled,\n\tSelectControl,\n\tSpinner,\n\t__experimentalToolsPanel as ToolsPanel,\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n} from '@wordpress/components';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { store as noticesStore } from '@wordpress/notices';\nimport { __, _x, sprintf } from '@wordpress/i18n';\nimport { audio as icon } from '@wordpress/icons';\nimport { safeHTML, __unstableStripHTML as stripHTML } from '@wordpress/dom';\nimport { createBlock } from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport { Caption } from '../utils/caption';\nimport { useToolsPanelDropdownMenuProps } from '../utils/hooks';\n\nconst ALLOWED_MEDIA_TYPES = [ 'audio' ];\n\nconst CurrentTrack = ( { track, showImages, onTrackEnd } ) => {\n\t/**\n\t * dangerouslySetInnerHTML and safeHTML are used because\n\t * the media library allows using some HTML tags in the title, artist, and album fields.\n\t */\n\tconst trackTitle = {\n\t\tdangerouslySetInnerHTML: {\n\t\t\t__html: safeHTML( track?.title ? track.title : __( 'Untitled' ) ),\n\t\t},\n\t};\n\tconst trackArtist = {\n\t\tdangerouslySetInnerHTML: {\n\t\t\t__html: safeHTML(\n\t\t\t\ttrack?.artist ? track.artist : __( 'Unknown artist' )\n\t\t\t),\n\t\t},\n\t};\n\tconst trackAlbum = {\n\t\tdangerouslySetInnerHTML: {\n\t\t\t__html: safeHTML(\n\t\t\t\ttrack?.album ? track.album : __( 'Unknown album' )\n\t\t\t),\n\t\t},\n\t};\n\n\tlet ariaLabel;\n\tif ( track?.title && track?.artist && track?.album ) {\n\t\tariaLabel = stripHTML(\n\t\t\tsprintf(\n\t\t\t\t/* translators: %1$s: track title, %2$s artist name, %3$s: album name. */\n\t\t\t\t_x(\n\t\t\t\t\t'%1$s by %2$s from the album %3$s',\n\t\t\t\t\t'track title, artist name, album name'\n\t\t\t\t),\n\t\t\t\ttrack?.title,\n\t\t\t\ttrack?.artist,\n\t\t\t\ttrack?.album\n\t\t\t)\n\t\t);\n\t} else if ( track?.title ) {\n\t\tariaLabel = stripHTML( track.title );\n\t} else {\n\t\tariaLabel = stripHTML( __( 'Untitled' ) );\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"wp-block-playlist__current-item\">\n\t\t\t\t{ showImages && track?.image && (\n\t\t\t\t\t<img\n\t\t\t\t\t\tclassName=\"wp-block-playlist__item-image\"\n\t\t\t\t\t\tsrc={ track.image }\n\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\twidth=\"70px\"\n\t\t\t\t\t\theight=\"70px\"\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t<div>\n\t\t\t\t\t{ ! track?.title ? (\n\t\t\t\t\t\t<span className=\"wp-block-playlist__item-title\">\n\t\t\t\t\t\t\t<Spinner />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName=\"wp-block-playlist__item-title\"\n\t\t\t\t\t\t\t{ ...trackTitle }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) }\n\t\t\t\t\t<div className=\"wp-block-playlist__current-item-artist-album\">\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName=\"wp-block-playlist__item-artist\"\n\t\t\t\t\t\t\t{ ...trackArtist }\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName=\"wp-block-playlist__item-album\"\n\t\t\t\t\t\t\t{ ...trackAlbum }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<audio\n\t\t\t\tcontrols=\"controls\"\n\t\t\t\tsrc={ track?.url ? track.url : '' }\n\t\t\t\tonEnded={ onTrackEnd }\n\t\t\t\taria-label={ ariaLabel }\n\t\t\t\ttabIndex={ 0 }\n\t\t\t/>\n\t\t</>\n\t);\n};\n\nconst PlaylistEdit = ( {\n\tattributes,\n\tsetAttributes,\n\tisSelected,\n\tinsertBlocksAfter,\n\tclientId,\n} ) => {\n\tconst {\n\t\torder,\n\t\tshowTracklist,\n\t\tshowNumbers,\n\t\tshowImages,\n\t\tshowArtists,\n\t\tcurrentTrack,\n\t} = attributes;\n\tconst [ trackListIndex, setTrackListIndex ] = useState( 0 );\n\tconst blockProps = useBlockProps();\n\tconst { replaceInnerBlocks, __unstableMarkNextChangeAsNotPersistent } =\n\t\tuseDispatch( blockEditorStore );\n\tconst { createErrorNotice } = useDispatch( noticesStore );\n\tconst dropdownMenuProps = useToolsPanelDropdownMenuProps();\n\tfunction onUploadError( message ) {\n\t\tcreateErrorNotice( message, { type: 'snackbar' } );\n\t}\n\tconst { updateBlockAttributes } = useDispatch( blockEditorStore );\n\n\tconst { innerBlockTracks } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getBlock: _getBlock } = select( blockEditorStore );\n\t\t\treturn {\n\t\t\t\tinnerBlockTracks: _getBlock( clientId )?.innerBlocks ?? [],\n\t\t\t};\n\t\t},\n\t\t[ clientId ]\n\t);\n\n\t// Ensure that each inner block has a unique ID,\n\t// even if a track is duplicated.\n\tuseEffect( () => {\n\t\tconst seen = new Set();\n\t\tlet hasDuplicates = false;\n\t\tconst updatedBlocks = innerBlockTracks.map( ( block ) => {\n\t\t\tif ( seen.has( block.attributes.uniqueId ) ) {\n\t\t\t\thasDuplicates = true;\n\t\t\t\treturn {\n\t\t\t\t\t...block,\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\t...block.attributes,\n\t\t\t\t\t\tuniqueId: uuid(),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tseen.add( block.attributes.uniqueId );\n\t\t\treturn block;\n\t\t} );\n\t\tif ( hasDuplicates ) {\n\t\t\treplaceInnerBlocks( clientId, updatedBlocks );\n\t\t}\n\t}, [ innerBlockTracks, clientId, replaceInnerBlocks ] );\n\n\t// Create a list of tracks from the inner blocks,\n\t// but skip blocks that do not have a uniqueId attribute, such as the media placeholder.\n\tconst validTracks = innerBlockTracks.filter(\n\t\t( block ) => !! block.attributes.uniqueId\n\t);\n\tconst tracks = validTracks.map( ( block ) => block.attributes );\n\tconst firstTrackId = validTracks[ 0 ]?.attributes?.uniqueId;\n\n\t// updateBlockAttributes is used to force updating the parent playlist block\n\t// when the currentTrack changes. Using setAttributes directly does not update\n\t// the currentTrack when multiple tracks are moved at the same time.\n\tuseEffect( () => {\n\t\tif ( tracks.length === 0 ) {\n\t\t\t// If there are no tracks but currentTrack is set, set it to null.\n\t\t\tif ( currentTrack !== null ) {\n\t\t\t\tupdateBlockAttributes( clientId, { currentTrack: null } );\n\t\t\t}\n\t\t} else if (\n\t\t\t// If the currentTrack is not the first track, update it to the first track.\n\t\t\tfirstTrackId &&\n\t\t\tfirstTrackId !== currentTrack\n\t\t) {\n\t\t\tupdateBlockAttributes( clientId, { currentTrack: firstTrackId } );\n\t\t}\n\t}, [\n\t\ttracks,\n\t\tcurrentTrack,\n\t\tfirstTrackId,\n\t\tclientId,\n\t\tupdateBlockAttributes,\n\t] );\n\n\tconst onSelectTracks = useCallback(\n\t\t( media ) => {\n\t\t\tif ( ! media ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( ! Array.isArray( media ) ) {\n\t\t\t\tmedia = [ media ];\n\t\t\t}\n\n\t\t\tconst trackAttributes = ( track ) => ( {\n\t\t\t\tid: track.id || track.url, // Attachment ID or URL.\n\t\t\t\tuniqueId: uuid(), // Unique ID for the track.\n\t\t\t\tsrc: track.url,\n\t\t\t\ttitle: track.title,\n\t\t\t\tartist:\n\t\t\t\t\ttrack.artist ||\n\t\t\t\t\ttrack?.meta?.artist ||\n\t\t\t\t\ttrack?.media_details?.artist ||\n\t\t\t\t\t__( 'Unknown artist' ),\n\t\t\t\talbum:\n\t\t\t\t\ttrack.album ||\n\t\t\t\t\ttrack?.meta?.album ||\n\t\t\t\t\ttrack?.media_details?.album ||\n\t\t\t\t\t__( 'Unknown album' ),\n\t\t\t\tlength:\n\t\t\t\t\ttrack?.fileLength || track?.media_details?.length_formatted,\n\t\t\t\t// Prevent using the default media attachment icon as the track image.\n\t\t\t\t// Note: Image is not available when a new track is uploaded.\n\t\t\t\timage:\n\t\t\t\t\ttrack?.image?.src &&\n\t\t\t\t\ttrack?.image?.src.endsWith( '/images/media/audio.svg' )\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: track?.image?.src,\n\t\t\t} );\n\n\t\t\tconst trackList = media.map( trackAttributes );\n\t\t\t__unstableMarkNextChangeAsNotPersistent();\n\t\t\tsetAttributes( {\n\t\t\t\tcurrentTrack:\n\t\t\t\t\ttrackList.length > 0 ? trackList[ 0 ].uniqueId : null,\n\t\t\t} );\n\n\t\t\tconst newBlocks = trackList.map( ( track ) =>\n\t\t\t\tcreateBlock( 'core/playlist-track', track )\n\t\t\t);\n\t\t\t// Replace the inner blocks with the new tracks.\n\t\t\treplaceInnerBlocks( clientId, newBlocks );\n\t\t},\n\t\t[\n\t\t\t__unstableMarkNextChangeAsNotPersistent,\n\t\t\tsetAttributes,\n\t\t\treplaceInnerBlocks,\n\t\t\tclientId,\n\t\t]\n\t);\n\n\tconst onTrackEnd = useCallback( () => {\n\t\t/* If there are tracks left, play the next track */\n\t\tif ( trackListIndex < tracks.length - 1 ) {\n\t\t\tif ( tracks[ trackListIndex + 1 ]?.uniqueId ) {\n\t\t\t\tsetTrackListIndex( trackListIndex + 1 );\n\t\t\t\tsetAttributes( {\n\t\t\t\t\tcurrentTrack: tracks[ trackListIndex + 1 ].uniqueId,\n\t\t\t\t} );\n\t\t\t}\n\t\t} else {\n\t\t\tsetTrackListIndex( 0 );\n\t\t\tif ( tracks[ 0 ].uniqueId ) {\n\t\t\t\tsetAttributes( { currentTrack: tracks[ 0 ].uniqueId } );\n\t\t\t} else if ( tracks.length > 0 ) {\n\t\t\t\tconst validTrack = tracks.find(\n\t\t\t\t\t( track ) => track.uniqueId !== undefined\n\t\t\t\t);\n\t\t\t\tif ( validTrack ) {\n\t\t\t\t\tsetAttributes( { currentTrack: validTrack.uniqueId } );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, [ setAttributes, trackListIndex, tracks ] );\n\n\tconst onChangeOrder = useCallback(\n\t\t( trackOrder ) => {\n\t\t\tconst sortedBlocks = [ ...innerBlockTracks ].sort( ( a, b ) => {\n\t\t\t\tconst titleA = a.attributes.title || '';\n\t\t\t\tconst titleB = b.attributes.title || '';\n\n\t\t\t\tif ( trackOrder === 'asc' ) {\n\t\t\t\t\treturn titleA.localeCompare( titleB );\n\t\t\t\t}\n\t\t\t\treturn titleB.localeCompare( titleA );\n\t\t\t} );\n\t\t\tconst sortedTracks = sortedBlocks.map(\n\t\t\t\t( block ) => block.attributes\n\t\t\t);\n\t\t\treplaceInnerBlocks( clientId, sortedBlocks );\n\t\t\tsetAttributes( {\n\t\t\t\torder: trackOrder,\n\t\t\t\tcurrentTrack:\n\t\t\t\t\tsortedTracks.length > 0 &&\n\t\t\t\t\tsortedTracks[ 0 ].uniqueId !== currentTrack\n\t\t\t\t\t\t? sortedTracks[ 0 ].uniqueId\n\t\t\t\t\t\t: currentTrack,\n\t\t\t} );\n\t\t},\n\t\t[\n\t\t\tclientId,\n\t\t\tcurrentTrack,\n\t\t\tinnerBlockTracks,\n\t\t\treplaceInnerBlocks,\n\t\t\tsetAttributes,\n\t\t]\n\t);\n\n\tfunction toggleAttribute( attribute ) {\n\t\treturn ( newValue ) => {\n\t\t\tsetAttributes( { [ attribute ]: newValue } );\n\t\t};\n\t}\n\n\tconst hasSelectedChild = useSelect(\n\t\t( select ) =>\n\t\t\tselect( blockEditorStore ).hasSelectedInnerBlock( clientId ),\n\t\t[ clientId ]\n\t);\n\n\tconst hasAnySelected = isSelected || hasSelectedChild;\n\n\tconst innerBlocksProps = useInnerBlocksProps( blockProps, {\n\t\t__experimentalAppenderTagName: 'li',\n\t\trenderAppender: hasAnySelected && InnerBlocks.ButtonBlockAppender,\n\t} );\n\n\tif ( ! tracks || ( Array.isArray( tracks ) && tracks.length === 0 ) ) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\t{ ...blockProps }\n\t\t\t\tclassName={ clsx( 'is-placeholder', blockProps.className ) }\n\t\t\t>\n\t\t\t\t<MediaPlaceholder\n\t\t\t\t\ticon={ <BlockIcon icon={ icon } /> }\n\t\t\t\t\tlabels={ {\n\t\t\t\t\t\ttitle: __( 'Playlist' ),\n\t\t\t\t\t\tinstructions: __(\n\t\t\t\t\t\t\t'Upload an audio file or pick one from your media library.'\n\t\t\t\t\t\t),\n\t\t\t\t\t} }\n\t\t\t\t\tonSelect={ onSelectTracks }\n\t\t\t\t\taccept=\"audio/*\"\n\t\t\t\t\tmultiple\n\t\t\t\t\tallowedTypes={ ALLOWED_MEDIA_TYPES }\n\t\t\t\t\tonError={ onUploadError }\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<BlockControls group=\"other\">\n\t\t\t\t<MediaReplaceFlow\n\t\t\t\t\tname={ __( 'Edit' ) }\n\t\t\t\t\tonSelect={ onSelectTracks }\n\t\t\t\t\taccept=\"audio/*\"\n\t\t\t\t\tmultiple\n\t\t\t\t\tmediaIds={ tracks\n\t\t\t\t\t\t.filter( ( track ) => track.id )\n\t\t\t\t\t\t.map( ( track ) => track.id ) }\n\t\t\t\t\tallowedTypes={ ALLOWED_MEDIA_TYPES }\n\t\t\t\t\tonError={ onUploadError }\n\t\t\t\t/>\n\t\t\t</BlockControls>\n\t\t\t<InspectorControls>\n\t\t\t\t<ToolsPanel\n\t\t\t\t\tlabel={ __( 'Settings' ) }\n\t\t\t\t\tresetAll={ () => {\n\t\t\t\t\t\tsetAttributes( {\n\t\t\t\t\t\t\tshowTracklist: true,\n\t\t\t\t\t\t\tshowArtists: true,\n\t\t\t\t\t\t\tshowNumbers: true,\n\t\t\t\t\t\t\tshowImages: true,\n\t\t\t\t\t\t\torder: 'asc',\n\t\t\t\t\t\t} );\n\t\t\t\t\t} }\n\t\t\t\t\tdropdownMenuProps={ dropdownMenuProps }\n\t\t\t\t>\n\t\t\t\t\t<ToolsPanelItem\n\t\t\t\t\t\tlabel={ __( 'Show Tracklist' ) }\n\t\t\t\t\t\tisShownByDefault\n\t\t\t\t\t\thasValue={ () => showTracklist !== true }\n\t\t\t\t\t\tonDeselect={ () =>\n\t\t\t\t\t\t\tsetAttributes( { showTracklist: true } )\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\t\tlabel={ __( 'Show Tracklist' ) }\n\t\t\t\t\t\t\tonChange={ toggleAttribute( 'showTracklist' ) }\n\t\t\t\t\t\t\tchecked={ showTracklist }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ToolsPanelItem>\n\t\t\t\t\t{ showTracklist && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<ToolsPanelItem\n\t\t\t\t\t\t\t\tlabel={ __( 'Show artist name in Tracklist' ) }\n\t\t\t\t\t\t\t\tisShownByDefault\n\t\t\t\t\t\t\t\thasValue={ () => showArtists !== true }\n\t\t\t\t\t\t\t\tonDeselect={ () =>\n\t\t\t\t\t\t\t\t\tsetAttributes( { showArtists: true } )\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\t\t\t\tlabel={ __(\n\t\t\t\t\t\t\t\t\t\t'Show artist name in Tracklist'\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\tonChange={ toggleAttribute(\n\t\t\t\t\t\t\t\t\t\t'showArtists'\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\tchecked={ showArtists }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</ToolsPanelItem>\n\t\t\t\t\t\t\t<ToolsPanelItem\n\t\t\t\t\t\t\t\tlabel={ __( 'Show number in Tracklist' ) }\n\t\t\t\t\t\t\t\tisShownByDefault\n\t\t\t\t\t\t\t\thasValue={ () => showNumbers !== true }\n\t\t\t\t\t\t\t\tonDeselect={ () =>\n\t\t\t\t\t\t\t\t\tsetAttributes( { showNumbers: true } )\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\t\t\t\tlabel={ __( 'Show number in Tracklist' ) }\n\t\t\t\t\t\t\t\t\tonChange={ toggleAttribute(\n\t\t\t\t\t\t\t\t\t\t'showNumbers'\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\tchecked={ showNumbers }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</ToolsPanelItem>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) }\n\t\t\t\t\t<ToolsPanelItem\n\t\t\t\t\t\tlabel={ __( 'Show images' ) }\n\t\t\t\t\t\tisShownByDefault\n\t\t\t\t\t\thasValue={ () => showImages !== true }\n\t\t\t\t\t\tonDeselect={ () =>\n\t\t\t\t\t\t\tsetAttributes( { showImages: true } )\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\t\tlabel={ __( 'Show images' ) }\n\t\t\t\t\t\t\tonChange={ toggleAttribute( 'showImages' ) }\n\t\t\t\t\t\t\tchecked={ showImages }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ToolsPanelItem>\n\t\t\t\t\t<ToolsPanelItem\n\t\t\t\t\t\tlabel={ __( 'Order' ) }\n\t\t\t\t\t\tisShownByDefault\n\t\t\t\t\t\thasValue={ () => order !== 'asc' }\n\t\t\t\t\t\tonDeselect={ () => setAttributes( { order: 'asc' } ) }\n\t\t\t\t\t>\n\t\t\t\t\t\t<SelectControl\n\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\tlabel={ __( 'Order' ) }\n\t\t\t\t\t\t\tvalue={ order }\n\t\t\t\t\t\t\toptions={ [\n\t\t\t\t\t\t\t\t{ label: __( 'Descending' ), value: 'desc' },\n\t\t\t\t\t\t\t\t{ label: __( 'Ascending' ), value: 'asc' },\n\t\t\t\t\t\t\t] }\n\t\t\t\t\t\t\tonChange={ ( value ) => onChangeOrder( value ) }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ToolsPanelItem>\n\t\t\t\t</ToolsPanel>\n\t\t\t</InspectorControls>\n\t\t\t<figure { ...blockProps }>\n\t\t\t\t<Disabled isDisabled={ ! isSelected }>\n\t\t\t\t\t<CurrentTrack\n\t\t\t\t\t\ttrack={ tracks[ trackListIndex ] }\n\t\t\t\t\t\tshowImages={ showImages }\n\t\t\t\t\t\tonTrackEnd={ onTrackEnd }\n\t\t\t\t\t/>\n\t\t\t\t</Disabled>\n\t\t\t\t{ showTracklist && (\n\t\t\t\t\t<ol\n\t\t\t\t\t\tclassName={ clsx( 'wp-block-playlist__tracklist', {\n\t\t\t\t\t\t\t'wp-block-playlist__tracklist-show-numbers':\n\t\t\t\t\t\t\t\tshowNumbers,\n\t\t\t\t\t\t} ) }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ innerBlocksProps.children }\n\t\t\t\t\t</ol>\n\t\t\t\t) }\n\t\t\t\t<Caption\n\t\t\t\t\tattributes={ attributes }\n\t\t\t\t\tsetAttributes={ setAttributes }\n\t\t\t\t\tisSelected={ isSelected }\n\t\t\t\t\tinsertBlocksAfter={ insertBlocksAfter }\n\t\t\t\t\tlabel={ __( 'Playlist caption text' ) }\n\t\t\t\t\tshowToolbarButton={ isSelected }\n\t\t\t\t\tstyle={ { marginTop: 16 } }\n\t\t\t\t/>\n\t\t\t</figure>\n\t\t</>\n\t);\n};\n\nexport default PlaylistEdit;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kBAAiB;AACjB,kBAA2B;AAK3B,
|
|
6
|
-
"names": ["
|
|
4
|
+
"sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\nimport { v4 as uuid } from 'uuid';\n\n/**\n * WordPress dependencies\n */\nimport { useCallback, useEffect } from '@wordpress/element';\nimport {\n\tstore as blockEditorStore,\n\tMediaPlaceholder,\n\tMediaReplaceFlow,\n\tBlockIcon,\n\tuseBlockProps,\n\tuseInnerBlocksProps,\n\tBlockControls,\n\tInspectorControls,\n\tInnerBlocks,\n} from '@wordpress/block-editor';\nimport {\n\tToggleControl,\n\tDisabled,\n\tSelectControl,\n\t__experimentalToolsPanel as ToolsPanel,\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n} from '@wordpress/components';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { store as noticesStore } from '@wordpress/notices';\nimport { __ } from '@wordpress/i18n';\nimport { audio as icon } from '@wordpress/icons';\nimport { createBlock } from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport { Caption } from '../utils/caption';\nimport { useToolsPanelDropdownMenuProps } from '../utils/hooks';\nimport { WaveformPlayer } from '../utils/waveform-player';\n\nconst ALLOWED_MEDIA_TYPES = [ 'audio' ];\n\n/**\n * Transform media library data into track block attributes.\n *\n * @param {Object} media - Media object from the media library.\n * @return {Object} Track attributes for the playlist-track block.\n */\nfunction getTrackAttributes( media ) {\n\treturn {\n\t\tid: media.id || media.url, // Attachment ID or URL.\n\t\tuniqueId: uuid(), // Unique ID for the track.\n\t\tsrc: media.url,\n\t\ttitle: media.title,\n\t\tartist:\n\t\t\tmedia.artist ||\n\t\t\tmedia?.meta?.artist ||\n\t\t\tmedia?.media_details?.artist ||\n\t\t\t__( 'Unknown artist' ),\n\t\talbum:\n\t\t\tmedia.album ||\n\t\t\tmedia?.meta?.album ||\n\t\t\tmedia?.media_details?.album ||\n\t\t\t__( 'Unknown album' ),\n\t\tlength: media?.fileLength || media?.media_details?.length_formatted,\n\t\t// Prevent using the default media attachment icon as the track image.\n\t\t// Note: Image is not available when a new track is uploaded.\n\t\timage:\n\t\t\tmedia?.image?.src &&\n\t\t\tmedia?.image?.src.endsWith( '/images/media/audio.svg' )\n\t\t\t\t? ''\n\t\t\t\t: media?.image?.src,\n\t};\n}\n\nconst PlaylistEdit = ( {\n\tattributes,\n\tsetAttributes,\n\tisSelected,\n\tinsertBlocksAfter,\n\tclientId,\n} ) => {\n\tconst {\n\t\torder,\n\t\tshowTracklist,\n\t\tshowNumbers,\n\t\tshowImages,\n\t\tshowArtists,\n\t\tcurrentTrack,\n\t} = attributes;\n\tconst blockProps = useBlockProps();\n\tconst { replaceInnerBlocks, __unstableMarkNextChangeAsNotPersistent } =\n\t\tuseDispatch( blockEditorStore );\n\tconst { createErrorNotice } = useDispatch( noticesStore );\n\tconst dropdownMenuProps = useToolsPanelDropdownMenuProps();\n\tfunction onUploadError( message ) {\n\t\tcreateErrorNotice( message, { type: 'snackbar' } );\n\t}\n\tconst { updateBlockAttributes } = useDispatch( blockEditorStore );\n\n\tconst { innerBlockTracks } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getBlock: _getBlock } = select( blockEditorStore );\n\t\t\treturn {\n\t\t\t\tinnerBlockTracks: _getBlock( clientId )?.innerBlocks ?? [],\n\t\t\t};\n\t\t},\n\t\t[ clientId ]\n\t);\n\n\t// Ensure that each inner block has a unique ID,\n\t// even if a track is duplicated.\n\tuseEffect( () => {\n\t\tconst seen = new Set();\n\t\tlet hasDuplicates = false;\n\t\tconst updatedBlocks = innerBlockTracks.map( ( block ) => {\n\t\t\tif ( seen.has( block.attributes.uniqueId ) ) {\n\t\t\t\thasDuplicates = true;\n\t\t\t\treturn {\n\t\t\t\t\t...block,\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\t...block.attributes,\n\t\t\t\t\t\tuniqueId: uuid(),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tseen.add( block.attributes.uniqueId );\n\t\t\treturn block;\n\t\t} );\n\t\tif ( hasDuplicates ) {\n\t\t\treplaceInnerBlocks( clientId, updatedBlocks );\n\t\t}\n\t}, [ innerBlockTracks, clientId, replaceInnerBlocks ] );\n\n\t// Create a list of tracks from the inner blocks,\n\t// but skip blocks that do not have a uniqueId attribute, such as the media placeholder.\n\tconst validTracks = innerBlockTracks.filter(\n\t\t( block ) => !! block.attributes.uniqueId\n\t);\n\tconst tracks = validTracks.map( ( block ) => block.attributes );\n\tconst firstTrackId = validTracks[ 0 ]?.attributes?.uniqueId;\n\n\t// updateBlockAttributes is used to force updating the parent playlist block\n\t// when the currentTrack changes. Using setAttributes directly does not update\n\t// the currentTrack when multiple tracks are moved at the same time.\n\tuseEffect( () => {\n\t\tif ( tracks.length === 0 ) {\n\t\t\t// If there are no tracks but currentTrack is set, set it to null.\n\t\t\tif ( currentTrack !== null ) {\n\t\t\t\tupdateBlockAttributes( clientId, { currentTrack: null } );\n\t\t\t}\n\t\t} else if (\n\t\t\t// If the currentTrack is not the first track, update it to the first track.\n\t\t\tfirstTrackId &&\n\t\t\tfirstTrackId !== currentTrack\n\t\t) {\n\t\t\tupdateBlockAttributes( clientId, { currentTrack: firstTrackId } );\n\t\t}\n\t}, [\n\t\ttracks,\n\t\tcurrentTrack,\n\t\tfirstTrackId,\n\t\tclientId,\n\t\tupdateBlockAttributes,\n\t] );\n\n\tconst onSelectTracks = useCallback(\n\t\t( media ) => {\n\t\t\tif ( ! media ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( ! Array.isArray( media ) ) {\n\t\t\t\tmedia = [ media ];\n\t\t\t}\n\n\t\t\tconst trackList = media.map( getTrackAttributes );\n\t\t\t__unstableMarkNextChangeAsNotPersistent();\n\t\t\tsetAttributes( {\n\t\t\t\tcurrentTrack:\n\t\t\t\t\ttrackList.length > 0 ? trackList[ 0 ].uniqueId : null,\n\t\t\t} );\n\n\t\t\tconst newBlocks = trackList.map( ( track ) =>\n\t\t\t\tcreateBlock( 'core/playlist-track', track )\n\t\t\t);\n\t\t\t// Replace the inner blocks with the new tracks.\n\t\t\treplaceInnerBlocks( clientId, newBlocks );\n\t\t},\n\t\t[\n\t\t\t__unstableMarkNextChangeAsNotPersistent,\n\t\t\tsetAttributes,\n\t\t\treplaceInnerBlocks,\n\t\t\tclientId,\n\t\t]\n\t);\n\n\t// Get current track data by finding the track with matching uniqueId.\n\tconst currentTrackData = tracks.find(\n\t\t( track ) => track.uniqueId === currentTrack\n\t);\n\n\t// Handle track end - advance to next track or loop to first.\n\tconst onTrackEnded = useCallback( () => {\n\t\tconst currentIndex = tracks.findIndex(\n\t\t\t( track ) => track.uniqueId === currentTrack\n\t\t);\n\t\tconst nextTrack = tracks[ currentIndex + 1 ] || tracks[ 0 ];\n\t\tif ( nextTrack?.uniqueId ) {\n\t\t\tsetAttributes( { currentTrack: nextTrack.uniqueId } );\n\t\t}\n\t}, [ currentTrack, tracks, setAttributes ] );\n\n\tconst onChangeOrder = useCallback(\n\t\t( trackOrder ) => {\n\t\t\tconst sortedBlocks = [ ...innerBlockTracks ].sort( ( a, b ) => {\n\t\t\t\tconst titleA = a.attributes.title || '';\n\t\t\t\tconst titleB = b.attributes.title || '';\n\n\t\t\t\tif ( trackOrder === 'asc' ) {\n\t\t\t\t\treturn titleA.localeCompare( titleB );\n\t\t\t\t}\n\t\t\t\treturn titleB.localeCompare( titleA );\n\t\t\t} );\n\t\t\tconst firstUniqueId = sortedBlocks[ 0 ]?.attributes?.uniqueId;\n\t\t\treplaceInnerBlocks( clientId, sortedBlocks );\n\t\t\tsetAttributes( {\n\t\t\t\torder: trackOrder,\n\t\t\t\tcurrentTrack:\n\t\t\t\t\tfirstUniqueId && firstUniqueId !== currentTrack\n\t\t\t\t\t\t? firstUniqueId\n\t\t\t\t\t\t: currentTrack,\n\t\t\t} );\n\t\t},\n\t\t[\n\t\t\tclientId,\n\t\t\tcurrentTrack,\n\t\t\tinnerBlockTracks,\n\t\t\treplaceInnerBlocks,\n\t\t\tsetAttributes,\n\t\t]\n\t);\n\n\tfunction toggleAttribute( attribute ) {\n\t\treturn ( newValue ) => {\n\t\t\tsetAttributes( { [ attribute ]: newValue } );\n\t\t};\n\t}\n\n\tconst hasSelectedChild = useSelect(\n\t\t( select ) =>\n\t\t\tselect( blockEditorStore ).hasSelectedInnerBlock( clientId ),\n\t\t[ clientId ]\n\t);\n\n\tconst hasAnySelected = isSelected || hasSelectedChild;\n\n\tconst innerBlocksProps = useInnerBlocksProps( blockProps, {\n\t\t__experimentalAppenderTagName: 'li',\n\t\trenderAppender: hasAnySelected && InnerBlocks.ButtonBlockAppender,\n\t} );\n\n\tif ( tracks.length === 0 ) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\t{ ...blockProps }\n\t\t\t\tclassName={ clsx( 'is-placeholder', blockProps.className ) }\n\t\t\t>\n\t\t\t\t<MediaPlaceholder\n\t\t\t\t\ticon={ <BlockIcon icon={ icon } /> }\n\t\t\t\t\tlabels={ {\n\t\t\t\t\t\ttitle: __( 'Playlist' ),\n\t\t\t\t\t\tinstructions: __(\n\t\t\t\t\t\t\t'Upload an audio file or pick one from your media library.'\n\t\t\t\t\t\t),\n\t\t\t\t\t} }\n\t\t\t\t\tonSelect={ onSelectTracks }\n\t\t\t\t\taccept=\"audio/*\"\n\t\t\t\t\tmultiple\n\t\t\t\t\tallowedTypes={ ALLOWED_MEDIA_TYPES }\n\t\t\t\t\tonError={ onUploadError }\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<BlockControls group=\"other\">\n\t\t\t\t<MediaReplaceFlow\n\t\t\t\t\tname={ __( 'Edit' ) }\n\t\t\t\t\tonSelect={ onSelectTracks }\n\t\t\t\t\taccept=\"audio/*\"\n\t\t\t\t\tmultiple\n\t\t\t\t\tmediaIds={ tracks\n\t\t\t\t\t\t.filter( ( track ) => track.id )\n\t\t\t\t\t\t.map( ( track ) => track.id ) }\n\t\t\t\t\tallowedTypes={ ALLOWED_MEDIA_TYPES }\n\t\t\t\t\tonError={ onUploadError }\n\t\t\t\t/>\n\t\t\t</BlockControls>\n\t\t\t<InspectorControls>\n\t\t\t\t<ToolsPanel\n\t\t\t\t\tlabel={ __( 'Settings' ) }\n\t\t\t\t\tresetAll={ () => {\n\t\t\t\t\t\tsetAttributes( {\n\t\t\t\t\t\t\tshowTracklist: true,\n\t\t\t\t\t\t\tshowArtists: true,\n\t\t\t\t\t\t\tshowNumbers: true,\n\t\t\t\t\t\t\tshowImages: true,\n\t\t\t\t\t\t\torder: 'asc',\n\t\t\t\t\t\t} );\n\t\t\t\t\t} }\n\t\t\t\t\tdropdownMenuProps={ dropdownMenuProps }\n\t\t\t\t>\n\t\t\t\t\t<ToolsPanelItem\n\t\t\t\t\t\tlabel={ __( 'Show Tracklist' ) }\n\t\t\t\t\t\tisShownByDefault\n\t\t\t\t\t\thasValue={ () => showTracklist !== true }\n\t\t\t\t\t\tonDeselect={ () =>\n\t\t\t\t\t\t\tsetAttributes( { showTracklist: true } )\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\t\tlabel={ __( 'Show Tracklist' ) }\n\t\t\t\t\t\t\tonChange={ toggleAttribute( 'showTracklist' ) }\n\t\t\t\t\t\t\tchecked={ showTracklist }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ToolsPanelItem>\n\t\t\t\t\t{ showTracklist && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<ToolsPanelItem\n\t\t\t\t\t\t\t\tlabel={ __( 'Show artist name in Tracklist' ) }\n\t\t\t\t\t\t\t\tisShownByDefault\n\t\t\t\t\t\t\t\thasValue={ () => showArtists !== true }\n\t\t\t\t\t\t\t\tonDeselect={ () =>\n\t\t\t\t\t\t\t\t\tsetAttributes( { showArtists: true } )\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\t\t\t\tlabel={ __(\n\t\t\t\t\t\t\t\t\t\t'Show artist name in Tracklist'\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\tonChange={ toggleAttribute(\n\t\t\t\t\t\t\t\t\t\t'showArtists'\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\tchecked={ showArtists }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</ToolsPanelItem>\n\t\t\t\t\t\t\t<ToolsPanelItem\n\t\t\t\t\t\t\t\tlabel={ __( 'Show number in Tracklist' ) }\n\t\t\t\t\t\t\t\tisShownByDefault\n\t\t\t\t\t\t\t\thasValue={ () => showNumbers !== true }\n\t\t\t\t\t\t\t\tonDeselect={ () =>\n\t\t\t\t\t\t\t\t\tsetAttributes( { showNumbers: true } )\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\t\t\t\tlabel={ __( 'Show number in Tracklist' ) }\n\t\t\t\t\t\t\t\t\tonChange={ toggleAttribute(\n\t\t\t\t\t\t\t\t\t\t'showNumbers'\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\tchecked={ showNumbers }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</ToolsPanelItem>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) }\n\t\t\t\t\t<ToolsPanelItem\n\t\t\t\t\t\tlabel={ __( 'Show images' ) }\n\t\t\t\t\t\tisShownByDefault\n\t\t\t\t\t\thasValue={ () => showImages !== true }\n\t\t\t\t\t\tonDeselect={ () =>\n\t\t\t\t\t\t\tsetAttributes( { showImages: true } )\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\t\tlabel={ __( 'Show images' ) }\n\t\t\t\t\t\t\tonChange={ toggleAttribute( 'showImages' ) }\n\t\t\t\t\t\t\tchecked={ showImages }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ToolsPanelItem>\n\t\t\t\t\t<ToolsPanelItem\n\t\t\t\t\t\tlabel={ __( 'Order' ) }\n\t\t\t\t\t\tisShownByDefault\n\t\t\t\t\t\thasValue={ () => order !== 'asc' }\n\t\t\t\t\t\tonDeselect={ () => setAttributes( { order: 'asc' } ) }\n\t\t\t\t\t>\n\t\t\t\t\t\t<SelectControl\n\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\tlabel={ __( 'Order' ) }\n\t\t\t\t\t\t\tvalue={ order }\n\t\t\t\t\t\t\toptions={ [\n\t\t\t\t\t\t\t\t{ label: __( 'Descending' ), value: 'desc' },\n\t\t\t\t\t\t\t\t{ label: __( 'Ascending' ), value: 'asc' },\n\t\t\t\t\t\t\t] }\n\t\t\t\t\t\t\tonChange={ ( value ) => onChangeOrder( value ) }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ToolsPanelItem>\n\t\t\t\t</ToolsPanel>\n\t\t\t</InspectorControls>\n\t\t\t<figure { ...blockProps }>\n\t\t\t\t<Disabled isDisabled={ ! isSelected }>\n\t\t\t\t\t<WaveformPlayer\n\t\t\t\t\t\tsrc={ currentTrackData?.src }\n\t\t\t\t\t\ttitle={ currentTrackData?.title }\n\t\t\t\t\t\tartist={ currentTrackData?.artist }\n\t\t\t\t\t\timage={ currentTrackData?.image }\n\t\t\t\t\t\tonEnded={ onTrackEnded }\n\t\t\t\t\t/>\n\t\t\t\t</Disabled>\n\t\t\t\t{ showTracklist && (\n\t\t\t\t\t<ol\n\t\t\t\t\t\tclassName={ clsx( 'wp-block-playlist__tracklist', {\n\t\t\t\t\t\t\t'wp-block-playlist__tracklist-show-numbers':\n\t\t\t\t\t\t\t\tshowNumbers,\n\t\t\t\t\t\t} ) }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ innerBlocksProps.children }\n\t\t\t\t\t</ol>\n\t\t\t\t) }\n\t\t\t\t<Caption\n\t\t\t\t\tattributes={ attributes }\n\t\t\t\t\tsetAttributes={ setAttributes }\n\t\t\t\t\tisSelected={ isSelected }\n\t\t\t\t\tinsertBlocksAfter={ insertBlocksAfter }\n\t\t\t\t\tlabel={ __( 'Playlist caption text' ) }\n\t\t\t\t\tshowToolbarButton={ isSelected }\n\t\t\t\t\tstyle={ { marginTop: 16 } }\n\t\t\t\t/>\n\t\t\t</figure>\n\t\t</>\n\t);\n};\n\nexport default PlaylistEdit;\nexport { getTrackAttributes };\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["uuid", "blockEditorStore", "noticesStore", "clsx", "icon", "ToolsPanel", "ToolsPanelItem"]
|
|
7
7
|
}
|