-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcustom-block-attributes.js
More file actions
156 lines (144 loc) · 6.37 KB
/
custom-block-attributes.js
File metadata and controls
156 lines (144 loc) · 6.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
const { addFilter } = wp.hooks;
const { createHigherOrderComponent } = wp.compose;
const { Fragment, createElement } = wp.element;
const { InspectorControls } = wp.blockEditor;
const { PanelBody, TextControl, Button } = wp.components;
const { useState } = wp.element;
// Add custom attribute to all blocks
addFilter(
'blocks.registerBlockType',
'custom-attributes/add-attributes',
function (settings) {
// Add the custom attribute
settings.attributes = Object.assign(settings.attributes || {}, {
customAttributes: {
type: 'object',
default: {}
}
});
return settings;
}
);
// Add custom inspector control panel
const withInspectorControls = createHigherOrderComponent(
function (BlockEdit) {
return function (props) {
// Skip if it's not a block that should have these controls
// You can add conditions here if you only want to target specific blocks
const { attributes, setAttributes } = props;
const customAttributes = attributes.customAttributes || {};
// State for new attribute inputs
const [newKey, setNewKey] = useState('');
const [newValue, setNewValue] = useState('');
const handleChange = function (key, value) {
const newAttributes = Object.assign({}, customAttributes);
newAttributes[key] = value;
setAttributes({ customAttributes: newAttributes });
};
// Function to add a new attribute
const addNewAttribute = function() {
if (newKey.trim()) {
const newAttributes = Object.assign({}, customAttributes);
newAttributes[newKey] = newValue;
setAttributes({ customAttributes: newAttributes });
setNewKey('');
setNewValue('');
}
};
// Function to remove an attribute
const removeAttribute = function(keyToRemove) {
const newAttributes = Object.assign({}, customAttributes);
delete newAttributes[keyToRemove];
setAttributes({ customAttributes: newAttributes });
};
return createElement(
Fragment,
null,
createElement(BlockEdit, props),
createElement(
InspectorControls,
null,
createElement(
PanelBody,
{
title: "Custom HTML Attributes",
initialOpen: false,
className: "custom-html-attributes-panel",
priority: "low" // This ensures it appears at the bottom
},
customAttributes && Object.keys(customAttributes).map(function (key, index) {
return createElement(
'div',
{ key: index, style: { display: 'flex', alignItems: 'flex-end', marginBottom: '8px' } },
createElement(
'div',
{ style: { flexGrow: 1 } },
createElement(TextControl, {
label: key,
value: customAttributes[key],
onChange: function (value) { handleChange(key, value); },
})
),
createElement(Button, {
isDestructive: true,
onClick: function() { removeAttribute(key); },
style: {
marginLeft: '8px',
marginBottom: '4px',
width: '24px',
height: '24px',
padding: '0',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
fontSize: '24px',
transform: 'translateY(-50%)'
}
}, "×")
);
}),
createElement(
'div',
{ style: { marginTop: '16px' } },
createElement(TextControl, {
label: "New Attribute Key",
value: newKey,
onChange: function(value) { setNewKey(value); }
}),
createElement(TextControl, {
label: "New Attribute Value",
value: newValue,
onChange: function(value) { setNewValue(value); }
}),
createElement(Button, {
isPrimary: true,
onClick: addNewAttribute
}, "Add Attribute")
)
)
)
);
};
},
'withInspectorControls'
);
addFilter(
'editor.BlockEdit',
'custom-attributes/with-inspector-controls',
withInspectorControls,
100 // Add high priority to ensure it appears at the bottom
);
// Add custom attributes to block HTML
addFilter(
'blocks.getSaveContent.extraProps',
'custom-attributes/apply-attributes',
function (extraProps, blockType, attributes) {
if (attributes.customAttributes) {
// Apply all custom attributes to the block's HTML
Object.keys(attributes.customAttributes).forEach(function(key) {
extraProps[key] = attributes.customAttributes[key];
});
}
return extraProps;
}
);