1
0
mirror of https://gitlab.nic.cz/turris/reforis/foris-js.git synced 2025-06-15 13:36:35 +02:00

Compare commits

...

63 Commits

Author SHA1 Message Date
12b862c568 Bump v5.0.1 2020-07-21 11:59:13 +02:00
54f9f984f1 NPM audit fix & update of packages 2020-07-21 11:59:12 +02:00
5dbc58d44b Merge branch 'new-channel-bandwidth' into 'dev'
New channel bandwidth & Natural Sort of options

Closes reforis#200

See merge request turris/reforis/foris-js!118
2020-07-17 16:27:27 +02:00
e7f9fbca96 Merge branch 'dev' into 'new-channel-bandwidth'
# Conflicts:
#   src/common/WiFiSettings/WiFiForm.js
2020-07-17 16:24:43 +02:00
8d40dbb841 Merge branch 'additional-wifi-module-fix' into 'dev'
Fix Wi-Fi Form bug with additional Wi-Fi modules

Closes reforis#204

See merge request turris/reforis/foris-js!117
2020-07-17 14:38:24 +02:00
cea8aa0c12 Fix a Wi-Fi Form bug with additional Wi-Fi modules 2020-07-17 14:33:35 +02:00
16a7a6c52d Update Snapshots 2020-07-17 14:19:56 +02:00
597b6fcf4c Add Natural sort order for list of options 2020-07-17 14:19:56 +02:00
5eb6b90ed4 Add 802.11ac 160 MHz wide channel to constants 2020-07-17 13:38:30 +02:00
48c323c1a1 Fix Wi-Fi Form bug with additional Wi-Fi modules 2020-07-17 12:26:46 +02:00
ae8baddbdd Merge branch 'one-wifi-module-fix' into 'dev'
Fix form submission button with one Wi-Fi module.

Closes reforis#192

See merge request turris/reforis/foris-js!115
2020-07-13 19:38:44 +02:00
67e4abe4d1 Add test suites for a Wi-Fi form submission 2020-07-07 11:35:58 +02:00
57f1ccced8 Fix form submission button for one or more Wi-Fi modules. 2020-06-29 13:24:42 +02:00
1e95bff7ff Merge branch 'dev' into 'master'
Dev

See merge request turris/reforis/foris-js!114
2020-06-04 22:56:37 +02:00
0f253ecc19 Merge branch 'docs-update' into 'dev'
Docs update

See merge request turris/reforis/foris-js!113
2020-06-04 22:52:24 +02:00
a5e096dc00 Fix and update docs. 2020-06-04 22:52:24 +02:00
182cbe698f Merge branch 'dev' into 'master'
Bump v5.0.0.

See merge request turris/reforis/foris-js!111
2020-05-07 17:17:47 +02:00
982eb371ad Bump v5.0.0.
I've realized that it should be major update due to broken API.
2020-05-07 16:55:55 +02:00
2786f856f7 Merge branch 'dev' into 'master'
Release v4.5.1.

See merge request turris/reforis/foris-js!110
2020-05-07 16:47:30 +02:00
48b080dc26 Merge branch 'release-4.5.1' into 'dev'
Release v4.5.1.

See merge request turris/reforis/foris-js!109
2020-05-07 16:40:27 +02:00
71beeb46f1 Bump v4.5.1.
* Add initial data to ForisForm children.
 * Update .pot file.
2020-05-07 16:34:33 +02:00
060a0489e1 Merge branch 'translations' into 'dev'
Update translations (.pot).

See merge request turris/reforis/foris-js!108
2020-05-07 16:31:44 +02:00
ae49b246cd Update translations (.pot). 2020-05-07 16:13:03 +02:00
27c37eb74b Merge branch 'add-inital-form-data-to-children-of-foris-form' into 'dev'
Add initial form data to children of the ForisForm.

See merge request turris/reforis/foris-js!107
2020-05-07 16:03:51 +02:00
cd708fa294 Add initial form data to children of the ForisForm. 2020-05-07 16:00:02 +02:00
8ec0392852 Merge branch 'dev' into 'master'
Dev

See merge request turris/reforis/foris-js!106
2020-03-26 16:29:27 +01:00
27a5e62d9a Merge branch 'fix-pdfmake' into 'dev'
Fix pdfmake.

See merge request turris/reforis/foris-js!105
2020-03-25 21:34:38 +01:00
aeaad4aa72 Bump v4.5.0. 2020-03-25 21:26:59 +01:00
256a000d61 NPM update. 2020-03-25 21:17:12 +01:00
c78ed9a5d0 NPM audit fix. 2020-03-25 21:17:12 +01:00
bded10211a Use pdfmake from globals. 2020-03-25 21:17:12 +01:00
25ac6cf1e9 Remove pdfmake. 2020-03-25 21:17:12 +01:00
9a2547a6c2 Merge branch 'dev' into 'master'
Release v4.4.0.

See merge request turris/reforis/foris-js!104
2020-03-13 22:16:42 +01:00
7968c7af4a Merge branch 'fix-hostname-validation-regex' into 'dev'
Fix hostname validation regex

See merge request turris/reforis/foris-js!103
2020-03-13 21:41:49 +01:00
4b94c470c3 Bump v4.4.0. 2020-03-13 21:37:21 +01:00
e1b5a25ddd Update domain vadlidation. 2020-03-13 21:37:21 +01:00
95af86c776 NPM audit fix. 2020-03-13 21:37:21 +01:00
02b5583712 Move vadliadtions and forisUrls to utils. 2020-03-13 21:37:21 +01:00
2f4d757a1a Merge branch 'dev' into 'master'
Release v4.3.1.

See merge request turris/reforis/foris-js!102
2020-03-06 14:10:21 +01:00
3c7a67783f Merge branch 'add-logout-url' into 'dev'
Add logout URL.

See merge request turris/reforis/foris-js!101
2020-03-06 14:06:34 +01:00
4500e85a40 Bump v4.3.1. 2020-03-06 14:01:40 +01:00
ce955095fd Add logout link. 2020-03-06 14:00:18 +01:00
00b861531e Merge branch 'dev' into 'master'
Dev

See merge request turris/reforis/foris-js!100
2020-02-26 17:02:47 +01:00
fad5b97a2e Merge branch 'release-4.3.0' into 'dev'
Release 4.3.0

See merge request turris/reforis/foris-js!99
2020-02-26 16:57:26 +01:00
aa639596d4 Bump v4.3.0. 2020-02-26 16:52:53 +01:00
1ee41f4f14 Merge branch 'radioset-element-children' into 'dev'
Allow RadioSet accept elements as children.

See merge request turris/reforis/foris-js!98
2020-02-26 15:24:28 +01:00
bf8c2d28bf Allow RadioSet accept elements as children. 2020-02-26 15:21:43 +01:00
dbb840d51c Merge branch 'scrollable-modal' into 'dev'
Add option to make modal scrollable.

See merge request turris/reforis/foris-js!97
2020-02-26 11:47:50 +01:00
ba772be869 Add option to make modal scrollable. 2020-02-26 11:44:52 +01:00
70da1c3c00 Merge branch 'dev' into 'master'
Release 4.2.0.

See merge request turris/reforis/foris-js!96
2020-02-26 11:37:23 +01:00
8e68bbc91f Merge branch 'release-v4.2.0' into 'dev'
Bump v4.2.0.

See merge request turris/reforis/foris-js!95
2020-02-21 16:33:31 +01:00
c453a35763 Merge branch 'dev' into 'master'
Release 4.1.0

See merge request turris/reforis/foris-js!93
2020-02-20 16:07:50 +01:00
57bebc92c7 Merge branch 'dev' into 'master'
Release 4.0.0

See merge request turris/reforis/foris-js!91
2020-02-20 11:53:43 +01:00
388860d51e Merge branch 'dev' into 'master'
Release 3.4.0

See merge request turris/reforis/foris-js!88
2020-02-17 10:55:59 +01:00
605f682356 Merge branch 'dev' into 'master'
Release 3.2.0

See merge request turris/reforis/foris-js!81
2020-01-17 15:14:23 +01:00
03e071d5ee Merge branch 'dev' into 'master'
Release 3.1.1

See merge request turris/reforis/foris-js!75
2020-01-10 10:44:40 +01:00
b8555247f2 Merge branch 'dev' into 'master'
Release 3.1.0

See merge request turris/reforis/foris-js!72
2020-01-09 11:57:45 +01:00
1e6278abdf Merge branch 'dev' into 'master'
Release 3.0.0

See merge request turris/reforis/foris-js!68
2020-01-07 16:10:16 +01:00
bb90800945 Merge branch 'dev' into 'master'
Release 2.1.1

See merge request turris/reforis/foris-js!65
2020-01-06 09:56:29 +01:00
51ba380cf0 Merge branch 'dev' into 'master'
Release 2.1.0

See merge request turris/reforis/foris-js!62
2019-12-19 12:10:18 +01:00
a8d8c872f9 Merge branch 'dev' into 'master'
Publish 2.0.0.

See merge request turris/reforis/foris-js!57
2019-12-09 10:51:49 +01:00
25ddb5949c Merge branch 'dev' into 'master'
Dev

See merge request turris/reforis/foris-js!52
2019-12-02 17:11:03 +01:00
8d1d5b57fd Merge branch 'dev' 2019-11-25 13:07:20 +01:00
33 changed files with 8698 additions and 3309 deletions

View File

@ -33,3 +33,12 @@ externals: {
}
```
### Docs
Build or watch docs to get more info about library:
```bash
make docs
```
or
```bash
make docs-watch
```

22
docs/development.md Normal file
View File

@ -0,0 +1,22 @@
Sooner or later you will face with situation when you want/need to make some changes in the library.
Then the most important tool for you it's [`npm link`](https://docs.npmjs.com/cli/link).
Please, notice that it will not work if you link library just from root of the repo. It happens due to location of
sources `./src`. You need to pack library first `make pack` and then link it from `./dist` directory.
Yeah it's not such comfortable solution for development. But it can fixed by writing small script similar as `make pack`
but with linking every file and directory from `./src` to the some directory and linking then from it. Notice that you
need to link `package.json` and `package-lock.json` as well.
So step by step:
```bash
make pack;
cd dist;
npm link;
cd $project_dir/js # Navigate to JS directory of the project where you want to link the library
npm link foris
```
And that's it ;)

View File

@ -1 +1,4 @@
Foris JS library is set of componets and utils for Foris JS application and plugins.
Foris JS library is set of components and utils for Foris JS application and plugins.
Please notice that all of these components or utils are used in reForis and plugins. If you like to study by example I would
recommend to full-text search these repos.

11557
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "foris",
"version": "4.2.0",
"version": "5.0.1",
"description": "Set of components and utils for Foris and its plugins.",
"author": "CZ.NIC, z.s.p.o.",
"repository": {
@ -14,10 +14,9 @@
"license": "GPL-3.0",
"main": "./src/index.js",
"dependencies": {
"axios": "^0.19.1",
"axios": "^0.19.2",
"immutability-helper": "3.0.1",
"moment": "^2.24.0",
"pdfmake": "^0.1.63",
"qrcode.react": "^0.9.3",
"react-datetime": "^2.16.3",
"react-uid": "^2.2.0"
@ -30,26 +29,31 @@
"react-router-dom": "^5.1.2"
},
"devDependencies": {
"@babel/cli": "^7.7.7",
"@babel/core": "^7.7.7",
"@babel/plugin-transform-runtime": "^7.7.6",
"@babel/preset-env": "^7.7.7",
"@babel/preset-react": "^7.7.4",
"@fortawesome/fontawesome-free": "^5.12.0",
"@babel/cli": "^7.8.4",
"@babel/core": "^7.9.0",
"@babel/plugin-transform-runtime": "^7.9.0",
"@babel/preset-env": "^7.9.0",
"@babel/preset-react": "^7.9.4",
"@fortawesome/fontawesome-free": "^5.13.0",
"@testing-library/react": "^8.0.9",
"babel-loader": "^8.0.6",
"babel-loader": "^8.1.0",
"babel-polyfill": "^6.26.0",
"bootstrap": "^4.5.0",
"css-loader": "^3.5.3",
"eslint": "^6.8.0",
"eslint-config-reforis": "^1.0.0",
"jest": "^24.9.0",
"file-loader": "^6.0.0",
"jest": "^25.2.0",
"jest-mock-axios": "^3.2.0",
"moment-timezone": "^0.5.27",
"moment-timezone": "^0.5.28",
"prop-types": "15.7.2",
"react": "16.9.0",
"react-dom": "16.9.0",
"react-router-dom": "^5.1.2",
"react-styleguidist": "^10.4.2",
"snapshot-diff": "^0.5.1"
"react-styleguidist": "^10.6.2",
"snapshot-diff": "^0.7.0",
"style-loader": "^1.2.1",
"webpack": "^4.43.0"
},
"scripts": {
"lint": "eslint src",

View File

@ -0,0 +1,4 @@
It provides alert context to children. `AlertContext` allows using `useAlert` in components.
Notice that `<div id="alert-container"/>` should be presented in HTML doc to get it work (In reForis it's already done
with base Jinja2 templates).

View File

@ -9,7 +9,7 @@ import {
useCallback, useEffect, useReducer, useState,
} from "react";
import { ForisURLs } from "../forisUrls";
import { ForisURLs } from "../utils/forisUrls";
import {
API_ACTIONS, API_METHODS, API_STATE, getErrorPayload, HEADERS, TIMEOUT,
} from "./utils";

View File

@ -1,4 +1,5 @@
Bootstrap alert component.
```jsx
import {useState} from 'react';
@ -7,14 +8,14 @@ function AlertExample(){
if (alert)
return <Alert
type='warning'
message='Some warning out there!'
onDismiss={()=>setAlert(false)}
/>;
>
Some warning out there!
</Alert>;
return <button
className='btn btn-secondary'
onClick={()=>setAlert(true)}
>Show alert again</button>;
};
<AlertExample/>
```

View File

@ -19,6 +19,8 @@ FileInput.propTypes = {
helpText: PropTypes.string,
/** Email value. */
value: PropTypes.string,
/** Allow selecting multiple files. */
multiple: PropTypes.bool,
};
export function FileInput({ ...props }) {

View File

@ -3,13 +3,39 @@ Bootstrap component for file input. Includes label and has predefined sizes and
All additional `props` are passed to the `<input type="file">` HTML component.
```js
import {useState} from 'react';
import { useState } from 'react';
const [files, setFiles] = useState([]);
<FileInput
files={files}
label="Some file"
helpText="Will be uploaded"
onChange={event =>setFiles(event.target.files)}
/>
// Note that files is not an array but FileList.
const label = files.length === 1 ? files[0].name : "Choose file";
<form className="col">
<FileInput
files={files}
label={label}
helpText="Will be uploaded"
onChange={event=>setFiles(event.target.files)}
/>
</form>
```
### FileInput with multiple files
```js
import { useState } from 'react';
const [files, setFiles] = useState([]);
// Note that files is not an array but FileList.
const label = files.length > 0 ? Array.from(files).map(file=>file.name).join(", ") : "Choose files";
<form className="col">
<FileInput
files={files}
label={label}
helpText="Will be uploaded"
onChange={event=>setFiles(event.target.files)}
multiple
/>
</form>
```

View File

@ -17,6 +17,7 @@ Modal.propTypes = {
shown: PropTypes.bool.isRequired,
/** Callback to manage modal visibility */
setShown: PropTypes.func.isRequired,
scrollable: PropTypes.bool,
/** Modal content use following: `ModalHeader`, `ModalBody`, `ModalFooter` */
children: PropTypes.oneOfType([
@ -25,7 +26,9 @@ Modal.propTypes = {
]).isRequired,
};
export function Modal({ shown, setShown, children }) {
export function Modal({
shown, setShown, scrollable, children,
}) {
const dialogRef = useRef();
useClickOutside(dialogRef, () => setShown(false));
@ -33,7 +36,11 @@ export function Modal({ shown, setShown, children }) {
return (
<Portal containerId="modal-container">
<div className={`modal fade ${shown ? "show" : ""}`} role="dialog">
<div ref={dialogRef} className="modal-dialog modal-dialog-centered" role="document">
<div
ref={dialogRef}
className={`modal-dialog modal-dialog-centered${scrollable ? " modal-dialog-scrollable" : ""}`}
role="document"
>
<div className="modal-content">
{children}
</div>

View File

@ -6,8 +6,6 @@ it's required to have an element `<div id={"modal-container"}/>` somewhere on th
<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';

View File

@ -17,7 +17,12 @@ RadioSet.propTypes = {
/** Choices . */
choices: PropTypes.arrayOf(PropTypes.shape({
/** Choice lable . */
label: PropTypes.string.isRequired,
label: PropTypes.oneOfType([
PropTypes.string,
PropTypes.element,
PropTypes.node,
PropTypes.arrayOf(PropTypes.node),
]).isRequired,
/** Choice value . */
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
})).isRequired,
@ -58,7 +63,12 @@ export function RadioSet({
}
Radio.propTypes = {
label: PropTypes.string.isRequired,
label: PropTypes.oneOfType([
PropTypes.string,
PropTypes.element,
PropTypes.node,
PropTypes.arrayOf(PropTypes.node),
]).isRequired,
id: PropTypes.string.isRequired,
helpText: PropTypes.string,
};

View File

@ -28,10 +28,11 @@ export function Select({
}) {
const uid = useUID();
const options = Object.keys(choices).map(
const options = Object.keys(choices).sort(
(a, b) => a - b || a.toString().localeCompare(b.toString()),
).map(
(key) => <option key={key} value={key}>{choices[key]}</option>,
);
return (
<div className="form-group">
<label htmlFor={uid}>{label}</label>

View File

@ -10,7 +10,7 @@ import PropTypes from "prop-types";
import { useAPIPost } from "../api/hooks";
import { API_STATE } from "../api/utils";
import { ForisURLs } from "../forisUrls";
import { ForisURLs } from "../utils/forisUrls";
import { Button } from "../bootstrap/Button";
import {

View File

@ -31,22 +31,22 @@ WiFiForm.propTypes = {
WiFiForm.defaultProps = {
formData: { devices: [] },
setFormValue: () => {},
setFormValue: () => { },
hasGuestNetwork: true,
};
export default function WiFiForm({
formData, formErrors, setFormValue, hasGuestNetwork, ...props
formData, formErrors, setFormValue, hasGuestNetwork, disabled,
}) {
return formData.devices.map((device) => (
return formData.devices.map((device, index) => (
<DeviceForm
key={device.id}
formData={device}
formErrors={(formErrors || [])[device.id]}
deviceIndex={index}
formErrors={(formErrors || [])[index]}
setFormValue={setFormValue}
hasGuestNetwork={hasGuestNetwork}
{...props}
disabled={disabled}
/>
));
}
@ -66,6 +66,7 @@ DeviceForm.propTypes = {
formErrors: PropTypes.object.isRequired,
setFormValue: PropTypes.func.isRequired,
hasGuestNetwork: PropTypes.bool,
deviceIndex: PropTypes.number,
};
DeviceForm.defaultProps = {
@ -74,7 +75,7 @@ DeviceForm.defaultProps = {
};
function DeviceForm({
formData, formErrors, setFormValue, hasGuestNetwork, ...props
formData, formErrors, setFormValue, hasGuestNetwork, deviceIndex, ...props
}) {
const deviceID = formData.id;
return (
@ -85,7 +86,7 @@ function DeviceForm({
checked={formData.enabled}
onChange={setFormValue(
(value) => ({ devices: { [deviceID]: { enabled: { $set: value } } } }),
(value) => ({ devices: { [deviceIndex]: { enabled: { $set: value } } } }),
)}
{...props}
@ -99,7 +100,13 @@ function DeviceForm({
error={formErrors.SSID || null}
required
onChange={setFormValue(
(value) => ({ devices: { [deviceID]: { SSID: { $set: value } } } }),
(value) => ({
devices: {
[deviceIndex]: {
SSID: { $set: value },
},
},
}),
)}
{...props}
@ -122,7 +129,7 @@ function DeviceForm({
onChange={setFormValue(
(value) => (
{ devices: { [deviceID]: { password: { $set: value } } } }
{ devices: { [deviceIndex]: { password: { $set: value } } } }
),
)}
@ -136,7 +143,7 @@ function DeviceForm({
onChange={setFormValue(
(value) => (
{ devices: { [deviceID]: { hidden: { $set: value } } } }
{ devices: { [deviceIndex]: { hidden: { $set: value } } } }
),
)}
@ -153,7 +160,7 @@ function DeviceForm({
onChange={setFormValue(
(value) => ({
devices: {
[deviceID]: {
[deviceIndex]: {
hwmode: { $set: value },
channel: { $set: "0" },
},
@ -172,7 +179,7 @@ function DeviceForm({
onChange={setFormValue(
(value) => (
{ devices: { [deviceID]: { htmode: { $set: value } } } }
{ devices: { [deviceIndex]: { htmode: { $set: value } } } }
),
)}
@ -186,7 +193,7 @@ function DeviceForm({
onChange={setFormValue(
(value) => (
{ devices: { [deviceID]: { channel: { $set: value } } } }
{ devices: { [deviceIndex]: { channel: { $set: value } } } }
),
)}
@ -195,7 +202,7 @@ function DeviceForm({
{hasGuestNetwork && (
<WifiGuestForm
formData={{ id: deviceID, ...formData.guest_wifi }}
formData={{ id: deviceIndex, ...formData.guest_wifi }}
formErrors={formErrors.guest_wifi || {}}
setFormValue={setFormValue}

View File

@ -9,7 +9,7 @@ import React, { useState } from "react";
import QRCode from "qrcode.react";
import PropTypes from "prop-types";
import { ForisURLs } from "../../forisUrls";
import { ForisURLs } from "../../utils/forisUrls";
import { Button } from "../../bootstrap/Button";
import {
Modal, ModalBody, ModalFooter, ModalHeader,

View File

@ -64,7 +64,7 @@ function prepDataToSubmit(formData) {
return formData;
}
function validator(formData) {
export function validator(formData) {
const formErrors = formData.devices.map(
(device) => {
if (!device.enabled) return {};
@ -89,5 +89,5 @@ function validator(formData) {
return errors;
},
);
return JSON.stringify(formErrors) === "[{},{}]" ? null : formErrors;
return JSON.stringify(formErrors).match(/\[[{},?]+\]/) ? null : formErrors;
}

View File

@ -13,8 +13,8 @@ import { fireEvent, render, wait } from "customTestRender";
import { WebSockets } from "webSockets/WebSockets";
import { mockJSONError } from "testUtils/network";
import { wifiSettingsFixture } from "./__fixtures__/wifiSettings";
import { WiFiSettings } from "../WiFiSettings";
import { wifiSettingsFixture, oneDevice, twoDevices, threeDevices } from "./__fixtures__/wifiSettings";
import { WiFiSettings, validator } from "../WiFiSettings";
describe("<WiFiSettings/>", () => {
let firstRender;
@ -159,4 +159,18 @@ describe("<WiFiSettings/>", () => {
};
expect(mockAxios.post).toHaveBeenCalledWith(endpoint, data, expect.anything());
});
it("Validator function using regex for one device", () => {
expect(validator(oneDevice)).toEqual(null);
});
it("Validator function using regex for two devices", () => {
const twoDevicesFormErrors = [{SSID: "SSID can't be empty"}, {}];
expect(validator(twoDevices)).toEqual(twoDevicesFormErrors);
});
it("Validator function using regex for three devices", () => {
const threeDevicesFormErrors = [{}, {}, {password: "Password must contain at least 8 symbols"}];
expect(validator(threeDevices)).toEqual(threeDevicesFormErrors);
});
});

View File

@ -316,3 +316,85 @@ export function wifiSettingsFixture() {
],
};
}
const oneDevice = {
devices: [
{
SSID: "Turris1",
channel: 60,
enabled: true,
guest_wifi: { enabled: false },
hidden: false,
htmode: "HT40",
hwmode: "11a",
id: 0,
password: "TestPass"
}
]
};
const twoDevices = {
devices: [
{
SSID: "",
channel: 60,
enabled: true,
guest_wifi: { enabled: false },
hidden: false,
htmode: "HT40",
hwmode: "11a",
id: 0,
password: "TestPass"
},
{
SSID: "Turris2",
channel: 60,
enabled: true,
guest_wifi: { enabled: false },
hidden: false,
htmode: "HT40",
hwmode: "11a",
id: 0,
password: "TestPass"
}
]
};
const threeDevices = {
devices: [
{
SSID: "Turris1",
channel: 60,
enabled: true,
guest_wifi: { enabled: false },
hidden: false,
htmode: "HT40",
hwmode: "11a",
id: 0,
password: "TestPass"
},
{
SSID: "Turris2",
channel: 60,
enabled: false,
guest_wifi: { enabled: false },
hidden: false,
htmode: "HT40",
hwmode: "11a",
id: 0,
password: "TestPass"
},
{
SSID: "Turris3",
channel: 60,
enabled: true,
guest_wifi: { enabled: false },
hidden: false,
htmode: "HT40",
hwmode: "11a",
id: 0,
password: ""
}
]
};
export {oneDevice, twoDevices, threeDevices};

View File

@ -617,11 +617,6 @@ exports[`<WiFiSettings/> Snapshot one module enabled. 1`] = `
+ id=\\"8\\"
+ >
+ <option
+ value=\\"NOHT\\"
+ >
+ Disabled
+ </option>
+ <option
+ value=\\"HT20\\"
+ >
+ 802.11n - 20 MHz wide channel
@ -632,6 +627,11 @@ exports[`<WiFiSettings/> Snapshot one module enabled. 1`] = `
+ 802.11n - 40 MHz wide channel
+ </option>
+ <option
+ value=\\"NOHT\\"
+ >
+ Disabled
+ </option>
+ <option
+ value=\\"VHT20\\"
+ >
+ 802.11ac - 20 MHz wide channel

View File

@ -12,6 +12,7 @@ export const HTMODES = {
VHT20: _("802.11ac - 20 MHz wide channel"),
VHT40: _("802.11ac - 40 MHz wide channel"),
VHT80: _("802.11ac - 80 MHz wide channel"),
VHT160: _("802.11ac - 160 MHz wide channel"),
};
export const HWMODES = {
"11g": "2.4",

View File

@ -5,22 +5,36 @@
* See /LICENSE for more information.
*/
import pdfMake from "pdfmake";
export function createAndDownloadPdf(SSID, password) {
const docDefinition = {
content: [
{
text: "Wi-Fi", style: "header", fontSize: 55, alignment: "center",
text: "Wi-Fi",
style: "header",
fontSize: 55,
alignment: "center",
},
{
qr: toQRCodeContent(SSID, password), fit: "350", margin: [0, 80], alignment: "center",
qr: toQRCodeContent(SSID, password),
fit: "350",
margin: [0, 80],
alignment: "center",
},
{
text: `SSID: ${SSID}`,
fontSize: 25,
alignment: "center",
},
{
text: `Password: ${password}`,
fontSize: 25,
alignment: "center",
},
{ text: `SSID: ${SSID}`, fontSize: 25, alignment: "center" },
{ text: `Password: ${password}`, fontSize: 25, alignment: "center" },
],
};
pdfMake.createPdf(docDefinition).download("wifi.pdf");
// pdfmake is exposed by reForis main application. Thus we can use it from globals.
window.pdfMake.createPdf(docDefinition).download("wifi.pdf");
}
export function toQRCodeContent(SSID, password) {

View File

@ -12,7 +12,7 @@ import {
validateIPv6Address,
validateIPv6Prefix,
validateMAC,
} from "validations";
} from "utils/validations";
describe("Validation functions", () => {
it("validateIPv4Address valid", () => {

View File

@ -149,6 +149,7 @@ export function ForisForm({
const childrenWithFormProps = React.Children.map(
children,
(child) => React.cloneElement(child, {
initialData: formState.initialData,
formData: formState.data,
formErrors: formState.errors,
setFormValue: onFormChangeHandler,

View File

@ -67,7 +67,7 @@ export { useClickOutside } from "./utils/hooks";
export { toLocaleDateString } from "./utils/datetime";
// Foris URL
export { ForisURLs, REFORIS_URL_PREFIX } from "./forisUrls";
export { ForisURLs, REFORIS_URL_PREFIX } from "./utils/forisUrls";
// Validation
export {
@ -78,7 +78,7 @@ export {
validateDUID,
validateMAC,
validateMultipleEmails,
} from "./validations";
} from "./utils/validations";
// Alert context
export { AlertContextProvider, useAlert } from "./alertContext/AlertContext";

View File

@ -0,0 +1,12 @@
/*
* Copyright (C) 2020 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.
*/
// Mock babel (gettext)
global._ = (str) => str;
global.ngettext = (str) => str;
global.babel = { format: (str) => str };
global.ForisTranslations = { locale: "en" };

View File

@ -7,18 +7,13 @@
import mockAxios from "jest-mock-axios";
import moment from "moment-timezone";
import "./mockGlobals";
// Setup axios cleanup
global.afterEach(() => {
mockAxios.reset();
});
// Mock babel (gettext)
global._ = (str) => str;
global.ngettext = (str) => str;
global.babel = { format: (str) => str };
global.ForisTranslations = { locale: "en" };
// Mock web sockets
window.WebSocket = jest.fn();

View File

@ -10,6 +10,8 @@ export const REFORIS_API_URL_PREFIX = `${REFORIS_URL_PREFIX}/api`;
export const ForisURLs = {
login: `${REFORIS_URL_PREFIX}/login`,
logout: `${REFORIS_URL_PREFIX}/logout`,
static: `${REFORIS_URL_PREFIX}/static/reforis`,
wifi: `${REFORIS_URL_PREFIX}/network-settings/wifi`,

View File

@ -23,7 +23,7 @@ const REs = {
IPv4: /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,
IPv6: /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,
IPv6Prefix: /^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/([0-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8]))$/,
domain: /^([a-zA-Z0-9-]{1,63}\.?)*$/,
domain: /^[A-Za-z0-9][A-Za-z0-9.-]{1,255}$/,
DUID: /^([0-9a-fA-F]{2}){4}([0-9a-fA-F]{2})*$/,
MAC: /^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/,
MultipleEmails: /^([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+ *)( *, *[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+ *)*$/,

View File

@ -7,7 +7,7 @@
/* eslint no-console: "off" */
import { ForisURLs } from "../forisUrls";
import { ForisURLs } from "../utils/forisUrls";
const PROTOCOL = window.location.protocol === "http:" ? "ws" : "wss";

View File

@ -14,6 +14,10 @@ module.exports = {
name: "Foris JS",
content: "docs/intro.md",
},
{
name: "Development (Linking)",
content: "docs/development.md",
},
{
name: "Foris forms",
components: [
@ -24,6 +28,14 @@ module.exports = {
exampleMode: "expand",
usageMode: "expand",
},
{
name: "Alert Context",
components: [
"src/alertContext/AlertContext.js",
],
exampleMode: "expand",
usageMode: "expand",
},
{
name: "Bootstrap components",
description: "Set of bootstrap components.",
@ -37,6 +49,7 @@ module.exports = {
],
require: [
"babel-polyfill",
path.join(__dirname, "src/testUtils/mockGlobals"),
path.join(__dirname, "node_modules/bootstrap/dist/css/bootstrap.min.css"),
path.join(__dirname, "node_modules/@fortawesome/fontawesome-free/css/all.min.css"),
],

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2020-02-20 17:28+0100\n"
"POT-Creation-Date: 2020-05-07 16:12+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -17,34 +17,6 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.8.0\n"
#: src/validations.js:13
msgid "This is not a valid IPv4 address."
msgstr ""
#: src/validations.js:14
msgid "This is not a valid IPv6 address."
msgstr ""
#: src/validations.js:15
msgid "This is not a valid IPv6 prefix."
msgstr ""
#: src/validations.js:16
msgid "This is not a valid domain name."
msgstr ""
#: src/validations.js:17
msgid "This is not a valid DUID."
msgstr ""
#: src/validations.js:18
msgid "This is not a valid MAC address."
msgstr ""
#: src/validations.js:19
msgid "Doesn't contain a list of emails separated by commas."
msgstr ""
#: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
@ -107,15 +79,15 @@ msgid ""
" "
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:82
#: src/common/WiFiSettings/WiFiForm.js:81
msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:84
#: src/common/WiFiSettings/WiFiForm.js:83
msgid "Enable"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:215
#: src/common/WiFiSettings/WiFiForm.js:214
msgid "auto"
msgstr ""
@ -222,7 +194,7 @@ msgstr ""
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:165
#: src/form/components/ForisForm.js:166
msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr ""
@ -242,3 +214,31 @@ msgstr ""
msgid "An error occurred while fetching data."
msgstr ""
#: src/utils/validations.js:13
msgid "This is not a valid IPv4 address."
msgstr ""
#: src/utils/validations.js:14
msgid "This is not a valid IPv6 address."
msgstr ""
#: src/utils/validations.js:15
msgid "This is not a valid IPv6 prefix."
msgstr ""
#: src/utils/validations.js:16
msgid "This is not a valid domain name."
msgstr ""
#: src/utils/validations.js:17
msgid "This is not a valid DUID."
msgstr ""
#: src/utils/validations.js:18
msgid "This is not a valid MAC address."
msgstr ""
#: src/utils/validations.js:19
msgid "Doesn't contain a list of emails separated by commas."
msgstr ""