PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.3.0
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.3.0
4.0.8 4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.10.1 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14 3.10.15 3.10.2 3.10.3 All 149 releases
visualizer / classes / Visualizer / Gutenberg / src / Editor.js

Editor.js in Visualizer – Tables & Charts Manager with Built-in AI Generator 3.3.0, at classes/Visualizer/Gutenberg/src/Editor.js

486 lines 11.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * External dependencies
3 */
4 import CreateCharts from './Components/CreateCharts.js';
5
6 import Charts from './Components/Charts.js';
7
8 import ChartSelect from './Components/ChartSelect.js';
9
10 import ChartRender from './Components/ChartRender.js';
11
12 import { CSVToArray } from './utils.js';
13
14 /**
15 * WordPress dependencies
16 */
17 const { __ } = wp.i18n;
18
19 const {
20 apiFetch,
21 apiRequest
22 } = wp;
23
24 const {
25 Component,
26 Fragment
27 } = wp.element;
28
29 const {
30 Button,
31 ButtonGroup,
32 Dashicon,
33 Placeholder,
34 Spinner
35 } = wp.components;
36
37 class Editor extends Component {
38 constructor() {
39 super( ...arguments );
40
41 this.getChart = this.getChart.bind( this );
42 this.editChart = this.editChart.bind( this );
43 this.editSettings = this.editSettings.bind( this );
44 this.editPermissions = this.editPermissions.bind( this );
45 this.readUploadedFile = this.readUploadedFile.bind( this );
46 this.editURL = this.editURL.bind( this );
47 this.editSchedule = this.editSchedule.bind( this );
48 this.uploadData = this.uploadData.bind( this );
49 this.getChartData = this.getChartData.bind( this );
50 this.editChartData = this.editChartData.bind( this );
51 this.updateChart = this.updateChart.bind( this );
52
53 this.state = {
54
55 /**
56 * Block Route Status
57 *
58 * home - Initial screen.
59 * createChart - Option to create new charts.
60 * showCharts - Display list of charts to pick.
61 * chartSelect - Chart selected.
62 * renderChart - Chart render.
63 */
64 route: ( this.props.attributes.route ? this.props.attributes.route : 'home' ),
65 chart: null,
66 isModified: false,
67 isLoading: false,
68 isScheduled: false
69 };
70 }
71
72 async componentDidMount() {
73
74 // Fetch review again if block loaded after saving.
75 if ( this.props.attributes.id ) {
76 let result = await apiFetch({ path: `wp/v2/visualizer/${this.props.attributes.id}` });
77
78 this.setState({
79 chart: result['chart_data']
80 });
81 }
82 }
83
84 async getChart( id ) {
85 await this.setState({
86 isLoading: 'getChart'
87 });
88
89 let result = await apiFetch({ path: `wp/v2/visualizer/${id}` });
90
91 this.setState({
92 route: 'chartSelect',
93 chart: result['chart_data'],
94 isLoading: false
95 });
96
97 this.props.setAttributes({
98 id,
99 route: 'chartSelect'
100 });
101 }
102
103 editChart() {
104 this.setState({ route: 'chartSelect' });
105 this.props.setAttributes({ route: 'chartSelect' });
106 }
107
108 editSettings( settings ) {
109 let chart = { ...this.state.chart };
110 chart['visualizer-settings'] = settings;
111 this.setState({
112 chart,
113 isModified: true
114 });
115 }
116
117 editPermissions( permissions ) {
118 let chart = { ...this.state.chart };
119 chart['visualizer-permissions'] = permissions;
120 this.setState({
121 chart,
122 isModified: true
123 });
124 }
125
126 readUploadedFile( e ) {
127 const fileTobeRead = e.current.files[0];
128 const fileReader = new FileReader();
129 fileReader.onload = () => {
130 const data = CSVToArray( fileReader.result );
131 this.editChartData( data, 'Visualizer_Source_Csv' );
132 };
133 fileReader.readAsText( fileTobeRead );
134 }
135
136 editURL( url ) {
137 let chart = { ...this.state.chart };
138 chart['visualizer-chart-url'] = url;
139 this.setState({ chart });
140 }
141
142 editSchedule( schedule ) {
143 let chart = { ...this.state.chart };
144 chart['visualizer-chart-schedule'] = schedule;
145 this.setState({ chart });
146 }
147
148 uploadData( scheduled = false ) {
149 this.setState({
150 isLoading: 'uploadData',
151 isScheduled: scheduled
152 });
153
154 apiRequest({ path: `/visualizer/v1/upload-data?url=${this.state.chart['visualizer-chart-url']}`, method: 'POST' }).then(
155 ( data ) => {
156 if ( 2 <= Object.keys( data ).length ) {
157 let chart = { ...this.state.chart };
158
159 chart['visualizer-source'] = 'Visualizer_Source_Csv_Remote';
160 chart['visualizer-default-data'] = 0;
161 chart['visualizer-series'] = data.series;
162 chart['visualizer-data'] = data.data;
163
164 let series = chart['visualizer-series'];
165 let settings = chart['visualizer-settings'];
166 let map = series;
167 let fieldName = 'series';
168
169 if ( 'pie' === chart['visualizer-chart-type']) {
170 map = chart['visualizer-data'];
171 fieldName = 'slices';
172 }
173
174 map.map( ( i, index ) => {
175 if ( 'pie' !== chart['visualizer-chart-type'] && 0 === index ) {
176 return;
177 }
178
179 const seriesIndex = 'pie' !== chart['visualizer-chart-type'] ? index - 1 : index;
180
181 if ( settings[fieldName][seriesIndex] === undefined ) {
182 settings[fieldName][seriesIndex] = {};
183 settings[fieldName][seriesIndex].temp = 1;
184 }
185 });
186
187 settings[fieldName] = settings[fieldName].filter( ( i, index ) => {
188 const length = 'pie' !== chart['visualizer-chart-type'] ? map.length - 1 : map.length;
189 return index < length;
190 });
191
192 chart['visualizer-settings'] = settings;
193
194 this.setState({
195 chart,
196 isModified: true,
197 isLoading: false
198 });
199
200 return data;
201 }
202
203 this.setState({
204 isLoading: false
205 });
206 },
207 ( err ) => {
208 this.setState({
209 isLoading: false
210 });
211
212 return err;
213 }
214 );
215 }
216
217 async getChartData( id ) {
218 await this.setState({
219 isLoading: 'getChartData'
220 });
221
222 let result = await apiFetch({ path: `wp/v2/visualizer/${id}` });
223
224 let chart = { ...this.state.chart };
225
226 chart['visualizer-source'] = 'Visualizer_Source_Csv';
227 chart['visualizer-default-data'] = 0;
228 chart['visualizer-series'] = result['chart_data']['visualizer-series'];
229 chart['visualizer-data'] = result['chart_data']['visualizer-data'];
230
231 this.setState({
232 isLoading: false,
233 chart
234 });
235 }
236
237 editChartData( chartData, type ) {
238 let chart = { ...this.state.chart };
239 let series = [];
240 let settings = { ...chart['visualizer-settings'] };
241
242 chartData[0].map( ( i, index ) => {
243 series[index] = {
244 label: i,
245 type: chartData[1][index]
246 };
247 });
248
249 chartData.splice( 0, 2 );
250
251 let map = series;
252 let fieldName = 'series';
253
254 if ( 'pie' === chart['visualizer-chart-type']) {
255 map = chartData;
256 fieldName = 'slices';
257 }
258
259 map.map( ( i, index ) => {
260 if ( 'pie' !== chart['visualizer-chart-type'] && 0 === index ) {
261 return;
262 }
263
264 const seriesIndex = 'pie' !== chart['visualizer-chart-type'] ? index - 1 : index;
265
266 if ( settings[fieldName][seriesIndex] === undefined ) {
267 settings[fieldName][seriesIndex] = {};
268 settings[fieldName][seriesIndex].temp = 1;
269 }
270 });
271
272 settings[fieldName] = settings[fieldName].filter( ( i, index ) => {
273 const length = 'pie' !== chart['visualizer-chart-type'] ? map.length - 1 : map.length;
274 return index < length;
275 });
276
277 chart['visualizer-source'] = type;
278 chart['visualizer-default-data'] = 0;
279 chart['visualizer-data'] = chartData;
280 chart['visualizer-series'] = series;
281 chart['visualizer-settings'] = settings;
282 chart['visualizer-chart-url'] = '';
283
284 this.setState({
285 chart,
286 isModified: true,
287 isScheduled: false
288 });
289 }
290
291 updateChart() {
292 this.setState({ isLoading: 'updateChart' });
293
294 const data = this.state.chart;
295
296 if ( false === this.state.isScheduled ) {
297 data['visualizer-chart-schedule'] = '';
298 }
299
300 let fieldName = 'series';
301
302 if ( 'pie' === data['visualizer-chart-type']) {
303 fieldName = 'slices';
304 }
305
306 Object.keys( data['visualizer-settings'][fieldName])
307 .map( i => {
308 if ( data['visualizer-settings'][fieldName][i] !== undefined ) {
309 if ( data['visualizer-settings'][fieldName][i].temp !== undefined ) {
310 delete data['visualizer-settings'][fieldName][i].temp;
311 }
312 }
313 }
314 );
315
316 apiRequest({ path: `/visualizer/v1/update-chart?id=${this.props.attributes.id}`, method: 'POST', data: data }).then(
317 ( data ) => {
318
319 this.setState({
320 isLoading: false,
321 isModified: false
322 });
323
324 return data;
325 },
326 ( err ) => {
327 return err;
328 }
329 );
330 }
331
332 render() {
333 if ( 'renderChart' === this.state.route && null !== this.state.chart ) {
334 return (
335 <ChartRender
336 id={ this.props.attributes.id }
337 chart={ this.state.chart }
338 className={ this.props.className }
339 editChart={ this.editChart }
340 />
341 );
342 }
343
344 return (
345 <div className="visualizer-settings">
346
347 <div className="visualizer-settings__title">
348
349 <Dashicon icon="chart-pie" />
350 { __( 'Visualizer' ) }
351
352 </div>
353
354 { 'home' === this.state.route && (
355 <div className="visualizer-settings__content">
356 <div className="visualizer-settings__content-description">
357 { __( 'Make a new chart or display an existing one?' ) }
358 </div>
359
360 { /* You can apply "locked" class to lock any of the following list items. */ }
361
362 <a
363 href={ visualizerLocalize.adminPage }
364 target="_blank"
365 className="visualizer-settings__content-option"
366 >
367
368 <span className="visualizer-settings__content-option-title">
369 { __( 'Create a new chart' ) }
370 </span>
371
372 <div className="visualizer-settings__content-option-icon">
373 <Dashicon icon="arrow-right-alt2" />
374 </div>
375
376 </a>
377
378 <div
379 className="visualizer-settings__content-option"
380 onClick={ () => {
381 this.setState({ route: 'showCharts' });
382 this.props.setAttributes({ route: 'showCharts' });
383 } }
384 >
385
386 <span className="visualizer-settings__content-option-title">
387 { __( 'Display an existing chart' ) }
388 </span>
389
390 <div className="visualizer-settings__content-option-icon">
391 <Dashicon icon="arrow-right-alt2" />
392 </div>
393
394 </div>
395
396 </div>
397 ) }
398
399 { ( ( 'getChart' === this.state.isLoading ) || ( 'chartSelect' === this.state.route && null === this.state.chart ) || ( 'renderChart' === this.state.route && null === this.state.chart ) ) && (
400 <Placeholder>
401 <Spinner/>
402 </Placeholder>
403 ) }
404
405 { ( 'createChart' === this.state.route && false === this.state.isLoading ) && <CreateCharts/> }
406
407 { ( 'showCharts' === this.state.route && false === this.state.isLoading ) && <Charts getChart={ this.getChart }/> }
408
409 { ( 'chartSelect' === this.state.route && null !== this.state.chart ) &&
410 <ChartSelect
411 id={ this.props.attributes.id }
412 chart={ this.state.chart }
413 editSettings={ this.editSettings }
414 editPermissions={ this.editPermissions }
415 url={ this.state.url }
416 readUploadedFile={ this.readUploadedFile }
417 editURL={ this.editURL }
418 editSchedule={ this.editSchedule }
419 uploadData={ this.uploadData }
420 getChartData={ this.getChartData }
421 editChartData={ this.editChartData }
422 isLoading={ this.state.isLoading }
423 />
424 }
425
426 <div className="visualizer-settings__controls">
427
428 { ( 'createChart' === this.state.route || 'showCharts' === this.state.route || 'chartSelect' === this.state.route ) &&
429 <ButtonGroup>
430
431 <Button
432 isDefault
433 isLarge
434 onClick={ () => {
435 let route;
436 if ( 'createChart' === this.state.route || 'showCharts' === this.state.route ) {
437 route = 'home';
438 } else if ( 'chartSelect' === this.state.route ) {
439 route = 'showCharts';
440 }
441 this.setState({ route });
442 this.props.setAttributes({ route });
443 } }
444 >
445 { __( 'Back' ) }
446 </Button>
447
448 { 'chartSelect' === this.state.route &&
449 <Fragment>
450
451 { false === this.state.isModified ?
452 <Button
453 isDefault
454 isLarge
455 onClick={ () => {
456 this.setState({ route: 'renderChart' });
457 this.props.setAttributes({ route: 'renderChart' });
458 } }
459 >
460 { __( 'Done' ) }
461 </Button> :
462 <Button
463 isPrimary
464 isLarge
465 isBusy={ 'updateChart' === this.state.isLoading }
466 disabled={ 'updateChart' === this.state.isLoading }
467 onClick={ this.updateChart }
468 >
469 { __( 'Save' ) }
470 </Button>
471 }
472
473 </Fragment>
474 }
475
476 </ButtonGroup>
477 }
478
479 </div>
480 </div>
481 );
482 }
483 }
484
485 export default Editor;
486