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

Compare commits

...

63 Commits

Author SHA1 Message Date
03a020f87c Bump version 1.4.0. 2019-11-29 16:29:32 +01:00
c6fd9bbadb NPM audit fix. 2019-11-29 16:29:32 +01:00
acaaab0654 Fix URL prefixes. 2019-11-29 16:29:31 +01:00
04a667eb6f Extract reboot button from reForis.
* Add RebootButton tests.
 * RebootButton code review.
 * Update translations.
2019-11-29 16:29:31 +01:00
fd01bc6f56 Merge branch 'bump-1.3.3' into 'dev'
Bump version 1.3.3.

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

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

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

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

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

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

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

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

See merge request turris/reforis/foris-js!40
2019-11-15 08:55:24 +00:00
b30f9f59b4 Fix for withEither 2019-11-15 08:55:24 +00:00
158bd1bb24 Merge branch 'dev' into 'master'
Release 1.3.1

See merge request turris/reforis/foris-js!38
2019-11-14 12:58:31 +00:00
d935f78d6e Merge branch '13-packages-required-for-translations' into 'dev'
Added virtual environment and packages required for translations.

Closes #13

See merge request turris/reforis/foris-js!39
2019-11-14 12:51:58 +00:00
73f4ab48c3 Added virtual environment and packages required for translations. 2019-11-14 11:28:28 +01:00
7075592f24 Merge branch 'timeout' into 'dev'
Timeout handling

See merge request turris/reforis/foris-js!36
2019-11-13 14:45:24 +00:00
23029470b9 Improve error handling + small refactoring. 2019-11-13 15:28:26 +01:00
7e6e6f8c87 Use generic error message in the ForisForm. 2019-11-13 14:49:52 +01:00
b831d664a9 Add timout handling. 2019-11-13 14:49:52 +01:00
0f5b35a3ba Merge branch 'shared-lint-configs' into 'dev'
Shared lint configs

See merge request turris/reforis/foris-js!37
2019-11-13 10:11:11 +00:00
6e02f1d194 Shared lint configs 2019-11-13 10:11:11 +00:00
13ff8221ca Merge branch 'improve-alert' into 'dev'
Move alert to portal

See merge request turris/reforis/foris-js!35
2019-11-12 12:50:29 +00:00
a51ba0630d Move alert to portal 2019-11-12 12:50:29 +00:00
ee5cf07614 Merge branch 'loading-and-errors' into 'dev'
Loading and errors HOCs

See merge request turris/reforis/foris-js!34
2019-11-07 17:21:14 +00:00
8b39bf4193 Loading and errors HOCs 2019-11-07 17:21:14 +00:00
644726a0fc Merge branch '6-api-hooks-fix' into 'dev'
Added missing hook to index.js

Closes #6

See merge request turris/reforis/foris-js!33
2019-11-05 12:03:43 +00:00
654ae6914a Added missing hook to index.js 2019-11-05 13:00:44 +01:00
81dedf59cd Merge branch '6-api-hooks' into 'dev'
Resolve "Discuss and implement proper API methods."

Closes #6

See merge request turris/reforis/foris-js!32
2019-11-05 11:10:50 +00:00
7f8aaea7b8 Resolve "Discuss and implement proper API methods." 2019-11-05 11:10:50 +00:00
dfa80e64ec Merge branch 'publish-fix' into 'dev'
Fixed publish script

See merge request turris/reforis/foris-js!31
2019-11-01 11:08:05 +00:00
031b53f03c Fixed publish script 2019-11-01 10:49:45 +01:00
ca23b2d335 Merge branch 'alert-context-fix' into 'dev'
Flat structure of published package

See merge request turris/reforis/foris-js!30
2019-11-01 09:28:28 +00:00
0984c45161 Flat structure of published package 2019-11-01 09:28:28 +00:00
6835bc7a28 Merge branch 'global-alert' into 'dev'
Global alert

See merge request turris/reforis/foris-js!29
2019-10-30 16:06:53 +00:00
0915d477fe Global alert 2019-10-30 16:06:53 +00:00
c114579b7f Merge branch 'dev' into 'master'
Release 1.2.0

See merge request turris/reforis/foris-js!28
2019-10-24 13:52:35 +00:00
22b2bc9c09 Merge branch 'release-1.2.0' into 'dev'
Release 1.2.0

See merge request turris/reforis/foris-js!27

[skip ci]
2019-10-24 11:54:36 +00:00
cab2cfa068 Release 1.2.0 2019-10-24 13:47:25 +02:00
a137a0d4cf Merge branch 'dev' into 'master'
Release 1.1.1

See merge request turris/reforis/foris-js!26
2019-10-24 11:24:57 +00:00
54cf7e3c06 Merge branch 'master' into dev 2019-10-24 10:47:13 +02:00
18eb28f368 Merge branch 'radio-checkbox-whitespace' into 'dev'
Radio checkbox whitespace

See merge request turris/reforis/foris-js!25

[skip ci]
2019-10-24 08:12:39 +00:00
88f3836485 Radio checkbox whitespace 2019-10-24 08:12:39 +00:00
8f88b09e66 Merge branch 'dev' into 'master'
Release 1.1.0

See merge request turris/reforis/foris-js!24
2019-10-22 08:24:10 +00:00
f2aa28f172 Release 1.1.0 2019-10-22 08:24:10 +00:00
a88fbf63e9 Merge branch 'shell-quotes' into 'dev'
Added quotes to shell variables

See merge request turris/reforis/foris-js!23
2019-10-15 08:50:53 +00:00
ff9e8fdeb1 Added quotes to shell variables 2019-10-15 10:10:33 +02:00
8cd4ac8b44 Merge branch 'ws-connection-closed' into 'dev'
Download button

See merge request turris/reforis/foris-js!22
2019-10-11 14:11:14 +00:00
760e6d9243 Download button 2019-10-11 14:11:14 +00:00
2429f4662c Merge branch '5-versioning' into 'dev'
Changed beta versioning procedure

Closes #5

See merge request turris/reforis/foris-js!21
2019-10-11 08:25:06 +00:00
b320e6a860 Changed beta versioning procedure 2019-10-11 10:15:53 +02:00
1e3e9433ec Merge branch 'client-configuration' into 'dev'
Client configuration

See merge request turris/reforis/foris-js!20
2019-10-10 15:25:00 +00:00
e3a795e40d Client configuration 2019-10-10 15:25:00 +00:00
81 changed files with 2970 additions and 841 deletions

View File

@ -1,66 +1,6 @@
const path = require("path");
module.exports = { module.exports = {
"env": { extends: "eslint-config-reforis",
"browser": true, rules: {
"node": true,
"es6": true,
"jest": true
},
"extends": [
"airbnb",
"airbnb/hooks"
],
"globals": {
"_": "readonly",
"babel": "readonly",
"ForisTranslations": "readonly",
"ngettext": "readonly",
"ForisPlugins": "readonly"
},
"parser": "babel-eslint",
"rules": {
"quotes": ["error", "double"],
"indent": ["error", 4],
"react/jsx-indent": ["error", 4],
"react/jsx-indent-props": ["error", 4],
"react/prop-types": "warn",
"react/no-array-index-key": "warn",
"react/button-has-type": "warn",
"import/prefer-default-export": "off", "import/prefer-default-export": "off",
"import/no-unresolved": [
"error",
// Ignore imports used only in tests
{ ignore: ["customTestRender"] }
],
"import/no-cycle": "warn",
"no-console": "error",
"no-use-before-define": ["error", {
functions: false,
classes: true,
variables: true
}],
"no-restricted-syntax": "warn",
// Should be enabled in the future
"camelcase": "off",
"no-param-reassign": "off",
"react/jsx-props-no-spreading": "off",
"react/require-default-props": "off",
"react/default-props-match-prop-types": "off",
"react/forbid-prop-types": "off",
// Permanently disabled
"react/jsx-filename-extension": "off",
"no-plusplus": "off",
"consistent-return": "off",
"radix": "off",
"no-continue": "off",
"react/no-danger": "off",
}, },
"settings": {
"import/resolver": {
"node": {
"paths": ["src"]
}
}
}
}; };

3
.gitignore vendored
View File

@ -4,6 +4,9 @@
logs logs
*.log *.log
# Python
venv/
# NodeJS # NodeJS
## Logs ## Logs
npm-debug.log* npm-debug.log*

View File

@ -6,25 +6,26 @@ stages:
- publish - publish
before_script: before_script:
- apk add make
- npm install - npm install
test: test:
stage: test stage: test
script: script:
- npm test - make test
lint: lint:
stage: test stage: test
script: script:
- npm run lint - make lint
build: build:
stage: build stage: build
script: script:
- npm pack - make pack
artifacts: artifacts:
paths: paths:
- foris-*.tgz - dist/foris-*.tgz
publish_beta: publish_beta:
stage: publish stage: publish
@ -32,7 +33,7 @@ publish_beta:
refs: refs:
- dev - dev
script: script:
- sh scripts/publish.sh beta - make publish-beta
publish_latest: publish_latest:
stage: publish stage: publish
@ -40,4 +41,4 @@ publish_latest:
refs: refs:
- master - master
script: script:
- sh scripts/publish.sh latest - make publish-latest

View File

@ -1,4 +1,8 @@
.PHONY: all install-js watch-js build-js lint-js test-js create-messages update-messages docs clean .PHONY: all install-js watch-js build-js collect-files pack publish-beta publish-latest lint test test-js-update-snapshots create-messages update-messages docs docs-watch clean
DEV_PYTHON=python3.7
VENV_NAME?=venv
VENV_BIN=$(shell pwd)/$(VENV_NAME)/bin
all: all:
@echo "make install-js" @echo "make install-js"
@ -22,6 +26,12 @@ all:
@echo "make clean" @echo "make clean"
@echo " Remove python artifacts and virtualenv." @echo " Remove python artifacts and virtualenv."
venv: $(VENV_NAME)/bin/activate
$(VENV_NAME)/bin/activate:
test -d $(VENV_NAME) || $(DEV_PYTHON) -m virtualenv -p $(DEV_PYTHON) $(VENV_NAME)
$(VENV_BIN)/$(DEV_PYTHON) -m pip install -r requirements.txt
touch $(VENV_NAME)/bin/activate
install-js: package.json install-js: package.json
npm install --save-dev npm install --save-dev
@ -30,16 +40,27 @@ watch-js:
build-js: build-js:
npm run build npm run build
collect-files:
sh scripts/collect_files.sh
pack: collect-files
cd dist && npm pack
publish-beta: collect-files
sh scripts/publish.sh beta
publish-latest: collect-files
sh scripts/publish.sh latest
lint: lint:
npm run lint npm run lint
test: test:
npm test npm test
test-js-update-snapshots:
npm test -- -u
create-messages: create-messages: venv
pybabel extract -F babel.cfg -o ./translations/forisjs.pot . $(VENV_BIN)/pybabel extract -F babel.cfg -o ./translations/forisjs.pot .
update-messages: update-messages: venv
pybabel update -i translations/forisjs.pot -d translations $(VENV_BIN)/pybabel update -i ./translations/forisjs.pot -d ./translations -D forisjs
docs: docs:
npm run-script docs npm run-script docs

View File

@ -6,7 +6,7 @@
Each commit to `dev` branch will result in publishing a new version of library Each commit to `dev` branch will result in publishing a new version of library
tagged `beta`. Versions names are based on commit SHA, e.g. tagged `beta`. Versions names are based on commit SHA, e.g.
`foris@0.1.0-d9073aa4.0`. `foris@0.1.0-beta.d9073aa4`.
### Preparing a release ### Preparing a release

View File

@ -14,4 +14,12 @@ module.exports = {
}, },
}], }],
], ],
env: {
development: {
ignore: ["**/__tests__/**", "**/__mocks__/**"],
},
test: {
ignore: [],
},
},
}; };

119
package-lock.json generated
View File

@ -1,6 +1,6 @@
{ {
"name": "foris", "name": "foris",
"version": "1.0.0", "version": "1.4.0",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
@ -3001,9 +3001,9 @@
} }
}, },
"confusing-browser-globals": { "confusing-browser-globals": {
"version": "1.0.8", "version": "1.0.9",
"resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.8.tgz", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz",
"integrity": "sha512-lI7asCibVJ6Qd3FGU7mu4sfG4try4LX3+GVS+Gv8UlrEf2AeW57piecapnog2UHZSbcX/P/1UDWVaTsblowlZg==", "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==",
"dev": true "dev": true
}, },
"connect-history-api-fallback": { "connect-history-api-fallback": {
@ -4098,6 +4098,20 @@
"object.entries": "^1.1.0" "object.entries": "^1.1.0"
} }
}, },
"eslint-config-reforis": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/eslint-config-reforis/-/eslint-config-reforis-1.0.0.tgz",
"integrity": "sha512-c0IgYlGfFMfhXmGilDVgkFIcUU34/i6wUiOzdRmg0CRi2Ko5LgmW/jRT5vdiXlFKYOk5WK1UWFbC19KBdGQEig==",
"dev": true,
"requires": {
"babel-eslint": "^9.0.0",
"eslint-config-airbnb": "^18.0.1",
"eslint-plugin-import": "^2.18.2",
"eslint-plugin-jsx-a11y": "^6.2.3",
"eslint-plugin-react": "^7.14.3",
"eslint-plugin-react-hooks": "^1.7.0"
}
},
"eslint-import-resolver-node": { "eslint-import-resolver-node": {
"version": "0.3.2", "version": "0.3.2",
"resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz",
@ -4356,20 +4370,20 @@
} }
}, },
"eslint-plugin-react": { "eslint-plugin-react": {
"version": "7.14.3", "version": "7.16.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.16.0.tgz",
"integrity": "sha512-EzdyyBWC4Uz2hPYBiEJrKCUi2Fn+BJ9B/pJQcjw5X+x/H2Nm59S4MJIvL4O5NEE0+WbnQwEBxWY03oUk+Bc3FA==", "integrity": "sha512-GacBAATewhhptbK3/vTP09CbFrgUJmBSaaRcWdbQLFvUZy9yVcQxigBNHGPU/KE2AyHpzj3AWXpxoMTsIDiHug==",
"dev": true, "dev": true,
"requires": { "requires": {
"array-includes": "^3.0.3", "array-includes": "^3.0.3",
"doctrine": "^2.1.0", "doctrine": "^2.1.0",
"has": "^1.0.3", "has": "^1.0.3",
"jsx-ast-utils": "^2.1.0", "jsx-ast-utils": "^2.2.1",
"object.entries": "^1.1.0", "object.entries": "^1.1.0",
"object.fromentries": "^2.0.0", "object.fromentries": "^2.0.0",
"object.values": "^1.1.0", "object.values": "^1.1.0",
"prop-types": "^15.7.2", "prop-types": "^15.7.2",
"resolve": "^1.10.1" "resolve": "^1.12.0"
}, },
"dependencies": { "dependencies": {
"doctrine": { "doctrine": {
@ -5933,9 +5947,9 @@
"dev": true "dev": true
}, },
"handlebars": { "handlebars": {
"version": "4.3.1", "version": "4.5.3",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.3.1.tgz", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz",
"integrity": "sha512-c0HoNHzDiHpBt4Kqe99N8tdLPKAnGCQ73gYMPWtAYM4PwGnf7xl8PBUHJqh9ijlzt2uQKaSRxbXRt+rZ7M2/kA==", "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==",
"dev": true, "dev": true,
"requires": { "requires": {
"neo-async": "^2.6.0", "neo-async": "^2.6.0",
@ -6255,6 +6269,7 @@
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/immutability-helper/-/immutability-helper-3.0.1.tgz", "resolved": "https://registry.npmjs.org/immutability-helper/-/immutability-helper-3.0.1.tgz",
"integrity": "sha512-U92ROQQt7XkIwrdqCByUI118TQM1hXdKnRQpvKeA0HRyGSnJipu9IWHe4UD8zCN00O8UnQjQzPCgZ1CC3yBzHA==", "integrity": "sha512-U92ROQQt7XkIwrdqCByUI118TQM1hXdKnRQpvKeA0HRyGSnJipu9IWHe4UD8zCN00O8UnQjQzPCgZ1CC3yBzHA==",
"dev": true,
"requires": { "requires": {
"invariant": "^2.2.4" "invariant": "^2.2.4"
} }
@ -6388,6 +6403,7 @@
"version": "2.2.4", "version": "2.2.4",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
"integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
"dev": true,
"requires": { "requires": {
"loose-envify": "^1.0.0" "loose-envify": "^1.0.0"
} }
@ -7546,9 +7562,9 @@
} }
}, },
"jsx-ast-utils": { "jsx-ast-utils": {
"version": "2.2.1", "version": "2.2.3",
"resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz",
"integrity": "sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ==", "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==",
"dev": true, "dev": true,
"requires": { "requires": {
"array-includes": "^3.0.3", "array-includes": "^3.0.3",
@ -8345,6 +8361,12 @@
} }
} }
}, },
"object-inspect": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
"integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
"dev": true
},
"object-is": { "object-is": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz",
@ -8391,15 +8413,35 @@
} }
}, },
"object.fromentries": { "object.fromentries": {
"version": "2.0.0", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.0.tgz", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.1.tgz",
"integrity": "sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA==", "integrity": "sha512-PUQv8Hbg3j2QX0IQYv3iAGCbGcu4yY4KQ92/dhA4sFSixBmSmp13UpDLs6jGK8rBtbmhNNIK99LD2k293jpiGA==",
"dev": true, "dev": true,
"requires": { "requires": {
"define-properties": "^1.1.2", "define-properties": "^1.1.3",
"es-abstract": "^1.11.0", "es-abstract": "^1.15.0",
"function-bind": "^1.1.1", "function-bind": "^1.1.1",
"has": "^1.0.1" "has": "^1.0.3"
},
"dependencies": {
"es-abstract": {
"version": "1.16.0",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz",
"integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==",
"dev": true,
"requires": {
"es-to-primitive": "^1.2.0",
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.0",
"is-callable": "^1.1.4",
"is-regex": "^1.0.4",
"object-inspect": "^1.6.0",
"object-keys": "^1.1.1",
"string.prototype.trimleft": "^2.1.0",
"string.prototype.trimright": "^2.1.0"
}
}
} }
}, },
"object.getownpropertydescriptors": { "object.getownpropertydescriptors": {
@ -11163,6 +11205,26 @@
"strip-ansi": "^4.0.0" "strip-ansi": "^4.0.0"
} }
}, },
"string.prototype.trimleft": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz",
"integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==",
"dev": true,
"requires": {
"define-properties": "^1.1.3",
"function-bind": "^1.1.1"
}
},
"string.prototype.trimright": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz",
"integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==",
"dev": true,
"requires": {
"define-properties": "^1.1.3",
"function-bind": "^1.1.1"
}
},
"string_decoder": { "string_decoder": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
@ -11722,16 +11784,23 @@
"integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw==" "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw=="
}, },
"uglify-js": { "uglify-js": {
"version": "3.6.0", "version": "3.7.0",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.0.tgz",
"integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", "integrity": "sha512-PC/ee458NEMITe1OufAjal65i6lB58R1HWMRcxwvdz1UopW0DYqlRL3xdu3IcTvTXsB02CRHykidkTRL+A3hQA==",
"dev": true, "dev": true,
"optional": true, "optional": true,
"requires": { "requires": {
"commander": "~2.20.0", "commander": "~2.20.3",
"source-map": "~0.6.1" "source-map": "~0.6.1"
}, },
"dependencies": { "dependencies": {
"commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true,
"optional": true
},
"source-map": { "source-map": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",

View File

@ -1,6 +1,6 @@
{ {
"name": "foris", "name": "foris",
"version": "1.0.0", "version": "1.4.0",
"description": "Set of components and utils for Foris and its plugins.", "description": "Set of components and utils for Foris and its plugins.",
"author": "CZ.NIC, z.s.p.o.", "author": "CZ.NIC, z.s.p.o.",
"repository": { "repository": {
@ -12,10 +12,9 @@
"reforis" "reforis"
], ],
"license": "GPL-3.0", "license": "GPL-3.0",
"main": "./dist/index.js", "main": "index.js",
"dependencies": { "dependencies": {
"axios": "^0.19.0", "axios": "^0.19.0",
"immutability-helper": "^3.0.0",
"jest-transform-css": "^2.0.0", "jest-transform-css": "^2.0.0",
"moment": "^2.24.0", "moment": "^2.24.0",
"moment-timezone": "^0.5.25", "moment-timezone": "^0.5.25",
@ -25,8 +24,9 @@
"react-uid": "^2.2.0" "react-uid": "^2.2.0"
}, },
"peerDependencies": { "peerDependencies": {
"react": "^16.9.0", "immutability-helper": "3.0.1",
"react-dom": "^16.9.0" "react": "16.9.0",
"react-dom": "16.9.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/cli": "^7.4.4", "@babel/cli": "^7.4.4",
@ -38,7 +38,6 @@
"@babel/preset-react": "^7.0.0", "@babel/preset-react": "^7.0.0",
"@fortawesome/fontawesome-free": "^5.11.2", "@fortawesome/fontawesome-free": "^5.11.2",
"@testing-library/react": "^8.0.9", "@testing-library/react": "^8.0.9",
"babel-eslint": "^9.0.0",
"babel-jest": "^24.8.0", "babel-jest": "^24.8.0",
"babel-loader": "^8.0.6", "babel-loader": "^8.0.6",
"babel-plugin-module-resolver": "^3.2.0", "babel-plugin-module-resolver": "^3.2.0",
@ -48,37 +47,28 @@
"copy-webpack-plugin": "^5.0.4", "copy-webpack-plugin": "^5.0.4",
"css-loader": "^3.2.0", "css-loader": "^3.2.0",
"eslint": "^6.1.0", "eslint": "^6.1.0",
"eslint-config-airbnb": "^18.0.1", "eslint-config-reforis": "^1.0.0",
"eslint-plugin-import": "^2.18.2",
"eslint-plugin-jsx-a11y": "^6.2.3",
"eslint-plugin-react": "^7.14.3",
"eslint-plugin-react-hooks": "^1.7.0",
"file-loader": "^4.2.0", "file-loader": "^4.2.0",
"immutability-helper": "3.0.1",
"jest": "^24.8.0", "jest": "^24.8.0",
"jest-mock-axios": "^3.0.0", "jest-mock-axios": "^3.0.0",
"moment": "^2.24.0", "moment": "^2.24.0",
"moment-timezone": "^0.5.25", "moment-timezone": "^0.5.25",
"react": "^16.9.0", "react": "16.9.0",
"react-dom": "^16.9.0", "react-dom": "16.9.0",
"react-styleguidist": "^9.1.16", "react-styleguidist": "^9.1.16",
"snapshot-diff": "^0.5.1", "snapshot-diff": "^0.5.1",
"style-loader": "^1.0.0", "style-loader": "^1.0.0",
"webpack": "^4.41.0" "webpack": "^4.41.0"
}, },
"scripts": { "scripts": {
"build": "rm -rf dist; babel src --out-dir dist --ignore '**/__tests__' --source-maps inline --copy-files", "build": "rm -rf dist; babel src --out-dir dist --source-maps inline --copy-files",
"build:watch": "babel src --verbose --watch --out-dir dist --ignore '**/__tests__' --source-maps inline --copy-files", "build:watch": "babel src --verbose --watch --out-dir dist --source-maps inline --copy-files",
"prepare": "rm -rf ./dist && npm run build",
"lint": "eslint src", "lint": "eslint src",
"test": "jest", "test": "jest",
"test:watch": "jest --watch", "test:watch": "jest --watch",
"test:coverage": "jest --coverage --colors", "test:coverage": "jest --coverage --colors",
"test:update-snapshots": "jest -u",
"docs": "npx styleguidist build ", "docs": "npx styleguidist build ",
"docs:watch": "styleguidist server" "docs:watch": "styleguidist server"
}, }
"files": [
"dist/**",
"translations"
]
} }

1
requirements.txt Normal file
View File

@ -0,0 +1 @@
Babel

9
scripts/collect_files.sh Normal file
View File

@ -0,0 +1,9 @@
#!/bin/sh
# Collect files
npm run build
cp package.json dist
cp -rf translations dist
# Remove unwanted files
rm -rf dist/**/__tests__
rm -rf dist/__mocks__

View File

@ -5,12 +5,14 @@ then
echo "\$NPM_TOKEN is not set" echo "\$NPM_TOKEN is not set"
exit 1 exit 1
else else
# Need to replace "_" with "_" as GitLab CI won't accept secret vars with "-" cd dist
echo "//registry.npmjs.org/:_authToken=$(echo $NPM_TOKEN | tr _ -)" > .npmrc # Need to replace "_" with "-" as GitLab CI won't accept secret vars with "-"
echo "//registry.npmjs.org/:_authToken=$(echo "$NPM_TOKEN" | tr _ -)" > .npmrc
echo "unsafe-perm = true" >> ~/.npmrc echo "unsafe-perm = true" >> ~/.npmrc
if test "$1" = "beta" if test "$1" = "beta"
then then
npm version prerelease --preid=$CI_COMMIT_SHORT_SHA --git-tag-version false BETA_VERSION=$(npx -c 'echo "$npm_package_version"')-beta.$CI_COMMIT_SHORT_SHA
npm version "$BETA_VERSION" --git-tag-version false
npm publish --tag beta npm publish --tag beta
elif test "$1" = "latest" elif test "$1" = "latest"
then then

View File

@ -5,12 +5,11 @@
* See /LICENSE for more information. * See /LICENSE for more information.
*/ */
import React, { useState } from "react"; import React, { useState, useContext, useCallback } from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { Alert } from "bootstrap/Alert"; import { Alert, ALERT_TYPES } from "bootstrap/Alert";
import { Portal } from "utils/Portal";
const AlertContext = React.createContext();
AlertContextProvider.propTypes = { AlertContextProvider.propTypes = {
children: PropTypes.oneOfType([ children: PropTypes.oneOfType([
@ -20,16 +19,34 @@ AlertContextProvider.propTypes = {
}; };
function AlertContextProvider({ children }) { function AlertContextProvider({ children }) {
const { AlertContext } = window;
const [alert, setAlert] = useState(null); const [alert, setAlert] = useState(null);
const setAlertWrapper = useCallback((message, type = ALERT_TYPES.DANGER) => {
setAlert({ message, type });
}, [setAlert]);
const dismissAlert = useCallback(() => setAlert(null), [setAlert]);
return ( return (
<> <>
{alert && <Alert type="danger" message={alert} onDismiss={() => setAlert(null)} />} {alert && (
<AlertContext.Provider value={setAlert}> <Portal containerId="alert-container">
<Alert type={alert.type} onDismiss={dismissAlert}>
{alert.message}
</Alert>
</Portal>
)}
<AlertContext.Provider value={[setAlertWrapper, dismissAlert]}>
{ children } { children }
</AlertContext.Provider> </AlertContext.Provider>
</> </>
); );
} }
export { AlertContext, AlertContextProvider }; function useAlert() {
const { AlertContext } = window;
return useContext(AlertContext);
}
export { AlertContextProvider, useAlert };

View File

@ -5,14 +5,21 @@
* See /LICENSE for more information. * See /LICENSE for more information.
*/ */
import React, { useContext } from "react"; import React from "react";
import { render, getByText, queryByText, fireEvent } from "customTestRender"; import { render, getByText, queryByText, fireEvent } from "customTestRender";
import { AlertContext, AlertContextProvider } from "../AlertContext"; import { useAlert, AlertContextProvider } from "../AlertContext";
function AlertTest() { function AlertTest() {
const setAlert = useContext(AlertContext); const [setAlert, dismissAlert] = useAlert();
return <button onClick={() => setAlert("Alert content")}>Set alert</button>; // alert-container serves as an output for Portal which renders Alert
return (
<>
<div id="alert-container" />
<button onClick={() => setAlert("Alert content")}>Set alert</button>
<button onClick={dismissAlert}>Dismiss alert</button>
</>
);
}; };
describe("AlertContext", () => { describe("AlertContext", () => {
@ -36,7 +43,7 @@ describe("AlertContext", () => {
expect(componentContainer).toMatchSnapshot(); expect(componentContainer).toMatchSnapshot();
}); });
it("should dismiss alert", () => { it("should dismiss alert with alert button", () => {
fireEvent.click(getByText(componentContainer, "Set alert")); fireEvent.click(getByText(componentContainer, "Set alert"));
// Alert is present // Alert is present
expect(getByText(componentContainer, "Alert content")).toBeDefined(); expect(getByText(componentContainer, "Alert content")).toBeDefined();
@ -45,4 +52,14 @@ describe("AlertContext", () => {
// Alert is gone // Alert is gone
expect(queryByText(componentContainer, "Alert content")).toBeNull(); expect(queryByText(componentContainer, "Alert content")).toBeNull();
}); });
it("should dismiss alert with external button", () => {
fireEvent.click(getByText(componentContainer, "Set alert"));
// Alert is present
expect(getByText(componentContainer, "Alert content")).toBeDefined();
fireEvent.click(getByText(componentContainer, "Dismiss alert"));
// Alert is gone
expect(queryByText(componentContainer, "Alert content")).toBeNull();
});
}); });

View File

@ -3,26 +3,39 @@
exports[`AlertContext should render alert 1`] = ` exports[`AlertContext should render alert 1`] = `
<div> <div>
<div <div
class="alert alert-dismissible alert-danger" id="alert-container"
> >
<button <div
class="close" class="alert alert-dismissible alert-danger"
type="button"
> >
× <button
</button> class="close"
Alert content type="button"
>
×
</button>
Alert content
</div>
</div> </div>
<button> <button>
Set alert Set alert
</button> </button>
<button>
Dismiss alert
</button>
</div> </div>
`; `;
exports[`AlertContext should render component without alert 1`] = ` exports[`AlertContext should render component without alert 1`] = `
<div> <div>
<div
id="alert-container"
/>
<button> <button>
Set alert Set alert
</button> </button>
<button>
Dismiss alert
</button>
</div> </div>
`; `;

View File

@ -1,41 +0,0 @@
/*
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import { useReducer, useCallback } from "react";
import axios from "axios";
import {
API_ACTIONS, TIMEOUT, HEADERS, APIReducer, getErrorMessage,
} from "./utils";
export function useAPIDelete(url) {
const [state, dispatch] = useReducer(APIReducer, {
isSending: false,
isError: false,
isSuccess: false,
data: null,
});
const requestDelete = useCallback(async () => {
dispatch({ type: API_ACTIONS.INIT });
try {
await axios.delete(url, {
timeout: TIMEOUT,
headers: HEADERS,
});
dispatch({ type: API_ACTIONS.SUCCESS });
} catch (error) {
dispatch({
type: API_ACTIONS.FAILURE,
payload: getErrorMessage(error),
status: error.response.status,
});
}
}, [url]);
return [state, requestDelete];
}

View File

@ -1,65 +0,0 @@
/*
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import { useReducer, useCallback } from "react";
import axios from "axios";
import { ForisURLs } from "forisUrls";
import { API_ACTIONS, TIMEOUT } from "./utils";
const APIGetReducer = (state, action) => {
switch (action.type) {
case API_ACTIONS.INIT:
return {
...state,
isLoading: true,
isError: false,
};
case API_ACTIONS.SUCCESS:
return {
...state,
isLoading: false,
isError: false,
data: action.payload,
};
case API_ACTIONS.FAILURE:
if (action.status === 403) window.location.assign(ForisURLs.login);
return {
...state,
isLoading: false,
isError: true,
data: action.payload,
};
default:
throw new Error();
}
};
export function useAPIGet(url) {
const [state, dispatch] = useReducer(APIGetReducer, {
isLoading: false,
isError: false,
data: null,
});
const get = useCallback(async () => {
dispatch({ type: API_ACTIONS.INIT });
try {
const result = await axios.get(url, {
timeout: TIMEOUT,
});
dispatch({ type: API_ACTIONS.SUCCESS, payload: result.data });
} catch (error) {
dispatch({
type: API_ACTIONS.FAILURE,
payload: error.response.data,
status: error.response.status,
});
}
}, [url]);
return [state, get];
}

114
src/api/hooks.js Normal file
View File

@ -0,0 +1,114 @@
/*
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import {
useCallback, useEffect, useReducer, useState,
} from "react";
import { ForisURLs } from "forisUrls";
import {
API_ACTIONS, API_METHODS, API_STATE, getErrorPayload, HEADERS, TIMEOUT,
} from "./utils";
const DATA_METHODS = ["POST", "PATCH", "PUT"];
function createAPIHook(method) {
return (url, contentType) => {
const [state, dispatch] = useReducer(APIReducer, {
state: API_STATE.INIT,
data: null,
});
const sendRequest = useCallback(async (data) => {
const headers = { ...HEADERS };
if (contentType) {
headers["Content-Type"] = contentType;
}
dispatch({ type: API_ACTIONS.INIT });
try {
const request = API_METHODS[method];
const config = {
timeout: TIMEOUT,
headers,
};
let result;
if (DATA_METHODS.includes(method)) {
result = await request(url, data, config);
} else {
result = await request(url, config);
}
dispatch({
type: API_ACTIONS.SUCCESS,
payload: result.data,
});
} catch (error) {
dispatch({
type: API_ACTIONS.FAILURE,
status: error.response && error.response.status,
payload: getErrorPayload(error),
});
}
}, [url, contentType]);
return [state, sendRequest];
};
}
function APIReducer(state, action) {
switch (action.type) {
case API_ACTIONS.INIT:
return {
...state,
state: API_STATE.SENDING,
};
case API_ACTIONS.SUCCESS:
return {
state: API_STATE.SUCCESS,
data: action.payload,
};
case API_ACTIONS.FAILURE:
if (action.status === 403) {
window.location.assign(ForisURLs.login);
}
return {
state: API_STATE.ERROR,
data: action.payload,
};
default:
throw new Error();
}
}
const useAPIGet = createAPIHook("GET");
const useAPIPost = createAPIHook("POST");
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) { // delay ms
const [state, setState] = useState({ state: API_STATE.INIT });
const [getResponse, get] = useAPIGet(endpoint);
useEffect(() => {
if (getResponse.state !== API_STATE.INIT) {
setState(getResponse);
}
}, [getResponse]);
useEffect(() => {
if (until) {
const interval = setInterval(get, delay);
return () => clearInterval(interval);
}
}, [until, delay, get]);
return [state];
}

View File

@ -1,40 +0,0 @@
/*
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import { useReducer } from "react";
import axios from "axios";
import {
API_ACTIONS, TIMEOUT, HEADERS, APIReducer, getErrorMessage,
} from "./utils";
export function useAPIPatch(url) {
const [state, dispatch] = useReducer(APIReducer, {
isSending: false,
isError: false,
isSuccess: false,
data: null,
});
const patch = async (data) => {
dispatch({ type: API_ACTIONS.INIT });
try {
const result = await axios.patch(url, data, {
timeout: TIMEOUT,
headers: HEADERS,
});
dispatch({ type: API_ACTIONS.SUCCESS, payload: result.data });
} catch (error) {
dispatch({
type: API_ACTIONS.FAILURE,
payload: getErrorMessage(error),
status: error.response.status,
});
}
};
return [state, patch];
}

View File

@ -1,40 +0,0 @@
/*
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import { useReducer } from "react";
import axios from "axios";
import {
API_ACTIONS, TIMEOUT, HEADERS, APIReducer, getErrorMessage,
} from "./utils";
export function useAPIPost(url) {
const [state, dispatch] = useReducer(APIReducer, {
isSending: false,
isError: false,
isSuccess: false,
data: null,
});
const post = async (data) => {
dispatch({ type: API_ACTIONS.INIT });
try {
const result = await axios.post(url, data, {
timeout: TIMEOUT,
headers: HEADERS,
});
dispatch({ type: API_ACTIONS.SUCCESS, payload: result.data });
} catch (error) {
dispatch({
type: API_ACTIONS.FAILURE,
payload: getErrorMessage(error),
status: error.response.status,
});
}
};
return [state, post];
}

View File

@ -5,7 +5,36 @@
* See /LICENSE for more information. * See /LICENSE for more information.
*/ */
import { ForisURLs } from "forisUrls"; import axios from "axios";
export const HEADERS = {
Accept: "application/json",
"Content-Type": "application/json",
"X-CSRFToken": getCookie("_csrf_token"),
};
export const TIMEOUT = 5000;
export const API_ACTIONS = {
INIT: 1,
SUCCESS: 2,
FAILURE: 3,
};
export const API_STATE = {
INIT: "init",
SENDING: "sending",
SUCCESS: "success",
ERROR: "error",
};
export const API_METHODS = {
GET: axios.get,
POST: axios.post,
PATCH: axios.patch,
PUT: axios.put,
DELETE: axios.delete,
};
function getCookie(name) { function getCookie(name) {
let cookieValue = null; let cookieValue = null;
@ -23,55 +52,27 @@ function getCookie(name) {
return cookieValue; return cookieValue;
} }
export const HEADERS = { export function getErrorPayload(error) {
Accept: "application/json", if (error.response) {
"Content-Type": "application/json", if (error.response.status === 403) {
"X-CSRFToken": getCookie("_csrf_token"), return _("The session is expired. Please log in again.");
}; }
return getJSONErrorMessage(error);
export const TIMEOUT = 5000;
export const API_ACTIONS = {
INIT: 1,
SUCCESS: 2,
FAILURE: 3,
};
export function APIReducer(state, action) {
switch (action.type) {
case API_ACTIONS.INIT:
return {
...state,
isSending: true,
isError: false,
isSuccess: false,
};
case API_ACTIONS.SUCCESS:
return {
...state,
isSending: false,
isError: false,
isSuccess: true,
data: action.payload,
};
case API_ACTIONS.FAILURE:
if (action.status === 403) window.location.assign(ForisURLs.login);
return {
...state,
isSending: false,
isError: true,
isSuccess: false,
data: action.payload,
};
default:
throw new Error();
} }
if (error.code === "ECONNABORTED") {
return _("Timeout error occurred.");
}
if (error.request) {
return _("No response received.");
}
/* eslint no-console: "off" */
console.error(error);
return _("An unknown error occurred. Check the console for more info.");
} }
export function getErrorMessage(error) { export function getJSONErrorMessage(error) {
let payload = "An unknown error occurred";
if (error.response.headers["content-type"] === "application/json") { if (error.response.headers["content-type"] === "application/json") {
payload = error.response.data; return error.response.data;
} }
return payload; return _("An unknown API error occurred.");
} }

View File

@ -8,11 +8,20 @@
import React from "react"; import React from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
export const ALERT_TYPES = Object.freeze({
PRIMARY: "primary",
SECONDARY: "secondary",
SUCCESS: "success",
DANGER: "danger",
WARNING: "warning",
INFO: "info",
LIGHT: "light",
DARK: "dark",
});
Alert.propTypes = { Alert.propTypes = {
/** Type of the alert it adds as `alert-${type}` class. */ /** Type of the alert it adds as `alert-${type}` class. */
type: PropTypes.string.isRequired, type: PropTypes.oneOf(Object.values(ALERT_TYPES)),
/** Alert message. */
message: PropTypes.string,
/** Alert content. */ /** Alert content. */
children: PropTypes.oneOfType([ children: PropTypes.oneOfType([
PropTypes.arrayOf(PropTypes.node), PropTypes.arrayOf(PropTypes.node),
@ -22,13 +31,16 @@ Alert.propTypes = {
onDismiss: PropTypes.func, onDismiss: PropTypes.func,
}; };
Alert.defaultProps = {
type: ALERT_TYPES.DANGER,
};
export function Alert({ export function Alert({
type, message, onDismiss, children, type, onDismiss, children,
}) { }) {
return ( return (
<div className={`alert alert-dismissible alert-${type}`}> <div className={`alert alert-dismissible alert-${type}`}>
{onDismiss ? <button type="button" className="close" onClick={onDismiss}>&times;</button> : false} {onDismiss ? <button type="button" className="close" onClick={onDismiss}>&times;</button> : false}
{message}
{children} {children}
</div> </div>
); );

View File

@ -7,7 +7,7 @@
import React from "react"; import React from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { useUID } from "react-uid/dist/es5/index"; import { useUID } from "react-uid";
import { formFieldsSize } from "./constants"; import { formFieldsSize } from "./constants";
@ -32,8 +32,8 @@ export function CheckBox({
}) { }) {
const uid = useUID(); const uid = useUID();
return ( return (
<div className={useDefaultSize ? formFieldsSize : ""} style={{ marginBottom: "1rem" }}> <div className={`form-group ${useDefaultSize ? formFieldsSize : ""}`.trim()}>
<div className="custom-control custom-checkbox" style={{ marginBottom: "0" }}> <div className="custom-control custom-checkbox ">
<input <input
className="custom-control-input" className="custom-control-input"
type="checkbox" type="checkbox"
@ -42,9 +42,11 @@ export function CheckBox({
{...props} {...props}
/> />
<label className="custom-control-label" htmlFor={uid} style={helpText ? { marginBottom: "0" } : null}>{label}</label> <label className="custom-control-label" htmlFor={uid}>
{label}
{helpText && <small className="form-text text-muted">{helpText}</small>}
</label>
</div> </div>
{helpText ? <small className="form-text text-muted">{helpText}</small> : null}
</div> </div>
); );
} }

View File

@ -0,0 +1,21 @@
/*
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import React from "react";
import PropTypes from "prop-types";
DownloadButton.propTypes = {
href: PropTypes.string.isRequired,
children: PropTypes.oneOfType([
PropTypes.arrayOf(PropTypes.node),
PropTypes.node,
]),
};
export function DownloadButton({ href, children }) {
return <a href={href} className="btn btn-primary" download>{children}</a>;
}

View File

@ -0,0 +1,7 @@
Hyperlink with apperance of a button.
It has `download` attribute, which prevents closing WebSocket connection on Firefox. See [related issue](https://bugzilla.mozilla.org/show_bug.cgi?id=858538) for more details.
```js
<DownloadButton href="example.zip">Download</DownloadButton>
```

View File

@ -12,7 +12,6 @@ import { Input } from "./Input";
export const EmailInput = ({ ...props }) => <Input type="email" {...props} />; export const EmailInput = ({ ...props }) => <Input type="email" {...props} />;
EmailInput.propTypes = { EmailInput.propTypes = {
/** Field label. */ /** Field label. */
label: PropTypes.string.isRequired, label: PropTypes.string.isRequired,

View File

@ -0,0 +1,34 @@
/*
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import React from "react";
import PropTypes from "prop-types";
import { Input } from "./Input";
FileInput.propTypes = {
/** Field label. */
label: PropTypes.string.isRequired,
/** Error message. */
error: PropTypes.string,
/** Help text message. */
helpText: PropTypes.string,
/** Email value. */
value: PropTypes.string,
};
export function FileInput({ ...props }) {
return (
<Input
type="file"
className="custom-file-input"
labelClassName="custom-file-label"
groupClassName="custom-file"
{...props}
/>
);
}

View File

@ -0,0 +1,15 @@
Bootstrap component for file input. Includes label and has predefined sizes and structure for using in foris forms.
All additional `props` are passed to the `<input type="file">` HTML component.
```js
import {useState} from 'react';
const [files, setFiles] = useState([]);
<FileInput
files={files}
label="Some file"
helpText="Will be uploaded"
onChange={event =>setFiles(event.target.files)}
/>
```

View File

@ -6,7 +6,7 @@
*/ */
import React from "react"; import React from "react";
import { useUID } from "react-uid/dist/es5/index"; import { useUID } from "react-uid";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { formFieldsSize } from "./constants"; import { formFieldsSize } from "./constants";
@ -21,31 +21,31 @@ Input.propTypes = {
PropTypes.arrayOf(PropTypes.node), PropTypes.arrayOf(PropTypes.node),
PropTypes.node, PropTypes.node,
]), ]),
labelClassName: PropTypes.string,
groupClassName: PropTypes.string,
}; };
/** Base bootstrap input component. */ /** Base bootstrap input component. */
export function Input({ export function Input({
type, label, helpText, error, className, children, ...props type, label, helpText, error, className, children, labelClassName, groupClassName, ...props
}) { }) {
const uid = useUID(); const uid = useUID();
const inputClassName = `form-control ${className || ""} ${(error ? "is-invalid" : "")}`.trim(); const inputClassName = `form-control ${className || ""} ${(error ? "is-invalid" : "")}`.trim();
return ( return (
<div className={formFieldsSize}> <div className={`form-group ${formFieldsSize}`}>
<div className="form-group"> <label className={labelClassName} htmlFor={uid}>{label}</label>
<label htmlFor={uid}>{label}</label> <div className={`input-group ${groupClassName || ""}`.trim()}>
<div className="input-group"> <input
<input className={inputClassName}
className={inputClassName} type={type}
type={type} id={uid}
id={uid}
{...props} {...props}
/> />
{children} {children}
</div>
{error ? <div className="invalid-feedback">{error}</div> : null}
{helpText ? <small className="form-text text-muted">{helpText}</small> : null}
</div> </div>
{error ? <div className="invalid-feedback">{error}</div> : null}
{helpText ? <small className="form-text text-muted">{helpText}</small> : null}
</div> </div>
); );
} }

View File

@ -37,11 +37,10 @@ export function Modal({ shown, setShown, children }) {
}; };
}, [setShown]); }, [setShown]);
return ( return (
<Portal containerId="modal-container"> <Portal containerId="modal-container">
<div className={`modal fade ${shown ? "show" : ""}`} role="dialog"> <div className={`modal fade ${shown ? "show" : ""}`} role="dialog">
<div ref={dialogRef} className="modal-dialog" role="document"> <div ref={dialogRef} className="modal-dialog modal-dialog-centered" role="document">
<div className="modal-content"> <div className="modal-content">
{children} {children}
</div> </div>

View File

@ -7,11 +7,10 @@
import React from "react"; import React from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { useUID } from "react-uid/dist/es5/index"; import { useUID } from "react-uid";
import { formFieldsSize } from "./constants"; import { formFieldsSize } from "./constants";
RadioSet.propTypes = { RadioSet.propTypes = {
/** Name attribute of the input HTML tag. */ /** Name attribute of the input HTML tag. */
name: PropTypes.string.isRequired, name: PropTypes.string.isRequired,
@ -52,16 +51,10 @@ export function RadioSet({
}); });
return ( return (
<div className={`form-group ${formFieldsSize}`} style={{ marginBottom: "1rem" }}> <div className={`form-group ${formFieldsSize}`}>
{label {label && <label htmlFor={uid} className="d-block">{label}</label>}
? (
<label className="col-12" htmlFor={uid} style={{ paddingLeft: "0" }}>
{label}
</label>
)
: null}
{radios} {radios}
{helpText ? <small className="form-text text-muted">{helpText}</small> : null} {helpText && <small className="form-text text-muted">{helpText}</small>}
</div> </div>
); );
} }
@ -77,7 +70,7 @@ function Radio({
}) { }) {
return ( return (
<> <>
<div className="custom-control custom-radio custom-control-inline"> <div className={`custom-control custom-radio ${!helpText ? "custom-control-inline" : ""}`.trim()}>
<input <input
id={id} id={id}
className="custom-control-input" className="custom-control-input"
@ -86,8 +79,8 @@ function Radio({
{...props} {...props}
/> />
<label className="custom-control-label" htmlFor={id}>{label}</label> <label className="custom-control-label" htmlFor={id}>{label}</label>
{helpText && <small className="form-text text-muted mt-0 mb-3">{helpText}</small>}
</div> </div>
{helpText ? <small className="form-text text-muted">{helpText}</small> : null}
</> </>
); );
} }

View File

@ -2,6 +2,8 @@ Set of radio Bootstrap component input with label and predefined sizes and struc
All additional `props` are passed to the `<input type="number">` HTML component. All additional `props` are passed to the `<input type="number">` HTML component.
Unless `helpText` is set for one of the options they are displayed inline.
```js ```js
import {useState} from 'react'; import {useState} from 'react';
const CHOICES=[ const CHOICES=[

View File

@ -7,8 +7,7 @@
import React from "react"; import React from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { useUID } from "react-uid/dist/es5/index"; import { useUID } from "react-uid";
Select.propTypes = { Select.propTypes = {
/** Select field Label. */ /** Select field Label. */

View File

@ -24,18 +24,18 @@ Spinner.defaultProps = {
}; };
export function Spinner({ export function Spinner({
fullScreen, children, className, ...props fullScreen, children, className,
}) { }) {
if (!fullScreen) { if (!fullScreen) {
return ( return (
<div className={`spinner-wrapper ${className || ""}`} {...props}> <div className={`spinner-wrapper ${className || "my-3 text-center"}`}>
<SpinnerElement>{children}</SpinnerElement> <SpinnerElement>{children}</SpinnerElement>
</div> </div>
); );
} }
return ( return (
<div className="spinner-fs-wrapper" {...props}> <div className="spinner-fs-wrapper">
<div className="spinner-fs-background"> <div className="spinner-fs-background">
<SpinnerElement>{children}</SpinnerElement> <SpinnerElement>{children}</SpinnerElement>
</div> </div>

View File

@ -10,10 +10,8 @@ import PropTypes from "prop-types";
import { Input } from "./Input"; import { Input } from "./Input";
export const TextInput = ({ ...props }) => <Input type="text" {...props} />; export const TextInput = ({ ...props }) => <Input type="text" {...props} />;
TextInput.propTypes = { TextInput.propTypes = {
/** Field label. */ /** Field label. */
label: PropTypes.string.isRequired, label: PropTypes.string.isRequired,

View File

@ -0,0 +1,19 @@
/*
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import React from "react";
import { render } from "customTestRender";
import { DownloadButton } from "../DownloadButton";
describe("<DownloadButton />", () => {
it("should have download attribute", () => {
const { container } = render(<DownloadButton href="http://example.com">Test Button</DownloadButton>);
expect(container.firstChild.getAttribute("download")).not.toBeNull();
});
});

View File

@ -2,12 +2,10 @@
exports[`<Checkbox/> Render checkbox 1`] = ` exports[`<Checkbox/> Render checkbox 1`] = `
<div <div
class="col-sm-12 offset-lg-1 col-lg-10" class="form-group col-sm-12 offset-lg-1 col-lg-10"
style="margin-bottom: 1rem;"
> >
<div <div
class="custom-control custom-checkbox" class="custom-control custom-checkbox "
style="margin-bottom: 0px;"
> >
<input <input
checked="" checked=""
@ -18,27 +16,24 @@ exports[`<Checkbox/> Render checkbox 1`] = `
<label <label
class="custom-control-label" class="custom-control-label"
for="1" for="1"
style="margin-bottom: 0px;"
> >
Test label Test label
<small
class="form-text text-muted"
>
Some help text
</small>
</label> </label>
</div> </div>
<small
class="form-text text-muted"
>
Some help text
</small>
</div> </div>
`; `;
exports[`<Checkbox/> Render uncheked checkbox 1`] = ` exports[`<Checkbox/> Render uncheked checkbox 1`] = `
<div <div
class="col-sm-12 offset-lg-1 col-lg-10" class="form-group col-sm-12 offset-lg-1 col-lg-10"
style="margin-bottom: 1rem;"
> >
<div <div
class="custom-control custom-checkbox" class="custom-control custom-checkbox "
style="margin-bottom: 0px;"
> >
<input <input
class="custom-control-input" class="custom-control-input"
@ -48,15 +43,14 @@ exports[`<Checkbox/> Render uncheked checkbox 1`] = `
<label <label
class="custom-control-label" class="custom-control-label"
for="1" for="1"
style="margin-bottom: 0px;"
> >
Test label Test label
<small
class="form-text text-muted"
>
Some help text
</small>
</label> </label>
</div> </div>
<small
class="form-text text-muted"
>
Some help text
</small>
</div> </div>
`; `;

View File

@ -2,53 +2,49 @@
exports[`<NumberInput/> Render number input 1`] = ` exports[`<NumberInput/> Render number input 1`] = `
<div <div
class="col-sm-12 offset-lg-1 col-lg-10" class="form-group col-sm-12 offset-lg-1 col-lg-10"
> >
<div <label
class="form-group" for="1"
> >
<label Test label
for="1" </label>
> <div
Test label class="input-group"
</label> >
<input
class="form-control"
id="1"
type="number"
value="1"
/>
<div <div
class="input-group" class="input-group-append"
> >
<input <button
class="form-control" aria-label="Increase"
id="1" class="btn btn-outline-secondary"
type="number" type="button"
value="1"
/>
<div
class="input-group-append"
> >
<button <i
aria-label="Increase" class="fas fa-plus"
class="btn btn-outline-secondary" />
type="button" </button>
> <button
<i aria-label="Decrease"
class="fas fa-plus" class="btn btn-outline-secondary"
/> type="button"
</button> >
<button <i
aria-label="Decrease" class="fas fa-minus"
class="btn btn-outline-secondary" />
type="button" </button>
>
<i
class="fas fa-minus"
/>
</button>
</div>
</div> </div>
<small
class="form-text text-muted"
>
Some help text
</small>
</div> </div>
<small
class="form-text text-muted"
>
Some help text
</small>
</div> </div>
`; `;

View File

@ -2,32 +2,28 @@
exports[`<PasswordInput/> Render password input 1`] = ` exports[`<PasswordInput/> Render password input 1`] = `
<div <div
class="col-sm-12 offset-lg-1 col-lg-10" class="form-group col-sm-12 offset-lg-1 col-lg-10"
> >
<div <label
class="form-group" for="1"
> >
<label Test label
for="1" </label>
> <div
Test label class="input-group"
</label> >
<div <input
class="input-group" autocomplete="new-password"
> class="form-control"
<input id="1"
autocomplete="new-password" type="password"
class="form-control" value="Some password"
id="1" />
type="password"
value="Some password"
/>
</div>
<small
class="form-text text-muted"
>
Some help text
</small>
</div> </div>
<small
class="form-text text-muted"
>
Some help text
</small>
</div> </div>
`; `;

View File

@ -3,12 +3,10 @@
exports[`<RadioSet/> Render radio set 1`] = ` exports[`<RadioSet/> Render radio set 1`] = `
<div <div
class="form-group col-sm-12 offset-lg-1 col-lg-10" class="form-group col-sm-12 offset-lg-1 col-lg-10"
style="margin-bottom: 1rem;"
> >
<label <label
class="col-12" class="d-block"
for="1" for="1"
style="padding-left: 0px;"
> >
Radios set label Radios set label
</label> </label>

View File

@ -2,31 +2,27 @@
exports[`<TextInput/> Render text input 1`] = ` exports[`<TextInput/> Render text input 1`] = `
<div <div
class="col-sm-12 offset-lg-1 col-lg-10" class="form-group col-sm-12 offset-lg-1 col-lg-10"
> >
<div <label
class="form-group" for="1"
> >
<label Test label
for="1" </label>
> <div
Test label class="input-group"
</label> >
<div <input
class="input-group" class="form-control"
> id="1"
<input type="text"
class="form-control" value="Some text"
id="1" />
type="text"
value="Some text"
/>
</div>
<small
class="form-text text-muted"
>
Some help text
</small>
</div> </div>
<small
class="form-text text-muted"
>
Some help text
</small>
</div> </div>
`; `;

View File

@ -0,0 +1,77 @@
/*
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import React, { useState, useEffect } from "react";
import PropTypes from "prop-types";
import { useAPIPost } from "api/hooks";
import { API_STATE } from "api/utils";
import { ForisURLs } from "forisUrls";
import { Button } from "bootstrap/Button";
import {
Modal, ModalHeader, ModalBody, ModalFooter,
} from "bootstrap/Modal";
import { useAlert } from "alertContext/AlertContext";
RebootButton.propTypes = {
forisFormSize: PropTypes.bool,
};
export function RebootButton(props) {
const [triggered, setTriggered] = useState(false);
const [modalShown, setModalShown] = useState(false);
const [triggerRebootStatus, triggerReboot] = useAPIPost(ForisURLs.reboot);
const [setAlert] = useAlert();
useEffect(() => {
if (triggerRebootStatus.state === API_STATE.ERROR) {
setAlert(_("Reboot request failed."));
}
});
function rebootHandler() {
setTriggered(true);
triggerReboot();
setModalShown(false);
}
return (
<>
<RebootModal shown={modalShown} setShown={setModalShown} onReboot={rebootHandler} />
<Button
className="btn-danger"
loading={triggered}
disabled={triggered}
onClick={() => setModalShown(true)}
{...props}
>
{_("Reboot")}
</Button>
</>
);
}
RebootModal.propTypes = {
shown: PropTypes.bool.isRequired,
setShown: PropTypes.func.isRequired,
onReboot: PropTypes.func.isRequired,
};
function RebootModal({ shown, setShown, onReboot }) {
return (
<Modal shown={shown} setShown={setShown}>
<ModalHeader setShown={setShown} title={_("Reboot confirmation")} />
<ModalBody><p>{_("Are you sure you want to restart the router?")}</p></ModalBody>
<ModalFooter>
<Button onClick={() => setShown(false)}>{_("Cancel")}</Button>
<Button className="btn-danger" onClick={onReboot}>{_("Confirm reboot")}</Button>
</ModalFooter>
</Modal>
);
}

View File

@ -0,0 +1,55 @@
/*
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import React from "react";
import { fireEvent, getByText, queryByText, render, wait } from "customTestRender";
import mockAxios from "jest-mock-axios";
import { mockJSONError } from "testUtils/network";
import { mockSetAlert } from "testUtils/alertContextMock";
import { RebootButton } from "../RebootButton";
describe("<RebootButton/>", () => {
let componentContainer;
beforeEach(() => {
const { container } = render(<>
<div id="modal-container"/>
<RebootButton/>
</>);
componentContainer = container;
});
it("Render.", () => {
expect(componentContainer)
.toMatchSnapshot();
});
it("Render modal.", () => {
expect(queryByText(componentContainer, "Confirm reboot"))
.toBeNull();
fireEvent.click(getByText(componentContainer, "Reboot"));
expect(componentContainer)
.toMatchSnapshot();
});
it("Confirm reboot.", () => {
fireEvent.click(getByText(componentContainer, "Reboot"));
fireEvent.click(getByText(componentContainer, "Confirm reboot"));
expect(mockAxios.post)
.toHaveBeenCalledWith("/reforis/api/reboot", undefined, expect.anything());
});
it("Hold error.", async () => {
fireEvent.click(getByText(componentContainer, "Reboot"));
fireEvent.click(getByText(componentContainer, "Confirm reboot"));
mockJSONError();
await wait(() => expect(mockSetAlert)
.toBeCalledWith("Reboot request failed."));
});
});

View File

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

View File

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

View File

@ -5,16 +5,19 @@
* See /LICENSE for more information. * See /LICENSE for more information.
*/ */
import React, { useEffect, useState } from "react"; import React, { useEffect } from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { Spinner } from "bootstrap/Spinner"; import { Spinner } from "bootstrap/Spinner";
import { useAPIPost } from "api/post"; import { useAPIPost } from "api/hooks";
import { Prompt } from "react-router"; import { Prompt } from "react-router";
import { API_STATE } from "api/utils";
import { ErrorMessage } from "utils/ErrorMessage";
import { useAlert } from "alertContext/AlertContext";
import { ALERT_TYPES } from "bootstrap/Alert";
import { useForisModule, useForm } from "../hooks"; import { useForisModule, useForm } from "../hooks";
import { STATES as SUBMIT_BUTTON_STATES, SubmitButton } from "./SubmitButton"; import { STATES as SUBMIT_BUTTON_STATES, SubmitButton } from "./SubmitButton";
import { FailAlert, SuccessAlert } from "./alerts";
ForisForm.propTypes = { ForisForm.propTypes = {
/** WebSocket object see `scr/common/WebSockets.js`. */ /** WebSocket object see `scr/common/WebSockets.js`. */
@ -69,22 +72,34 @@ export function ForisForm({
children, children,
}) { }) {
const [formState, onFormChangeHandler, resetFormData] = useForm(validator, prepData); const [formState, onFormChangeHandler, resetFormData] = useForm(validator, prepData);
const [setAlert] = useAlert();
const [forisModuleState] = useForisModule(ws, forisConfig); const [forisModuleState] = useForisModule(ws, forisConfig);
useEffect(() => { useEffect(() => {
if (forisModuleState.data) { if (forisModuleState.state === API_STATE.SUCCESS) {
resetFormData(forisModuleState.data); resetFormData(forisModuleState.data);
} }
}, [forisModuleState.data, resetFormData, prepData]); }, [forisModuleState, resetFormData, prepData]);
const [postState, post] = useAPIPost(forisConfig.endpoint); const [postState, post] = useAPIPost(forisConfig.endpoint);
useEffect(() => { useEffect(() => {
if (postState.isSuccess) postCallback(); if (postState.state === API_STATE.SUCCESS) {
}, [postCallback, postState.isSuccess]); postCallback();
setAlert(_("Settings saved successfully"), ALERT_TYPES.SUCCESS);
} else if (postState.state === API_STATE.ERROR) {
setAlert(postState.data);
}
}, [postCallback, postState.state, postState.data, setAlert]);
if (forisModuleState.state === API_STATE.ERROR) {
return <ErrorMessage />;
}
if (!formState.data) {
return <Spinner />;
}
function onSubmitHandler(e) { function onSubmitHandler(event) {
e.preventDefault(); event.preventDefault();
resetFormData(); resetFormData();
const copiedFormData = JSON.parse(JSON.stringify(formState.data)); const copiedFormData = JSON.parse(JSON.stringify(formState.data));
const preparedData = prepDataToSubmit(copiedFormData); const preparedData = prepDataToSubmit(copiedFormData);
@ -92,16 +107,18 @@ export function ForisForm({
} }
function getSubmitButtonState() { function getSubmitButtonState() {
if (postState.isSending) return SUBMIT_BUTTON_STATES.SAVING; if (postState.state === API_STATE.SENDING) {
if (forisModuleState.isLoading) return SUBMIT_BUTTON_STATES.LOAD; return SUBMIT_BUTTON_STATES.SAVING;
}
if (forisModuleState.state === API_STATE.SENDING) {
return SUBMIT_BUTTON_STATES.LOAD;
}
return SUBMIT_BUTTON_STATES.READY; return SUBMIT_BUTTON_STATES.READY;
} }
const [alertIsDismissed, setAlertIsDismissed] = useState(false); const formIsDisabled = (disabled
|| forisModuleState.state === API_STATE.SENDING
if (!formState.data) return <Spinner className="row justify-content-center" />; || postState.state === API_STATE.SENDING);
const formIsDisabled = disabled || forisModuleState.isLoading || postState.isSending;
const submitButtonIsDisabled = disabled || !!formState.errors; const submitButtonIsDisabled = disabled || !!formState.errors;
const childrenWithFormProps = React.Children.map( const childrenWithFormProps = React.Children.map(
@ -123,19 +140,9 @@ export function ForisForm({
return _("Changes you made may not be saved. Are you sure you want to leave?"); return _("Changes you made may not be saved. Are you sure you want to leave?");
} }
let alert = null;
if (!alertIsDismissed) {
if (postState.isSuccess) {
alert = <SuccessAlert onDismiss={() => setAlertIsDismissed(true)} />;
} else if (postState.isError) {
alert = <FailAlert onDismiss={() => setAlertIsDismissed(true)} />;
}
}
return ( return (
<> <>
<Prompt message={getMessageOnLeavingPage} /> <Prompt message={getMessageOnLeavingPage} />
{alert}
<form onSubmit={onSubmit}> <form onSubmit={onSubmit}>
{childrenWithFormProps} {childrenWithFormProps}
<SubmitButton <SubmitButton

View File

@ -1,46 +0,0 @@
/*
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import React from "react";
import PropTypes from "prop-types";
import { Alert } from "bootstrap/Alert";
import { Portal } from "utils/Portal";
SuccessAlert.propTypes = {
onDismiss: PropTypes.func.isRequired,
};
const ALERT_CONTAINER_ID = "alert-container";
export function SuccessAlert({ onDismiss }) {
return (
<Portal containerId={ALERT_CONTAINER_ID}>
<Alert
type="success"
message={_("Settings were successfully saved.")}
onDismiss={onDismiss}
/>
</Portal>
);
}
FailAlert.propTypes = {
onDismiss: PropTypes.func.isRequired,
};
export function FailAlert({ onDismiss }) {
return (
<Portal containerId={ALERT_CONTAINER_ID}>
<Alert
type="danger"
message={_("Settings update was failed.")}
onDismiss={onDismiss}
/>
</Portal>
);
}

View File

@ -8,16 +8,15 @@
import { useCallback, useEffect, useReducer } from "react"; import { useCallback, useEffect, useReducer } from "react";
import update from "immutability-helper"; import update from "immutability-helper";
import { useAPIGet } from "api/get"; import { useAPIGet } from "api/hooks";
import { useWSForisModule } from "webSockets/hooks"; import { useWSForisModule } from "webSockets/hooks";
const FORM_ACTIONS = { const FORM_ACTIONS = {
updateValue: 1, updateValue: 1,
resetData: 2, resetData: 2,
}; };
export function useForm(validator, prepData) { export function useForm(validator, dataPreprocessor) {
const [state, dispatch] = useReducer(formReducer, { const [state, dispatch] = useReducer(formReducer, {
data: null, data: null,
initialData: null, initialData: null,
@ -28,10 +27,10 @@ export function useForm(validator, prepData) {
dispatch({ dispatch({
type: FORM_ACTIONS.resetData, type: FORM_ACTIONS.resetData,
data, data,
prepData, dataPreprocessor,
validator, validator,
}); });
}, [prepData, validator]); }, [dataPreprocessor, validator]);
const onFormChangeHandler = useCallback((updateRule) => (event) => { const onFormChangeHandler = useCallback((updateRule) => (event) => {
dispatch({ dispatch({
@ -41,6 +40,7 @@ export function useForm(validator, prepData) {
validator, validator,
}); });
}, [validator]); }, [validator]);
return [ return [
state, state,
onFormChangeHandler, onFormChangeHandler,
@ -48,7 +48,6 @@ export function useForm(validator, prepData) {
]; ];
} }
function formReducer(state, action) { function formReducer(state, action) {
switch (action.type) { switch (action.type) {
case FORM_ACTIONS.updateValue: { case FORM_ACTIONS.updateValue: {
@ -61,12 +60,15 @@ function formReducer(state, action) {
}; };
} }
case FORM_ACTIONS.resetData: { case FORM_ACTIONS.resetData: {
if (!action.data) return { ...state, initialData: state.data }; if (!action.data) {
const prepData = action.prepData ? action.prepData(action.data) : action.data; return { ...state, initialData: state.data };
}
const data = action.dataPreprocessor ? action.dataPreprocessor(action.data) : action.data;
return { return {
data: prepData, data,
initialData: prepData, initialData: data,
errors: action.data ? action.validator(prepData) : undefined, errors: action.data ? action.validator(data) : undefined,
}; };
} }
default: { default: {
@ -82,6 +84,9 @@ function getChangedValue(target) {
} else if (target.type === "number") { } else if (target.type === "number") {
const parsedValue = parseInt(value); const parsedValue = parseInt(value);
value = Number.isNaN(parsedValue) ? value : parsedValue; value = Number.isNaN(parsedValue) ? value : parsedValue;
} else if (target.type === "file") {
// Return first file (we don't need multiple yet)
[value] = target.files;
} }
return value; return value;
} }

View File

@ -6,24 +6,31 @@
*/ */
// API // API
export { useAPIGet } from "api/get"; export {
export { useAPIPost } from "api/post"; useAPIGet,
export { useAPIDelete } from "api/delete"; useAPIPost,
export { useAPIPatch } from "api/patch"; useAPIPatch,
useAPIPut,
useAPIDelete,
useAPIPolling,
} from "api/hooks";
export { API_STATE } from "api/utils";
// Bootstrap // Bootstrap
export { Alert } from "bootstrap/Alert"; export { Alert, ALERT_TYPES } from "bootstrap/Alert";
export { Button } from "bootstrap/Button"; export { Button } from "bootstrap/Button";
export { CheckBox } from "bootstrap/CheckBox"; export { CheckBox } from "bootstrap/CheckBox";
export { formFieldsSize } from "bootstrap/constants"; export { DownloadButton } from "bootstrap/DownloadButton";
export { DataTimeInput } from "bootstrap/DataTimeInput"; export { DataTimeInput } from "bootstrap/DataTimeInput";
export { EmailInput } from "bootstrap/EmailInput"; export { EmailInput } from "bootstrap/EmailInput";
export { FileInput } from "bootstrap/FileInput";
export { Input } from "bootstrap/Input"; export { Input } from "bootstrap/Input";
export { NumberInput } from "bootstrap/NumberInput"; export { NumberInput } from "bootstrap/NumberInput";
export { PasswordInput } from "bootstrap/PasswordInput"; export { PasswordInput } from "bootstrap/PasswordInput";
export { RadioSet } from "bootstrap/RadioSet"; export { RadioSet } from "bootstrap/RadioSet";
export { Select } from "bootstrap/Select"; export { Select } from "bootstrap/Select";
export { TextInput } from "bootstrap/TextInput"; export { TextInput } from "bootstrap/TextInput";
export { formFieldsSize } from "bootstrap/constants";
export { export {
Spinner, Spinner,
@ -36,6 +43,9 @@ export {
ModalHeader, ModalHeader,
} from "bootstrap/Modal"; } from "bootstrap/Modal";
// Common
export { RebootButton } from "common/RebootButton";
// Form // Form
export { ForisForm } from "form/components/ForisForm"; export { ForisForm } from "form/components/ForisForm";
export { SubmitButton, STATES as SUBMIT_BUTTON_STATES } from "form/components/SubmitButton"; export { SubmitButton, STATES as SUBMIT_BUTTON_STATES } from "form/components/SubmitButton";
@ -48,6 +58,10 @@ export { WebSockets } from "webSockets/WebSockets";
// Utils // Utils
export { Portal } from "utils/Portal"; export { Portal } from "utils/Portal";
export { undefinedIfEmpty, withoutUndefinedKeys, onlySpecifiedKeys } from "utils/objectHelpers"; export { undefinedIfEmpty, withoutUndefinedKeys, onlySpecifiedKeys } from "utils/objectHelpers";
export {
withEither, withSpinner, withSending, withSpinnerOnSending, withError, withErrorMessage,
} from "utils/conditionalHOCs";
export { ErrorMessage } from "utils/ErrorMessage";
// Foris URL // Foris URL
export { ForisURLs, REFORIS_URL_PREFIX } from "forisUrls"; export { ForisURLs, REFORIS_URL_PREFIX } from "forisUrls";
@ -64,4 +78,4 @@ export {
} from "validations"; } from "validations";
// Alert context // Alert context
export { AlertContext, AlertContextProvider } from "alertContext/AlertContext"; export { AlertContextProvider, useAlert } from "alertContext/AlertContext";

View File

@ -0,0 +1,23 @@
/*
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import React from "react";
const mockSetAlert = jest.fn();
const mockDismissAlert = jest.fn();
window.AlertContext = React.createContext();
function AlertContextMock({ children }) {
return (
<AlertContext.Provider value={[mockSetAlert, mockDismissAlert]}>
{ children }
</AlertContext.Provider>
);
}
export { AlertContextMock, mockSetAlert, mockDismissAlert };

View File

@ -7,31 +7,37 @@
/* eslint import/export: "off" */ /* eslint import/export: "off" */
import React from 'react'; import React from "react";
import PropTypes from 'prop-types'; import { UIDReset } from "react-uid";
import {UIDReset} from 'react-uid'; import { StaticRouter } from "react-router";
import {StaticRouter} from 'react-router'; import { render } from "@testing-library/react";
import {render} from '@testing-library/react' import PropTypes from "prop-types";
import { AlertContextMock } from "./alertContextMock";
Wrapper.propTypes = { Wrapper.propTypes = {
children: PropTypes.oneOfType([ children: PropTypes.oneOfType([
PropTypes.arrayOf(PropTypes.node), PropTypes.arrayOf(PropTypes.node),
PropTypes.node PropTypes.node,
]) ]),
}; };
function Wrapper({children}) { function Wrapper({ children }) {
return <StaticRouter> return (
<UIDReset> <AlertContextMock>
{children} <StaticRouter>
</UIDReset> <UIDReset>
</StaticRouter> {children}
</UIDReset>
</StaticRouter>
</AlertContextMock>
);
} }
const customTestRender = (ui, options) => render(ui, {wrapper: Wrapper, ...options}); const customTestRender = (ui, options) => render(ui, { wrapper: Wrapper, ...options });
// re-export everything // re-export everything
export * from '@testing-library/react' export * from "@testing-library/react";
// override render method // override render method
export {customTestRender as render} export { customTestRender as render };

12
src/testUtils/network.js Normal file
View File

@ -0,0 +1,12 @@
/*
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import mockAxios from 'jest-mock-axios';
export function mockJSONError(data) {
mockAxios.mockError({ response: { data, headers: { "content-type": "application/json" } } });
}

View File

@ -15,12 +15,15 @@ global.afterEach(() => {
// Mock babel (gettext) // Mock babel (gettext)
global._ = str => str; global._ = str => str;
global.ngettext = str => str;
global.babel = {format: (str) => str}; global.babel = {format: (str) => str};
global.ForisTranslations = {}; global.ForisTranslations = {};
// Mock web sockets
window.WebSocket = jest.fn();
// Mock scrollIntoView // Mock scrollIntoView
global.HTMLElement.prototype.scrollIntoView = () => { global.HTMLElement.prototype.scrollIntoView = () => {};
};
jest.doMock('moment', () => { jest.doMock('moment', () => {
moment.tz.setDefault('UTC'); moment.tz.setDefault('UTC');

16
src/utils/ErrorMessage.js Normal file
View File

@ -0,0 +1,16 @@
/*
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import React from "react";
export function ErrorMessage() {
return (
<p className="text-center text-danger">
{_("An error occurred while fetching data.")}
</p>
);
}

View File

@ -0,0 +1,61 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`conditional HOCs withError should render error message 1`] = `
<div>
<p
class="text-center text-danger"
>
An error occurred while fetching data.
</p>
</div>
`;
exports[`conditional HOCs withErrorMessage should render error message 1`] = `
<div>
<p
class="text-center text-danger"
>
An error occurred while fetching data.
</p>
</div>
`;
exports[`conditional HOCs withSpinner should render spinner 1`] = `
<div>
<div
class="spinner-wrapper my-3 text-center"
>
<div
class="spinner-border "
role="status"
>
<span
class="sr-only"
/>
</div>
<div
class="spinner-text"
/>
</div>
</div>
`;
exports[`conditional HOCs withSpinnerOnSending should render spinner 1`] = `
<div>
<div
class="spinner-wrapper my-3 text-center"
>
<div
class="spinner-border "
role="status"
>
<span
class="sr-only"
/>
</div>
<div
class="spinner-text"
/>
</div>
</div>
`;

View File

@ -0,0 +1,110 @@
/*
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import React from "react";
import { render } from "customTestRender";
import {
withEither, withSpinner, withSending, withSpinnerOnSending, withError, withErrorMessage,
} from "../conditionalHOCs";
import { API_STATE } from "api/utils";
describe("conditional HOCs", () => {
const First = () => <p>First</p>;
const Alternative = () => <p>Alternative</p>;
describe("withEither", () => {
it("should render First component", () => {
const withAlternative = withEither(() => false, Alternative);
const FirstWithConditional = withAlternative(First);
const { getByText } = render(<FirstWithConditional />);
expect(getByText("First")).toBeDefined();
});
it("should render Alternative component", () => {
const withAlternative = withEither(() => true, Alternative);
const FirstWithConditional = withAlternative(First);
const { getByText } = render(<FirstWithConditional />);
expect(getByText("Alternative")).toBeDefined();
});
});
describe("withSpinner", () => {
it("should render First component", () => {
const withSpinnerHidden = withSpinner(() => false);
const FirstWithConditional = withSpinnerHidden(First);
const { getByText } = render(<FirstWithConditional />);
expect(getByText("First")).toBeDefined();
});
it("should render spinner", () => {
const withSpinnerVisible = withSpinner(() => true);
const FirstWithConditional = withSpinnerVisible(First);
const { container } = render(<FirstWithConditional />);
expect(container).toMatchSnapshot();
});
});
describe("withSending", () => {
it("should render First component", () => {
const withAlternative = withSending(Alternative);
const FirstWithConditional = withAlternative(First);
const { getByText } = render(<FirstWithConditional apiState={API_STATE.SUCCESS} />);
expect(getByText("First")).toBeDefined();
});
it("should render Alternative component", () => {
const withAlternative = withSending(Alternative);
const FirstWithConditional = withAlternative(First);
const { getByText } = render(<FirstWithConditional apiState={API_STATE.SENDING} />);
expect(getByText("Alternative")).toBeDefined();
});
});
describe("withSpinnerOnSending", () => {
it("should render First component", () => {
const FirstWithConditional = withSpinnerOnSending(First);
const { getByText } = render(<FirstWithConditional apiState={API_STATE.SUCCESS} />);
expect(getByText("First")).toBeDefined();
});
it("should render spinner", () => {
const FirstWithConditional = withSpinnerOnSending(First);
const { container } = render(<FirstWithConditional apiState={API_STATE.SENDING} />);
expect(container).toMatchSnapshot();
});
});
describe("withError", () => {
it("should render First component", () => {
const withErrorHidden = withError(() => false);
const FirstWithConditional = withErrorHidden(First);
const { getByText } = render(<FirstWithConditional />);
expect(getByText("First")).toBeDefined();
});
it("should render error message", () => {
const withErrorVisible = withError(() => true);
const FirstWithConditional = withErrorVisible(First);
const { container } = render(<FirstWithConditional />);
expect(container).toMatchSnapshot();
});
});
describe("withErrorMessage", () => {
it("should render First component", () => {
const FirstWithConditional = withErrorMessage(First);
const { getByText } = render(<FirstWithConditional apiState={API_STATE.SUCCESS} />);
expect(getByText("First")).toBeDefined();
});
it("should render error message", () => {
const FirstWithConditional = withErrorMessage(First);
const { container } = render(<FirstWithConditional apiState={API_STATE.ERROR} />);
expect(container).toMatchSnapshot();
});
});
});

View File

@ -0,0 +1,52 @@
/*
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import React from "react";
import { Spinner } from "bootstrap/Spinner";
import { API_STATE } from "api/utils";
import { ErrorMessage } from "./ErrorMessage";
function withEither(conditionalFn, Either) {
return (Component) => (props) => {
if (conditionalFn(props)) {
return <Either {...props} />;
}
return <Component {...props} />;
};
}
// Loading
function isSending(props) {
if (Array.isArray(props.apiState)) {
return props.apiState.some(
(state) => [API_STATE.INIT, API_STATE.SENDING].includes(state),
);
}
return [API_STATE.INIT, API_STATE.SENDING].includes(props.apiState);
}
const withSpinner = (conditionalFn) => withEither(conditionalFn, Spinner);
const withSending = (Either) => withEither(isSending, Either);
const withSpinnerOnSending = withSpinner(isSending);
// Error handling
const withError = (conditionalFn) => withEither(conditionalFn, ErrorMessage);
const withErrorMessage = withError(
(props) => {
if (Array.isArray(props.apiState)) {
return props.apiState.includes(API_STATE.ERROR);
}
return props.apiState === API_STATE.ERROR;
},
);
export {
withEither, withSpinner, withSending, withSpinnerOnSending, withError, withErrorMessage,
};

View File

@ -29,7 +29,6 @@ const REs = {
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) => { const createValidator = (fieldType) => (value) => {
if (value && value !== "") return REs[fieldType].test(value) ? undefined : ERROR_MESSAGES[fieldType]; if (value && value !== "") return REs[fieldType].test(value) ? undefined : ERROR_MESSAGES[fieldType];
}; };

View File

@ -1,4 +1,4 @@
# Translations template for PROJECT. # Czech translations for PROJECT.
# Copyright (C) 2019 ORGANIZATION # Copyright (C) 2019 ORGANIZATION
# This file is distributed under the same license as the PROJECT project. # This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. # FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
@ -7,22 +7,21 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 12:55+0000\n" "PO-Revision-Date: 2019-11-21 17:04+0000\n"
"Last-Translator: Stepan Henek <stepan+github@henek.name>\n" "Last-Translator: Pavel Borecki <pavel.borecki@gmail.com>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/turris/foris-js/cs/"
">\n"
"Language: 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" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Weblate 3.9-dev\n"
"Generated-By: Babel 2.7.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
msgstr "Tohle není platná IPv4 adresa." msgstr "Toto není platná IPv4 adresa."
#: src/validations.js:14 #: src/validations.js:14
msgid "This is not a valid IPv6 address." msgid "This is not a valid IPv6 address."
@ -30,11 +29,11 @@ msgstr "Tohle není platná IPv6 adresa."
#: src/validations.js:15 #: src/validations.js:15
msgid "This is not a valid IPv6 prefix." msgid "This is not a valid IPv6 prefix."
msgstr "Tohle není platný IPv6 prefix." msgstr "Toto není platný IPv6 prefix."
#: src/validations.js:16 #: src/validations.js:16
msgid "This is not a valid domain name." msgid "This is not a valid domain name."
msgstr "Tohle není platné doménové jméno." msgstr "Toto není platné doménové jméno."
#: src/validations.js:17 #: src/validations.js:17
msgid "This is not a valid DUID." msgid "This is not a valid DUID."
@ -42,13 +41,61 @@ msgstr "Tohle není platné DUID."
#: src/validations.js:18 #: src/validations.js:18
msgid "This is not a valid MAC address." msgid "This is not a valid MAC address."
msgstr "Tohle není platná MAC adresa." msgstr "Toto není platná MAC adresa."
#: src/validations.js:19 #: src/validations.js:19
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "Neobsahuje seznam e-mailů oddělených čárkou." msgstr "Neobsahuje seznam e-mailů oddělených čárkou."
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr "Platnost relace skončila. Přihlaste se znovu."
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr "Došlo k chybě kvůli překročení časového limitu."
#: src/api/utils.js:66
msgid "No response received."
msgstr "Neobdržena žádná odezva."
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr "Došlo k neznámé chybě. Další informace naleznete v konzoli."
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr "Došlo k neznámé chybě v aplikačním programovém rozhraní."
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr "Nastavení úspěšně uložena"
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
"Změny, které byly provedeny, nebyly uloženy. Jste si jistý, že chcete " "Změny, které byly provedeny, nebyly uloženy. Jste si jistý, že chcete "
@ -66,10 +113,25 @@ msgstr "Načítám nastavení"
msgid "Save" msgid "Save"
msgstr "Uložit" msgstr "Uložit"
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "Nastavení bylo úspěšně uloženo." msgstr "Došlo k chybě při získávání dat."
#~ msgid "Settings were successfully saved."
#~ msgstr "Nastavení bylo úspěšně uloženo."
#~ msgid "Settings update was failed."
#~ msgstr "Ukládání nastavení selhalo."
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""
#: src/form/components/alerts.js:41
msgid "Settings update was failed."
msgstr "Ukládání nastavení selhalo."

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:54+0200\n" "PO-Revision-Date: 2019-08-28 17:54+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: da\n" "Language: da\n"
@ -16,7 +16,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
@ -46,7 +46,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -62,11 +110,25 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "" msgstr ""
#: src/form/components/alerts.js:41 #~ msgid "Settings were successfully saved."
msgid "Settings update was failed." #~ msgstr ""
msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:54+0200\n" "PO-Revision-Date: 2019-08-28 17:54+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: de\n" "Language: de\n"
@ -16,7 +16,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
@ -46,7 +46,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -62,11 +110,25 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "" msgstr ""
#: src/form/components/alerts.js:41 #~ msgid "Settings were successfully saved."
msgid "Settings update was failed." #~ msgstr ""
msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:54+0200\n" "PO-Revision-Date: 2019-08-28 17:54+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: el\n" "Language: el\n"
@ -16,7 +16,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
@ -46,7 +46,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -62,11 +110,25 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "" msgstr ""
#: src/form/components/alerts.js:41 #~ msgid "Settings were successfully saved."
msgid "Settings update was failed." #~ msgstr ""
msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:21+0200\n" "PO-Revision-Date: 2019-08-28 17:21+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: en\n" "Language: en\n"
@ -16,7 +16,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
@ -46,7 +46,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -62,11 +110,25 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "" msgstr ""
#: src/form/components/alerts.js:41 #~ msgid "Settings were successfully saved."
msgid "Settings update was failed." #~ msgstr ""
msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

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

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:54+0200\n" "PO-Revision-Date: 2019-08-28 17:54+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: fi\n" "Language: fi\n"
@ -16,7 +16,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
@ -46,7 +46,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -62,11 +110,25 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "" msgstr ""
#: src/form/components/alerts.js:41 #~ msgid "Settings were successfully saved."
msgid "Settings update was failed." #~ msgstr ""
msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:54+0200\n" "PO-Revision-Date: 2019-08-28 17:54+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: fo\n" "Language: fo\n"
@ -16,7 +16,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
@ -46,7 +46,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -62,11 +110,25 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "" msgstr ""
#: src/form/components/alerts.js:41 #~ msgid "Settings were successfully saved."
msgid "Settings update was failed." #~ msgstr ""
msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -45,7 +45,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -61,11 +109,7 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr ""
#: src/form/components/alerts.js:41
msgid "Settings update was failed."
msgstr "" msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:54+0200\n" "PO-Revision-Date: 2019-08-28 17:54+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: fr\n" "Language: fr\n"
@ -16,7 +16,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
@ -46,7 +46,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -62,11 +110,25 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "" msgstr ""
#: src/form/components/alerts.js:41 #~ msgid "Settings were successfully saved."
msgid "Settings update was failed." #~ msgstr ""
msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:55+0200\n" "PO-Revision-Date: 2019-08-28 17:55+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: hr\n" "Language: hr\n"
@ -17,7 +17,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
@ -47,7 +47,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -63,11 +111,25 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "" msgstr ""
#: src/form/components/alerts.js:41 #~ msgid "Settings were successfully saved."
msgid "Settings update was failed." #~ msgstr ""
msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:55+0200\n" "PO-Revision-Date: 2019-08-28 17:55+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: hu\n" "Language: hu\n"
@ -16,7 +16,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
@ -46,7 +46,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -62,11 +110,25 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "" msgstr ""
#: src/form/components/alerts.js:41 #~ msgid "Settings were successfully saved."
msgid "Settings update was failed." #~ msgstr ""
msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:55+0200\n" "PO-Revision-Date: 2019-08-28 17:55+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: it\n" "Language: it\n"
@ -16,7 +16,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
@ -46,7 +46,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -62,11 +110,25 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "" msgstr ""
#: src/form/components/alerts.js:41 #~ msgid "Settings were successfully saved."
msgid "Settings update was failed." #~ msgstr ""
msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:55+0200\n" "PO-Revision-Date: 2019-08-28 17:55+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: ja\n" "Language: ja\n"
@ -16,7 +16,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
@ -46,7 +46,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -62,11 +110,25 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "" msgstr ""
#: src/form/components/alerts.js:41 #~ msgid "Settings were successfully saved."
msgid "Settings update was failed." #~ msgstr ""
msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:55+0200\n" "PO-Revision-Date: 2019-08-28 17:55+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: ko\n" "Language: ko\n"
@ -16,7 +16,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
@ -46,7 +46,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -62,11 +110,25 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "" msgstr ""
#: src/form/components/alerts.js:41 #~ msgid "Settings were successfully saved."
msgid "Settings update was failed." #~ msgstr ""
msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:55+0200\n" "PO-Revision-Date: 2019-08-28 17:55+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: lt\n" "Language: lt\n"
@ -17,7 +17,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
@ -47,7 +47,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -63,11 +111,25 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "" msgstr ""
#: src/form/components/alerts.js:41 #~ msgid "Settings were successfully saved."
msgid "Settings update was failed." #~ msgstr ""
msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:56+0200\n" "PO-Revision-Date: 2019-08-28 17:56+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: nb\n" "Language: nb\n"
@ -16,7 +16,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
@ -46,7 +46,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -62,11 +110,25 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "" msgstr ""
#: src/form/components/alerts.js:41 #~ msgid "Settings were successfully saved."
msgid "Settings update was failed." #~ msgstr ""
msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:55+0200\n" "PO-Revision-Date: 2019-08-28 17:55+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: nb_NO\n" "Language: nb_NO\n"
@ -16,7 +16,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
@ -46,7 +46,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -62,11 +110,25 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "" msgstr ""
#: src/form/components/alerts.js:41 #~ msgid "Settings were successfully saved."
msgid "Settings update was failed." #~ msgstr ""
msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:56+0200\n" "PO-Revision-Date: 2019-08-28 17:56+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: nl\n" "Language: nl\n"
@ -16,7 +16,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
@ -46,7 +46,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -62,11 +110,25 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "" msgstr ""
#: src/form/components/alerts.js:41 #~ msgid "Settings were successfully saved."
msgid "Settings update was failed." #~ msgstr ""
msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:56+0200\n" "PO-Revision-Date: 2019-08-28 17:56+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: pl\n" "Language: pl\n"
@ -17,7 +17,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
@ -47,7 +47,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -63,11 +111,25 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "" msgstr ""
#: src/form/components/alerts.js:41 #~ msgid "Settings were successfully saved."
msgid "Settings update was failed." #~ msgstr ""
msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:56+0200\n" "PO-Revision-Date: 2019-08-28 17:56+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: ro\n" "Language: ro\n"
@ -17,7 +17,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
@ -47,7 +47,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -63,11 +111,25 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "" msgstr ""
#: src/form/components/alerts.js:41 #~ msgid "Settings were successfully saved."
msgid "Settings update was failed." #~ msgstr ""
msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:56+0200\n" "PO-Revision-Date: 2019-08-28 17:56+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: ru\n" "Language: ru\n"
@ -17,7 +17,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
@ -47,7 +47,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -63,11 +111,25 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "" msgstr ""
#: src/form/components/alerts.js:41 #~ msgid "Settings were successfully saved."
msgid "Settings update was failed." #~ msgstr ""
msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:56+0200\n" "PO-Revision-Date: 2019-08-28 17:56+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: sk\n" "Language: sk\n"
@ -16,7 +16,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
@ -46,7 +46,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -62,11 +110,25 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "" msgstr ""
#: src/form/components/alerts.js:41 #~ msgid "Settings were successfully saved."
msgid "Settings update was failed." #~ msgstr ""
msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-08-28 14:34+0200\n" "POT-Creation-Date: 2019-11-29 16:27+0100\n"
"PO-Revision-Date: 2019-08-28 17:56+0200\n" "PO-Revision-Date: 2019-08-28 17:56+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: sv\n" "Language: sv\n"
@ -16,7 +16,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n" "Generated-By: Babel 2.7.0\n"
#: src/validations.js:13 #: src/validations.js:13
msgid "This is not a valid IPv4 address." msgid "This is not a valid IPv4 address."
@ -46,7 +46,55 @@ msgstr ""
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "" msgstr ""
#: src/form/components/ForisForm.js:123 #: src/api/utils.js:58
msgid "The session is expired. Please log in again."
msgstr ""
#: src/api/utils.js:63
msgid "Timeout error occurred."
msgstr ""
#: src/api/utils.js:66
msgid "No response received."
msgstr ""
#: src/api/utils.js:70
msgid "An unknown error occurred. Check the console for more info."
msgstr ""
#: src/api/utils.js:77
msgid "An unknown API error occurred."
msgstr ""
#: src/common/RebootButton.js:33
msgid "Reboot request failed."
msgstr ""
#: src/common/RebootButton.js:54
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:69
msgid "Reboot confirmation"
msgstr ""
#: src/common/RebootButton.js:70
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:72
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
#: src/form/components/ForisForm.js:88
msgid "Settings saved successfully"
msgstr ""
#: src/form/components/ForisForm.js:140
msgid "Changes you made may not be saved. Are you sure you want to leave?" msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr "" msgstr ""
@ -62,11 +110,25 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/form/components/alerts.js:25 #: src/utils/ErrorMessage.js:13
msgid "Settings were successfully saved." msgid "An error occurred while fetching data."
msgstr "" msgstr ""
#: src/form/components/alerts.js:41 #~ msgid "Settings were successfully saved."
msgid "Settings update was failed." #~ msgstr ""
msgstr ""
#~ msgid "Settings update was failed."
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Reboot triggering was failed."
#~ msgstr ""
#~ msgid "Reboot triggering failed."
#~ msgstr ""
#~ msgid "Reboot requestq failed."
#~ msgstr ""