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

Compare commits

..

23 Commits

Author SHA1 Message Date
a7a4e76cd1 Merge branch 'dev' into 'master'
Dev

See merge request turris/reforis/foris-js!245
2024-09-25 16:22:09 +02:00
e7758cab9a Merge branch 'bump-version-621' into 'dev'
Bump v6.2.1

See merge request turris/reforis/foris-js!243
2024-09-25 16:20:01 +02:00
bf88b76613 Bump v6.2.1
* Add & update Weblate translations
* Refactor CopyInput component
* Refactor ForisURLs to include new URLs for Overview page
2024-09-25 16:15:56 +02:00
3cf85a9516 Merge branch 'update-translations' into 'dev'
Add & update Weblate translations

See merge request turris/reforis/foris-js!244
2024-09-25 16:14:48 +02:00
7c8442300a Update translation messages 2024-09-25 16:11:22 +02:00
e849397aa2 Create translation messages 2024-09-25 16:11:07 +02:00
c1b44d498c Translated using Weblate (Czech)
Currently translated at 100.0% (71 of 71 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/cs/
2024-09-25 10:15:45 +00:00
1b5a5da953 Merge branch 'add-overview-links' into 'dev'
Refactor ForisURLs to include new URLs for Overview page

See merge request turris/reforis/foris-js!242
2024-09-24 13:19:55 +02:00
7f45201f05 Refactor ForisURLs to include new URLs for Overview page 2024-09-23 17:09:13 +02:00
f34d9bbdbd Merge branch 'fix-copy-input' into 'dev'
Refactor CopyInput component

See merge request turris/reforis/foris-js!241
2024-09-23 14:07:06 +02:00
c7ff3f42f6 Refactor CopyInput component
Remove unnecessary input-group-append div and simplify structure
2024-09-23 13:59:31 +02:00
a1036514dd Translated using Weblate (Slovak)
Currently translated at 100.0% (71 of 71 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/sk/
2024-09-20 14:06:15 +02:00
a352f12279 Merge branch 'dev' into 'master'
Dev

See merge request turris/reforis/foris-js!240
2024-09-20 14:06:10 +02:00
acfbeb2c43 Merge branch 'bump-version-620' into 'dev'
Bump v6.2.0

See merge request turris/reforis/foris-js!239
2024-09-20 13:51:48 +02:00
3bef624ce4 Bump v6.2.0
* Add useFocusTrap hook
* Add extendSession endpoint
* Refactor Spinner.css to use CSS variable for color
* Refactor Modal component to use useFocusTrap hook
* Refactor Alert component to use useFocusTrap hook
2024-09-20 13:36:45 +02:00
7d0d52666d Merge branch 'add-extend-session-url' into 'dev'
Add extendSession endpoint ot ForisURLs

See merge request turris/reforis/foris-js!238
2024-09-20 13:27:22 +02:00
52fe5d65a6 Refactor Spinner.css to use CSS variable for color 2024-09-20 13:23:01 +02:00
b99add91cf Refactor ForisURLs.js to add extendSession endpoint 2024-09-20 13:23:01 +02:00
b7a4613cf4 Merge branch 'modal-focus-trap' into 'dev'
Introduce useFocusTrap hook and refactor Modal & Alert components

See merge request turris/reforis/foris-js!237
2024-09-19 13:18:26 +02:00
9e2278e016 Update Snapshots 2024-09-17 14:33:41 +02:00
83a6ff75f6 Refactor Alert component to use useFocusTrap hook 2024-09-17 14:33:19 +02:00
02f3803265 Refactor Modal component to use useFocusTrap hook 2024-09-17 14:13:26 +02:00
bb559cbe53 Merge branch 'dev' into 'master'
Dev

See merge request turris/reforis/foris-js!236
2024-08-30 16:03:17 +02:00
40 changed files with 316 additions and 280 deletions

View File

@ -8,6 +8,30 @@ and this project adheres to
## [Unreleased]
## [6.2.1] - 2024-09-25
### Added
- Added & updated Weblate translations
### Changed
- Refactored CopyInput component
- Refactored ForisURLs to include new URLs for Overview page
## [6.2.0] - 2024-09-20
### Added
- Added useFocusTrap hook
- Added extendSession endpoint
### Changed
- Refactored Spinner.css to use CSS variable for color
- Refactored Modal component to use useFocusTrap hook
- Refactored Alert component to use useFocusTrap hook
## [6.1.1] - 2024-08-30
### Added
@ -361,7 +385,9 @@ and this project adheres to
## [0.0.7] - 2019-09-02
[unreleased]:
https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.1.1...master
https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.2.1...dev
[6.2.1]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.2.0...v6.2.1
[6.2.0]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.1.1...v6.2.0
[6.1.1]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.1.0...v6.1.1
[6.1.0]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.0.3...v6.1.0
[6.0.3]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.0.2...v6.0.3

128
package-lock.json generated
View File

@ -1,12 +1,12 @@
{
"name": "foris",
"version": "6.1.1",
"version": "6.2.1",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "foris",
"version": "6.1.1",
"version": "6.2.1",
"license": "GPL-3.0",
"dependencies": {
"@fortawesome/fontawesome-svg-core": "^6.6.0",
@ -18,8 +18,7 @@
"moment": "^2.30.1",
"qrcode.react": "^3.1.0",
"react-datetime": "^3.2.0",
"react-uid": "^2.3.3",
"socket.io-client": "^4.6.1"
"react-uid": "^2.3.3"
},
"devDependencies": {
"@babel/cli": "^7.24.7",
@ -3584,12 +3583,6 @@
"@sinonjs/commons": "^3.0.0"
}
},
"node_modules/@socket.io/component-emitter": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
"integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
"license": "MIT"
},
"node_modules/@testing-library/dom": {
"version": "5.6.1",
"resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-5.6.1.tgz",
@ -6379,6 +6372,7 @@
"version": "4.3.5",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
"integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
"dev": true,
"dependencies": {
"ms": "2.1.2"
},
@ -6728,28 +6722,6 @@
"node": ">= 0.8"
}
},
"node_modules/engine.io-client": {
"version": "6.5.4",
"resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.4.tgz",
"integrity": "sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==",
"license": "MIT",
"dependencies": {
"@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.1",
"engine.io-parser": "~5.2.1",
"ws": "~8.17.1",
"xmlhttprequest-ssl": "~2.0.0"
}
},
"node_modules/engine.io-parser": {
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
"integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
"license": "MIT",
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/enhanced-resolve": {
"version": "5.17.1",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
@ -13976,7 +13948,8 @@
"node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
"node_modules/multicast-dns": {
"version": "7.2.5",
@ -16579,34 +16552,6 @@
"integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
"dev": true
},
"node_modules/socket.io-client": {
"version": "4.7.5",
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz",
"integrity": "sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==",
"license": "MIT",
"dependencies": {
"@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.2",
"engine.io-client": "~6.5.2",
"socket.io-parser": "~4.2.4"
},
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/socket.io-parser": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
"integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
"license": "MIT",
"dependencies": {
"@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.1"
},
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/sockjs": {
"version": "0.3.24",
"resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
@ -18415,6 +18360,7 @@
"version": "8.17.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
"integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10.0.0"
@ -18447,14 +18393,6 @@
"integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
"dev": true
},
"node_modules/xmlhttprequest-ssl": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz",
"integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
@ -21115,11 +21053,6 @@
"@sinonjs/commons": "^3.0.0"
}
},
"@socket.io/component-emitter": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
"integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="
},
"@testing-library/dom": {
"version": "5.6.1",
"resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-5.6.1.tgz",
@ -23329,6 +23262,7 @@
"version": "4.3.5",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
"integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
"dev": true,
"requires": {
"ms": "2.1.2"
}
@ -23588,23 +23522,6 @@
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"dev": true
},
"engine.io-client": {
"version": "6.5.4",
"resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.4.tgz",
"integrity": "sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==",
"requires": {
"@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.1",
"engine.io-parser": "~5.2.1",
"ws": "~8.17.1",
"xmlhttprequest-ssl": "~2.0.0"
}
},
"engine.io-parser": {
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
"integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q=="
},
"enhanced-resolve": {
"version": "5.17.1",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
@ -29030,7 +28947,8 @@
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
"multicast-dns": {
"version": "7.2.5",
@ -30959,26 +30877,6 @@
}
}
},
"socket.io-client": {
"version": "4.7.5",
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz",
"integrity": "sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==",
"requires": {
"@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.2",
"engine.io-client": "~6.5.2",
"socket.io-parser": "~4.2.4"
}
},
"socket.io-parser": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
"integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
"requires": {
"@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.1"
}
},
"sockjs": {
"version": "0.3.24",
"resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
@ -32300,6 +32198,7 @@
"version": "8.17.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
"integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
"dev": true,
"requires": {}
},
"xml-name-validator": {
@ -32314,11 +32213,6 @@
"integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
"dev": true
},
"xmlhttprequest-ssl": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz",
"integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A=="
},
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",

View File

@ -1,6 +1,6 @@
{
"name": "foris",
"version": "6.1.1",
"version": "6.2.1",
"description": "Foris JS library is a set of components and utils for reForis application and plugins.",
"author": "CZ.NIC, z.s.p.o.",
"repository": {
@ -23,8 +23,7 @@
"moment": "^2.30.1",
"qrcode.react": "^3.1.0",
"react-datetime": "^3.2.0",
"react-uid": "^2.3.3",
"socket.io-client": "^4.6.1"
"react-uid": "^2.3.3"
},
"peerDependencies": {
"bootstrap": "^5.3.3",

View File

@ -5,10 +5,12 @@
* See /LICENSE for more information.
*/
import React from "react";
import React, { useRef } from "react";
import PropTypes from "prop-types";
import { useFocusTrap } from "../utils/hooks";
export const ALERT_TYPES = Object.freeze({
PRIMARY: "primary",
SECONDARY: "secondary",
@ -37,11 +39,15 @@ Alert.defaultProps = {
};
function Alert({ type, onDismiss, children }) {
const alertRef = useRef();
useFocusTrap(alertRef, !!onDismiss);
return (
<div
ref={alertRef}
className={`alert alert-${type} ${
onDismiss ? "alert-dismissible" : ""
}`.trim()}
role="alert"
>
{onDismiss && (
<button

View File

@ -48,15 +48,13 @@ function CopyInput({ value, ...props }) {
return (
<Input type="text" value={value} ref={inputTextRef} {...props}>
<div className="input-group-append">
<button
className="btn btn-outline-secondary"
type="button"
onClick={handleCopyClick}
>
<span>{isCopied ? _("Copied!") : _("Copy")}</span>
</button>
</div>
<button
className="btn btn-outline-secondary"
type="button"
onClick={handleCopyClick}
>
<span>{isCopied ? _("Copied!") : _("Copy")}</span>
</button>
</Input>
);
}

View File

@ -9,7 +9,7 @@ import React, { useRef, useEffect } from "react";
import PropTypes from "prop-types";
import { useClickOutside } from "../utils/hooks";
import { useClickOutside, useFocusTrap } from "../utils/hooks";
import Portal from "../utils/Portal";
import "./Modal.css";
@ -29,10 +29,11 @@ Modal.propTypes = {
};
export function Modal({ shown, setShown, scrollable, size, children }) {
const dialogRef = useRef();
const modalRef = useRef();
let modalSize = "modal-";
useClickOutside(dialogRef, () => setShown(false));
useClickOutside(modalRef, () => setShown(false));
useFocusTrap(modalRef, shown);
useEffect(() => {
const handleEsc = (event) => {
@ -65,11 +66,13 @@ export function Modal({ shown, setShown, scrollable, size, children }) {
return (
<Portal containerId="modal-container">
<div
ref={modalRef}
className={`modal fade ${shown ? "show" : ""}`.trim()}
role="dialog"
aria-modal="true"
aria-labelledby="modal-title"
>
<div
ref={dialogRef}
className={`${modalSize.trim()} modal-dialog modal-dialog-centered ${
scrollable ? "modal-dialog-scrollable" : ""
}`.trim()}
@ -90,7 +93,7 @@ ModalHeader.propTypes = {
export function ModalHeader({ setShown, title }) {
return (
<div className="modal-header">
<h5 className="modal-title">{title}</h5>
<h1 className="modal-title fs-5">{title}</h1>
<button
type="button"
className="btn-close"

View File

@ -9,7 +9,7 @@
.spinner-wrapper .spinner-border {
width: 4rem;
height: 4rem;
color: #00a2e2;
color: var(--bs-primary);
}
.spinner-fs-background {

View File

@ -26,7 +26,7 @@ function ResetWiFiSettings({ ws, endpoint }) {
useEffect(() => {
const module = "wifi";
ws.bind(module, "reset", () => {
ws.subscribe(module).bind(module, "reset", () => {
// eslint-disable-next-line no-restricted-globals
setTimeout(() => location.reload(), 1000);
});

View File

@ -46,7 +46,7 @@ describe("<RebootButton/>", () => {
fireEvent.click(getByText(componentContainer, "Reboot"));
fireEvent.click(getByText(componentContainer, "Confirm reboot"));
expect(mockAxios.post).toHaveBeenCalledWith(
"/api/reboot",
"/reforis/api/reboot",
undefined,
expect.anything()
);

View File

@ -6,6 +6,8 @@ exports[`<RebootButton/> Render modal. 1`] = `
id="modal-container"
>
<div
aria-labelledby="modal-title"
aria-modal="true"
class="modal fade show"
role="dialog"
>
@ -19,11 +21,11 @@ exports[`<RebootButton/> Render modal. 1`] = `
<div
class="modal-header"
>
<h5
class="modal-title"
<h1
class="modal-title fs-5"
>
Warning!
</h5>
</h1>
<button
aria-label="Close"
class="btn-close"

View File

@ -7,6 +7,7 @@ exports[`AlertContext should render alert 1`] = `
>
<div
class="alert alert-danger alert-dismissible"
role="alert"
>
<button
aria-label="Close"

View File

@ -10,4 +10,3 @@ global._ = (str) => str;
global.ngettext = (str) => str;
global.babel = { format: (str) => str };
global.ForisTranslations = { locale: "en" };
global.setImmediate = (fn) => setTimeout(fn, 0);

View File

@ -5,12 +5,14 @@
* See /LICENSE for more information.
*/
export const REFORIS_URL_PREFIX = process.env.REFORIS_PREFIX || "";
export const REFORIS_URL_PREFIX = "/reforis";
export const REFORIS_API_URL_PREFIX = `${REFORIS_URL_PREFIX}/api`;
export const ForisURLs = {
// turris-auth
login: `/login?${REFORIS_URL_PREFIX}/`,
logout: `/logout`,
extendSession: `/extend-session`,
static: `${REFORIS_URL_PREFIX}/static/reforis`,
wifi: `${REFORIS_URL_PREFIX}/network-settings/wifi`,
@ -25,6 +27,13 @@ export const ForisURLs = {
storage: `${REFORIS_URL_PREFIX}/storage`,
sentinelAgreement: `${REFORIS_URL_PREFIX}/sentinel/agreement`,
// URLs without prefix for Overview page
openvpnClientSettings: "/openvpn/client-settings",
packageManagementPackages: "/package-management/packages",
packageManagementUpdateSettings: "/package-management/update-settings",
sentinelLicenseAgreement: "/sentinel/agreement",
librespeedSpeedTest: "/librespeed/speed-test",
// Notifications links are used with <Link/> inside Router, thus url subdir is not required.
overview: "/overview",
notifications: "/overview#notifications",

View File

@ -40,3 +40,40 @@ export function useClickOutside(element, callback) {
};
});
}
/* Trap focus inside element. */
export function useFocusTrap(elementRef, condition = true) {
useEffect(() => {
if (!condition) {
return;
}
const currentElement = elementRef.current;
const focusableElements = currentElement.querySelectorAll(
'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
);
const firstElement = focusableElements[0];
const lastElement = focusableElements[focusableElements.length - 1];
const handleTab = (event) => {
if (event.key === "Tab") {
if (event.shiftKey) {
if (document.activeElement === firstElement) {
lastElement.focus();
event.preventDefault();
}
} else if (document.activeElement === lastElement) {
firstElement.focus();
event.preventDefault();
}
}
};
currentElement.addEventListener("keydown", handleTab);
firstElement.focus();
return () => {
currentElement.removeEventListener("keydown", handleTab);
};
}, [elementRef, condition]);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2024 CZ.NIC z.s.p.o. (https://www.nic.cz/)
* Copyright (C) 2020-2022 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.
@ -7,33 +7,47 @@
/* eslint no-console: "off" */
import { io } from "socket.io-client";
const PROTOCOL = window.location.protocol === "http:" ? "ws" : "wss";
import { REFORIS_URL_PREFIX } from "../utils/forisUrls";
const URL = process.env.LIGHTTPD
? `${PROTOCOL}://${window.location.host}/${process.env.WSPATH || "foris-ws"}`
: `${PROTOCOL}://${window.location.hostname}:9081`;
const WAITING_FOR_CONNECTION_TIMEOUT = 500;
class WebSockets {
constructor() {
this.socket = io("/notifications", {
path: `${REFORIS_URL_PREFIX}/reforis-ws`,
});
this.connection = null;
this.socket.on("disconnect", (reason) => {
this.connection = null;
console.debug(`SocketIO disconnected (${reason})`);
});
this.socket.on("notification", (message) => {
console.debug("WS: Received Message:", message);
this.dispatch(message);
});
this.socket.on("connect", (connection) => {
this.connection = connection;
console.debug(`SocketIO connected.`);
});
this.ws = new WebSocket(URL);
this.ws.onerror = (e) => {
console.error("WS: Error:", e);
};
this.ws.onmessage = (e) => {
console.debug(`WS: Received Message: ${e.data}`);
const data = JSON.parse(e.data);
this.dispatch(data);
};
this.ws.onopen = () => {
console.debug("WS: Connection open.");
};
this.ws.onclose = () => {
console.debug("WS: Connection closed.");
};
// callbacks[module][action]
this.callbacks = {};
}
waitForConnection(callback) {
if (this.ws.readyState === 1) {
callback();
} else {
const that = this;
setTimeout(() => {
that.waitForConnection(callback);
}, WAITING_FOR_CONNECTION_TIMEOUT);
}
}
bind(module, action, callback) {
this.callbacks[module] = this.callbacks[module] || {};
this.callbacks[module][action] = this.callbacks[module][action] || [];
@ -41,6 +55,13 @@ class WebSockets {
return this;
}
subscribe(module) {
this.waitForConnection(() => {
this.send("subscribe", module);
});
return this;
}
unbind(module, action, callback) {
const callbacks = this.callbacks[module][action];
@ -54,12 +75,28 @@ class WebSockets {
}
if (Object.keys(this.callbacks[module]).length === 0) {
delete this.callbacks[module];
this.unsubscribe(module);
}
return this;
}
unsubscribe(module) {
this.waitForConnection(() => {
this.send("unsubscribe", module);
delete this.callbacks[module];
});
return this;
}
send(action, params) {
const payload = JSON.stringify({ action, params });
this.waitForConnection(() => {
this.ws.send(payload);
});
return this;
}
dispatch(json) {
if (!json.module) return;
@ -68,17 +105,20 @@ class WebSockets {
chain = this.callbacks[json.module][json.action];
} catch (error) {
if (error instanceof TypeError) {
console.debug(
`Callbacks for this module wasn't found: ${json.module}`
console.warn(
`Callback for this message wasn't found:${error.data}`
);
} else throw error;
}
if (typeof chain === "undefined") return;
console.debug("Handling WS message", json);
chain.forEach((callback) => callback(json));
}
close() {
this.ws.close();
}
}
export default WebSockets;

View File

@ -33,7 +33,7 @@ function useWSForisModule(
setData(message.data);
}
ws.bind(module, action, callback);
ws.subscribe(module).bind(module, action, callback);
return () => {
ws.unbind(module, action, callback);

View File

@ -7,13 +7,13 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"PO-Revision-Date: 2023-11-23 16:03+0000\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2024-09-25 10:15+0000\n"
"Last-Translator: Lukas Jelinek <lukas.jelinek@nic.cz>\n"
"Language: cs\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/turris/foris-"
"js/cs/>\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
@ -35,9 +35,10 @@ msgstr "Neobdržena žádná odezva."
msgid "An unknown API error occurred."
msgstr "Došlo k neznámé chybě v aplikačním programovém rozhraní."
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
msgstr "Zavřít"
#: src/bootstrap/CopyInput.js:57
msgid "Copied!"
@ -99,7 +100,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr "Wi-Fi ${deviceID + 1}"
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Heslo"
@ -145,15 +146,14 @@ msgstr "Zapnout Wi-Fi pro hosty"
#: src/common/WiFiSettings/WiFiQRCode.js:43
#: src/common/WiFiSettings/WiFiQRCode.js:44
#, fuzzy
msgid "Show QR code"
msgstr "Wi-Fi QR kód"
msgstr "Ukázat QR kód"
#: src/common/WiFiSettings/WiFiQRCode.js:70
msgid "Wi-Fi QR Code"
msgstr "Wi-Fi QR kód"
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr "Stáhnout PDF"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2019-02-19 13:34+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: da\n"
@ -34,7 +34,8 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
@ -95,7 +96,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -146,7 +147,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
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: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2024-01-04 21:08+0000\n"
"Last-Translator: Erik Pfannenstein <debianignatz@gmx.de>\n"
"Language: de\n"
@ -35,7 +35,8 @@ msgstr "Keine Antwort erhalten."
msgid "An unknown API error occurred."
msgstr "Ein unbekannter API-Fehler ist aufgetreten."
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
@ -101,7 +102,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr "WLAN ${deviceID + 1}"
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Passwort"
@ -155,7 +156,7 @@ msgstr "WLAN QR-Code"
msgid "Wi-Fi QR Code"
msgstr "WLAN QR-Code"
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr "PDF herunterladen"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2021-02-09 16:50+0000\n"
"Last-Translator: Michalis <michalisntovas@yahoo.gr>\n"
"Language: el\n"
@ -35,7 +35,8 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
@ -96,7 +97,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -148,7 +149,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
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: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2019-10-17 09:28+0000\n"
"Last-Translator: Scott Anecito <scott.anecito@protonmail.com>\n"
"Language: en\n"
@ -35,7 +35,8 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
@ -96,7 +97,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -147,7 +148,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr ""

View File

@ -7,17 +7,16 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2024-08-24 13:09+0000\n"
"Last-Translator: gallegonovato <fran-carro@hotmail.es>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/turris/foris-js/"
"es/>\n"
"Language: es\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/turris/foris-"
"js/es/>\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"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.7.1-dev\n"
"Generated-By: Babel 2.16.0\n"
#: src/api/utils.js:61
@ -38,7 +37,8 @@ msgstr ""
"Un error desconocido ha ocurrido. Compruebe la consola para mas "
"informaciòn."
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr "Cerrar"
@ -102,7 +102,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr "Wi-Fi ${deviceID + 1}"
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Contraseña"
@ -155,7 +155,7 @@ msgstr "Mostrar el código QR"
msgid "Wi-Fi QR Code"
msgstr "Código QR Wi-Fi"
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr "Descargar PDF"
@ -446,3 +446,4 @@ msgstr "No contiene una lista de correos electrónicos separados por comas."
#~ " default option with 20 MHz wide "
#~ "channel."
#~ 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: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2019-02-19 13:34+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: fi\n"
@ -34,7 +34,8 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
@ -95,7 +96,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -146,7 +147,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
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: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2019-02-19 13:34+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: fo\n"
@ -34,7 +34,8 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
@ -95,7 +96,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -146,7 +147,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr ""

View File

@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Foris JS 6.1.0\n"
"Project-Id-Version: Foris JS 6.2.0\n"
"Report-Msgid-Bugs-To: tech.support@turris.cz\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+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"
@ -33,7 +33,8 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
@ -94,7 +95,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -145,7 +146,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
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: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2024-07-27 01:09+0000\n"
"Last-Translator: Moha684 <nahil82466@gmail.com>\n"
"Language: fr\n"
@ -35,7 +35,8 @@ msgstr "Aucun réponse reçue."
msgid "An unknown API error occurred."
msgstr "Une erreur dAPI inconnue sest produite."
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
@ -98,7 +99,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr "Wi-Fi ${deviceID + 1}"
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Mot de passe"
@ -153,7 +154,7 @@ msgstr "Code QR Wi-Fi"
msgid "Wi-Fi QR Code"
msgstr "Code QR Wi-Fi"
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr "Télécharger le PDF"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2022-09-29 14:17+0000\n"
"Last-Translator: Milo Ivir <mail@milotype.de>\n"
"Language: hr\n"
@ -36,7 +36,8 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
@ -97,7 +98,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Lozinka"
@ -148,7 +149,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
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: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2021-01-07 01:26+0000\n"
"Last-Translator: Zoli <boritek@gmail.com>\n"
"Language: hu\n"
@ -35,7 +35,8 @@ msgstr "Nem érkezett válasz."
msgid "An unknown API error occurred."
msgstr "Ismeretlen API-hiba történt."
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
@ -96,7 +97,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -147,7 +148,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
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: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2022-12-31 23:48+0000\n"
"Last-Translator: Anselmo <anselmo@casinadicornia.com>\n"
"Language: it\n"
@ -35,7 +35,8 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
@ -96,7 +97,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Password"
@ -147,7 +148,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
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: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2019-10-16 10:08+0000\n"
"Last-Translator: Scott Anecito <scott.anecito@protonmail.com>\n"
"Language: ja\n"
@ -35,7 +35,8 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
@ -96,7 +97,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -148,7 +149,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
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: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2019-02-19 13:34+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: ko\n"
@ -34,7 +34,8 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
@ -95,7 +96,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -146,7 +147,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
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: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2019-02-19 13:34+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: lt\n"
@ -35,7 +35,8 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
@ -96,7 +97,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -147,7 +148,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
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: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2023-03-02 11:40+0000\n"
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
"Language: nb_NO\n"
@ -36,7 +36,8 @@ msgstr "Fikk ikke svar."
msgid "An unknown API error occurred."
msgstr "Ukjent API-feil."
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
@ -103,7 +104,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr "Wi-Fi ${deviceID + 1}"
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Passord"
@ -161,7 +162,7 @@ msgstr "QR-kode for Wi-Fi"
msgid "Wi-Fi QR Code"
msgstr "QR-kode for Wi-Fi"
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr "Last ned PDF"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2024-01-04 21:08+0000\n"
"Last-Translator: powerburner-nl <peter.mulder.1981@gmail.com>\n"
"Language: nl\n"
@ -35,7 +35,8 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
@ -97,7 +98,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Wachtwoord"
@ -149,7 +150,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
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: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2023-03-07 16:37+0000\n"
"Last-Translator: Arusekk <arek_koz@o2.pl>\n"
"Language: pl\n"
@ -36,7 +36,8 @@ msgstr "Brak odpowiedzi."
msgid "An unknown API error occurred."
msgstr "Wystąpił nieznany błąd API."
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
@ -97,7 +98,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Hasło"
@ -148,7 +149,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
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: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2021-12-21 12:52+0000\n"
"Last-Translator: c10l <weblate.org@a.c10l.cc>\n"
"Language: pt_BR\n"
@ -35,7 +35,8 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
@ -96,7 +97,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -147,7 +148,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
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: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2019-02-19 13:35+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: ro\n"
@ -35,7 +35,8 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
@ -96,7 +97,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -147,7 +148,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
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: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2022-12-07 12:47+0000\n"
"Last-Translator: Алексей Леньшин <alenshin@gmail.com>\n"
"Language: ru\n"
@ -36,7 +36,8 @@ msgstr "Ответ не получен."
msgid "An unknown API error occurred."
msgstr "Неизвестная ошибка программного интерфейса приложения."
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
@ -100,7 +101,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr "Wi-Fi ${deviceID + 1}"
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Пароль"
@ -154,7 +155,7 @@ msgstr "QR-код Wi-Fi"
msgid "Wi-Fi QR Code"
msgstr "QR-код Wi-Fi"
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr "Скачать PDF"

View File

@ -7,13 +7,13 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"PO-Revision-Date: 2023-01-17 22:51+0000\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2024-09-09 18:09+0000\n"
"Last-Translator: Atec <dr.atec@gmail.com>\n"
"Language: sk\n"
"Language-Team: Slovak <https://hosted.weblate.org/projects/turris/foris-"
"js/sk/>\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
@ -35,9 +35,10 @@ msgstr "Nenastala žiadna odozva."
msgid "An unknown API error occurred."
msgstr "Nastala neznáma chyba v API."
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
msgstr "Zatvoriť"
#: src/bootstrap/CopyInput.js:57
msgid "Copied!"
@ -99,7 +100,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr "Wi-Fi ${deviceID + 1}"
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Heslo"
@ -145,15 +146,14 @@ msgstr "Povoliť Wi-Fi pre hostí"
#: src/common/WiFiSettings/WiFiQRCode.js:43
#: src/common/WiFiSettings/WiFiQRCode.js:44
#, fuzzy
msgid "Show QR code"
msgstr "Wi-Fi QR kód"
msgstr "Zobraziť QR kód"
#: src/common/WiFiSettings/WiFiQRCode.js:70
msgid "Wi-Fi QR Code"
msgstr "Wi-Fi QR kód"
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr "Stiahnuť PDF"
@ -184,7 +184,7 @@ msgstr "Heslo nesmie obsahovať viac ako 63 znakov"
#: src/common/WiFiSettings/constants.js:9
msgid "Disabled"
msgstr "Zakázané"
msgstr "Vypnuté"
#: src/common/WiFiSettings/constants.js:10
msgid "802.11n - 20 MHz wide channel"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-09-25 16:10+0200\n"
"PO-Revision-Date: 2023-09-22 21:00+0000\n"
"Last-Translator: Kristoffer Grundström "
"<swedishsailfishosuser@tutanota.com>\n"
@ -36,7 +36,8 @@ msgstr "Inget svar togs emot."
msgid "An unknown API error occurred."
msgstr "Ett okänt API-fel inträffade."
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
@ -100,7 +101,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr "Wi-Fi ${deviceID + 1}"
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Lösenord"
@ -154,7 +155,7 @@ msgstr "QR-kod för Wi-Fi"
msgid "Wi-Fi QR Code"
msgstr "QR-kod för Wi-Fi"
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr "Ladda ner PDF"