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

Compare commits

...

71 Commits

Author SHA1 Message Date
51ba380cf0 Merge branch 'dev' into 'master'
Release 2.1.0

See merge request turris/reforis/foris-js!62
2019-12-19 12:10:18 +01:00
4eae1ed8d2 Merge branch 'ws-logging' into 'dev'
Changed levels of WS logs

Closes reforis#162

See merge request turris/reforis/foris-js!61
2019-12-19 11:58:59 +01:00
3d290114fa Changed levels of WS logs 2019-12-17 17:45:55 +01:00
3f87e9e4b4 Merge branch 'export-radio' into 'dev'
Export <Radio />.

See merge request turris/reforis/foris-js!60
2019-12-17 14:07:14 +01:00
6d5cb6a951 Export <Radio />. 2019-12-17 14:04:06 +01:00
8d3be8df67 Merge branch 'click-outside-hook' into 'dev'
Detect clicks outside element with a hook

See merge request turris/reforis/foris-js!59
2019-12-16 16:21:18 +01:00
90509f2a23 Detect clicks outside element with a hook 2019-12-16 13:44:58 +01:00
73f84a2d81 Merge branch '8-fix-git-link' into 'dev'
Fixed link to git repository

Closes #8

See merge request turris/reforis/foris-js!58
2019-12-09 12:45:01 +01:00
cea7325427 Fixed link to git repository 2019-12-09 11:51:50 +01:00
a8d8c872f9 Merge branch 'dev' into 'master'
Publish 2.0.0.

See merge request turris/reforis/foris-js!57
2019-12-09 10:51:49 +01:00
cda7898a96 Merge branch 'fix-readme' into 'dev'
Fix README.md publishing.

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

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

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

Closes #15

See merge request turris/reforis/foris-js!54
2019-12-06 10:27:48 +01:00
8d0c640994 Set suffix for API URL 2019-12-06 10:27:48 +01:00
25ddb5949c Merge branch 'dev' into 'master'
Dev

See merge request turris/reforis/foris-js!52
2019-12-02 17:11:03 +01:00
7b739f55a0 Merge branch 'add-reboot-button' into 'dev'
Add reboot button

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

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

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

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

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

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

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

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

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

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

See merge request turris/reforis/foris-js!40
2019-11-15 08:55:24 +00:00
b30f9f59b4 Fix for withEither 2019-11-15 08:55:24 +00:00
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
75 changed files with 2858 additions and 740 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,6 +40,15 @@ 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
@ -38,10 +57,10 @@ test:
test-js-update-snapshots: test-js-update-snapshots:
npm test -- -u 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

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

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.2.0", "version": "2.1.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,21 +1,20 @@
{ {
"name": "foris", "name": "foris",
"version": "1.2.0", "version": "2.1.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": {
"type": "git", "type": "git",
"url": "https://gitlab.labs.nic.cz/turris/reforis/forisjs.git" "url": "https://gitlab.labs.nic.cz/turris/reforis/foris-js.git"
}, },
"keywords": [ "keywords": [
"foris", "foris",
"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,36 +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",
"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 README.md dist
cp -rf translations dist
# Remove unwanted files
rm -rf dist/**/__tests__
rm -rf dist/__mocks__

View File

@ -5,7 +5,8 @@ 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
# Need to replace "_" with "-" as GitLab CI won't accept secret vars with "-"
echo "//registry.npmjs.org/:_authToken=$(echo "$NPM_TOKEN" | tr _ -)" > .npmrc 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"

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];
}

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

@ -0,0 +1,120 @@
/*
* 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 (urlRoot, contentType) => {
const [state, dispatch] = useReducer(APIReducer, {
state: API_STATE.INIT,
data: null,
});
const sendRequest = useCallback(async ({ data, suffix } = {}) => {
const headers = { ...HEADERS };
if (contentType) {
headers["Content-Type"] = contentType;
}
dispatch({ type: API_ACTIONS.INIT });
try {
// Prepare request
const request = API_METHODS[method];
const config = {
timeout: TIMEOUT,
headers,
};
const url = suffix ? `${urlRoot}/${suffix}` : urlRoot;
// Make request
let result;
if (DATA_METHODS.includes(method)) {
result = await request(url, data, config);
} else {
result = await request(url, config);
}
// Process request result
dispatch({
type: API_ACTIONS.SUCCESS,
payload: result.data,
});
} catch (error) {
dispatch({
type: API_ACTIONS.FAILURE,
status: error.response && error.response.status,
payload: getErrorPayload(error),
});
}
}, [urlRoot, 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,45 +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, contentType) {
const [state, dispatch] = useReducer(APIReducer, {
isSending: false,
isError: false,
isSuccess: false,
data: null,
});
const headers = { ...HEADERS };
if (contentType) {
headers["Content-Type"] = contentType;
}
const post = async (data) => {
dispatch({ type: API_ACTIONS.INIT });
try {
const result = await axios.post(url, data, {
timeout: TIMEOUT,
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

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

View File

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

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

@ -5,10 +5,11 @@
* See /LICENSE for more information. * See /LICENSE for more information.
*/ */
import React, { useEffect, useRef } from "react"; import React, { useRef } from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { Portal } from "utils/Portal"; import { Portal } from "utils/Portal";
import { useClickOutside } from "utils/hooks";
Modal.propTypes = { Modal.propTypes = {
/** Is modal shown value */ /** Is modal shown value */
@ -26,22 +27,12 @@ Modal.propTypes = {
export function Modal({ shown, setShown, children }) { export function Modal({ shown, setShown, children }) {
const dialogRef = useRef(); const dialogRef = useRef();
useEffect(() => { useClickOutside(dialogRef, () => setShown(false));
function handleClickOutsideDialog(e) {
if (!dialogRef.current.contains(e.target)) setShown(false);
}
document.addEventListener("mousedown", handleClickOutsideDialog);
return () => {
document.removeEventListener("mousedown", handleClickOutsideDialog);
};
}, [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

@ -11,7 +11,6 @@ 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,
@ -66,7 +65,7 @@ Radio.propTypes = {
helpText: PropTypes.string, helpText: PropTypes.string,
}; };
function Radio({ export function Radio({
label, id, helpText, ...props label, id, helpText, ...props
}) { }) {
return ( return (

View File

@ -9,7 +9,6 @@ import React from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { useUID } from "react-uid"; import { useUID } from "react-uid";
Select.propTypes = { Select.propTypes = {
/** Select field Label. */ /** Select field Label. */
label: PropTypes.string.isRequired, label: PropTypes.string.isRequired,

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>
@ -46,6 +46,8 @@ export function Spinner({
SpinnerElement.propTypes = { SpinnerElement.propTypes = {
/** Spinner's size */ /** Spinner's size */
small: PropTypes.bool, small: PropTypes.bool,
/** Additional className */
className: PropTypes.string,
/** Children components */ /** Children components */
children: PropTypes.oneOfType([ children: PropTypes.oneOfType([
PropTypes.arrayOf(PropTypes.node), PropTypes.arrayOf(PropTypes.node),
@ -53,13 +55,16 @@ SpinnerElement.propTypes = {
]), ]),
}; };
export function SpinnerElement({ small, children }) { export function SpinnerElement({ small, className, children }) {
return ( return (
<> <>
<div className={`spinner-border ${small ? "spinner-border-sm" : ""}`} role="status"> <div
className={`spinner-border ${small ? "spinner-border-sm" : ""} ${className || ""}`.trim()}
role="status"
>
<span className="sr-only" /> <span className="sr-only" />
</div> </div>
<div className="spinner-text">{children}</div> {children && <div className="spinner-text">{children}</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

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

@ -10,6 +10,7 @@ import React from 'react';
import { act, fireEvent, render, waitForElement } from 'customTestRender'; import { act, fireEvent, render, waitForElement } from 'customTestRender';
import mockAxios from 'jest-mock-axios'; import mockAxios from 'jest-mock-axios';
import { ForisForm } from "../components/ForisForm"; import { ForisForm } from "../components/ForisForm";
import { WebSockets } from "webSockets/WebSockets";
// It's possible to unittest each hooks via react-hooks-testing-library. // It's possible to unittest each hooks via react-hooks-testing-library.
@ -30,7 +31,6 @@ describe('useForm hook.', () => {
let mockValidator; let mockValidator;
let mockPrepData; let mockPrepData;
let mockPrepDataToSubmit; let mockPrepDataToSubmit;
let mockWebSockets;
let input; let input;
let form; let form;
const Child = jest.fn(props => <TestForm {...props}/>); const Child = jest.fn(props => <TestForm {...props}/>);
@ -41,7 +41,7 @@ describe('useForm hook.', () => {
mockValidator = jest.fn(data => data.field === 'invalidValue' ? {field: 'Error'} : {}); mockValidator = jest.fn(data => data.field === 'invalidValue' ? {field: 'Error'} : {});
const {getByTestId, container} = render( const {getByTestId, container} = render(
<ForisForm <ForisForm
ws={mockWebSockets} ws={new WebSockets()}
// Just some module which exists... // Just some module which exists...
forisConfig={{ forisConfig={{
endpoint: 'testEndpoint', endpoint: 'testEndpoint',

View File

@ -5,26 +5,31 @@
* 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`. */ /** Optional WebSocket object. See `scr/common/WebSockets.js`.
* `forisConfig.wsModule` should be specified when it's passed.
* */
ws: PropTypes.object, ws: PropTypes.object,
/** Foris configuration object. See usage in main components. */ /** Foris configuration object. See usage in main components. */
forisConfig: PropTypes.shape({ forisConfig: PropTypes.shape({
/** reForis Flask aplication API endpoint from `src/common/API.js`. */ /** reForis Flask aplication API endpoint from `src/common/API.js`. */
endpoint: PropTypes.string.isRequired, endpoint: PropTypes.string.isRequired,
/** `foris-controller` module name to be used via WebSockets. /** `foris-controller` module name to be used via WebSockets.
* If it's not passed then WebSockets aren't used * It can be use only with `ws` prop.
* */ * */
wsModule: PropTypes.string, wsModule: PropTypes.string,
/** `foris-controller` action name to be used via WebSockets. /** `foris-controller` action name to be used via WebSockets.
@ -46,6 +51,17 @@ ForisForm.propTypes = {
children: PropTypes.node.isRequired, children: PropTypes.node.isRequired,
/** Optional override of form submit callback */ /** Optional override of form submit callback */
onSubmitOverridden: PropTypes.func, onSubmitOverridden: PropTypes.func,
// eslint-disable-next-line react/no-unused-prop-types
customWSProp(props) {
const wsModuleIsSpecified = !!(props.forisConfig && props.forisConfig.wsModule);
if (props.ws && !wsModuleIsSpecified) {
return new Error("forisConfig.wsModule should be specified when ws object is passed.");
}
if (!props.ws && wsModuleIsSpecified) {
return new Error("forisConfig.wsModule is specified without passing ws object.");
}
},
}; };
ForisForm.defaultProps = { ForisForm.defaultProps = {
@ -69,39 +85,53 @@ 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);
post(preparedData); post({ data: preparedData });
} }
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 +153,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,10 +8,9 @@
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,
@ -49,7 +48,6 @@ export function useForm(validator, dataPreprocessor) {
]; ];
} }
function formReducer(state, action) { function formReducer(state, action) {
switch (action.type) { switch (action.type) {
case FORM_ACTIONS.updateValue: { case FORM_ACTIONS.updateValue: {

View File

@ -6,13 +6,18 @@
*/ */
// 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 { DownloadButton } from "bootstrap/DownloadButton"; export { DownloadButton } from "bootstrap/DownloadButton";
@ -22,7 +27,7 @@ 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 { Radio, 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 { formFieldsSize } from "bootstrap/constants";
@ -38,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";
@ -50,6 +58,11 @@ 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";
export { useClickOutside } from "utils/hooks";
// Foris URL // Foris URL
export { ForisURLs, REFORIS_URL_PREFIX } from "forisUrls"; export { ForisURLs, REFORIS_URL_PREFIX } from "forisUrls";
@ -66,4 +79,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,55 @@
// 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>
</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>
</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

@ -18,3 +18,19 @@ export function useConditionalTimeout({ callback, timeout = 125 }, ...callbackAr
}, [condition, callback, timeout, callbackArgs]); }, [condition, callback, timeout, callbackArgs]);
return setCondition; return setCondition;
} }
/** Execute callback when user clicks outside specified element. */
export function useClickOutside(element, callback) {
function handleClickOutside(event) {
if (element.current && !element.current.contains(event.target)) {
callback(event);
}
}
useEffect(() => {
document.addEventListener("mousedown", handleClickOutside);
return () => {
document.removeEventListener("mousedown", handleClickOutside);
};
});
}

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

@ -25,18 +25,18 @@ export class WebSockets {
console.error("WS: Error observed, you aren't logged probably."); console.error("WS: Error observed, you aren't logged probably.");
window.location.replace(ForisURLs.login); window.location.replace(ForisURLs.login);
} }
console.log(`WS: Error: ${e}`); console.error(`WS: Error: ${e}`);
}; };
this.ws.onmessage = (e) => { this.ws.onmessage = (e) => {
console.log(`WS: Received Message: ${e.data}`); console.debug(`WS: Received Message: ${e.data}`);
const data = JSON.parse(e.data); const data = JSON.parse(e.data);
this.dispatch(data); this.dispatch(data);
}; };
this.ws.onopen = () => { this.ws.onopen = () => {
console.log("WS: Connection open."); console.debug("WS: Connection open.");
}; };
this.ws.onclose = () => { this.ws.onclose = () => {
console.log("WS: Connection closed."); console.debug("WS: Connection closed.");
}; };
// callbacks[module][action] // callbacks[module][action]
@ -61,9 +61,36 @@ export class WebSockets {
return this; return this;
} }
subscribe(params) { subscribe(module) {
this.waitForConnection(() => { this.waitForConnection(() => {
this.send("subscribe", params); this.send("subscribe", module);
});
return this;
}
unbind(module, action, callback) {
const callbacks = this.callbacks[module][action];
const index = callbacks.indexOf(callback);
if (index !== -1) {
callbacks.splice(index, 1);
}
if (callbacks.length === 0) {
delete this.callbacks[module][action];
}
if (Object.keys(this.callbacks[module]).length === 0) {
this.unsubscribe(module);
}
return this;
}
unsubscribe(module) {
this.waitForConnection(() => {
this.send("unsubscribe", module);
delete this.callbacks[module];
}); });
return this; return this;
} }
@ -82,15 +109,15 @@ export class WebSockets {
let chain; let chain;
try { try {
chain = this.callbacks[json.module][json.action]; chain = this.callbacks[json.module][json.action];
} catch (e) { } catch (error) {
if (e instanceof TypeError) { if (error instanceof TypeError) {
console.log(`Callback for this message wasn't found:${e.data}`); console.warn(`Callback for this message wasn't found:${error.data}`);
} else throw e; } else throw error;
} }
if (typeof chain === "undefined") return; if (typeof chain === "undefined") return;
for (let i = 0; i < chain.length; i++) chain[i](json); chain.forEach((callback) => callback(json));
} }
close() { close() {

View File

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

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 ""