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

Compare commits

...

39 Commits

Author SHA1 Message Date
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
cda7898a96 Merge branch 'fix-readme' into 'dev'
Fix README.md publishing.

See merge request turris/reforis/foris-js!56
2019-12-09 10:24:42 +01:00
26bea9c7c4 Fix README.md publishing. 2019-12-06 17:26:01 +01:00
fd1518265f Merge branch 'spinner-element-class-name' into 'dev'
Add className to SpinnerElement.

See merge request turris/reforis/foris-js!55
2019-12-06 15:07:16 +01:00
61d10e91e0 Merge branch 'ws-unsubscription' into 'dev'
Add WS unsubscribtion.

See merge request turris/reforis/foris-js!53
2019-12-06 15:06:59 +01:00
aac6c6bf2a Add className to SpinnerElement. 2019-12-06 12:13:29 +01:00
d55615abcc Grammar. 2019-12-06 12:09:54 +01:00
9d322811c3 Improve docs and propTypes of WS usage in ForisForm. 2019-12-06 12:07:42 +01:00
f30685d9c2 Add WS unsubscribtion.
Code review improvements.
2019-12-06 11:46:30 +01:00
5bb298270b Merge branch '15-api-url-suffix' into 'dev'
Set suffix for API URL

Closes #15

See merge request turris/reforis/foris-js!54
2019-12-06 10:27:48 +01:00
8d0c640994 Set suffix for API URL 2019-12-06 10:27:48 +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
7b739f55a0 Merge branch 'add-reboot-button' into 'dev'
Add reboot button

See merge request turris/reforis/foris-js!50
2019-11-29 16:37:44 +01:00
03a020f87c Bump version 1.4.0. 2019-11-29 16:29:32 +01:00
c6fd9bbadb NPM audit fix. 2019-11-29 16:29:32 +01:00
acaaab0654 Fix URL prefixes. 2019-11-29 16:29:31 +01:00
04a667eb6f Extract reboot button from reForis.
* Add RebootButton tests.
 * RebootButton code review.
 * Update translations.
2019-11-29 16:29:31 +01:00
d71f638bd5 Merge branch 'download-button-class' into 'dev'
Allow adding classes to DownloadButton

See merge request turris/reforis/foris-js!51
2019-11-29 16:01:53 +01:00
1064277cd9 Allow adding classes to DownloadButton 2019-11-29 16:01:53 +01:00
8d1d5b57fd Merge branch 'dev' 2019-11-25 13:07:20 +01:00
fd01bc6f56 Merge branch 'bump-1.3.3' into 'dev'
Bump version 1.3.3.

See merge request turris/reforis/foris-js!48
2019-11-22 15:35:41 +00:00
e27a23600f Bump version 1.3.3. 2019-11-22 16:30:25 +01:00
daf787e2df Merge branch 'translations' into 'master'
Translations

See merge request turris/reforis/foris-js!47
2019-11-22 15:19:01 +00:00
512c65c213 Translated using Weblate (Czech)
Currently translated at 100.0% (18 of 18 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/cs/
2019-11-21 18:04:38 +01:00
3925fb6439 Added translation using Weblate (Spanish) 2019-11-21 05:10:24 +01:00
21bbfb6d2e Merge branch 'dev' into 'master'
Dev

See merge request turris/reforis/foris-js!43
2019-11-20 10:22:05 +00:00
1dcba1dfa8 Merge branch 'api-polling-catch-error' into 'dev'
Catch error state in API polling.

See merge request turris/reforis/foris-js!44
2019-11-19 16:56:38 +00:00
fd8acd1ceb Catch error and sending state in API polling. 2019-11-19 16:56:38 +00:00
48d5cf0119 Merge branch 'clickable-checkbox-helptext' into 'dev'
Make checkBox help text clickabe.

See merge request turris/reforis/foris-js!45
2019-11-19 12:43:15 +00:00
1a82f8e225 Update checkbox snapshots. 2019-11-19 13:37:43 +01:00
638821d025 Make checkBox help text clickabe. 2019-11-19 13:36:49 +01:00
fbaa73e378 Merge branch 'global-alert-context' into 'dev'
Use global AlertContext

See merge request turris/reforis/foris-js!42
2019-11-18 12:51:43 +00:00
e54db2c577 Use global AlertContext 2019-11-18 12:51:43 +00:00
a6866a0673 Merge branch 'api-polling' into 'dev'
Add hook for API polling.

See merge request turris/reforis/foris-js!41
2019-11-15 15:59:44 +00:00
429814ebb5 Add until param to API polling hook. 2019-11-15 14:21:19 +01:00
73e213c467 Add default delay. 2019-11-15 14:20:14 +01:00
2e68e56e44 Add hook for API polling. 2019-11-15 14:20:07 +01:00
b3bb4de646 Merge branch 'with-either-props' into 'dev'
Fix for withEither

See merge request turris/reforis/foris-js!40
2019-11-15 08:55:24 +00:00
b30f9f59b4 Fix for withEither 2019-11-15 08:55:24 +00:00
45 changed files with 1391 additions and 106 deletions

View File

@ -1,4 +1,5 @@
# foris-js
Set of utils and common React elements for reForis.
## Publishing package

25
package-lock.json generated
View File

@ -1,6 +1,6 @@
{
"name": "foris",
"version": "1.3.1",
"version": "2.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@ -5947,9 +5947,9 @@
"dev": true
},
"handlebars": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.3.1.tgz",
"integrity": "sha512-c0HoNHzDiHpBt4Kqe99N8tdLPKAnGCQ73gYMPWtAYM4PwGnf7xl8PBUHJqh9ijlzt2uQKaSRxbXRt+rZ7M2/kA==",
"version": "4.5.3",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz",
"integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==",
"dev": true,
"requires": {
"neo-async": "^2.6.0",
@ -6269,6 +6269,7 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/immutability-helper/-/immutability-helper-3.0.1.tgz",
"integrity": "sha512-U92ROQQt7XkIwrdqCByUI118TQM1hXdKnRQpvKeA0HRyGSnJipu9IWHe4UD8zCN00O8UnQjQzPCgZ1CC3yBzHA==",
"dev": true,
"requires": {
"invariant": "^2.2.4"
}
@ -6402,6 +6403,7 @@
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
"integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
"dev": true,
"requires": {
"loose-envify": "^1.0.0"
}
@ -11782,16 +11784,23 @@
"integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw=="
},
"uglify-js": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz",
"integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==",
"version": "3.7.0",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.0.tgz",
"integrity": "sha512-PC/ee458NEMITe1OufAjal65i6lB58R1HWMRcxwvdz1UopW0DYqlRL3xdu3IcTvTXsB02CRHykidkTRL+A3hQA==",
"dev": true,
"optional": true,
"requires": {
"commander": "~2.20.0",
"commander": "~2.20.3",
"source-map": "~0.6.1"
},
"dependencies": {
"commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true,
"optional": true
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",

View File

@ -1,6 +1,6 @@
{
"name": "foris",
"version": "1.3.1",
"version": "2.0.0",
"description": "Set of components and utils for Foris and its plugins.",
"author": "CZ.NIC, z.s.p.o.",
"repository": {
@ -15,7 +15,6 @@
"main": "index.js",
"dependencies": {
"axios": "^0.19.0",
"immutability-helper": "^3.0.0",
"jest-transform-css": "^2.0.0",
"moment": "^2.24.0",
"moment-timezone": "^0.5.25",
@ -25,8 +24,9 @@
"react-uid": "^2.2.0"
},
"peerDependencies": {
"react": "^16.9.0",
"react-dom": "^16.9.0"
"immutability-helper": "3.0.1",
"react": "16.9.0",
"react-dom": "16.9.0"
},
"devDependencies": {
"@babel/cli": "^7.4.4",
@ -49,12 +49,13 @@
"eslint": "^6.1.0",
"eslint-config-reforis": "^1.0.0",
"file-loader": "^4.2.0",
"immutability-helper": "3.0.1",
"jest": "^24.8.0",
"jest-mock-axios": "^3.0.0",
"moment": "^2.24.0",
"moment-timezone": "^0.5.25",
"react": "^16.9.0",
"react-dom": "^16.9.0",
"react": "16.9.0",
"react-dom": "16.9.0",
"react-styleguidist": "^9.1.16",
"snapshot-diff": "^0.5.1",
"style-loader": "^1.0.0",

View File

@ -2,7 +2,7 @@
# Collect files
npm run build
cp package.json dist
cp package.json README.md dist
cp -rf translations dist
# Remove unwanted files
rm -rf dist/**/__tests__

View File

@ -11,8 +11,6 @@ import PropTypes from "prop-types";
import { Alert, ALERT_TYPES } from "bootstrap/Alert";
import { Portal } from "utils/Portal";
const AlertContext = React.createContext();
AlertContextProvider.propTypes = {
children: PropTypes.oneOfType([
PropTypes.arrayOf(PropTypes.node),
@ -21,6 +19,7 @@ AlertContextProvider.propTypes = {
};
function AlertContextProvider({ children }) {
const { AlertContext } = window;
const [alert, setAlert] = useState(null);
const setAlertWrapper = useCallback((message, type = ALERT_TYPES.DANGER) => {
@ -46,7 +45,8 @@ function AlertContextProvider({ children }) {
}
function useAlert() {
const { AlertContext } = window;
return useContext(AlertContext);
}
export { AlertContext, AlertContextProvider, useAlert };
export { AlertContextProvider, useAlert };

View File

@ -5,7 +5,9 @@
* See /LICENSE for more information.
*/
import { useCallback, useReducer } from "react";
import {
useCallback, useEffect, useReducer, useState,
} from "react";
import { ForisURLs } from "forisUrls";
import {
@ -15,13 +17,13 @@ import {
const DATA_METHODS = ["POST", "PATCH", "PUT"];
function createAPIHook(method) {
return (url, contentType) => {
return (urlRoot, contentType) => {
const [state, dispatch] = useReducer(APIReducer, {
state: API_STATE.INIT,
data: null,
});
const sendRequest = useCallback(async (data) => {
const sendRequest = useCallback(async ({ data, suffix } = {}) => {
const headers = { ...HEADERS };
if (contentType) {
headers["Content-Type"] = contentType;
@ -29,17 +31,23 @@ function createAPIHook(method) {
dispatch({ type: API_ACTIONS.INIT });
try {
// Prepare request
const request = API_METHODS[method];
const config = {
timeout: TIMEOUT,
headers,
};
const url = suffix ? `${urlRoot}/${suffix}` : urlRoot;
// Make request
let result;
if (DATA_METHODS.includes(method)) {
result = await request(url, data, config);
} else {
result = await request(url, config);
}
// Process request result
dispatch({
type: API_ACTIONS.SUCCESS,
payload: result.data,
@ -51,7 +59,7 @@ function createAPIHook(method) {
payload: getErrorPayload(error),
});
}
}, [url, contentType]);
}, [urlRoot, contentType]);
return [state, sendRequest];
};
}
@ -90,3 +98,23 @@ const useAPIDelete = createAPIHook("DELETE");
export {
useAPIGet, useAPIPost, useAPIPatch, useAPIPut, useAPIDelete,
};
export function useAPIPolling(endpoint, delay = 1000, until) { // delay ms
const [state, setState] = useState({ state: API_STATE.INIT });
const [getResponse, get] = useAPIGet(endpoint);
useEffect(() => {
if (getResponse.state !== API_STATE.INIT) {
setState(getResponse);
}
}, [getResponse]);
useEffect(() => {
if (until) {
const interval = setInterval(get, delay);
return () => clearInterval(interval);
}
}, [until, delay, get]);
return [state];
}

View File

@ -42,8 +42,10 @@ export function CheckBox({
{...props}
/>
<label className="custom-control-label" htmlFor={uid}>{label}</label>
{helpText && <small className="form-text text-muted">{helpText}</small>}
<label className="custom-control-label" htmlFor={uid}>
{label}
{helpText && <small className="form-text text-muted">{helpText}</small>}
</label>
</div>
</div>
);

View File

@ -10,12 +10,25 @@ import PropTypes from "prop-types";
DownloadButton.propTypes = {
href: PropTypes.string.isRequired,
className: PropTypes.string,
children: PropTypes.oneOfType([
PropTypes.arrayOf(PropTypes.node),
PropTypes.node,
]),
};
export function DownloadButton({ href, children }) {
return <a href={href} className="btn btn-primary" download>{children}</a>;
DownloadButton.defaultProps = {
className: "btn-primary",
};
export function DownloadButton({ href, className, children }) {
return (
<a
href={href}
className={`btn ${className}`.trim()}
download
>
{children}
</a>
);
}

View File

@ -24,18 +24,18 @@ Spinner.defaultProps = {
};
export function Spinner({
fullScreen, children, className, ...props
fullScreen, children, className,
}) {
if (!fullScreen) {
return (
<div className={`spinner-wrapper ${className || "my-3 text-center"}`} {...props}>
<div className={`spinner-wrapper ${className || "my-3 text-center"}`}>
<SpinnerElement>{children}</SpinnerElement>
</div>
);
}
return (
<div className="spinner-fs-wrapper" {...props}>
<div className="spinner-fs-wrapper">
<div className="spinner-fs-background">
<SpinnerElement>{children}</SpinnerElement>
</div>
@ -46,6 +46,8 @@ export function Spinner({
SpinnerElement.propTypes = {
/** Spinner's size */
small: PropTypes.bool,
/** Additional className */
className: PropTypes.string,
/** Children components */
children: PropTypes.oneOfType([
PropTypes.arrayOf(PropTypes.node),
@ -53,13 +55,16 @@ SpinnerElement.propTypes = {
]),
};
export function SpinnerElement({ small, children }) {
export function SpinnerElement({ small, className, children }) {
return (
<>
<div className={`spinner-border ${small ? "spinner-border-sm" : ""}`} role="status">
<div
className={`spinner-border ${small ? "spinner-border-sm" : ""} ${className || ""}`.trim()}
role="status"
>
<span className="sr-only" />
</div>
<div className="spinner-text">{children}</div>
{children && <div className="spinner-text">{children}</div>}
</>
);
}

View File

@ -18,12 +18,12 @@ exports[`<Checkbox/> Render checkbox 1`] = `
for="1"
>
Test label
<small
class="form-text text-muted"
>
Some help text
</small>
</label>
<small
class="form-text text-muted"
>
Some help text
</small>
</div>
</div>
`;
@ -45,12 +45,12 @@ exports[`<Checkbox/> Render uncheked checkbox 1`] = `
for="1"
>
Test label
<small
class="form-text text-muted"
>
Some help text
</small>
</label>
<small
class="form-text text-muted"
>
Some help text
</small>
</div>
</div>
`;

View File

@ -0,0 +1,77 @@
/*
* 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.
*/
import React, { useState, useEffect } from "react";
import PropTypes from "prop-types";
import { useAPIPost } from "api/hooks";
import { API_STATE } from "api/utils";
import { ForisURLs } from "forisUrls";
import { Button } from "bootstrap/Button";
import {
Modal, ModalHeader, ModalBody, ModalFooter,
} from "bootstrap/Modal";
import { useAlert } from "alertContext/AlertContext";
RebootButton.propTypes = {
forisFormSize: PropTypes.bool,
};
export function RebootButton(props) {
const [triggered, setTriggered] = useState(false);
const [modalShown, setModalShown] = useState(false);
const [triggerRebootStatus, triggerReboot] = useAPIPost(ForisURLs.reboot);
const [setAlert] = useAlert();
useEffect(() => {
if (triggerRebootStatus.state === API_STATE.ERROR) {
setAlert(_("Reboot request failed."));
}
});
function rebootHandler() {
setTriggered(true);
triggerReboot();
setModalShown(false);
}
return (
<>
<RebootModal shown={modalShown} setShown={setModalShown} onReboot={rebootHandler} />
<Button
className="btn-danger"
loading={triggered}
disabled={triggered}
onClick={() => setModalShown(true)}
{...props}
>
{_("Reboot")}
</Button>
</>
);
}
RebootModal.propTypes = {
shown: PropTypes.bool.isRequired,
setShown: PropTypes.func.isRequired,
onReboot: PropTypes.func.isRequired,
};
function RebootModal({ shown, setShown, onReboot }) {
return (
<Modal shown={shown} setShown={setShown}>
<ModalHeader setShown={setShown} title={_("Reboot confirmation")} />
<ModalBody><p>{_("Are you sure you want to restart the router?")}</p></ModalBody>
<ModalFooter>
<Button onClick={() => setShown(false)}>{_("Cancel")}</Button>
<Button className="btn-danger" onClick={onReboot}>{_("Confirm reboot")}</Button>
</ModalFooter>
</Modal>
);
}

View File

@ -0,0 +1,55 @@
/*
* 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.
*/
import React from "react";
import { fireEvent, getByText, queryByText, render, wait } from "customTestRender";
import mockAxios from "jest-mock-axios";
import { mockJSONError } from "testUtils/network";
import { mockSetAlert } from "testUtils/alertContextMock";
import { RebootButton } from "../RebootButton";
describe("<RebootButton/>", () => {
let componentContainer;
beforeEach(() => {
const { container } = render(<>
<div id="modal-container"/>
<RebootButton/>
</>);
componentContainer = container;
});
it("Render.", () => {
expect(componentContainer)
.toMatchSnapshot();
});
it("Render modal.", () => {
expect(queryByText(componentContainer, "Confirm reboot"))
.toBeNull();
fireEvent.click(getByText(componentContainer, "Reboot"));
expect(componentContainer)
.toMatchSnapshot();
});
it("Confirm reboot.", () => {
fireEvent.click(getByText(componentContainer, "Reboot"));
fireEvent.click(getByText(componentContainer, "Confirm reboot"));
expect(mockAxios.post)
.toHaveBeenCalledWith("/reforis/api/reboot", undefined, expect.anything());
});
it("Hold error.", async () => {
fireEvent.click(getByText(componentContainer, "Reboot"));
fireEvent.click(getByText(componentContainer, "Confirm reboot"));
mockJSONError();
await wait(() => expect(mockSetAlert)
.toBeCalledWith("Reboot request failed."));
});
});

View File

@ -0,0 +1,94 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`<RebootButton/> Render modal. 1`] = `
<div>
<div
id="modal-container"
>
<div
class="modal fade show"
role="dialog"
>
<div
class="modal-dialog modal-dialog-centered"
role="document"
>
<div
class="modal-content"
>
<div
class="modal-header"
>
<h5
class="modal-title"
>
Reboot confirmation
</h5>
<button
class="close"
type="button"
>
<span
aria-hidden="true"
>
×
</span>
</button>
</div>
<div
class="modal-body"
>
<p>
Are you sure you want to restart the router?
</p>
</div>
<div
class="modal-footer"
>
<button
class="btn btn-primary "
type="button"
>
Cancel
</button>
<button
class="btn btn-danger"
type="button"
>
Confirm reboot
</button>
</div>
</div>
</div>
</div>
</div>
<button
class="btn btn-danger"
type="button"
>
Reboot
</button>
</div>
`;
exports[`<RebootButton/> Render. 1`] = `
<div>
<div
id="modal-container"
/>
<button
class="btn btn-danger"
type="button"
>
Reboot
</button>
</div>
`;

View File

@ -5,12 +5,14 @@
* See /LICENSE for more information.
*/
export const REFORIS_URL_PREFIX = process.env.LIGHTTPD ? "/reforis" : "";
export const REFORIS_URL_PREFIX = "/reforis";
export const REFORIS_API_URL_PREFIX = `${REFORIS_URL_PREFIX}/api`;
export const ForisURLs = {
login: `${REFORIS_URL_PREFIX}/login`,
static: `${REFORIS_URL_PREFIX}/static/reforis`,
wifi: `${REFORIS_URL_PREFIX}/network-settings/wifi`,
packageManagement: {
updateSettings: `${REFORIS_URL_PREFIX}/package-management/update-settings`,
updates: `${REFORIS_URL_PREFIX}/package-management/updates`,
@ -21,4 +23,7 @@ export const ForisURLs = {
notificationsSettings: "/administration/notifications-settings",
luci: "/cgi-bin/luci",
// API
reboot: `${REFORIS_API_URL_PREFIX}/reboot`,
};

View File

@ -20,14 +20,16 @@ import { useForisModule, useForm } from "../hooks";
import { STATES as SUBMIT_BUTTON_STATES, SubmitButton } from "./SubmitButton";
ForisForm.propTypes = {
/** WebSocket object see `scr/common/WebSockets.js`. */
/** Optional WebSocket object. See `scr/common/WebSockets.js`.
* `forisConfig.wsModule` should be specified when it's passed.
* */
ws: PropTypes.object,
/** Foris configuration object. See usage in main components. */
forisConfig: PropTypes.shape({
/** reForis Flask aplication API endpoint from `src/common/API.js`. */
endpoint: PropTypes.string.isRequired,
/** `foris-controller` module name to be used via WebSockets.
* If it's not passed then WebSockets aren't used
* It can be use only with `ws` prop.
* */
wsModule: PropTypes.string,
/** `foris-controller` action name to be used via WebSockets.
@ -49,6 +51,17 @@ ForisForm.propTypes = {
children: PropTypes.node.isRequired,
/** Optional override of form submit callback */
onSubmitOverridden: PropTypes.func,
// eslint-disable-next-line react/no-unused-prop-types
customWSProp(props) {
const wsModuleIsSpecified = !!(props.forisConfig && props.forisConfig.wsModule);
if (props.ws && !wsModuleIsSpecified) {
return new Error("forisConfig.wsModule should be specified when ws object is passed.");
}
if (!props.ws && wsModuleIsSpecified) {
return new Error("forisConfig.wsModule is specified without passing ws object.");
}
},
};
ForisForm.defaultProps = {
@ -103,7 +116,7 @@ export function ForisForm({
resetFormData();
const copiedFormData = JSON.parse(JSON.stringify(formState.data));
const preparedData = prepDataToSubmit(copiedFormData);
post(preparedData);
post({ data: preparedData });
}
function getSubmitButtonState() {

View File

@ -7,7 +7,12 @@
// API
export {
useAPIGet, useAPIPost, useAPIPatch, useAPIPut, useAPIDelete,
useAPIGet,
useAPIPost,
useAPIPatch,
useAPIPut,
useAPIDelete,
useAPIPolling,
} from "api/hooks";
export { API_STATE } from "api/utils";
@ -38,6 +43,9 @@ export {
ModalHeader,
} from "bootstrap/Modal";
// Common
export { RebootButton } from "common/RebootButton";
// Form
export { ForisForm } from "form/components/ForisForm";
export { SubmitButton, STATES as SUBMIT_BUTTON_STATES } from "form/components/SubmitButton";
@ -70,4 +78,4 @@ export {
} from "validations";
// Alert context
export { AlertContext, AlertContextProvider, useAlert } from "alertContext/AlertContext";
export { AlertContextProvider, useAlert } from "alertContext/AlertContext";

View File

@ -7,11 +7,11 @@
import React from "react";
import { AlertContext } from "../alertContext/AlertContext";
const mockSetAlert = jest.fn();
const mockDismissAlert = jest.fn();
window.AlertContext = React.createContext();
function AlertContextMock({ children }) {
return (
<AlertContext.Provider value={[mockSetAlert, mockDismissAlert]}>

View File

@ -26,16 +26,13 @@ exports[`conditional HOCs withSpinner should render spinner 1`] = `
class="spinner-wrapper my-3 text-center"
>
<div
class="spinner-border "
class="spinner-border"
role="status"
>
<span
class="sr-only"
/>
</div>
<div
class="spinner-text"
/>
</div>
</div>
`;
@ -46,16 +43,13 @@ exports[`conditional HOCs withSpinnerOnSending should render spinner 1`] = `
class="spinner-wrapper my-3 text-center"
>
<div
class="spinner-border "
class="spinner-border"
role="status"
>
<span
class="sr-only"
/>
</div>
<div
class="spinner-text"
/>
</div>
</div>
`;

View File

@ -14,7 +14,7 @@ import { ErrorMessage } from "./ErrorMessage";
function withEither(conditionalFn, Either) {
return (Component) => (props) => {
if (conditionalFn(props)) {
return <Either />;
return <Either {...props} />;
}
return <Component {...props} />;
};

View File

@ -61,9 +61,36 @@ export class WebSockets {
return this;
}
subscribe(params) {
subscribe(module) {
this.waitForConnection(() => {
this.send("subscribe", params);
this.send("subscribe", module);
});
return this;
}
unbind(module, action, callback) {
const callbacks = this.callbacks[module][action];
const index = callbacks.indexOf(callback);
if (index !== -1) {
callbacks.splice(index, 1);
}
if (callbacks.length === 0) {
delete this.callbacks[module][action];
}
if (Object.keys(this.callbacks[module]).length === 0) {
this.unsubscribe(module);
}
return this;
}
unsubscribe(module) {
this.waitForConnection(() => {
this.send("unsubscribe", module);
delete this.callbacks[module];
});
return this;
}
@ -82,15 +109,15 @@ export class WebSockets {
let chain;
try {
chain = this.callbacks[json.module][json.action];
} catch (e) {
if (e instanceof TypeError) {
console.log(`Callback for this message wasn't found:${e.data}`);
} else throw e;
} catch (error) {
if (error instanceof TypeError) {
console.log(`Callback for this message wasn't found:${error.data}`);
} else throw error;
}
if (typeof chain === "undefined") return;
for (let i = 0; i < chain.length; i++) chain[i](json);
chain.forEach((callback) => callback(json));
}
close() {

View File

@ -11,12 +11,21 @@ export function useWSForisModule(ws, module, action = "update_settings") {
const [data, setData] = useState(null);
useEffect(() => {
if (ws && module) {
ws.subscribe(module)
.bind(module, action, (msg) => {
setData(msg.data);
});
// Sometimes we want to disable this hook if WS is not passed. We can't make conditional
// hooks, but we can disable it here. It's used especially in ForisForm when a module
// doesn't present any WS endpoint.
if (!ws) return;
function callback(msg) {
setData(msg.data);
}
ws.subscribe(module)
.bind(module, action, callback);
return () => {
ws.unbind(module, action, callback);
};
}, [action, module, ws]);
return [data];

View File

@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"PO-Revision-Date: 2019-08-28 12:55+0000\n"
"Last-Translator: Stepan Henek <stepan+github@henek.name>\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-11-21 17:04+0000\n"
"Last-Translator: Pavel Borecki <pavel.borecki@gmail.com>\n"
"Language: cs\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/turris/foris-"
"js/cs/>\n"
@ -21,7 +21,7 @@ msgstr ""
#: src/validations.js:13
msgid "This is not a valid IPv4 address."
msgstr "Tohle není platná IPv4 adresa."
msgstr "Toto není platná IPv4 adresa."
#: src/validations.js:14
msgid "This is not a valid IPv6 address."
@ -29,11 +29,11 @@ msgstr "Tohle není platná IPv6 adresa."
#: src/validations.js:15
msgid "This is not a valid IPv6 prefix."
msgstr "Tohle není platný IPv6 prefix."
msgstr "Toto není platný IPv6 prefix."
#: src/validations.js:16
msgid "This is not a valid domain name."
msgstr "Tohle není platné doménové jméno."
msgstr "Toto není platné doménové jméno."
#: src/validations.js:17
msgid "This is not a valid DUID."
@ -41,7 +41,7 @@ msgstr "Tohle není platné DUID."
#: src/validations.js:18
msgid "This is not a valid MAC address."
msgstr "Tohle není platná MAC adresa."
msgstr "Toto není platná MAC adresa."
#: src/validations.js:19
msgid "Doesn't contain a list of emails separated by commas."
@ -49,27 +49,51 @@ msgstr "Neobsahuje seznam e-mailů oddělených čárkou."
#: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
msgstr "Platnost relace skončila. Přihlaste se znovu."
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
msgstr "Došlo k chybě kvůli překročení časového limitu."
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
msgstr "Neobdržena žádná odezva."
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
msgstr "Došlo k neznámé chybě. Další informace naleznete v konzoli."
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr "Došlo k neznámé chybě v aplikačním programovém rozhraní."
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
msgstr "Nastavení úspěšně uložena"
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?"
@ -91,7 +115,7 @@ msgstr "Uložit"
#: src/utils/ErrorMessage.js:13
msgid "An error occurred while fetching data."
msgstr ""
msgstr "Došlo k chybě při získávání dat."
#~ msgid "Settings were successfully saved."
#~ msgstr "Nastavení bylo úspěšně uloženo."
@ -99,3 +123,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr "Ukládání nastavení selhalo."
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:54+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: da\n"
@ -66,6 +66,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
@ -96,3 +120,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:54+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: de\n"
@ -66,6 +66,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
@ -96,3 +120,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:54+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: el\n"
@ -66,6 +66,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
@ -96,3 +120,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:21+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: en\n"
@ -66,6 +66,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
@ -96,3 +120,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -0,0 +1,128 @@
# Spanish translations for PROJECT.
# Copyright (C) 2019 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
#
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language: es\n"
"Language-Team: none\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.7.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 ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr ""
#: src/form/components/SubmitButton.js:32
msgid "Updating"
msgstr ""
#: src/form/components/SubmitButton.js:35
msgid "Load settings"
msgstr ""
#: src/form/components/SubmitButton.js:38
msgid "Save"
msgstr ""
#: src/utils/ErrorMessage.js:13
msgid "An error occurred while fetching data."
msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:54+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: fi\n"
@ -66,6 +66,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
@ -96,3 +120,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:54+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: fo\n"
@ -66,6 +66,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
@ -96,3 +120,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\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"
@ -65,6 +65,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:54+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: fr\n"
@ -66,6 +66,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
@ -96,3 +120,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:55+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: hr\n"
@ -67,6 +67,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
@ -97,3 +121,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:55+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: hu\n"
@ -66,6 +66,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
@ -96,3 +120,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:55+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: it\n"
@ -66,6 +66,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
@ -96,3 +120,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:55+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: ja\n"
@ -66,6 +66,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
@ -96,3 +120,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:55+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: ko\n"
@ -66,6 +66,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
@ -96,3 +120,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:55+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: lt\n"
@ -67,6 +67,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
@ -97,3 +121,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:56+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: nb\n"
@ -66,6 +66,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
@ -96,3 +120,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:55+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: nb_NO\n"
@ -66,6 +66,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
@ -96,3 +120,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:56+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: nl\n"
@ -66,6 +66,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
@ -96,3 +120,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:56+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: pl\n"
@ -67,6 +67,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
@ -97,3 +121,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:56+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: ro\n"
@ -67,6 +67,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
@ -97,3 +121,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:56+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: ru\n"
@ -67,6 +67,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
@ -97,3 +121,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:56+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: sk\n"
@ -66,6 +66,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
@ -96,3 +120,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-11-14 11:13+0100\n"
"POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:56+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: sv\n"
@ -66,6 +66,30 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
@ -96,3 +120,15 @@ msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""