mirror of
https://gitlab.nic.cz/turris/reforis/foris-js.git
synced 2025-07-04 16:12:26 +02:00
Compare commits
57 Commits
v5.5.0
...
61ff82ca26
Author | SHA1 | Date | |
---|---|---|---|
61ff82ca26 | |||
01e1fca913 | |||
ff53e2487d | |||
e1722fa3e2 | |||
0f1f98e70c | |||
35f484b371 | |||
7057f6ee7d | |||
3fa5ab7c07 | |||
ff48d6ca36 | |||
39257567d4 | |||
5ed48bf2a3 | |||
c8fbdc5bba | |||
46bd8edcea | |||
42fcc02d83 | |||
96785f0774 | |||
7823bff6d9 | |||
0fd7c08188 | |||
32630601c2 | |||
03aad5498a | |||
2f2b812ddb | |||
c0bcd46b2b | |||
68ea8cf460 | |||
79fe68dba3 | |||
683a8736a6 | |||
6631d4847b | |||
8887d0d68e | |||
390e4bdce8 | |||
5232b55cf6 | |||
5823012c6e | |||
e907a3a21f | |||
9e4cb4b417 | |||
55f4d2ff15 | |||
6b464783ed | |||
85ba270135 | |||
80619fab3c | |||
a1a47e0d0f | |||
d49ff0150c | |||
a0f42906f5 | |||
bc1b6e7877 | |||
efb3fa80ce | |||
9c3dcaf6b5 | |||
fb41c9629e | |||
620eee3f53 | |||
f6ec82609c | |||
0b47c38f21 | |||
6183669c9b | |||
f3694bb62c | |||
0f2344a005 | |||
f2ae6c4d0a | |||
f382e743aa | |||
d71f4a7967 | |||
aeabc0bf06 | |||
46fe75d3cf | |||
c469d8dfde | |||
f327428765 | |||
5a359661da | |||
3d30e2720e |
1
.gitignore
vendored
1
.gitignore
vendored
@ -51,4 +51,3 @@ coverage.xml
|
||||
dist/
|
||||
foris-*.tgz
|
||||
styleguide/
|
||||
testUtils
|
||||
|
@ -1,4 +1,4 @@
|
||||
image: node:16-alpine
|
||||
image: registry.nic.cz/turris/reforis/reforis/reforis-image
|
||||
|
||||
stages:
|
||||
- test
|
||||
@ -6,7 +6,7 @@ stages:
|
||||
- publish
|
||||
|
||||
before_script:
|
||||
- apk add make
|
||||
- apt-get update && apt-get install -y make
|
||||
- npm install
|
||||
|
||||
test:
|
||||
|
1
Makefile
1
Makefile
@ -11,6 +11,7 @@ MSGID_BUGS_ADDRESS="tech.support@turris.cz"
|
||||
|
||||
DEV_PYTHON=python3
|
||||
VENV_NAME?=venv
|
||||
JS_DIR=js
|
||||
VENV_BIN=$(shell pwd)/$(VENV_NAME)/bin
|
||||
|
||||
.PHONY: all
|
||||
|
@ -19,6 +19,7 @@ module.exports = {
|
||||
collectCoverageFrom: ["src/**/*.{js,jsx}"],
|
||||
coverageDirectory: "coverage",
|
||||
testPathIgnorePatterns: ["/node_modules/", "/__fixtures__/", "/dist/"],
|
||||
testEnvironment: "jsdom",
|
||||
verbose: false,
|
||||
setupFilesAfterEnv: [
|
||||
"@testing-library/react/cleanup-after-each",
|
||||
|
29040
package-lock.json
generated
29040
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
53
package.json
53
package.json
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "foris",
|
||||
"version": "5.5.0",
|
||||
"version": "6.0.0",
|
||||
"description": "Foris JS library is a set of components and utils for reForis application and plugins.",
|
||||
"author": "CZ.NIC, z.s.p.o.",
|
||||
"repository": {
|
||||
@ -14,49 +14,50 @@
|
||||
"license": "GPL-3.0",
|
||||
"main": "./src/index.js",
|
||||
"dependencies": {
|
||||
"axios": "^0.21.1",
|
||||
"immutability-helper": "3.0.1",
|
||||
"moment": "^2.24.0",
|
||||
"qrcode.react": "^1.0.1",
|
||||
"react-datetime": "^3.1.1",
|
||||
"react-uid": "^2.2.0"
|
||||
"axios": "^1.7.2",
|
||||
"immutability-helper": "^3.1.1",
|
||||
"moment": "^2.30.1",
|
||||
"qrcode.react": "^3.1.0",
|
||||
"react-datetime": "^3.2.0",
|
||||
"react-uid": "^2.3.3"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"bootstrap": "4.4.1",
|
||||
"bootstrap": "^5.3.3",
|
||||
"prop-types": "15.8.1",
|
||||
"react": "16.9.0",
|
||||
"react-dom": "16.9.0",
|
||||
"react-router-dom": "^5.1.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/cli": "^7.12.10",
|
||||
"@babel/core": "^7.9.0",
|
||||
"@babel/plugin-transform-runtime": "^7.9.0",
|
||||
"@babel/preset-env": "^7.9.0",
|
||||
"@babel/preset-react": "^7.9.4",
|
||||
"@fortawesome/fontawesome-free": "^5.13.0",
|
||||
"@babel/cli": "^7.24.7",
|
||||
"@babel/core": "^7.24.7",
|
||||
"@babel/plugin-transform-runtime": "^7.24.7",
|
||||
"@babel/preset-env": "^7.24.7",
|
||||
"@babel/preset-react": "^7.24.7",
|
||||
"@fortawesome/fontawesome-free": "^6.5.2",
|
||||
"@testing-library/react": "^8.0.9",
|
||||
"babel-loader": "^8.1.0",
|
||||
"babel-polyfill": "^6.26.0",
|
||||
"bootstrap": "^4.5.0",
|
||||
"bootstrap": "^5.3.3",
|
||||
"css-loader": "^5.2.4",
|
||||
"eslint": "^6.8.0",
|
||||
"eslint-config-prettier": "^6.11.0",
|
||||
"eslint-config-reforis": "^1.0.0",
|
||||
"eslint-plugin-prettier": "^3.1.4",
|
||||
"eslint": "^8.57.0",
|
||||
"eslint-config-prettier": "^9.1.0",
|
||||
"eslint-config-reforis": "^2.1.1",
|
||||
"eslint-plugin-prettier": "^5.1.3",
|
||||
"file-loader": "^6.0.0",
|
||||
"jest": "^25.2.0",
|
||||
"jest-mock-axios": "^3.2.0",
|
||||
"moment-timezone": "^0.5.34",
|
||||
"prettier": "2.0.5",
|
||||
"jest": "^29.7.0",
|
||||
"jest-environment-jsdom": "^29.7.0",
|
||||
"jest-mock-axios": "^4.7.3",
|
||||
"moment-timezone": "^0.5.45",
|
||||
"prettier": "^3.3.1",
|
||||
"prop-types": "15.8.1",
|
||||
"react": "16.9.0",
|
||||
"react-dom": "16.9.0",
|
||||
"react-router-dom": "^5.1.2",
|
||||
"react-styleguidist": "^11.2.0",
|
||||
"snapshot-diff": "^0.7.0",
|
||||
"react-styleguidist": "^12.0.1",
|
||||
"snapshot-diff": "^0.10.0",
|
||||
"style-loader": "^1.2.1",
|
||||
"webpack": "^5.68.0"
|
||||
"webpack": "^5.91.0"
|
||||
},
|
||||
"scripts": {
|
||||
"lint": "eslint src",
|
||||
|
@ -111,9 +111,7 @@ const useAPIPatch = createAPIHook("PATCH");
|
||||
const useAPIPut = createAPIHook("PUT");
|
||||
const useAPIDelete = createAPIHook("DELETE");
|
||||
|
||||
export { useAPIGet, useAPIPost, useAPIPatch, useAPIPut, useAPIDelete };
|
||||
|
||||
export function useAPIPolling(endpoint, delay = 1000, until) {
|
||||
function useAPIPolling(endpoint, until, delay = 1000) {
|
||||
// delay ms
|
||||
const [state, setState] = useState({ state: API_STATE.INIT });
|
||||
const [getResponse, get] = useAPIGet(endpoint);
|
||||
@ -133,3 +131,12 @@ export function useAPIPolling(endpoint, delay = 1000, until) {
|
||||
|
||||
return [state];
|
||||
}
|
||||
|
||||
export {
|
||||
useAPIGet,
|
||||
useAPIPost,
|
||||
useAPIPatch,
|
||||
useAPIPut,
|
||||
useAPIDelete,
|
||||
useAPIPolling,
|
||||
};
|
||||
|
@ -6,6 +6,7 @@
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
export const ALERT_TYPES = Object.freeze({
|
||||
@ -38,16 +39,17 @@ Alert.defaultProps = {
|
||||
export function Alert({ type, onDismiss, children }) {
|
||||
return (
|
||||
<div
|
||||
className={`alert ${
|
||||
className={`alert alert-${type} ${
|
||||
onDismiss ? "alert-dismissible" : ""
|
||||
} alert-${type}`}
|
||||
}`.trim()}
|
||||
>
|
||||
{onDismiss ? (
|
||||
<button type="button" className="close" onClick={onDismiss}>
|
||||
×
|
||||
</button>
|
||||
) : (
|
||||
false
|
||||
{onDismiss && (
|
||||
<button
|
||||
type="button"
|
||||
className="btn-close"
|
||||
onClick={onDismiss}
|
||||
aria-label={_("Close")}
|
||||
/>
|
||||
)}
|
||||
{children}
|
||||
</div>
|
||||
|
@ -1,11 +1,12 @@
|
||||
/*
|
||||
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
|
||||
* Copyright (C) 2019-2023 CZ.NIC z.s.p.o. (https://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 PropTypes from "prop-types";
|
||||
|
||||
Button.propTypes = {
|
||||
@ -31,24 +32,25 @@ export function Button({
|
||||
children,
|
||||
...props
|
||||
}) {
|
||||
let buttonClass = className ? `btn ${className}` : "btn btn-primary ";
|
||||
let buttonClass = className ? `btn ${className}` : "btn btn-primary";
|
||||
if (forisFormSize) {
|
||||
buttonClass = `${buttonClass} col-sm-12 col-md-3 col-lg-2`;
|
||||
buttonClass = `${buttonClass} col-12 col-md-3 col-lg-2`;
|
||||
}
|
||||
|
||||
const span = loading ? (
|
||||
return (
|
||||
<button
|
||||
type="button"
|
||||
className={`${buttonClass} d-inline-flex justify-content-center align-items-center`}
|
||||
{...props}
|
||||
>
|
||||
{loading && (
|
||||
<span
|
||||
className="spinner-border spinner-border-sm"
|
||||
className="spinner-border spinner-border-sm me-1"
|
||||
role="status"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
) : null;
|
||||
|
||||
return (
|
||||
<button type="button" className={buttonClass} {...props}>
|
||||
{span}
|
||||
{span ? " " : null}
|
||||
{children}
|
||||
)}
|
||||
<span>{children}</span>
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
@ -6,6 +6,7 @@
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
import { useUID } from "react-uid";
|
||||
|
||||
@ -24,25 +25,24 @@ CheckBox.defaultProps = {
|
||||
|
||||
export function CheckBox({ label, helpText, disabled, ...props }) {
|
||||
const uid = useUID();
|
||||
|
||||
return (
|
||||
<div className="form-group">
|
||||
<div className="custom-control custom-checkbox ">
|
||||
<div className="mb-3 form-check">
|
||||
<input
|
||||
className="custom-control-input"
|
||||
className="form-check-input"
|
||||
type="checkbox"
|
||||
id={uid}
|
||||
disabled={disabled}
|
||||
{...props}
|
||||
/>
|
||||
<label className="custom-control-label" htmlFor={uid}>
|
||||
<label className="form-check-label" htmlFor={uid}>
|
||||
{label}
|
||||
{helpText && (
|
||||
<small className="form-text text-muted">
|
||||
{helpText}
|
||||
</small>
|
||||
)}
|
||||
</label>
|
||||
{helpText && (
|
||||
<div className="form-text">
|
||||
<small>{helpText}</small>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
@ -6,7 +6,9 @@
|
||||
*/
|
||||
|
||||
import React, { useState, useRef } from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
import { Input } from "./Input";
|
||||
|
||||
CopyInput.propTypes = {
|
||||
|
@ -6,9 +6,10 @@
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
|
||||
import moment from "moment/moment";
|
||||
import PropTypes from "prop-types";
|
||||
import Datetime from "react-datetime";
|
||||
import moment from "moment/moment";
|
||||
import "react-datetime/css/react-datetime.css";
|
||||
import "./DataTimeInput.css";
|
||||
|
||||
@ -46,13 +47,13 @@ export function DataTimeInput({
|
||||
children,
|
||||
...props
|
||||
}) {
|
||||
function renderInput(datetimeProps) {
|
||||
const renderInput = (datetimeProps) => {
|
||||
return (
|
||||
<Input {...props} {...datetimeProps}>
|
||||
{children}
|
||||
</Input>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<Datetime
|
||||
|
@ -6,6 +6,7 @@
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
DownloadButton.propTypes = {
|
||||
|
@ -6,11 +6,14 @@
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
import { Input } from "./Input";
|
||||
|
||||
export const EmailInput = ({ ...props }) => <Input type="email" {...props} />;
|
||||
export function EmailInput({ ...props }) {
|
||||
return <Input type="email" {...props} />;
|
||||
}
|
||||
|
||||
EmailInput.propTypes = {
|
||||
/** Field label. */
|
||||
|
@ -8,6 +8,7 @@
|
||||
import React from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
import { Input } from "./Input";
|
||||
|
||||
FileInput.propTypes = {
|
||||
|
@ -6,11 +6,12 @@
|
||||
*/
|
||||
|
||||
import React, { forwardRef } from "react";
|
||||
import { useUID } from "react-uid";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
import { useUID } from "react-uid";
|
||||
|
||||
/** Base bootstrap input component. */
|
||||
export const Input = forwardRef(
|
||||
const Input = forwardRef(
|
||||
(
|
||||
{
|
||||
type,
|
||||
@ -27,18 +28,21 @@ export const Input = forwardRef(
|
||||
) => {
|
||||
const uid = useUID();
|
||||
|
||||
const inputClassName = `form-control ${className || ""} ${
|
||||
const inputClassName = `${className || ""} ${
|
||||
error ? "is-invalid" : ""
|
||||
}`.trim();
|
||||
|
||||
return (
|
||||
<div className="form-group">
|
||||
<label className={labelClassName} htmlFor={uid}>
|
||||
<div className="mb-3">
|
||||
<label
|
||||
className={`form-label ${labelClassName || ""}`.trim()}
|
||||
htmlFor={uid}
|
||||
>
|
||||
{label}
|
||||
</label>
|
||||
<div className={`input-group ${groupClassName || ""}`.trim()}>
|
||||
<input
|
||||
className={inputClassName}
|
||||
className={`form-control ${inputClassName}`.trim()}
|
||||
type={type}
|
||||
id={uid}
|
||||
ref={ref}
|
||||
@ -46,10 +50,12 @@ export const Input = forwardRef(
|
||||
/>
|
||||
{children}
|
||||
</div>
|
||||
{error ? <div className="invalid-feedback">{error}</div> : null}
|
||||
{helpText ? (
|
||||
<small className="form-text text-muted">{helpText}</small>
|
||||
) : null}
|
||||
{error && <div className="invalid-feedback">{error}</div>}
|
||||
{helpText && (
|
||||
<div className="form-text">
|
||||
<small>{helpText}</small>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@ -68,3 +74,5 @@ Input.propTypes = {
|
||||
labelClassName: PropTypes.string,
|
||||
groupClassName: PropTypes.string,
|
||||
};
|
||||
|
||||
export { Input };
|
||||
|
@ -6,10 +6,11 @@
|
||||
*/
|
||||
|
||||
import React, { useRef, useEffect } from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
import { Portal } from "../utils/Portal";
|
||||
import { useClickOutside } from "../utils/hooks";
|
||||
import { Portal } from "../utils/Portal";
|
||||
import "./Modal.css";
|
||||
|
||||
Modal.propTypes = {
|
||||
@ -92,11 +93,10 @@ export function ModalHeader({ setShown, title }) {
|
||||
<h5 className="modal-title">{title}</h5>
|
||||
<button
|
||||
type="button"
|
||||
className="close"
|
||||
className="btn-close"
|
||||
onClick={() => setShown(false)}
|
||||
>
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
aria-label={_("Close")}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
@ -6,10 +6,11 @@
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
import { useConditionalTimeout } from "../utils/hooks";
|
||||
import { Input } from "./Input";
|
||||
import { useConditionalTimeout } from "../utils/hooks";
|
||||
import "./NumberInput.css";
|
||||
|
||||
NumberInput.propTypes = {
|
||||
@ -23,7 +24,7 @@ NumberInput.propTypes = {
|
||||
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
|
||||
/** Function called when value changes. */
|
||||
onChange: PropTypes.func.isRequired,
|
||||
/** Additional description dispaled to the right of input value. */
|
||||
/** Additional description displayed to the right of input value. */
|
||||
inlineText: PropTypes.string,
|
||||
};
|
||||
|
||||
@ -49,8 +50,9 @@ export function NumberInput({ onChange, inlineText, value, ...props }) {
|
||||
|
||||
return (
|
||||
<Input type="number" onChange={onChange} value={value} {...props}>
|
||||
<div className="input-group-append">
|
||||
{inlineText && <p className="input-group-text">{inlineText}</p>}
|
||||
{inlineText && (
|
||||
<span className="input-group-text">{inlineText}</span>
|
||||
)}
|
||||
<button
|
||||
type="button"
|
||||
className="btn btn-outline-secondary"
|
||||
@ -69,7 +71,6 @@ export function NumberInput({ onChange, inlineText, value, ...props }) {
|
||||
>
|
||||
<i className="fas fa-minus" />
|
||||
</button>
|
||||
</div>
|
||||
</Input>
|
||||
);
|
||||
}
|
||||
|
@ -6,6 +6,7 @@
|
||||
*/
|
||||
|
||||
import React, { useState } from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
import { Input } from "./Input";
|
||||
@ -34,8 +35,7 @@ export function PasswordInput({ withEye, newPass, ...props }) {
|
||||
autoComplete={newPass ? "new-password" : "current-password"}
|
||||
{...props}
|
||||
>
|
||||
{withEye ? (
|
||||
<div className="input-group-append">
|
||||
{withEye && (
|
||||
<button
|
||||
type="button"
|
||||
className="input-group-text"
|
||||
@ -45,13 +45,10 @@ export function PasswordInput({ withEye, newPass, ...props }) {
|
||||
}}
|
||||
>
|
||||
<i
|
||||
className={`fa ${
|
||||
isHidden ? "fa-eye" : "fa-eye-slash"
|
||||
}`}
|
||||
className={`fa ${isHidden ? "fa-eye" : "fa-eye-slash"}`}
|
||||
/>
|
||||
</button>
|
||||
</div>
|
||||
) : null}
|
||||
)}
|
||||
</Input>
|
||||
);
|
||||
}
|
||||
|
@ -6,6 +6,7 @@
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
import { useUID } from "react-uid";
|
||||
|
||||
@ -17,7 +18,7 @@ RadioSet.propTypes = {
|
||||
/** Choices . */
|
||||
choices: PropTypes.arrayOf(
|
||||
PropTypes.shape({
|
||||
/** Choice lable . */
|
||||
/** Choice label . */
|
||||
label: PropTypes.oneOfType([
|
||||
PropTypes.string,
|
||||
PropTypes.element,
|
||||
@ -64,7 +65,7 @@ export function RadioSet({
|
||||
});
|
||||
|
||||
return (
|
||||
<div className="form-group">
|
||||
<div className="mb-3">
|
||||
{label && (
|
||||
<label htmlFor={uid} className="d-block">
|
||||
{label}
|
||||
@ -72,7 +73,9 @@ export function RadioSet({
|
||||
)}
|
||||
{radios}
|
||||
{helpText && (
|
||||
<small className="form-text text-muted">{helpText}</small>
|
||||
<div className="form-text">
|
||||
<small>{helpText}</small>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
@ -92,27 +95,25 @@ Radio.propTypes = {
|
||||
|
||||
export function Radio({ label, id, helpText, inline, ...props }) {
|
||||
return (
|
||||
<>
|
||||
<div
|
||||
className={`custom-control custom-radio ${
|
||||
inline ? "custom-control-inline" : ""
|
||||
className={`mb-2 ${
|
||||
inline ? "form-check form-check-inline" : ""
|
||||
}`.trim()}
|
||||
>
|
||||
<input
|
||||
id={id}
|
||||
className="custom-control-input"
|
||||
className="form-check-input me-2"
|
||||
type="radio"
|
||||
{...props}
|
||||
/>
|
||||
<label className="custom-control-label" htmlFor={id}>
|
||||
<label className="form-check-label" htmlFor={id}>
|
||||
{label}
|
||||
</label>
|
||||
{helpText && (
|
||||
<small className="form-text text-muted mt-0 mb-3">
|
||||
{helpText}
|
||||
</small>
|
||||
)}
|
||||
<div className="form-text">
|
||||
<small>{helpText}</small>
|
||||
</div>
|
||||
)}
|
||||
</label>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
@ -6,6 +6,7 @@
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
import { useUID } from "react-uid";
|
||||
|
||||
@ -30,14 +31,18 @@ export function Select({ label, choices, helpText, ...props }) {
|
||||
));
|
||||
|
||||
return (
|
||||
<div className="form-group">
|
||||
<label htmlFor={uid}>{label}</label>
|
||||
<select className="custom-select" id={uid} {...props}>
|
||||
<div className="mb-3">
|
||||
<label className="form-label" htmlFor={uid}>
|
||||
{label}
|
||||
</label>
|
||||
<select className="form-select" id={uid} {...props}>
|
||||
{options}
|
||||
</select>
|
||||
{helpText ? (
|
||||
<small className="form-text text-muted">{helpText}</small>
|
||||
) : null}
|
||||
{helpText && (
|
||||
<div className="form-text">
|
||||
<small>{helpText}</small>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
@ -1,3 +1,11 @@
|
||||
.spinner-fs-wrapper {
|
||||
position: fixed;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
z-index: 1101; /* increase z-index by 1 to ensure it's on top of spinner-fs-background */
|
||||
}
|
||||
|
||||
.spinner-wrapper .spinner-border {
|
||||
width: 4rem;
|
||||
height: 4rem;
|
||||
@ -7,10 +15,8 @@
|
||||
.spinner-fs-background {
|
||||
background-color: rgba(2, 2, 2, 0.5);
|
||||
color: rgb(230, 230, 230);
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
top: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@ -31,3 +37,7 @@
|
||||
.spinner-fs-wrapper .spinner-text {
|
||||
margin: 1rem;
|
||||
}
|
||||
|
||||
.spinner-border-sm {
|
||||
min-width: 16px;
|
||||
}
|
||||
|
@ -6,6 +6,7 @@
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
import "./Spinner.css";
|
||||
@ -16,7 +17,7 @@ Spinner.propTypes = {
|
||||
PropTypes.arrayOf(PropTypes.node),
|
||||
PropTypes.node,
|
||||
]),
|
||||
/** Render component with full-screen mode (using apropriate `.css` styles) */
|
||||
/** Render component with full-screen mode (using appropriate `.css` styles) */
|
||||
fullScreen: PropTypes.bool.isRequired,
|
||||
className: PropTypes.string,
|
||||
};
|
||||
|
@ -6,6 +6,7 @@
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
import { useUID } from "react-uid";
|
||||
|
||||
@ -22,28 +23,30 @@ Switch.propTypes = {
|
||||
|
||||
export function Switch({ label, helpText, switchHeading, ...props }) {
|
||||
const uid = useUID();
|
||||
|
||||
return (
|
||||
<div className={`form-group ${switchHeading ? "switch" : ""}`.trim()}>
|
||||
<div
|
||||
className={`custom-control custom-switch ${
|
||||
!helpText ? "custom-control-inline" : ""
|
||||
} ${switchHeading ? "switch-heading" : ""}`.trim()}
|
||||
className={`form-check form-switch mb-3 ${
|
||||
switchHeading ? "d-flex align-items-center" : null
|
||||
}`.trim()}
|
||||
>
|
||||
<input
|
||||
type="checkbox"
|
||||
className="custom-control-input"
|
||||
className={`form-check-input ${
|
||||
switchHeading ? "me-2" : ""
|
||||
}`.trim()}
|
||||
role="switch"
|
||||
id={uid}
|
||||
{...props}
|
||||
/>
|
||||
<label className="custom-control-label" htmlFor={uid}>
|
||||
<label className="form-check-label" htmlFor={uid}>
|
||||
{label}
|
||||
</label>
|
||||
{helpText && (
|
||||
<small className="form-text text-muted mt-0 mb-3">
|
||||
{helpText}
|
||||
</small>
|
||||
)}
|
||||
<div className="form-text">
|
||||
<small>{helpText}</small>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
@ -6,11 +6,14 @@
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
import { Input } from "./Input";
|
||||
|
||||
export const TextInput = ({ ...props }) => <Input type="text" {...props} />;
|
||||
export function TextInput({ ...props }) {
|
||||
return <Input type="text" {...props} />;
|
||||
}
|
||||
|
||||
TextInput.propTypes = {
|
||||
/** Field label. */
|
||||
|
@ -2,33 +2,38 @@
|
||||
|
||||
exports[`<Button /> Render button correctly 1`] = `
|
||||
<button
|
||||
class="btn btn-primary "
|
||||
class="btn btn-primary d-inline-flex justify-content-center align-items-center"
|
||||
type="button"
|
||||
>
|
||||
<span>
|
||||
Test Button
|
||||
</span>
|
||||
</button>
|
||||
`;
|
||||
|
||||
exports[`<Button /> Render button with custom classes 1`] = `
|
||||
<button
|
||||
class="btn one two three"
|
||||
class="btn one two three d-inline-flex justify-content-center align-items-center"
|
||||
type="button"
|
||||
>
|
||||
<span>
|
||||
Test Button
|
||||
</span>
|
||||
</button>
|
||||
`;
|
||||
|
||||
exports[`<Button /> Render button with spinner 1`] = `
|
||||
<button
|
||||
class="btn btn-primary "
|
||||
class="btn btn-primary d-inline-flex justify-content-center align-items-center"
|
||||
type="button"
|
||||
>
|
||||
<span
|
||||
aria-hidden="true"
|
||||
class="spinner-border spinner-border-sm"
|
||||
class="spinner-border spinner-border-sm me-1"
|
||||
role="status"
|
||||
/>
|
||||
|
||||
<span>
|
||||
Test Button
|
||||
</span>
|
||||
</button>
|
||||
`;
|
||||
|
@ -2,55 +2,51 @@
|
||||
|
||||
exports[`<Checkbox/> Render checkbox 1`] = `
|
||||
<div
|
||||
class="form-group"
|
||||
class="mb-3 form-check"
|
||||
>
|
||||
<div
|
||||
class="custom-control custom-checkbox "
|
||||
>
|
||||
<input
|
||||
checked=""
|
||||
class="custom-control-input"
|
||||
class="form-check-input"
|
||||
id="1"
|
||||
type="checkbox"
|
||||
/>
|
||||
<label
|
||||
class="custom-control-label"
|
||||
class="form-check-label"
|
||||
for="1"
|
||||
>
|
||||
Test label
|
||||
<small
|
||||
class="form-text text-muted"
|
||||
</label>
|
||||
<div
|
||||
class="form-text"
|
||||
>
|
||||
<small>
|
||||
Some help text
|
||||
</small>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
exports[`<Checkbox/> Render uncheked checkbox 1`] = `
|
||||
<div
|
||||
class="form-group"
|
||||
class="mb-3 form-check"
|
||||
>
|
||||
<div
|
||||
class="custom-control custom-checkbox "
|
||||
>
|
||||
<input
|
||||
class="custom-control-input"
|
||||
class="form-check-input"
|
||||
id="1"
|
||||
type="checkbox"
|
||||
/>
|
||||
<label
|
||||
class="custom-control-label"
|
||||
class="form-check-label"
|
||||
for="1"
|
||||
>
|
||||
Test label
|
||||
<small
|
||||
class="form-text text-muted"
|
||||
</label>
|
||||
<div
|
||||
class="form-text"
|
||||
>
|
||||
<small>
|
||||
Some help text
|
||||
</small>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
@ -2,9 +2,10 @@
|
||||
|
||||
exports[`<NumberInput/> Render number input 1`] = `
|
||||
<div
|
||||
class="form-group"
|
||||
class="mb-3"
|
||||
>
|
||||
<label
|
||||
class="form-label"
|
||||
for="1"
|
||||
>
|
||||
Test label
|
||||
@ -18,9 +19,6 @@ exports[`<NumberInput/> Render number input 1`] = `
|
||||
type="number"
|
||||
value="1"
|
||||
/>
|
||||
<div
|
||||
class="input-group-append"
|
||||
>
|
||||
<button
|
||||
aria-label="Increase"
|
||||
class="btn btn-outline-secondary"
|
||||
@ -40,11 +38,12 @@ exports[`<NumberInput/> Render number input 1`] = `
|
||||
/>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<small
|
||||
class="form-text text-muted"
|
||||
<div
|
||||
class="form-text"
|
||||
>
|
||||
<small>
|
||||
Some help text
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
@ -2,9 +2,10 @@
|
||||
|
||||
exports[`<PasswordInput/> Render password input 1`] = `
|
||||
<div
|
||||
class="form-group"
|
||||
class="mb-3"
|
||||
>
|
||||
<label
|
||||
class="form-label"
|
||||
for="1"
|
||||
>
|
||||
Test label
|
||||
@ -20,10 +21,12 @@ exports[`<PasswordInput/> Render password input 1`] = `
|
||||
value="Some password"
|
||||
/>
|
||||
</div>
|
||||
<small
|
||||
class="form-text text-muted"
|
||||
<div
|
||||
class="form-text"
|
||||
>
|
||||
<small>
|
||||
Some help text
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
exports[`<RadioSet/> Render radio set 1`] = `
|
||||
<div
|
||||
class="form-group"
|
||||
class="mb-3"
|
||||
>
|
||||
<label
|
||||
class="d-block"
|
||||
@ -11,61 +11,63 @@ exports[`<RadioSet/> Render radio set 1`] = `
|
||||
Radios set label
|
||||
</label>
|
||||
<div
|
||||
class="custom-control custom-radio"
|
||||
class="mb-2"
|
||||
>
|
||||
<input
|
||||
checked=""
|
||||
class="custom-control-input"
|
||||
class="form-check-input me-2"
|
||||
id="test_name-0"
|
||||
name="test_name"
|
||||
type="radio"
|
||||
value="value"
|
||||
/>
|
||||
<label
|
||||
class="custom-control-label"
|
||||
class="form-check-label"
|
||||
for="test_name-0"
|
||||
>
|
||||
label
|
||||
</label>
|
||||
</div>
|
||||
<div
|
||||
class="custom-control custom-radio"
|
||||
class="mb-2"
|
||||
>
|
||||
<input
|
||||
class="custom-control-input"
|
||||
class="form-check-input me-2"
|
||||
id="test_name-1"
|
||||
name="test_name"
|
||||
type="radio"
|
||||
value="another value"
|
||||
/>
|
||||
<label
|
||||
class="custom-control-label"
|
||||
class="form-check-label"
|
||||
for="test_name-1"
|
||||
>
|
||||
another label
|
||||
</label>
|
||||
</div>
|
||||
<div
|
||||
class="custom-control custom-radio"
|
||||
class="mb-2"
|
||||
>
|
||||
<input
|
||||
class="custom-control-input"
|
||||
class="form-check-input me-2"
|
||||
id="test_name-2"
|
||||
name="test_name"
|
||||
type="radio"
|
||||
value="another on value"
|
||||
/>
|
||||
<label
|
||||
class="custom-control-label"
|
||||
class="form-check-label"
|
||||
for="test_name-2"
|
||||
>
|
||||
another one label
|
||||
</label>
|
||||
</div>
|
||||
<small
|
||||
class="form-text text-muted"
|
||||
<div
|
||||
class="form-text"
|
||||
>
|
||||
<small>
|
||||
Some help text
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
@ -3,15 +3,16 @@
|
||||
exports[`<Select/> Test with snapshot. 1`] = `
|
||||
<div>
|
||||
<div
|
||||
class="form-group"
|
||||
class="mb-3"
|
||||
>
|
||||
<label
|
||||
class="form-label"
|
||||
for="1"
|
||||
>
|
||||
Test label
|
||||
</label>
|
||||
<select
|
||||
class="custom-select"
|
||||
class="form-select"
|
||||
id="1"
|
||||
>
|
||||
<option
|
||||
@ -30,11 +31,13 @@ exports[`<Select/> Test with snapshot. 1`] = `
|
||||
three
|
||||
</option>
|
||||
</select>
|
||||
<small
|
||||
class="form-text text-muted"
|
||||
<div
|
||||
class="form-text"
|
||||
>
|
||||
<small>
|
||||
Help text
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
@ -2,26 +2,25 @@
|
||||
|
||||
exports[`<Switch/> Render switch 1`] = `
|
||||
<div
|
||||
class="form-group"
|
||||
class="form-check form-switch mb-3 null"
|
||||
>
|
||||
<div
|
||||
class="custom-control custom-switch"
|
||||
>
|
||||
<input
|
||||
checked=""
|
||||
class="custom-control-input"
|
||||
class="form-check-input"
|
||||
id="1"
|
||||
role="switch"
|
||||
type="checkbox"
|
||||
/>
|
||||
<label
|
||||
class="custom-control-label"
|
||||
class="form-check-label"
|
||||
for="1"
|
||||
>
|
||||
Test label
|
||||
</label>
|
||||
<small
|
||||
class="form-text text-muted mt-0 mb-3"
|
||||
<div
|
||||
class="form-text"
|
||||
>
|
||||
<small>
|
||||
Some help text
|
||||
</small>
|
||||
</div>
|
||||
@ -30,25 +29,24 @@ exports[`<Switch/> Render switch 1`] = `
|
||||
|
||||
exports[`<Switch/> Render uncheked switch 1`] = `
|
||||
<div
|
||||
class="form-group"
|
||||
class="form-check form-switch mb-3 null"
|
||||
>
|
||||
<div
|
||||
class="custom-control custom-switch"
|
||||
>
|
||||
<input
|
||||
class="custom-control-input"
|
||||
class="form-check-input"
|
||||
id="1"
|
||||
role="switch"
|
||||
type="checkbox"
|
||||
/>
|
||||
<label
|
||||
class="custom-control-label"
|
||||
class="form-check-label"
|
||||
for="1"
|
||||
>
|
||||
Test label
|
||||
</label>
|
||||
<small
|
||||
class="form-text text-muted mt-0 mb-3"
|
||||
<div
|
||||
class="form-text"
|
||||
>
|
||||
<small>
|
||||
Some help text
|
||||
</small>
|
||||
</div>
|
||||
|
@ -2,9 +2,10 @@
|
||||
|
||||
exports[`<TextInput/> Render text input 1`] = `
|
||||
<div
|
||||
class="form-group"
|
||||
class="mb-3"
|
||||
>
|
||||
<label
|
||||
class="form-label"
|
||||
for="1"
|
||||
>
|
||||
Test label
|
||||
@ -19,10 +20,12 @@ exports[`<TextInput/> Render text input 1`] = `
|
||||
value="Some text"
|
||||
/>
|
||||
</div>
|
||||
<small
|
||||
class="form-text text-muted"
|
||||
<div
|
||||
class="form-text"
|
||||
>
|
||||
<small>
|
||||
Some help text
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
@ -6,15 +6,15 @@
|
||||
*/
|
||||
|
||||
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 "../utils/forisUrls";
|
||||
|
||||
import { Button } from "../bootstrap/Button";
|
||||
import { Modal, ModalHeader, ModalBody, ModalFooter } from "../bootstrap/Modal";
|
||||
import { useAlert } from "../alertContext/AlertContext";
|
||||
import { useAlert } from "../context/alertContext/AlertContext";
|
||||
import { ForisURLs } from "../utils/forisUrls";
|
||||
|
||||
export function RebootButton(props) {
|
||||
const [triggered, setTriggered] = useState(false);
|
||||
|
@ -6,14 +6,15 @@
|
||||
*/
|
||||
|
||||
import React, { useEffect, useState } from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
import { Button } from "../../bootstrap/Button";
|
||||
import { useAlert } from "../../alertContext/AlertContext";
|
||||
import { ALERT_TYPES } from "../../bootstrap/Alert";
|
||||
import { useAPIPost } from "../../api/hooks";
|
||||
import { API_STATE } from "../../api/utils";
|
||||
import { ALERT_TYPES } from "../../bootstrap/Alert";
|
||||
import { Button } from "../../bootstrap/Button";
|
||||
import { formFieldsSize } from "../../bootstrap/constants";
|
||||
import { useAlert } from "../../context/alertContext/AlertContext";
|
||||
|
||||
ResetWiFiSettings.propTypes = {
|
||||
ws: PropTypes.object.isRequired,
|
||||
@ -58,7 +59,7 @@ export function ResetWiFiSettings({ ws, endpoint }) {
|
||||
"If a number of wireless cards doesn't match, you may try to reset the Wi-Fi settings. Note that this will remove the current Wi-Fi configuration and restore the default values."
|
||||
)}
|
||||
</p>
|
||||
<div className="text-right">
|
||||
<div className="text-end">
|
||||
<Button
|
||||
className="btn-primary"
|
||||
forisFormSize
|
||||
|
@ -1,20 +1,22 @@
|
||||
/*
|
||||
* Copyright (C) 2019-2021 CZ.NIC z.s.p.o. (http://www.nic.cz/)
|
||||
* Copyright (C) 2019-2022 CZ.NIC z.s.p.o. (https://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 PropTypes from "prop-types";
|
||||
import { Switch } from "../../bootstrap/Switch";
|
||||
|
||||
import { HELP_TEXTS, HTMODES, HWMODES, ENCRYPTIONMODES } from "./constants";
|
||||
import WifiGuestForm from "./WiFiGuestForm";
|
||||
import WiFiQRCode from "./WiFiQRCode";
|
||||
import { PasswordInput } from "../../bootstrap/PasswordInput";
|
||||
import { RadioSet } from "../../bootstrap/RadioSet";
|
||||
import { Select } from "../../bootstrap/Select";
|
||||
import { Switch } from "../../bootstrap/Switch";
|
||||
import { TextInput } from "../../bootstrap/TextInput";
|
||||
import WiFiQRCode from "./WiFiQRCode";
|
||||
import WifiGuestForm from "./WiFiGuestForm";
|
||||
import { HELP_TEXTS, HTMODES, HWMODES, ENCRYPTIONMODES } from "./constants";
|
||||
|
||||
WiFiForm.propTypes = {
|
||||
formData: PropTypes.shape({ devices: PropTypes.arrayOf(PropTypes.object) })
|
||||
@ -64,7 +66,7 @@ DeviceForm.propTypes = {
|
||||
guest_wifi: PropTypes.object.isRequired,
|
||||
encryption: PropTypes.string.isRequired,
|
||||
available_bands: PropTypes.array.isRequired,
|
||||
ieee80211w_disabled: PropTypes.bool.isRequired,
|
||||
ieee80211w_disabled: PropTypes.bool,
|
||||
}),
|
||||
formErrors: PropTypes.object.isRequired,
|
||||
setFormValue: PropTypes.func.isRequired,
|
||||
@ -92,7 +94,7 @@ function DeviceForm({
|
||||
return (
|
||||
<>
|
||||
<Switch
|
||||
label={<h2>{_(`Wi-Fi ${deviceID + 1}`)}</h2>}
|
||||
label={<h2 className="mb-0">{_(`Wi-Fi ${deviceID + 1}`)}</h2>}
|
||||
checked={formData.enabled}
|
||||
onChange={setFormValue((value) => ({
|
||||
devices: {
|
||||
@ -119,12 +121,10 @@ function DeviceForm({
|
||||
}))}
|
||||
{...props}
|
||||
>
|
||||
<div className="input-group-append">
|
||||
<WiFiQRCode
|
||||
SSID={formData.SSID}
|
||||
password={formData.password}
|
||||
/>
|
||||
</div>
|
||||
</TextInput>
|
||||
|
||||
<PasswordInput
|
||||
|
@ -6,13 +6,14 @@
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
import { TextInput } from "../../bootstrap/TextInput";
|
||||
import { Switch } from "../../bootstrap/Switch";
|
||||
import { PasswordInput } from "../../bootstrap/PasswordInput";
|
||||
import WiFiQRCode from "./WiFiQRCode";
|
||||
import { HELP_TEXTS } from "./constants";
|
||||
import WiFiQRCode from "./WiFiQRCode";
|
||||
import { PasswordInput } from "../../bootstrap/PasswordInput";
|
||||
import { Switch } from "../../bootstrap/Switch";
|
||||
import { TextInput } from "../../bootstrap/TextInput";
|
||||
|
||||
WifiGuestForm.propTypes = {
|
||||
formData: PropTypes.shape({
|
||||
|
@ -6,10 +6,11 @@
|
||||
*/
|
||||
|
||||
import React, { useState } from "react";
|
||||
import QRCode from "qrcode.react";
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
import { ForisURLs } from "../../utils/forisUrls";
|
||||
import PropTypes from "prop-types";
|
||||
import QRCode from "qrcode.react";
|
||||
|
||||
import { createAndDownloadPdf, toQRCodeContent } from "./qrCodeHelpers";
|
||||
import { Button } from "../../bootstrap/Button";
|
||||
import {
|
||||
Modal,
|
||||
@ -17,7 +18,7 @@ import {
|
||||
ModalFooter,
|
||||
ModalHeader,
|
||||
} from "../../bootstrap/Modal";
|
||||
import { createAndDownloadPdf, toQRCodeContent } from "./qrCodeHelpers";
|
||||
import { ForisURLs } from "../../utils/forisUrls";
|
||||
|
||||
WiFiQRCode.propTypes = {
|
||||
SSID: PropTypes.string.isRequired,
|
||||
@ -87,7 +88,7 @@ function QRCodeModal({ shown, setShown, SSID, password }) {
|
||||
createAndDownloadPdf(SSID, password);
|
||||
}}
|
||||
>
|
||||
<i className="fas fa-arrow-down mr-2" />
|
||||
<i className="fas fa-file-download me-2" />
|
||||
{_("Download PDF")}
|
||||
</Button>
|
||||
</ModalFooter>
|
||||
|
@ -6,11 +6,12 @@
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
import { ForisForm } from "../../form/components/ForisForm";
|
||||
import WiFiForm from "./WiFiForm";
|
||||
import { ResetWiFiSettings } from "./ResetWiFiSettings";
|
||||
import WiFiForm from "./WiFiForm";
|
||||
import { ForisForm } from "../../form/components/ForisForm";
|
||||
|
||||
WiFiSettings.propTypes = {
|
||||
ws: PropTypes.object.isRequired,
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -25,15 +25,10 @@ exports[`<RebootButton/> Render modal. 1`] = `
|
||||
Warning!
|
||||
</h5>
|
||||
<button
|
||||
class="close"
|
||||
aria-label="Close"
|
||||
class="btn-close"
|
||||
type="button"
|
||||
>
|
||||
<span
|
||||
aria-hidden="true"
|
||||
>
|
||||
×
|
||||
</span>
|
||||
</button>
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
class="modal-body"
|
||||
@ -46,16 +41,20 @@ exports[`<RebootButton/> Render modal. 1`] = `
|
||||
class="modal-footer"
|
||||
>
|
||||
<button
|
||||
class="btn btn-primary "
|
||||
class="btn btn-primary d-inline-flex justify-content-center align-items-center"
|
||||
type="button"
|
||||
>
|
||||
<span>
|
||||
Cancel
|
||||
</span>
|
||||
</button>
|
||||
<button
|
||||
class="btn btn-danger"
|
||||
class="btn btn-danger d-inline-flex justify-content-center align-items-center"
|
||||
type="button"
|
||||
>
|
||||
<span>
|
||||
Confirm reboot
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
@ -63,10 +62,12 @@ exports[`<RebootButton/> Render modal. 1`] = `
|
||||
</div>
|
||||
</div>
|
||||
<button
|
||||
class="btn btn-danger"
|
||||
class="btn btn-danger d-inline-flex justify-content-center align-items-center"
|
||||
type="button"
|
||||
>
|
||||
<span>
|
||||
Reboot
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
`;
|
||||
@ -77,10 +78,12 @@ exports[`<RebootButton/> Render. 1`] = `
|
||||
id="modal-container"
|
||||
/>
|
||||
<button
|
||||
class="btn btn-danger"
|
||||
class="btn btn-danger d-inline-flex justify-content-center align-items-center"
|
||||
type="button"
|
||||
>
|
||||
<span>
|
||||
Reboot
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
`;
|
||||
|
@ -6,10 +6,11 @@
|
||||
*/
|
||||
|
||||
import React, { useState, useContext, useCallback } from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
import { Alert, ALERT_TYPES } from "../bootstrap/Alert";
|
||||
import { Portal } from "../utils/Portal";
|
||||
import { Alert, ALERT_TYPES } from "../../bootstrap/Alert";
|
||||
import { Portal } from "../../utils/Portal";
|
||||
|
||||
AlertContextProvider.propTypes = {
|
||||
children: PropTypes.oneOfType([
|
@ -48,7 +48,7 @@ describe("AlertContext", () => {
|
||||
// Alert is present
|
||||
expect(getByText(componentContainer, "Alert content")).toBeDefined();
|
||||
|
||||
fireEvent.click(componentContainer.querySelector(".close"));
|
||||
fireEvent.click(componentContainer.querySelector(".btn-close"));
|
||||
// Alert is gone
|
||||
expect(queryByText(componentContainer, "Alert content")).toBeNull();
|
||||
});
|
@ -6,14 +6,13 @@ exports[`AlertContext should render alert 1`] = `
|
||||
id="alert-container"
|
||||
>
|
||||
<div
|
||||
class="alert alert-dismissible alert-danger"
|
||||
class="alert alert-danger alert-dismissible"
|
||||
>
|
||||
<button
|
||||
class="close"
|
||||
aria-label="Close"
|
||||
class="btn-close"
|
||||
type="button"
|
||||
>
|
||||
×
|
||||
</button>
|
||||
/>
|
||||
Alert content
|
||||
</div>
|
||||
</div>
|
57
src/context/customizationContext/CustomizationContext.js
Normal file
57
src/context/customizationContext/CustomizationContext.js
Normal file
@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright (C) 2019-2022 CZ.NIC z.s.p.o. (https://www.nic.cz/)
|
||||
*
|
||||
* This is free software, licensed under the GNU General Public License v3.
|
||||
* See /LICENSE for more information.
|
||||
*/
|
||||
|
||||
import React, { useContext, useEffect } from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
import { useAPIGet } from "../../api/hooks";
|
||||
import { Spinner } from "../../bootstrap/Spinner";
|
||||
import { ForisURLs } from "../../utils/forisUrls";
|
||||
|
||||
CustomizationContextProvider.propTypes = {
|
||||
children: PropTypes.oneOfType([
|
||||
PropTypes.arrayOf(PropTypes.node),
|
||||
PropTypes.node,
|
||||
]),
|
||||
};
|
||||
|
||||
function CustomizationContextProvider({ children }) {
|
||||
const { CustomizationContext } = window;
|
||||
const [getCustomizationResponse, getCustomization] = useAPIGet(
|
||||
ForisURLs.about
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
getCustomization();
|
||||
}, [getCustomization]);
|
||||
|
||||
if (getCustomizationResponse.state !== "success") {
|
||||
return <Spinner fullScreen />;
|
||||
}
|
||||
|
||||
const deviceDetails = getCustomizationResponse.data || {};
|
||||
|
||||
const isCustomized = !!(
|
||||
deviceDetails &&
|
||||
deviceDetails.customization !== undefined &&
|
||||
deviceDetails.customization === "shield"
|
||||
);
|
||||
|
||||
return (
|
||||
<CustomizationContext.Provider value={{ deviceDetails, isCustomized }}>
|
||||
{children}
|
||||
</CustomizationContext.Provider>
|
||||
);
|
||||
}
|
||||
|
||||
function useCustomizationContext() {
|
||||
const { CustomizationContext } = window;
|
||||
return useContext(CustomizationContext);
|
||||
}
|
||||
|
||||
export { CustomizationContextProvider, useCustomizationContext };
|
3
src/context/customizationContext/CustomizationContext.md
Normal file
3
src/context/customizationContext/CustomizationContext.md
Normal file
@ -0,0 +1,3 @@
|
||||
It provides customization context to the children. `CustomizationContext` allows
|
||||
using `useCustomizationContext` in components to check if the reForis UI is
|
||||
customized or not for specific devices.
|
@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright (C) 2019-2022 CZ.NIC z.s.p.o. (https://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 { render, wait, getByText } from "customTestRender";
|
||||
import mockAxios from "jest-mock-axios";
|
||||
|
||||
import {
|
||||
useCustomizationContext,
|
||||
CustomizationContextProvider,
|
||||
} from "../CustomizationContext";
|
||||
|
||||
const CUSTOM = "Description / component for customized reForis (Shield)";
|
||||
const ORIGINAL = "Description / component for original reForis (other devices)";
|
||||
|
||||
const CustomizationTest = () => {
|
||||
const { isCustomized } = useCustomizationContext();
|
||||
|
||||
return <p>{isCustomized ? CUSTOM : ORIGINAL}</p>;
|
||||
};
|
||||
|
||||
describe("CustomizationContext", () => {
|
||||
let componentContainer;
|
||||
beforeEach(() => {
|
||||
const { container } = render(
|
||||
<CustomizationContextProvider>
|
||||
<CustomizationTest />
|
||||
</CustomizationContextProvider>
|
||||
);
|
||||
componentContainer = container;
|
||||
});
|
||||
|
||||
it("should render component without customization", async () => {
|
||||
mockAxios.mockResponse({ data: {} });
|
||||
|
||||
await wait(() => getByText(componentContainer, ORIGINAL));
|
||||
|
||||
expect(componentContainer).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it("should render customized component", async () => {
|
||||
mockAxios.mockResponse({ data: { customization: "shield" } });
|
||||
|
||||
await wait(() => getByText(componentContainer, CUSTOM));
|
||||
|
||||
expect(componentContainer).toMatchSnapshot();
|
||||
});
|
||||
});
|
@ -0,0 +1,17 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`CustomizationContext should render component without customization 1`] = `
|
||||
<div>
|
||||
<p>
|
||||
Description / component for original reForis (other devices)
|
||||
</p>
|
||||
</div>
|
||||
`;
|
||||
|
||||
exports[`CustomizationContext should render customized component 1`] = `
|
||||
<div>
|
||||
<p>
|
||||
Description / component for customized reForis (Shield)
|
||||
</p>
|
||||
</div>
|
||||
`;
|
@ -3,17 +3,18 @@
|
||||
exports[`<SubmitButton/> Render load 1`] = `
|
||||
<div>
|
||||
<button
|
||||
class="btn btn-primary col-sm-12 col-md-3 col-lg-2"
|
||||
class="btn btn-primary col-12 col-md-3 col-lg-2 d-inline-flex justify-content-center align-items-center"
|
||||
disabled=""
|
||||
type="submit"
|
||||
>
|
||||
<span
|
||||
aria-hidden="true"
|
||||
class="spinner-border spinner-border-sm"
|
||||
class="spinner-border spinner-border-sm me-1"
|
||||
role="status"
|
||||
/>
|
||||
|
||||
<span>
|
||||
Load settings
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
`;
|
||||
@ -21,10 +22,12 @@ exports[`<SubmitButton/> Render load 1`] = `
|
||||
exports[`<SubmitButton/> Render ready 1`] = `
|
||||
<div>
|
||||
<button
|
||||
class="btn btn-primary col-sm-12 col-md-3 col-lg-2"
|
||||
class="btn btn-primary col-12 col-md-3 col-lg-2 d-inline-flex justify-content-center align-items-center"
|
||||
type="submit"
|
||||
>
|
||||
<span>
|
||||
Save
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
`;
|
||||
@ -32,17 +35,18 @@ exports[`<SubmitButton/> Render ready 1`] = `
|
||||
exports[`<SubmitButton/> Render saving 1`] = `
|
||||
<div>
|
||||
<button
|
||||
class="btn btn-primary col-sm-12 col-md-3 col-lg-2"
|
||||
class="btn btn-primary col-12 col-md-3 col-lg-2 d-inline-flex justify-content-center align-items-center"
|
||||
disabled=""
|
||||
type="submit"
|
||||
>
|
||||
<span
|
||||
aria-hidden="true"
|
||||
class="spinner-border spinner-border-sm"
|
||||
class="spinner-border spinner-border-sm me-1"
|
||||
role="status"
|
||||
/>
|
||||
|
||||
<span>
|
||||
Updating
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
`;
|
||||
|
@ -6,19 +6,19 @@
|
||||
*/
|
||||
|
||||
import React, { useEffect } from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
import { Prompt } from "react-router-dom";
|
||||
|
||||
import { ALERT_TYPES } from "../../bootstrap/Alert";
|
||||
import { STATES as SUBMIT_BUTTON_STATES, SubmitButton } from "./SubmitButton";
|
||||
import { useAPIPost } from "../../api/hooks";
|
||||
import { API_STATE } from "../../api/utils";
|
||||
import { ALERT_TYPES } from "../../bootstrap/Alert";
|
||||
import { formFieldsSize } from "../../bootstrap/constants";
|
||||
import { Spinner } from "../../bootstrap/Spinner";
|
||||
import { useAlert } from "../../alertContext/AlertContext";
|
||||
import { useAPIPost } from "../../api/hooks";
|
||||
|
||||
import { useForisModule, useForm } from "../hooks";
|
||||
import { STATES as SUBMIT_BUTTON_STATES, SubmitButton } from "./SubmitButton";
|
||||
import { useAlert } from "../../context/alertContext/AlertContext";
|
||||
import { ErrorMessage } from "../../utils/ErrorMessage";
|
||||
import { useForisModule, useForm } from "../hooks";
|
||||
|
||||
ForisForm.propTypes = {
|
||||
/** Optional WebSocket object. See `scr/common/WebSockets.js`.
|
||||
@ -190,7 +190,7 @@ export function ForisForm({
|
||||
<Prompt message={getMessageOnLeavingPage} />
|
||||
<form onSubmit={onSubmit} ref={formReference}>
|
||||
{childrenWithFormProps}
|
||||
<div className="text-right">
|
||||
<div className="text-end">
|
||||
<SubmitButton
|
||||
state={getSubmitButtonState()}
|
||||
disabled={submitButtonIsDisabled}
|
||||
|
@ -6,6 +6,7 @@
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
import { Button } from "../../bootstrap/Button";
|
||||
|
@ -6,6 +6,7 @@
|
||||
*/
|
||||
|
||||
import { useCallback, useEffect, useReducer } from "react";
|
||||
|
||||
import update from "immutability-helper";
|
||||
|
||||
import { useAPIGet } from "../api/hooks";
|
||||
|
13
src/index.js
13
src/index.js
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2019-2021 CZ.NIC z.s.p.o. (http://www.nic.cz/)
|
||||
* Copyright (C) 2019-2022 CZ.NIC z.s.p.o. (https://www.nic.cz/)
|
||||
*
|
||||
* This is free software, licensed under the GNU General Public License v3.
|
||||
* See /LICENSE for more information.
|
||||
@ -90,4 +90,13 @@ export {
|
||||
} from "./utils/validations";
|
||||
|
||||
// Alert context
|
||||
export { AlertContextProvider, useAlert } from "./alertContext/AlertContext";
|
||||
export {
|
||||
AlertContextProvider,
|
||||
useAlert,
|
||||
} from "./context/alertContext/AlertContext";
|
||||
|
||||
// Customization context
|
||||
export {
|
||||
CustomizationContextProvider,
|
||||
useCustomizationContext,
|
||||
} from "./context/customizationContext/CustomizationContext";
|
||||
|
@ -14,6 +14,7 @@ import { render } from "@testing-library/react";
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
import { AlertContextMock } from "./alertContextMock";
|
||||
import { CustomizationContextMock } from "./cutomizationContextMock";
|
||||
|
||||
Wrapper.propTypes = {
|
||||
children: PropTypes.oneOfType([
|
||||
@ -24,11 +25,13 @@ Wrapper.propTypes = {
|
||||
|
||||
function Wrapper({ children }) {
|
||||
return (
|
||||
<CustomizationContextMock>
|
||||
<AlertContextMock>
|
||||
<StaticRouter>
|
||||
<UIDReset>{children}</UIDReset>
|
||||
</StaticRouter>
|
||||
</AlertContextMock>
|
||||
</CustomizationContextMock>
|
||||
);
|
||||
}
|
||||
|
||||
|
34
src/testUtils/cutomizationContextMock.js
Normal file
34
src/testUtils/cutomizationContextMock.js
Normal file
@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Copyright (C) 2019-2022 CZ.NIC z.s.p.o. (https://www.nic.cz/)
|
||||
*
|
||||
* This is free software, licensed under the GNU General Public License v3.
|
||||
* See /LICENSE for more information.
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
|
||||
window.CustomizationContext = React.createContext();
|
||||
|
||||
const deviceDetails = {
|
||||
kernel: "5.x.x",
|
||||
model: "Turris Omnia",
|
||||
os_branch: {
|
||||
mode: "branch",
|
||||
value: "hbs",
|
||||
},
|
||||
os_version: "6.x.x",
|
||||
reforis_version: "1.x.x",
|
||||
serial: 123456789,
|
||||
};
|
||||
|
||||
const isCustomized = false;
|
||||
|
||||
function CustomizationContextMock({ children }) {
|
||||
return (
|
||||
<CustomizationContext.Provider value={{ deviceDetails, isCustomized }}>
|
||||
{children}
|
||||
</CustomizationContext.Provider>
|
||||
);
|
||||
}
|
||||
|
||||
export { CustomizationContextMock };
|
@ -6,6 +6,7 @@
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
ErrorMessage.propTypes = {
|
||||
|
@ -7,12 +7,13 @@
|
||||
|
||||
import React from "react";
|
||||
|
||||
import { Spinner } from "../bootstrap/Spinner";
|
||||
import { API_STATE } from "../api/utils";
|
||||
import { ErrorMessage } from "./ErrorMessage";
|
||||
import { API_STATE } from "../api/utils";
|
||||
import { Spinner } from "../bootstrap/Spinner";
|
||||
|
||||
function withEither(conditionalFn, Either) {
|
||||
return (Component) => (props) => {
|
||||
return (Component) =>
|
||||
function (props) {
|
||||
if (conditionalFn(props)) {
|
||||
return <Either {...props} />;
|
||||
}
|
||||
|
@ -36,5 +36,6 @@ export const ForisURLs = {
|
||||
luci: "/cgi-bin/luci",
|
||||
|
||||
// API
|
||||
about: `${REFORIS_API_URL_PREFIX}/about`,
|
||||
reboot: `${REFORIS_API_URL_PREFIX}/reboot`,
|
||||
};
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
|
||||
* Copyright (C) 2019-2024 CZ.NIC z.s.p.o. (https://www.nic.cz/)
|
||||
*
|
||||
* This is free software, licensed under the GNU General Public License v3.
|
||||
* See /LICENSE for more information.
|
||||
|
@ -23,12 +23,15 @@ export const ERROR_MESSAGES = {
|
||||
const REs = {
|
||||
IPv4: /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,
|
||||
IPv6: /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,
|
||||
IPv6Prefix: /^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/([0-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8]))$/,
|
||||
IPv6Prefix:
|
||||
/^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/([0-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8]))$/,
|
||||
domain: /^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/,
|
||||
hostname: /^[a-z\d]([a-z\d-]{0,61}[a-z\d])?(\.[a-z\d]([a-z\d-]{0,61}[a-z\d])?)*$/i,
|
||||
hostname:
|
||||
/^[a-z\d]([a-z\d-]{0,61}[a-z\d])?(\.[a-z\d]([a-z\d-]{0,61}[a-z\d])?)*$/i,
|
||||
DUID: /^([0-9a-fA-F]{2}){4}([0-9a-fA-F]{2})*$/,
|
||||
MAC: /^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/,
|
||||
MultipleEmails: /^([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+ *)( *, *[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+ *)*$/,
|
||||
MultipleEmails:
|
||||
/^([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+ *)( *, *[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+ *)*$/,
|
||||
};
|
||||
|
||||
const createValidator = (fieldType) => (value) => {
|
||||
|
@ -43,7 +43,7 @@ module.exports = {
|
||||
},
|
||||
{
|
||||
name: "Alert Context",
|
||||
components: ["src/alertContext/AlertContext.js"],
|
||||
components: ["src/context/alertContext/AlertContext.js"],
|
||||
exampleMode: "expand",
|
||||
usageMode: "expand",
|
||||
},
|
||||
@ -51,6 +51,14 @@ module.exports = {
|
||||
sectionDepth: 1,
|
||||
},
|
||||
|
||||
{
|
||||
name: "Customization Context",
|
||||
components: [
|
||||
"src/context/customizationContext/CustomizationContext.js",
|
||||
],
|
||||
exampleMode: "expand",
|
||||
usageMode: "expand",
|
||||
},
|
||||
{
|
||||
name: "Bootstrap components",
|
||||
description: "Set of bootstrap components.",
|
||||
@ -97,8 +105,5 @@ module.exports = {
|
||||
},
|
||||
],
|
||||
},
|
||||
devServer: {
|
||||
publicPath: "/",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
@ -8,15 +8,16 @@ msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2022-12-02 15:54+0100\n"
|
||||
"PO-Revision-Date: 2022-03-15 22:41+0000\n"
|
||||
"Last-Translator: Koli <lukas.koluch@gmail.com>\n"
|
||||
"PO-Revision-Date: 2023-11-23 16:03+0000\n"
|
||||
"Last-Translator: Lukas Jelinek <lukas.jelinek@nic.cz>\n"
|
||||
"Language-Team: Czech <https://hosted.weblate.org/projects/turris/foris-js/cs/"
|
||||
">\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"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 5.2.1-rc\n"
|
||||
"Generated-By: Babel 2.11.0\n"
|
||||
|
||||
#: src/api/utils.js:61
|
||||
@ -37,11 +38,11 @@ msgstr "Došlo k neznámé chybě v aplikačním programovém rozhraní."
|
||||
|
||||
#: src/bootstrap/CopyInput.js:55
|
||||
msgid "Copied!"
|
||||
msgstr ""
|
||||
msgstr "Zkopírováno!"
|
||||
|
||||
#: src/bootstrap/CopyInput.js:55
|
||||
msgid "Copy"
|
||||
msgstr ""
|
||||
msgstr "Kopírovat"
|
||||
|
||||
#: src/common/RebootButton.js:27
|
||||
msgid "Reboot request failed."
|
||||
@ -61,7 +62,7 @@ msgstr "Opravdu chcete router restartovat?"
|
||||
|
||||
#: src/common/RebootButton.js:71
|
||||
msgid "Cancel"
|
||||
msgstr "Storno"
|
||||
msgstr "Zrušit"
|
||||
|
||||
#: src/common/RebootButton.js:73
|
||||
msgid "Confirm reboot"
|
||||
@ -78,7 +79,7 @@ msgstr "Nastavení Wi-Fi jsou uvedena do výchozího stavu."
|
||||
#: src/common/WiFiSettings/ResetWiFiSettings.js:55
|
||||
#: src/common/WiFiSettings/ResetWiFiSettings.js:69
|
||||
msgid "Reset Wi-Fi Settings"
|
||||
msgstr "Resetovat nastavení Wi-Fi"
|
||||
msgstr "Reset nastavení Wi-Fi"
|
||||
|
||||
#: src/common/WiFiSettings/ResetWiFiSettings.js:57
|
||||
msgid ""
|
||||
@ -86,6 +87,9 @@ msgid ""
|
||||
"Fi settings. Note that this will remove the current Wi-Fi configuration "
|
||||
"and restore the default values."
|
||||
msgstr ""
|
||||
"Pokud se počet bezdrátových karet neshoduje, můžete zkusit obnovit nastavení "
|
||||
"Wi-Fi. Je třeba upozornit, že se tím odstraní aktuální konfigurace Wi-Fi a "
|
||||
"obnoví se výchozí hodnoty."
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:95
|
||||
msgid "Wi-Fi ${deviceID + 1}"
|
||||
@ -101,9 +105,8 @@ msgid "Hide SSID"
|
||||
msgstr "Skrýt SSID"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:186
|
||||
#, fuzzy
|
||||
msgid "802.11n/ac/ax mode"
|
||||
msgstr "Režim 802.11n/ac"
|
||||
msgstr "Režim 802.11n/ac/ax"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:199
|
||||
msgid "Channel"
|
||||
@ -115,22 +118,23 @@ msgstr "Šifrování"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:226
|
||||
msgid "Disable Management Frame Protection"
|
||||
msgstr ""
|
||||
msgstr "Vypnout Management Frame Protection"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:227
|
||||
msgid ""
|
||||
"In case you have trouble connecting to WiFi Access Point, try disabling "
|
||||
"Management Frame Protection."
|
||||
msgstr ""
|
||||
"Máte-li problémy při připojování k přístupovému bodu Wi-Fi, zkuste vypnout "
|
||||
"Management Frame Protection."
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:262
|
||||
msgid "auto"
|
||||
msgstr "automaticky"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:303
|
||||
#, fuzzy
|
||||
msgid "Custom"
|
||||
msgstr "automaticky"
|
||||
msgstr "Uživatelsky určené"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiGuestForm.js:42
|
||||
msgid "Enable Guest Wi-Fi"
|
||||
@ -166,9 +170,8 @@ msgstr "Je třeba, aby heslo obsahovalo alespoň 8 znaků"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiSettings.js:90
|
||||
#: src/common/WiFiSettings/WiFiSettings.js:109
|
||||
#, fuzzy
|
||||
msgid "Password must not contain more than 63 symbols"
|
||||
msgstr "Je třeba, aby heslo obsahovalo alespoň 8 znaků"
|
||||
msgstr "Heslo nesmí obsahovat více než 63 znaků"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:9
|
||||
msgid "Disabled"
|
||||
@ -199,24 +202,20 @@ msgid "802.11ac - 160 MHz wide channel"
|
||||
msgstr "802.11ac – kanál šíře 160 MHz"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:16
|
||||
#, fuzzy
|
||||
msgid "802.11ax - 20 MHz wide channel"
|
||||
msgstr "802.11ac – kanál šíře 20 MHz"
|
||||
msgstr "802.11ax – kanál šíře 20 MHz"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:17
|
||||
#, fuzzy
|
||||
msgid "802.11ax - 40 MHz wide channel"
|
||||
msgstr "802.11ac – kanál šíře 40 MHz"
|
||||
msgstr "802.11ax – kanál šíře 40 MHz"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:18
|
||||
#, fuzzy
|
||||
msgid "802.11ax - 80 MHz wide channel"
|
||||
msgstr "802.11ac – kanál šíře 80 MHz"
|
||||
msgstr "802.11ax – kanál šíře 80 MHz"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:19
|
||||
#, fuzzy
|
||||
msgid "802.11ax - 160 MHz wide channel"
|
||||
msgstr "802.11ac – kanál šíře 160 MHz"
|
||||
msgstr "802.11ax – kanál šíře 160 MHz"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:26
|
||||
msgid "WPA3 only"
|
||||
@ -224,7 +223,7 @@ msgstr "pouze WPA3"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:27
|
||||
msgid "WPA3 with WPA2 as fallback (default)"
|
||||
msgstr ""
|
||||
msgstr "WPA3, nouzově WPA2 (výchozí)"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:28
|
||||
msgid "WPA2 only"
|
||||
@ -239,13 +238,8 @@ msgstr ""
|
||||
"problémy."
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:34
|
||||
#, fuzzy
|
||||
msgid "WPA2/3 pre-shared key, that is required to connect to the network."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" WPA2 předsdílený klíč, který je vyžadován pro připojení se k "
|
||||
"síti.\n"
|
||||
" "
|
||||
msgstr "Předsdílený klíč WPA2/3, který je vyžadován pro připojení se k síti."
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:37
|
||||
msgid "If set, network is not visible when scanning for available networks."
|
||||
@ -254,38 +248,29 @@ msgstr ""
|
||||
"vyhledávat dostupné sítě."
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:40
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"The 2.4 GHz band is more widely supported by clients, but tends to have "
|
||||
"more interference. The 5 GHz band is a newer standard and may not be "
|
||||
"supported by all your devices. It usually has less interference, but the "
|
||||
"signal does not carry so well indoors."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" Pásmo 2,4 GHz je v klientských zařízeních podporováno nejčastěji,"
|
||||
" ale bývá více zarušené. Pásmo 5 GHz je\n"
|
||||
" novější standard a nemusí být podporováno všemi vámi používanými "
|
||||
"zařízeními. Obvykle bývá méně zarušené,\n"
|
||||
" ale signál se hůře šíři uvnitř budov."
|
||||
"Pásmo 2,4 GHz je v klientských zařízeních podporováno nejčastěji, bývá ale "
|
||||
"více zarušené. Pásmo 5 GHz je novější standard a nemusí být podporováno "
|
||||
"všemi vámi používanými zařízeními. Obvykle bývá méně zarušené, signál se ale "
|
||||
"hůře šíří uvnitř budov."
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:43
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Change this to adjust 802.11n/ac/ax mode of operation. 802.11n with 40 "
|
||||
"MHz wide channels can yield higher throughput but can cause more "
|
||||
"interference in the network. If you don't know what to choose, use the "
|
||||
"default option with 20 MHz wide channel."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" Změna tohoto upraví režim fungování 802.11n/ac. 802.11n s kanály "
|
||||
"o šíři 40 MHz kanály může pomoci k vyšší\n"
|
||||
" propustnosti, ale je náchylnější na rušení. Pokud nevíte co "
|
||||
"zvolit, použijte výchozí volbu s kanálem šíře\n"
|
||||
" 20 MHz.\n"
|
||||
" "
|
||||
"Změna tohoto parametru upraví režim fungování 802.11n/ac. 802.11n s kanály o "
|
||||
"šíři 40 MHz může pomoci k vyšší propustnosti, je ale náchylnější na rušení. "
|
||||
"Pokud nevíte co zvolit, použijte výchozí volbu s kanálem šíře 20 MHz."
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:46
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Enables Wi-Fi for guests, which is separated from LAN network. Devices "
|
||||
"connected to this network are allowed to access the internet, but aren't "
|
||||
@ -293,14 +278,10 @@ msgid ""
|
||||
"router. Parameters of the guest network can be set in the Guest network "
|
||||
"tab."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" Zapíná Wi-Fi pro hosty, která je oddělená od místní sítě (LAN). "
|
||||
"Zařízením připojeným k této síti je umožněn\n"
|
||||
" přístup do Internetu, ale už ne na ostatní zařízení a k rozhraní "
|
||||
"pro nastavování směrovače.\n"
|
||||
" Parametry sítě pro hosty je možné nastavit na panelu „Síť pro "
|
||||
"hosty“.\n"
|
||||
" "
|
||||
"Zapíná Wi-Fi pro hosty, která je oddělená od místní sítě (LAN). Zařízením "
|
||||
"připojeným k této síti je umožněn přístup do Internetu, ale už ne na ostatní "
|
||||
"zařízení a k rozhraní pro nastavování směrovače. Parametry sítě pro hosty je "
|
||||
"možné nastavit na panelu „Síť pro hosty“."
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:49
|
||||
msgid ""
|
||||
@ -309,6 +290,10 @@ msgid ""
|
||||
"without WPA3 support require older WPA2. If you experience issues with "
|
||||
"connecting older devices, try to enable WPA2."
|
||||
msgstr ""
|
||||
"Standard WPA3 je nová nejbezpečnější metoda, již se doporučuje používat se "
|
||||
"všemi zařízeními, která ji podporují. Starší zařízení bez podpory WPA3 "
|
||||
"potřebují starší WPA2. Zaznamenáte-li problémy s připojováním starších "
|
||||
"zařízení, zkuste zapnout WPA2."
|
||||
|
||||
#: src/form/components/ForisForm.js:121
|
||||
msgid "Settings saved successfully"
|
||||
@ -353,7 +338,6 @@ msgid "This is not a valid domain name."
|
||||
msgstr "Toto není platné doménové jméno."
|
||||
|
||||
#: src/utils/validations.js:17
|
||||
#, fuzzy
|
||||
msgid "This is not a valid hostname."
|
||||
msgstr "Toto není platné doménové jméno."
|
||||
|
||||
@ -394,4 +378,3 @@ msgstr "Neobsahuje seznam e-mailů oddělených čárkou."
|
||||
#~ "ale, že\n"
|
||||
#~ "se tím odstraní aktuální konfigurace a vrátí se výchozí hodnoty.\n"
|
||||
#~ " "
|
||||
|
||||
|
@ -8,15 +8,16 @@ msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2022-12-02 15:54+0100\n"
|
||||
"PO-Revision-Date: 2021-09-24 19:38+0000\n"
|
||||
"Last-Translator: CryptKid <CryptKiddie@chaospott.de>\n"
|
||||
"PO-Revision-Date: 2024-01-04 21:08+0000\n"
|
||||
"Last-Translator: Erik Pfannenstein <debianignatz@gmx.de>\n"
|
||||
"Language-Team: German <https://hosted.weblate.org/projects/turris/foris-js/"
|
||||
"de/>\n"
|
||||
"Language: de\n"
|
||||
"Language-Team: German <https://hosted.weblate.org/projects/turris/foris-"
|
||||
"js/de/>\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.4-dev\n"
|
||||
"Generated-By: Babel 2.11.0\n"
|
||||
|
||||
#: src/api/utils.js:61
|
||||
@ -37,11 +38,11 @@ msgstr "Ein unbekannter API-Fehler ist aufgetreten."
|
||||
|
||||
#: src/bootstrap/CopyInput.js:55
|
||||
msgid "Copied!"
|
||||
msgstr ""
|
||||
msgstr "Kopiert!"
|
||||
|
||||
#: src/bootstrap/CopyInput.js:55
|
||||
msgid "Copy"
|
||||
msgstr ""
|
||||
msgstr "Kopieren"
|
||||
|
||||
#: src/common/RebootButton.js:27
|
||||
msgid "Reboot request failed."
|
||||
@ -88,6 +89,9 @@ msgid ""
|
||||
"Fi settings. Note that this will remove the current Wi-Fi configuration "
|
||||
"and restore the default values."
|
||||
msgstr ""
|
||||
"Falls die Anzahl der WLAN-Karten nicht korrekt ist, könnte es helfen, die "
|
||||
"WLAN-Einstellungen zurückzusetzen. Beachten Sie, dass dabei die aktuelle "
|
||||
"WLAN-Konfiguration mit den Werkseinstellungen überschrieben wird."
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:95
|
||||
msgid "Wi-Fi ${deviceID + 1}"
|
||||
@ -103,9 +107,8 @@ msgid "Hide SSID"
|
||||
msgstr "SSID verbergen"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:186
|
||||
#, fuzzy
|
||||
msgid "802.11n/ac/ax mode"
|
||||
msgstr "802.11n/ac Modus"
|
||||
msgstr "802.11n/ac/ax-Modus"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:199
|
||||
msgid "Channel"
|
||||
@ -113,26 +116,27 @@ msgstr "Kanal"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:211
|
||||
msgid "Encryption"
|
||||
msgstr ""
|
||||
msgstr "Verschlüsselung"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:226
|
||||
msgid "Disable Management Frame Protection"
|
||||
msgstr ""
|
||||
msgstr "Management Frame Protection abschalten"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:227
|
||||
msgid ""
|
||||
"In case you have trouble connecting to WiFi Access Point, try disabling "
|
||||
"Management Frame Protection."
|
||||
msgstr ""
|
||||
"Falls Sie beim Verbinden mit dem WiFi-Access-Point Probleme haben, schalten "
|
||||
"Sie testweise die Management Frame Protection ab."
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:262
|
||||
msgid "auto"
|
||||
msgstr "automatisch"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:303
|
||||
#, fuzzy
|
||||
msgid "Custom"
|
||||
msgstr "automatisch"
|
||||
msgstr "Benutzerdefiniert"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiGuestForm.js:42
|
||||
msgid "Enable Guest Wi-Fi"
|
||||
@ -149,17 +153,17 @@ msgstr "PDF herunterladen"
|
||||
#: src/common/WiFiSettings/WiFiSettings.js:82
|
||||
#: src/common/WiFiSettings/WiFiSettings.js:98
|
||||
msgid "SSID can't be longer than 32 symbols"
|
||||
msgstr "SSID darf nicht länger als 32 Symbole sein"
|
||||
msgstr "Die SSID darf nicht länger als 32 Zeichen sein"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiSettings.js:83
|
||||
#: src/common/WiFiSettings/WiFiSettings.js:100
|
||||
msgid "SSID can't be empty"
|
||||
msgstr "SSID darf nicht leer sein"
|
||||
msgstr "Die SSID darf nicht leer sein"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiSettings.js:85
|
||||
#: src/common/WiFiSettings/WiFiSettings.js:102
|
||||
msgid "SSID can't be longer than 32 bytes"
|
||||
msgstr "SSID darf nicht länger als 32 Symbole sein"
|
||||
msgstr "Die SSID darf nicht länger als 32 Bytes sein"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiSettings.js:88
|
||||
#: src/common/WiFiSettings/WiFiSettings.js:105
|
||||
@ -168,9 +172,8 @@ msgstr "Das Passwort muss mindestens 8 Zeichen enthalten"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiSettings.js:90
|
||||
#: src/common/WiFiSettings/WiFiSettings.js:109
|
||||
#, fuzzy
|
||||
msgid "Password must not contain more than 63 symbols"
|
||||
msgstr "Das Passwort muss mindestens 8 Zeichen enthalten"
|
||||
msgstr "Das Passwort darf höchstens 63 Zeichen enthalten"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:9
|
||||
msgid "Disabled"
|
||||
@ -197,56 +200,48 @@ msgid "802.11ac - 80 MHz wide channel"
|
||||
msgstr "802.11ac - 80 MHz breiter Kanal"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:15
|
||||
#, fuzzy
|
||||
msgid "802.11ac - 160 MHz wide channel"
|
||||
msgstr "802.11ac - 80 MHz breiter Kanal"
|
||||
msgstr "802.11ac - 160 MHz breiter Kanal"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:16
|
||||
#, fuzzy
|
||||
msgid "802.11ax - 20 MHz wide channel"
|
||||
msgstr "802.11ac - 20 MHz breiter Kanal"
|
||||
msgstr "802.11ax - 20 MHz breiter Kanal"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:17
|
||||
#, fuzzy
|
||||
msgid "802.11ax - 40 MHz wide channel"
|
||||
msgstr "802.11ac - 40 MHz breiter Kanal"
|
||||
msgstr "802.11ax - 40 MHz breiter Kanal"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:18
|
||||
#, fuzzy
|
||||
msgid "802.11ax - 80 MHz wide channel"
|
||||
msgstr "802.11ac - 80 MHz breiter Kanal"
|
||||
msgstr "802.11ax - 80 MHz breiter Kanal"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:19
|
||||
#, fuzzy
|
||||
msgid "802.11ax - 160 MHz wide channel"
|
||||
msgstr "802.11ac - 80 MHz breiter Kanal"
|
||||
msgstr "802.11ax - 160 MHz breiter Kanal"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:26
|
||||
msgid "WPA3 only"
|
||||
msgstr ""
|
||||
msgstr "Nur WPA3"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:27
|
||||
msgid "WPA3 with WPA2 as fallback (default)"
|
||||
msgstr ""
|
||||
msgstr "WPA3 mit WPA2 als Ausweichmöglichkeit (Voreinstellung)"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:28
|
||||
msgid "WPA2 only"
|
||||
msgstr ""
|
||||
msgstr "Nur WPA2"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:31
|
||||
msgid ""
|
||||
"SSID which contains non-standard characters could cause problems on some "
|
||||
"devices."
|
||||
msgstr ""
|
||||
"SSIDs, die nicht standardmäßige Zeichen enthalten, können auf manchen "
|
||||
"Geräten Probleme verursachen."
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:34
|
||||
#, fuzzy
|
||||
msgid "WPA2/3 pre-shared key, that is required to connect to the network."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" WPA2 Pre-Shared Key, der für die Verbindung mit dem Netzwerk "
|
||||
"benötigt wird.\n"
|
||||
" "
|
||||
msgstr "WPA2/3 Pre-Shard Key, der zum Verbinden mit dem Netzwerk notwendig ist."
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:37
|
||||
msgid "If set, network is not visible when scanning for available networks."
|
||||
@ -255,39 +250,31 @@ msgstr ""
|
||||
"drahtlosen Netzwerke angezeigt."
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:40
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"The 2.4 GHz band is more widely supported by clients, but tends to have "
|
||||
"more interference. The 5 GHz band is a newer standard and may not be "
|
||||
"supported by all your devices. It usually has less interference, but the "
|
||||
"signal does not carry so well indoors."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" Das 2,4 GHz-Band wird stärker von Clients unterstützt, hat aber "
|
||||
"tendenziell mehr Interferenzen. Das 5-GHz-Band ist ein\n"
|
||||
" neuerer Standard und wird möglicherweise nicht von allen Geräten "
|
||||
"unterstützt. Es hat in der Regel weniger Interferenzen, aber das Signal\n"
|
||||
" trägt nicht so gut drinnen."
|
||||
"Das 2,4 GHz-Band wird von allen Geräten unterstützt, ist aber tendenziell "
|
||||
"stärker mit Interferenzen belastet. Das 5-GHz-Band ist ein neuerer Standard, "
|
||||
"der möglicherweise nicht von allen Ihren Geräten unterstützt wird. Es hat in "
|
||||
"der Regel weniger Interferenzen, aber das Signal trägt nicht so gut in "
|
||||
"Innenräumen."
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:43
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Change this to adjust 802.11n/ac/ax mode of operation. 802.11n with 40 "
|
||||
"MHz wide channels can yield higher throughput but can cause more "
|
||||
"interference in the network. If you don't know what to choose, use the "
|
||||
"default option with 20 MHz wide channel."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" Ändern Sie diese Option, um den Betriebsmodus 802.11n/ac "
|
||||
"anzupassen. 802.11n mit 40 MHz breiten Kanälen können höhere\n"
|
||||
" durchsatz, kann jedoch zu mehr Interferenzen im Netzwerk führen. "
|
||||
"Wenn Sie nicht wissen, was Sie wählen sollen, verwenden Sie die "
|
||||
"Standardeinstellung\n"
|
||||
" Option mit 20 MHz breitem Kanal.\n"
|
||||
" "
|
||||
"Ändern Sie diese Option, um den 802.11n/ac/ax-Betriebsmodus anzupassen. 40 "
|
||||
"MHz breite Kanäle können bei 802.11n mehr Daten transportieren, jedoch zu "
|
||||
"mehr Interferenzen im Netzwerk führen. Wenn Sie nicht wissen, was Sie wählen "
|
||||
"sollen, verwenden Sie die Voreinstellung mit 20 MHz Kanalbreite."
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:46
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Enables Wi-Fi for guests, which is separated from LAN network. Devices "
|
||||
"connected to this network are allowed to access the internet, but aren't "
|
||||
@ -295,14 +282,11 @@ msgid ""
|
||||
"router. Parameters of the guest network can be set in the Guest network "
|
||||
"tab."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" Ermöglicht Wi-Fi für Gäste, das vom LAN-Netzwerk getrennt ist. "
|
||||
"Geräte, die mit diesem Netzwerk verbunden sind, dürfen\n"
|
||||
" auf das Internet zugreifen, dürfen aber nicht auf andere Geräte "
|
||||
"und die Konfigurationsschnittstelle des Routers zugreifen.\n"
|
||||
" Die Parameter des Gastnetzwerks können in der Registerkarte "
|
||||
"Gastnetzwerk eingestellt werden.\n"
|
||||
" "
|
||||
"Ermöglicht ein Wi-Fi für Gäste, das vom LAN-Netzwerk getrennt ist. Geräte, "
|
||||
"die mit diesem Netzwerk verbunden sind, dürfen auf das Internet zugreifen, "
|
||||
"nicht jedoch auf andere Geräte oder die Konfigurationsschnittstelle des "
|
||||
"Routers. Die Parameter des Gastnetzwerks können auf der Gastnetzwerk-"
|
||||
"Registerkarte eingestellt werden."
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:49
|
||||
msgid ""
|
||||
@ -311,6 +295,11 @@ msgid ""
|
||||
"without WPA3 support require older WPA2. If you experience issues with "
|
||||
"connecting older devices, try to enable WPA2."
|
||||
msgstr ""
|
||||
"Der WPA3-Standard ist die neue Verschlüsselungsmethode mit der besten "
|
||||
"Sicherheit. Er empfiehlt sich für jedes Gerät, das ihn unterstützt, aber "
|
||||
"ältere Geräte, bei denen das noch nicht der Fall ist, müssen auf das ältere "
|
||||
"WPA2 ausweichen. Falls Sie Probleme dabei haben, ältere Geräte mit dem WLAN "
|
||||
"zu verbinden, schalten Sie versuchsweise WPA2 ein."
|
||||
|
||||
#: src/form/components/ForisForm.js:121
|
||||
msgid "Settings saved successfully"
|
||||
@ -319,6 +308,8 @@ msgstr "Einstellungen erfolgreich gespeichert"
|
||||
#: src/form/components/ForisForm.js:183
|
||||
msgid "Changes you made may not be saved. Are you sure you want to leave?"
|
||||
msgstr ""
|
||||
"Änderungen, die Sie vorgenommen haben, werden möglicherweise nicht "
|
||||
"gespeichert. Möchten Sie wirklich gehen?"
|
||||
|
||||
#: src/form/components/SubmitButton.js:31
|
||||
msgid "Updating"
|
||||
@ -334,11 +325,11 @@ msgstr "Speichern"
|
||||
|
||||
#: src/utils/ErrorMessage.js:16
|
||||
msgid "An error occurred while fetching data."
|
||||
msgstr ""
|
||||
msgstr "Beim Abruf der Daten ist ein Fehler aufgetreten."
|
||||
|
||||
#: src/utils/validations.js:13
|
||||
msgid "This is not a valid IPv4 address."
|
||||
msgstr "Dies ist keine gültige IPv4-Adresse."
|
||||
msgstr "Das ist keine gültige IPv4 Adresse."
|
||||
|
||||
#: src/utils/validations.js:14
|
||||
msgid "This is not a valid IPv6 address."
|
||||
@ -353,9 +344,8 @@ msgid "This is not a valid domain name."
|
||||
msgstr "Dies ist kein gültiger Domainname."
|
||||
|
||||
#: src/utils/validations.js:17
|
||||
#, fuzzy
|
||||
msgid "This is not a valid hostname."
|
||||
msgstr "Dies ist kein gültiger Domainname."
|
||||
msgstr "Dies ist kein gültiger Hostname."
|
||||
|
||||
#: src/utils/validations.js:18
|
||||
msgid "This is not a valid DUID."
|
||||
@ -387,4 +377,3 @@ msgstr "Enthält keine Liste von E-Mails, die durch Kommas getrennt sind."
|
||||
#~ "current Wi-Fi configuration and restore the default values.\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
|
||||
|
@ -8,19 +8,21 @@ msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2022-12-02 15:54+0100\n"
|
||||
"PO-Revision-Date: 2019-02-19 13:34+0100\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"PO-Revision-Date: 2022-12-31 23:48+0000\n"
|
||||
"Last-Translator: Anselmo <anselmo@casinadicornia.com>\n"
|
||||
"Language-Team: Italian <https://hosted.weblate.org/projects/turris/foris-js/"
|
||||
"it/>\n"
|
||||
"Language: it\n"
|
||||
"Language-Team: it <LL@li.org>\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 4.15.1-dev\n"
|
||||
"Generated-By: Babel 2.11.0\n"
|
||||
|
||||
#: src/api/utils.js:61
|
||||
msgid "The session is expired. Please log in again."
|
||||
msgstr ""
|
||||
msgstr "Sessione scaduta. Ripetere l'accesso."
|
||||
|
||||
#: src/api/utils.js:66
|
||||
msgid "Timeout error occurred."
|
||||
@ -93,7 +95,7 @@ msgstr ""
|
||||
#: src/common/WiFiSettings/WiFiForm.js:132
|
||||
#: src/common/WiFiSettings/WiFiGuestForm.js:80
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
msgstr "Password"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:146
|
||||
msgid "Hide SSID"
|
||||
@ -295,7 +297,7 @@ msgstr ""
|
||||
|
||||
#: src/utils/validations.js:13
|
||||
msgid "This is not a valid IPv4 address."
|
||||
msgstr ""
|
||||
msgstr "Indirizzo IPv4 non valido."
|
||||
|
||||
#: src/utils/validations.js:14
|
||||
msgid "This is not a valid IPv6 address."
|
||||
@ -414,4 +416,3 @@ msgstr ""
|
||||
#~ " default option with 20 MHz wide "
|
||||
#~ "channel."
|
||||
#~ msgstr ""
|
||||
|
||||
|
@ -8,15 +8,16 @@ msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2022-12-02 15:54+0100\n"
|
||||
"PO-Revision-Date: 2022-10-26 07:01+0000\n"
|
||||
"PO-Revision-Date: 2023-03-02 11:40+0000\n"
|
||||
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
|
||||
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/turris/"
|
||||
"foris-js/nb_NO/>\n"
|
||||
"Language: nb_NO\n"
|
||||
"Language-Team: Norwegian Bokmål "
|
||||
"<https://hosted.weblate.org/projects/turris/foris-js/nb_NO/>\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 4.16.2-dev\n"
|
||||
"Generated-By: Babel 2.11.0\n"
|
||||
|
||||
#: src/api/utils.js:61
|
||||
@ -121,14 +122,18 @@ msgid "Encryption"
|
||||
msgstr "Kryptering"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:226
|
||||
#, fuzzy
|
||||
msgid "Disable Management Frame Protection"
|
||||
msgstr ""
|
||||
msgstr "Skru av håndtering av rammebeskyttelse"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:227
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"In case you have trouble connecting to WiFi Access Point, try disabling "
|
||||
"Management Frame Protection."
|
||||
msgstr ""
|
||||
"I fall du har problemer med å koble til Wi-Fi-tilgangspunkt, kan du skru av "
|
||||
"håndtering av rammebeskyttelse."
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:262
|
||||
msgid "auto"
|
||||
@ -388,4 +393,3 @@ msgstr "Inneholder ikke en kommainndelt liste med e-postadresser."
|
||||
#~ "\n"
|
||||
#~ "gjeldende Wi-Fi-oppsett og tilbakestiller forvalgte verdier.\n"
|
||||
#~ " "
|
||||
|
||||
|
@ -8,15 +8,16 @@ msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2022-12-02 15:54+0100\n"
|
||||
"PO-Revision-Date: 2020-11-29 19:29+0000\n"
|
||||
"Last-Translator: Johan van de Wetering <mail@jvdwetering.nl>\n"
|
||||
"PO-Revision-Date: 2024-01-04 21:08+0000\n"
|
||||
"Last-Translator: powerburner-nl <peter.mulder.1981@gmail.com>\n"
|
||||
"Language-Team: Dutch <https://hosted.weblate.org/projects/turris/foris-js/nl/"
|
||||
">\n"
|
||||
"Language: nl\n"
|
||||
"Language-Team: Dutch <https://hosted.weblate.org/projects/turris/foris-"
|
||||
"js/nl/>\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.4-dev\n"
|
||||
"Generated-By: Babel 2.11.0\n"
|
||||
|
||||
#: src/api/utils.js:61
|
||||
@ -54,19 +55,19 @@ msgstr "Opnieuw opstarten"
|
||||
|
||||
#: src/common/RebootButton.js:66
|
||||
msgid "Warning!"
|
||||
msgstr ""
|
||||
msgstr "Waarschuwing!"
|
||||
|
||||
#: src/common/RebootButton.js:68
|
||||
msgid "Are you sure you want to restart the router?"
|
||||
msgstr ""
|
||||
msgstr "Weet u zeker dat u de router opnieuw wilt opstarten?"
|
||||
|
||||
#: src/common/RebootButton.js:71
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
msgstr "Annuleren"
|
||||
|
||||
#: src/common/RebootButton.js:73
|
||||
msgid "Confirm reboot"
|
||||
msgstr ""
|
||||
msgstr "Opnieuw opstarten bevestigen"
|
||||
|
||||
#: src/common/WiFiSettings/ResetWiFiSettings.js:38
|
||||
msgid "An error occurred during resetting Wi-Fi settings."
|
||||
@ -418,4 +419,3 @@ msgstr "Bevat geen lijst met e-mails gescheiden door komma's."
|
||||
#~ " default option with 20 MHz wide "
|
||||
#~ "channel."
|
||||
#~ msgstr ""
|
||||
|
||||
|
@ -8,16 +8,17 @@ msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2022-12-02 15:54+0100\n"
|
||||
"PO-Revision-Date: 2022-09-27 15:19+0000\n"
|
||||
"Last-Translator: Orest Worhacz <areyouloco@paranoici.org>\n"
|
||||
"PO-Revision-Date: 2023-03-07 16:37+0000\n"
|
||||
"Last-Translator: Arusekk <arek_koz@o2.pl>\n"
|
||||
"Language-Team: Polish <https://hosted.weblate.org/projects/turris/foris-js/"
|
||||
"pl/>\n"
|
||||
"Language: pl\n"
|
||||
"Language-Team: Polish <https://hosted.weblate.org/projects/turris/foris-"
|
||||
"js/pl/>\n"
|
||||
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && "
|
||||
"(n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
|
||||
"|| n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 4.16.2-dev\n"
|
||||
"Generated-By: Babel 2.11.0\n"
|
||||
|
||||
#: src/api/utils.js:61
|
||||
@ -57,9 +58,8 @@ msgid "Warning!"
|
||||
msgstr "Ostrzeżenie!"
|
||||
|
||||
#: src/common/RebootButton.js:68
|
||||
#, fuzzy
|
||||
msgid "Are you sure you want to restart the router?"
|
||||
msgstr "Czy jesteś pewien/pewna, że chcesz zrestartować router?"
|
||||
msgstr "Czy na pewno zrestartować router?"
|
||||
|
||||
#: src/common/RebootButton.js:71
|
||||
msgid "Cancel"
|
||||
@ -130,7 +130,7 @@ msgstr ""
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:303
|
||||
msgid "Custom"
|
||||
msgstr ""
|
||||
msgstr "Własny"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiGuestForm.js:42
|
||||
msgid "Enable Guest Wi-Fi"
|
||||
@ -171,7 +171,7 @@ msgstr ""
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:9
|
||||
msgid "Disabled"
|
||||
msgstr ""
|
||||
msgstr "Wyłączone"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:10
|
||||
msgid "802.11n - 20 MHz wide channel"
|
||||
@ -417,4 +417,3 @@ msgstr "Nie zawiera listy e-maili oddzielonych przecinkami."
|
||||
#~ " default option with 20 MHz wide "
|
||||
#~ "channel."
|
||||
#~ msgstr ""
|
||||
|
||||
|
@ -8,16 +8,17 @@ msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2022-12-02 15:54+0100\n"
|
||||
"PO-Revision-Date: 2022-05-28 09:19+0000\n"
|
||||
"PO-Revision-Date: 2022-12-07 12:47+0000\n"
|
||||
"Last-Translator: Алексей Леньшин <alenshin@gmail.com>\n"
|
||||
"Language-Team: Russian <https://hosted.weblate.org/projects/turris/foris-js/"
|
||||
"ru/>\n"
|
||||
"Language: ru\n"
|
||||
"Language-Team: Russian <https://hosted.weblate.org/projects/turris/foris-"
|
||||
"js/ru/>\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
|
||||
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 4.15-dev\n"
|
||||
"Generated-By: Babel 2.11.0\n"
|
||||
|
||||
#: src/api/utils.js:61
|
||||
@ -118,13 +119,15 @@ msgstr "Шифрование"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:226
|
||||
msgid "Disable Management Frame Protection"
|
||||
msgstr ""
|
||||
msgstr "Отключить защиту кадров управления"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:227
|
||||
msgid ""
|
||||
"In case you have trouble connecting to WiFi Access Point, try disabling "
|
||||
"Management Frame Protection."
|
||||
msgstr ""
|
||||
"Если у вас возникли проблемы с подключением к точке доступа Wi-Fi, "
|
||||
"попробуйте отключить защиту кадров управления."
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:262
|
||||
msgid "auto"
|
||||
@ -381,4 +384,3 @@ msgstr "Не содержит списка электронных адресов
|
||||
#~ "конфигурации Wi-Fi и восстановлению "
|
||||
#~ "значений по умолчанию.\n"
|
||||
#~ " "
|
||||
|
||||
|
@ -8,15 +8,16 @@ msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2022-12-02 15:54+0100\n"
|
||||
"PO-Revision-Date: 2022-05-30 06:14+0000\n"
|
||||
"PO-Revision-Date: 2023-01-17 22:51+0000\n"
|
||||
"Last-Translator: Atec <dr.atec@gmail.com>\n"
|
||||
"Language-Team: Slovak <https://hosted.weblate.org/projects/turris/foris-js/"
|
||||
"sk/>\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"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 4.15.1-dev\n"
|
||||
"Generated-By: Babel 2.11.0\n"
|
||||
|
||||
#: src/api/utils.js:61
|
||||
@ -117,13 +118,15 @@ msgstr "Šifrovanie"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:226
|
||||
msgid "Disable Management Frame Protection"
|
||||
msgstr ""
|
||||
msgstr "Zakázať Management Frame Protection"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:227
|
||||
msgid ""
|
||||
"In case you have trouble connecting to WiFi Access Point, try disabling "
|
||||
"Management Frame Protection."
|
||||
msgstr ""
|
||||
"Ak máte problémy s pripojením k prístupovému bodu WiFi, skúste zakázať "
|
||||
"Management Frame Protection."
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:262
|
||||
msgid "auto"
|
||||
@ -377,4 +380,3 @@ msgstr "Neobsahuje zoznam e-mailov oddelených čiarkami."
|
||||
#~ "že sa tým odstráni aktuálna konfigurácia"
|
||||
#~ " a obnovia sa východiskové hodnoty.\n"
|
||||
#~ " "
|
||||
|
||||
|
@ -8,16 +8,16 @@ msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2022-12-02 15:54+0100\n"
|
||||
"PO-Revision-Date: 2021-09-26 03:39+0000\n"
|
||||
"Last-Translator: Kristoffer Grundström "
|
||||
"<swedishsailfishosuser@tutanota.com>\n"
|
||||
"PO-Revision-Date: 2023-09-22 21:00+0000\n"
|
||||
"Last-Translator: Kristoffer Grundström <swedishsailfishosuser@tutanota.com>\n"
|
||||
"Language-Team: Swedish <https://hosted.weblate.org/projects/turris/foris-js/"
|
||||
"sv/>\n"
|
||||
"Language: sv\n"
|
||||
"Language-Team: Swedish <https://hosted.weblate.org/projects/turris/foris-"
|
||||
"js/sv/>\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.1-dev\n"
|
||||
"Generated-By: Babel 2.11.0\n"
|
||||
|
||||
#: src/api/utils.js:61
|
||||
@ -30,19 +30,19 @@ msgstr ""
|
||||
|
||||
#: src/api/utils.js:69
|
||||
msgid "No response received."
|
||||
msgstr ""
|
||||
msgstr "Inget svar togs emot."
|
||||
|
||||
#: src/api/utils.js:79
|
||||
msgid "An unknown API error occurred."
|
||||
msgstr ""
|
||||
msgstr "Ett okänt API-fel inträffade."
|
||||
|
||||
#: src/bootstrap/CopyInput.js:55
|
||||
msgid "Copied!"
|
||||
msgstr ""
|
||||
msgstr "Kopierades!"
|
||||
|
||||
#: src/bootstrap/CopyInput.js:55
|
||||
msgid "Copy"
|
||||
msgstr ""
|
||||
msgstr "Kopiera"
|
||||
|
||||
#: src/common/RebootButton.js:27
|
||||
msgid "Reboot request failed."
|
||||
@ -70,11 +70,11 @@ msgstr "Bekräfta omstart"
|
||||
|
||||
#: src/common/WiFiSettings/ResetWiFiSettings.js:38
|
||||
msgid "An error occurred during resetting Wi-Fi settings."
|
||||
msgstr ""
|
||||
msgstr "Ett fel inträffade under återställningen av Wi-Fi-inställningarna."
|
||||
|
||||
#: src/common/WiFiSettings/ResetWiFiSettings.js:41
|
||||
msgid "Wi-Fi settings are set to defaults."
|
||||
msgstr ""
|
||||
msgstr "Wi-Fi-inställningarna har ställts in standardinställningarna."
|
||||
|
||||
#: src/common/WiFiSettings/ResetWiFiSettings.js:55
|
||||
#: src/common/WiFiSettings/ResetWiFiSettings.js:69
|
||||
@ -87,6 +87,9 @@ msgid ""
|
||||
"Fi settings. Note that this will remove the current Wi-Fi configuration "
|
||||
"and restore the default values."
|
||||
msgstr ""
|
||||
"Om ett antal trådlösa kort inte matchar så kan du prova att återställa Wi-Fi-"
|
||||
"inställningarna. Notera att det här kommer att ta bort den nuvarande Wi-Fi-"
|
||||
"konfigurationen och återställa till standardvärdena."
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:95
|
||||
msgid "Wi-Fi ${deviceID + 1}"
|
||||
@ -99,11 +102,11 @@ msgstr "Lösenord"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:146
|
||||
msgid "Hide SSID"
|
||||
msgstr ""
|
||||
msgstr "Göm SSID"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:186
|
||||
msgid "802.11n/ac/ax mode"
|
||||
msgstr ""
|
||||
msgstr "802.11n/ac/ax-läge"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:199
|
||||
#, fuzzy
|
||||
@ -112,7 +115,7 @@ msgstr "Avbryt"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:211
|
||||
msgid "Encryption"
|
||||
msgstr ""
|
||||
msgstr "Kryptering"
|
||||
|
||||
#: src/common/WiFiSettings/WiFiForm.js:226
|
||||
msgid "Disable Management Frame Protection"
|
||||
@ -221,7 +224,7 @@ msgstr "802.11ac - 160 MHz bred kanal"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:26
|
||||
msgid "WPA3 only"
|
||||
msgstr ""
|
||||
msgstr "Endast WPA3"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:27
|
||||
msgid "WPA3 with WPA2 as fallback (default)"
|
||||
@ -229,13 +232,15 @@ msgstr ""
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:28
|
||||
msgid "WPA2 only"
|
||||
msgstr ""
|
||||
msgstr "Endast WPA2"
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:31
|
||||
msgid ""
|
||||
"SSID which contains non-standard characters could cause problems on some "
|
||||
"devices."
|
||||
msgstr ""
|
||||
"SSID som innehåller icke-standardiserade tecken kan orsaka problem i en del "
|
||||
"enheter."
|
||||
|
||||
#: src/common/WiFiSettings/constants.js:34
|
||||
msgid "WPA2/3 pre-shared key, that is required to connect to the network."
|
||||
@ -424,4 +429,3 @@ msgstr ""
|
||||
#~ " default option with 20 MHz wide "
|
||||
#~ "channel."
|
||||
#~ msgstr ""
|
||||
|
||||
|
Reference in New Issue
Block a user