PluginProbe ʕ •ᴥ•ʔ
VK Blocks / trunk
VK Blocks vtrunk
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 / toc.js
vk-blocks / src / admin Last commit date
balloon 1 week ago block-manager 2 months ago block-style-manager 2 months ago custom-block-style 2 months ago custom-format 2 months ago import-export 2 months ago utils 2 months ago block-category-position.js 2 months ago breadcrumb.js 2 months ago custom-css.js 2 months ago index.js 2 months ago license.js 2 months ago load-separate.js 2 months ago margin.js 2 months ago new-faq.js 2 months ago save-button.js 2 months ago toc.js 2 months ago
toc.js
189 lines
1 /*globals vkBlocksObject */
2 import { __ } from '@wordpress/i18n';
3 import { useContext, useMemo, useCallback } from '@wordpress/element';
4 import { AdminContext } from './index';
5 import {
6 SelectControl,
7 CheckboxControl,
8 RadioControl,
9 } from '@wordpress/components';
10 import { BlockIcon } from '@wordpress/block-editor';
11 import { withSelect } from '@wordpress/data';
12 import { useInstanceId } from '@wordpress/compose';
13 import classnames from 'classnames';
14 import {
15 generateHeadingLevels,
16 getCurrentMaxLevel,
17 } from '@vkblocks/utils/heading-level-utils';
18
19 function AdminToc({ borderBoxBlockType }) {
20 const instanceId = useInstanceId(AdminToc);
21 const { vkBlocksOption, setVkBlocksOption } = useContext(AdminContext);
22
23 // blockJsonのtitleがあったらblockTypesのtitleがあれば
24 const getBlockTitle = useCallback((name, blockTypeTitle) => {
25 // vkBlocksObjectが利用可能な場合
26 if (
27 typeof vkBlocksObject !== 'undefined' &&
28 vkBlocksObject.blockJsonLists
29 ) {
30 const blockJsonList = vkBlocksObject.blockJsonLists.find(
31 (item) => item.name === name
32 );
33 return blockJsonList && blockJsonList.title
34 ? blockJsonList.title
35 : blockTypeTitle;
36 }
37 return blockTypeTitle;
38 }, []);
39
40 // 枠線ブロックのタイトルをメモ化
41 const borderBoxTitle = useMemo(() => {
42 return getBlockTitle(
43 'vk-blocks/border-box',
44 __('Border Box', 'vk-blocks')
45 );
46 }, [getBlockTitle]);
47
48 // ブロックマネージャーと同じ構造のトグル関数
49 const toggleBorderBoxInclusion = useCallback(
50 (nextIsChecked) => {
51 setVkBlocksOption({
52 ...vkBlocksOption,
53 toc_include_border_box: nextIsChecked,
54 });
55 },
56 [vkBlocksOption, setVkBlocksOption]
57 );
58
59 const handleMaxLevelChange = (maxLevel) => {
60 const levels = generateHeadingLevels(maxLevel);
61
62 setVkBlocksOption({
63 ...vkBlocksOption,
64 toc_heading_levels: levels,
65 });
66 };
67
68 const handleNumberingChange = (value) => {
69 setVkBlocksOption({
70 ...vkBlocksOption,
71 toc_numbering: value,
72 });
73 };
74
75 // 現在の最大レベルを取得
76 const getCurrentMaxLevelForAdmin = () => {
77 return getCurrentMaxLevel(vkBlocksOption.toc_heading_levels);
78 };
79
80 return (
81 <section className="vk_admin_page_section" id="toc-setting">
82 <h3>{__('Table of Contents Setting', 'vk-blocks')}</h3>
83 <p>
84 {__(
85 'Please specify a common heading level setting to be used across the site.',
86 'vk-blocks'
87 )}
88 </p>
89 <SelectControl
90 name="vk_blocks_options[toc_heading_levels]"
91 className="vk_admin_selectControl"
92 value={getCurrentMaxLevelForAdmin()}
93 options={[
94 { label: 'H2', value: 'h2' },
95 { label: 'H3', value: 'h3' },
96 { label: 'H4', value: 'h4' },
97 { label: 'H5', value: 'h5' },
98 { label: 'H6', value: 'h6' },
99 ]}
100 onChange={(value) => handleMaxLevelChange(value)}
101 />
102 <p className="description">
103 {__(
104 'Headings from H2 up to the selected level will be included.',
105 'vk-blocks'
106 )}
107 </p>
108 <div style={{ marginTop: '1rem' }}>
109 <h4>{__('Include in Table of Contents', 'vk-blocks')}</h4>
110 <div
111 role="group"
112 aria-labelledby={`toc-block-integration-title-${instanceId}`}
113 className={classnames(
114 'block-manager__category',
115 'blockManagerList'
116 )}
117 >
118 <ul className="block-manager__checklist block-manager__checklist--no-parent">
119 <li className="block-manager__checklist-item block-manager__checklist-item--no-parent">
120 <CheckboxControl
121 __nextHasNoMarginBottom
122 label={
123 <>
124 {borderBoxTitle}
125 {borderBoxBlockType && (
126 <BlockIcon
127 icon={borderBoxBlockType.icon}
128 />
129 )}
130 </>
131 }
132 checked={
133 !!vkBlocksOption?.toc_include_border_box
134 }
135 onChange={toggleBorderBoxInclusion}
136 name="vk_blocks_options[toc_include_border_box]"
137 />
138 </li>
139 </ul>
140 </div>
141 <p className="description">
142 {__(
143 'When enabled, headings within Border Box blocks will be included in the Table of Contents.',
144 'vk-blocks'
145 )}
146 </p>
147 </div>
148 <div style={{ marginTop: '1rem' }}>
149 <h4>{__('Numbering', 'vk-blocks')}</h4>
150 <RadioControl
151 selected={vkBlocksOption?.toc_numbering || 'auto'}
152 options={[
153 {
154 label: __(
155 'Auto (hierarchical numbering)',
156 'vk-blocks'
157 ),
158 value: 'auto',
159 },
160 {
161 label: __('H2 only', 'vk-blocks'),
162 value: 'h2-only',
163 },
164 {
165 label: __('None', 'vk-blocks'),
166 value: 'none',
167 },
168 ]}
169 onChange={handleNumberingChange}
170 />
171 <p className="description">
172 {__(
173 'Choose how numbers are displayed in the Table of Contents.',
174 'vk-blocks'
175 )}
176 </p>
177 </div>
178 </section>
179 );
180 }
181
182 export default withSelect((select) => {
183 const { getBlockType } = select('core/blocks');
184
185 return {
186 borderBoxBlockType: getBlockType('vk-blocks/border-box'),
187 };
188 })(AdminToc);
189