mirror of
https://gitlab.nic.cz/turris/reforis/foris-js.git
synced 2024-12-26 00:21:36 +01:00
Set modules.
This commit is contained in:
parent
7b38c1658c
commit
19df5c2630
|
@ -1,9 +1,21 @@
|
||||||
module.exports = {
|
module.exports = {
|
||||||
presets: [
|
presets: [
|
||||||
'@babel/preset-env',
|
["@babel/preset-env", {
|
||||||
'@babel/preset-react',
|
targets: {
|
||||||
|
esmodules: true,
|
||||||
|
},
|
||||||
|
}],
|
||||||
|
"@babel/preset-react",
|
||||||
],
|
],
|
||||||
plugins: [
|
plugins: [
|
||||||
'@babel/plugin-transform-runtime'
|
"@babel/plugin-syntax-export-default-from",
|
||||||
]
|
"@babel/plugin-transform-runtime",
|
||||||
|
["module-resolver", {
|
||||||
|
root: ["./src"],
|
||||||
|
alias: {
|
||||||
|
test: "./test",
|
||||||
|
underscore: "lodash",
|
||||||
|
},
|
||||||
|
}],
|
||||||
|
],
|
||||||
};
|
};
|
||||||
|
|
70
package-lock.json
generated
70
package-lock.json
generated
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "foris",
|
"name": "foris",
|
||||||
"version": "0.0.1",
|
"version": "0.0.2",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
@ -417,6 +417,15 @@
|
||||||
"@babel/helper-plugin-utils": "^7.0.0"
|
"@babel/helper-plugin-utils": "^7.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@babel/plugin-syntax-export-default-from": {
|
||||||
|
"version": "7.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.2.0.tgz",
|
||||||
|
"integrity": "sha512-c7nqUnNST97BWPtoe+Ssi+fJukc9P9/JMZ71IOMNQWza2E+Psrd46N6AEvtw6pqK+gt7ChjXyrw4SPDO79f3Lw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/helper-plugin-utils": "^7.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@babel/plugin-syntax-json-strings": {
|
"@babel/plugin-syntax-json-strings": {
|
||||||
"version": "7.2.0",
|
"version": "7.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz",
|
||||||
|
@ -1864,6 +1873,19 @@
|
||||||
"@types/babel__traverse": "^7.0.6"
|
"@types/babel__traverse": "^7.0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"babel-plugin-module-resolver": {
|
||||||
|
"version": "3.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz",
|
||||||
|
"integrity": "sha512-tjR0GvSndzPew/Iayf4uICWZqjBwnlMWjSx6brryfQ81F9rxBVqwDJtFCV8oOs0+vJeefK9TmdZtkIFdFe1UnA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"find-babel-config": "^1.1.0",
|
||||||
|
"glob": "^7.1.2",
|
||||||
|
"pkg-up": "^2.0.0",
|
||||||
|
"reselect": "^3.0.1",
|
||||||
|
"resolve": "^1.4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"babel-plugin-react-transform": {
|
"babel-plugin-react-transform": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/babel-plugin-react-transform/-/babel-plugin-react-transform-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/babel-plugin-react-transform/-/babel-plugin-react-transform-3.0.0.tgz",
|
||||||
|
@ -3418,6 +3440,28 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"eslint-config-airbnb": {
|
||||||
|
"version": "18.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.0.1.tgz",
|
||||||
|
"integrity": "sha512-hLb/ccvW4grVhvd6CT83bECacc+s4Z3/AEyWQdIT2KeTsG9dR7nx1gs7Iw4tDmGKozCNHFn4yZmRm3Tgy+XxyQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"eslint-config-airbnb-base": "^14.0.0",
|
||||||
|
"object.assign": "^4.1.0",
|
||||||
|
"object.entries": "^1.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"eslint-config-airbnb-base": {
|
||||||
|
"version": "14.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.0.0.tgz",
|
||||||
|
"integrity": "sha512-2IDHobw97upExLmsebhtfoD3NAKhV4H0CJWP3Uprd/uk+cHuWYOczPVxQ8PxLFUAw7o3Th1RAU8u1DoUpr+cMA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"confusing-browser-globals": "^1.0.7",
|
||||||
|
"object.assign": "^4.1.0",
|
||||||
|
"object.entries": "^1.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"eslint-config-react-app": {
|
"eslint-config-react-app": {
|
||||||
"version": "4.0.1",
|
"version": "4.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-4.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-4.0.1.tgz",
|
||||||
|
@ -4233,6 +4277,24 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"find-babel-config": {
|
||||||
|
"version": "1.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz",
|
||||||
|
"integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"json5": "^0.5.1",
|
||||||
|
"path-exists": "^3.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"json5": {
|
||||||
|
"version": "0.5.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
|
||||||
|
"integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"find-cache-dir": {
|
"find-cache-dir": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
|
||||||
|
@ -9013,6 +9075,12 @@
|
||||||
"integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
|
"integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"reselect": {
|
||||||
|
"version": "3.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/reselect/-/reselect-3.0.1.tgz",
|
||||||
|
"integrity": "sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"resolve": {
|
"resolve": {
|
||||||
"version": "1.12.0",
|
"version": "1.12.0",
|
||||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
|
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "foris",
|
"name": "foris",
|
||||||
"version": "0.0.1",
|
"version": "0.0.2",
|
||||||
"description": "Set of components and utils for Foris and its plugins.",
|
"description": "Set of components and utils for Foris and its plugins.",
|
||||||
"author": "CZ.NIC, z.s.p.o.",
|
"author": "CZ.NIC, z.s.p.o.",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -31,6 +31,7 @@
|
||||||
"@babel/cli": "^7.4.4",
|
"@babel/cli": "^7.4.4",
|
||||||
"@babel/core": "^7.4.5",
|
"@babel/core": "^7.4.5",
|
||||||
"@babel/plugin-proposal-class-properties": "^7.4.4",
|
"@babel/plugin-proposal-class-properties": "^7.4.4",
|
||||||
|
"@babel/plugin-syntax-export-default-from": "^7.2.0",
|
||||||
"@babel/plugin-transform-runtime": "^7.4.4",
|
"@babel/plugin-transform-runtime": "^7.4.4",
|
||||||
"@babel/preset-env": "^7.4.5",
|
"@babel/preset-env": "^7.4.5",
|
||||||
"@babel/preset-react": "^7.0.0",
|
"@babel/preset-react": "^7.0.0",
|
||||||
|
@ -38,9 +39,11 @@
|
||||||
"babel-eslint": "^9.0.0",
|
"babel-eslint": "^9.0.0",
|
||||||
"babel-jest": "^24.8.0",
|
"babel-jest": "^24.8.0",
|
||||||
"babel-loader": "^8.0.6",
|
"babel-loader": "^8.0.6",
|
||||||
|
"babel-plugin-module-resolver": "^3.2.0",
|
||||||
"babel-plugin-react-transform": "^3.0.0",
|
"babel-plugin-react-transform": "^3.0.0",
|
||||||
"babel-polyfill": "^6.26.0",
|
"babel-polyfill": "^6.26.0",
|
||||||
"eslint": "^5.16.0",
|
"eslint": "^5.16.0",
|
||||||
|
"eslint-config-airbnb": "^18.0.1",
|
||||||
"eslint-config-react-app": "^4.0.1",
|
"eslint-config-react-app": "^4.0.1",
|
||||||
"eslint-plugin-flowtype": "^2.50.3",
|
"eslint-plugin-flowtype": "^2.50.3",
|
||||||
"eslint-plugin-import": "^2.17.3",
|
"eslint-plugin-import": "^2.17.3",
|
||||||
|
@ -57,7 +60,7 @@
|
||||||
"snapshot-diff": "^0.5.1"
|
"snapshot-diff": "^0.5.1"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "babel ./src --out-dir ./dist -s inline",
|
"build": "rm -rf dist; babel src --out-dir dist --ignore '**/__tests__' --source-maps inline",
|
||||||
"prepare": "rm -rf ./dist && npm run build",
|
"prepare": "rm -rf ./dist && npm run build",
|
||||||
"lint": "eslint src",
|
"lint": "eslint src",
|
||||||
"test": "jest",
|
"test": "jest",
|
||||||
|
@ -65,6 +68,6 @@
|
||||||
"test:coverage": "jest --coverage --colors"
|
"test:coverage": "jest --coverage --colors"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist/**"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,8 @@
|
||||||
|
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import { useCallback, useReducer } from "react";
|
import { useCallback, useReducer } from "react";
|
||||||
import {ForisURLs} from './constants';
|
|
||||||
|
import { ForisUrls } from "forisUrls";
|
||||||
|
|
||||||
|
|
||||||
const POST_HEADERS = {
|
const POST_HEADERS = {
|
||||||
|
@ -56,7 +57,7 @@ const APIGetReducer = (state, action) => {
|
||||||
data: action.payload,
|
data: action.payload,
|
||||||
};
|
};
|
||||||
case API_ACTIONS.FAILURE:
|
case API_ACTIONS.FAILURE:
|
||||||
if (action.status === 403) window.location.assign(ForisURLs.login);
|
if (action.status === 403) window.location.assign(ForisUrls.login);
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
isLoading: false,
|
isLoading: false,
|
||||||
|
@ -117,7 +118,7 @@ const APIPostReducer = (state, action) => {
|
||||||
data: action.payload,
|
data: action.payload,
|
||||||
};
|
};
|
||||||
case API_ACTIONS.FAILURE:
|
case API_ACTIONS.FAILURE:
|
||||||
if (action.status === 403) window.location.assign(ForisURLs.login);
|
if (action.status === 403) window.location.assign(ForisUrls.login);
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
isSending: false,
|
isSending: false,
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
export * from "./hooks";
|
|
|
@ -22,7 +22,7 @@ Alert.propTypes = {
|
||||||
onDismiss: PropTypes.func
|
onDismiss: PropTypes.func
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function Alert({type, message, onDismiss, children}) {
|
export function Alert({type, message, onDismiss, children}) {
|
||||||
return <div className={`alert alert-dismissible alert-${type}`}>
|
return <div className={`alert alert-dismissible alert-${type}`}>
|
||||||
{onDismiss ? <button type="button" className="close" onClick={onDismiss}>×</button> : false}
|
{onDismiss ? <button type="button" className="close" onClick={onDismiss}>×</button> : false}
|
||||||
{message}
|
{message}
|
|
@ -29,7 +29,7 @@ Button.propTypes = {
|
||||||
]).isRequired
|
]).isRequired
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function Button({className, loading, forisFormSize, children, ...props}) {
|
export function Button({className, loading, forisFormSize, children, ...props}) {
|
||||||
className = className ? 'btn ' + className : 'btn btn-primary ';
|
className = className ? 'btn ' + className : 'btn btn-primary ';
|
||||||
if (forisFormSize)
|
if (forisFormSize)
|
||||||
className += SIZE_CLASS + SIZE_CLASS_SM;
|
className += SIZE_CLASS + SIZE_CLASS_SM;
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import {useUID} from 'react-uid/dist/es5/index';
|
import {useUID} from 'react-uid';
|
||||||
|
|
||||||
import {formFieldsSize} from './constants';
|
import {formFieldsSize} from './constants';
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ CheckBox.defaultProps = {
|
||||||
disabled: false
|
disabled: false
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function CheckBox({label, helpText, useDefaultSize, disabled, ...props}) {
|
export function CheckBox({label, helpText, useDefaultSize, disabled, ...props}) {
|
||||||
const uid = useUID();
|
const uid = useUID();
|
||||||
return <div className={useDefaultSize ? formFieldsSize : ""} style={{marginBottom: '1rem'}}>
|
return <div className={useDefaultSize ? formFieldsSize : ""} style={{marginBottom: '1rem'}}>
|
||||||
<div className='custom-control custom-checkbox' style={{marginBottom: '0'}}>
|
<div className='custom-control custom-checkbox' style={{marginBottom: '0'}}>
|
|
@ -10,7 +10,7 @@ import PropTypes from 'prop-types';
|
||||||
import Datetime from 'react-datetime/DateTime';
|
import Datetime from 'react-datetime/DateTime';
|
||||||
import moment from 'moment/moment';
|
import moment from 'moment/moment';
|
||||||
|
|
||||||
import Input from './Input';
|
import {Input} from './Input';
|
||||||
|
|
||||||
DataTimeInput.propTypes = {
|
DataTimeInput.propTypes = {
|
||||||
/** Field label. */
|
/** Field label. */
|
||||||
|
@ -35,7 +35,7 @@ DataTimeInput.propTypes = {
|
||||||
const DEFAULT_DATE_FORMAT = 'YYYY-MM-DD';
|
const DEFAULT_DATE_FORMAT = 'YYYY-MM-DD';
|
||||||
const DEFAULT_TIME_FORMAT = 'HH:mm:ss';
|
const DEFAULT_TIME_FORMAT = 'HH:mm:ss';
|
||||||
|
|
||||||
export default function DataTimeInput({value, onChange, isValidDate, dateFormat, timeFormat, children, ...props}) {
|
export function DataTimeInput({value, onChange, isValidDate, dateFormat, timeFormat, children, ...props}) {
|
||||||
function renderInput(datetimeProps) {
|
function renderInput(datetimeProps) {
|
||||||
return <Input
|
return <Input
|
||||||
{...props}
|
{...props}
|
|
@ -7,11 +7,10 @@
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
import Input from './Input';
|
import {Input} from './Input';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
const EmailInput = ({...props}) => <Input type="email" {...props}/>;
|
export const EmailInput = ({...props}) => <Input type="email" {...props}/>;
|
||||||
|
|
||||||
|
|
||||||
EmailInput.propTypes = {
|
EmailInput.propTypes = {
|
||||||
/** Field label. */
|
/** Field label. */
|
||||||
|
@ -23,5 +22,3 @@ EmailInput.propTypes = {
|
||||||
/** Email value. */
|
/** Email value. */
|
||||||
value: PropTypes.string,
|
value: PropTypes.string,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default EmailInput;
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import {useUID} from 'react-uid/dist/es5/index';
|
import {useUID} from 'react-uid';
|
||||||
import {formFieldsSize} from './constants';
|
import {formFieldsSize} from './constants';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ Input.propTypes = {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Base bootstrap input component. */
|
/** Base bootstrap input component. */
|
||||||
export default function Input({type, label, helpText, error, className, children, ...props}) {
|
export function Input({type, label, helpText, error, className, children, ...props}) {
|
||||||
const uid = useUID();
|
const uid = useUID();
|
||||||
const inputClassName = `form-control ${className ? className : ''} ${(error ? 'is-invalid' : '')}`.trim();
|
const inputClassName = `form-control ${className ? className : ''} ${(error ? 'is-invalid' : '')}`.trim();
|
||||||
return <div className={formFieldsSize}>
|
return <div className={formFieldsSize}>
|
|
@ -7,7 +7,8 @@
|
||||||
|
|
||||||
import React, {useEffect, useRef} from 'react';
|
import React, {useEffect, useRef} from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import Portal from 'utils/Portal';
|
|
||||||
|
import {Portal} from 'utils/Portal';
|
||||||
|
|
||||||
Modal.propTypes = {
|
Modal.propTypes = {
|
||||||
/** Is modal shown value */
|
/** Is modal shown value */
|
|
@ -7,10 +7,10 @@
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
import Input from './Input';
|
import {Input} from './Input';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
const NumberInput = ({...props}) => <Input type="number" {...props}/>;
|
export const NumberInput = ({...props}) => <Input type="number" {...props}/>;
|
||||||
|
|
||||||
NumberInput.propTypes = {
|
NumberInput.propTypes = {
|
||||||
/** Field label. */
|
/** Field label. */
|
||||||
|
@ -25,5 +25,3 @@ NumberInput.propTypes = {
|
||||||
PropTypes.number,
|
PropTypes.number,
|
||||||
]),
|
]),
|
||||||
};
|
};
|
||||||
|
|
||||||
export default NumberInput;
|
|
|
@ -8,7 +8,7 @@
|
||||||
import React, {useState} from 'react';
|
import React, {useState} from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import Input from './Input';
|
import {Input} from './Input';
|
||||||
|
|
||||||
PasswordInput.propTypes = {
|
PasswordInput.propTypes = {
|
||||||
/** Field label. */
|
/** Field label. */
|
||||||
|
@ -23,7 +23,7 @@ PasswordInput.propTypes = {
|
||||||
withEye: PropTypes.bool,
|
withEye: PropTypes.bool,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function PasswordInput({withEye, ...props}) {
|
export function PasswordInput({withEye, ...props}) {
|
||||||
const [isHidden, setHidden] = useState(true);
|
const [isHidden, setHidden] = useState(true);
|
||||||
return <Input
|
return <Input
|
||||||
type={withEye ? isHidden ? 'password' : 'text' : 'password'}
|
type={withEye ? isHidden ? 'password' : 'text' : 'password'}
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import {useUID} from 'react-uid/dist/es5/index';
|
import {useUID} from 'react-uid';
|
||||||
|
|
||||||
import {formFieldsSize} from './constants';
|
import {formFieldsSize} from './constants';
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ RadioSet.propTypes = {
|
||||||
helpText: PropTypes.string,
|
helpText: PropTypes.string,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function RadioSet({name, label, choices, value, helpText, ...props}) {
|
export function RadioSet({name, label, choices, value, helpText, ...props}) {
|
||||||
const uid = useUID();
|
const uid = useUID();
|
||||||
const radios = choices.map((choice, key) =>
|
const radios = choices.map((choice, key) =>
|
||||||
<Radio
|
<Radio
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import {useUID} from 'react-uid/dist/es5/index';
|
import {useUID} from 'react-uid';
|
||||||
|
|
||||||
|
|
||||||
Select.propTypes = {
|
Select.propTypes = {
|
||||||
|
@ -24,7 +24,7 @@ Select.propTypes = {
|
||||||
helpText: PropTypes.string,
|
helpText: PropTypes.string,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function Select({label, choices, helpText, ...props}) {
|
export function Select({label, choices, helpText, ...props}) {
|
||||||
const uid = useUID();
|
const uid = useUID();
|
||||||
|
|
||||||
const options = Object.keys(choices).map(
|
const options = Object.keys(choices).map(
|
|
@ -23,7 +23,7 @@ Spinner.defaultProps = {
|
||||||
fullScreen: false,
|
fullScreen: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function Spinner({fullScreen, children, className, ...props}) {
|
export function Spinner({fullScreen, children, className, ...props}) {
|
||||||
if (!fullScreen) {
|
if (!fullScreen) {
|
||||||
return <div className={'spinner-wrapper ' + (className ? className : '')} {...props}>
|
return <div className={'spinner-wrapper ' + (className ? className : '')} {...props}>
|
||||||
<SpinnerElement>{children}</SpinnerElement>
|
<SpinnerElement>{children}</SpinnerElement>
|
|
@ -8,10 +8,10 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import Input from './Input';
|
import {Input} from './Input';
|
||||||
|
|
||||||
|
|
||||||
const TextInput = ({...props}) => <Input type="text" {...props}/>;
|
export const TextInput = ({...props}) => <Input type="text" {...props}/>;
|
||||||
|
|
||||||
|
|
||||||
TextInput.propTypes = {
|
TextInput.propTypes = {
|
||||||
|
@ -22,5 +22,3 @@ TextInput.propTypes = {
|
||||||
/** Help text message. */
|
/** Help text message. */
|
||||||
helpText: PropTypes.string,
|
helpText: PropTypes.string,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default TextInput;
|
|
|
@ -9,7 +9,7 @@ import React from 'react';
|
||||||
|
|
||||||
import {render} from 'customTestRender';
|
import {render} from 'customTestRender';
|
||||||
|
|
||||||
import Button from '../components/Button'
|
import Button from '../Button'
|
||||||
|
|
||||||
describe('<Button />', () => {
|
describe('<Button />', () => {
|
||||||
it('Render button correctly', () => {
|
it('Render button correctly', () => {
|
||||||
|
|
|
@ -9,7 +9,7 @@ import React from 'react';
|
||||||
|
|
||||||
import {render} from 'customTestRender';
|
import {render} from 'customTestRender';
|
||||||
|
|
||||||
import Checkbox from '../components/Checkbox'
|
import Checkbox from '../Checkbox'
|
||||||
|
|
||||||
describe('<Checkbox/>', () => {
|
describe('<Checkbox/>', () => {
|
||||||
it('Render checkbox', () => {
|
it('Render checkbox', () => {
|
||||||
|
|
|
@ -9,7 +9,7 @@ import React from 'react';
|
||||||
|
|
||||||
import {render} from 'customTestRender';
|
import {render} from 'customTestRender';
|
||||||
|
|
||||||
import NumberInput from '../components/NumberInput';
|
import NumberInput from '../NumberInput';
|
||||||
|
|
||||||
|
|
||||||
describe('<NumberInput/>', () => {
|
describe('<NumberInput/>', () => {
|
||||||
|
|
|
@ -9,7 +9,7 @@ import React from 'react';
|
||||||
|
|
||||||
import {render} from 'customTestRender';
|
import {render} from 'customTestRender';
|
||||||
|
|
||||||
import PasswordInput from '../components/PasswordInput';
|
import PasswordInput from '../PasswordInput';
|
||||||
|
|
||||||
describe('<PasswordInput/>', () => {
|
describe('<PasswordInput/>', () => {
|
||||||
it('Render password input', () => {
|
it('Render password input', () => {
|
||||||
|
|
|
@ -9,7 +9,7 @@ import React from 'react';
|
||||||
|
|
||||||
import {render} from 'customTestRender';
|
import {render} from 'customTestRender';
|
||||||
|
|
||||||
import RadioSet from '../components/RadioSet';
|
import RadioSet from '../RadioSet';
|
||||||
|
|
||||||
const TEST_CHOICES = [
|
const TEST_CHOICES = [
|
||||||
{label: 'label', value: 'value'},
|
{label: 'label', value: 'value'},
|
||||||
|
|
|
@ -9,7 +9,7 @@ import React from 'react';
|
||||||
|
|
||||||
import {fireEvent, getByDisplayValue, getByText, render} from 'customTestRender';
|
import {fireEvent, getByDisplayValue, getByText, render} from 'customTestRender';
|
||||||
|
|
||||||
import Select from '../components/Select';
|
import Select from '../Select';
|
||||||
|
|
||||||
const TEST_CHOICES = {
|
const TEST_CHOICES = {
|
||||||
'1': 'one',
|
'1': 'one',
|
||||||
|
|
|
@ -9,7 +9,7 @@ import React from 'react';
|
||||||
|
|
||||||
import {render} from 'customTestRender';
|
import {render} from 'customTestRender';
|
||||||
|
|
||||||
import TextInput from '../components/TextInput';
|
import TextInput from '../TextInput';
|
||||||
|
|
||||||
describe('<TextInput/>', () => {
|
describe('<TextInput/>', () => {
|
||||||
it('Render text input', () => {
|
it('Render text input', () => {
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
import * as Alert from "./components/Alert";
|
|
||||||
import * as Button from "./components/Button";
|
|
||||||
import * as Checkbox from "./components/Checkbox";
|
|
||||||
import * as constants from "./components/constants";
|
|
||||||
import * as DataTimeInput from "./components/DataTimeInput";
|
|
||||||
import * as EmailInput from "./components/EmailInput";
|
|
||||||
import * as Input from "./components/Input";
|
|
||||||
import * as Modal from "./components/Modal";
|
|
||||||
import * as NumberInput from "./components/NumberInput";
|
|
||||||
import * as PasswordInput from "./components/PasswordInput";
|
|
||||||
import * as RadioSet from "./components/RadioSet";
|
|
||||||
import * as Select from "./components/Select";
|
|
||||||
import * as Spinner from "./components/Spinner";
|
|
||||||
import * as TextInput from "./components/TextInput";
|
|
||||||
|
|
||||||
export {
|
|
||||||
Alert,
|
|
||||||
Button,
|
|
||||||
Checkbox,
|
|
||||||
constants,
|
|
||||||
DataTimeInput,
|
|
||||||
EmailInput,
|
|
||||||
Input,
|
|
||||||
Modal,
|
|
||||||
NumberInput,
|
|
||||||
PasswordInput,
|
|
||||||
RadioSet,
|
|
||||||
Select,
|
|
||||||
Spinner,
|
|
||||||
TextInput,
|
|
||||||
}
|
|
|
@ -1,10 +1,3 @@
|
||||||
/*
|
|
||||||
* 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 REFORIS_URL_PREFIX = process.env.LIGHTTPD ? "/reforis" : "";
|
||||||
|
|
||||||
export const ForisURLs = {
|
export const ForisURLs = {
|
|
@ -9,11 +9,11 @@ import React, {useEffect, useState} from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import {Prompt} from 'react-router';
|
import {Prompt} from 'react-router';
|
||||||
|
|
||||||
import Spinner from 'bootstrap/components/Spinner';
|
import {Spinner} from 'bootstrap/Spinner';
|
||||||
import {useAPIPost} from 'api';
|
import {useAPIPost} from 'api/hooks';
|
||||||
|
|
||||||
import {useForisModule, useForm} from '../hooks';
|
import {useForisModule, useForm} from '../hooks';
|
||||||
import SubmitButton, {STATES as SUBMIT_BUTTON_STATES} from './SubmitButton';
|
import {STATES as SUBMIT_BUTTON_STATES, SubmitButton} from './SubmitButton';
|
||||||
import {FailAlert, SuccessAlert} from './alerts';
|
import {FailAlert, SuccessAlert} from './alerts';
|
||||||
|
|
||||||
ForisForm.propTypes = {
|
ForisForm.propTypes = {
|
||||||
|
@ -57,7 +57,7 @@ ForisForm.defaultProps = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Serves as HOC for all foris forms components. */
|
/** Serves as HOC for all foris forms components. */
|
||||||
export default function ForisForm({
|
export function ForisForm({
|
||||||
ws,
|
ws,
|
||||||
forisConfig,
|
forisConfig,
|
||||||
prepData,
|
prepData,
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import Button from 'bootstrap/components/Button';
|
import {Button} from 'bootstrap/Button';
|
||||||
|
|
||||||
export const STATES = {
|
export const STATES = {
|
||||||
READY: 1,
|
READY: 1,
|
||||||
|
@ -21,7 +21,7 @@ SubmitButton.propTypes = {
|
||||||
state: PropTypes.oneOf(Object.keys(STATES).map(key => STATES[key]))
|
state: PropTypes.oneOf(Object.keys(STATES).map(key => STATES[key]))
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function SubmitButton({disabled, state, ...props}) {
|
export function SubmitButton({disabled, state, ...props}) {
|
||||||
const disableSubmitButton = disabled || state !== STATES.READY;
|
const disableSubmitButton = disabled || state !== STATES.READY;
|
||||||
const loadingSubmitButton = state !== STATES.READY;
|
const loadingSubmitButton = state !== STATES.READY;
|
||||||
|
|
||||||
|
|
|
@ -8,8 +8,8 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import Alert from 'bootstrap/components/Alert';
|
import {Alert} from 'bootstrap/Alert';
|
||||||
import Portal from 'utils/Portal';
|
import {Portal} from 'utils/Portal';
|
||||||
|
|
||||||
SuccessAlert.propTypes = {
|
SuccessAlert.propTypes = {
|
||||||
onDismiss: PropTypes.func.isRequired,
|
onDismiss: PropTypes.func.isRequired,
|
||||||
|
|
|
@ -9,7 +9,7 @@ import {useCallback, useEffect, useReducer} from 'react';
|
||||||
import update from 'immutability-helper';
|
import update from 'immutability-helper';
|
||||||
|
|
||||||
import {useAPIGet} from 'api/hooks';
|
import {useAPIGet} from 'api/hooks';
|
||||||
import useWSForisModule from 'webSockets/hooks';
|
import {useWSForisModule} from 'webSockets/hooks';
|
||||||
|
|
||||||
|
|
||||||
export function useForm(validator, prepData) {
|
export function useForm(validator, prepData) {
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
import * as ForisForm from "./components/ForisForm";
|
|
||||||
import * as SubmitButton from "./components/SubmitButton";
|
|
||||||
import * as hooks from "./hooks";
|
|
||||||
|
|
||||||
export {ForisForm, SubmitButton, hooks}
|
|
61
src/index.js
61
src/index.js
|
@ -1,16 +1,51 @@
|
||||||
import * as api from './api';
|
//API
|
||||||
import * as bootstrap from './bootstrap';
|
export {useAPIGet, useAPIPost} from "./api/hooks";
|
||||||
import * as form from './form';
|
|
||||||
import * as testUtils from './testUtils';
|
|
||||||
import * as validations from './validations';
|
|
||||||
|
|
||||||
import {Portal} from './utils';
|
// Bootstrap
|
||||||
|
export {Alert} from "bootstrap/Alert";
|
||||||
|
export {Button} from "bootstrap/Button";
|
||||||
|
export {CheckBox} from "bootstrap/Checkbox";
|
||||||
|
export {formFieldsSize} from "bootstrap/constants";
|
||||||
|
export {DataTimeInput} from "bootstrap/DataTimeInput";
|
||||||
|
export {EmailInput} from "bootstrap/EmailInput";
|
||||||
|
export {Input} from "bootstrap/Input";
|
||||||
|
export {Modal, ModalBody, ModalFooter, ModalHeader} from "bootstrap/Modal";
|
||||||
|
export {NumberInput} from "bootstrap/NumberInput";
|
||||||
|
export {PasswordInput} from "bootstrap/PasswordInput";
|
||||||
|
export {RadioSet} from "bootstrap/RadioSet";
|
||||||
|
export {Select} from "bootstrap/Select";
|
||||||
|
export {Spinner, SpinnerElement} from "bootstrap/Spinner";
|
||||||
|
export {TextInput} from "bootstrap/TextInput";
|
||||||
|
|
||||||
|
// Form
|
||||||
|
export {ForisForm} from "form/components/ForisForm";
|
||||||
|
export {SubmitButton, STATES as SUBMIT_BUTTON_STATES} from "form/components/SubmitButton";
|
||||||
|
export {useForisModule, useForm} from "form/hooks";
|
||||||
|
|
||||||
|
// // Test Utils
|
||||||
|
export {render} from "testUtils/customTestRender";
|
||||||
|
export {mockedWS} from "testUtils/mockWS";
|
||||||
|
export {setupGlobals} from "testUtils/setupGlobals";
|
||||||
|
|
||||||
|
|
||||||
|
// WebSockets
|
||||||
|
export {useWSForisModule} from "webSockets/hooks";
|
||||||
|
export {WebSockets} from "webSockets/WebSockets";
|
||||||
|
|
||||||
|
|
||||||
|
// Utils
|
||||||
|
export {Portal} from "utils/Portal";
|
||||||
|
|
||||||
|
// Foris URL
|
||||||
|
export {ForisURLs, REFORIS_URL_PREFIX} from "./forisUrls"
|
||||||
|
|
||||||
|
// Validation
|
||||||
export {
|
export {
|
||||||
api,
|
validateIPv4Address,
|
||||||
bootstrap,
|
validateIPv6Address,
|
||||||
form,
|
validateIPv6Prefix,
|
||||||
testUtils,
|
validateDomain,
|
||||||
validations,
|
validateDUID,
|
||||||
Portal,
|
validateMAC,
|
||||||
}
|
validateMultipleEmails,
|
||||||
|
} from "validations"
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
import * as customTestRender from "./customTestRender";
|
|
||||||
import * as mockWS from "./mockWS";
|
|
||||||
import * as setupGlobals from "./setupGlobals";
|
|
||||||
import * as setupTest from "./setupTest";
|
|
||||||
|
|
||||||
export {
|
|
||||||
customTestRender,
|
|
||||||
mockWS,
|
|
||||||
setupGlobals,
|
|
||||||
setupTest,
|
|
||||||
}
|
|
|
@ -6,6 +6,9 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Fake babel (gettext) used for docs
|
// Fake babel (gettext) used for docs
|
||||||
|
|
||||||
|
export function setupGlobals() {
|
||||||
global._ = str => str;
|
global._ = str => str;
|
||||||
global.babel = {format: (str) => str};
|
global.babel = {format: (str) => str};
|
||||||
global.ForisTranslations = {};
|
global.ForisTranslations = {};
|
||||||
|
}
|
||||||
|
|
|
@ -5,10 +5,8 @@
|
||||||
* See /LICENSE for more information.
|
* See /LICENSE for more information.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import mockAxios from 'jest-mock-axios';
|
||||||
export function setUpTest() {
|
import moment from 'moment-timezone';
|
||||||
const mockAxios = require('jest-mock-axios');
|
|
||||||
const moment = require('moment-timezone');
|
|
||||||
|
|
||||||
// Setup axios cleanup
|
// Setup axios cleanup
|
||||||
global.afterEach(() => {
|
global.afterEach(() => {
|
||||||
|
@ -16,12 +14,12 @@ export function setUpTest() {
|
||||||
});
|
});
|
||||||
|
|
||||||
// Mock babel (gettext)
|
// Mock babel (gettext)
|
||||||
window._ = str => str;
|
global._ = str => str;
|
||||||
window.babel = {format: (str) => str};
|
global.babel = {format: (str) => str};
|
||||||
window.ForisTranslations = {};
|
global.ForisTranslations = {};
|
||||||
|
|
||||||
// Mock scrollIntoView
|
// Mock scrollIntoView
|
||||||
window.HTMLElement.prototype.scrollIntoView = () => {
|
global.HTMLElement.prototype.scrollIntoView = () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
jest.doMock('moment', () => {
|
jest.doMock('moment', () => {
|
||||||
|
@ -30,8 +28,5 @@ export function setUpTest() {
|
||||||
});
|
});
|
||||||
|
|
||||||
Date.now = jest.fn(() => new Date(Date.UTC(2019, 1, 1, 12, 13, 14)).valueOf());
|
Date.now = jest.fn(() => new Date(Date.UTC(2019, 1, 1, 12, 13, 14)).valueOf());
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
jest.doMock("utils/vfs_fonts", () => ({}));
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
import ReactDOM from 'react-dom';
|
import ReactDOM from 'react-dom';
|
||||||
|
|
||||||
export default function Portal({containerId, children}) {
|
export function Portal({containerId, children}) {
|
||||||
const container = document.getElementById(containerId);
|
const container = document.getElementById(containerId);
|
||||||
if (container)
|
if (container)
|
||||||
return ReactDOM.createPortal(children, container);
|
return ReactDOM.createPortal(children, container);
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
import Portal from './Portal';
|
|
||||||
|
|
||||||
export {Portal}
|
|
|
@ -5,9 +5,7 @@
|
||||||
* See /LICENSE for more information.
|
* See /LICENSE for more information.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* eslint no-console: "off" */
|
import { ForisUrls } from "forisUrls";
|
||||||
|
|
||||||
import { ForisURLs } from "./constants";
|
|
||||||
|
|
||||||
const PROTOCOL = window.location.protocol === "http:" ? "ws" : "wss";
|
const PROTOCOL = window.location.protocol === "http:" ? "ws" : "wss";
|
||||||
|
|
||||||
|
@ -17,13 +15,13 @@ const URL = process.env.LIGHTTPD
|
||||||
|
|
||||||
const WAITING_FOR_CONNECTION_TIMEOUT = 500;
|
const WAITING_FOR_CONNECTION_TIMEOUT = 500;
|
||||||
|
|
||||||
export default class WebSockets {
|
export class WebSockets {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.ws = new WebSocket(URL);
|
this.ws = new WebSocket(URL);
|
||||||
this.ws.onerror = (e) => {
|
this.ws.onerror = (e) => {
|
||||||
if (window.location.pathname !== ForisURLs.login) {
|
if (window.location.pathname !== ForisUrls.login) {
|
||||||
console.error("WS: Error observed, you aren't logged probably.");
|
console.error("WS: Error observed, you aren't logged probably.");
|
||||||
window.location.replace(ForisURLs.login);
|
window.location.replace(ForisUrls.login);
|
||||||
}
|
}
|
||||||
console.log(`WS: Error: ${e}`);
|
console.log(`WS: Error: ${e}`);
|
||||||
};
|
};
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
|
|
||||||
export default function useWSForisModule(ws, module, action = "update_settings") {
|
export function useWSForisModule(ws, module, action = "update_settings") {
|
||||||
const [data, setData] = useState(null);
|
const [data, setData] = useState(null);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user