1
0
mirror of https://gitlab.nic.cz/turris/reforis/foris-js.git synced 2024-07-05 20:53:12 +00:00

Merge branch 'dev' into 'master'

Release 1.3.1

See merge request turris/reforis/foris-js!38
This commit is contained in:
Maciej Lenartowicz 2019-11-14 12:58:31 +00:00
commit 158bd1bb24
62 changed files with 1489 additions and 665 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

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

96
package-lock.json generated
View File

@ -1,6 +1,6 @@
{ {
"name": "foris", "name": "foris",
"version": "1.2.0", "version": "1.3.1",
"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": {
@ -7546,9 +7560,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 +8359,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 +8411,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 +11203,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",

View File

@ -1,6 +1,6 @@
{ {
"name": "foris", "name": "foris",
"version": "1.2.0", "version": "1.3.1",
"description": "Set of components and utils for Foris and its plugins.", "description": "Set of components and utils for Foris and its plugins.",
"author": "CZ.NIC, z.s.p.o.", "author": "CZ.NIC, z.s.p.o.",
"repository": { "repository": {
@ -12,7 +12,7 @@
"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", "immutability-helper": "^3.0.0",
@ -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,11 +47,7 @@
"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",
"jest": "^24.8.0", "jest": "^24.8.0",
"jest-mock-axios": "^3.0.0", "jest-mock-axios": "^3.0.0",
@ -66,18 +61,13 @@
"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 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,10 +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(); const AlertContext = React.createContext();
@ -22,14 +23,30 @@ AlertContextProvider.propTypes = {
function AlertContextProvider({ children }) { function AlertContextProvider({ children }) {
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() {
return useContext(AlertContext);
}
export { AlertContext, 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];
}

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

@ -0,0 +1,92 @@
/*
* 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, useReducer } from "react";
import { ForisURLs } from "forisUrls";
import {
API_ACTIONS, API_METHODS, API_STATE, getErrorPayload, HEADERS, TIMEOUT,
} from "./utils";
const DATA_METHODS = ["POST", "PATCH", "PUT"];
function createAPIHook(method) {
return (url, contentType) => {
const [state, dispatch] = useReducer(APIReducer, {
state: API_STATE.INIT,
data: null,
});
const sendRequest = useCallback(async (data) => {
const headers = { ...HEADERS };
if (contentType) {
headers["Content-Type"] = contentType;
}
dispatch({ type: API_ACTIONS.INIT });
try {
const request = API_METHODS[method];
const config = {
timeout: TIMEOUT,
headers,
};
let result;
if (DATA_METHODS.includes(method)) {
result = await request(url, data, config);
} else {
result = await request(url, config);
}
dispatch({
type: API_ACTIONS.SUCCESS,
payload: result.data,
});
} catch (error) {
dispatch({
type: API_ACTIONS.FAILURE,
status: error.response && error.response.status,
payload: getErrorPayload(error),
});
}
}, [url, contentType]);
return [state, sendRequest];
};
}
function APIReducer(state, action) {
switch (action.type) {
case API_ACTIONS.INIT:
return {
...state,
state: API_STATE.SENDING,
};
case API_ACTIONS.SUCCESS:
return {
state: API_STATE.SUCCESS,
data: action.payload,
};
case API_ACTIONS.FAILURE:
if (action.status === 403) {
window.location.assign(ForisURLs.login);
}
return {
state: API_STATE.ERROR,
data: action.payload,
};
default:
throw new Error();
}
}
const useAPIGet = createAPIHook("GET");
const useAPIPost = createAPIHook("POST");
const useAPIPatch = createAPIHook("PATCH");
const useAPIPut = createAPIHook("PUT");
const useAPIDelete = createAPIHook("DELETE");
export {
useAPIGet, useAPIPost, useAPIPatch, useAPIPut, useAPIDelete,
};

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

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

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

View File

@ -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,

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

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

View File

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

View File

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

View File

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

View File

@ -8,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,13 @@
*/ */
// API // API
export { useAPIGet } from "api/get"; export {
export { useAPIPost } from "api/post"; useAPIGet, useAPIPost, useAPIPatch, useAPIPut, useAPIDelete,
export { useAPIDelete } from "api/delete"; } from "api/hooks";
export { useAPIPatch } from "api/patch"; 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";
@ -50,6 +50,10 @@ export { WebSockets } from "webSockets/WebSockets";
// Utils // Utils
export { Portal } from "utils/Portal"; export { Portal } from "utils/Portal";
export { undefinedIfEmpty, withoutUndefinedKeys, onlySpecifiedKeys } from "utils/objectHelpers"; export { undefinedIfEmpty, withoutUndefinedKeys, onlySpecifiedKeys } from "utils/objectHelpers";
export {
withEither, withSpinner, withSending, withSpinnerOnSending, withError, withErrorMessage,
} from "utils/conditionalHOCs";
export { ErrorMessage } from "utils/ErrorMessage";
// Foris URL // Foris URL
export { ForisURLs, REFORIS_URL_PREFIX } from "forisUrls"; export { ForisURLs, REFORIS_URL_PREFIX } from "forisUrls";
@ -66,4 +70,4 @@ export {
} from "validations"; } from "validations";
// Alert context // Alert context
export { AlertContext, AlertContextProvider } from "alertContext/AlertContext"; export { AlertContext, 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";
import { AlertContext } from "../alertContext/AlertContext";
const mockSetAlert = jest.fn();
const mockDismissAlert = jest.fn();
function AlertContextMock({ children }) {
return (
<AlertContext.Provider value={[mockSetAlert, mockDismissAlert]}>
{ children }
</AlertContext.Provider>
);
}
export { AlertContextMock, mockSetAlert, mockDismissAlert };

View File

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

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

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

View File

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

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

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

View File

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

View File

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

View File

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

View File

@ -29,7 +29,6 @@ const REs = {
MultipleEmails: /^([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+ *)( *, *[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+ *)*$/, MultipleEmails: /^([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+ *)( *, *[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+ *)*$/,
}; };
const createValidator = (fieldType) => (value) => { const createValidator = (fieldType) => (value) => {
if (value && value !== "") return REs[fieldType].test(value) ? undefined : ERROR_MESSAGES[fieldType]; if (value && value !== "") return REs[fieldType].test(value) ? undefined : ERROR_MESSAGES[fieldType];
}; };

View File

@ -1,4 +1,4 @@
# Translations template for PROJECT. # Czech translations for PROJECT.
# Copyright (C) 2019 ORGANIZATION # Copyright (C) 2019 ORGANIZATION
# This file is distributed under the same license as the PROJECT project. # This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. # FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
@ -7,17 +7,16 @@ 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-14 11:13+0100\n"
"PO-Revision-Date: 2019-08-28 12:55+0000\n" "PO-Revision-Date: 2019-08-28 12:55+0000\n"
"Last-Translator: Stepan Henek <stepan+github@henek.name>\n" "Last-Translator: Stepan Henek <stepan+github@henek.name>\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
@ -48,7 +47,31 @@ msgstr "Tohle není platná MAC adresa."
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 ""
#: 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/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 ""
"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 +89,13 @@ 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 ""
#~ msgid "Settings were successfully saved."
#~ msgstr "Nastavení bylo úspěšně uloženo."
#~ msgid "Settings update was failed."
#~ msgstr "Ukládání nastavení selhalo."
#: 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-14 11:13+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,31 @@ 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/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 +86,13 @@ 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 ""

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-14 11:13+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,31 @@ 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/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 +86,13 @@ 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 ""

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-14 11:13+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,31 @@ 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/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 +86,13 @@ 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 ""

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-14 11:13+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,31 @@ 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/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 +86,13 @@ 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 ""

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-14 11:13+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,31 @@ 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/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 +86,13 @@ 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 ""

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-14 11:13+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,31 @@ 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/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 +86,13 @@ 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 ""

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-14 11:13+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,31 @@ 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/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 +85,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-14 11:13+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,31 @@ 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/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 +86,13 @@ 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 ""

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-14 11:13+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,31 @@ 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/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 +87,13 @@ 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 ""

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-14 11:13+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,31 @@ 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/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 +86,13 @@ 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 ""

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-14 11:13+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,31 @@ 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/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 +86,13 @@ 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 ""

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-14 11:13+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,31 @@ 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/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 +86,13 @@ 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 ""

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-14 11:13+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,31 @@ 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/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 +86,13 @@ 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 ""

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-14 11:13+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,31 @@ 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/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 +87,13 @@ 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 ""

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-14 11:13+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,31 @@ 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/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 +86,13 @@ 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 ""

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-14 11:13+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,31 @@ 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/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 +86,13 @@ 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 ""

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-14 11:13+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,31 @@ 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/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 +86,13 @@ 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 ""

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-14 11:13+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,31 @@ 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/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 +87,13 @@ 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 ""

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-14 11:13+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,31 @@ 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/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 +87,13 @@ 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 ""

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-14 11:13+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,31 @@ 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/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 +87,13 @@ 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 ""

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-14 11:13+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,31 @@ 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/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 +86,13 @@ 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 ""

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-14 11:13+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,31 @@ 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/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 +86,13 @@ 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 ""