PluginProbe ʕ •ᴥ•ʔ
VK Blocks / 1.123.0
VK Blocks v1.123.0
1.123.0 1.122.0 1.121.0 1.120.0 1.119.2 1.119.1 1.119.0 1.118.7 1.82.0.0 1.82.0.1 1.83.0.0 1.83.0.1 1.84.0.0 1.84.0.1 1.85.0.2 1.85.0.3 1.85.1.0 1.85.1.1 1.86.0.0 1.86.0.1 1.86.1.0 1.87.0.0 1.87.0.1 1.88.0.1 1.88.0.2 1.89.0.0 1.9.2 1.90.0.0 1.90.0.1 1.90.1.1 1.91.0.0 1.91.1.1 1.92.0.0 1.92.0.1 1.92.1.0 1.92.1.1 1.93.0.0 trunk 1.93.0.1 0.1.1 1.93.1.0 0.10.3 1.93.1.1 0.11.0 1.94.0.0 0.12.6 1.94.0.1 0.15.1 1.94.1.0 0.16.2 1.94.2.1 0.17.6 1.94.2.2 0.2.2 1.95.0.3 0.22.4 1.95.0.4 0.26.7 1.96.2.0 0.3.2 1.96.2.1 0.31.0 1.97.0.1 0.35.5 1.97.0.2 0.37.5 1.99.0.0 0.38.8 1.99.0.1 0.39.4 0.4.7 0.41.0 0.42.0 0.44.13 0.45.2 0.46.1 0.47.0 0.48.0 0.49.8 0.5.2 0.50.3 0.51.0 0.52.2 0.53.2 0.54.0 0.55.0 0.56.2 0.56.3 0.57.6 0.58.10 0.59.0 0.6.0 0.60.1 0.61.2 0.7.1 0.8.2 1.0.16 1.10.0 1.100.0.0 1.100.0.1 1.102.0.0 1.102.0.1 1.103.0.0 1.104.0.0 1.104.0.1 1.105.1.0 1.105.1.1 1.106.0.0 1.106.0.1 1.107.0.0 1.107.0.1 1.107.0.2 1.108.0.0 1.108.0.1 1.109.0.0 1.109.0.1 1.11.4 1.110.0.0 1.110.0.1 1.111.0.0 1.111.0.1 1.111.0.2 1.112.0.0 1.112.0.1 1.113.0.0 1.113.0.1 1.114.0.0 1.114.0.1 1.114.2.0 1.114.2.1 1.115.0.0 1.115.0.1 1.115.1.0 1.115.1.1 1.115.2.0 1.115.2.1 1.116.0.0 1.116.0.1 1.116.1.0 1.116.1.1 1.116.2.0 1.117.0.0 1.117.0.1 1.117.1.0 1.118.2 1.118.5 1.12.0 1.13.2 1.14.1 1.15.1 1.16.11 1.17.0 1.18.6 1.19.0 1.19.1 1.2.3 1.20.7 1.21.0 1.22.4 1.23.0 1.24.5 1.25.1 1.26.2 1.27.7.2 1.28.0.1 1.29.2.0 1.3.9 1.30.0.1 1.31.0.1 1.32.0.2 1.33.2.1 1.36.1.5 1.37.0.0 1.39.2.1 1.4.6 1.40.0.1 1.40.1.0 1.40.1.1 1.41.0.0 1.41.0.1 1.41.2.2 1.41.2.3 1.43.0.0 1.43.0.1 1.43.0.2 1.44.0.0 1.44.0.1 1.45.0.0 1.45.0.1 1.46.0.0 1.46.0.1 1.47.0.0 1.47.0.1 1.47.1.0 1.48.0.0 1.48.0.1 1.48.0.2 1.48.1.0 1.48.1.1 1.5.0 1.50.0.0 1.50.0.1 1.51.0.0 1.51.0.1 1.52.0.0 1.52.0.1 1.53.0.0 1.53.0.1 1.54.0.0 1.54.0.1 1.55.0.0 1.55.0.1 1.56.0.0 1.56.0.1 1.57.0.0 1.57.0.2 1.57.0.3 1.57.0.4 1.57.0.5 1.57.1.0 1.57.1.1 1.57.1.2 1.58.0.0 1.58.0.1 1.59.0.0 1.59.0.1 1.6.0 1.60.0.0 1.60.0.1 1.63.0.0 1.63.0.1 1.64.0.0 1.64.0.1 1.64.1.0 1.64.1.2 1.67.0.0 1.67.0.1 1.68.0.0 1.68.0.1 1.69.0.0 1.69.0.1 1.69.1.1 1.69.1.2 1.7.1 1.70.0.0 1.70.0.1 1.71.0.0 1.71.0.1 1.72.0.0 1.72.1.0 1.72.1.1 1.73.0.0 1.73.0.1 1.74.0.0 1.74.0.1 1.75.0.0 1.75.1.0 1.75.1.1 1.76.0.0 1.76.0.1 1.76.1.0 1.76.1.1 1.76.2.0 1.76.2.1 1.77.0.0 1.77.0.1 1.78.0.0 1.78.0.1 1.79.0.0 1.79.0.1 1.79.0.2 1.79.0.3 1.79.1.0 1.79.1.1 1.8.2 1.80.1.0 1.80.1.1 1.80.1.2 1.81.0.1 1.81.0.2
vk-blocks / src / admin / custom-format / add-item.js
vk-blocks / src / admin / custom-format Last commit date
add-item.js 2 months ago delete-item-button.js 2 months ago index.js 2 months ago preview.js 2 months ago
add-item.js
172 lines
1 /**
2 * WordPress dependencies
3 */
4 import { __ } from '@wordpress/i18n';
5 import { useContext, useState } from '@wordpress/element';
6 import {
7 Button,
8 Modal,
9 TextControl,
10 Flex,
11 FlexItem,
12 } from '@wordpress/components';
13 import { plusCircle } from '@wordpress/icons';
14
15 /**
16 * Internal dependencies
17 */
18 import { AdminContext } from '@vkblocks/admin/index';
19 /*globals vkBlocksObject */
20
21 // 書式設定 初期値
22 const CUSTOM_FORMAT_DEFAULT_OBJ = {
23 title: '',
24 font_weight_bold: false,
25 font_italic: false,
26 font_strikethrough: false,
27 color: '',
28 background_color: '',
29 is_active_highlighter: false,
30 highlighter: vkBlocksObject.highlighterColor,
31 font_size: '',
32 nowrap: false,
33 class_name: '',
34 };
35
36 export const AddItemButton = () => {
37 const { vkBlocksOption, setVkBlocksOption } = useContext(AdminContext);
38 const [isModalOpen, setIsModalOpen] = useState(false);
39 const [title, setTitle] = useState('');
40 const [className, setClassName] = useState('');
41 const [isDisableAdd, setIsDisableAdd] = useState(false);
42 const [errorMessage, setErrorMessage] = useState('');
43
44 const openModal = () => setIsModalOpen(true);
45 // モーダルをクローズしたらstateを初期値に戻す
46 const closeModal = () => {
47 setIsModalOpen(false);
48 setTitle('');
49 setClassName('');
50 setIsDisableAdd(false);
51 setErrorMessage('');
52 };
53
54 const addItem = () => {
55 vkBlocksOption.custom_format_lists.push({
56 ...CUSTOM_FORMAT_DEFAULT_OBJ,
57 ...{
58 class_name: className,
59 title,
60 },
61 });
62 setVkBlocksOption({ ...vkBlocksOption });
63 };
64
65 const validateClassName = (value) => {
66 let bool = true;
67 let message;
68 if (typeof value !== 'string') {
69 bool = false;
70 message = __('Please enter a string', 'vk-blocks');
71 }
72 if (!/^[a-z][a-z0-9-]*$/.test(value)) {
73 bool = false;
74 message = __(
75 'Must begin with an alphabetic character and only alphanumeric characters and hyphens may be used.',
76 'vk-blocks'
77 );
78 }
79 if (value === '') {
80 bool = false;
81 message = __('Class name is required', 'vk-blocks');
82 }
83 // クラス名が既に登録されているか
84 vkBlocksOption.custom_format_lists.forEach((option) => {
85 if (option.class_name === value) {
86 bool = false;
87 message = __('Already registered', 'vk-blocks');
88 }
89 });
90 setIsDisableAdd(bool);
91 setErrorMessage(message);
92 };
93
94 return (
95 <div className="custom_format_lists_item_add">
96 <Button
97 className="add-item-button"
98 icon={plusCircle}
99 iconSize={18}
100 variant="secondary"
101 onClick={openModal}
102 >
103 {__('Add Custom Format', 'vk-blocks')}
104 </Button>
105 {isModalOpen && (
106 <Modal
107 title={__('Add Custom Format', 'vk-blocks')}
108 onRequestClose={closeModal}
109 isDismissible={false}
110 >
111 <div className="custom_format_add_modal">
112 <TextControl
113 className="custom_format_item_class_name"
114 label={__(
115 'CSS class/unique ID (Required/Unchangeable)',
116 'vk-blocks'
117 )}
118 placeholder={__('(e.g.) vk-format-1', 'vk-blocks')}
119 onChange={(value) => {
120 value = value.trim();
121 setClassName(value);
122 validateClassName(value);
123 }}
124 value={className ? className : ''}
125 />
126 {!isDisableAdd && (
127 <p className="custom_format_item_name_error">
128 {errorMessage}
129 </p>
130 )}
131 <TextControl
132 className="custom_format_item_title"
133 label={__(
134 'Toolbar title (Changeable)',
135 'vk-blocks'
136 )}
137 onChange={(value) => {
138 setTitle(value);
139 }}
140 value={title}
141 />
142 <div className="custom_format_add_modal_button_area">
143 <Flex justify="flex-end">
144 <FlexItem>
145 <Button
146 variant="secondary"
147 onClick={closeModal}
148 >
149 {__('Cancel')}
150 </Button>
151 </FlexItem>
152 <FlexItem>
153 <Button
154 onClick={() => {
155 addItem();
156 closeModal();
157 }}
158 variant="primary"
159 disabled={!isDisableAdd}
160 >
161 {__('Add', 'vk-blocks')}
162 </Button>
163 </FlexItem>
164 </Flex>
165 </div>
166 </div>
167 </Modal>
168 )}
169 </div>
170 );
171 };
172