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

Compare commits

...

64 Commits

Author SHA1 Message Date
30fd6f91b4 Merge branch 'dev' into 'master'
Dev

See merge request turris/reforis/foris-js!256
2024-11-13 14:24:26 +01:00
5a53eca138 Merge branch 'bump-650' into 'dev'
Bump v6.5.0

See merge request turris/reforis/foris-js!255
2024-11-13 14:14:04 +01:00
8d2a4dc108 Bump v6.5.0
* Add & update Weblate translations
* Add RichTable component with pagination and sorting
* Add @tanstack/react-table v8.20.5 to dependencies
* Update documentation
* Replace RebootButton with ActionButtonWithModal component
* Fix import path for CustomizationContextMock in customTestRender.js
2024-11-13 14:08:53 +01:00
2481a0c025 Update translation messages 2024-11-13 14:08:12 +01:00
71697424c5 Create translation messages 2024-11-13 14:07:26 +01:00
07f8e3b9de Merge branch 'add-action-btn-with-modal' into 'dev'
Replace RebootButton with ActionButtonWithModal component and update documentation

See merge request turris/reforis/foris-js!254
2024-11-12 17:48:20 +01:00
c9f2b24095 Replace RebootButton with ActionButtonWithModal component and update documentation 2024-11-12 17:39:01 +01:00
087ecfa670 Merge branch 'add-tanstack-and-richtable-component' into 'dev'
Add RichTable component

See merge request turris/reforis/foris-js!253
2024-11-08 23:52:53 +01:00
e6365ecac4 Update Snapshots 2024-11-08 17:59:15 +01:00
e57722caa0 Add RebootButton and RichTable components to documentation 2024-11-08 17:59:15 +01:00
babdf92ddd Fix import path for CustomizationContextMock in customTestRender.js 2024-11-08 17:59:02 +01:00
42294316d9 Add RichTable component with header, body, and pagination 2024-11-08 17:59:02 +01:00
b65e034b04 Add @tanstack/react-table v8.20.5 to dependencies 2024-11-04 22:27:14 +01:00
14b90bbbd4 Merge branch 'dev' into 'master'
Dev

See merge request turris/reforis/foris-js!251
2024-10-02 14:35:17 +02:00
85b207b1dd Merge branch 'bump-version-640' into 'dev'
Bump v6.4.0

See merge request turris/reforis/foris-js!250
2024-10-02 14:31:57 +02:00
79e61d9507 Bump v6.4.0
* Refactor Alert component to include dismiss animation and timeout
* Refactor ThreeDotsMenu component to include additional props
2024-10-02 14:30:09 +02:00
6795c3941b Merge branch 'add-alert-animation-and-timeout' into 'dev'
Add Alert animation and timeout

See merge request turris/reforis/foris-js!249
2024-10-02 13:48:31 +02:00
969e8e6411 Update Snapshots 2024-10-02 13:16:45 +02:00
0099759279 Fix tests 2024-10-02 13:16:37 +02:00
87c81a2a2d Refactor Alert component to include dismiss animation and timeout 2024-10-02 13:14:48 +02:00
81b71f8153 Refactor ThreeDotsMenu component to include additional props 2024-10-02 13:14:40 +02:00
c0fd0adbc9 Merge branch 'dev' into 'master'
Dev

See merge request turris/reforis/foris-js!248
2024-09-27 15:48:49 +02:00
1ec0a26199 Merge branch 'bump-version-630' into 'dev'
Bump v6.3.0

See merge request turris/reforis/foris-js!247
2024-09-27 15:39:42 +02:00
76e37b738a Bump v6.3.0
* Add ThreeDotsMenu component
* Refactor EmailInput description
* Refactor RadioSet & ignore Radio component
* Refactor npm package badge in introduction.md
* NPM audit fix
2024-09-27 15:36:10 +02:00
8a69d14429 NPM audit fix 2024-09-27 15:35:45 +02:00
4d5395c826 Add ThreeDotsMenu component to index.js 2024-09-27 15:29:46 +02:00
1fb83e08ea Merge branch 'add-threedotsmenu-component' into 'dev'
Add ThreeDotsMenu component

See merge request turris/reforis/foris-js!246
2024-09-27 15:17:55 +02:00
e6cfc6dbb0 docs: Refactor npm package badge in introduction.md 2024-09-27 15:13:29 +02:00
a93a64bf96 docs: Refactor EmailInput description 2024-09-27 15:13:28 +02:00
1ab77decfd docs: Refactor RadioSet & ignore Radio component 2024-09-27 15:13:28 +02:00
b6e1e0adae Add ThreeDotsMenu component
ThreeDotsMenu Bootstrap component is a dropdown menu
that appears when the user clicks on three dots.

It is used to display a list of actions that can be
performed on a particular item.
2024-09-27 15:13:12 +02:00
a7a4e76cd1 Merge branch 'dev' into 'master'
Dev

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

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

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

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

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

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

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

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

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

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

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

See merge request turris/reforis/foris-js!236
2024-08-30 16:03:17 +02:00
c86e2c8944 Merge branch 'bump-611' into 'dev'
Bump v6.1.1

See merge request turris/reforis/foris-js!235
2024-08-30 16:00:56 +02:00
b96ccde81c Bump v6.1.1
* Add & updated Weblate translations
* Update icon color classes to use "text-secondary" instead of "text-dark"
* Update Wi-Fi QRCodeModal component to use new styles & add close button
* Refactore WiFiGuestForm component to get rid of obsolete div element
* NPM audit fix
2024-08-30 15:56:08 +02:00
cfa6eade17 NPM audit fix 2024-08-30 15:51:23 +02:00
380a388a38 Merge branch 'fix-icons-color' into 'dev'
Update icon color classes & refactoring

See merge request turris/reforis/foris-js!233
2024-08-30 15:49:45 +02:00
cc19b4b293 Update Snapshots 2024-08-30 15:46:45 +02:00
e7ec494bb2 Update Wi-Fi QRCodeModal component to use new button styles & add close button 2024-08-30 15:46:45 +02:00
ea590e443c Refactor WiFiGuestForm component to get rid of obsolete "input-group-append" div element 2024-08-30 15:46:45 +02:00
b127bf5edf Update icon color classes to use "text-secondary" instead of "text-dark" 2024-08-30 15:46:45 +02:00
40e4a9a4e3 Merge branch 'update-translations' into 'dev'
Add & update Weblate translations

See merge request turris/reforis/foris-js!234
2024-08-30 15:44:51 +02:00
bcb7c43863 Translated using Weblate (Spanish)
Currently translated at 100.0% (71 of 71 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/es/
2024-08-24 15:09:22 +02:00
60 changed files with 3336 additions and 965 deletions

View File

@ -8,6 +8,77 @@ and this project adheres to
## [Unreleased]
## [6.5.0] - 2024-11-13
### Added
- Added & updated Weblate translations
- Added RichTable component with pagination and sorting
- Added @tanstack/react-table v8.20.5 to dependencies
### Changed
- Updated documentation
- Replaced RebootButton with ActionButtonWithModal component
- Fixed import path for CustomizationContextMock in customTestRender.js
## [6.4.0] - 2024-10-02
### Changed
- Refactored Alert component to include dismiss animation and timeout
- Refactored ThreeDotsMenu component to include additional props
## [6.3.0] - 2024-09-27
### Added
- Added ThreeDotsMenu component
### Changed
- Refactored EmailInput description
- Refactored RadioSet & ignore Radio component
- Refactored npm package badge in introduction.md
- NPM audit fix
## [6.2.1] - 2024-09-25
### Added
- Added & updated Weblate translations
### Changed
- Refactored CopyInput component
- Refactored ForisURLs to include new URLs for Overview page
## [6.2.0] - 2024-09-20
### Added
- Added useFocusTrap hook
- Added extendSession endpoint
### Changed
- Refactored Spinner.css to use CSS variable for color
- Refactored Modal component to use useFocusTrap hook
- Refactored Alert component to use useFocusTrap hook
## [6.1.1] - 2024-08-30
### Added
- Added & updated Weblate translations
### Changed
- Updated icon color classes to use "text-secondary" instead of "text-dark"
- Updated Wi-Fi QRCodeModal component to use new styles & added close button
- Refactored WiFiGuestForm component to get rid of obsolete div element
- NPM audit fix
## [6.1.0] - 2024-08-23
### Added
@ -348,7 +419,13 @@ and this project adheres to
## [0.0.7] - 2019-09-02
[unreleased]:
https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.1.0...master
https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.5.0...dev
[6.5.0]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.4.0...v6.5.0
[6.4.0]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.3.0...v6.4.0
[6.3.0]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.2.1...v6.3.0
[6.2.1]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.2.0...v6.2.1
[6.2.0]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.1.1...v6.2.0
[6.1.1]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.1.0...v6.1.1
[6.1.0]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.0.3...v6.1.0
[6.0.3]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.0.2...v6.0.3
[6.0.2]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.0.1...v6.0.2

View File

@ -33,5 +33,4 @@ To install a specific version:
npm install foris@version
```
<a target="_blank" href="https://www.npmjs.com/package/foris">Check
on<img width="100px" src="./docs/forisjs-npm.svg"></a>
[![npm version](https://badge.fury.io/js/foris.svg)](https://badge.fury.io/js/foris)

367
package-lock.json generated
View File

@ -1,18 +1,19 @@
{
"name": "foris",
"version": "6.1.0",
"version": "6.5.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "foris",
"version": "6.1.0",
"version": "6.5.0",
"license": "GPL-3.0",
"dependencies": {
"@fortawesome/fontawesome-svg-core": "^6.6.0",
"@fortawesome/free-regular-svg-icons": "^6.6.0",
"@fortawesome/free-solid-svg-icons": "^6.6.0",
"@fortawesome/react-fontawesome": "^0.2.2",
"@tanstack/react-table": "^8.20.5",
"axios": "^1.7.2",
"immutability-helper": "^3.1.1",
"moment": "^2.30.1",
@ -3583,6 +3584,39 @@
"@sinonjs/commons": "^3.0.0"
}
},
"node_modules/@tanstack/react-table": {
"version": "8.20.5",
"resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.5.tgz",
"integrity": "sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==",
"license": "MIT",
"dependencies": {
"@tanstack/table-core": "8.20.5"
},
"engines": {
"node": ">=12"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/tannerlinsley"
},
"peerDependencies": {
"react": ">=16.8",
"react-dom": ">=16.8"
}
},
"node_modules/@tanstack/table-core": {
"version": "8.20.5",
"resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.20.5.tgz",
"integrity": "sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==",
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/tannerlinsley"
}
},
"node_modules/@testing-library/dom": {
"version": "5.6.1",
"resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-5.6.1.tgz",
@ -3722,21 +3756,13 @@
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz",
"integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
"@types/estree": "*",
"@types/json-schema": "*"
}
},
"node_modules/@types/eslint-scope": {
"version": "3.7.3",
"resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
"integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
"dev": true,
"dependencies": {
"@types/eslint": "*",
"@types/estree": "*"
}
},
"node_modules/@types/estree": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
@ -5025,10 +5051,11 @@
}
},
"node_modules/body-parser": {
"version": "1.20.2",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
"integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
"version": "1.20.3",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
"integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
"dev": true,
"license": "MIT",
"dependencies": {
"bytes": "3.1.2",
"content-type": "~1.0.5",
@ -5038,7 +5065,7 @@
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
"qs": "6.11.0",
"qs": "6.13.0",
"raw-body": "2.5.2",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
@ -5053,6 +5080,7 @@
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
@ -5062,6 +5090,7 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
@ -5070,7 +5099,8 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
"dev": true,
"license": "MIT"
},
"node_modules/bonjour-service": {
"version": "1.2.1",
@ -5910,6 +5940,7 @@
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
"integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
@ -6548,6 +6579,7 @@
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
@ -6566,6 +6598,7 @@
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8",
"npm": "1.2.8000 || >= 1.4.16"
@ -6686,7 +6719,8 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
"dev": true
"dev": true,
"license": "MIT"
},
"node_modules/electron-to-chromium": {
"version": "1.4.792",
@ -6722,19 +6756,21 @@
}
},
"node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
"integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/enhanced-resolve": {
"version": "5.17.0",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz",
"integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==",
"version": "5.17.1",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
"integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.4",
"tapable": "^2.2.0"
@ -6748,6 +6784,7 @@
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
@ -7915,6 +7952,7 @@
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
@ -8042,37 +8080,38 @@
}
},
"node_modules/express": {
"version": "4.19.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
"integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz",
"integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==",
"dev": true,
"license": "MIT",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
"body-parser": "1.20.2",
"body-parser": "1.20.3",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
"cookie": "0.6.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "1.2.0",
"finalhandler": "1.3.1",
"fresh": "0.5.2",
"http-errors": "2.0.0",
"merge-descriptors": "1.0.1",
"merge-descriptors": "1.0.3",
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"path-to-regexp": "0.1.10",
"proxy-addr": "~2.0.7",
"qs": "6.11.0",
"qs": "6.13.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
"send": "0.18.0",
"serve-static": "1.15.0",
"send": "0.19.0",
"serve-static": "1.16.2",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"type-is": "~1.6.18",
@ -8099,10 +8138,11 @@
"dev": true
},
"node_modules/express/node_modules/path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
"dev": true
"version": "0.1.10",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
"integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==",
"dev": true,
"license": "MIT"
},
"node_modules/express/node_modules/safe-buffer": {
"version": "5.2.1",
@ -8278,13 +8318,14 @@
}
},
"node_modules/finalhandler": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
"integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
"integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
@ -8300,6 +8341,7 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
@ -8308,7 +8350,8 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
"dev": true,
"license": "MIT"
},
"node_modules/find-cache-dir": {
"version": "3.3.1",
@ -8685,6 +8728,7 @@
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
@ -9258,6 +9302,7 @@
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"depd": "2.0.0",
"inherits": "2.0.4",
@ -9372,6 +9417,7 @@
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"dev": true,
"license": "MIT",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
},
@ -13718,6 +13764,7 @@
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
@ -13735,10 +13782,14 @@
}
},
"node_modules/merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
"dev": true
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
"integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/merge-stream": {
"version": "2.0.0",
@ -13785,10 +13836,11 @@
}
},
"node_modules/micromatch": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
"integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
"license": "MIT",
"dependencies": {
"braces": "^3.0.3",
"picomatch": "^2.3.1"
@ -13802,6 +13854,7 @@
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"dev": true,
"license": "MIT",
"bin": {
"mime": "cli.js"
},
@ -14218,6 +14271,7 @@
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
"dev": true,
"license": "MIT",
"dependencies": {
"ee-first": "1.1.1"
},
@ -14539,10 +14593,11 @@
"dev": true
},
"node_modules/path-to-regexp": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
"integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz",
"integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==",
"dev": true,
"license": "MIT",
"dependencies": {
"isarray": "0.0.1"
}
@ -15010,12 +15065,13 @@
}
},
"node_modules/qs": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"version": "6.13.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
"integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"side-channel": "^1.0.4"
"side-channel": "^1.0.6"
},
"engines": {
"node": ">=0.6"
@ -15082,6 +15138,7 @@
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
"integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
"dev": true,
"license": "MIT",
"dependencies": {
"bytes": "3.1.2",
"http-errors": "2.0.0",
@ -15097,6 +15154,7 @@
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
@ -15469,7 +15527,6 @@
"version": "16.9.0",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.9.0.tgz",
"integrity": "sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ==",
"dev": true,
"dependencies": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1",
@ -16223,7 +16280,6 @@
"version": "0.15.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.15.0.tgz",
"integrity": "sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg==",
"dev": true,
"dependencies": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1"
@ -16276,10 +16332,11 @@
}
},
"node_modules/send": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
"integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
"version": "0.19.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
"integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "2.6.9",
"depd": "2.0.0",
@ -16304,6 +16361,7 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
@ -16312,13 +16370,25 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
"dev": true,
"license": "MIT"
},
"node_modules/send/node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/send/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true
"dev": true,
"license": "MIT"
},
"node_modules/serialize-javascript": {
"version": "6.0.2",
@ -16408,15 +16478,16 @@
}
},
"node_modules/serve-static": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
"integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
"version": "1.16.2",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
"integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
"dev": true,
"license": "MIT",
"dependencies": {
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.18.0"
"send": "0.19.0"
},
"engines": {
"node": ">= 0.8.0"
@ -16458,7 +16529,8 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
"dev": true
"dev": true,
"license": "ISC"
},
"node_modules/shell-quote": {
"version": "1.8.1",
@ -16679,6 +16751,7 @@
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
@ -17200,6 +17273,7 @@
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.6"
}
@ -17326,6 +17400,7 @@
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"dev": true,
"license": "MIT",
"dependencies": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
@ -17583,6 +17658,7 @@
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
@ -17822,13 +17898,12 @@
}
},
"node_modules/webpack": {
"version": "5.92.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz",
"integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==",
"version": "5.94.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz",
"integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/eslint-scope": "^3.7.3",
"@types/estree": "^1.0.5",
"@webassemblyjs/ast": "^1.12.1",
"@webassemblyjs/wasm-edit": "^1.12.1",
@ -17837,7 +17912,7 @@
"acorn-import-attributes": "^1.9.5",
"browserslist": "^4.21.10",
"chrome-trace-event": "^1.0.2",
"enhanced-resolve": "^5.17.0",
"enhanced-resolve": "^5.17.1",
"es-module-lexer": "^1.2.1",
"eslint-scope": "5.1.1",
"events": "^3.2.0",
@ -21059,6 +21134,19 @@
"@sinonjs/commons": "^3.0.0"
}
},
"@tanstack/react-table": {
"version": "8.20.5",
"resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.5.tgz",
"integrity": "sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==",
"requires": {
"@tanstack/table-core": "8.20.5"
}
},
"@tanstack/table-core": {
"version": "8.20.5",
"resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.20.5.tgz",
"integrity": "sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg=="
},
"@testing-library/dom": {
"version": "5.6.1",
"resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-5.6.1.tgz",
@ -21181,21 +21269,13 @@
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz",
"integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"@types/estree": "*",
"@types/json-schema": "*"
}
},
"@types/eslint-scope": {
"version": "3.7.3",
"resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
"integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
"dev": true,
"requires": {
"@types/eslint": "*",
"@types/estree": "*"
}
},
"@types/estree": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
@ -22293,9 +22373,9 @@
"dev": true
},
"body-parser": {
"version": "1.20.2",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
"integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
"version": "1.20.3",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
"integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
"dev": true,
"requires": {
"bytes": "3.1.2",
@ -22306,7 +22386,7 @@
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
"qs": "6.11.0",
"qs": "6.13.0",
"raw-body": "2.5.2",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
@ -23531,15 +23611,15 @@
"dev": true
},
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
"integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
"dev": true
},
"enhanced-resolve": {
"version": "5.17.0",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz",
"integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==",
"version": "5.17.1",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
"integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
"dev": true,
"requires": {
"graceful-fs": "^4.2.4",
@ -24506,37 +24586,37 @@
}
},
"express": {
"version": "4.19.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
"integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz",
"integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==",
"dev": true,
"requires": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
"body-parser": "1.20.2",
"body-parser": "1.20.3",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
"cookie": "0.6.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "1.2.0",
"finalhandler": "1.3.1",
"fresh": "0.5.2",
"http-errors": "2.0.0",
"merge-descriptors": "1.0.1",
"merge-descriptors": "1.0.3",
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"path-to-regexp": "0.1.10",
"proxy-addr": "~2.0.7",
"qs": "6.11.0",
"qs": "6.13.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
"send": "0.18.0",
"serve-static": "1.15.0",
"send": "0.19.0",
"serve-static": "1.16.2",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"type-is": "~1.6.18",
@ -24560,9 +24640,9 @@
"dev": true
},
"path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
"version": "0.1.10",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
"integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==",
"dev": true
},
"safe-buffer": {
@ -24697,13 +24777,13 @@
}
},
"finalhandler": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
"integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
"integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
"dev": true,
"requires": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
@ -28806,9 +28886,9 @@
}
},
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
"integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
"dev": true
},
"merge-stream": {
@ -28840,9 +28920,9 @@
}
},
"micromatch": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
"integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
"requires": {
"braces": "^3.0.3",
@ -29391,9 +29471,9 @@
"dev": true
},
"path-to-regexp": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
"integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz",
"integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==",
"dev": true,
"requires": {
"isarray": "0.0.1"
@ -29725,12 +29805,12 @@
"requires": {}
},
"qs": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"version": "6.13.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
"integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
"dev": true,
"requires": {
"side-channel": "^1.0.4"
"side-channel": "^1.0.6"
}
},
"qss": {
@ -30048,7 +30128,6 @@
"version": "16.9.0",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.9.0.tgz",
"integrity": "sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ==",
"dev": true,
"requires": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1",
@ -30613,7 +30692,6 @@
"version": "0.15.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.15.0.tgz",
"integrity": "sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg==",
"dev": true,
"requires": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1"
@ -30653,9 +30731,9 @@
"dev": true
},
"send": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
"integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
"version": "0.19.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
"integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
"dev": true,
"requires": {
"debug": "2.6.9",
@ -30690,6 +30768,12 @@
}
}
},
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"dev": true
},
"ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@ -30776,15 +30860,15 @@
}
},
"serve-static": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
"integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
"version": "1.16.2",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
"integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
"dev": true,
"requires": {
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.18.0"
"send": "0.19.0"
}
},
"set-function-length": {
@ -31815,12 +31899,11 @@
"dev": true
},
"webpack": {
"version": "5.92.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz",
"integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==",
"version": "5.94.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz",
"integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==",
"dev": true,
"requires": {
"@types/eslint-scope": "^3.7.3",
"@types/estree": "^1.0.5",
"@webassemblyjs/ast": "^1.12.1",
"@webassemblyjs/wasm-edit": "^1.12.1",
@ -31829,7 +31912,7 @@
"acorn-import-attributes": "^1.9.5",
"browserslist": "^4.21.10",
"chrome-trace-event": "^1.0.2",
"enhanced-resolve": "^5.17.0",
"enhanced-resolve": "^5.17.1",
"es-module-lexer": "^1.2.1",
"eslint-scope": "5.1.1",
"events": "^3.2.0",

View File

@ -1,6 +1,6 @@
{
"name": "foris",
"version": "6.1.0",
"version": "6.5.0",
"description": "Foris JS library is a set of components and utils for reForis application and plugins.",
"author": "CZ.NIC, z.s.p.o.",
"repository": {
@ -18,6 +18,7 @@
"@fortawesome/free-regular-svg-icons": "^6.6.0",
"@fortawesome/free-solid-svg-icons": "^6.6.0",
"@fortawesome/react-fontawesome": "^0.2.2",
"@tanstack/react-table": "^8.20.5",
"axios": "^1.7.2",
"immutability-helper": "^3.1.1",
"moment": "^2.30.1",

View File

@ -5,10 +5,12 @@
* See /LICENSE for more information.
*/
import React from "react";
import React, { useRef, useEffect, useState } from "react";
import PropTypes from "prop-types";
import { useFocusTrap } from "../utils/hooks";
export const ALERT_TYPES = Object.freeze({
PRIMARY: "primary",
SECONDARY: "secondary",
@ -37,17 +39,37 @@ Alert.defaultProps = {
};
function Alert({ type, onDismiss, children }) {
const alertRef = useRef();
const [isVisible, setIsVisible] = useState(true);
useFocusTrap(alertRef, !!onDismiss);
useEffect(() => {
if (onDismiss) {
const timeout = setTimeout(() => setIsVisible(false), 7000);
return () => clearTimeout(timeout);
}
}, [onDismiss]);
const handleAnimationEnd = () => {
if (!isVisible && onDismiss) {
onDismiss();
}
};
return (
<div
className={`alert alert-${type} ${
ref={alertRef}
className={`alert alert-${type} ${isVisible ? "alert-fade-in" : "alert-slide-out-top"} ${
onDismiss ? "alert-dismissible" : ""
}`.trim()}
role="alert"
onAnimationEnd={handleAnimationEnd}
>
{onDismiss && (
<button
type="button"
className="btn-close"
onClick={onDismiss}
onClick={() => setIsVisible(false)}
aria-label={_("Close")}
/>
)}

View File

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

View File

@ -6,6 +6,7 @@ All additional `props` are passed to the `<input type="email">` HTML component.
```js
import { useState } from "react";
import Button from "./Button";
const [email, setEmail] = useState("Wrong email");
<form onSubmit={(e) => e.preventDefault()}>
<EmailInput
@ -14,6 +15,6 @@ const [email, setEmail] = useState("Wrong email");
helpText="Read the small text!"
onChange={(event) => setEmail(event.target.value)}
/>
<button type="submit">Try to submit</button>
<Button type="submit">Try to submit</Button>
</form>;
```

View File

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

View File

@ -49,7 +49,7 @@ function PasswordInput({ withEye, newPass, ...props }) {
<FontAwesomeIcon
icon={isHidden ? faEye : faEyeSlash}
style={{ width: "1.25rem" }}
className="text-dark"
className="text-secondary"
/>
</button>
)}

48
src/bootstrap/Radio.js Normal file
View File

@ -0,0 +1,48 @@
/*
* Copyright (C) 2024 CZ.NIC z.s.p.o. (https://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import React from "react";
import PropTypes from "prop-types";
Radio.propTypes = {
label: PropTypes.oneOfType([
PropTypes.string,
PropTypes.element,
PropTypes.node,
PropTypes.arrayOf(PropTypes.node),
]).isRequired,
id: PropTypes.string.isRequired,
inline: PropTypes.bool,
helpText: PropTypes.string,
className: PropTypes.string,
};
function Radio({ label, id, helpText, inline, className, ...props }) {
return (
<div
className={`${className || "mb-3"} ${inline ? "form-check form-check-inline" : ""}`.trim()}
>
<input
id={id}
className="form-check-input me-2"
type="radio"
{...props}
/>
<label className="form-check-label" htmlFor={id}>
{label}
{helpText && (
<div className="form-text">
<small>{helpText}</small>
</div>
)}
</label>
</div>
);
}
export default Radio;

View File

@ -10,6 +10,8 @@ import React from "react";
import PropTypes from "prop-types";
import { useUID } from "react-uid";
import Radio from "./Radio";
RadioSet.propTypes = {
/** Name attribute of the input HTML tag. */
name: PropTypes.string.isRequired,
@ -73,40 +75,4 @@ function RadioSet({ name, label, choices, value, helpText, inline, ...props }) {
);
}
Radio.propTypes = {
label: PropTypes.oneOfType([
PropTypes.string,
PropTypes.element,
PropTypes.node,
PropTypes.arrayOf(PropTypes.node),
]).isRequired,
id: PropTypes.string.isRequired,
inline: PropTypes.bool,
helpText: PropTypes.string,
className: PropTypes.string,
};
export function Radio({ label, id, helpText, inline, className, ...props }) {
return (
<div
className={`${className || "mb-3"} ${inline ? "form-check form-check-inline" : ""}`.trim()}
>
<input
id={id}
className="form-check-input me-2"
type="radio"
{...props}
/>
<label className="form-check-label" htmlFor={id}>
{label}
{helpText && (
<div className="form-text">
<small>{helpText}</small>
</div>
)}
</label>
</div>
);
}
export default RadioSet;

View File

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

View File

@ -0,0 +1,42 @@
/*
* Copyright (C) 2024 CZ.NIC z.s.p.o. (https://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import React from "react";
import { faEllipsisVertical } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import PropTypes from "prop-types";
import Button from "./Button";
ThreeDotsMenu.propTypes = {
/** Menu items. */
children: PropTypes.arrayOf(PropTypes.node).isRequired,
};
function ThreeDotsMenu({ children, ...props }) {
return (
<div className="dropdown position-static" {...props}>
<Button
className="btn-sm btn-link text-body"
data-bs-toggle="dropdown"
aria-expanded="false"
>
<FontAwesomeIcon icon={faEllipsisVertical} />
</Button>
<ul className="dropdown-menu">
{children.map((child) => (
<li key={child.key || child.props.id || Math.random()}>
{child}
</li>
))}
</ul>
</div>
);
}
export default ThreeDotsMenu;

View File

@ -0,0 +1,40 @@
ThreeDotsMenu Bootstrap component is a dropdown menu that appears when the user
clicks on three dots. It is used to display a list of actions that can be
performed on a particular item.
```js
import { useState } from "react";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faEdit, faTrash } from "@fortawesome/free-solid-svg-icons";
const threeDotsMenuItems = [
{
text: "Edit",
icon: faEdit,
onClick: () => {
alert("Edit clicked");
},
},
{
text: "Delete",
icon: faTrash,
onClick: () => {
alert("Delete clicked");
},
},
];
<ThreeDotsMenu>
{threeDotsMenuItems.map((item, index) => (
<button key={index} onClick={item.onClick} className="dropdown-item">
<FontAwesomeIcon
icon={item.icon}
className="me-1"
width="1rem"
size="sm"
/>
{item.text}
</button>
))}
</ThreeDotsMenu>;
```

View File

@ -0,0 +1,135 @@
/*
* Copyright (C) 2019-2024 CZ.NIC z.s.p.o. (https://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import React, { useState, useEffect } from "react";
import PropTypes from "prop-types";
import { useAPIPost } from "../../api/hooks";
import { API_STATE } from "../../api/utils";
import Button from "../../bootstrap/Button";
import {
Modal,
ModalHeader,
ModalBody,
ModalFooter,
} from "../../bootstrap/Modal";
import { useAlert } from "../../context/alertContext/AlertContext";
ActionButtonWithModal.propTypes = {
/** Component that triggers the action. */
actionTrigger: PropTypes.elementType.isRequired,
/** URL to send the action to. */
actionUrl: PropTypes.string.isRequired,
/** Title of the modal. */
modalTitle: PropTypes.string.isRequired,
/** Message of the modal. */
modalMessage: PropTypes.string.isRequired,
/** Text of the action button in the modal. */
modalActionText: PropTypes.string,
/** Props for the action button in the modal. */
modalActionProps: PropTypes.object,
/** Message to display on successful action. */
successMessage: PropTypes.string,
/** Message to display on failed action. */
errorMessage: PropTypes.string,
};
function ActionButtonWithModal({
actionTrigger: ActionTriggerComponent,
actionUrl,
modalTitle,
modalMessage,
modalActionText,
modalActionProps,
successMessage,
errorMessage,
}) {
const [triggered, setTriggered] = useState(false);
const [modalShown, setModalShown] = useState(false);
const [triggerActionStatus, triggerAction] = useAPIPost(actionUrl);
const [setAlert] = useAlert();
useEffect(() => {
if (triggerActionStatus.state === API_STATE.SUCCESS) {
setAlert(
successMessage || _("Action successful."),
API_STATE.SUCCESS
);
}
if (triggerActionStatus.state === API_STATE.ERROR) {
setAlert(errorMessage || _("Action failed."));
}
}, [triggerActionStatus, setAlert, successMessage, errorMessage]);
const actionHandler = () => {
setTriggered(true);
triggerAction();
setModalShown(false);
};
return (
<>
<ActionModal
shown={modalShown}
setShown={setModalShown}
onAction={actionHandler}
title={modalTitle}
message={modalMessage}
actionText={modalActionText}
actionProps={modalActionProps}
/>
<ActionTriggerComponent
loading={triggered}
disabled={triggered}
onClick={() => setModalShown(true)}
/>
</>
);
}
ActionModal.propTypes = {
shown: PropTypes.bool.isRequired,
setShown: PropTypes.func.isRequired,
onAction: PropTypes.func.isRequired,
title: PropTypes.string.isRequired,
message: PropTypes.string.isRequired,
actionText: PropTypes.string,
actionProps: PropTypes.object,
};
function ActionModal({
shown,
setShown,
onAction,
title,
message,
actionText,
actionProps,
}) {
return (
<Modal shown={shown} setShown={setShown}>
<ModalHeader setShown={setShown} title={title} />
<ModalBody>
<p className="mb-0">{message}</p>
</ModalBody>
<ModalFooter>
<Button
className="btn-secondary"
onClick={() => setShown(false)}
>
{_("Cancel")}
</Button>
<Button onClick={onAction} {...actionProps}>
{actionText || _("Confirm")}
</Button>
</ModalFooter>
</Modal>
);
}
export default ActionButtonWithModal;

View File

@ -0,0 +1,39 @@
RebootButton component is a button that opens a modal dialog to confirm the
reboot of the device.
## Usage
```jsx
import React, { useEffect, createContext } from "react";
import Button from "../../bootstrap/Button";
import { AlertContextProvider } from "../../context/alertContext/AlertContext";
import ActionButtonWithModal from "./ActionButtonWithModal";
window.AlertContext = React.createContext();
const RebootButtonExample = () => {
const ActionButton = (props) => {
return <Button {...props}>Action</Button>;
};
return (
<AlertContextProvider>
<div id="modal-container" />
<div id="alert-container" />
<ActionButtonWithModal
actionTrigger={ActionButton}
actionUrl="/reforis/api/action"
modalTitle="Warning!"
modalMessage="Are you sure you want to perform this action?"
modalActionText="Confirm action"
modalActionProps={{ className: "btn-danger" }}
successMessage="Action request succeeded."
errorMessage="Action request failed."
/>
</AlertContextProvider>
);
};
<RebootButtonExample />;
```

View File

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

View File

@ -0,0 +1,84 @@
/*
* Copyright (C) 2019-2024 CZ.NIC z.s.p.o. (https://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import React, { useMemo, useState } from "react";
import {
flexRender,
getCoreRowModel,
getSortedRowModel,
getPaginationRowModel,
useReactTable,
} from "@tanstack/react-table";
import PropTypes from "prop-types";
import RichTableBody from "./RichTableBody";
import RichTableHeader from "./RichTableHeader";
import RichTablePagination from "./RichTablePagination";
const fallbackData = [];
RichTable.propTypes = {
/** Columns to be displayed in the table */
columns: PropTypes.array.isRequired,
/** Data to be displayed in the table */
data: PropTypes.array.isRequired,
/** Whether to display pagination */
withPagination: PropTypes.bool,
/** Number of rows per page */
pageSize: PropTypes.number,
/** Index of the current page */
pageIndex: PropTypes.number,
};
function RichTable({
columns,
data,
withPagination,
pageSize = 5,
pageIndex = 0,
}) {
const tableColumns = useMemo(() => columns, [columns]);
const [tableData] = useState(data ?? fallbackData);
const [sorting, setSorting] = useState([]);
const [pagination, setPagination] = useState({
pageIndex,
pageSize,
});
const table = useReactTable({
data: tableData,
columns: tableColumns,
getCoreRowModel: getCoreRowModel(),
getSortedRowModel: getSortedRowModel(),
getPaginationRowModel: getPaginationRowModel(),
onPaginationChange: setPagination,
onSortingChange: setSorting,
state: {
sorting,
pagination,
},
});
return (
<div className="table-responsive">
<table className="table table-hover text-nowrap">
<RichTableHeader table={table} flexRender={flexRender} />
<RichTableBody table={table} flexRender={flexRender} />
</table>
{withPagination && (
<RichTablePagination
table={table}
tablePageSize={pageSize}
allRows={tableData.length}
/>
)}
</div>
);
}
export default RichTable;

View File

@ -0,0 +1,135 @@
### Description
Rich Table is a table component based on
[Tanstack React Table](https://tanstack.com/table/). It adds some features to
the table component, such as:
- **Pagination**: The table can be paginated.
- **Sorting**: The table can be sorted by columns.
- **Row Expansion**: The table rows can be expanded. (To be implemented)
### Example
```js
import RichTable from "./RichTable";
const columns = [
{
header: "Name",
accessorKey: "name",
},
{
header: "Surname",
accessorKey: "surname",
},
{
header: "Age",
accessorKey: "age",
},
{
header: "Phone",
accessorKey: "phone",
},
];
const data = [
{
name: "John",
surname: "Coltrane",
age: 30,
phone: "123456789",
},
{
name: "Jane",
surname: "Doe",
age: 25,
phone: "987654321",
},
{
name: "Alice",
surname: "Smith",
age: 35,
phone: "123456789",
},
{
name: "Bob",
surname: "Smith",
age: 40,
phone: "987654321",
},
{
name: "Charlie",
surname: "Brown",
age: 45,
phone: "123456789",
},
{
name: "Daisy",
surname: "Brown",
age: 50,
phone: "987654321",
},
{
name: "Eve",
surname: "Johnson",
age: 55,
phone: "123456789",
},
{
name: "Frank",
surname: "Johnson",
age: 60,
phone: "987654321",
},
{
name: "Grace",
surname: "Williams",
age: 65,
phone: "123456789",
},
{
name: "Henry",
surname: "Williams",
age: 70,
phone: "987654321",
},
{
name: "Ivy",
surname: "Brown",
age: 75,
phone: "123456789",
},
{
name: "Jack",
surname: "Brown",
age: 80,
phone: "987654321",
},
{
name: "Kelly",
surname: "Johnson",
age: 85,
phone: "123456789",
},
{
name: "Liam",
surname: "Johnson",
age: 90,
phone: "987654321",
},
{
name: "Mia",
surname: "Williams",
age: 95,
phone: "123456789",
},
{
name: "Nathan",
surname: "Williams",
age: 100,
phone: "987654321",
},
];
<RichTable columns={columns} data={data} withPagination />;
```

View File

@ -0,0 +1,48 @@
/*
* Copyright (C) 2019-2024 CZ.NIC z.s.p.o. (https://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import React from "react";
import propTypes from "prop-types";
RichTableBody.propTypes = {
table: propTypes.shape({
getRowModel: propTypes.func.isRequired,
}).isRequired,
flexRender: propTypes.func.isRequired,
};
function RichTableBody({ table, flexRender }) {
return (
<tbody>
{table.getRowModel().rows.map((row) => {
return (
<tr key={row.id} className="align-middle">
{row.getVisibleCells().map((cell) => {
return (
<td
key={cell.id}
{...(cell.column.columnDef.className && {
className:
cell.column.columnDef.className,
})}
>
{flexRender(
cell.column.columnDef.cell,
cell.getContext()
)}
</td>
);
})}
</tr>
);
})}
</tbody>
);
}
export default RichTableBody;

View File

@ -0,0 +1,96 @@
/*
* Copyright (C) 2019-2024 CZ.NIC z.s.p.o. (https://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import React from "react";
import {
faSquareCaretUp,
faSquareCaretDown,
} from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import propTypes from "prop-types";
RichTableHeader.propTypes = {
table: propTypes.shape({
getHeaderGroups: propTypes.func.isRequired,
}).isRequired,
flexRender: propTypes.func.isRequired,
};
function RichTableHeader({ table, flexRender }) {
const getThTitle = (header) => {
if (!header.column.getCanSort()) return undefined;
const nextSortingOrder = header.column.getNextSortingOrder();
if (nextSortingOrder === "asc") return _("Sort ascending");
if (nextSortingOrder === "desc") return _("Sort descending");
return _("Clear sort");
};
return (
<thead className="thead-light">
{table.getHeaderGroups().map((headerGroup) => (
<tr key={headerGroup.id} role="row">
{headerGroup.headers.map((header) => (
<th
key={header.id}
colSpan={header.colSpan}
{...(header.column.columnDef.headerClassName && {
className:
header.column.columnDef.headerClassName,
})}
>
{header.isPlaceholder ||
header.column.columnDef.headerIsHidden ? (
<div className="d-none" aria-hidden="true">
{flexRender(
header.column.columnDef.header,
header.getContext()
)}
</div>
) : (
<button
type="button"
className={`btn btn-link text-decoration-none text-reset fw-bold p-0 d-flex align-items-center
${
header.column.getCanSort()
? "d-flex align-items-center"
: ""
}
`}
onClick={header.column.getToggleSortingHandler()}
title={getThTitle(header)}
>
{flexRender(
header.column.columnDef.header,
header.getContext()
)}
{{
asc: (
<FontAwesomeIcon
icon={faSquareCaretUp}
className="ms-1 text-primary"
/>
),
desc: (
<FontAwesomeIcon
icon={faSquareCaretDown}
className="ms-1 text-primary"
/>
),
}[header.column.getIsSorted()] ?? null}
</button>
)}
</th>
))}
</tr>
))}
</thead>
);
}
export default RichTableHeader;

View File

@ -0,0 +1,128 @@
/*
* Copyright (C) 2019-2024 CZ.NIC z.s.p.o. (https://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import React, { useMemo } from "react";
import {
faAngleLeft,
faAnglesLeft,
faAngleRight,
faAnglesRight,
} from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import propTypes from "prop-types";
RichTablePagination.propTypes = {
table: propTypes.shape({
getState: propTypes.func.isRequired,
getCanPreviousPage: propTypes.func.isRequired,
getCanNextPage: propTypes.func.isRequired,
firstPage: propTypes.func.isRequired,
previousPage: propTypes.func.isRequired,
nextPage: propTypes.func.isRequired,
lastPage: propTypes.func.isRequired,
setPageSize: propTypes.func.isRequired,
getPageCount: propTypes.func.isRequired,
}).isRequired,
tablePageSize: propTypes.number,
allRows: propTypes.number,
};
function RichTablePagination({ table, tablePageSize, allRows }) {
const { pagination } = table.getState();
const prevPagBtnDisabled = !table.getCanPreviousPage();
const nextPagBtnDisabled = !table.getCanNextPage();
const pageSizes = useMemo(() => {
return [tablePageSize ?? 5, 10, 25].filter(
(value, index, self) => self.indexOf(value) === index
);
}, [tablePageSize]);
const renderPaginationButton = (icon, ariaLabel, onClick, disabled) => (
<li
className={`page-item ${disabled ? "disabled" : ""}`}
style={{ cursor: disabled ? "not-allowed" : "pointer" }}
>
<button
type="button"
className="page-link"
aria-label={ariaLabel}
onClick={onClick}
disabled={disabled}
>
<FontAwesomeIcon icon={icon} />
</button>
</li>
);
return (
<nav
aria-label={_("Pagination navigation bar")}
className="d-flex gap-2 justify-content-start align-items-center mx-2 mb-1 text-nowrap"
>
<ul className="pagination pagination-sm mb-0">
{renderPaginationButton(
faAnglesLeft,
_("First page"),
() => table.firstPage(),
prevPagBtnDisabled
)}
{renderPaginationButton(
faAngleLeft,
_("Previous page"),
() => table.previousPage(),
prevPagBtnDisabled
)}
{renderPaginationButton(
faAngleRight,
_("Next page"),
() => table.nextPage(),
nextPagBtnDisabled
)}
{renderPaginationButton(
faAnglesRight,
_("Last page"),
() => table.lastPage(),
nextPagBtnDisabled
)}
</ul>
<span>
{_("Page")}&nbsp;
<span className="fw-bold">
{pagination.pageIndex + 1}
&nbsp;{_("of")}&nbsp;
{table.getPageCount().toLocaleString()}
</span>
</span>
<div
className="vr mx-1 align-self-center"
style={{ height: "1.5rem" }}
/>
<span>{_("Rows per page:")}</span>
<select
className="form-select form-select-sm w-auto"
aria-label={_("Select rows per page")}
value={pagination.pageSize}
onChange={(e) => {
table.setPageSize(Number(e.target.value));
}}
>
{pageSizes.map((pageSize) => (
<option key={pageSize} value={pageSize}>
{pageSize}
</option>
))}
<option key={allRows} value={allRows}>
{_("All")}
</option>
</select>
</nav>
);
}
export default RichTablePagination;

View File

@ -68,14 +68,11 @@ export default function WifiGuestForm({
}))}
{...props}
>
<div className="input-group-append">
<WiFiQRCode
SSID={formData.SSID}
password={formData.password}
/>
</div>
<WiFiQRCode
SSID={formData.SSID}
password={formData.password}
/>
</TextInput>
<PasswordInput
withEye
label={_("Password")}

View File

@ -42,7 +42,7 @@ export default function WiFiQRCode({ SSID, password }) {
icon="fa-solid fa-qrcode"
title={_("Show QR code")}
aria-label={_("Show QR code")}
className="text-dark"
className="text-secondary"
/>
</button>
{modal ? (
@ -70,17 +70,26 @@ function QRCodeModal({ shown, setShown, SSID, password }) {
<ModalHeader setShown={setShown} title={_("Wi-Fi QR Code")} />
<ModalBody>
<QRCode
className="d-block mx-auto img-logo-black"
renderAs="svg"
value={toQRCodeContent(SSID, password)}
level="M"
size={350}
includeMargin
style={{ display: "block", margin: "auto" }}
/>
</ModalBody>
<ModalFooter>
<Button
className="btn-outline-primary"
className="btn-secondary"
onClick={(e) => {
e.preventDefault();
setShown(false);
}}
>
{_("Close")}
</Button>
<Button
className="btn-primary"
onClick={(e) => {
e.preventDefault();
createAndDownloadPdf(SSID, password);

View File

@ -339,7 +339,7 @@ exports[`<WiFiSettings/> Snapshot guest network. 1`] = `
- First value
+ Second value
@@ -524,10 +524,91 @@
@@ -524,10 +524,87 @@
<small>
Enables Wi-Fi for guests, which is separated from LAN network. Devices connected to this network are allowed to access the internet, but aren't allowed to access other devices and the configuration interface of the router. Parameters of the guest network can be set in the Guest network tab.
</small>
@ -363,18 +363,14 @@ exports[`<WiFiSettings/> Snapshot guest network. 1`] = `
+ type="text"
+ value="TestGuestSSID"
+ />
+ <div
+ class="input-group-append"
+ <button
+ class="input-group-text"
+ type="button"
+ >
+ <button
+ class="input-group-text"
+ type="button"
+ >
+ <i
+ class="fa"
+ />
+ </button>
+ </div>
+ <i
+ class="fa"
+ />
+ </button>
+ </div>
+ <div
+ class="form-text"
@ -431,7 +427,7 @@ exports[`<WiFiSettings/> Snapshot guest network. 1`] = `
class="form-check form-switch mb-3 d-flex align-items-center"
>
<input
@@ -550,10 +631,11 @@
@@ -550,10 +627,11 @@
<div
class="text-end"
>

View File

@ -0,0 +1,92 @@
/*
* Copyright (C) 2019-2024 CZ.NIC z.s.p.o. (https://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import React from "react";
import Button from "bootstrap/Button";
import {
fireEvent,
getByText,
queryByText,
render,
wait,
} from "customTestRender";
import mockAxios from "jest-mock-axios";
import { mockJSONError } from "testUtils/network";
import { mockSetAlert } from "testUtils/alertContextMock";
import ActionButtonWithModal from "../ActionButtonWithModal/ActionButtonWithModal";
describe("<ActionButtonWithModal/>", () => {
let componentContainer;
const ActionButton = (props) => (
<Button type="button" {...props}>
Action
</Button>
);
beforeEach(() => {
const { container } = render(
<>
<div id="modal-container" />
<div id="alert-container" />
<ActionButtonWithModal
actionTrigger={ActionButton}
actionUrl="/reforis/api/action"
modalTitle="Warning!"
modalMessage="Are you sure you want to perform this action?"
modalActionText="Confirm action"
modalActionProps={{ className: "btn-danger" }}
successMessage="Action request succeeded."
errorMessage="Action request failed."
/>
</>
);
componentContainer = container;
});
it("Render button.", () => {
expect(componentContainer).toMatchSnapshot();
});
it("Render modal.", () => {
fireEvent.click(getByText(componentContainer, "Action"));
expect(componentContainer).toMatchSnapshot();
});
it("Confirm action.", () => {
fireEvent.click(getByText(componentContainer, "Action"));
fireEvent.click(getByText(componentContainer, "Confirm action"));
expect(mockAxios.post).toHaveBeenCalledWith(
"/reforis/api/action",
undefined,
expect.anything()
);
});
it("Hold error.", async () => {
fireEvent.click(getByText(componentContainer, "Action"));
fireEvent.click(getByText(componentContainer, "Confirm action"));
mockJSONError();
await wait(() =>
expect(mockSetAlert).toBeCalledWith("Action request failed.")
);
});
it("Show success alert on successful action.", async () => {
fireEvent.click(getByText(componentContainer, "Action"));
fireEvent.click(getByText(componentContainer, "Confirm action"));
mockAxios.mockResponse({ status: 200 });
await wait(() =>
expect(mockSetAlert).toBeCalledWith(
"Action request succeeded.",
"success"
)
);
});
});

View File

@ -1,63 +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 {
fireEvent,
getByText,
queryByText,
render,
wait,
} from "customTestRender";
import mockAxios from "jest-mock-axios";
import { mockJSONError } from "testUtils/network";
import { mockSetAlert } from "testUtils/alertContextMock";
import RebootButton from "../RebootButton";
describe("<RebootButton/>", () => {
let componentContainer;
beforeEach(() => {
const { container } = render(
<>
<div id="modal-container" />
<RebootButton />
</>
);
componentContainer = container;
});
it("Render.", () => {
expect(componentContainer).toMatchSnapshot();
});
it("Render modal.", () => {
expect(queryByText(componentContainer, "Confirm reboot")).toBeNull();
fireEvent.click(getByText(componentContainer, "Reboot"));
expect(componentContainer).toMatchSnapshot();
});
it("Confirm reboot.", () => {
fireEvent.click(getByText(componentContainer, "Reboot"));
fireEvent.click(getByText(componentContainer, "Confirm reboot"));
expect(mockAxios.post).toHaveBeenCalledWith(
"/reforis/api/reboot",
undefined,
expect.anything()
);
});
it("Hold error.", async () => {
fireEvent.click(getByText(componentContainer, "Reboot"));
fireEvent.click(getByText(componentContainer, "Confirm reboot"));
mockJSONError();
await wait(() =>
expect(mockSetAlert).toBeCalledWith("Reboot request failed.")
);
});
});

View File

@ -1,11 +1,32 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`<RebootButton/> Render modal. 1`] = `
exports[`<ActionButtonWithModal/> Render button. 1`] = `
<div>
<div
id="modal-container"
/>
<div
id="alert-container"
/>
<button
class="btn btn-primary d-inline-flex justify-content-center align-items-center"
type="button"
>
<span>
Action
</span>
</button>
</div>
`;
exports[`<ActionButtonWithModal/> Render modal. 1`] = `
<div>
<div
id="modal-container"
>
<div
aria-labelledby="modal-title"
aria-modal="true"
class="modal fade show"
role="dialog"
>
@ -19,11 +40,11 @@ exports[`<RebootButton/> Render modal. 1`] = `
<div
class="modal-header"
>
<h5
class="modal-title"
<h1
class="modal-title fs-5"
>
Warning!
</h5>
</h1>
<button
aria-label="Close"
class="btn-close"
@ -33,15 +54,17 @@ exports[`<RebootButton/> Render modal. 1`] = `
<div
class="modal-body"
>
<p>
Are you sure you want to restart the router?
<p
class="mb-0"
>
Are you sure you want to perform this action?
</p>
</div>
<div
class="modal-footer"
>
<button
class="btn btn-primary d-inline-flex justify-content-center align-items-center"
class="btn btn-secondary d-inline-flex justify-content-center align-items-center"
type="button"
>
<span>
@ -53,7 +76,7 @@ exports[`<RebootButton/> Render modal. 1`] = `
type="button"
>
<span>
Confirm reboot
Confirm action
</span>
</button>
</div>
@ -61,28 +84,15 @@ exports[`<RebootButton/> Render modal. 1`] = `
</div>
</div>
</div>
<button
class="btn btn-danger d-inline-flex justify-content-center align-items-center"
type="button"
>
<span>
Reboot
</span>
</button>
</div>
`;
exports[`<RebootButton/> Render. 1`] = `
<div>
<div
id="modal-container"
id="alert-container"
/>
<button
class="btn btn-danger d-inline-flex justify-content-center align-items-center"
class="btn btn-primary d-inline-flex justify-content-center align-items-center"
type="button"
>
<span>
Reboot
Action
</span>
</button>
</div>

View File

@ -43,14 +43,17 @@ describe("AlertContext", () => {
expect(componentContainer).toMatchSnapshot();
});
it("should dismiss alert with alert button", () => {
it("should dismiss alert with alert button", async () => {
fireEvent.click(getByText(componentContainer, "Set alert"));
// Alert is present
expect(getByText(componentContainer, "Alert content")).toBeDefined();
fireEvent.click(componentContainer.querySelector(".btn-close"));
// Alert is gone
expect(queryByText(componentContainer, "Alert content")).toBeNull();
await (() =>
expect(
queryByText(componentContainer, "Alert content")
).toBeNull());
});
it("should dismiss alert with external button", () => {

View File

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

View File

@ -28,19 +28,22 @@ export { default as FileInput } from "./bootstrap/FileInput";
export { default as Input } from "./bootstrap/Input";
export { default as NumberInput } from "./bootstrap/NumberInput";
export { default as PasswordInput } from "./bootstrap/PasswordInput";
export { default as RadioSet, Radio } from "./bootstrap/RadioSet";
export { default as Radio } from "./bootstrap/Radio";
export { default as RadioSet } from "./bootstrap/RadioSet";
export { default as Select } from "./bootstrap/Select";
export { default as TextInput } from "./bootstrap/TextInput";
export { formFieldsSize, buttonFormFieldsSize } from "./bootstrap/constants";
export { default as Switch } from "./bootstrap/Switch";
export { default as ThreeDotsMenu } from "./bootstrap/ThreeDotsMenu";
export { Spinner, SpinnerElement } from "./bootstrap/Spinner";
export { Modal, ModalBody, ModalFooter, ModalHeader } from "./bootstrap/Modal";
// Common
export { default as RebootButton } from "./common/RebootButton";
export { default as ActionButtonWithModal } from "./common/ActionButtonWithModal/ActionButtonWithModal";
export { default as WiFiSettings } from "./common/WiFiSettings/WiFiSettings";
export { default as ResetWiFiSettings } from "./common/WiFiSettings/ResetWiFiSettings";
export { default as RichTable } from "./common/RichTable/RichTable";
// Form
export { default as ForisForm } from "./form/components/ForisForm";
export {

View File

@ -14,7 +14,7 @@ import { render } from "@testing-library/react";
import PropTypes from "prop-types";
import { AlertContextMock } from "./alertContextMock";
import { CustomizationContextMock } from "./cutomizationContextMock";
import { CustomizationContextMock } from "./customizationContextMock";
Wrapper.propTypes = {
children: PropTypes.oneOfType([

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2019-2021 CZ.NIC z.s.p.o. (http://www.nic.cz/)
* Copyright (C) 2019-2024 CZ.NIC z.s.p.o. (https://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
@ -9,8 +9,10 @@ export const REFORIS_URL_PREFIX = "/reforis";
export const REFORIS_API_URL_PREFIX = `${REFORIS_URL_PREFIX}/api`;
export const ForisURLs = {
// turris-auth
login: `/login?${REFORIS_URL_PREFIX}/`,
logout: `/logout`,
extendSession: `/extend-session`,
static: `${REFORIS_URL_PREFIX}/static/reforis`,
wifi: `${REFORIS_URL_PREFIX}/network-settings/wifi`,
@ -25,6 +27,13 @@ export const ForisURLs = {
storage: `${REFORIS_URL_PREFIX}/storage`,
sentinelAgreement: `${REFORIS_URL_PREFIX}/sentinel/agreement`,
// URLs without prefix for Overview page
openvpnClientSettings: "/openvpn/client-settings",
packageManagementPackages: "/package-management/packages",
packageManagementUpdateSettings: "/package-management/update-settings",
sentinelLicenseAgreement: "/sentinel/agreement",
librespeedSpeedTest: "/librespeed/speed-test",
// Notifications links are used with <Link/> inside Router, thus url subdir is not required.
overview: "/overview",
notifications: "/overview#notifications",

View File

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

View File

@ -28,11 +28,11 @@ module.exports = {
content: "docs/development.md",
},
{
name: "Components",
name: "Common Components",
description: "Set of main components.",
sections: [
{
name: "Foris forms",
name: "ForisForm",
components: [
"src/form/components/ForisForm.js",
"src/form/components/alerts.js",
@ -42,47 +42,52 @@ module.exports = {
usageMode: "expand",
},
{
name: "Alert Context",
components: ["src/context/alertContext/AlertContext.js"],
name: "RichTable",
components: ["src/common/RichTable/RichTable.js"],
exampleMode: "expand",
usageMode: "expand",
},
{
name: "ActionButtonWithModal",
components: [
"src/common/ActionButtonWithModal/ActionButtonWithModal.js",
],
exampleMode: "expand",
usageMode: "expand",
},
],
sectionDepth: 1,
},
{
name: "Customization Context",
components: [
"src/context/customizationContext/CustomizationContext.js",
],
exampleMode: "expand",
usageMode: "expand",
},
{
name: "Bootstrap components",
name: "Bootstrap Components",
description: "Set of bootstrap components.",
components: "src/bootstrap/*.js",
exampleMode: "expand",
usageMode: "expand",
ignore: ["src/bootstrap/constants.js"],
ignore: ["src/bootstrap/constants.js", "src/bootstrap/Radio.js"],
sectionDepth: 0,
},
{
name: "Contexts",
components: [
"src/context/alertContext/AlertContext.js",
"src/context/customizationContext/CustomizationContext.js",
],
exampleMode: "expand",
usageMode: "expand",
},
],
template: {
favicon: "/docs/components/logo.svg",
},
require: [
"babel-polyfill",
path.join(__dirname, "src/testUtils/mockGlobals"),
path.join(__dirname, "src/testUtils/mockGlobals.js"),
path.join(
__dirname,
"node_modules/bootstrap/dist/css/bootstrap.min.css"
),
path.join(
__dirname,
"node_modules/@fortawesome/fontawesome-free/css/all.min.css"
),
path.join(__dirname, "node_modules/bootstrap/dist/js/bootstrap.min.js"),
],
styleguideComponents: {
LogoRenderer: path.join(__dirname, "docs/components/Logo"),

View File

@ -7,13 +7,13 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"PO-Revision-Date: 2023-11-23 16:03+0000\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2024-09-25 10:15+0000\n"
"Last-Translator: Lukas Jelinek <lukas.jelinek@nic.cz>\n"
"Language: cs\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/turris/foris-"
"js/cs/>\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
@ -35,42 +35,89 @@ msgstr "Neobdržena žádná odezva."
msgid "An unknown API error occurred."
msgstr "Došlo k neznámé chybě v aplikačním programovém rozhraní."
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
msgstr "Zavřít"
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr "Zkopírováno!"
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr "Kopírovat"
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
msgstr "Vyžadován restart."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
#, fuzzy
msgid "Action successful."
msgstr "Nastavení úspěšně uložena"
#: src/common/RebootButton.js:51
msgid "Reboot"
msgstr "Restartovat"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr "Varování!"
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr "Opravdu chcete router restartovat?"
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr "Zrušit"
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
#, fuzzy
msgid "Confirm"
msgstr "Potvrdit restart"
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
msgid "An error occurred during resetting Wi-Fi settings."
msgstr "Při resetu nastavení Wi-Fi došlo k chybě."
@ -99,7 +146,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr "Wi-Fi ${deviceID + 1}"
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Heslo"
@ -145,15 +192,14 @@ msgstr "Zapnout Wi-Fi pro hosty"
#: src/common/WiFiSettings/WiFiQRCode.js:43
#: src/common/WiFiSettings/WiFiQRCode.js:44
#, fuzzy
msgid "Show QR code"
msgstr "Wi-Fi QR kód"
msgstr "Ukázat QR kód"
#: src/common/WiFiSettings/WiFiQRCode.js:70
msgid "Wi-Fi QR Code"
msgstr "Wi-Fi QR kód"
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr "Stáhnout PDF"
@ -389,3 +435,15 @@ msgstr "Neobsahuje seznam e-mailů oddělených čárkou."
#~ "se tím odstraní aktuální konfigurace a vrátí se výchozí hodnoty.\n"
#~ " "
#~ msgid "Reboot request failed."
#~ msgstr "Vyžadován restart."
#~ msgid "Reboot"
#~ msgstr "Restartovat"
#~ msgid "Warning!"
#~ msgstr "Varování!"
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr "Opravdu chcete router restartovat?"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2019-02-19 13:34+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: da\n"
@ -34,40 +34,85 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr ""
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
msgid "Action successful."
msgstr ""
#: src/common/RebootButton.js:51
msgid "Reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr ""
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
msgid "Confirm"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
@ -95,7 +140,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -146,7 +191,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr ""
@ -424,3 +469,18 @@ msgstr ""
#~ "channel."
#~ msgstr ""
#~ msgid "Reboot request failed."
#~ msgstr ""
#~ msgid "Reboot"
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr ""
#~ msgid "Confirm reboot"
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2024-01-04 21:08+0000\n"
"Last-Translator: Erik Pfannenstein <debianignatz@gmx.de>\n"
"Language: de\n"
@ -35,42 +35,89 @@ msgstr "Keine Antwort erhalten."
msgid "An unknown API error occurred."
msgstr "Ein unbekannter API-Fehler ist aufgetreten."
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr "Kopiert!"
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr "Kopieren"
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
msgstr "Neustart-Einleitung fehlgeschlagen."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
#, fuzzy
msgid "Action successful."
msgstr "Einstellungen erfolgreich gespeichert"
#: src/common/RebootButton.js:51
msgid "Reboot"
msgstr "Systemneustart"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr "Warnung!"
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr "Sind Sie sicher, dass Sie den Router neu starten wollen?"
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr "Abbrechen"
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
#, fuzzy
msgid "Confirm"
msgstr "Neustart bestätigen"
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
msgid "An error occurred during resetting Wi-Fi settings."
msgstr ""
@ -101,7 +148,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr "WLAN ${deviceID + 1}"
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Passwort"
@ -155,7 +202,7 @@ msgstr "WLAN QR-Code"
msgid "Wi-Fi QR Code"
msgstr "WLAN QR-Code"
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr "PDF herunterladen"
@ -387,3 +434,15 @@ msgstr "Enthält keine Liste von E-Mails, die durch Kommas getrennt sind."
#~ " "
#~ msgstr ""
#~ msgid "Reboot request failed."
#~ msgstr "Neustart-Einleitung fehlgeschlagen."
#~ msgid "Reboot"
#~ msgstr "Systemneustart"
#~ msgid "Warning!"
#~ msgstr "Warnung!"
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr "Sind Sie sicher, dass Sie den Router neu starten wollen?"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2021-02-09 16:50+0000\n"
"Last-Translator: Michalis <michalisntovas@yahoo.gr>\n"
"Language: el\n"
@ -35,42 +35,88 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr ""
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
msgid "Action successful."
msgstr ""
#: src/common/RebootButton.js:51
msgid "Reboot"
msgstr "Επανεκκίνηση"
#: src/common/RebootButton.js:66
msgid "Warning!"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr "Είστε βέβαιοι ότι θέλετε να κάνετε επανεκκίνηση του δρομολογητή;"
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr "Άκυρο"
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
#, fuzzy
msgid "Confirm"
msgstr "Επιβεβαίωση επανεκκίνησης"
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
msgid "An error occurred during resetting Wi-Fi settings."
msgstr ""
@ -96,7 +142,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -148,7 +194,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr ""
@ -426,3 +472,15 @@ msgstr ""
#~ "channel."
#~ msgstr ""
#~ msgid "Reboot request failed."
#~ msgstr ""
#~ msgid "Reboot"
#~ msgstr "Επανεκκίνηση"
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr "Είστε βέβαιοι ότι θέλετε να κάνετε επανεκκίνηση του δρομολογητή;"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2019-10-17 09:28+0000\n"
"Last-Translator: Scott Anecito <scott.anecito@protonmail.com>\n"
"Language: en\n"
@ -35,40 +35,85 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr ""
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
msgid "Action successful."
msgstr ""
#: src/common/RebootButton.js:51
msgid "Reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr ""
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
msgid "Confirm"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
@ -96,7 +141,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -147,7 +192,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr ""
@ -422,3 +467,18 @@ msgstr ""
#~ "channel."
#~ msgstr ""
#~ msgid "Reboot request failed."
#~ msgstr ""
#~ msgid "Reboot"
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr ""
#~ msgid "Confirm reboot"
#~ msgstr ""

View File

@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"PO-Revision-Date: 2022-09-11 17:15+0000\n"
"Last-Translator: Dan Cybersec <dan.cybersec@protonmail.com>\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2024-08-24 13:09+0000\n"
"Last-Translator: gallegonovato <fran-carro@hotmail.es>\n"
"Language: es\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/turris/foris-"
"js/es/>\n"
@ -37,42 +37,89 @@ msgstr ""
"Un error desconocido ha ocurrido. Compruebe la consola para mas "
"informaciòn."
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
msgstr "Cerrar"
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr "¡Copiado!"
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr "Copiar"
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
msgstr "La petición de reinicio ha fallado."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
#, fuzzy
msgid "Action successful."
msgstr "Los ajustes se han guardado correctamente"
#: src/common/RebootButton.js:51
msgid "Reboot"
msgstr "Reiniciar"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr "¡Atención!"
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr "¿Estás seguro de que quieres reiniciar el router?"
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr "Cancelar"
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
#, fuzzy
msgid "Confirm"
msgstr "Confirmar reinicio"
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
msgid "An error occurred during resetting Wi-Fi settings."
msgstr "Ocurrió un error durante el reseteo de los ajustes Wi-Fi."
@ -101,7 +148,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr "Wi-Fi ${deviceID + 1}"
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Contraseña"
@ -123,13 +170,15 @@ msgstr "Cifrado"
#: src/common/WiFiSettings/WiFiForm.js:226
msgid "Disable Management Frame Protection"
msgstr ""
msgstr "Desactivar Protected Management Frames"
#: src/common/WiFiSettings/WiFiForm.js:227
msgid ""
"In case you have trouble connecting to WiFi Access Point, try disabling "
"Management Frame Protection."
msgstr ""
"Si tienes problemas para conectarte a un punto de acceso Wi-Fi, intenta "
"desactivar Management Frame Protection."
#: src/common/WiFiSettings/WiFiForm.js:262
msgid "auto"
@ -145,15 +194,14 @@ msgstr "Activar el modo Wi-Fi de invitados"
#: src/common/WiFiSettings/WiFiQRCode.js:43
#: src/common/WiFiSettings/WiFiQRCode.js:44
#, fuzzy
msgid "Show QR code"
msgstr "Código QR Wi-Fi"
msgstr "Mostrar el código QR"
#: src/common/WiFiSettings/WiFiQRCode.js:70
msgid "Wi-Fi QR Code"
msgstr "Código QR Wi-Fi"
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr "Descargar PDF"
@ -445,3 +493,15 @@ msgstr "No contiene una lista de correos electrónicos separados por comas."
#~ "channel."
#~ msgstr ""
#~ msgid "Reboot request failed."
#~ msgstr "La petición de reinicio ha fallado."
#~ msgid "Reboot"
#~ msgstr "Reiniciar"
#~ msgid "Warning!"
#~ msgstr "¡Atención!"
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr "¿Estás seguro de que quieres reiniciar el router?"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2019-02-19 13:34+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: fi\n"
@ -34,40 +34,85 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr ""
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
msgid "Action successful."
msgstr ""
#: src/common/RebootButton.js:51
msgid "Reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr ""
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
msgid "Confirm"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
@ -95,7 +140,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -146,7 +191,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr ""
@ -424,3 +469,18 @@ msgstr ""
#~ "channel."
#~ msgstr ""
#~ msgid "Reboot request failed."
#~ msgstr ""
#~ msgid "Reboot"
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr ""
#~ msgid "Confirm reboot"
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2019-02-19 13:34+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: fo\n"
@ -34,40 +34,85 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr ""
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
msgid "Action successful."
msgstr ""
#: src/common/RebootButton.js:51
msgid "Reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr ""
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
msgid "Confirm"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
@ -95,7 +140,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -146,7 +191,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr ""
@ -424,3 +469,18 @@ msgstr ""
#~ "channel."
#~ msgstr ""
#~ msgid "Reboot request failed."
#~ msgstr ""
#~ msgid "Reboot"
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr ""
#~ msgid "Confirm reboot"
#~ msgstr ""

View File

@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Foris JS 6.1.0\n"
"Project-Id-Version: Foris JS 6.5.0\n"
"Report-Msgid-Bugs-To: tech.support@turris.cz\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -33,40 +33,85 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr ""
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
msgid "Action successful."
msgstr ""
#: src/common/RebootButton.js:51
msgid "Reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr ""
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
msgid "Confirm"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
@ -94,7 +139,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -145,7 +190,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2024-07-27 01:09+0000\n"
"Last-Translator: Moha684 <nahil82466@gmail.com>\n"
"Language: fr\n"
@ -35,42 +35,89 @@ msgstr "Aucun réponse reçue."
msgid "An unknown API error occurred."
msgstr "Une erreur dAPI inconnue sest produite."
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr "Copié!"
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr "Copier"
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
msgstr "La demande de redémarrage a échoué."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
#, fuzzy
msgid "Action successful."
msgstr "Paramètres enregistrés avec succès"
#: src/common/RebootButton.js:51
msgid "Reboot"
msgstr "Redémarrer"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr "Attention!"
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr "Voulez-vous vraiment redémarrer le routeur ?"
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr "Annuler"
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
#, fuzzy
msgid "Confirm"
msgstr "Confirmer le redémarrage"
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
msgid "An error occurred during resetting Wi-Fi settings."
msgstr ""
@ -98,7 +145,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr "Wi-Fi ${deviceID + 1}"
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Mot de passe"
@ -153,7 +200,7 @@ msgstr "Code QR Wi-Fi"
msgid "Wi-Fi QR Code"
msgstr "Code QR Wi-Fi"
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr "Télécharger le PDF"
@ -415,3 +462,15 @@ msgstr ""
#~ " "
#~ msgstr ""
#~ msgid "Reboot request failed."
#~ msgstr "La demande de redémarrage a échoué."
#~ msgid "Reboot"
#~ msgstr "Redémarrer"
#~ msgid "Warning!"
#~ msgstr "Attention!"
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr "Voulez-vous vraiment redémarrer le routeur ?"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2022-09-29 14:17+0000\n"
"Last-Translator: Milo Ivir <mail@milotype.de>\n"
"Language: hr\n"
@ -36,40 +36,85 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr ""
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
msgid "Action successful."
msgstr ""
#: src/common/RebootButton.js:51
msgid "Reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr ""
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
msgid "Confirm"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
@ -97,7 +142,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Lozinka"
@ -148,7 +193,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr ""
@ -426,3 +471,18 @@ msgstr ""
#~ "channel."
#~ msgstr ""
#~ msgid "Reboot request failed."
#~ msgstr ""
#~ msgid "Reboot"
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr ""
#~ msgid "Confirm reboot"
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2021-01-07 01:26+0000\n"
"Last-Translator: Zoli <boritek@gmail.com>\n"
"Language: hu\n"
@ -35,40 +35,86 @@ msgstr "Nem érkezett válasz."
msgid "An unknown API error occurred."
msgstr "Ismeretlen API-hiba történt."
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr ""
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
#, fuzzy
msgid "Action successful."
msgstr "Beállítások sikeresen elmentve"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:51
msgid "Reboot"
msgstr ""
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr ""
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
msgid "Confirm"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
@ -96,7 +142,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -147,7 +193,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr ""
@ -419,3 +465,18 @@ msgstr "Nem tartalmaz vesszővel elválasztott e-mail listát."
#~ "channel."
#~ msgstr ""
#~ msgid "Reboot request failed."
#~ msgstr ""
#~ msgid "Reboot"
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr ""
#~ msgid "Confirm reboot"
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2022-12-31 23:48+0000\n"
"Last-Translator: Anselmo <anselmo@casinadicornia.com>\n"
"Language: it\n"
@ -35,40 +35,85 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr ""
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
msgid "Action successful."
msgstr ""
#: src/common/RebootButton.js:51
msgid "Reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr ""
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
msgid "Confirm"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
@ -96,7 +141,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Password"
@ -147,7 +192,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr ""
@ -425,3 +470,18 @@ msgstr ""
#~ "channel."
#~ msgstr ""
#~ msgid "Reboot request failed."
#~ msgstr ""
#~ msgid "Reboot"
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr ""
#~ msgid "Confirm reboot"
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2019-10-16 10:08+0000\n"
"Last-Translator: Scott Anecito <scott.anecito@protonmail.com>\n"
"Language: ja\n"
@ -35,40 +35,85 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr ""
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
msgid "Action successful."
msgstr ""
#: src/common/RebootButton.js:51
msgid "Reboot"
msgstr "再起動"
#: src/common/RebootButton.js:66
msgid "Warning!"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
msgid "Confirm"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
@ -96,7 +141,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -148,7 +193,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr ""
@ -426,3 +471,18 @@ msgstr ""
#~ "channel."
#~ msgstr ""
#~ msgid "Reboot request failed."
#~ msgstr ""
#~ msgid "Reboot"
#~ msgstr "再起動"
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr ""
#~ msgid "Confirm reboot"
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2019-02-19 13:34+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: ko\n"
@ -34,40 +34,85 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr ""
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
msgid "Action successful."
msgstr ""
#: src/common/RebootButton.js:51
msgid "Reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr ""
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
msgid "Confirm"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
@ -95,7 +140,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -146,7 +191,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr ""
@ -424,3 +469,18 @@ msgstr ""
#~ "channel."
#~ msgstr ""
#~ msgid "Reboot request failed."
#~ msgstr ""
#~ msgid "Reboot"
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr ""
#~ msgid "Confirm reboot"
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2019-02-19 13:34+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: lt\n"
@ -35,40 +35,85 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr ""
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
msgid "Action successful."
msgstr ""
#: src/common/RebootButton.js:51
msgid "Reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr ""
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
msgid "Confirm"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
@ -96,7 +141,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -147,7 +192,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr ""
@ -425,3 +470,18 @@ msgstr ""
#~ "channel."
#~ msgstr ""
#~ msgid "Reboot request failed."
#~ msgstr ""
#~ msgid "Reboot"
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr ""
#~ msgid "Confirm reboot"
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2023-03-02 11:40+0000\n"
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
"Language: nb_NO\n"
@ -36,43 +36,89 @@ msgstr "Fikk ikke svar."
msgid "An unknown API error occurred."
msgstr "Ukjent API-feil."
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr "Kopiert"
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr "Kopier"
#: src/common/RebootButton.js:27
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
#, fuzzy
msgid "Reboot request failed."
msgstr "Omstart kreves"
msgid "Action successful."
msgstr "Innstillinger lagret"
#: src/common/RebootButton.js:51
msgid "Reboot"
msgstr "Start på ny"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr "Advarsel!"
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr "Er du sikker på at du vil utføre omstart av ruteren?"
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr "Avbryt"
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
#, fuzzy
msgid "Confirm"
msgstr "Bekreft omstart"
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
#, fuzzy
msgid "An error occurred during resetting Wi-Fi settings."
@ -103,7 +149,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr "Wi-Fi ${deviceID + 1}"
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Passord"
@ -161,7 +207,7 @@ msgstr "QR-kode for Wi-Fi"
msgid "Wi-Fi QR Code"
msgstr "QR-kode for Wi-Fi"
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr "Last ned PDF"
@ -403,3 +449,15 @@ msgstr "Inneholder ikke en kommainndelt liste med e-postadresser."
#~ "gjeldende Wi-Fi-oppsett og tilbakestiller forvalgte verdier.\n"
#~ " "
#~ msgid "Reboot request failed."
#~ msgstr "Omstart kreves"
#~ msgid "Reboot"
#~ msgstr "Start på ny"
#~ msgid "Warning!"
#~ msgstr "Advarsel!"
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr "Er du sikker på at du vil utføre omstart av ruteren?"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2024-01-04 21:08+0000\n"
"Last-Translator: powerburner-nl <peter.mulder.1981@gmail.com>\n"
"Language: nl\n"
@ -35,43 +35,88 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr ""
#: src/common/RebootButton.js:27
#, fuzzy
msgid "Reboot request failed."
msgstr "Opnieuw opstarten is vereist"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
msgid "Action successful."
msgstr ""
#: src/common/RebootButton.js:51
msgid "Reboot"
msgstr "Opnieuw opstarten"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr "Waarschuwing!"
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr "Weet u zeker dat u de router opnieuw wilt opstarten?"
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr "Annuleren"
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
#, fuzzy
msgid "Confirm"
msgstr "Opnieuw opstarten bevestigen"
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
msgid "An error occurred during resetting Wi-Fi settings."
msgstr ""
@ -97,7 +142,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Wachtwoord"
@ -149,7 +194,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr ""
@ -428,3 +473,15 @@ msgstr "Bevat geen lijst met e-mails gescheiden door komma's."
#~ "channel."
#~ msgstr ""
#~ msgid "Reboot request failed."
#~ msgstr "Opnieuw opstarten is vereist"
#~ msgid "Reboot"
#~ msgstr "Opnieuw opstarten"
#~ msgid "Warning!"
#~ msgstr "Waarschuwing!"
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr "Weet u zeker dat u de router opnieuw wilt opstarten?"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2023-03-07 16:37+0000\n"
"Last-Translator: Arusekk <arek_koz@o2.pl>\n"
"Language: pl\n"
@ -36,42 +36,89 @@ msgstr "Brak odpowiedzi."
msgid "An unknown API error occurred."
msgstr "Wystąpił nieznany błąd API."
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr ""
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
#, fuzzy
msgid "Action successful."
msgstr "Ustawienia zostały zapisane"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:51
msgid "Reboot"
msgstr "Restart"
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr "Ostrzeżenie!"
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr "Czy na pewno zrestartować router?"
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr "Anuluj"
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
#, fuzzy
msgid "Confirm"
msgstr "Potwierdź restart"
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
msgid "An error occurred during resetting Wi-Fi settings."
msgstr ""
@ -97,7 +144,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Hasło"
@ -148,7 +195,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr ""
@ -426,3 +473,15 @@ msgstr "Nie zawiera listy e-maili oddzielonych przecinkami."
#~ "channel."
#~ msgstr ""
#~ msgid "Reboot request failed."
#~ msgstr ""
#~ msgid "Reboot"
#~ msgstr "Restart"
#~ msgid "Warning!"
#~ msgstr "Ostrzeżenie!"
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr "Czy na pewno zrestartować router?"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2021-12-21 12:52+0000\n"
"Last-Translator: c10l <weblate.org@a.c10l.cc>\n"
"Language: pt_BR\n"
@ -35,42 +35,88 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr ""
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
msgid "Action successful."
msgstr ""
#: src/common/RebootButton.js:51
msgid "Reboot"
msgstr "Reinício"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr "Atenção!"
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr "Você tem certeza de que quer reiniciar o roteador?"
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr "Cancelar"
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
#, fuzzy
msgid "Confirm"
msgstr "Confirma reinício"
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
msgid "An error occurred during resetting Wi-Fi settings."
msgstr ""
@ -96,7 +142,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -147,7 +193,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr ""
@ -403,3 +449,15 @@ msgstr ""
#~ "channel."
#~ msgstr ""
#~ msgid "Reboot request failed."
#~ msgstr ""
#~ msgid "Reboot"
#~ msgstr "Reinício"
#~ msgid "Warning!"
#~ msgstr "Atenção!"
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr "Você tem certeza de que quer reiniciar o roteador?"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2019-02-19 13:35+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: ro\n"
@ -35,40 +35,85 @@ msgstr ""
msgid "An unknown API error occurred."
msgstr ""
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr ""
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
msgid "Action successful."
msgstr ""
#: src/common/RebootButton.js:51
msgid "Reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr ""
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr ""
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr ""
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
msgid "Confirm"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
@ -96,7 +141,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr ""
@ -147,7 +192,7 @@ msgstr ""
msgid "Wi-Fi QR Code"
msgstr ""
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr ""
@ -425,3 +470,18 @@ msgstr ""
#~ "channel."
#~ msgstr ""
#~ msgid "Reboot request failed."
#~ msgstr ""
#~ msgid "Reboot"
#~ msgstr ""
#~ msgid "Warning!"
#~ msgstr ""
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr ""
#~ msgid "Confirm reboot"
#~ msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2022-12-07 12:47+0000\n"
"Last-Translator: Алексей Леньшин <alenshin@gmail.com>\n"
"Language: ru\n"
@ -36,42 +36,89 @@ msgstr "Ответ не получен."
msgid "An unknown API error occurred."
msgstr "Неизвестная ошибка программного интерфейса приложения."
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr "Скопировано!"
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr "Копировать"
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
msgstr "Запрос на перезагрузку не выполнен."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
#, fuzzy
msgid "Action successful."
msgstr "Настройки были успешно сохранены"
#: src/common/RebootButton.js:51
msgid "Reboot"
msgstr "Перезагрузка"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr "Предупреждение!"
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr "Вы уверены, что хотите перезагрузить маршрутизатор?"
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr "Отмена"
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
#, fuzzy
msgid "Confirm"
msgstr "Подтвердите перезагрузку"
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
msgid "An error occurred during resetting Wi-Fi settings."
msgstr "При сбросе настроек Wi-Fi произошла ошибка."
@ -100,7 +147,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr "Wi-Fi ${deviceID + 1}"
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Пароль"
@ -154,7 +201,7 @@ msgstr "QR-код Wi-Fi"
msgid "Wi-Fi QR Code"
msgstr "QR-код Wi-Fi"
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr "Скачать PDF"
@ -394,3 +441,15 @@ msgstr "Не содержит списка электронных адресов
#~ "значений по умолчанию.\n"
#~ " "
#~ msgid "Reboot request failed."
#~ msgstr "Запрос на перезагрузку не выполнен."
#~ msgid "Reboot"
#~ msgstr "Перезагрузка"
#~ msgid "Warning!"
#~ msgstr "Предупреждение!"
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr "Вы уверены, что хотите перезагрузить маршрутизатор?"

View File

@ -7,13 +7,13 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"PO-Revision-Date: 2023-01-17 22:51+0000\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2024-09-09 18:09+0000\n"
"Last-Translator: Atec <dr.atec@gmail.com>\n"
"Language: sk\n"
"Language-Team: Slovak <https://hosted.weblate.org/projects/turris/foris-"
"js/sk/>\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
@ -35,42 +35,89 @@ msgstr "Nenastala žiadna odozva."
msgid "An unknown API error occurred."
msgstr "Nastala neznáma chyba v API."
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
msgstr "Zatvoriť"
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr "Skopírované!"
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr "Kopírovať"
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
msgstr "Požiadavka na reštart neúspešná."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
#, fuzzy
msgid "Action successful."
msgstr "Nastavenia boli úspešne uložené"
#: src/common/RebootButton.js:51
msgid "Reboot"
msgstr "Reštartovať"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr "Výstraha!"
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr "Naozaj sa má router reštartovať?"
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr "Zrušiť"
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
#, fuzzy
msgid "Confirm"
msgstr "Potvrdiť reštart"
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
msgid "An error occurred during resetting Wi-Fi settings."
msgstr "Pri resete nastavení Wi-Fi nastala chyba."
@ -99,7 +146,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr "Wi-Fi ${deviceID + 1}"
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Heslo"
@ -145,15 +192,14 @@ msgstr "Povoliť Wi-Fi pre hostí"
#: src/common/WiFiSettings/WiFiQRCode.js:43
#: src/common/WiFiSettings/WiFiQRCode.js:44
#, fuzzy
msgid "Show QR code"
msgstr "Wi-Fi QR kód"
msgstr "Zobraziť QR kód"
#: src/common/WiFiSettings/WiFiQRCode.js:70
msgid "Wi-Fi QR Code"
msgstr "Wi-Fi QR kód"
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr "Stiahnuť PDF"
@ -184,7 +230,7 @@ msgstr "Heslo nesmie obsahovať viac ako 63 znakov"
#: src/common/WiFiSettings/constants.js:9
msgid "Disabled"
msgstr "Zakázané"
msgstr "Vypnuté"
#: src/common/WiFiSettings/constants.js:10
msgid "802.11n - 20 MHz wide channel"
@ -390,3 +436,15 @@ msgstr "Neobsahuje zoznam e-mailov oddelených čiarkami."
#~ " a obnovia sa východiskové hodnoty.\n"
#~ " "
#~ msgid "Reboot request failed."
#~ msgstr "Požiadavka na reštart neúspešná."
#~ msgid "Reboot"
#~ msgstr "Reštartovať"
#~ msgid "Warning!"
#~ msgstr "Výstraha!"
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr "Naozaj sa má router reštartovať?"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-08-23 14:02+0200\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2023-09-22 21:00+0000\n"
"Last-Translator: Kristoffer Grundström "
"<swedishsailfishosuser@tutanota.com>\n"
@ -36,42 +36,88 @@ msgstr "Inget svar togs emot."
msgid "An unknown API error occurred."
msgstr "Ett okänt API-fel inträffade."
#: src/bootstrap/Alert.js:51 src/bootstrap/Modal.js:98
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close"
msgstr ""
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copied!"
msgstr "Kopierades!"
#: src/bootstrap/CopyInput.js:57
#: src/bootstrap/CopyInput.js:56
msgid "Copy"
msgstr "Kopiera"
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
msgstr "Förfrågning för omstart misslyckades."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
msgid "Action successful."
msgstr ""
#: src/common/RebootButton.js:51
msgid "Reboot"
msgstr "Starta om"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed."
msgstr ""
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr "Varning!"
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr "Är du säker på att du vill starta om routern?"
#: src/common/RebootButton.js:71
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel"
msgstr "Avbryt"
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
#, fuzzy
msgid "Confirm"
msgstr "Bekräfta omstart"
#: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending"
msgstr ""
#: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:71
msgid "First page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:83
msgid "Next page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:89
msgid "Last page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:95
msgid "Page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:98
msgid "of"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page"
msgstr ""
#: src/common/RichTable/RichTablePagination.js:121
msgid "All"
msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39
msgid "An error occurred during resetting Wi-Fi settings."
msgstr "Ett fel inträffade under återställningen av Wi-Fi-inställningarna."
@ -100,7 +146,7 @@ msgid "Wi-Fi ${deviceID + 1}"
msgstr "Wi-Fi ${deviceID + 1}"
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:81
#: src/common/WiFiSettings/WiFiGuestForm.js:78
msgid "Password"
msgstr "Lösenord"
@ -154,7 +200,7 @@ msgstr "QR-kod för Wi-Fi"
msgid "Wi-Fi QR Code"
msgstr "QR-kod för Wi-Fi"
#: src/common/WiFiSettings/WiFiQRCode.js:93
#: src/common/WiFiSettings/WiFiQRCode.js:102
msgid "Download PDF"
msgstr "Ladda ner PDF"
@ -440,3 +486,15 @@ msgstr ""
#~ "channel."
#~ msgstr ""
#~ msgid "Reboot request failed."
#~ msgstr "Förfrågning för omstart misslyckades."
#~ msgid "Reboot"
#~ msgstr "Starta om"
#~ msgid "Warning!"
#~ msgstr "Varning!"
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr "Är du säker på att du vill starta om routern?"