Let's take an example !
To illustrate how to use QbForm in a ReactJs project, this chapter explains how to generate this component:(this is a non-clickable picture)
"field" and "colorSwitch" are generated by QbForm.
"Submit" is a standard HTML button
To shows interactivity integration:
- when the user clicks on "colorSwitch" the background color of fiels turns to yellow
- when the user clicks on "submit", the QbForm data are displayd in an 'alert' box
Note: The whole React project is available here:
https://github.com/abaquesoftware/qbform-test-reactjs
In this chapter, we assume that we have a ReactJs/Typescript project with the following directory structure:
+-- MyProject/ +-- src/ // this directory contains the React components | +-- main.tsx | +-- website/ // this directory contains index.html + required files (js, css,... ) | +-- react/ | | +-- react.js | | +-- react-dom.js | +-- index.html | + ... (other files like package.json, webpack.config.js, README, etc. )
Step 1: Installation
Download the zip file from this page: DownloadAdd 'QbForm-react' directory to your project and 'QbForm' in project/website (with all the js and css files extracted from the downloaded file).
In order to manage QbForn versioning, we recommend to create symlinks from QbForm-... to QbForm-...-<version>
+-- MyProject/ +-- QbForm-react-<version>/ | +-- QbForm-reactjs.js | +-- QbForm-reactjs.js.map | +-- QbForm-reactjs.d.ts | +-- QbForm-reactjs.d.ts.map | +-- QbForm-reactjs/ -> ./QbForm-reactjs-<version> | +-- src/ | +-- main.tsx | +-- website/ | +-- QbForm-<version>/ | | +-- QbForm.js | | +-- QbForm-table.js | | +-- QbForm-default.css | | +-- QbForm-compact.css | | +-- QbForm-dark.css | | +-- QbForm-table-default.css | | +-- QbForm-table-compact.css | | +-- QbForm-table-dark.css | | | +-- QbForm/ -> ./QbForm-<version> | | | +-- react/ | | +-- react.js | | +-- react-dom.js | +-- index.html | + ... (other files like package.json, webpack.config.js, README, etc. )
Step 2: Integration of js scripts and css in HTML code
Edit index.php and add links to QbForm/*.js and QbForm/*.cssWarning: Order matters (QbForm.js before QbForm-table.js)
<html>
<head>
...
<!-- QbForm -->
<script src='./QbForm/QbForm.js'></script>
<link rel="stylesheet" href="./QbForm/QbForm-default.css">
<link rel="stylesheet" href="./QbForm/QbForm-compact.css">
<link rel="stylesheet" href="./QbForm/QbForm-dark.css">
<!-- QbForm-table -->
<script src='./QbForm/QbForm-table.js'></script>
<link rel="stylesheet" href="./QbForm/QbForm-table-default.css">
<link rel="stylesheet" href="./QbForm/QbForm-table-compact.css">
<link rel="stylesheet" href="./QbForm/QbForm-table-dark.css">
<script src="./react/react.js"><script>
<script src="./react/react-dom.js"></script>
...
</head>
...
</body>
</html>
Step 3: Create the app (main) and the component (MyForm)
Edit (or create) 2 files: 'main.tsx' and 'MyForm.tsx'
+-- MyProject/
+-- QbForm-reactjs-<version>/
+-- QbForm-reactjs/ -> ./QbForm-reactjs-<version>
+-- src/
| +-- main.tsx
| +-- MyForm.tsx
|
+-- website/
|
+ ... (other files like package.json, webpack.config.js, README, etc. )
main.tsx
import * as React from 'react' import * as ReactDOM from 'react-dom' import MyForm from './MyForm' ReactDOM.render( <MyForm />, document.getElementById('root') as Element )
MyForm.tsx
import * as React from 'react' import QbForm from '../QbForm-reactjs/QbForm-reactjs' type MyFormProps = { } type MyFormState = { } export default class MyForm extends React.Component<MyFormProps,MyFormState> { qbForm: QbForm static schema: Object = { type: 'object', properties: { field: { type: 'string' }, colorSwitcher: { type: 'boolean', _display: 'switch', _frameTopText: 'Switch the field color to yellow', _border: "solid 2px red" } } } constructor (props: MyFormProps) { super(props) this.qbForm = new QbForm({ Schema: MyForm.schema }) this.qbForm.setCallback('/colorSwitcher', 'onChange', this.changeFieldColor.bind(this)) } changeFieldColor (elementPath: string[], cbName: string, input: object | null): boolean { if (input) { const newValue = input['newValue' as keyof typeof input] if (newValue === 1) { this.qbForm.setProperty('/field','_backgroundColor','yellow') } else { this.qbForm.setProperty('/field','_backgroundColor','#fafaf8') } } return true } submit (): void { alert(JSON.stringify(this.qbForm.getProperty('/', 'value'))) } render () { return ( <div style={ { border: 'solid 2px darkblue', textAlign: 'center', width: '400px', padding: '20px' } }> { this.qbForm.render() } <button onClick={this.submit.bind(this)}>Submit</button> </div>) } }