@wordpress/editor 14.8.4 → 14.8.5

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.
Files changed (47) hide show
  1. package/build/bindings/post-meta.js +64 -42
  2. package/build/bindings/post-meta.js.map +1 -1
  3. package/build/components/entities-saved-states/index.js +8 -6
  4. package/build/components/entities-saved-states/index.js.map +1 -1
  5. package/build/components/post-publish-panel/maybe-upload-media.js +3 -3
  6. package/build/components/post-publish-panel/maybe-upload-media.js.map +1 -1
  7. package/build/components/preview-dropdown/index.js +5 -0
  8. package/build/components/preview-dropdown/index.js.map +1 -1
  9. package/build/components/provider/index.js +10 -14
  10. package/build/components/provider/index.js.map +1 -1
  11. package/build/components/zoom-out-toggle/index.js +7 -3
  12. package/build/components/zoom-out-toggle/index.js.map +1 -1
  13. package/build/store/actions.js +15 -4
  14. package/build/store/actions.js.map +1 -1
  15. package/build-module/bindings/post-meta.js +65 -42
  16. package/build-module/bindings/post-meta.js.map +1 -1
  17. package/build-module/components/entities-saved-states/index.js +8 -6
  18. package/build-module/components/entities-saved-states/index.js.map +1 -1
  19. package/build-module/components/post-publish-panel/maybe-upload-media.js +3 -3
  20. package/build-module/components/post-publish-panel/maybe-upload-media.js.map +1 -1
  21. package/build-module/components/preview-dropdown/index.js +5 -0
  22. package/build-module/components/preview-dropdown/index.js.map +1 -1
  23. package/build-module/components/provider/index.js +10 -14
  24. package/build-module/components/provider/index.js.map +1 -1
  25. package/build-module/components/zoom-out-toggle/index.js +7 -3
  26. package/build-module/components/zoom-out-toggle/index.js.map +1 -1
  27. package/build-module/store/actions.js +16 -5
  28. package/build-module/store/actions.js.map +1 -1
  29. package/build-style/style-rtl.css +2 -2
  30. package/build-style/style.css +2 -2
  31. package/build-types/bindings/post-meta.d.ts +3 -8
  32. package/build-types/bindings/post-meta.d.ts.map +1 -1
  33. package/build-types/components/entities-saved-states/index.d.ts.map +1 -1
  34. package/build-types/components/preview-dropdown/index.d.ts.map +1 -1
  35. package/build-types/components/provider/index.d.ts.map +1 -1
  36. package/build-types/components/zoom-out-toggle/index.d.ts.map +1 -1
  37. package/build-types/store/actions.d.ts.map +1 -1
  38. package/package.json +30 -30
  39. package/src/bindings/post-meta.js +73 -65
  40. package/src/components/entities-saved-states/index.js +10 -8
  41. package/src/components/entities-saved-states/style.scss +2 -2
  42. package/src/components/post-publish-panel/maybe-upload-media.js +3 -3
  43. package/src/components/preview-dropdown/index.js +3 -0
  44. package/src/components/provider/index.js +13 -20
  45. package/src/components/zoom-out-toggle/index.js +7 -1
  46. package/src/store/actions.js +26 -11
  47. package/tsconfig.tsbuildinfo +1 -1
@@ -8,21 +8,61 @@ import { store as coreDataStore } from '@wordpress/core-data';
8
8
  */
9
9
  import { store as editorStore } from '../store';
10
10
  import { unlock } from '../lock-unlock';
11
- function getMetadata(registry, context, registeredFields) {
12
- let metaFields = {};
13
- const type = registry.select(editorStore).getCurrentPostType();
11
+
12
+ /**
13
+ * Gets a list of post meta fields with their values and labels
14
+ * to be consumed in the needed callbacks.
15
+ * If the value is not available based on context, like in templates,
16
+ * it falls back to the default value, label, or key.
17
+ *
18
+ * @param {Object} registry The registry context exposed through `useRegistry`.
19
+ * @param {Object} context The context provided.
20
+ * @return {Object} List of post meta fields with their value and label.
21
+ *
22
+ * @example
23
+ * ```js
24
+ * {
25
+ * field_1_key: {
26
+ * label: 'Field 1 Label',
27
+ * value: 'Field 1 Value',
28
+ * },
29
+ * field_2_key: {
30
+ * label: 'Field 2 Label',
31
+ * value: 'Field 2 Value',
32
+ * },
33
+ * ...
34
+ * }
35
+ * ```
36
+ */
37
+ function getPostMetaFields(registry, context) {
14
38
  const {
15
39
  getEditedEntityRecord
16
40
  } = registry.select(coreDataStore);
41
+ const {
42
+ getRegisteredPostMeta
43
+ } = unlock(registry.select(coreDataStore));
44
+ let entityMetaValues;
45
+ // Try to get the current entity meta values.
17
46
  if (context?.postType && context?.postId) {
18
- metaFields = getEditedEntityRecord('postType', context?.postType, context?.postId).meta;
19
- } else if (type === 'wp_template') {
20
- // Populate the `metaFields` object with the default values.
21
- Object.entries(registeredFields || {}).forEach(([key, props]) => {
22
- if (props.default) {
23
- metaFields[key] = props.default;
24
- }
25
- });
47
+ entityMetaValues = getEditedEntityRecord('postType', context?.postType, context?.postId).meta;
48
+ }
49
+ const registeredFields = getRegisteredPostMeta(context?.postType);
50
+ const metaFields = {};
51
+ Object.entries(registeredFields || {}).forEach(([key, props]) => {
52
+ // Don't include footnotes or private fields.
53
+ if (key !== 'footnotes' && key.charAt(0) !== '_') {
54
+ var _entityMetaValues$key;
55
+ metaFields[key] = {
56
+ label: props.title || key,
57
+ value: // When using the entity value, an empty string IS a valid value.
58
+ (_entityMetaValues$key = entityMetaValues?.[key]) !== null && _entityMetaValues$key !== void 0 ? _entityMetaValues$key :
59
+ // When using the default, an empty string IS NOT a valid value.
60
+ props.default || undefined
61
+ };
62
+ }
63
+ });
64
+ if (!Object.keys(metaFields || {}).length) {
65
+ return null;
26
66
  }
27
67
  return metaFields;
28
68
  }
@@ -33,17 +73,17 @@ export default {
33
73
  context,
34
74
  bindings
35
75
  }) {
36
- const {
37
- getRegisteredPostMeta
38
- } = unlock(registry.select(coreDataStore));
39
- const registeredFields = getRegisteredPostMeta(context?.postType);
40
- const metaFields = getMetadata(registry, context, registeredFields);
76
+ const metaFields = getPostMetaFields(registry, context);
41
77
  const newValues = {};
42
78
  for (const [attributeName, source] of Object.entries(bindings)) {
43
- var _ref, _metaFields$metaKey;
79
+ var _ref;
44
80
  // Use the value, the field label, or the field key.
45
- const metaKey = source.args.key;
46
- newValues[attributeName] = (_ref = (_metaFields$metaKey = metaFields?.[metaKey]) !== null && _metaFields$metaKey !== void 0 ? _metaFields$metaKey : registeredFields?.[metaKey]?.title) !== null && _ref !== void 0 ? _ref : metaKey;
81
+ const fieldKey = source.args.key;
82
+ const {
83
+ value: fieldValue,
84
+ label: fieldLabel
85
+ } = metaFields?.[fieldKey] || {};
86
+ newValues[attributeName] = (_ref = fieldValue !== null && fieldValue !== void 0 ? fieldValue : fieldLabel) !== null && _ref !== void 0 ? _ref : fieldKey;
47
87
  }
48
88
  return newValues;
49
89
  },
@@ -64,7 +104,7 @@ export default {
64
104
  });
65
105
  },
66
106
  canUserEditValue({
67
- select,
107
+ registry,
68
108
  context,
69
109
  args
70
110
  }) {
@@ -72,27 +112,25 @@ export default {
72
112
  if (context?.query || context?.queryId) {
73
113
  return false;
74
114
  }
75
- const postType = context?.postType || select(editorStore).getCurrentPostType();
115
+ const postType = context?.postType || registry.select(editorStore).getCurrentPostType();
76
116
 
77
117
  // Check that editing is happening in the post editor and not a template.
78
118
  if (postType === 'wp_template') {
79
119
  return false;
80
120
  }
81
-
82
- // Check that the custom field is not protected and available in the REST API.
121
+ const fieldValue = getPostMetaFields(registry, context)?.[args.key]?.value;
83
122
  // Empty string or `false` could be a valid value, so we need to check if the field value is undefined.
84
- const fieldValue = select(coreDataStore).getEntityRecord('postType', postType, context?.postId)?.meta?.[args.key];
85
123
  if (fieldValue === undefined) {
86
124
  return false;
87
125
  }
88
126
  // Check that custom fields metabox is not enabled.
89
- const areCustomFieldsEnabled = select(editorStore).getEditorSettings().enableCustomFields;
127
+ const areCustomFieldsEnabled = registry.select(editorStore).getEditorSettings().enableCustomFields;
90
128
  if (areCustomFieldsEnabled) {
91
129
  return false;
92
130
  }
93
131
 
94
132
  // Check that the user has the capability to edit post meta.
95
- const canUserEdit = select(coreDataStore).canUser('update', {
133
+ const canUserEdit = registry.select(coreDataStore).canUser('update', {
96
134
  kind: 'postType',
97
135
  name: context?.postType,
98
136
  id: context?.postId
@@ -106,22 +144,7 @@ export default {
106
144
  registry,
107
145
  context
108
146
  }) {
109
- const {
110
- getRegisteredPostMeta
111
- } = unlock(registry.select(coreDataStore));
112
- const registeredFields = getRegisteredPostMeta(context?.postType);
113
- const metaFields = getMetadata(registry, context, registeredFields);
114
- if (!metaFields || !Object.keys(metaFields).length) {
115
- return null;
116
- }
117
- return Object.fromEntries(Object.entries(metaFields)
118
- // Remove footnotes or private keys from the list of fields.
119
- .filter(([key]) => key !== 'footnotes' && key.charAt(0) !== '_')
120
- // Return object with label and value.
121
- .map(([key, value]) => [key, {
122
- label: registeredFields?.[key]?.title || key,
123
- value
124
- }]));
147
+ return getPostMetaFields(registry, context);
125
148
  }
126
149
  };
127
150
  //# sourceMappingURL=post-meta.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["store","coreDataStore","editorStore","unlock","getMetadata","registry","context","registeredFields","metaFields","type","select","getCurrentPostType","getEditedEntityRecord","postType","postId","meta","Object","entries","forEach","key","props","default","name","getValues","bindings","getRegisteredPostMeta","newValues","attributeName","source","_ref","_metaFields$metaKey","metaKey","args","title","setValues","newMeta","values","newValue","dispatch","editEntityRecord","canUserEditValue","query","queryId","fieldValue","getEntityRecord","undefined","areCustomFieldsEnabled","getEditorSettings","enableCustomFields","canUserEdit","canUser","kind","id","getFieldsList","keys","length","fromEntries","filter","charAt","map","value","label"],"sources":["@wordpress/editor/src/bindings/post-meta.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { store as coreDataStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { store as editorStore } from '../store';\nimport { unlock } from '../lock-unlock';\n\nfunction getMetadata( registry, context, registeredFields ) {\n\tlet metaFields = {};\n\tconst type = registry.select( editorStore ).getCurrentPostType();\n\tconst { getEditedEntityRecord } = registry.select( coreDataStore );\n\n\tif ( context?.postType && context?.postId ) {\n\t\tmetaFields = getEditedEntityRecord(\n\t\t\t'postType',\n\t\t\tcontext?.postType,\n\t\t\tcontext?.postId\n\t\t).meta;\n\t} else if ( type === 'wp_template' ) {\n\t\t// Populate the `metaFields` object with the default values.\n\t\tObject.entries( registeredFields || {} ).forEach(\n\t\t\t( [ key, props ] ) => {\n\t\t\t\tif ( props.default ) {\n\t\t\t\t\tmetaFields[ key ] = props.default;\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n\treturn metaFields;\n}\n\nexport default {\n\tname: 'core/post-meta',\n\tgetValues( { registry, context, bindings } ) {\n\t\tconst { getRegisteredPostMeta } = unlock(\n\t\t\tregistry.select( coreDataStore )\n\t\t);\n\t\tconst registeredFields = getRegisteredPostMeta( context?.postType );\n\t\tconst metaFields = getMetadata( registry, context, registeredFields );\n\n\t\tconst newValues = {};\n\t\tfor ( const [ attributeName, source ] of Object.entries( bindings ) ) {\n\t\t\t// Use the value, the field label, or the field key.\n\t\t\tconst metaKey = source.args.key;\n\t\t\tnewValues[ attributeName ] =\n\t\t\t\tmetaFields?.[ metaKey ] ??\n\t\t\t\tregisteredFields?.[ metaKey ]?.title ??\n\t\t\t\tmetaKey;\n\t\t}\n\t\treturn newValues;\n\t},\n\tsetValues( { registry, context, bindings } ) {\n\t\tconst newMeta = {};\n\t\tObject.values( bindings ).forEach( ( { args, newValue } ) => {\n\t\t\tnewMeta[ args.key ] = newValue;\n\t\t} );\n\t\tregistry\n\t\t\t.dispatch( coreDataStore )\n\t\t\t.editEntityRecord( 'postType', context?.postType, context?.postId, {\n\t\t\t\tmeta: newMeta,\n\t\t\t} );\n\t},\n\tcanUserEditValue( { select, context, args } ) {\n\t\t// Lock editing in query loop.\n\t\tif ( context?.query || context?.queryId ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst postType =\n\t\t\tcontext?.postType || select( editorStore ).getCurrentPostType();\n\n\t\t// Check that editing is happening in the post editor and not a template.\n\t\tif ( postType === 'wp_template' ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check that the custom field is not protected and available in the REST API.\n\t\t// Empty string or `false` could be a valid value, so we need to check if the field value is undefined.\n\t\tconst fieldValue = select( coreDataStore ).getEntityRecord(\n\t\t\t'postType',\n\t\t\tpostType,\n\t\t\tcontext?.postId\n\t\t)?.meta?.[ args.key ];\n\n\t\tif ( fieldValue === undefined ) {\n\t\t\treturn false;\n\t\t}\n\t\t// Check that custom fields metabox is not enabled.\n\t\tconst areCustomFieldsEnabled =\n\t\t\tselect( editorStore ).getEditorSettings().enableCustomFields;\n\t\tif ( areCustomFieldsEnabled ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check that the user has the capability to edit post meta.\n\t\tconst canUserEdit = select( coreDataStore ).canUser( 'update', {\n\t\t\tkind: 'postType',\n\t\t\tname: context?.postType,\n\t\t\tid: context?.postId,\n\t\t} );\n\t\tif ( ! canUserEdit ) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t},\n\tgetFieldsList( { registry, context } ) {\n\t\tconst { getRegisteredPostMeta } = unlock(\n\t\t\tregistry.select( coreDataStore )\n\t\t);\n\t\tconst registeredFields = getRegisteredPostMeta( context?.postType );\n\t\tconst metaFields = getMetadata( registry, context, registeredFields );\n\n\t\tif ( ! metaFields || ! Object.keys( metaFields ).length ) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn Object.fromEntries(\n\t\t\tObject.entries( metaFields )\n\t\t\t\t// Remove footnotes or private keys from the list of fields.\n\t\t\t\t.filter(\n\t\t\t\t\t( [ key ] ) =>\n\t\t\t\t\t\tkey !== 'footnotes' && key.charAt( 0 ) !== '_'\n\t\t\t\t)\n\t\t\t\t// Return object with label and value.\n\t\t\t\t.map( ( [ key, value ] ) => [\n\t\t\t\t\tkey,\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: registeredFields?.[ key ]?.title || key,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t},\n\t\t\t\t] )\n\t\t);\n\t},\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["store","coreDataStore","editorStore","unlock","getPostMetaFields","registry","context","getEditedEntityRecord","select","getRegisteredPostMeta","entityMetaValues","postType","postId","meta","registeredFields","metaFields","Object","entries","forEach","key","props","charAt","_entityMetaValues$key","label","title","value","default","undefined","keys","length","name","getValues","bindings","newValues","attributeName","source","_ref","fieldKey","args","fieldValue","fieldLabel","setValues","newMeta","values","newValue","dispatch","editEntityRecord","canUserEditValue","query","queryId","getCurrentPostType","areCustomFieldsEnabled","getEditorSettings","enableCustomFields","canUserEdit","canUser","kind","id","getFieldsList"],"sources":["@wordpress/editor/src/bindings/post-meta.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { store as coreDataStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { store as editorStore } from '../store';\nimport { unlock } from '../lock-unlock';\n\n/**\n * Gets a list of post meta fields with their values and labels\n * to be consumed in the needed callbacks.\n * If the value is not available based on context, like in templates,\n * it falls back to the default value, label, or key.\n *\n * @param {Object} registry The registry context exposed through `useRegistry`.\n * @param {Object} context The context provided.\n * @return {Object} List of post meta fields with their value and label.\n *\n * @example\n * ```js\n * {\n * field_1_key: {\n * label: 'Field 1 Label',\n * value: 'Field 1 Value',\n * },\n * field_2_key: {\n * label: 'Field 2 Label',\n * value: 'Field 2 Value',\n * },\n * ...\n * }\n * ```\n */\nfunction getPostMetaFields( registry, context ) {\n\tconst { getEditedEntityRecord } = registry.select( coreDataStore );\n\tconst { getRegisteredPostMeta } = unlock(\n\t\tregistry.select( coreDataStore )\n\t);\n\n\tlet entityMetaValues;\n\t// Try to get the current entity meta values.\n\tif ( context?.postType && context?.postId ) {\n\t\tentityMetaValues = getEditedEntityRecord(\n\t\t\t'postType',\n\t\t\tcontext?.postType,\n\t\t\tcontext?.postId\n\t\t).meta;\n\t}\n\n\tconst registeredFields = getRegisteredPostMeta( context?.postType );\n\tconst metaFields = {};\n\tObject.entries( registeredFields || {} ).forEach( ( [ key, props ] ) => {\n\t\t// Don't include footnotes or private fields.\n\t\tif ( key !== 'footnotes' && key.charAt( 0 ) !== '_' ) {\n\t\t\tmetaFields[ key ] = {\n\t\t\t\tlabel: props.title || key,\n\t\t\t\tvalue:\n\t\t\t\t\t// When using the entity value, an empty string IS a valid value.\n\t\t\t\t\tentityMetaValues?.[ key ] ??\n\t\t\t\t\t// When using the default, an empty string IS NOT a valid value.\n\t\t\t\t\t( props.default || undefined ),\n\t\t\t};\n\t\t}\n\t} );\n\n\tif ( ! Object.keys( metaFields || {} ).length ) {\n\t\treturn null;\n\t}\n\n\treturn metaFields;\n}\n\nexport default {\n\tname: 'core/post-meta',\n\tgetValues( { registry, context, bindings } ) {\n\t\tconst metaFields = getPostMetaFields( registry, context );\n\n\t\tconst newValues = {};\n\t\tfor ( const [ attributeName, source ] of Object.entries( bindings ) ) {\n\t\t\t// Use the value, the field label, or the field key.\n\t\t\tconst fieldKey = source.args.key;\n\t\t\tconst { value: fieldValue, label: fieldLabel } =\n\t\t\t\tmetaFields?.[ fieldKey ] || {};\n\t\t\tnewValues[ attributeName ] = fieldValue ?? fieldLabel ?? fieldKey;\n\t\t}\n\t\treturn newValues;\n\t},\n\tsetValues( { registry, context, bindings } ) {\n\t\tconst newMeta = {};\n\t\tObject.values( bindings ).forEach( ( { args, newValue } ) => {\n\t\t\tnewMeta[ args.key ] = newValue;\n\t\t} );\n\t\tregistry\n\t\t\t.dispatch( coreDataStore )\n\t\t\t.editEntityRecord( 'postType', context?.postType, context?.postId, {\n\t\t\t\tmeta: newMeta,\n\t\t\t} );\n\t},\n\tcanUserEditValue( { registry, context, args } ) {\n\t\t// Lock editing in query loop.\n\t\tif ( context?.query || context?.queryId ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst postType =\n\t\t\tcontext?.postType ||\n\t\t\tregistry.select( editorStore ).getCurrentPostType();\n\n\t\t// Check that editing is happening in the post editor and not a template.\n\t\tif ( postType === 'wp_template' ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst fieldValue = getPostMetaFields( registry, context )?.[ args.key ]\n\t\t\t?.value;\n\t\t// Empty string or `false` could be a valid value, so we need to check if the field value is undefined.\n\t\tif ( fieldValue === undefined ) {\n\t\t\treturn false;\n\t\t}\n\t\t// Check that custom fields metabox is not enabled.\n\t\tconst areCustomFieldsEnabled = registry\n\t\t\t.select( editorStore )\n\t\t\t.getEditorSettings().enableCustomFields;\n\t\tif ( areCustomFieldsEnabled ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check that the user has the capability to edit post meta.\n\t\tconst canUserEdit = registry\n\t\t\t.select( coreDataStore )\n\t\t\t.canUser( 'update', {\n\t\t\t\tkind: 'postType',\n\t\t\t\tname: context?.postType,\n\t\t\t\tid: context?.postId,\n\t\t\t} );\n\t\tif ( ! canUserEdit ) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t},\n\tgetFieldsList( { registry, context } ) {\n\t\treturn getPostMetaFields( registry, context );\n\t},\n};\n"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,KAAK,IAAIC,aAAa,QAAQ,sBAAsB;;AAE7D;AACA;AACA;AACA,SAASD,KAAK,IAAIE,WAAW,QAAQ,UAAU;AAC/C,SAASC,MAAM,QAAQ,gBAAgB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,iBAAiBA,CAAEC,QAAQ,EAAEC,OAAO,EAAG;EAC/C,MAAM;IAAEC;EAAsB,CAAC,GAAGF,QAAQ,CAACG,MAAM,CAAEP,aAAc,CAAC;EAClE,MAAM;IAAEQ;EAAsB,CAAC,GAAGN,MAAM,CACvCE,QAAQ,CAACG,MAAM,CAAEP,aAAc,CAChC,CAAC;EAED,IAAIS,gBAAgB;EACpB;EACA,IAAKJ,OAAO,EAAEK,QAAQ,IAAIL,OAAO,EAAEM,MAAM,EAAG;IAC3CF,gBAAgB,GAAGH,qBAAqB,CACvC,UAAU,EACVD,OAAO,EAAEK,QAAQ,EACjBL,OAAO,EAAEM,MACV,CAAC,CAACC,IAAI;EACP;EAEA,MAAMC,gBAAgB,GAAGL,qBAAqB,CAAEH,OAAO,EAAEK,QAAS,CAAC;EACnE,MAAMI,UAAU,GAAG,CAAC,CAAC;EACrBC,MAAM,CAACC,OAAO,CAAEH,gBAAgB,IAAI,CAAC,CAAE,CAAC,CAACI,OAAO,CAAE,CAAE,CAAEC,GAAG,EAAEC,KAAK,CAAE,KAAM;IACvE;IACA,IAAKD,GAAG,KAAK,WAAW,IAAIA,GAAG,CAACE,MAAM,CAAE,CAAE,CAAC,KAAK,GAAG,EAAG;MAAA,IAAAC,qBAAA;MACrDP,UAAU,CAAEI,GAAG,CAAE,GAAG;QACnBI,KAAK,EAAEH,KAAK,CAACI,KAAK,IAAIL,GAAG;QACzBM,KAAK,EACJ;QAAA,CAAAH,qBAAA,GACAZ,gBAAgB,GAAIS,GAAG,CAAE,cAAAG,qBAAA,cAAAA,qBAAA;QACzB;QACEF,KAAK,CAACM,OAAO,IAAIC;MACrB,CAAC;IACF;EACD,CAAE,CAAC;EAEH,IAAK,CAAEX,MAAM,CAACY,IAAI,CAAEb,UAAU,IAAI,CAAC,CAAE,CAAC,CAACc,MAAM,EAAG;IAC/C,OAAO,IAAI;EACZ;EAEA,OAAOd,UAAU;AAClB;AAEA,eAAe;EACde,IAAI,EAAE,gBAAgB;EACtBC,SAASA,CAAE;IAAE1B,QAAQ;IAAEC,OAAO;IAAE0B;EAAS,CAAC,EAAG;IAC5C,MAAMjB,UAAU,GAAGX,iBAAiB,CAAEC,QAAQ,EAAEC,OAAQ,CAAC;IAEzD,MAAM2B,SAAS,GAAG,CAAC,CAAC;IACpB,KAAM,MAAM,CAAEC,aAAa,EAAEC,MAAM,CAAE,IAAInB,MAAM,CAACC,OAAO,CAAEe,QAAS,CAAC,EAAG;MAAA,IAAAI,IAAA;MACrE;MACA,MAAMC,QAAQ,GAAGF,MAAM,CAACG,IAAI,CAACnB,GAAG;MAChC,MAAM;QAAEM,KAAK,EAAEc,UAAU;QAAEhB,KAAK,EAAEiB;MAAW,CAAC,GAC7CzB,UAAU,GAAIsB,QAAQ,CAAE,IAAI,CAAC,CAAC;MAC/BJ,SAAS,CAAEC,aAAa,CAAE,IAAAE,IAAA,GAAGG,UAAU,aAAVA,UAAU,cAAVA,UAAU,GAAIC,UAAU,cAAAJ,IAAA,cAAAA,IAAA,GAAIC,QAAQ;IAClE;IACA,OAAOJ,SAAS;EACjB,CAAC;EACDQ,SAASA,CAAE;IAAEpC,QAAQ;IAAEC,OAAO;IAAE0B;EAAS,CAAC,EAAG;IAC5C,MAAMU,OAAO,GAAG,CAAC,CAAC;IAClB1B,MAAM,CAAC2B,MAAM,CAAEX,QAAS,CAAC,CAACd,OAAO,CAAE,CAAE;MAAEoB,IAAI;MAAEM;IAAS,CAAC,KAAM;MAC5DF,OAAO,CAAEJ,IAAI,CAACnB,GAAG,CAAE,GAAGyB,QAAQ;IAC/B,CAAE,CAAC;IACHvC,QAAQ,CACNwC,QAAQ,CAAE5C,aAAc,CAAC,CACzB6C,gBAAgB,CAAE,UAAU,EAAExC,OAAO,EAAEK,QAAQ,EAAEL,OAAO,EAAEM,MAAM,EAAE;MAClEC,IAAI,EAAE6B;IACP,CAAE,CAAC;EACL,CAAC;EACDK,gBAAgBA,CAAE;IAAE1C,QAAQ;IAAEC,OAAO;IAAEgC;EAAK,CAAC,EAAG;IAC/C;IACA,IAAKhC,OAAO,EAAE0C,KAAK,IAAI1C,OAAO,EAAE2C,OAAO,EAAG;MACzC,OAAO,KAAK;IACb;IAEA,MAAMtC,QAAQ,GACbL,OAAO,EAAEK,QAAQ,IACjBN,QAAQ,CAACG,MAAM,CAAEN,WAAY,CAAC,CAACgD,kBAAkB,CAAC,CAAC;;IAEpD;IACA,IAAKvC,QAAQ,KAAK,aAAa,EAAG;MACjC,OAAO,KAAK;IACb;IAEA,MAAM4B,UAAU,GAAGnC,iBAAiB,CAAEC,QAAQ,EAAEC,OAAQ,CAAC,GAAIgC,IAAI,CAACnB,GAAG,CAAE,EACpEM,KAAK;IACR;IACA,IAAKc,UAAU,KAAKZ,SAAS,EAAG;MAC/B,OAAO,KAAK;IACb;IACA;IACA,MAAMwB,sBAAsB,GAAG9C,QAAQ,CACrCG,MAAM,CAAEN,WAAY,CAAC,CACrBkD,iBAAiB,CAAC,CAAC,CAACC,kBAAkB;IACxC,IAAKF,sBAAsB,EAAG;MAC7B,OAAO,KAAK;IACb;;IAEA;IACA,MAAMG,WAAW,GAAGjD,QAAQ,CAC1BG,MAAM,CAAEP,aAAc,CAAC,CACvBsD,OAAO,CAAE,QAAQ,EAAE;MACnBC,IAAI,EAAE,UAAU;MAChB1B,IAAI,EAAExB,OAAO,EAAEK,QAAQ;MACvB8C,EAAE,EAAEnD,OAAO,EAAEM;IACd,CAAE,CAAC;IACJ,IAAK,CAAE0C,WAAW,EAAG;MACpB,OAAO,KAAK;IACb;IAEA,OAAO,IAAI;EACZ,CAAC;EACDI,aAAaA,CAAE;IAAErD,QAAQ;IAAEC;EAAQ,CAAC,EAAG;IACtC,OAAOF,iBAAiB,CAAEC,QAAQ,EAAEC,OAAQ,CAAC;EAC9C;AACD,CAAC","ignoreList":[]}
@@ -114,10 +114,18 @@ export function EntitiesSavedStatesExtensible({
114
114
  className: "entities-saved-states__panel-header",
115
115
  gap: 2,
116
116
  children: [/*#__PURE__*/_jsx(FlexItem, {
117
+ isBlock: true,
118
+ as: Button,
119
+ variant: "secondary",
120
+ size: "compact",
121
+ onClick: dismissPanel,
122
+ children: __('Cancel')
123
+ }), /*#__PURE__*/_jsx(FlexItem, {
117
124
  isBlock: true,
118
125
  as: Button,
119
126
  ref: saveButtonRef,
120
127
  variant: "primary",
128
+ size: "compact",
121
129
  disabled: !saveEnabled,
122
130
  accessibleWhenDisabled: true,
123
131
  onClick: () => saveDirtyEntities({
@@ -128,12 +136,6 @@ export function EntitiesSavedStatesExtensible({
128
136
  }),
129
137
  className: "editor-entities-saved-states__save-button",
130
138
  children: saveLabel
131
- }), /*#__PURE__*/_jsx(FlexItem, {
132
- isBlock: true,
133
- as: Button,
134
- variant: "secondary",
135
- onClick: dismissPanel,
136
- children: __('Cancel')
137
139
  })]
138
140
  }), /*#__PURE__*/_jsxs("div", {
139
141
  className: "entities-saved-states__text-prompt",
@@ -1 +1 @@
1
- {"version":3,"names":["Button","Flex","FlexItem","__","_n","sprintf","useCallback","useRef","createInterpolateElement","__experimentalUseDialog","useDialog","useInstanceId","useDispatch","EntityTypeList","useIsDirty","store","editorStore","unlock","jsx","_jsx","jsxs","_jsxs","identity","values","EntitiesSavedStates","close","renderDialog","undefined","isDirtyProps","EntitiesSavedStatesExtensible","additionalPrompt","onSave","saveEnabled","saveEnabledProp","saveLabel","dirtyEntityRecords","isDirty","setUnselectedEntities","unselectedEntities","saveButtonRef","saveDirtyEntities","partitionedSavables","reduce","acc","record","name","push","site","siteSavables","wp_template","templateSavables","wp_template_part","templatePartSavables","contentSavables","sortedPartitionedSavables","Object","filter","Array","isArray","dismissPanel","saveDialogRef","saveDialogProps","onClose","dialogLabel","dialogDescription","ref","className","role","children","gap","isBlock","as","variant","disabled","accessibleWhenDisabled","onClick","entitiesToSkip","id","length","strong","map","list"],"sources":["@wordpress/editor/src/components/entities-saved-states/index.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { Button, Flex, FlexItem } from '@wordpress/components';\nimport { __, _n, sprintf } from '@wordpress/i18n';\nimport {\n\tuseCallback,\n\tuseRef,\n\tcreateInterpolateElement,\n} from '@wordpress/element';\nimport {\n\t__experimentalUseDialog as useDialog,\n\tuseInstanceId,\n} from '@wordpress/compose';\nimport { useDispatch } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport EntityTypeList from './entity-type-list';\nimport { useIsDirty } from './hooks/use-is-dirty';\nimport { store as editorStore } from '../../store';\nimport { unlock } from '../../lock-unlock';\n\nfunction identity( values ) {\n\treturn values;\n}\n\n/**\n * Renders the component for managing saved states of entities.\n *\n * @param {Object} props The component props.\n * @param {Function} props.close The function to close the dialog.\n * @param {Function} props.renderDialog The function to render the dialog.\n *\n * @return {JSX.Element} The rendered component.\n */\nexport default function EntitiesSavedStates( {\n\tclose,\n\trenderDialog = undefined,\n} ) {\n\tconst isDirtyProps = useIsDirty();\n\treturn (\n\t\t<EntitiesSavedStatesExtensible\n\t\t\tclose={ close }\n\t\t\trenderDialog={ renderDialog }\n\t\t\t{ ...isDirtyProps }\n\t\t/>\n\t);\n}\n\n/**\n * Renders a panel for saving entities with dirty records.\n *\n * @param {Object} props The component props.\n * @param {string} props.additionalPrompt Additional prompt to display.\n * @param {Function} props.close Function to close the panel.\n * @param {Function} props.onSave Function to call when saving entities.\n * @param {boolean} props.saveEnabled Flag indicating if save is enabled.\n * @param {string} props.saveLabel Label for the save button.\n * @param {Function} props.renderDialog Function to render a custom dialog.\n * @param {Array} props.dirtyEntityRecords Array of dirty entity records.\n * @param {boolean} props.isDirty Flag indicating if there are dirty entities.\n * @param {Function} props.setUnselectedEntities Function to set unselected entities.\n * @param {Array} props.unselectedEntities Array of unselected entities.\n *\n * @return {JSX.Element} The rendered component.\n */\nexport function EntitiesSavedStatesExtensible( {\n\tadditionalPrompt = undefined,\n\tclose,\n\tonSave = identity,\n\tsaveEnabled: saveEnabledProp = undefined,\n\tsaveLabel = __( 'Save' ),\n\trenderDialog = undefined,\n\tdirtyEntityRecords,\n\tisDirty,\n\tsetUnselectedEntities,\n\tunselectedEntities,\n} ) {\n\tconst saveButtonRef = useRef();\n\tconst { saveDirtyEntities } = unlock( useDispatch( editorStore ) );\n\t// To group entities by type.\n\tconst partitionedSavables = dirtyEntityRecords.reduce( ( acc, record ) => {\n\t\tconst { name } = record;\n\t\tif ( ! acc[ name ] ) {\n\t\t\tacc[ name ] = [];\n\t\t}\n\t\tacc[ name ].push( record );\n\t\treturn acc;\n\t}, {} );\n\n\t// Sort entity groups.\n\tconst {\n\t\tsite: siteSavables,\n\t\twp_template: templateSavables,\n\t\twp_template_part: templatePartSavables,\n\t\t...contentSavables\n\t} = partitionedSavables;\n\tconst sortedPartitionedSavables = [\n\t\tsiteSavables,\n\t\ttemplateSavables,\n\t\ttemplatePartSavables,\n\t\t...Object.values( contentSavables ),\n\t].filter( Array.isArray );\n\n\tconst saveEnabled = saveEnabledProp ?? isDirty;\n\t// Explicitly define this with no argument passed. Using `close` on\n\t// its own will use the event object in place of the expected saved entities.\n\tconst dismissPanel = useCallback( () => close(), [ close ] );\n\n\tconst [ saveDialogRef, saveDialogProps ] = useDialog( {\n\t\tonClose: () => dismissPanel(),\n\t} );\n\tconst dialogLabel = useInstanceId( EntitiesSavedStatesExtensible, 'label' );\n\tconst dialogDescription = useInstanceId(\n\t\tEntitiesSavedStatesExtensible,\n\t\t'description'\n\t);\n\n\treturn (\n\t\t<div\n\t\t\tref={ saveDialogRef }\n\t\t\t{ ...saveDialogProps }\n\t\t\tclassName=\"entities-saved-states__panel\"\n\t\t\trole={ renderDialog ? 'dialog' : undefined }\n\t\t\taria-labelledby={ renderDialog ? dialogLabel : undefined }\n\t\t\taria-describedby={ renderDialog ? dialogDescription : undefined }\n\t\t>\n\t\t\t<Flex className=\"entities-saved-states__panel-header\" gap={ 2 }>\n\t\t\t\t<FlexItem\n\t\t\t\t\tisBlock\n\t\t\t\t\tas={ Button }\n\t\t\t\t\tref={ saveButtonRef }\n\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\tdisabled={ ! saveEnabled }\n\t\t\t\t\taccessibleWhenDisabled\n\t\t\t\t\tonClick={ () =>\n\t\t\t\t\t\tsaveDirtyEntities( {\n\t\t\t\t\t\t\tonSave,\n\t\t\t\t\t\t\tdirtyEntityRecords,\n\t\t\t\t\t\t\tentitiesToSkip: unselectedEntities,\n\t\t\t\t\t\t\tclose,\n\t\t\t\t\t\t} )\n\t\t\t\t\t}\n\t\t\t\t\tclassName=\"editor-entities-saved-states__save-button\"\n\t\t\t\t>\n\t\t\t\t\t{ saveLabel }\n\t\t\t\t</FlexItem>\n\t\t\t\t<FlexItem\n\t\t\t\t\tisBlock\n\t\t\t\t\tas={ Button }\n\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\tonClick={ dismissPanel }\n\t\t\t\t>\n\t\t\t\t\t{ __( 'Cancel' ) }\n\t\t\t\t</FlexItem>\n\t\t\t</Flex>\n\n\t\t\t<div className=\"entities-saved-states__text-prompt\">\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"entities-saved-states__text-prompt--header-wrapper\"\n\t\t\t\t\tid={ renderDialog ? dialogLabel : undefined }\n\t\t\t\t>\n\t\t\t\t\t<strong className=\"entities-saved-states__text-prompt--header\">\n\t\t\t\t\t\t{ __( 'Are you ready to save?' ) }\n\t\t\t\t\t</strong>\n\t\t\t\t\t{ additionalPrompt }\n\t\t\t\t</div>\n\t\t\t\t<p id={ renderDialog ? dialogDescription : undefined }>\n\t\t\t\t\t{ isDirty\n\t\t\t\t\t\t? createInterpolateElement(\n\t\t\t\t\t\t\t\tsprintf(\n\t\t\t\t\t\t\t\t\t/* translators: %d: number of site changes waiting to be saved. */\n\t\t\t\t\t\t\t\t\t_n(\n\t\t\t\t\t\t\t\t\t\t'There is <strong>%d site change</strong> waiting to be saved.',\n\t\t\t\t\t\t\t\t\t\t'There are <strong>%d site changes</strong> waiting to be saved.',\n\t\t\t\t\t\t\t\t\t\tsortedPartitionedSavables.length\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tsortedPartitionedSavables.length\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t{ strong: <strong /> }\n\t\t\t\t\t\t )\n\t\t\t\t\t\t: __( 'Select the items you want to save.' ) }\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t{ sortedPartitionedSavables.map( ( list ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<EntityTypeList\n\t\t\t\t\t\tkey={ list[ 0 ].name }\n\t\t\t\t\t\tlist={ list }\n\t\t\t\t\t\tunselectedEntities={ unselectedEntities }\n\t\t\t\t\t\tsetUnselectedEntities={ setUnselectedEntities }\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t</div>\n\t);\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Button","Flex","FlexItem","__","_n","sprintf","useCallback","useRef","createInterpolateElement","__experimentalUseDialog","useDialog","useInstanceId","useDispatch","EntityTypeList","useIsDirty","store","editorStore","unlock","jsx","_jsx","jsxs","_jsxs","identity","values","EntitiesSavedStates","close","renderDialog","undefined","isDirtyProps","EntitiesSavedStatesExtensible","additionalPrompt","onSave","saveEnabled","saveEnabledProp","saveLabel","dirtyEntityRecords","isDirty","setUnselectedEntities","unselectedEntities","saveButtonRef","saveDirtyEntities","partitionedSavables","reduce","acc","record","name","push","site","siteSavables","wp_template","templateSavables","wp_template_part","templatePartSavables","contentSavables","sortedPartitionedSavables","Object","filter","Array","isArray","dismissPanel","saveDialogRef","saveDialogProps","onClose","dialogLabel","dialogDescription","ref","className","role","children","gap","isBlock","as","variant","size","onClick","disabled","accessibleWhenDisabled","entitiesToSkip","id","length","strong","map","list"],"sources":["@wordpress/editor/src/components/entities-saved-states/index.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { Button, Flex, FlexItem } from '@wordpress/components';\nimport { __, _n, sprintf } from '@wordpress/i18n';\nimport {\n\tuseCallback,\n\tuseRef,\n\tcreateInterpolateElement,\n} from '@wordpress/element';\nimport {\n\t__experimentalUseDialog as useDialog,\n\tuseInstanceId,\n} from '@wordpress/compose';\nimport { useDispatch } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport EntityTypeList from './entity-type-list';\nimport { useIsDirty } from './hooks/use-is-dirty';\nimport { store as editorStore } from '../../store';\nimport { unlock } from '../../lock-unlock';\n\nfunction identity( values ) {\n\treturn values;\n}\n\n/**\n * Renders the component for managing saved states of entities.\n *\n * @param {Object} props The component props.\n * @param {Function} props.close The function to close the dialog.\n * @param {Function} props.renderDialog The function to render the dialog.\n *\n * @return {JSX.Element} The rendered component.\n */\nexport default function EntitiesSavedStates( {\n\tclose,\n\trenderDialog = undefined,\n} ) {\n\tconst isDirtyProps = useIsDirty();\n\treturn (\n\t\t<EntitiesSavedStatesExtensible\n\t\t\tclose={ close }\n\t\t\trenderDialog={ renderDialog }\n\t\t\t{ ...isDirtyProps }\n\t\t/>\n\t);\n}\n\n/**\n * Renders a panel for saving entities with dirty records.\n *\n * @param {Object} props The component props.\n * @param {string} props.additionalPrompt Additional prompt to display.\n * @param {Function} props.close Function to close the panel.\n * @param {Function} props.onSave Function to call when saving entities.\n * @param {boolean} props.saveEnabled Flag indicating if save is enabled.\n * @param {string} props.saveLabel Label for the save button.\n * @param {Function} props.renderDialog Function to render a custom dialog.\n * @param {Array} props.dirtyEntityRecords Array of dirty entity records.\n * @param {boolean} props.isDirty Flag indicating if there are dirty entities.\n * @param {Function} props.setUnselectedEntities Function to set unselected entities.\n * @param {Array} props.unselectedEntities Array of unselected entities.\n *\n * @return {JSX.Element} The rendered component.\n */\nexport function EntitiesSavedStatesExtensible( {\n\tadditionalPrompt = undefined,\n\tclose,\n\tonSave = identity,\n\tsaveEnabled: saveEnabledProp = undefined,\n\tsaveLabel = __( 'Save' ),\n\trenderDialog = undefined,\n\tdirtyEntityRecords,\n\tisDirty,\n\tsetUnselectedEntities,\n\tunselectedEntities,\n} ) {\n\tconst saveButtonRef = useRef();\n\tconst { saveDirtyEntities } = unlock( useDispatch( editorStore ) );\n\t// To group entities by type.\n\tconst partitionedSavables = dirtyEntityRecords.reduce( ( acc, record ) => {\n\t\tconst { name } = record;\n\t\tif ( ! acc[ name ] ) {\n\t\t\tacc[ name ] = [];\n\t\t}\n\t\tacc[ name ].push( record );\n\t\treturn acc;\n\t}, {} );\n\n\t// Sort entity groups.\n\tconst {\n\t\tsite: siteSavables,\n\t\twp_template: templateSavables,\n\t\twp_template_part: templatePartSavables,\n\t\t...contentSavables\n\t} = partitionedSavables;\n\tconst sortedPartitionedSavables = [\n\t\tsiteSavables,\n\t\ttemplateSavables,\n\t\ttemplatePartSavables,\n\t\t...Object.values( contentSavables ),\n\t].filter( Array.isArray );\n\n\tconst saveEnabled = saveEnabledProp ?? isDirty;\n\t// Explicitly define this with no argument passed. Using `close` on\n\t// its own will use the event object in place of the expected saved entities.\n\tconst dismissPanel = useCallback( () => close(), [ close ] );\n\n\tconst [ saveDialogRef, saveDialogProps ] = useDialog( {\n\t\tonClose: () => dismissPanel(),\n\t} );\n\tconst dialogLabel = useInstanceId( EntitiesSavedStatesExtensible, 'label' );\n\tconst dialogDescription = useInstanceId(\n\t\tEntitiesSavedStatesExtensible,\n\t\t'description'\n\t);\n\n\treturn (\n\t\t<div\n\t\t\tref={ saveDialogRef }\n\t\t\t{ ...saveDialogProps }\n\t\t\tclassName=\"entities-saved-states__panel\"\n\t\t\trole={ renderDialog ? 'dialog' : undefined }\n\t\t\taria-labelledby={ renderDialog ? dialogLabel : undefined }\n\t\t\taria-describedby={ renderDialog ? dialogDescription : undefined }\n\t\t>\n\t\t\t<Flex className=\"entities-saved-states__panel-header\" gap={ 2 }>\n\t\t\t\t<FlexItem\n\t\t\t\t\tisBlock\n\t\t\t\t\tas={ Button }\n\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\tsize=\"compact\"\n\t\t\t\t\tonClick={ dismissPanel }\n\t\t\t\t>\n\t\t\t\t\t{ __( 'Cancel' ) }\n\t\t\t\t</FlexItem>\n\t\t\t\t<FlexItem\n\t\t\t\t\tisBlock\n\t\t\t\t\tas={ Button }\n\t\t\t\t\tref={ saveButtonRef }\n\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\tsize=\"compact\"\n\t\t\t\t\tdisabled={ ! saveEnabled }\n\t\t\t\t\taccessibleWhenDisabled\n\t\t\t\t\tonClick={ () =>\n\t\t\t\t\t\tsaveDirtyEntities( {\n\t\t\t\t\t\t\tonSave,\n\t\t\t\t\t\t\tdirtyEntityRecords,\n\t\t\t\t\t\t\tentitiesToSkip: unselectedEntities,\n\t\t\t\t\t\t\tclose,\n\t\t\t\t\t\t} )\n\t\t\t\t\t}\n\t\t\t\t\tclassName=\"editor-entities-saved-states__save-button\"\n\t\t\t\t>\n\t\t\t\t\t{ saveLabel }\n\t\t\t\t</FlexItem>\n\t\t\t</Flex>\n\n\t\t\t<div className=\"entities-saved-states__text-prompt\">\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"entities-saved-states__text-prompt--header-wrapper\"\n\t\t\t\t\tid={ renderDialog ? dialogLabel : undefined }\n\t\t\t\t>\n\t\t\t\t\t<strong className=\"entities-saved-states__text-prompt--header\">\n\t\t\t\t\t\t{ __( 'Are you ready to save?' ) }\n\t\t\t\t\t</strong>\n\t\t\t\t\t{ additionalPrompt }\n\t\t\t\t</div>\n\t\t\t\t<p id={ renderDialog ? dialogDescription : undefined }>\n\t\t\t\t\t{ isDirty\n\t\t\t\t\t\t? createInterpolateElement(\n\t\t\t\t\t\t\t\tsprintf(\n\t\t\t\t\t\t\t\t\t/* translators: %d: number of site changes waiting to be saved. */\n\t\t\t\t\t\t\t\t\t_n(\n\t\t\t\t\t\t\t\t\t\t'There is <strong>%d site change</strong> waiting to be saved.',\n\t\t\t\t\t\t\t\t\t\t'There are <strong>%d site changes</strong> waiting to be saved.',\n\t\t\t\t\t\t\t\t\t\tsortedPartitionedSavables.length\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tsortedPartitionedSavables.length\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t{ strong: <strong /> }\n\t\t\t\t\t\t )\n\t\t\t\t\t\t: __( 'Select the items you want to save.' ) }\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t{ sortedPartitionedSavables.map( ( list ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<EntityTypeList\n\t\t\t\t\t\tkey={ list[ 0 ].name }\n\t\t\t\t\t\tlist={ list }\n\t\t\t\t\t\tunselectedEntities={ unselectedEntities }\n\t\t\t\t\t\tsetUnselectedEntities={ setUnselectedEntities }\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t</div>\n\t);\n}\n"],"mappings":"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","ignoreList":[]}
@@ -112,8 +112,8 @@ function Image({
112
112
  scale: 0
113
113
  },
114
114
  style: {
115
- width: '36px',
116
- height: '36px',
115
+ width: '32px',
116
+ height: '32px',
117
117
  objectFit: 'cover',
118
118
  borderRadius: '2px',
119
119
  cursor: 'pointer'
@@ -241,7 +241,7 @@ export default function MaybeUploadMediaPanel() {
241
241
  }, block.clientId);
242
242
  })
243
243
  }), isUploading || isAnimating ? /*#__PURE__*/_jsx(Spinner, {}) : /*#__PURE__*/_jsx(Button, {
244
- __next40pxDefaultSize: true,
244
+ size: "compact",
245
245
  variant: "primary",
246
246
  onClick: uploadImages,
247
247
  children: __('Upload')
@@ -1 +1 @@
1
- {"version":3,"names":["PanelBody","Button","Spinner","__unstableMotion","motion","__unstableAnimatePresence","AnimatePresence","useSelect","useDispatch","__","store","blockEditorStore","useState","isBlobURL","fetchMedia","jsx","_jsx","jsxs","_jsxs","flattenBlocks","blocks","result","forEach","block","push","innerBlocks","hasExternalMedia","name","attributes","url","id","mediaUrl","mediaId","undefined","getMediaInfo","alt","mediaAlt","Image","clientId","selectBlock","img","tabIndex","role","onClick","onKeyDown","event","key","preventDefault","src","animate","opacity","exit","scale","style","width","height","objectFit","borderRadius","cursor","whileHover","MaybeUploadMediaPanel","isUploading","setIsUploading","isAnimating","setIsAnimating","hadUploadError","setHadUploadError","editorBlocks","mediaUpload","select","getBlocks","getSettings","blocksWithExternalMedia","filter","updateBlockAttributes","length","panelBodyTitle","className","children","updateBlockWithUploadedMedia","media","uploadImages","mediaUrls","Set","map","uploadPromises","Object","fromEntries","entries","filePromise","uploadPromise","then","blob","Promise","resolve","reject","filesList","onFileChange","onError","allSettled","catch","finally","initialOpen","title","display","flexWrap","gap","onExitComplete","__next40pxDefaultSize","variant"],"sources":["@wordpress/editor/src/components/post-publish-panel/maybe-upload-media.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\tPanelBody,\n\tButton,\n\tSpinner,\n\t__unstableMotion as motion,\n\t__unstableAnimatePresence as AnimatePresence,\n} from '@wordpress/components';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { __ } from '@wordpress/i18n';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport { useState } from '@wordpress/element';\nimport { isBlobURL } from '@wordpress/blob';\n\n/**\n * Internal dependencies\n */\nimport { fetchMedia } from './media-util';\n\nfunction flattenBlocks( blocks ) {\n\tconst result = [];\n\n\tblocks.forEach( ( block ) => {\n\t\tresult.push( block );\n\t\tresult.push( ...flattenBlocks( block.innerBlocks ) );\n\t} );\n\n\treturn result;\n}\n\n/**\n * Determine whether a block has external media.\n *\n * Different blocks use different attribute names (and potentially\n * different logic as well) in determining whether the media is\n * present, and whether it's external.\n *\n * @param {{name: string, attributes: Object}} block The block.\n * @return {boolean?} Whether the block has external media\n */\nfunction hasExternalMedia( block ) {\n\tif ( block.name === 'core/image' || block.name === 'core/cover' ) {\n\t\treturn block.attributes.url && ! block.attributes.id;\n\t}\n\n\tif ( block.name === 'core/media-text' ) {\n\t\treturn block.attributes.mediaUrl && ! block.attributes.mediaId;\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Retrieve media info from a block.\n *\n * Different blocks use different attribute names, so we need this\n * function to normalize things into a consistent naming scheme.\n *\n * @param {{name: string, attributes: Object}} block The block.\n * @return {{url: ?string, alt: ?string, id: ?number}} The media info for the block.\n */\nfunction getMediaInfo( block ) {\n\tif ( block.name === 'core/image' || block.name === 'core/cover' ) {\n\t\tconst { url, alt, id } = block.attributes;\n\t\treturn { url, alt, id };\n\t}\n\n\tif ( block.name === 'core/media-text' ) {\n\t\tconst { mediaUrl: url, mediaAlt: alt, mediaId: id } = block.attributes;\n\t\treturn { url, alt, id };\n\t}\n\n\treturn {};\n}\n\n// Image component to represent a single image in the upload dialog.\nfunction Image( { clientId, alt, url } ) {\n\tconst { selectBlock } = useDispatch( blockEditorStore );\n\treturn (\n\t\t<motion.img\n\t\t\ttabIndex={ 0 }\n\t\t\trole=\"button\"\n\t\t\taria-label={ __( 'Select image block.' ) }\n\t\t\tonClick={ () => {\n\t\t\t\tselectBlock( clientId );\n\t\t\t} }\n\t\t\tonKeyDown={ ( event ) => {\n\t\t\t\tif ( event.key === 'Enter' || event.key === ' ' ) {\n\t\t\t\t\tselectBlock( clientId );\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t} }\n\t\t\tkey={ clientId }\n\t\t\talt={ alt }\n\t\t\tsrc={ url }\n\t\t\tanimate={ { opacity: 1 } }\n\t\t\texit={ { opacity: 0, scale: 0 } }\n\t\t\tstyle={ {\n\t\t\t\twidth: '36px',\n\t\t\t\theight: '36px',\n\t\t\t\tobjectFit: 'cover',\n\t\t\t\tborderRadius: '2px',\n\t\t\t\tcursor: 'pointer',\n\t\t\t} }\n\t\t\twhileHover={ { scale: 1.08 } }\n\t\t/>\n\t);\n}\n\nexport default function MaybeUploadMediaPanel() {\n\tconst [ isUploading, setIsUploading ] = useState( false );\n\tconst [ isAnimating, setIsAnimating ] = useState( false );\n\tconst [ hadUploadError, setHadUploadError ] = useState( false );\n\tconst { editorBlocks, mediaUpload } = useSelect(\n\t\t( select ) => ( {\n\t\t\teditorBlocks: select( blockEditorStore ).getBlocks(),\n\t\t\tmediaUpload: select( blockEditorStore ).getSettings().mediaUpload,\n\t\t} ),\n\t\t[]\n\t);\n\n\t// Get a list of blocks with external media.\n\tconst blocksWithExternalMedia = flattenBlocks( editorBlocks ).filter(\n\t\t( block ) => hasExternalMedia( block )\n\t);\n\tconst { updateBlockAttributes } = useDispatch( blockEditorStore );\n\n\tif ( ! mediaUpload || ! blocksWithExternalMedia.length ) {\n\t\treturn null;\n\t}\n\n\tconst panelBodyTitle = [\n\t\t__( 'Suggestion:' ),\n\t\t<span className=\"editor-post-publish-panel__link\" key=\"label\">\n\t\t\t{ __( 'External media' ) }\n\t\t</span>,\n\t];\n\n\t/**\n\t * Update an individual block to point to newly-added library media.\n\t *\n\t * Different blocks use different attribute names, so we need this\n\t * function to ensure we modify the correct attributes for each type.\n\t *\n\t * @param {{name: string, attributes: Object}} block The block.\n\t * @param {{id: number, url: string}} media Media library file info.\n\t */\n\tfunction updateBlockWithUploadedMedia( block, media ) {\n\t\tif ( block.name === 'core/image' || block.name === 'core/cover' ) {\n\t\t\tupdateBlockAttributes( block.clientId, {\n\t\t\t\tid: media.id,\n\t\t\t\turl: media.url,\n\t\t\t} );\n\t\t}\n\n\t\tif ( block.name === 'core/media-text' ) {\n\t\t\tupdateBlockAttributes( block.clientId, {\n\t\t\t\tmediaId: media.id,\n\t\t\t\tmediaUrl: media.url,\n\t\t\t} );\n\t\t}\n\t}\n\n\t// Handle fetching and uploading all external media in the post.\n\tfunction uploadImages() {\n\t\tsetIsUploading( true );\n\t\tsetHadUploadError( false );\n\n\t\t// Multiple blocks can be using the same URL, so we\n\t\t// should ensure we only fetch and upload each of them once.\n\t\tconst mediaUrls = new Set(\n\t\t\tblocksWithExternalMedia.map( ( block ) => {\n\t\t\t\tconst { url } = getMediaInfo( block );\n\t\t\t\treturn url;\n\t\t\t} )\n\t\t);\n\n\t\t// Create an upload promise for each URL, that we can wait for in all\n\t\t// blocks that make use of that media.\n\t\tconst uploadPromises = Object.fromEntries(\n\t\t\tObject.entries( fetchMedia( [ ...mediaUrls ] ) ).map(\n\t\t\t\t( [ url, filePromise ] ) => {\n\t\t\t\t\tconst uploadPromise = filePromise.then(\n\t\t\t\t\t\t( blob ) =>\n\t\t\t\t\t\t\tnew Promise( ( resolve, reject ) => {\n\t\t\t\t\t\t\t\tmediaUpload( {\n\t\t\t\t\t\t\t\t\tfilesList: [ blob ],\n\t\t\t\t\t\t\t\t\tonFileChange: ( [ media ] ) => {\n\t\t\t\t\t\t\t\t\t\tif ( isBlobURL( media.url ) ) {\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tresolve( media );\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tonError() {\n\t\t\t\t\t\t\t\t\t\treject();\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t);\n\n\t\t\t\t\treturn [ url, uploadPromise ];\n\t\t\t\t}\n\t\t\t)\n\t\t);\n\n\t\t// Wait for all blocks to be updated with library media.\n\t\tPromise.allSettled(\n\t\t\tblocksWithExternalMedia.map( ( block ) => {\n\t\t\t\tconst { url } = getMediaInfo( block );\n\n\t\t\t\treturn uploadPromises[ url ]\n\t\t\t\t\t.then( ( media ) =>\n\t\t\t\t\t\tupdateBlockWithUploadedMedia( block, media )\n\t\t\t\t\t)\n\t\t\t\t\t.then( () => setIsAnimating( true ) )\n\t\t\t\t\t.catch( () => setHadUploadError( true ) );\n\t\t\t} )\n\t\t).finally( () => {\n\t\t\tsetIsUploading( false );\n\t\t} );\n\t}\n\n\treturn (\n\t\t<PanelBody initialOpen title={ panelBodyTitle }>\n\t\t\t<p>\n\t\t\t\t{ __(\n\t\t\t\t\t'Upload external images to the Media Library. Images from different domains may load slowly, display incorrectly, or be removed unexpectedly.'\n\t\t\t\t) }\n\t\t\t</p>\n\t\t\t<div\n\t\t\t\tstyle={ {\n\t\t\t\t\tdisplay: 'inline-flex',\n\t\t\t\t\tflexWrap: 'wrap',\n\t\t\t\t\tgap: '8px',\n\t\t\t\t} }\n\t\t\t>\n\t\t\t\t<AnimatePresence\n\t\t\t\t\tonExitComplete={ () => setIsAnimating( false ) }\n\t\t\t\t>\n\t\t\t\t\t{ blocksWithExternalMedia.map( ( block ) => {\n\t\t\t\t\t\tconst { url, alt } = getMediaInfo( block );\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Image\n\t\t\t\t\t\t\t\tkey={ block.clientId }\n\t\t\t\t\t\t\t\tclientId={ block.clientId }\n\t\t\t\t\t\t\t\turl={ url }\n\t\t\t\t\t\t\t\talt={ alt }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t} ) }\n\t\t\t\t</AnimatePresence>\n\t\t\t\t{ isUploading || isAnimating ? (\n\t\t\t\t\t<Spinner />\n\t\t\t\t) : (\n\t\t\t\t\t<Button\n\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\tonClick={ uploadImages }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ __( 'Upload' ) }\n\t\t\t\t\t</Button>\n\t\t\t\t) }\n\t\t\t</div>\n\t\t\t{ hadUploadError && <p>{ __( 'Upload failed, try again.' ) }</p> }\n\t\t</PanelBody>\n\t);\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["PanelBody","Button","Spinner","__unstableMotion","motion","__unstableAnimatePresence","AnimatePresence","useSelect","useDispatch","__","store","blockEditorStore","useState","isBlobURL","fetchMedia","jsx","_jsx","jsxs","_jsxs","flattenBlocks","blocks","result","forEach","block","push","innerBlocks","hasExternalMedia","name","attributes","url","id","mediaUrl","mediaId","undefined","getMediaInfo","alt","mediaAlt","Image","clientId","selectBlock","img","tabIndex","role","onClick","onKeyDown","event","key","preventDefault","src","animate","opacity","exit","scale","style","width","height","objectFit","borderRadius","cursor","whileHover","MaybeUploadMediaPanel","isUploading","setIsUploading","isAnimating","setIsAnimating","hadUploadError","setHadUploadError","editorBlocks","mediaUpload","select","getBlocks","getSettings","blocksWithExternalMedia","filter","updateBlockAttributes","length","panelBodyTitle","className","children","updateBlockWithUploadedMedia","media","uploadImages","mediaUrls","Set","map","uploadPromises","Object","fromEntries","entries","filePromise","uploadPromise","then","blob","Promise","resolve","reject","filesList","onFileChange","onError","allSettled","catch","finally","initialOpen","title","display","flexWrap","gap","onExitComplete","size","variant"],"sources":["@wordpress/editor/src/components/post-publish-panel/maybe-upload-media.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\tPanelBody,\n\tButton,\n\tSpinner,\n\t__unstableMotion as motion,\n\t__unstableAnimatePresence as AnimatePresence,\n} from '@wordpress/components';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { __ } from '@wordpress/i18n';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport { useState } from '@wordpress/element';\nimport { isBlobURL } from '@wordpress/blob';\n\n/**\n * Internal dependencies\n */\nimport { fetchMedia } from './media-util';\n\nfunction flattenBlocks( blocks ) {\n\tconst result = [];\n\n\tblocks.forEach( ( block ) => {\n\t\tresult.push( block );\n\t\tresult.push( ...flattenBlocks( block.innerBlocks ) );\n\t} );\n\n\treturn result;\n}\n\n/**\n * Determine whether a block has external media.\n *\n * Different blocks use different attribute names (and potentially\n * different logic as well) in determining whether the media is\n * present, and whether it's external.\n *\n * @param {{name: string, attributes: Object}} block The block.\n * @return {boolean?} Whether the block has external media\n */\nfunction hasExternalMedia( block ) {\n\tif ( block.name === 'core/image' || block.name === 'core/cover' ) {\n\t\treturn block.attributes.url && ! block.attributes.id;\n\t}\n\n\tif ( block.name === 'core/media-text' ) {\n\t\treturn block.attributes.mediaUrl && ! block.attributes.mediaId;\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Retrieve media info from a block.\n *\n * Different blocks use different attribute names, so we need this\n * function to normalize things into a consistent naming scheme.\n *\n * @param {{name: string, attributes: Object}} block The block.\n * @return {{url: ?string, alt: ?string, id: ?number}} The media info for the block.\n */\nfunction getMediaInfo( block ) {\n\tif ( block.name === 'core/image' || block.name === 'core/cover' ) {\n\t\tconst { url, alt, id } = block.attributes;\n\t\treturn { url, alt, id };\n\t}\n\n\tif ( block.name === 'core/media-text' ) {\n\t\tconst { mediaUrl: url, mediaAlt: alt, mediaId: id } = block.attributes;\n\t\treturn { url, alt, id };\n\t}\n\n\treturn {};\n}\n\n// Image component to represent a single image in the upload dialog.\nfunction Image( { clientId, alt, url } ) {\n\tconst { selectBlock } = useDispatch( blockEditorStore );\n\treturn (\n\t\t<motion.img\n\t\t\ttabIndex={ 0 }\n\t\t\trole=\"button\"\n\t\t\taria-label={ __( 'Select image block.' ) }\n\t\t\tonClick={ () => {\n\t\t\t\tselectBlock( clientId );\n\t\t\t} }\n\t\t\tonKeyDown={ ( event ) => {\n\t\t\t\tif ( event.key === 'Enter' || event.key === ' ' ) {\n\t\t\t\t\tselectBlock( clientId );\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t} }\n\t\t\tkey={ clientId }\n\t\t\talt={ alt }\n\t\t\tsrc={ url }\n\t\t\tanimate={ { opacity: 1 } }\n\t\t\texit={ { opacity: 0, scale: 0 } }\n\t\t\tstyle={ {\n\t\t\t\twidth: '32px',\n\t\t\t\theight: '32px',\n\t\t\t\tobjectFit: 'cover',\n\t\t\t\tborderRadius: '2px',\n\t\t\t\tcursor: 'pointer',\n\t\t\t} }\n\t\t\twhileHover={ { scale: 1.08 } }\n\t\t/>\n\t);\n}\n\nexport default function MaybeUploadMediaPanel() {\n\tconst [ isUploading, setIsUploading ] = useState( false );\n\tconst [ isAnimating, setIsAnimating ] = useState( false );\n\tconst [ hadUploadError, setHadUploadError ] = useState( false );\n\tconst { editorBlocks, mediaUpload } = useSelect(\n\t\t( select ) => ( {\n\t\t\teditorBlocks: select( blockEditorStore ).getBlocks(),\n\t\t\tmediaUpload: select( blockEditorStore ).getSettings().mediaUpload,\n\t\t} ),\n\t\t[]\n\t);\n\n\t// Get a list of blocks with external media.\n\tconst blocksWithExternalMedia = flattenBlocks( editorBlocks ).filter(\n\t\t( block ) => hasExternalMedia( block )\n\t);\n\tconst { updateBlockAttributes } = useDispatch( blockEditorStore );\n\n\tif ( ! mediaUpload || ! blocksWithExternalMedia.length ) {\n\t\treturn null;\n\t}\n\n\tconst panelBodyTitle = [\n\t\t__( 'Suggestion:' ),\n\t\t<span className=\"editor-post-publish-panel__link\" key=\"label\">\n\t\t\t{ __( 'External media' ) }\n\t\t</span>,\n\t];\n\n\t/**\n\t * Update an individual block to point to newly-added library media.\n\t *\n\t * Different blocks use different attribute names, so we need this\n\t * function to ensure we modify the correct attributes for each type.\n\t *\n\t * @param {{name: string, attributes: Object}} block The block.\n\t * @param {{id: number, url: string}} media Media library file info.\n\t */\n\tfunction updateBlockWithUploadedMedia( block, media ) {\n\t\tif ( block.name === 'core/image' || block.name === 'core/cover' ) {\n\t\t\tupdateBlockAttributes( block.clientId, {\n\t\t\t\tid: media.id,\n\t\t\t\turl: media.url,\n\t\t\t} );\n\t\t}\n\n\t\tif ( block.name === 'core/media-text' ) {\n\t\t\tupdateBlockAttributes( block.clientId, {\n\t\t\t\tmediaId: media.id,\n\t\t\t\tmediaUrl: media.url,\n\t\t\t} );\n\t\t}\n\t}\n\n\t// Handle fetching and uploading all external media in the post.\n\tfunction uploadImages() {\n\t\tsetIsUploading( true );\n\t\tsetHadUploadError( false );\n\n\t\t// Multiple blocks can be using the same URL, so we\n\t\t// should ensure we only fetch and upload each of them once.\n\t\tconst mediaUrls = new Set(\n\t\t\tblocksWithExternalMedia.map( ( block ) => {\n\t\t\t\tconst { url } = getMediaInfo( block );\n\t\t\t\treturn url;\n\t\t\t} )\n\t\t);\n\n\t\t// Create an upload promise for each URL, that we can wait for in all\n\t\t// blocks that make use of that media.\n\t\tconst uploadPromises = Object.fromEntries(\n\t\t\tObject.entries( fetchMedia( [ ...mediaUrls ] ) ).map(\n\t\t\t\t( [ url, filePromise ] ) => {\n\t\t\t\t\tconst uploadPromise = filePromise.then(\n\t\t\t\t\t\t( blob ) =>\n\t\t\t\t\t\t\tnew Promise( ( resolve, reject ) => {\n\t\t\t\t\t\t\t\tmediaUpload( {\n\t\t\t\t\t\t\t\t\tfilesList: [ blob ],\n\t\t\t\t\t\t\t\t\tonFileChange: ( [ media ] ) => {\n\t\t\t\t\t\t\t\t\t\tif ( isBlobURL( media.url ) ) {\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tresolve( media );\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tonError() {\n\t\t\t\t\t\t\t\t\t\treject();\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t);\n\n\t\t\t\t\treturn [ url, uploadPromise ];\n\t\t\t\t}\n\t\t\t)\n\t\t);\n\n\t\t// Wait for all blocks to be updated with library media.\n\t\tPromise.allSettled(\n\t\t\tblocksWithExternalMedia.map( ( block ) => {\n\t\t\t\tconst { url } = getMediaInfo( block );\n\n\t\t\t\treturn uploadPromises[ url ]\n\t\t\t\t\t.then( ( media ) =>\n\t\t\t\t\t\tupdateBlockWithUploadedMedia( block, media )\n\t\t\t\t\t)\n\t\t\t\t\t.then( () => setIsAnimating( true ) )\n\t\t\t\t\t.catch( () => setHadUploadError( true ) );\n\t\t\t} )\n\t\t).finally( () => {\n\t\t\tsetIsUploading( false );\n\t\t} );\n\t}\n\n\treturn (\n\t\t<PanelBody initialOpen title={ panelBodyTitle }>\n\t\t\t<p>\n\t\t\t\t{ __(\n\t\t\t\t\t'Upload external images to the Media Library. Images from different domains may load slowly, display incorrectly, or be removed unexpectedly.'\n\t\t\t\t) }\n\t\t\t</p>\n\t\t\t<div\n\t\t\t\tstyle={ {\n\t\t\t\t\tdisplay: 'inline-flex',\n\t\t\t\t\tflexWrap: 'wrap',\n\t\t\t\t\tgap: '8px',\n\t\t\t\t} }\n\t\t\t>\n\t\t\t\t<AnimatePresence\n\t\t\t\t\tonExitComplete={ () => setIsAnimating( false ) }\n\t\t\t\t>\n\t\t\t\t\t{ blocksWithExternalMedia.map( ( block ) => {\n\t\t\t\t\t\tconst { url, alt } = getMediaInfo( block );\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Image\n\t\t\t\t\t\t\t\tkey={ block.clientId }\n\t\t\t\t\t\t\t\tclientId={ block.clientId }\n\t\t\t\t\t\t\t\turl={ url }\n\t\t\t\t\t\t\t\talt={ alt }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t} ) }\n\t\t\t\t</AnimatePresence>\n\t\t\t\t{ isUploading || isAnimating ? (\n\t\t\t\t\t<Spinner />\n\t\t\t\t) : (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tsize=\"compact\"\n\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\tonClick={ uploadImages }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ __( 'Upload' ) }\n\t\t\t\t\t</Button>\n\t\t\t\t) }\n\t\t\t</div>\n\t\t\t{ hadUploadError && <p>{ __( 'Upload failed, try again.' ) }</p> }\n\t\t</PanelBody>\n\t);\n}\n"],"mappings":"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","ignoreList":[]}
@@ -21,6 +21,7 @@ import { ActionItem } from '@wordpress/interface';
21
21
  import { store as editorStore } from '../../store';
22
22
  import { store as blockEditorStore } from '@wordpress/block-editor';
23
23
  import PostPreviewButton from '../post-preview-button';
24
+ import { unlock } from '../../lock-unlock';
24
25
  import { jsx as _jsx } from "react/jsx-runtime";
25
26
  import { jsxs as _jsxs } from "react/jsx-runtime";
26
27
  import { Fragment as _Fragment } from "react/jsx-runtime";
@@ -62,9 +63,13 @@ export default function PreviewDropdown({
62
63
  const {
63
64
  __unstableSetEditorMode
64
65
  } = useDispatch(blockEditorStore);
66
+ const {
67
+ resetZoomLevel
68
+ } = unlock(useDispatch(blockEditorStore));
65
69
  const handleDevicePreviewChange = newDeviceType => {
66
70
  setDeviceType(newDeviceType);
67
71
  __unstableSetEditorMode('edit');
72
+ resetZoomLevel();
68
73
  };
69
74
  const isMobile = useViewportMatch('medium', '<');
70
75
  if (isMobile) {
@@ -1 +1 @@
1
- {"version":3,"names":["clsx","useViewportMatch","DropdownMenu","MenuGroup","MenuItem","MenuItemsChoice","VisuallyHidden","Icon","__","desktop","mobile","tablet","external","useSelect","useDispatch","store","coreStore","preferencesStore","ActionItem","editorStore","blockEditorStore","PostPreviewButton","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","PreviewDropdown","forceIsAutosaveable","disabled","deviceType","homeUrl","isTemplate","isViewable","showIconLabels","select","_getPostType$viewable","getDeviceType","getCurrentPostType","getEntityRecord","getPostType","get","_currentPostType","home","viewable","setDeviceType","__unstableSetEditorMode","handleDevicePreviewChange","newDeviceType","isMobile","popoverProps","placement","toggleProps","className","iconPosition","size","showTooltip","accessibleWhenDisabled","menuProps","deviceIcons","choices","value","label","icon","toLowerCase","disableOpenOnArrowDown","children","onClose","onSelect","href","target","onClick","as","role","textContent","onPreview","Slot","name","fillProps"],"sources":["@wordpress/editor/src/components/preview-dropdown/index.js"],"sourcesContent":["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport { useViewportMatch } from '@wordpress/compose';\nimport {\n\tDropdownMenu,\n\tMenuGroup,\n\tMenuItem,\n\tMenuItemsChoice,\n\tVisuallyHidden,\n\tIcon,\n} from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\nimport { desktop, mobile, tablet, external } from '@wordpress/icons';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { store as preferencesStore } from '@wordpress/preferences';\nimport { ActionItem } from '@wordpress/interface';\n\n/**\n * Internal dependencies\n */\nimport { store as editorStore } from '../../store';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport PostPreviewButton from '../post-preview-button';\n\nexport default function PreviewDropdown( { forceIsAutosaveable, disabled } ) {\n\tconst { deviceType, homeUrl, isTemplate, isViewable, showIconLabels } =\n\t\tuseSelect( ( select ) => {\n\t\t\tconst { getDeviceType, getCurrentPostType } = select( editorStore );\n\t\t\tconst { getEntityRecord, getPostType } = select( coreStore );\n\t\t\tconst { get } = select( preferencesStore );\n\t\t\tconst _currentPostType = getCurrentPostType();\n\t\t\treturn {\n\t\t\t\tdeviceType: getDeviceType(),\n\t\t\t\thomeUrl: getEntityRecord( 'root', '__unstableBase' )?.home,\n\t\t\t\tisTemplate: _currentPostType === 'wp_template',\n\t\t\t\tisViewable: getPostType( _currentPostType )?.viewable ?? false,\n\t\t\t\tshowIconLabels: get( 'core', 'showIconLabels' ),\n\t\t\t};\n\t\t}, [] );\n\tconst { setDeviceType } = useDispatch( editorStore );\n\tconst { __unstableSetEditorMode } = useDispatch( blockEditorStore );\n\n\tconst handleDevicePreviewChange = ( newDeviceType ) => {\n\t\tsetDeviceType( newDeviceType );\n\t\t__unstableSetEditorMode( 'edit' );\n\t};\n\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\tif ( isMobile ) {\n\t\treturn null;\n\t}\n\n\tconst popoverProps = {\n\t\tplacement: 'bottom-end',\n\t};\n\tconst toggleProps = {\n\t\tclassName: 'editor-preview-dropdown__toggle',\n\t\ticonPosition: 'right',\n\t\tsize: 'compact',\n\t\tshowTooltip: ! showIconLabels,\n\t\tdisabled,\n\t\taccessibleWhenDisabled: disabled,\n\t};\n\tconst menuProps = {\n\t\t'aria-label': __( 'View options' ),\n\t};\n\n\tconst deviceIcons = {\n\t\tdesktop,\n\t\tmobile,\n\t\ttablet,\n\t};\n\n\t/**\n\t * The choices for the device type.\n\t *\n\t * @type {Array}\n\t */\n\tconst choices = [\n\t\t{\n\t\t\tvalue: 'Desktop',\n\t\t\tlabel: __( 'Desktop' ),\n\t\t\ticon: desktop,\n\t\t},\n\t\t{\n\t\t\tvalue: 'Tablet',\n\t\t\tlabel: __( 'Tablet' ),\n\t\t\ticon: tablet,\n\t\t},\n\t\t{\n\t\t\tvalue: 'Mobile',\n\t\t\tlabel: __( 'Mobile' ),\n\t\t\ticon: mobile,\n\t\t},\n\t];\n\n\treturn (\n\t\t<DropdownMenu\n\t\t\tclassName={ clsx(\n\t\t\t\t'editor-preview-dropdown',\n\t\t\t\t`editor-preview-dropdown--${ deviceType.toLowerCase() }`\n\t\t\t) }\n\t\t\tpopoverProps={ popoverProps }\n\t\t\ttoggleProps={ toggleProps }\n\t\t\tmenuProps={ menuProps }\n\t\t\ticon={ deviceIcons[ deviceType.toLowerCase() ] }\n\t\t\tlabel={ __( 'View' ) }\n\t\t\tdisableOpenOnArrowDown={ disabled }\n\t\t>\n\t\t\t{ ( { onClose } ) => (\n\t\t\t\t<>\n\t\t\t\t\t<MenuGroup>\n\t\t\t\t\t\t<MenuItemsChoice\n\t\t\t\t\t\t\tchoices={ choices }\n\t\t\t\t\t\t\tvalue={ deviceType }\n\t\t\t\t\t\t\tonSelect={ handleDevicePreviewChange }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</MenuGroup>\n\t\t\t\t\t{ isTemplate && (\n\t\t\t\t\t\t<MenuGroup>\n\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\thref={ homeUrl }\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\ticon={ external }\n\t\t\t\t\t\t\t\tonClick={ onClose }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{ __( 'View site' ) }\n\t\t\t\t\t\t\t\t<VisuallyHidden as=\"span\">\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t/* translators: accessibility text */\n\t\t\t\t\t\t\t\t\t\t__( '(opens in a new tab)' )\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</VisuallyHidden>\n\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t</MenuGroup>\n\t\t\t\t\t) }\n\t\t\t\t\t{ isViewable && (\n\t\t\t\t\t\t<MenuGroup>\n\t\t\t\t\t\t\t<PostPreviewButton\n\t\t\t\t\t\t\t\tclassName=\"editor-preview-dropdown__button-external\"\n\t\t\t\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t\t\t\tforceIsAutosaveable={ forceIsAutosaveable }\n\t\t\t\t\t\t\t\taria-label={ __( 'Preview in new tab' ) }\n\t\t\t\t\t\t\t\ttextContent={\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t{ __( 'Preview in new tab' ) }\n\t\t\t\t\t\t\t\t\t\t<Icon icon={ external } />\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonPreview={ onClose }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</MenuGroup>\n\t\t\t\t\t) }\n\t\t\t\t\t<ActionItem.Slot\n\t\t\t\t\t\tname=\"core/plugin-preview-menu\"\n\t\t\t\t\t\tas={ MenuGroup }\n\t\t\t\t\t\tfillProps={ { onClick: onClose } }\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) }\n\t\t</DropdownMenu>\n\t);\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["clsx","useViewportMatch","DropdownMenu","MenuGroup","MenuItem","MenuItemsChoice","VisuallyHidden","Icon","__","desktop","mobile","tablet","external","useSelect","useDispatch","store","coreStore","preferencesStore","ActionItem","editorStore","blockEditorStore","PostPreviewButton","unlock","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","PreviewDropdown","forceIsAutosaveable","disabled","deviceType","homeUrl","isTemplate","isViewable","showIconLabels","select","_getPostType$viewable","getDeviceType","getCurrentPostType","getEntityRecord","getPostType","get","_currentPostType","home","viewable","setDeviceType","__unstableSetEditorMode","resetZoomLevel","handleDevicePreviewChange","newDeviceType","isMobile","popoverProps","placement","toggleProps","className","iconPosition","size","showTooltip","accessibleWhenDisabled","menuProps","deviceIcons","choices","value","label","icon","toLowerCase","disableOpenOnArrowDown","children","onClose","onSelect","href","target","onClick","as","role","textContent","onPreview","Slot","name","fillProps"],"sources":["@wordpress/editor/src/components/preview-dropdown/index.js"],"sourcesContent":["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport { useViewportMatch } from '@wordpress/compose';\nimport {\n\tDropdownMenu,\n\tMenuGroup,\n\tMenuItem,\n\tMenuItemsChoice,\n\tVisuallyHidden,\n\tIcon,\n} from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\nimport { desktop, mobile, tablet, external } from '@wordpress/icons';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { store as preferencesStore } from '@wordpress/preferences';\nimport { ActionItem } from '@wordpress/interface';\n\n/**\n * Internal dependencies\n */\nimport { store as editorStore } from '../../store';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport PostPreviewButton from '../post-preview-button';\nimport { unlock } from '../../lock-unlock';\n\nexport default function PreviewDropdown( { forceIsAutosaveable, disabled } ) {\n\tconst { deviceType, homeUrl, isTemplate, isViewable, showIconLabels } =\n\t\tuseSelect( ( select ) => {\n\t\t\tconst { getDeviceType, getCurrentPostType } = select( editorStore );\n\t\t\tconst { getEntityRecord, getPostType } = select( coreStore );\n\t\t\tconst { get } = select( preferencesStore );\n\t\t\tconst _currentPostType = getCurrentPostType();\n\t\t\treturn {\n\t\t\t\tdeviceType: getDeviceType(),\n\t\t\t\thomeUrl: getEntityRecord( 'root', '__unstableBase' )?.home,\n\t\t\t\tisTemplate: _currentPostType === 'wp_template',\n\t\t\t\tisViewable: getPostType( _currentPostType )?.viewable ?? false,\n\t\t\t\tshowIconLabels: get( 'core', 'showIconLabels' ),\n\t\t\t};\n\t\t}, [] );\n\tconst { setDeviceType } = useDispatch( editorStore );\n\tconst { __unstableSetEditorMode } = useDispatch( blockEditorStore );\n\tconst { resetZoomLevel } = unlock( useDispatch( blockEditorStore ) );\n\n\tconst handleDevicePreviewChange = ( newDeviceType ) => {\n\t\tsetDeviceType( newDeviceType );\n\t\t__unstableSetEditorMode( 'edit' );\n\t\tresetZoomLevel();\n\t};\n\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\tif ( isMobile ) {\n\t\treturn null;\n\t}\n\n\tconst popoverProps = {\n\t\tplacement: 'bottom-end',\n\t};\n\tconst toggleProps = {\n\t\tclassName: 'editor-preview-dropdown__toggle',\n\t\ticonPosition: 'right',\n\t\tsize: 'compact',\n\t\tshowTooltip: ! showIconLabels,\n\t\tdisabled,\n\t\taccessibleWhenDisabled: disabled,\n\t};\n\tconst menuProps = {\n\t\t'aria-label': __( 'View options' ),\n\t};\n\n\tconst deviceIcons = {\n\t\tdesktop,\n\t\tmobile,\n\t\ttablet,\n\t};\n\n\t/**\n\t * The choices for the device type.\n\t *\n\t * @type {Array}\n\t */\n\tconst choices = [\n\t\t{\n\t\t\tvalue: 'Desktop',\n\t\t\tlabel: __( 'Desktop' ),\n\t\t\ticon: desktop,\n\t\t},\n\t\t{\n\t\t\tvalue: 'Tablet',\n\t\t\tlabel: __( 'Tablet' ),\n\t\t\ticon: tablet,\n\t\t},\n\t\t{\n\t\t\tvalue: 'Mobile',\n\t\t\tlabel: __( 'Mobile' ),\n\t\t\ticon: mobile,\n\t\t},\n\t];\n\n\treturn (\n\t\t<DropdownMenu\n\t\t\tclassName={ clsx(\n\t\t\t\t'editor-preview-dropdown',\n\t\t\t\t`editor-preview-dropdown--${ deviceType.toLowerCase() }`\n\t\t\t) }\n\t\t\tpopoverProps={ popoverProps }\n\t\t\ttoggleProps={ toggleProps }\n\t\t\tmenuProps={ menuProps }\n\t\t\ticon={ deviceIcons[ deviceType.toLowerCase() ] }\n\t\t\tlabel={ __( 'View' ) }\n\t\t\tdisableOpenOnArrowDown={ disabled }\n\t\t>\n\t\t\t{ ( { onClose } ) => (\n\t\t\t\t<>\n\t\t\t\t\t<MenuGroup>\n\t\t\t\t\t\t<MenuItemsChoice\n\t\t\t\t\t\t\tchoices={ choices }\n\t\t\t\t\t\t\tvalue={ deviceType }\n\t\t\t\t\t\t\tonSelect={ handleDevicePreviewChange }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</MenuGroup>\n\t\t\t\t\t{ isTemplate && (\n\t\t\t\t\t\t<MenuGroup>\n\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\thref={ homeUrl }\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\ticon={ external }\n\t\t\t\t\t\t\t\tonClick={ onClose }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{ __( 'View site' ) }\n\t\t\t\t\t\t\t\t<VisuallyHidden as=\"span\">\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t/* translators: accessibility text */\n\t\t\t\t\t\t\t\t\t\t__( '(opens in a new tab)' )\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</VisuallyHidden>\n\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t</MenuGroup>\n\t\t\t\t\t) }\n\t\t\t\t\t{ isViewable && (\n\t\t\t\t\t\t<MenuGroup>\n\t\t\t\t\t\t\t<PostPreviewButton\n\t\t\t\t\t\t\t\tclassName=\"editor-preview-dropdown__button-external\"\n\t\t\t\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t\t\t\tforceIsAutosaveable={ forceIsAutosaveable }\n\t\t\t\t\t\t\t\taria-label={ __( 'Preview in new tab' ) }\n\t\t\t\t\t\t\t\ttextContent={\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t{ __( 'Preview in new tab' ) }\n\t\t\t\t\t\t\t\t\t\t<Icon icon={ external } />\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonPreview={ onClose }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</MenuGroup>\n\t\t\t\t\t) }\n\t\t\t\t\t<ActionItem.Slot\n\t\t\t\t\t\tname=\"core/plugin-preview-menu\"\n\t\t\t\t\t\tas={ MenuGroup }\n\t\t\t\t\t\tfillProps={ { onClick: onClose } }\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) }\n\t\t</DropdownMenu>\n\t);\n}\n"],"mappings":"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","ignoreList":[]}
@@ -173,20 +173,16 @@ export const ExperimentalEditorProvider = withRegistryProvider(({
173
173
  const postContext = {};
174
174
  // If it is a template, try to inherit the post type from the slug.
175
175
  if (post.type === 'wp_template') {
176
- if (!post.is_custom) {
177
- const [kind] = post.slug.split('-');
178
- switch (kind) {
179
- case 'page':
180
- postContext.postType = 'page';
181
- break;
182
- case 'single':
183
- // Infer the post type from the slug.
184
- const postTypesSlugs = postTypes?.map(entity => entity.slug) || [];
185
- const match = post.slug.match(`^single-(${postTypesSlugs.join('|')})(?:-.+)?$`);
186
- if (match) {
187
- postContext.postType = match[1];
188
- }
189
- break;
176
+ if (post.slug === 'page') {
177
+ postContext.postType = 'page';
178
+ } else if (post.slug === 'single') {
179
+ postContext.postType = 'post';
180
+ } else if (post.slug.split('-')[0] === 'single') {
181
+ // If the slug is single-{postType}, infer the post type from the slug.
182
+ const postTypesSlugs = postTypes?.map(entity => entity.slug) || [];
183
+ const match = post.slug.match(`^single-(${postTypesSlugs.join('|')})(?:-.+)?$`);
184
+ if (match) {
185
+ postContext.postType = match[1];
190
186
  }
191
187
  }
192
188
  } else if (!NON_CONTEXTUAL_POST_TYPES.includes(rootLevelPost.type) || shouldRenderTemplate) {