store
3 months ago
GenerateBgImage.js
3 months ago
_breakpoints.scss
1 week ago
block-duplicate-helper.js
3 months ago
capitalize.js
3 months ago
color-code-to-class.js
3 months ago
color-slug-to-color-code.js
3 months ago
common.scss
1 week ago
convert-to-grid.js
3 months ago
default-color-palette.js
3 months ago
delete-from-array.js
3 months ago
depModules.js
3 months ago
disable-links.js
2 months ago
empty-string-to-undefined.js
3 months ago
example-data.js
3 months ago
fixBrokenUnicode.js
3 months ago
font-awesome-new.js
1 week ago
font-awesome-version.js
3 months ago
font-awesome.js
3 months ago
formatNumCol.js
3 months ago
gradient-slug-to-gradient-code.js
3 months ago
heading-level-utils.js
3 months ago
hex-to-rgba.js
3 months ago
horizontal-scroll-controls.js
3 months ago
icon-label.js
2 months ago
is-excludes-blocks.js
3 months ago
is-gradient-style.js
3 months ago
is-hex-color.js
3 months ago
is-not-json.js
3 months ago
is-parent-reusable-block.js
1 month ago
merge-colors.js
3 months ago
multi-array-flaten.js
3 months ago
removeProperty.js
3 months ago
replaceClientId.js
3 months ago
sanitizeSlug.js
3 months ago
settings-page-url.js
2 months ago
strip-html.js
3 months ago
taxonomy-utils.js
3 months ago
to-number.js
3 months ago
to-preset-spacing-var.js
3 months ago
unit-options.js
3 months ago
wrap-unwrap.js
3 months ago
is-parent-reusable-block.js
92 lines
| 1 | import { select } from '@wordpress/data'; |
| 2 | |
| 3 | export const isParentReusableBlock = (clientId) => { |
| 4 | const blockEditor = select('core/block-editor'); |
| 5 | const parents = blockEditor?.getBlockParentsByBlockName?.(clientId, [ |
| 6 | 'core/block', |
| 7 | 'core/template-part', |
| 8 | ]); |
| 9 | return Array.isArray(parents) && parents.length ? true : false; |
| 10 | }; |
| 11 | |
| 12 | /** |
| 13 | * エディタ� |
| 14 | に、自分以外で同じ blockId を持つブロックが存在するか(= blockId 衝突)を調べる。 |
| 15 | * |
| 16 | * blockId はブロック複製時に複製� |
| 17 | �と同じ値がコピーされるため、複製直後は |
| 18 | * 「自分以外に同一 blockId のブロックがある」状� |
| 19 | �になる。この状� |
| 20 | �を衝突として検出する。 |
| 21 | * 通常のリロード(複製ではない)では同一 blockId のブロックは自分だけなので衝突しない。 |
| 22 | * |
| 23 | * @param {string} clientId 判定対象ブロックの clientId |
| 24 | * @param {string} blockId 判定対象ブロックの現在の blockId 属性値 |
| 25 | * @return {boolean} 自分以外に同一 blockId のブロックがあれば true |
| 26 | */ |
| 27 | export const hasBlockIdCollision = (clientId, blockId) => { |
| 28 | // blockId が未確定なら衝突判定の対象外(呼び出し側で undefined を別途処理する) |
| 29 | if (!blockId) { |
| 30 | return false; |
| 31 | } |
| 32 | const blockEditor = select('core/block-editor'); |
| 33 | // エディタ� |
| 34 | の� |
| 35 | �ブロック(ネスト含む)の clientId を取得 |
| 36 | const allClientIds = blockEditor?.getClientIdsWithDescendants?.() ?? []; |
| 37 | // 自分以外で blockId が一致するブロックがあれば衝突 |
| 38 | return allClientIds.some((id) => { |
| 39 | if (id === clientId) { |
| 40 | return false; |
| 41 | } |
| 42 | const attrs = blockEditor?.getBlockAttributes?.(id); |
| 43 | return attrs?.blockId === blockId; |
| 44 | }); |
| 45 | }; |
| 46 | |
| 47 | /** |
| 48 | * blockId を clientId に更新(再採番)すべきかどうかを判定する純粋関数。 |
| 49 | * |
| 50 | * issue #2556 対応: |
| 51 | * 従来は「再利用ブロック外なら毎回更新」していたため、通常リロードのたびに |
| 52 | * blockId が新しい clientId へ churn し、デリミタコメントの差分で投稿が dirty 化していた。 |
| 53 | * そこで「複製による実衝突があるときだけ再採番する」案 A(真の衝突検出)に変更する。 |
| 54 | * |
| 55 | * 再採番する条件: |
| 56 | * - blockId が未確定(undefined)、または |
| 57 | * - 再利用ブロック外 かつ エディタ� |
| 58 | に同一 blockId を持つ自分以外のブロックがある(実衝突) |
| 59 | * |
| 60 | * 再利用ブロック(同期パターン)� |
| 61 | では複数インスタンスが同じ blockId を� |
| 62 | �有するのが正常なので、 |
| 63 | * 衝突検出は適用しない(= 再利用ブロック� |
| 64 | では undefined のときのみ採番する)。 |
| 65 | * これにより複製時の CSS-ID 衝突回避という当初目的を保ちつつ、通常リロードでの |
| 66 | * dirty 化を防ぐ。 |
| 67 | * |
| 68 | * @param {Object} params |
| 69 | * @param {string|undefined} params.blockId ブロックに保存済みの blockId 属性値 |
| 70 | * @param {boolean} params.isInReusableBlock 再利用ブロック� |
| 71 | かどうか(isParentReusableBlock の結果) |
| 72 | * @param {boolean} params.hasCollision 自分以外に同一 blockId のブロックがあるか(実衝突) |
| 73 | * @return {boolean} true なら setAttributes({ blockId: clientId }) を呼ぶべき |
| 74 | */ |
| 75 | export const shouldUpdateBlockId = ({ |
| 76 | blockId, |
| 77 | isInReusableBlock, |
| 78 | hasCollision, |
| 79 | }) => { |
| 80 | if (blockId === undefined) { |
| 81 | return true; |
| 82 | } |
| 83 | // 再利用ブロック� |
| 84 | では衝突検出しない(� |
| 85 | �有 blockId が正常なため) |
| 86 | if (isInReusableBlock) { |
| 87 | return false; |
| 88 | } |
| 89 | // 再利用ブロック外では、実際に blockId が衝突しているときだけ再採番する |
| 90 | return hasCollision === true; |
| 91 | }; |
| 92 |