/** * WordPress dependencies */ const { __ } = wp.i18n; const { apiFetch, apiRequest } = wp; const { Component } = wp.element; const { Button, ExternalLink, IconButton, Modal, PanelBody, SelectControl, TextControl } = wp.components; class JSONImport extends Component { constructor() { super( ...arguments ); this.openModal = this.openModal.bind( this ); this.initTable = this.initTable.bind( this ); this.onToggle = this.onToggle.bind( this ); this.toggleHeaders = this.toggleHeaders.bind( this ); this.getJSONRoot = this.getJSONRoot.bind( this ); this.getJSONData = this.getJSONData.bind( this ); this.getTableData = this.getTableData.bind( this ); this.state = { isOpen: false, isLoading: false, isFirstStepOpen: true, isSecondStepOpen: false, isThirdStepOpen: false, isFourthStepOpen: false, isHeaderPanelOpen: false, endpointRoots: [], endpointPaging: [], table: null, requestHeaders: { method: 'GET', username: '', password: '', auth: '' } }; } async openModal() { await this.setState({ isOpen: true }); const table = document.querySelector( '#visualizer-json-query-table' ); if ( this.state.isFourthStepOpen && null !== this.state.table ) { table.innerHTML = this.state.table; this.initTable(); } } initTable() { jQuery( '#visualizer-json-query-table table' ).DataTable({ paging: false, searching: false, ordering: false, select: false, scrollX: '600px', scrollY: '400px', info: false, colReorder: { fixedColumnsLeft: 1 }, dom: 'Bt', buttons: [ { extend: 'colvis', columns: ':gt(0)', collectionLayout: 'four-column' } ] }); } async onToggle( value ) { if ( null === this.state.table && ( this.state.endpointRoots && 0 < this.state.endpointRoots.length ) && ( 'isFirstStepOpen' === value || 'isSecondStepOpen' === value ) ) { this.setState({ isFirstStepOpen: ( 'isFirstStepOpen' === value ? true : false ), isSecondStepOpen: ( 'isSecondStepOpen' === value ? true : false ), isThirdStepOpen: false, isFourthStepOpen: false }); } if ( null !== this.state.table ) { await this.setState({ isFirstStepOpen: ( 'isFirstStepOpen' === value ? true : false ), isSecondStepOpen: ( 'isSecondStepOpen' === value ? true : false ), isThirdStepOpen: ( 'isThirdStepOpen' === value ? true : false ), isFourthStepOpen: ( 'isFourthStepOpen' === value ? true : false ) }); if ( 'isFourthStepOpen' === value ) { const table = document.querySelector( '#visualizer-json-query-table' ); if ( this.state.isFourthStepOpen ) { table.innerHTML = this.state.table; this.initTable(); } } } } toggleHeaders() { this.setState({ isHeaderPanelOpen: ! this.state.isHeaderPanelOpen }); } async getJSONRoot() { this.setState({ isLoading: true, endpointRoots: [], endpointPaging: [], table: null }); let response = await apiRequest({ path: `/visualizer/v1/get-json-root?url=${ this.props.chart['visualizer-json-url'] }`, data: { method: this.props.chart['visualizer-json-headers'] ? this.props.chart['visualizer-json-headers'].method : this.state.requestHeaders.method, username: this.props.chart['visualizer-json-headers'] ? ( 'object' === typeof this.props.chart['visualizer-json-headers'].auth ? this.props.chart['visualizer-json-headers'].auth.username : this.state.requestHeaders.username ) : this.state.requestHeaders.username, password: this.props.chart['visualizer-json-headers'] ? ( 'object' === typeof this.props.chart['visualizer-json-headers'].auth ? this.props.chart['visualizer-json-headers'].auth.password : this.state.requestHeaders.password ) : this.state.requestHeaders.password, auth: this.props.chart['visualizer-json-headers'] ? ( 'object' !== typeof this.props.chart['visualizer-json-headers'].auth ? this.props.chart['visualizer-json-headers'].auth : this.state.requestHeaders.auth ) : this.state.requestHeaders.auth }, method: 'GET' }); if ( response.success ) { const roots = Object.keys( response.data.roots ).map( i => { return { label: response.data.roots[i].replace( />/g, ' ➤ ' ), value: response.data.roots[i] }; }); this.setState({ isLoading: false, isFirstStepOpen: false, isSecondStepOpen: true, endpointRoots: roots }); } else { this.setState({ isLoading: false }); alert( response.data.msg ); } } async getJSONData() { this.setState({ isLoading: true }); let response = await apiRequest({ path: `/visualizer/v1/get-json-data?url=${ this.props.chart['visualizer-json-url'] }&chart=${ this.props.id }`, data: { root: this.props.chart['visualizer-json-root'] || this.state.endpointRoots[0].value, method: this.props.chart['visualizer-json-headers'] ? this.props.chart['visualizer-json-headers'].method : this.state.requestHeaders.method, username: this.props.chart['visualizer-json-headers'] ? ( 'object' === typeof this.props.chart['visualizer-json-headers'].auth ? this.props.chart['visualizer-json-headers'].auth.username : this.state.requestHeaders.username ) : this.state.requestHeaders.username, password: this.props.chart['visualizer-json-headers'] ? ( 'object' === typeof this.props.chart['visualizer-json-headers'].auth ? this.props.chart['visualizer-json-headers'].auth.password : this.state.requestHeaders.password ) : this.state.requestHeaders.password, auth: this.props.chart['visualizer-json-headers'] ? ( 'object' !== typeof this.props.chart['visualizer-json-headers'].auth ? this.props.chart['visualizer-json-headers'].auth : this.state.requestHeaders.auth ) : this.state.requestHeaders.auth }, method: 'GET' }); if ( response.success ) { const paging = [ { label: __( 'Don\'t use pagination' ), value: 0 } ]; if ( response.data.paging && 'root>next' === response.data.paging[0]) { paging.push( { label: __( 'Get first 5 pages using root ➤ next' ), value: 'root>next' } ); } this.setState({ isLoading: false, isSecondStepOpen: false, isFourthStepOpen: true, endpointPaging: paging, table: response.data.table }); const table = document.querySelector( '#visualizer-json-query-table' ); table.innerHTML = response.data.table; this.initTable(); } else { this.setState({ isLoading: false }); alert( response.data.msg ); } } async getTableData() { this.setState({ isLoading: true }); const columns = document.querySelectorAll( '#visualizer-json-query-table input' ); const select = document.querySelectorAll( '#visualizer-json-query-table select' ); const header = []; const type = {}; columns.forEach( column => header.push( column.value ) ); select.forEach( el => type[el.name] = el.value ); let response = await apiRequest({ path: '/visualizer/v1/set-json-data', data: { url: this.props.chart['visualizer-json-url'], method: this.props.chart['visualizer-json-headers'] ? this.props.chart['visualizer-json-headers'].method : this.state.requestHeaders.method, username: this.props.chart['visualizer-json-headers'] ? ( 'object' === typeof this.props.chart['visualizer-json-headers'].auth ? this.props.chart['visualizer-json-headers'].auth.username : this.state.requestHeaders.username ) : this.state.requestHeaders.username, password: this.props.chart['visualizer-json-headers'] ? ( 'object' === typeof this.props.chart['visualizer-json-headers'].auth ? this.props.chart['visualizer-json-headers'].auth.password : this.state.requestHeaders.password ) : this.state.requestHeaders.password, auth: this.props.chart['visualizer-json-headers'] ? ( 'object' !== typeof this.props.chart['visualizer-json-headers'].auth ? this.props.chart['visualizer-json-headers'].auth : this.state.requestHeaders.auth ) : this.state.requestHeaders.auth, root: this.props.chart['visualizer-json-root'] || this.state.endpointRoots[0].value, paging: this.props.chart['visualizer-json-paging'] || 0, header, ...type }, method: 'GET' }); if ( response.success ) { this.props.JSONImportData( response.data.name, JSON.parse( response.data.series ), JSON.parse( response.data.data ) ); this.setState({ isOpen: false, isLoading: false }); } else { alert( response.data.msg ); this.setState({ isLoading: false }); } } render() { return ( ( 'community' !== visualizerLocalize.isPro ) ? (

{ __( 'You can choose here to import or synchronize your chart data with a remote JSON source.' ) }

{ __( 'For more info check this tutorial.' ) }

{ this.state.isOpen && ( { this.setState({ isOpen: false, isTableRendered: false }); } } > this.onToggle( 'isFirstStepOpen' ) } >

{ __( 'If you want to add authentication, add headers to the endpoint or change the request in any way, please refer to our document here:' ) }

{ __( 'How to extend REST endpoints with JSON response' ) }

{ __( 'Add Headers' ) } { this.state.isHeaderPanelOpen && (
{ let headers = { ...this.state.requestHeaders }; let headersState = this.state.requestHeaders; headers.method = e; headersState = { ...headersState, method: e }; this.setState({ requestHeaders: headersState }); this.props.editJSONHeaders( headers ); } } />

{ __( 'Credentials' ) }

{ let headers = { ...this.state.requestHeaders }; let headersState = this.state.requestHeaders; headers.auth = { username: e, password: this.props.chart['visualizer-json-headers'] ? ( 'object' === typeof this.props.chart['visualizer-json-headers'].auth ? this.props.chart['visualizer-json-headers'].auth.password : this.state.requestHeaders.password ) : this.state.requestHeaders.password }; headersState = { ...headersState, username: e, password: headers.password }; this.setState({ requestHeaders: headersState }); this.props.editJSONHeaders( headers ); } } /> { __( '&' ) } { let headers = { ...this.state.requestHeaders }; let headersState = this.state.requestHeaders; headers.auth = { username: this.props.chart['visualizer-json-headers'] ? ( 'object' === typeof this.props.chart['visualizer-json-headers'].auth ? this.props.chart['visualizer-json-headers'].auth.username : this.state.requestHeaders.username ) : this.state.requestHeaders.username, password: e }; headersState = { ...headersState, username: headers.username, password: e }; this.setState({ requestHeaders: headersState }); this.props.editJSONHeaders( headers ); } } />

{ __( 'OR' ) }

:' ) } value={ this.props.chart['visualizer-json-headers'] ? ( 'object' !== typeof this.props.chart['visualizer-json-headers'].auth ? this.props.chart['visualizer-json-headers'].auth : this.state.requestHeaders.auth ) : this.state.requestHeaders.auth } onChange={ e => { let headers = { ...this.state.requestHeaders }; let headersState = this.state.requestHeaders; headers.auth = e; headersState = { ...headersState, auth: e }; this.setState({ requestHeaders: headersState }); this.props.editJSONHeaders( headers ); } } />
) }
this.onToggle( 'isSecondStepOpen' ) } >

{ __( 'If you see Invalid Data, you may have selected the wrong root to fetch data from. Please select an alternative.' ) }

this.onToggle( 'isThirdStepOpen' ) } > { ( 'community' !== visualizerLocalize.isPro ) ? ( ) : (

{ __( 'Enable this feature in PRO version!' ) }

) }
this.onToggle( 'isFourthStepOpen' ) } >
  • { __( 'Select whether to include the data in the chart. Each column selected will form one series.' ) }
  • { __( 'If a column is selected to be included, specify its data type.' ) }
  • { __( 'You can use drag/drop to reorder the columns but this column position is not saved. So when you reload the table, you may have to reorder again.' ) }
  • { __( 'You can select any number of columns but the chart type selected will determine how many will display in the chart.' ) }
)}
) : (

{ __( 'Enable this feature in PRO version!' ) }

) ); } } export default JSONImport;