mirror of
				https://gitlab.nic.cz/turris/reforis/foris-js.git
				synced 2025-11-03 23:00:31 +01:00 
			
		
		
		
	Merge branch 'docs' into 'dev'
Fix docs, extract CSS to Foris JS. See merge request turris/reforis/foris-js!10
This commit is contained in:
		@@ -11,6 +11,6 @@ const [value, setValue] = useState(false);
 | 
			
		||||
    value={value}
 | 
			
		||||
    label="Some label" 
 | 
			
		||||
    helpText="Read the small text!"
 | 
			
		||||
    onChange={value => setValue(value)}
 | 
			
		||||
    onChange={event =>setValue(event.target.value)}
 | 
			
		||||
/>
 | 
			
		||||
```
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,7 @@ import React from "react";
 | 
			
		||||
import PropTypes from "prop-types";
 | 
			
		||||
import Datetime from "react-datetime/DateTime";
 | 
			
		||||
import moment from "moment/moment";
 | 
			
		||||
import "react-datetime/css/react-datetime.css";
 | 
			
		||||
 | 
			
		||||
import { Input } from "./Input";
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,7 @@ const [email, setEmail] = useState('Wrong email');
 | 
			
		||||
        value={email}
 | 
			
		||||
        label="Some label" 
 | 
			
		||||
        helpText="Read the small text!"
 | 
			
		||||
        onChange={target => setEmail(target.value)}
 | 
			
		||||
        onChange={event =>setEmail(event.target.value)}
 | 
			
		||||
    />
 | 
			
		||||
    <button type="submit">Try to submit</button>
 | 
			
		||||
</form>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,13 @@
 | 
			
		||||
Bootstrap modal component.
 | 
			
		||||
 | 
			
		||||
I have no idea why example doesn't work here but you can investigate HTML code...
 | 
			
		||||
it's required to have an element `<div id={"modal-container"}/>` somewhere on the page since modals are rendered in portals.
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
    <div id="modal-container"/>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
I have no idea why example doesn't work here but you can investigate HTML code and Foris project.
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
import {ModalHeader, ModalBody, ModalFooter} from './Modal';
 | 
			
		||||
 | 
			
		||||
@@ -8,7 +15,7 @@ import {useState} from 'react';
 | 
			
		||||
const [shown, setShown] = useState(false);
 | 
			
		||||
 | 
			
		||||
<>
 | 
			
		||||
    <Modal shown={shown}>
 | 
			
		||||
    <Modal setShown={setShown} shown={shown}>
 | 
			
		||||
        <ModalHeader setShown={setShown} title='Warning!'/>
 | 
			
		||||
        <ModalBody><p>Bla bla bla...</p></ModalBody>
 | 
			
		||||
        <ModalFooter>
 | 
			
		||||
@@ -19,9 +26,8 @@ const [shown, setShown] = useState(false);
 | 
			
		||||
        </ModalFooter>
 | 
			
		||||
    </Modal>
 | 
			
		||||
    
 | 
			
		||||
    <button 
 | 
			
		||||
        className='btn btn-secondary'
 | 
			
		||||
        onClick={()=>setShown(true)}
 | 
			
		||||
    >Show modal</button>
 | 
			
		||||
    <button className='btn btn-secondary' onClick={()=>setShown(true)}>
 | 
			
		||||
        Show modal
 | 
			
		||||
    </button>
 | 
			
		||||
</>
 | 
			
		||||
```
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								src/bootstrap/NumberInput.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/bootstrap/NumberInput.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
input[type="number"] {
 | 
			
		||||
    -webkit-appearance: textfield;
 | 
			
		||||
    -moz-appearance: textfield;
 | 
			
		||||
    appearance: textfield;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input[type=number]::-webkit-inner-spin-button,
 | 
			
		||||
input[type=number]::-webkit-outer-spin-button {
 | 
			
		||||
    -webkit-appearance: none;
 | 
			
		||||
}
 | 
			
		||||
@@ -9,6 +9,7 @@ import React from "react";
 | 
			
		||||
 | 
			
		||||
import PropTypes from "prop-types";
 | 
			
		||||
import { Input } from "./Input";
 | 
			
		||||
import "./NumberInput.css";
 | 
			
		||||
 | 
			
		||||
NumberInput.propTypes = {
 | 
			
		||||
    /** Field label. */
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,6 @@ const [value, setValue] = useState(42);
 | 
			
		||||
    helpText="Read the small text!"
 | 
			
		||||
    min='33'
 | 
			
		||||
    max='54'
 | 
			
		||||
    onChange={target => setValue(target.value)}
 | 
			
		||||
    onChange={event =>setValue(event.target.value)}
 | 
			
		||||
/>
 | 
			
		||||
```
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,6 @@ const [value, setValue] = useState('secret');
 | 
			
		||||
    value={value}
 | 
			
		||||
    label="Some password" 
 | 
			
		||||
    helpText="Read the small text!"
 | 
			
		||||
    onChange={target => setValue(target.value)}
 | 
			
		||||
    onChange={event =>setValue(event.target.value)}
 | 
			
		||||
/>
 | 
			
		||||
```
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,7 @@ const [value, setValue] = useState(CHOICES[0].value);
 | 
			
		||||
        value={value}
 | 
			
		||||
        name='some-radio'
 | 
			
		||||
        choices={CHOICES}
 | 
			
		||||
        onChange={event=>setValue(event.target.value)}
 | 
			
		||||
        onChange={event =>setValue(event.target.value)}
 | 
			
		||||
    />
 | 
			
		||||
    <p>Selected value: {value}</p>
 | 
			
		||||
</>
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,6 @@ const [value, setValue] = useState('Bla bla');
 | 
			
		||||
    value={value}
 | 
			
		||||
    label="Some text" 
 | 
			
		||||
    helpText="Read the small text!"
 | 
			
		||||
    onChange={event => setValue(event.target.value)}
 | 
			
		||||
    onChange={event =>setValue(event.target.value)}
 | 
			
		||||
/>
 | 
			
		||||
```
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,10 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
 | 
			
		||||
 *
 | 
			
		||||
 * This is free software, licensed under the GNU General Public License v3.
 | 
			
		||||
 * See /LICENSE for more information.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
export const REFORIS_URL_PREFIX = process.env.LIGHTTPD ? "/reforis" : "";
 | 
			
		||||
 | 
			
		||||
export const ForisURLs = {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										73
									
								
								src/form/components/ForisForm.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								src/form/components/ForisForm.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,73 @@
 | 
			
		||||
`<ForisForm/>` is Higher-Order Component which encapsulates entire form logic and provides with children required props.
 | 
			
		||||
This component structure provides comfort API and allows to create typical Foris module forms easily.
 | 
			
		||||
 | 
			
		||||
## Example of usage of `<ForisForm/>`
 | 
			
		||||
You can pass more forms as children.
 | 
			
		||||
```js
 | 
			
		||||
<ForisForm
 | 
			
		||||
    ws={ws}
 | 
			
		||||
    forisConfig={{
 | 
			
		||||
        endpoint: API_URLs.wan,
 | 
			
		||||
        wsModule: "wan",
 | 
			
		||||
    }}
 | 
			
		||||
    prepData={prepData}
 | 
			
		||||
    prepDataToSubmit={prepDataToSubmit}
 | 
			
		||||
    validator={validator}
 | 
			
		||||
>
 | 
			
		||||
    <WANForm />
 | 
			
		||||
    <WAN6Form />
 | 
			
		||||
    <MACForm />
 | 
			
		||||
</ForisForm>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Example of children forms `props` usage
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
export default function MACForm({
 | 
			
		||||
    formData, formErrors, setFormValue, ...props
 | 
			
		||||
}) {
 | 
			
		||||
    const macSettings = formData.mac_settings;
 | 
			
		||||
    const errors = (formErrors || {}).mac_settings || {};
 | 
			
		||||
    return (
 | 
			
		||||
        <>
 | 
			
		||||
            <h3>{_("MAC")}</h3>
 | 
			
		||||
            <CheckBox
 | 
			
		||||
                label={_("Custom MAC address")}
 | 
			
		||||
                checked={macSettings.custom_mac_enabled}
 | 
			
		||||
                helpText={HELP_TEXTS.custom_mac_enabled}
 | 
			
		||||
 | 
			
		||||
                onChange={setFormValue(
 | 
			
		||||
                    (value) => ({ mac_settings: { custom_mac_enabled: { $set: value } } }),
 | 
			
		||||
                )}
 | 
			
		||||
 | 
			
		||||
                {...props}
 | 
			
		||||
            />
 | 
			
		||||
            {macSettings.custom_mac_enabled
 | 
			
		||||
                ? (
 | 
			
		||||
                    <TextInput
 | 
			
		||||
                        label={_("MAC address")}
 | 
			
		||||
                        value={macSettings.custom_mac || ""}
 | 
			
		||||
                        helpText={HELP_TEXTS.custom_mac}
 | 
			
		||||
                        error={errors.custom_mac}
 | 
			
		||||
                        required
 | 
			
		||||
 | 
			
		||||
                        onChange={setFormValue(
 | 
			
		||||
                            (value) => ({ mac_settings: { custom_mac: { $set: value } } }),
 | 
			
		||||
                        )}
 | 
			
		||||
 | 
			
		||||
                        {...props}
 | 
			
		||||
                    />
 | 
			
		||||
                )
 | 
			
		||||
                : null}
 | 
			
		||||
        </>
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
The <ForisForm/> passes subsequent `props` to the child components.
 | 
			
		||||
 | 
			
		||||
| Prop           | Type   | Description                                                                |
 | 
			
		||||
|----------------|--------|----------------------------------------------------------------------------|
 | 
			
		||||
| `formData`     | object | Data returned from API.                                                    |
 | 
			
		||||
| `formErrors`   | object | Errors returned after validation via validator.                            |
 | 
			
		||||
| `setFormValue` | func   | Function for data update. It takes update rule as arg (see example above). |
 | 
			
		||||
| `disabled`     | bool   | Flag to disable form elements (during updates or loadings e.t.c.).         |
 | 
			
		||||
@@ -1,3 +1,10 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
 | 
			
		||||
 *
 | 
			
		||||
 * This is free software, licensed under the GNU General Public License v3.
 | 
			
		||||
 * See /LICENSE for more information.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
// API
 | 
			
		||||
export { useAPIGet } from "api/get";
 | 
			
		||||
export { useAPIPost } from "api/post";
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,10 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
 | 
			
		||||
 *
 | 
			
		||||
 * This is free software, licensed under the GNU General Public License v3.
 | 
			
		||||
 * See /LICENSE for more information.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** Return undefined if object has no keys, otherwise return object. */
 | 
			
		||||
export function undefinedIfEmpty(instance) {
 | 
			
		||||
    if (Object.keys(instance).length > 0) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user