itmar-block-packages 1.10.1 → 2.0.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/README.md +78 -2
- package/build/cjs/AnimationBlock.js +107 -0
- package/build/cjs/AnimationBlock.js.map +1 -0
- package/build/cjs/BlockEditWrapper.js +20 -0
- package/build/cjs/BlockEditWrapper.js.map +1 -0
- package/build/cjs/BlockPlace.js +509 -0
- package/build/cjs/BlockPlace.js.map +1 -0
- package/build/cjs/BrockInserter.js +204 -0
- package/build/cjs/BrockInserter.js.map +1 -0
- package/build/cjs/DateElm.js +321 -0
- package/build/cjs/DateElm.js.map +1 -0
- package/build/cjs/DraggableBox.js +143 -0
- package/build/cjs/DraggableBox.js.map +1 -0
- package/build/cjs/GridControls.js +421 -0
- package/build/cjs/GridControls.js.map +1 -0
- package/build/cjs/IconSelectControl.js +167 -0
- package/build/cjs/IconSelectControl.js.map +1 -0
- package/build/cjs/JapaneseHolidays.js +99 -0
- package/build/cjs/JapaneseHolidays.js.map +1 -0
- package/build/cjs/MasonryControl.js +124 -0
- package/build/cjs/MasonryControl.js.map +1 -0
- package/build/cjs/PseudoElm.js +66 -0
- package/build/cjs/PseudoElm.js.map +1 -0
- package/build/cjs/ShadowStyle.js +453 -0
- package/build/cjs/ShadowStyle.js.map +1 -0
- package/build/cjs/SwiperControl.js +267 -0
- package/build/cjs/SwiperControl.js.map +1 -0
- package/build/cjs/ToggleElement.js +17 -0
- package/build/cjs/ToggleElement.js.map +1 -0
- package/build/cjs/TypographyControls.js +151 -0
- package/build/cjs/TypographyControls.js.map +1 -0
- package/build/cjs/UpdateAllPostsBlockAttributes.js +137 -0
- package/build/cjs/UpdateAllPostsBlockAttributes.js.map +1 -0
- package/build/cjs/ZipAddress.js +34 -0
- package/build/cjs/ZipAddress.js.map +1 -0
- package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +117 -0
- package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
- package/build/cjs/blockStore.js +65 -0
- package/build/cjs/blockStore.js.map +1 -0
- package/build/cjs/cssPropertes.js +157 -0
- package/build/cjs/cssPropertes.js.map +1 -0
- package/build/cjs/customFooks.js +300 -0
- package/build/cjs/customFooks.js.map +1 -0
- package/build/cjs/formatCreate.js +160 -0
- package/build/cjs/formatCreate.js.map +1 -0
- package/build/cjs/hslToRgb.js +133 -0
- package/build/cjs/hslToRgb.js.map +1 -0
- package/build/cjs/index.js +115 -0
- package/build/cjs/index.js.map +1 -0
- package/build/cjs/mediaUpload.js +182 -0
- package/build/cjs/mediaUpload.js.map +1 -0
- package/build/cjs/node_modules/nanoid/index.js +30 -0
- package/build/cjs/node_modules/nanoid/index.js.map +1 -0
- package/build/cjs/node_modules/nanoid/url-alphabet/index.js +7 -0
- package/build/cjs/node_modules/nanoid/url-alphabet/index.js.map +1 -0
- package/build/cjs/shopfiApi.js +188 -0
- package/build/cjs/shopfiApi.js.map +1 -0
- package/build/cjs/validationCheck.js +15 -0
- package/build/cjs/validationCheck.js.map +1 -0
- package/build/cjs/wordpressApi.js +631 -0
- package/build/cjs/wordpressApi.js.map +1 -0
- package/build/esm/AnimationBlock.js +102 -0
- package/build/esm/AnimationBlock.js.map +1 -0
- package/build/esm/BlockEditWrapper.js +16 -0
- package/build/esm/BlockEditWrapper.js.map +1 -0
- package/build/esm/BlockPlace.js +503 -0
- package/build/esm/BlockPlace.js.map +1 -0
- package/build/esm/BrockInserter.js +202 -0
- package/build/esm/BrockInserter.js.map +1 -0
- package/build/esm/DateElm.js +309 -0
- package/build/esm/DateElm.js.map +1 -0
- package/build/esm/DraggableBox.js +138 -0
- package/build/esm/DraggableBox.js.map +1 -0
- package/build/esm/GridControls.js +417 -0
- package/build/esm/GridControls.js.map +1 -0
- package/build/esm/IconSelectControl.js +163 -0
- package/build/esm/IconSelectControl.js.map +1 -0
- package/build/esm/JapaneseHolidays.js +97 -0
- package/build/esm/JapaneseHolidays.js.map +1 -0
- package/{src → build/esm}/MasonryControl.js +108 -113
- package/build/esm/MasonryControl.js.map +1 -0
- package/build/esm/PseudoElm.js +61 -0
- package/build/esm/PseudoElm.js.map +1 -0
- package/build/esm/ShadowStyle.js +448 -0
- package/build/esm/ShadowStyle.js.map +1 -0
- package/{src → build/esm}/SwiperControl.js +265 -265
- package/build/esm/SwiperControl.js.map +1 -0
- package/build/esm/ToggleElement.js +13 -0
- package/build/esm/ToggleElement.js.map +1 -0
- package/build/esm/TypographyControls.js +147 -0
- package/build/esm/TypographyControls.js.map +1 -0
- package/build/esm/UpdateAllPostsBlockAttributes.js +133 -0
- package/build/esm/UpdateAllPostsBlockAttributes.js.map +1 -0
- package/build/esm/ZipAddress.js +32 -0
- package/build/esm/ZipAddress.js.map +1 -0
- package/build/esm/_virtual/_rollupPluginBabelHelpers.js +107 -0
- package/build/esm/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
- package/build/esm/blockStore.js +60 -0
- package/build/esm/blockStore.js.map +1 -0
- package/build/esm/cssPropertes.js +144 -0
- package/build/esm/cssPropertes.js.map +1 -0
- package/{src → build/esm}/customFooks.js +290 -337
- package/build/esm/customFooks.js.map +1 -0
- package/build/esm/formatCreate.js +157 -0
- package/build/esm/formatCreate.js.map +1 -0
- package/build/esm/hslToRgb.js +129 -0
- package/build/esm/hslToRgb.js.map +1 -0
- package/build/esm/index.js +27 -0
- package/build/esm/index.js.map +1 -0
- package/build/esm/mediaUpload.js +176 -0
- package/build/esm/mediaUpload.js.map +1 -0
- package/build/esm/node_modules/nanoid/index.js +27 -0
- package/build/esm/node_modules/nanoid/index.js.map +1 -0
- package/build/esm/node_modules/nanoid/url-alphabet/index.js +5 -0
- package/build/esm/node_modules/nanoid/url-alphabet/index.js.map +1 -0
- package/build/esm/shopfiApi.js +184 -0
- package/build/esm/shopfiApi.js.map +1 -0
- package/build/esm/validationCheck.js +13 -0
- package/build/esm/validationCheck.js.map +1 -0
- package/build/esm/wordpressApi.js +618 -0
- package/build/esm/wordpressApi.js.map +1 -0
- package/package.json +22 -6
- package/build/index.asset.php +0 -1
- package/build/index.js +0 -25
- package/css/editor.css +0 -23
- package/css/editor.css.map +0 -1
- package/img/animation.png +0 -0
- package/img/blockplace.png +0 -0
- package/img/grid.png +0 -0
- package/img/iconControl.png +0 -0
- package/img/pseudo.png +0 -0
- package/img/shadow.png +0 -0
- package/img/typography.png +0 -0
- package/src/AnimationBlock.js +0 -112
- package/src/BlockEditWrapper.js +0 -11
- package/src/BlockPlace.js +0 -904
- package/src/BrockInserter.js +0 -247
- package/src/DateElm.js +0 -354
- package/src/DraggableBox.js +0 -143
- package/src/GridControls.js +0 -462
- package/src/IconSelectControl.js +0 -186
- package/src/PseudoElm.js +0 -54
- package/src/ShadowStyle.js +0 -520
- package/src/ToggleElement.js +0 -18
- package/src/TypographyControls.js +0 -145
- package/src/UpdateAllPostsBlockAttributes.js +0 -127
- package/src/ZipAddress.js +0 -35
- package/src/blockStore.js +0 -75
- package/src/cssPropertes.js +0 -212
- package/src/formatCreate.js +0 -179
- package/src/hslToRgb.js +0 -162
- package/src/index.js +0 -131
- package/src/mediaUpload.js +0 -178
- package/src/shopfiApi.js +0 -187
- package/src/validationCheck.js +0 -10
- package/src/wordpressApi.js +0 -707
- package/webpack.config.js +0 -10
package/src/DraggableBox.js
DELETED
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
import { __ } from "@wordpress/i18n";
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
Button,
|
|
5
|
-
PanelBody,
|
|
6
|
-
PanelRow,
|
|
7
|
-
__experimentalUnitControl as UnitControl,
|
|
8
|
-
} from "@wordpress/components";
|
|
9
|
-
|
|
10
|
-
import { useEffect, useRef } from "@wordpress/element";
|
|
11
|
-
|
|
12
|
-
export const useDraggingMove = (
|
|
13
|
-
isMovable,
|
|
14
|
-
blockRef,
|
|
15
|
-
position,
|
|
16
|
-
onPositionChange
|
|
17
|
-
) => {
|
|
18
|
-
const elmposition = useRef({ x: 0, y: 0 });
|
|
19
|
-
const isDragging = useRef(false);
|
|
20
|
-
const mousePosition = useRef({ x: 0, y: 0 });
|
|
21
|
-
|
|
22
|
-
useEffect(() => {
|
|
23
|
-
const element = blockRef.current;
|
|
24
|
-
|
|
25
|
-
if (!isMovable) {
|
|
26
|
-
if (element) {
|
|
27
|
-
element.classList.remove("itmar_isDraggable"); //移動カーソル表示クラス削除
|
|
28
|
-
}
|
|
29
|
-
return; // 移動許可がある場合のみ、後続のロジックを実行
|
|
30
|
-
}
|
|
31
|
-
//positionの変化に合わせて現在位置を変更
|
|
32
|
-
const pos_value_x = position.x.match(/(-?\d+)([%a-zA-Z]+)/);
|
|
33
|
-
const pos_value_y = position.y.match(/(-?\d+)([%a-zA-Z]+)/);
|
|
34
|
-
elmposition.current = {
|
|
35
|
-
x: parseInt(pos_value_x[1]),
|
|
36
|
-
y: parseInt(pos_value_y[1]),
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
//イベントハンドラ
|
|
40
|
-
const handleMouseDown = (event) => {
|
|
41
|
-
// 移動カーソル表示クラス名を追加します。
|
|
42
|
-
element.classList.add("itmar_isDraggable");
|
|
43
|
-
//ドラッグの開始フラグオン
|
|
44
|
-
isDragging.current = true;
|
|
45
|
-
//ドラッグ開始の絶対位置
|
|
46
|
-
mousePosition.current = { x: event.clientX, y: event.clientY };
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
const handleMouseMove = (event) => {
|
|
50
|
-
if (!isDragging.current) return; //ドラッグ中でなければ処理を中止
|
|
51
|
-
const dx = event.clientX - mousePosition.current.x;
|
|
52
|
-
const dy = event.clientY - mousePosition.current.y;
|
|
53
|
-
//ドラッグ後の位置を保存
|
|
54
|
-
const newPosition = {
|
|
55
|
-
x: elmposition.current.x + dx,
|
|
56
|
-
y: elmposition.current.y + dy,
|
|
57
|
-
};
|
|
58
|
-
elmposition.current = newPosition;
|
|
59
|
-
mousePosition.current = { x: event.clientX, y: event.clientY }; //マウス位置の保存
|
|
60
|
-
//ドラッグによるブロックの一時的移動
|
|
61
|
-
element.style.transform = `translate(${elmposition.current.x}px, ${elmposition.current.y}px)`;
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
const handleMouseUp = () => {
|
|
65
|
-
isDragging.current = false;
|
|
66
|
-
element.style.transform = null;
|
|
67
|
-
//呼出しもとに要素の位置を返す
|
|
68
|
-
onPositionChange({
|
|
69
|
-
x: `${elmposition.current.x}px`,
|
|
70
|
-
y: `${elmposition.current.y}px`,
|
|
71
|
-
});
|
|
72
|
-
};
|
|
73
|
-
const handleMouseLeave = () => {
|
|
74
|
-
isDragging.current = false;
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
if (element) {
|
|
78
|
-
// クラス名を追加します。
|
|
79
|
-
element.classList.add("itmar_isDraggable");
|
|
80
|
-
}
|
|
81
|
-
// イベントハンドラを追加します。
|
|
82
|
-
element.addEventListener("mousedown", handleMouseDown);
|
|
83
|
-
element.addEventListener("mousemove", handleMouseMove);
|
|
84
|
-
element.addEventListener("mouseup", handleMouseUp);
|
|
85
|
-
element.addEventListener("mouseleave", handleMouseLeave);
|
|
86
|
-
|
|
87
|
-
// イベントリスナーを削除するクリーンアップ関数を返します。
|
|
88
|
-
return () => {
|
|
89
|
-
element.removeEventListener("mousedown", handleMouseDown);
|
|
90
|
-
element.removeEventListener("mousemove", handleMouseMove);
|
|
91
|
-
element.removeEventListener("mouseup", handleMouseUp);
|
|
92
|
-
element.removeEventListener("mouseleave", handleMouseLeave);
|
|
93
|
-
element.style.transform = null;
|
|
94
|
-
};
|
|
95
|
-
}, [isMovable, blockRef, position, onPositionChange]); // 依存配列に isMovable を含めます
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
export default function DraggableBox(props) {
|
|
99
|
-
const position = props.attributes;
|
|
100
|
-
|
|
101
|
-
//インスペクター内のコントロールからの移動操作
|
|
102
|
-
const chagePosition = (value, cordinate) => {
|
|
103
|
-
if (value) {
|
|
104
|
-
const newPos = { ...position, [cordinate]: value };
|
|
105
|
-
props.onPositionChange(newPos);
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
//リセット
|
|
110
|
-
const resetPos = () => {
|
|
111
|
-
const newPos = { x: "0px", y: "0px" };
|
|
112
|
-
props.onPositionChange(newPos);
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
return (
|
|
116
|
-
<>
|
|
117
|
-
<PanelBody
|
|
118
|
-
title={__("Position Setting", "block-collections")}
|
|
119
|
-
initialOpen={true}
|
|
120
|
-
>
|
|
121
|
-
<PanelRow className="distance_row">
|
|
122
|
-
<UnitControl
|
|
123
|
-
dragDirection="e"
|
|
124
|
-
onChange={(value) => chagePosition(value, "x")}
|
|
125
|
-
label={__("Vertical", "block-collections")}
|
|
126
|
-
value={position?.x || 0}
|
|
127
|
-
/>
|
|
128
|
-
<UnitControl
|
|
129
|
-
dragDirection="e"
|
|
130
|
-
onChange={(value) => chagePosition(value, "y")}
|
|
131
|
-
label={__("Horizen", "block-collections")}
|
|
132
|
-
value={position?.y || 0}
|
|
133
|
-
/>
|
|
134
|
-
</PanelRow>
|
|
135
|
-
<PanelRow className="reset_row">
|
|
136
|
-
<Button variant="secondary" onClick={() => resetPos()}>
|
|
137
|
-
{__("Reset", "block-collections")}
|
|
138
|
-
</Button>
|
|
139
|
-
</PanelRow>
|
|
140
|
-
</PanelBody>
|
|
141
|
-
</>
|
|
142
|
-
);
|
|
143
|
-
}
|
package/src/GridControls.js
DELETED
|
@@ -1,462 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Button,
|
|
3
|
-
Icon,
|
|
4
|
-
PanelRow,
|
|
5
|
-
ComboboxControl,
|
|
6
|
-
ToolbarDropdownMenu,
|
|
7
|
-
__experimentalNumberControl as NumberControl,
|
|
8
|
-
__experimentalUnitControl as UnitControl,
|
|
9
|
-
__experimentalInputControl as InputControl,
|
|
10
|
-
} from "@wordpress/components";
|
|
11
|
-
|
|
12
|
-
import { useSelect, dispatch } from "@wordpress/data";
|
|
13
|
-
import { useState, useEffect, useRef } from "@wordpress/element";
|
|
14
|
-
|
|
15
|
-
import { __ } from "@wordpress/i18n";
|
|
16
|
-
import { justifyCenter, justifyLeft, justifyRight } from "@wordpress/icons";
|
|
17
|
-
//上よせアイコン
|
|
18
|
-
const upper = <Icon icon={justifyLeft} className="rotate-icon" />;
|
|
19
|
-
//中央よせのアイコン
|
|
20
|
-
const middle = <Icon icon={justifyCenter} className="rotate-icon" />;
|
|
21
|
-
//下よせのアイコン
|
|
22
|
-
const lower = <Icon icon={justifyRight} className="rotate-icon" />;
|
|
23
|
-
// アイコンと文字列キーのマッピングを作成
|
|
24
|
-
const alignIconMap = {
|
|
25
|
-
left: justifyLeft,
|
|
26
|
-
center: justifyCenter,
|
|
27
|
-
right: justifyRight,
|
|
28
|
-
upper: upper,
|
|
29
|
-
middle: middle,
|
|
30
|
-
lower: lower,
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const units = [
|
|
34
|
-
{ value: "px", label: "px" },
|
|
35
|
-
{ value: "em", label: "em" },
|
|
36
|
-
{ value: "rem", label: "rem" },
|
|
37
|
-
];
|
|
38
|
-
|
|
39
|
-
const initializeUnitArray = (rowUnit, length) => {
|
|
40
|
-
if (!Array.isArray(rowUnit)) {
|
|
41
|
-
// rowUnit が配列ではない(undefined を含む)場合、全て "1fr" で埋めた配列を返す
|
|
42
|
-
return Array(length).fill("1fr");
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
return Array.from({ length }, (_, i) => rowUnit[i] || "1fr");
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
//r,cで与えられた座標がgridElmsのどの要素に含まれているかを返す
|
|
49
|
-
const findElementInGrid = (gridElms, r, c) => {
|
|
50
|
-
for (let i = 0; i < gridElms.length; i++) {
|
|
51
|
-
const { startCell, endCell } = gridElms[i];
|
|
52
|
-
// 各座標の最小値と最大値を決定
|
|
53
|
-
const minRow = Math.min(startCell?.rowInx, endCell?.rowInx);
|
|
54
|
-
const maxRow = Math.max(startCell?.rowInx, endCell?.rowInx);
|
|
55
|
-
const minCol = Math.min(startCell?.colInx, endCell?.colInx);
|
|
56
|
-
const maxCol = Math.max(startCell?.colInx, endCell?.colInx);
|
|
57
|
-
|
|
58
|
-
// 座標が範囲内にあるかどうかをチェック
|
|
59
|
-
if (r >= minRow && r <= maxRow && c >= minCol && c <= maxCol) {
|
|
60
|
-
return { index: i, elm: gridElms[i] };
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
return null;
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
//親にイベントを伝播させないラッパー
|
|
67
|
-
const StopPropagationWrapper = ({ children }) => {
|
|
68
|
-
const handleClick = (event) => {
|
|
69
|
-
// イベントの伝播を阻止
|
|
70
|
-
event.stopPropagation();
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
return (
|
|
74
|
-
<div className="itmar_event_stopper" onClick={handleClick}>
|
|
75
|
-
{children}
|
|
76
|
-
</div>
|
|
77
|
-
);
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
const GridControls = ({ attributes, clientId, onChange }) => {
|
|
81
|
-
const { gridElms, rowNum, colNum, rowGap, colGap, rowUnit, colUnit } =
|
|
82
|
-
attributes;
|
|
83
|
-
|
|
84
|
-
//コンポーネント内の行列情報
|
|
85
|
-
const [rowCount, setRowCount] = useState(rowNum);
|
|
86
|
-
const [colCount, setColCount] = useState(colNum);
|
|
87
|
-
|
|
88
|
-
//マウント時検出用フラグ
|
|
89
|
-
const firstFlgRef = useRef(true);
|
|
90
|
-
|
|
91
|
-
//グリッドの配置指定用テーブル要素
|
|
92
|
-
const renderRows = () => {
|
|
93
|
-
//セルが埋まっているかどうかの判定配列
|
|
94
|
-
|
|
95
|
-
const occupied = new Array(rowCount)
|
|
96
|
-
.fill(0)
|
|
97
|
-
.map(() => new Array(colCount).fill(false));
|
|
98
|
-
|
|
99
|
-
let rows = [];
|
|
100
|
-
// 列単位入力行を追加
|
|
101
|
-
let headerCells = [<th key="header-corner"></th>]; // 左上の角の空白セル
|
|
102
|
-
for (let c = 0; c < colCount; c++) {
|
|
103
|
-
headerCells.push(
|
|
104
|
-
<th key={`header-${c}`}>
|
|
105
|
-
<InputControl
|
|
106
|
-
value={colUnit ? colUnit[c] : ""}
|
|
107
|
-
type="text"
|
|
108
|
-
isPressEnterToChange={true}
|
|
109
|
-
onChange={(newValue) => {
|
|
110
|
-
const newArray = [
|
|
111
|
-
...colUnit.slice(0, c),
|
|
112
|
-
newValue,
|
|
113
|
-
...colUnit.slice(c + 1),
|
|
114
|
-
];
|
|
115
|
-
setUnitColArray(newArray);
|
|
116
|
-
}}
|
|
117
|
-
/>
|
|
118
|
-
</th>
|
|
119
|
-
);
|
|
120
|
-
}
|
|
121
|
-
rows.push(<tr key="header-row">{headerCells}</tr>);
|
|
122
|
-
|
|
123
|
-
// 各行とセルの生成
|
|
124
|
-
for (let r = 0; r < rowCount; r++) {
|
|
125
|
-
let cells = [];
|
|
126
|
-
// 行行単位入力を追加
|
|
127
|
-
cells.push(
|
|
128
|
-
<th key={`row-header-${r}`}>
|
|
129
|
-
<InputControl
|
|
130
|
-
value={rowUnit ? rowUnit[r] : ""}
|
|
131
|
-
type="text"
|
|
132
|
-
isPressEnterToChange={true}
|
|
133
|
-
onChange={(newValue) => {
|
|
134
|
-
const newArray = [
|
|
135
|
-
...rowUnit.slice(0, r),
|
|
136
|
-
newValue,
|
|
137
|
-
...rowUnit.slice(r + 1),
|
|
138
|
-
];
|
|
139
|
-
setUnitRowArray(newArray);
|
|
140
|
-
}}
|
|
141
|
-
/>
|
|
142
|
-
</th>
|
|
143
|
-
);
|
|
144
|
-
|
|
145
|
-
// 各行に対するセルを生成
|
|
146
|
-
for (let c = 0; c < colCount; c++) {
|
|
147
|
-
if (occupied[r][c]) {
|
|
148
|
-
continue; // このセルは既に占められているのでスキップ
|
|
149
|
-
}
|
|
150
|
-
//複数のセルを占める設定があればセルの結合オブジェクトを生成
|
|
151
|
-
const setElm = findElementInGrid(gridElms, r, c);
|
|
152
|
-
const rowSpanValue = setElm
|
|
153
|
-
? Math.abs(setElm.elm.startCell.rowInx - setElm.elm.endCell.rowInx)
|
|
154
|
-
: 0;
|
|
155
|
-
const colSpanValue = setElm
|
|
156
|
-
? Math.abs(setElm.elm.startCell.colInx - setElm.elm.endCell.colInx)
|
|
157
|
-
: 0;
|
|
158
|
-
const cellSpan = {
|
|
159
|
-
...(rowSpanValue !== 0 && { rowspan: rowSpanValue + 1 }),
|
|
160
|
-
...(colSpanValue !== 0 && { colspan: colSpanValue + 1 }),
|
|
161
|
-
};
|
|
162
|
-
// 占められるセルの位置を記録
|
|
163
|
-
for (let i = 0; i <= rowSpanValue; i++) {
|
|
164
|
-
for (let j = 0; j <= colSpanValue; j++) {
|
|
165
|
-
if (r + i < rowCount && c + j < colCount) {
|
|
166
|
-
occupied[r + i][c + j] = true;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
//セルを生成
|
|
171
|
-
cells.push(
|
|
172
|
-
<td
|
|
173
|
-
key={`cell-${r}-${c}`}
|
|
174
|
-
{...cellSpan}
|
|
175
|
-
className={isCellSelected(r, c) ? "selected" : ""}
|
|
176
|
-
style={
|
|
177
|
-
setElm
|
|
178
|
-
? {
|
|
179
|
-
backgroundColor: `var(--wp--custom--color--area-${setElm.index})`,
|
|
180
|
-
}
|
|
181
|
-
: undefined
|
|
182
|
-
}
|
|
183
|
-
onClick={() => detectCellPosition(r, c)}
|
|
184
|
-
>
|
|
185
|
-
{setElm && (
|
|
186
|
-
<StopPropagationWrapper>
|
|
187
|
-
<ToolbarDropdownMenu
|
|
188
|
-
label={__("Lateral Alignment", "block-collections")}
|
|
189
|
-
icon={
|
|
190
|
-
setElm.elm.latAlign
|
|
191
|
-
? alignIconMap[setElm.elm.latAlign]
|
|
192
|
-
: alignIconMap["left"]
|
|
193
|
-
}
|
|
194
|
-
controls={["left", "center", "right"].map((align) => ({
|
|
195
|
-
icon: alignIconMap[align],
|
|
196
|
-
isActive: setElm.elm.latAlign === align,
|
|
197
|
-
onClick: () =>
|
|
198
|
-
updateAlignment(setElm.index, align, "latAlign"),
|
|
199
|
-
}))}
|
|
200
|
-
/>
|
|
201
|
-
<ToolbarDropdownMenu
|
|
202
|
-
label={__("Vertical Alignment", "block-collections")}
|
|
203
|
-
icon={
|
|
204
|
-
setElm.elm.vertAlign
|
|
205
|
-
? alignIconMap[setElm.elm.vertAlign]
|
|
206
|
-
: alignIconMap["upper"]
|
|
207
|
-
}
|
|
208
|
-
controls={["upper", "middle", "lower"].map((align) => ({
|
|
209
|
-
icon: alignIconMap[align],
|
|
210
|
-
isActive: setElm.elm.vertAlign === align,
|
|
211
|
-
onClick: () =>
|
|
212
|
-
updateAlignment(setElm.index, align, "vertAlign"),
|
|
213
|
-
}))}
|
|
214
|
-
/>
|
|
215
|
-
</StopPropagationWrapper>
|
|
216
|
-
)}
|
|
217
|
-
</td>
|
|
218
|
-
);
|
|
219
|
-
}
|
|
220
|
-
// 行の追加
|
|
221
|
-
rows.push(<tr key={`row-${r}`}>{cells}</tr>);
|
|
222
|
-
}
|
|
223
|
-
return rows;
|
|
224
|
-
};
|
|
225
|
-
|
|
226
|
-
//テーブルの位置選択関数
|
|
227
|
-
const detectCellPosition = (rowIndex, colIndex) => {
|
|
228
|
-
//インナーブロックの選択がなければリターン
|
|
229
|
-
if (!selBlock) {
|
|
230
|
-
dispatch("core/notices").createNotice(
|
|
231
|
-
"error",
|
|
232
|
-
__("No blocks selected.", "itmar_guest_contact_block"),
|
|
233
|
-
{ type: "snackbar", isDismissible: true }
|
|
234
|
-
);
|
|
235
|
-
return;
|
|
236
|
-
}
|
|
237
|
-
//選択済みのセルが選択されたときはリターン
|
|
238
|
-
if (findElementInGrid(gridElms, rowIndex, colIndex)) {
|
|
239
|
-
dispatch("core/notices").createNotice(
|
|
240
|
-
"error",
|
|
241
|
-
__(
|
|
242
|
-
"That cell is already selected by another block.",
|
|
243
|
-
"itmar_guest_contact_block"
|
|
244
|
-
),
|
|
245
|
-
{ type: "snackbar", isDismissible: true }
|
|
246
|
-
);
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
//選択されたブロックのポジションを記録
|
|
251
|
-
const newBlock = !selBlock.startCell
|
|
252
|
-
? {
|
|
253
|
-
...selBlock,
|
|
254
|
-
startCell: { rowInx: rowIndex, colInx: colIndex },
|
|
255
|
-
endCell: { rowInx: rowIndex, colInx: colIndex },
|
|
256
|
-
}
|
|
257
|
-
: { ...selBlock, endCell: { rowInx: rowIndex, colInx: colIndex } };
|
|
258
|
-
|
|
259
|
-
setSelBlock(newBlock);
|
|
260
|
-
|
|
261
|
-
//blockNamesの更新
|
|
262
|
-
const index = gridElms?.findIndex(
|
|
263
|
-
(block) => block.value === selBlock.value
|
|
264
|
-
);
|
|
265
|
-
const setAreaBlock = [
|
|
266
|
-
...blockNames.slice(0, index),
|
|
267
|
-
newBlock,
|
|
268
|
-
...blockNames.slice(index + 1),
|
|
269
|
-
];
|
|
270
|
-
setBlockNames(setAreaBlock);
|
|
271
|
-
};
|
|
272
|
-
|
|
273
|
-
// セルが選択されているか判断する関数
|
|
274
|
-
const isCellSelected = (rowIndex, colIndex) => {
|
|
275
|
-
if (selBlock) {
|
|
276
|
-
// 各座標の最小値と最大値を決定
|
|
277
|
-
const minRow = Math.min(
|
|
278
|
-
selBlock.startCell?.rowInx,
|
|
279
|
-
selBlock.endCell?.rowInx
|
|
280
|
-
);
|
|
281
|
-
const maxRow = Math.max(
|
|
282
|
-
selBlock.startCell?.rowInx,
|
|
283
|
-
selBlock.endCell?.rowInx
|
|
284
|
-
);
|
|
285
|
-
const minCol = Math.min(
|
|
286
|
-
selBlock.startCell?.colInx,
|
|
287
|
-
selBlock.endCell?.colInx
|
|
288
|
-
);
|
|
289
|
-
const maxCol = Math.max(
|
|
290
|
-
selBlock.startCell?.colInx,
|
|
291
|
-
selBlock.endCell?.colInx
|
|
292
|
-
);
|
|
293
|
-
|
|
294
|
-
// 座標が範囲内にあるかどうかをチェック
|
|
295
|
-
return (
|
|
296
|
-
rowIndex >= minRow &&
|
|
297
|
-
rowIndex <= maxRow &&
|
|
298
|
-
colIndex >= minCol &&
|
|
299
|
-
colIndex <= maxCol
|
|
300
|
-
);
|
|
301
|
-
} else {
|
|
302
|
-
return false;
|
|
303
|
-
}
|
|
304
|
-
};
|
|
305
|
-
|
|
306
|
-
//コンテンツ位置設定
|
|
307
|
-
const updateAlignment = (index, align, derection) => {
|
|
308
|
-
const alignBlock = { ...blockNames[index], [derection]: align };
|
|
309
|
-
const setAlignBlock = [
|
|
310
|
-
...blockNames.slice(0, index),
|
|
311
|
-
alignBlock,
|
|
312
|
-
...blockNames.slice(index + 1),
|
|
313
|
-
];
|
|
314
|
-
setBlockNames(setAlignBlock);
|
|
315
|
-
};
|
|
316
|
-
|
|
317
|
-
//選択したインナーブロック
|
|
318
|
-
const [selBlock, setSelBlock] = useState(null);
|
|
319
|
-
|
|
320
|
-
//インナーブロックを取得
|
|
321
|
-
const parentBlocks = useSelect(
|
|
322
|
-
(select) => {
|
|
323
|
-
const innerBlocks = select("core/block-editor").getBlocks(clientId);
|
|
324
|
-
//インナーブロック入れ替えの際は既に登録したブロックの位置情報があれば、それを付加する。
|
|
325
|
-
const new_block_names = innerBlocks.map((block, index) =>
|
|
326
|
-
gridElms.length > index
|
|
327
|
-
? {
|
|
328
|
-
value: block.clientId,
|
|
329
|
-
label: block.name,
|
|
330
|
-
startCell: gridElms[index].startCell,
|
|
331
|
-
endCell: gridElms[index].endCell,
|
|
332
|
-
latAlign: gridElms[index].latAlign,
|
|
333
|
-
vertAlign: gridElms[index].vertAlign,
|
|
334
|
-
}
|
|
335
|
-
: {
|
|
336
|
-
value: block.clientId,
|
|
337
|
-
label: block.name,
|
|
338
|
-
}
|
|
339
|
-
);
|
|
340
|
-
return new_block_names;
|
|
341
|
-
},
|
|
342
|
-
[clientId]
|
|
343
|
-
);
|
|
344
|
-
const [blockNames, setBlockNames] = useState(parentBlocks);
|
|
345
|
-
|
|
346
|
-
//グリッド配置のクリア
|
|
347
|
-
const clear_placement = () => {
|
|
348
|
-
//ブロックの配置情報削除
|
|
349
|
-
const clear_block = blockNames.map((block) => ({
|
|
350
|
-
value: block.value,
|
|
351
|
-
label: block.label,
|
|
352
|
-
}));
|
|
353
|
-
setBlockNames(clear_block);
|
|
354
|
-
};
|
|
355
|
-
|
|
356
|
-
//単位配列の初期化
|
|
357
|
-
const initRowUnitArray = initializeUnitArray(rowUnit, rowCount);
|
|
358
|
-
const [unitRowArray, setUnitRowArray] = useState(initRowUnitArray);
|
|
359
|
-
const initColUnitArray = initializeUnitArray(colUnit, colCount);
|
|
360
|
-
const [unitColArray, setUnitColArray] = useState(initColUnitArray);
|
|
361
|
-
|
|
362
|
-
//親ブロックへの書き戻し
|
|
363
|
-
useEffect(() => {
|
|
364
|
-
const gridStyle = {
|
|
365
|
-
...attributes,
|
|
366
|
-
gridElms: blockNames,
|
|
367
|
-
rowNum: rowCount,
|
|
368
|
-
colNum: colCount,
|
|
369
|
-
rowUnit: unitRowArray,
|
|
370
|
-
colUnit: unitColArray,
|
|
371
|
-
};
|
|
372
|
-
|
|
373
|
-
onChange(gridStyle);
|
|
374
|
-
}, [blockNames, unitRowArray, unitColArray]);
|
|
375
|
-
|
|
376
|
-
//行と列の数を変えた場合は位置情報を削除・単位の再編成
|
|
377
|
-
useEffect(() => {
|
|
378
|
-
if (!firstFlgRef.current) {
|
|
379
|
-
//マウント時は実行しない
|
|
380
|
-
//ブロックの位置情報クリア
|
|
381
|
-
clear_placement();
|
|
382
|
-
//単位情報の再編成
|
|
383
|
-
const newRowUnitArray = initializeUnitArray(rowUnit, rowCount);
|
|
384
|
-
setUnitRowArray(newRowUnitArray);
|
|
385
|
-
const newColUnitArray = initializeUnitArray(colUnit, colCount);
|
|
386
|
-
setUnitColArray(newColUnitArray);
|
|
387
|
-
} else {
|
|
388
|
-
firstFlgRef.current = false;
|
|
389
|
-
}
|
|
390
|
-
}, [rowCount, colCount]);
|
|
391
|
-
|
|
392
|
-
return (
|
|
393
|
-
<>
|
|
394
|
-
<PanelRow className="distance_row">
|
|
395
|
-
<NumberControl
|
|
396
|
-
onChange={(newValue) => {
|
|
397
|
-
const input_val =
|
|
398
|
-
typeof newValue === "number" ? newValue : Number(newValue);
|
|
399
|
-
setRowCount(input_val);
|
|
400
|
-
}}
|
|
401
|
-
label={__("Number of Row ", "block-collections")}
|
|
402
|
-
value={rowCount}
|
|
403
|
-
min={2}
|
|
404
|
-
/>
|
|
405
|
-
<NumberControl
|
|
406
|
-
onChange={(newValue) => {
|
|
407
|
-
const input_val =
|
|
408
|
-
typeof newValue === "number" ? newValue : Number(newValue);
|
|
409
|
-
setColCount(input_val);
|
|
410
|
-
}}
|
|
411
|
-
label={__("Number of Colum", "block-collections")}
|
|
412
|
-
value={colCount}
|
|
413
|
-
/>
|
|
414
|
-
</PanelRow>
|
|
415
|
-
<PanelRow className="distance_row">
|
|
416
|
-
<UnitControl
|
|
417
|
-
onChange={(newValue) => {
|
|
418
|
-
newValue = newValue != "" ? newValue : "0px";
|
|
419
|
-
const newStyle = { ...attributes, rowGap: newValue };
|
|
420
|
-
onChange(newStyle);
|
|
421
|
-
}}
|
|
422
|
-
label={__("Row Gap", "block-collections")}
|
|
423
|
-
value={rowGap}
|
|
424
|
-
units={units}
|
|
425
|
-
/>
|
|
426
|
-
<UnitControl
|
|
427
|
-
onChange={(newValue) => {
|
|
428
|
-
newValue = newValue != "" ? newValue : "0px";
|
|
429
|
-
const newStyle = { ...attributes, colGap: newValue };
|
|
430
|
-
onChange(newStyle);
|
|
431
|
-
}}
|
|
432
|
-
label={__("Colum Gap", "block-collections")}
|
|
433
|
-
value={colGap}
|
|
434
|
-
units={units}
|
|
435
|
-
/>
|
|
436
|
-
</PanelRow>
|
|
437
|
-
|
|
438
|
-
<PanelRow className="distance_row">
|
|
439
|
-
<p>{__("Element placement", "block-collections")}</p>
|
|
440
|
-
<Button variant="secondary" onClick={clear_placement}>
|
|
441
|
-
{__("Clear", "block-collections")}
|
|
442
|
-
</Button>
|
|
443
|
-
</PanelRow>
|
|
444
|
-
|
|
445
|
-
<PanelRow className="grid_table">
|
|
446
|
-
<table>{renderRows()}</table>
|
|
447
|
-
</PanelRow>
|
|
448
|
-
<ComboboxControl
|
|
449
|
-
label={__("InnerBlock Name", "block-collections")}
|
|
450
|
-
options={blockNames}
|
|
451
|
-
value={selBlock ? selBlock.value : null}
|
|
452
|
-
onChange={(sel_id) => {
|
|
453
|
-
const matchedBlock = blockNames.find(
|
|
454
|
-
(block) => block.value === sel_id
|
|
455
|
-
);
|
|
456
|
-
setSelBlock(matchedBlock);
|
|
457
|
-
}}
|
|
458
|
-
/>
|
|
459
|
-
</>
|
|
460
|
-
);
|
|
461
|
-
};
|
|
462
|
-
export default GridControls;
|