diff --git a/.github/AUTHORS.txt b/.github/AUTHORS.txt
index a9b32cbc..749d9851 100644
--- a/.github/AUTHORS.txt
+++ b/.github/AUTHORS.txt
@@ -1,36 +1,42 @@
Alicia - 1 commits
-BOZG - 1 commits
Begin - 1 commits
David - 1 commits
DeepSource - 1 commits
Devin - 1 commits
FormatToday <616099456@qq.com> - 1 commits
Iaroslav - 1 commits
+Ishan - 1 commits
+Kieren - 1 commits
Rune - 1 commits
Ryan - 1 commits
Shreya - 1 commits
+Xert - 1 commits
deepsource-io[bot] - 1 commits
jnach <33467747+jnach@users.noreply.github.com> - 1 commits
-Alicia - 2 commits
+BOZG - 2 commits
Brendan <'Lear> - 2 commits
Dan - 2 commits
liss-bot <87835202+liss-bot@users.noreply.github.com> - 2 commits
ᗪєνιη <υн> - 2 commits
Walkx <71191962+walkxcode@users.noreply.github.com> - 3 commits
Niklas - 4 commits
+Alicie - 5 commits
UrekD - 5 commits
Erik - 6 commits
+Leonardo - 6 commits
liss-bot - 6 commits
+Kashif - 9 commits
Alicia - 16 commits
github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> - 16 commits
-repo-visualizer - 16 commits
snyk-bot - 18 commits
-snyk-bot - 20 commits
+repo-visualizer - 21 commits
EVOTk <45015615+EVOTk@users.noreply.github.com> - 22 commits
+snyk-bot - 25 commits
Alicia - 28 commits
-Alicia - 33 commits
-liss-bot - 44 commits
+Alicia - 41 commits
+liss-bot - 56 commits
+Alicia - 60 commits
Lissy93 - 78 commits
-Lissy93 - 202 commits
-Alicia - 302 commits
-Alicia - 1230 commits
\ No newline at end of file
+Lissy93 - 203 commits
+Alicia - 319 commits
+Alicia - 1310 commits
\ No newline at end of file
diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md
index e3b95055..34032168 100644
--- a/.github/CHANGELOG.md
+++ b/.github/CHANGELOG.md
@@ -1,5 +1,37 @@
# Changelog
+## 💄 1.9.9 - Minor UI + Docs Updates [PR #431](https://github.com/Lissy93/dashy/pull/431)
+- Improved theme support for widgets
+- Better widget layout in Workspace and Minimal views
+- Updates lots of the docs
+
+## ✨ 1.9.8 - More Widgets and Widget Improvements [PR #425](https://github.com/Lissy93/dashy/pull/425)
+- Fixes several minor widget issues raised by users
+- Adds several new widgets, for monitoring system
+- Better widget data requests and error handling
+- Implements widget support into Workspace view
+
+## 🐛 1.9.7 - Minor UI Editor Bug fixes [PR #416](https://github.com/Lissy93/dashy/pull/416)
+- Fixes unable to edit item bug (#415)
+- Fixes unable to add new app bug (#390)
+- Fixes nav links visibility (#389)
+
+## ⚡️ 1.9.6 - Adds Proxy Support for Widget Requests [PR #392](https://github.com/Lissy93/dashy/pull/392)
+- Refactors widget mixin to include data requests, so that code can be shared between widgets
+- Adds a Node endpoint for proxying requests server-side, used for APIs that are not CORS enabled
+- Adds option to config file for user to force proxying of requests
+- Writes a Netlify cloud function to support proxying when the app is hosted on Netlify
+
+## 🐛 1.9.5 - Bug fixes and Minor Improvements [PR #388](https://github.com/Lissy93/dashy/pull/388)
+- Adds icon.horse to supported favicon APIs
+- Fixes tile move bug, Re: #366
+- Fixes save items without title bug, Re: #377
+
+## ✨ 1.9.4 - Widget Support [PR #382](https://github.com/Lissy93/dashy/pull/382)
+- Adds support for dynamic content, through widgets
+- Adds 30+ pre-built widgets for general info and self-hosted services
+- Writes docs on widget usage
+
## ⚡️ 1.9.2 - Native SSL Support + Performance Improvements [PR #326](https://github.com/Lissy93/dashy/pull/326)
- Updates the server to use Express, removing serve-static, connect and body-parser
- Adds native support for passing in self-signed SSL certificates and updates docs
diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/ISSUE_TEMPLATE/question.yml
index 0346fb30..e6c71472 100644
--- a/.github/ISSUE_TEMPLATE/question.yml
+++ b/.github/ISSUE_TEMPLATE/question.yml
@@ -1,62 +1,64 @@
-name: Question 🤷♂️
-description: Got a question about Dashy, deployment, development or usage?
-title: '[QUESTION] '
-labels: ['🤷♂️ Question']
-
-body:
- # Filed 1 - Intro Text
- - type: markdown
- attributes:
- value: >
- Thanks for using Dashy! Questions are welcome, but in the future will be moving over to
- [Discussions](https://github.com/Lissy93/dashy/discussions) page.
- Quick questions should be asked [here](https://github.com/Lissy93/dashy/discussions/148) instead.
- validations:
- required: false
-
- # Field 2 - The actual question
- - type: textarea
- id: question
- attributes:
- label: Question
- description: Outline your question in a clear and concise manner
- validations:
- required: true
-
- # Field 3 - Category
- - type: dropdown
- id: category
- attributes:
- label: Category
- description: What part of the application does this relate to?
- options:
- - Setup and Deployment
- - Configuration
- - App Usage
- - Development
- - Documentation
- - Alternate Views
- - Authentication
- - Using Icons
- - Language Support
- - Search & Shortcuts
- - Status Checking
- - Theming & Layout
- validations:
- required: true
-
- # Field 4 - User has RTFM first, and agrees to code of conduct, etc
- - type: checkboxes
- id: idiot-check
- attributes:
- label: Please tick the boxes
- description: Before submitting, please ensure that
- options:
- - label: You are using a [supported](https://github.com/Lissy93/dashy/blob/master/.github/SECURITY.md#supported-versions) version of Dashy (check the first two digits of the version number)
- required: true
- - label: You've checked that this [question hasn't already been raised](https://github.com/Lissy93/dashy/issues?q=is%3Aissue)
- required: true
- - label: You've checked the [docs](https://github.com/Lissy93/dashy/tree/master/docs#readme) and [troubleshooting](https://github.com/Lissy93/dashy/blob/master/docs/troubleshooting.md#troubleshooting) guide
- required: true
- - label: You agree to the [code of conduct](https://github.com/Lissy93/dashy/blob/master/.github/CODE_OF_CONDUCT.md#contributor-covenant-code-of-conduct)
- required: true
+name: Question 🤷♂️
+description: Got a question about Dashy, deployment, development or usage?
+title: '[QUESTION] '
+labels: ['🤷♂️ Question']
+
+body:
+ # Filed 1 - Intro Text
+ - type: markdown
+ attributes:
+ value: >
+ Thanks for using Dashy! Questions are welcome, but in the future will be moving over to
+ [Discussions](https://github.com/Lissy93/dashy/discussions) page.
+ Quick questions should be asked [here](https://github.com/Lissy93/dashy/discussions/148) instead.
+ validations:
+ required: false
+
+ # Field 2 - The actual question
+ - type: textarea
+ id: question
+ attributes:
+ label: Question
+ description: Outline your question in a clear and concise manner
+ validations:
+ required: true
+
+ # Field 3 - Category
+ - type: dropdown
+ id: category
+ attributes:
+ label: Category
+ description: What part of the application does this relate to?
+ options:
+ - Setup and Deployment
+ - Configuration
+ - App Usage
+ - Development
+ - Documentation
+ - Alternate Views
+ - Authentication
+ - Using Icons
+ - Widgets
+ - Actions
+ - Language Support
+ - Search & Shortcuts
+ - Status Checking
+ - Theming & Layout
+ validations:
+ required: true
+
+ # Field 4 - User has RTFM first, and agrees to code of conduct, etc
+ - type: checkboxes
+ id: idiot-check
+ attributes:
+ label: Please tick the boxes
+ description: Before submitting, please ensure that
+ options:
+ - label: You are using a [supported](https://github.com/Lissy93/dashy/blob/master/.github/SECURITY.md#supported-versions) version of Dashy (check the first two digits of the version number)
+ required: true
+ - label: You've checked that this [question hasn't already been raised](https://github.com/Lissy93/dashy/issues?q=is%3Aissue)
+ required: true
+ - label: You've checked the [docs](https://github.com/Lissy93/dashy/tree/master/docs#readme) and [troubleshooting](https://github.com/Lissy93/dashy/blob/master/docs/troubleshooting.md#troubleshooting) guide
+ required: true
+ - label: You agree to the [code of conduct](https://github.com/Lissy93/dashy/blob/master/.github/CODE_OF_CONDUCT.md#contributor-covenant-code-of-conduct)
+ required: true
diff --git a/.github/LEGAL.md b/.github/LEGAL.md
index 3e1d9531..86410bc0 100644
--- a/.github/LEGAL.md
+++ b/.github/LEGAL.md
@@ -1,157 +1,18 @@
-# 3rd-Party Software for Dashy
+---
The following 3rd-party software packages may be used by or distributed with **dashy**. Any information relevant to third-party vendors listed below are collected using common, reasonable means.
-
Date generated | Revision ID
:------------: | :----------:
-10/02/21 | cc7101a871e151a2dea7830d1e492ef6ef05fd53
+01/22/22 | cc7101a871e151a2dea7830d1e492ef6ef05fd53
---
+
## Dependencies
-
-### [@sentry/tracing (6.11.0)](https://www.npmjs.com/package/@sentry/tracing)
-
-#### Declared Licenses
-MIT
-
-```
-MIT License
-
-Copyright (c) 2020 Sentry (https://sentry.io/) and individual contributors.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-```
-
-#### Other Licenses
-Apache-2.0
-
-```
-Copyright 2020 Google LLC
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-See the License for the specific language governing permissions and limitations under the License.
-```
-
----
-
-### [@sentry/vue (6.11.0)](https://www.npmjs.com/package/@sentry/vue)
-
-
-#### Declared Licenses
-**Multi-license:**MIT, **Multi-license:**BSD-3-Clause
-
-```
-Copyright (c) 2021, @sentry/vue Contributors
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-```
-
-```
-MIT License
-
-Copyright (c) 2019, Sentry
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-\* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-\* Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-\* Neither the name of the copyright holder nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-```
-
-
-#### Other Licenses
-Apache-2.0
-
-
-```
-Copyright Microsoft Corporation
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-See the License for the specific language governing permissions and limitations under the License.
-```
-
-
----
-
### [ajv (8.6.2)](https://www.npmjs.com/package/ajv)
-
-
#### Declared Licenses
MIT
-
```
The MIT License (MIT)
@@ -178,16 +39,15 @@ SOFTWARE.
```
+#### Other Licenses
---
### [axios (0.21.1)](https://www.npmjs.com/package/axios)
-
#### Declared Licenses
MIT
-
```
Copyright (c) 2014-present Matt Zabriskie
@@ -211,15 +71,15 @@ THE SOFTWARE.
```
+#### Other Licenses
+
---
### [body-parser (1.19.0)](https://www.npmjs.com/package/body-parser)
-
#### Declared Licenses
MIT
-
```
(The MIT License)
@@ -246,17 +106,15 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
```
-
+#### Other Licenses
---
### [connect (3.7.0)](https://www.npmjs.com/package/connect)
-
#### Declared Licenses
MIT
-
```
(The MIT License)
@@ -286,16 +144,15 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
```
+#### Other Licenses
---
### [crypto-js (4.1.1)](https://www.npmjs.com/package/crypto-js)
-
#### Declared Licenses
MIT
-
```
\# License
@@ -324,13 +181,12 @@ THE SOFTWARE.
```
-
#### Other Licenses
BSD-2-Clause
```
-Copyright (c) 2021, crypto-js Contributors<>
+Copyright (c) 2022, crypto-js Contributors<>
All rights reserved.<>
Redistribution and use in source and binary forms, with or without
@@ -390,6 +246,7 @@ THE SOFTWARE.
```
+#### Other Licenses
---
@@ -402,7 +259,7 @@ Apache-2.0
```
-Copyright 2016 Red Hat, Inc
+Copyright 2016 Red Hat, Inc. and/or its affiliates
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -417,13 +274,12 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and limitations under the License.
```
-
#### Other Licenses
-MIT
+**Multi-license:**MIT, **Multi-license:**Apache-2.0 *OR* MIT
```
-Copyright (c) 2017 Brett Epps
+Copyright (c) 2017 Brett Epps
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
@@ -444,7 +300,6 @@ SOFTWARE.
```
-
---
### [register-service-worker (1.7.2)](https://www.npmjs.com/package/register-service-worker)
@@ -479,6 +334,8 @@ THE SOFTWARE.
```
+#### Other Licenses
+
---
@@ -489,6 +346,55 @@ THE SOFTWARE.
Apache-2.0 *OR* MIT
+```
+Copyright 2018 AJ ONeal
+
+This is open source software; you can redistribute it and/or modify it under the
+terms of either:
+
+ a) the "MIT License"
+ b) the "Apache-2.0 License"
+
+MIT License
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+
+Apache-2.0 License Summary
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+```
+
+
+#### Other Licenses
+MIT
+
```
Copyright 2018 AJ ONeal
@@ -572,6 +478,150 @@ OTHER DEALINGS IN THE SOFTWARE.
```
+#### Other Licenses
+
+
+---
+
+### [@sentry/tracing (6.11.0)](https://www.npmjs.com/package/@sentry/tracing)
+
+
+#### Declared Licenses
+MIT
+
+
+```
+MIT License
+
+Copyright (c) 2020 Sentry (https://sentry.io/) and individual contributors.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+```
+
+#### Other Licenses
+Apache-2.0
+
+
+```
+Copyright Microsoft Corporation. All rights reserved.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+```
+
+
+---
+
+### [@sentry/vue (6.11.0)](https://www.npmjs.com/package/@sentry/vue)
+
+
+#### Declared Licenses
+BSD-3-Clause *OR* MIT
+
+
+
+```
+MIT License
+
+Copyright (c) 2019, Sentry
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+\* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+\* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+\* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+```
+
+#### Other Licenses
+**Multi-license:**Apache-2.0, **Multi-license:**MIT
+
+
+```
+Copyright Microsoft Corporation. All rights reserved.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+```
+
+
+```
+Copyright (c) 2019 Sentry
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+```
+
+
---
@@ -611,6 +661,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
```
+#### Other Licenses
---
@@ -656,126 +707,7 @@ For more information, please see http://creativecommons.org/publicdomain/zero/1.
```
-
#### Other Licenses
-**Multi-license:**Apache-2.0, **Multi-license:**MIT, **Multi-license:**GPL-2.0-or-later, **Multi-license:**GPL-3.0-only, **Multi-license:**W3C, **Multi-license:**GPL-3.0-or-later *OR* W3C, **Multi-license:**GPL-3.0-or-later, **Multi-license:**BSD-3-Clause, **Multi-license:**PHP-3.01
-
-
-```
-Copyright 2021, simple-icons Contributors
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-See the License for the specific language governing permissions and limitations under the License.
-```
-
-
-```
-Copyright (c) 2021, simple-icons Contributors
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-```
-
-
-```
-Copyright (C) 2021, simple-icons Contributors
-This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 or any later version.
-This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-```
-
-
-```
-Copyright (C) 2021, simple-icons Contributors
-This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3.
-This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/
-```
-
-```
-Copyright (C) [$date-of-software] World Wide Web Consortium, (Massachusetts Institute of Technology, European Research Consortium for Informatics and Mathematics, Keio University). All Rights Reserved.
-This work is distributed under the W3C® Software License in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-```
-
-```
-Copyright (C) 2021, simple-icons Contributors
-This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 or any later version.
-This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/
-```
-
-
-
-```
-Copyright (c) 2021, simple-icons Contributors . All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- 3. Neither the name of the copyright holder nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-```
-
-
-
-```
-Copyright (c) 1999 - 2012 The PHP Group. All rights reserved.
-Redistribution and use in source and binary forms, with or without modification, is permitted provided that the following conditions are met:
- 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- 3. The name "PHP" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact group@php.net.
- 4. Products derived from this software may not be called "PHP", nor may "PHP" appear in their name, without prior written permission from group@php.net. You may indicate that your software works in conjunction with PHP by saying "Foo for PHP" instead of calling it "PHP Foo" or "phpfoo"
- 5. The PHP Group may publish revised and/or new versions of the license from time to time. Each version will be given a distinguishing version number. Once covered code has been published under a particular version of the license, you may always continue to use it under the terms of that version. You may also choose to use such covered code under the terms of any subsequent version of the license published by the PHP Group. No one other than the PHP Group has the right to modify the terms applicable to covered code created under this License.
- 6. Redistributions of any form whatsoever must retain the following acknowledgment: "This product includes PHP software, freely available from ".
-THIS SOFTWARE IS PROVIDED BY THE PHP DEVELOPMENT TEAM ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PHP DEVELOPMENT TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-This software consists of voluntary contributions made by many individuals on behalf of the PHP Group.
-The PHP Group can be contacted via Email at group@php.net.
-For more information on the PHP Group and the PHP project, please see .
-PHP includes the Zend Engine, freely available at .
-```
-
---
@@ -811,6 +743,25 @@ SOFTWARE.
```
+#### Other Licenses
+Apache-2.0
+
+
+```
+Copyright 2011-2021 Jos de Jong, http://jsoneditoronline.org
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+```
---
@@ -846,7 +797,7 @@ SOFTWARE.
```
-
+#### Other Licenses
---
@@ -882,13 +833,12 @@ THE SOFTWARE.
```
-
#### Other Licenses
-**Multi-license:**Apache-2.0, **Multi-license:**GPL-2.0-or-later
+**Multi-license:**Apache-2.0 *OR* GPL-2.0-or-later *OR* MPL-1.1, **Multi-license:**Apache-2.0
```
-Copyright 2021, vue Contributors
+Copyright 2022, vue Contributors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -904,14 +854,6 @@ See the License for the specific language governing permissions and limitations
```
-```
-Copyright (C) 2021, vue Contributors
-This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 or any later version.
-This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-```
-
-
---
### [vue-i18n (8.25.0)](https://www.npmjs.com/package/vue-i18n)
@@ -945,6 +887,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
```
+#### Other Licenses
+
+
---
@@ -980,6 +925,7 @@ SOFTWARE.
```
+#### Other Licenses
---
@@ -1015,6 +961,8 @@ SOFTWARE.
```
+#### Other Licenses
+
---
@@ -1050,6 +998,8 @@ SOFTWARE.
```
+#### Other Licenses
+
---
@@ -1084,8 +1034,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```
-
-
+#### Other Licenses
---
@@ -1121,6 +1070,8 @@ SOFTWARE.
```
+#### Other Licenses
+
---
### [vue-toasted (1.1.28)](https://www.npmjs.com/package/vue-toasted)
@@ -1153,4 +1104,14 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```
+#### Other Licenses
+
+
+
+---
+
+[FOSSA]: # (Do not touch the comments below)
+
+[FOSSA]: # (==depsig=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855==)
+
diff --git a/README.md b/README.md
index b0be193f..539bde4a 100644
--- a/README.md
+++ b/README.md
@@ -40,6 +40,7 @@
- [🎨 Theming](#theming-)
- [🧸 Icons](#icons-)
- [🚦 Status Indicators](#status-indicators-)
+ - [📊 Widgets](#widgets-)
- [💂 Authentication](#authentication-)
- [🖱️ Opening Methods](#opening-methods-%EF%B8%8F)
- [👓 Alternate Views](#alternate-views-)
@@ -70,6 +71,7 @@
- 🎨 Multiple built-in color themes, with UI color editor and support for custom CSS
- 🧸 Many icon options - Font-Awesome, homelab icons, auto-fetching Favicon, images, emojis, etc.
- 🚦 Status monitoring for each of your apps/links for basic availability and uptime checking
+- 📊 Use widgets to display info and dynamic content from self-hosted services
- 💂 Optional authentication with multi-user access, configurable privileges, and SSO support
- 🌎 Multi-language support, with 10+ human-translated languages, and more on the way
- ☁ Optional, encrypted, free off-site cloud backup and restore feature available
@@ -235,6 +237,22 @@ Status indicators can be globally enabled by setting `appConfig.statusCheck: tru
+**[⬆️ Back to Top](#dashy)**
+
+---
+
+## Widgets 📊
+
+> For full widget documentation, see: [**Widgets**](./docs/widgets.md)
+
+You can display dynamic content from services in the form of widgets. There are several pre-built widgets availible for showing useful info, and integrations with commonly self-hosted services, but you can also easily create your own for almost any app.
+
+
+
+
+
+
+
**[⬆️ Back to Top](#dashy)**
---
@@ -310,7 +328,7 @@ For apps that you use regularly, you can set a custom keybinding. Use the `hotke
You can also add custom tags to a given item to make finding them based on keywords easier. For example, in the following example, searching for 'Movies' will show 'Plex'
-"`yaml
+```yaml
items:
- title: Plex
hotkey: 8
@@ -472,7 +490,7 @@ Huge thanks to the sponsors helping to support Dashy's development!
-
+ Robert Ernst
@@ -485,10 +503,17 @@ Huge thanks to the sponsors helping to support Dashy's development!
diff --git a/docs/alternate-views.md b/docs/alternate-views.md
index 2417316a..12d30b6e 100644
--- a/docs/alternate-views.md
+++ b/docs/alternate-views.md
@@ -1,10 +1,16 @@
# Alternate Views & Opening Methods
## Views
-As well as the default start view, Dashy has several other start pages, for different tasks. You can switch views with the view-switcher button in the top-right, or set a default starting view using the `appConfig.startingView` attribute (can be `default`, `minimal` or `workspace`).
+
+Dashy has three different views:
+- Default View - This is the main homepage with sections in a grid layout
+- Workspace View - Items displayed on the side, and are launched within Dashy
+- Minimal View - A clean + simple tabbed view
+
+You can switch between views using the dropdown in the top-right corner. Set your chosen Starting View with `appConfig.startingView`. Click the page title at any time to go back to your selected starting view.
### Default
-This is the main page that you will land on when you first launch the application. Here all of your sections and items will be visible, you can modify settings and search + launch your applications.
+This is the main page that you will land on when you first launch the application. Here all of your sections (with items + widgets) are visible in a grid layout.
Example of Default View
@@ -12,11 +18,11 @@ This is the main page that you will land on when you first launch the applicatio
### Workspace
-The workspace view displays your links in a sidebar on the left-hand side, and apps are launched within Dashy. This enables you to use all of your self-hosted apps from one place, and makes multi-tasking easy.
+The workspace view displays your links in a sidebar on the left-hand side, and apps are launched inside an iframe without having to leave Dashy. This enables you to use all of your self-hosted apps from one place, and makes multi-tasking easy.
-In the workspace view, you can opt to keep previously opened websites/ apps open in the background, by setting `appConfig.enableMultiTasking: true`. This comes at the cost of performance, but does mean that your session with each app is preserved, enabling you to quickly switch between your apps.
+You can specify a default app to be opened when you land on the workspace, by setting `appConfig.workspaceLandingUrl: https://app-to-open/`. If this app exists within your sections.items, then the corresponding section will also be expanded.
-You can also specify a default app to be opened when you land on the workspace, by setting `appConfig.workspaceLandingUrl: https://app-to-open/`. If this app exists within your sections.items, then the corresponding section will also be expanded.
+You can also opt to keep previously opened websites/ apps open in the background, by setting `appConfig.enableMultiTasking: true`. This comes at the cost of performance, but does mean that your session with each app is preserved, enabling you to quickly switch between them.
Example of Workspace View
@@ -24,7 +30,7 @@ You can also specify a default app to be opened when you land on the workspace,
### Minimal View
-The minimal view aims to be super fast and simple, and can be used as a browser startpage. Items are grouped into a tab view, and the last opened tab will be remembered. Similar to the main view, you can search and launch items just by typing, and right-clicking will show more options.
+The minimal view aims to be super fast and simple, and can be used as a browser startpage. Items are grouped into a tab view, and the last opened tab will be remembered. Similar to the main view, you can search and launch items just by typing, and right-clicking will show more options (like open in modal, workspace or new tab).
Example of Minimal View
@@ -33,7 +39,7 @@ The minimal view aims to be super fast and simple, and can be used as a browser
## Opening Methods
-Dashy supports several different ways to launch your apps. The default opening method for each app can be specified using the `target` attribute, with a value of one of the following:
+Dashy supports several different ways to launch your apps. The primary opening method for each app can be specified using the `target` attribute, with a value of one of the following:
- `sametab` - The app will be launched in the current tab
- `newtab` - The app will be launched in a new tab
@@ -41,12 +47,14 @@ Dashy supports several different ways to launch your apps. The default opening m
- `modal` - Launch app in a resizable/ movable popup modal on the current page
- `workspace` - Changes to Workspace view, and launches app
-You can also set the default opening method, which will be applied to all items that don't have a specified target, using `appConfig.defaultOpeningMethod`, to one of the above values.
+You can also set a default opening method, which will be applied to all items that don't have a specified target, using `appConfig.defaultOpeningMethod`, to one of the above values.
-Even if the target is not set (or is set to `sametab`), you can still launch any given app in an alternative method: Alt + Click will open the modal, and Ctrl + Click will open in a new tab. You can also right-click on any item to see all options (as seen in the screenshot below). This custom context menu can be disabled by setting `appConfig.disableContextMenu: true`.
+Even if the target is not set (or is set to `sametab`), you can still launch any given app in an alternative method. Either right-click to see all options, or use one of the keyboard shortcuts: Alt + Click will open the modal, and Ctrl + Click will open in a new tab.
+If you don't like the custom context menu, it can be disabled by setting `appConfig.disableContextMenu: true`.
+
If you get a 'Refused to Connect' error in the modal or workspace views, then the target app has it's X-Frame-Options HTTP set to block requests from embedded content. You can easily fix this by setting this header to ALLOW, for instructions on how to do so, see the [Troubleshooting Docs](/docs/troubleshooting.md#refused-to-connect-in-modal-or-workspace-view).
diff --git a/docs/assets/CONTRIBUTORS.svg b/docs/assets/CONTRIBUTORS.svg
index ad833b9c..f846f3ee 100644
--- a/docs/assets/CONTRIBUTORS.svg
+++ b/docs/assets/CONTRIBUTORS.svg
@@ -21,11 +21,11 @@
-
-
-
-
+
+
+
+
@@ -39,16 +39,25 @@
+
+
+
+
+
+
-
+
-
+
-
+
+
+
+
-
+
\ No newline at end of file
diff --git a/docs/assets/repo-visualization.svg b/docs/assets/repo-visualization.svg
index 5d031f9f..0a85d949 100644
--- a/docs/assets/repo-visualization.svg
+++ b/docs/assets/repo-visualization.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/authentication.md b/docs/authentication.md
index e5de308c..b429adea 100644
--- a/docs/authentication.md
+++ b/docs/authentication.md
@@ -143,9 +143,25 @@ appConfig:
realm: 'alicia-homelab'
clientId: 'dashy'
```
+
+### 4. Add groups and roles (Optional)
+Keycloak allows you to assign users roles and groups. You can use these values to configure who can access various sections in Dashy.
+Keycloak server administration and configuration is a deep topic; please refer to the [server admin guide](https://www.keycloak.org/docs/latest/server_admin/index.html#assigning-permissions-and-access-using-roles-and-groups) to see details about creating and assigning roles and groups.
+Once you have groups or roles assigned to users you can configure access under each sections `displayData.showForKeycloakUser` and `displayData.hideForKeycloakUser`.
+Both show and hide configurations accept a list of `groups` and `roles` that limit access. If a users data matches one or more items in these lists they will be allowed or excluded as defined.
+```yaml
+sections:
+ - name: DeveloperResources
+ displayData:
+ showForKeycloakUsers:
+ roles: ['canViewDevResources']
+ hideForKeycloakUsers:
+ groups: ['ProductTeam']
+```
+
Your app is now secured :) When you load Dashy, it will redirect to your Keycloak login page, and any user without valid credentials will be prevented from accessing your dashboard.
-From within the Keycloak console, you can then configure things like user permissions, time outs, password policies, access, etc. You can also backup your full Keycloak config, and it is recommended to do this, along with your Dashy config. You can spin up both Dashy and Keycloak simultaneously and restore both applications configs using a `docker-compose.yml` file, and this is recommended.
+From within the Keycloak console, you can then configure things like time-outs, password policies, etc. You can also backup your full Keycloak config, and it is recommended to do this, along with your Dashy config. You can spin up both Dashy and Keycloak simultaneously and restore both applications configs using a `docker-compose.yml` file, and this is recommended.
---
diff --git a/docs/configuring.md b/docs/configuring.md
index d06fd429..5f5517a0 100644
--- a/docs/configuring.md
+++ b/docs/configuring.md
@@ -1,298 +1,323 @@
-# Configuring
-
-All app configuration is specified in [`/public/conf.yml`](https://github.com/Lissy93/dashy/blob/master/public/conf.yml) which is in [YAML Format](https://yaml.org/) format. Changes can also be made [directly through the UI](#editing-config-through-the-ui) and previewed live, from here you can also export, backup, reset, validate and download your configuration file.
-
-The following file provides a reference of all supported configuration options.
-
----
-
-#### Contents
-
-- [**`pageInfo`**](#pageinfo) - Header text, footer, title, navigation, etc
- - [`navLinks`](#pageinfonavlinks-optional) - Navigation bar items and links
-- [**`appConfig`**](#appconfig-optional) - Main application settings
- - [`webSearch`](#appconfigwebsearch-optional) - Configure web search engine options
- - [`hideComponents`](#appconfighidecomponents-optional) - Show/ hide page components
- - [`auth`](#appconfigauth-optional) - Built-in authentication setup
- - [`users`](#appconfigauthusers-optional) - Setup for simple auth
- - [`keycloak`](#appconfigauthkeycloak-optional) - Auth using Keycloak
-- [**`sections`**](#section) - List of sections
- - [`displayData`](#sectiondisplaydata-optional) - Section display settings
- - [`icon`](#sectionicon-and-sectionitemicon) - Icon for a section
- - [`items`](#sectionitem) - List of items
- - [`icon`](#sectionicon-and-sectionitemicon) - Icon for an item
-- [**Notes**](#notes)
- - [Editing Config through the UI](#editing-config-through-the-ui)
- - [About YAML](#about-yaml)
- - [Config Saving Methods](#config-saving-methods)
- - [Preventing Changes](#preventing-changes-being-written-to-disk)
- - [Example](#example)
-
----
-
-Tips:
-- You may find it helpful to look at some sample config files to get you started, a collection of which can be found [here](https://gist.github.com/Lissy93/000f712a5ce98f212817d20bc16bab10)
-- You can check that your config file fits the schema, by running `yarn validate-config`
-- After modifying your config, the app needs to be recompiled, by running `yarn build` - this happens automatically whilst the app is running if you're using Docker
-- It is recommended to make and keep a backup of your config file. You can download your current config through the UI either from the Config menu, or using the `/download` endpoint. Alternatively, you can use the [Cloud Backup](./docs/backup-restore.md) feature.
-- The config can also be modified directly through the UI, validated and written to the conf.yml file.
-- All fields are optional, unless otherwise stated.
-
----
-
-### Top-Level Fields
-
-**Field** | **Type** | **Required**| **Description**
---- | --- | --- | ---
-**`pageInfo`** | `object` | Required | Basic meta data like title, description, nav bar links, footer text. See [`pageInfo`](#pageinfo)
-**`appConfig`** | `object` | _Optional_ | Settings related to how the app functions, including API keys and global styles. See [`appConfig`](#appconfig-optional)
-**`sections`** | `array` | Required | An array of sections, each containing an array of items, which will be displayed as links. See [`section`](#section)
-
-**[⬆️ Back to Top](#configuring)**
-
-### `PageInfo`
-
-**Field** | **Type** | **Required**| **Description**
---- | --- | --- | ---
-**`title`** | `string` | Required | Your dashboard title, displayed in the header and browser tab
-**`description`** | `string` | _Optional_ | Description of your dashboard, also displayed as a subtitle
-**`navLinks`** | `array` | _Optional_ | Optional list of a maximum of 6 links, which will be displayed in the navigation bar. See [`navLinks`](#pageinfonavlinks-optional)
-**`footerText`** | `string` | _Optional_ | Text to display in the footer (note that this will override the default footer content). This can also include HTML and inline CSS
-**`logo`** | `string` | _Optional_ | The path to an image to display in the header (to the right of the title). This can be either local, where `/` is the root of `./public`, or any remote image, such as `https://i.ibb.co/yhbt6CY/dashy.png`. It's recommended to scale your image down, so that it doesn't impact load times
-
-**[⬆️ Back to Top](#configuring)**
-
-### `pageInfo.navLinks` _(optional)_
-
-**Field** | **Type** | **Required**| **Description**
---- | --- | --- | ---
-**`title`** | `string` | Required | The text to display on the link button
-**`path`** | `string` | Required | The URL to navigate to when clicked. Can be relative (e.g. `/about`) or absolute (e.g. `https://example.com` or `http://192.168.1.1`)
-
-**[⬆️ Back to Top](#configuring)**
-
-### `appConfig` _(optional)_
-
-**Field** | **Type** | **Required**| **Description**
---- | --- | --- | ---
-**`language`** | `string` | _Optional_ | The 2 (or 4-digit) [ISO 639-1 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) for your language, e.g. `en` or `en-GB`. This must be a language that the app has already been [translated](https://github.com/Lissy93/dashy/tree/master/src/assets/locales) into. If your language is unavailable, Dashy will fallback to English. By default Dashy will attempt to auto-detect your language, although this may not work on some privacy browsers.
-**`startingView`** | `enum` | _Optional_ | Which page to load by default, and on the base page or domain root. You can still switch to different views from within the UI. Can be either `default`, `minimal` or `workspace`. Defaults to `default`
-**`defaultOpeningMethod`** | `enum` | _Optional_ | The default opening method for items, if no `target` is specified for a given item. Can be either `newtab`, `sametab`, `top`, `parent`, `modal` or `workspace`. Defaults to `newtab`
-**`statusCheck`** | `boolean` | _Optional_ | When set to `true`, Dashy will ping each of your services and display their status as a dot next to each item. This can be overridden by setting `statusCheck` under each item. Defaults to `false`
-**`statusCheckInterval`** | `boolean` | _Optional_ | The number of seconds between checks. If set to `0` then service will only be checked on initial page load, which is usually the desired functionality. If value is less than `10` you may experience a hit in performance. Defaults to `0`
-**`webSearch`** | `object` | _Optional_ | Configuration options for the web search feature, set your default search engine, opening method or disable web search. See [`webSearch`](#appconfigwebsearch-optional)
-**`backgroundImg`** | `string` | _Optional_ | Path to an optional full-screen app background image. This can be either remote (http) or local (/). Note that this will slow down initial load
-**`enableFontAwesome`** | `boolean` | _Optional_ | Where `true` is enabled, if left blank font-awesome will be enabled only if required by 1 or more icons
-**`fontAwesomeKey`** | `string` | _Optional_ | If you have a font-awesome key, then you can use it here and make use of premium icons. It is a 10-digit alpha-numeric string from you're FA kit URL (e.g. `13014ae648`)
-**`faviconApi`** | `enum` | _Optional_ | Only applicable if you are using favicons for item icons. Specifies which service to use to resolve favicons. Set to `local` to do this locally, without using an API. Services running locally will use this option always. Available options are: `local`, `faviconkit`, `google`, `clearbit`, `webmasterapi` and `allesedv`. Defaults to `faviconkit`. See [Icons](/docs/icons.md#favicons) for more info
-**`auth`** | `object` | _Optional_ | All settings relating to user authentication. See [`auth`](#appconfigauth-optional)
-**`layout`** | `enum` | _Optional_ | Layout for homepage, either `horizontal`, `vertical` or `auto`. Defaults to `auto`. This specifies the layout and direction of how sections are positioned on the home screen. This can also be modified and overridden from the UI.
-**`iconSize`** | `enum` | _Optional_ | The size of link items / icons. Can be either `small`, `medium,` or `large`. Defaults to `medium`. This can also be set directly from the UI.
-**`colCount`** | `number` | _Optional_ | The number of columns of sections displayed on the homepage, using the default view. Should be in integer between `1` and `8`. Note that by default this is applied responsively, based on current screen size, and specifying a value here will override this behavior, which may not be desirable.
-**`theme`** | `string` | _Optional_ | The default theme for first load (you can change this later from the UI)
-**`cssThemes`** | `string[]` | _Optional_ | An array of custom theme names which can be used in the theme switcher dropdown
-**`customColors`** | `object`| _Optional_ | Enables you to apply a custom color palette to any given theme. Use the theme name (lowercase) as the key, for an object including key-value-pairs, with the color variable name as keys, and 6-digit hex code as value. See [Theming](/docs/theming.md#modifying-theme-colors) for more info
-**`externalStyleSheet`** | `string` or `string[]` | _Optional_ | Either a URL to an external stylesheet or an array or URLs, which can be applied as themes within the UI
-**`customCss`** | `string` | _Optional_ | Raw CSS that will be applied to the page. This can also be set from the UI. Please minify it first.
-**`hideComponents`** | `object` | _Optional_ | A list of key page components (header, footer, search, settings, etc) that are present by default, but can be removed using this option. See [`appConfig.hideComponents`](#appconfighideComponents-optional)
-**`routingMode`** | `string` | _Optional_ | Can be either `hash` or `history`. Determines the URL format for sub-pages, hash mode will look like `/#/home` whereas with history mode available you have nice clean URLs, like `/home`. For more info, see the [Vue docs](https://router.vuejs.org/guide/essentials/history-mode.html#example-server-configurations). If you're hosting Dashy with a custom BASE_URL, you will find that a bit of extra server config is necessary to get history mode working, so here you may want to instead use `hash` mode.Defaults to `history`.
-**`enableMultiTasking`** | `boolean` | _Optional_ | If set to true, will keep apps open in the background when in the workspace view. Useful for quickly switching between multiple sites, and preserving their state, but comes at the cost of performance.
-**`workspaceLandingUrl`** | `string` | _Optional_ | The URL or an app, service or website to launch when the workspace view is opened, before another service has been launched
-**`allowConfigEdit`** | `boolean` | _Optional_ | Should prevent / allow the user to write configuration changes to the conf.yml from the UI. When set to `false`, the user can only apply changes locally using the config editor within the app, whereas if set to `true` then changes can be written to disk directly through the UI. Defaults to `true`. Note that if authentication is enabled, the user must be of type `admin` in order to apply changes globally.
-**`enableErrorReporting`** | `boolean` | _Optional_ | Enable reporting of unexpected errors and crashes. This is off by default, and **no data will ever be captured unless you explicitly enable it**. Turning on error reporting helps previously unknown bugs get discovered and fixed. Dashy uses [Sentry](https://github.com/getsentry/sentry) for error reporting. Defaults to `false`.
-**`sentryDsn`** | `boolean` | _Optional_ | If you need to monitor errors in your instance, then you can use Sentry to collect and process bug reports. Sentry can be self-hosted, or used as SaaS, once your instance is setup, then all you need to do is pass in the DSN here, and enable error reporting. You can learn more on the [Sentry DSN Docs](https://docs.sentry.io/product/sentry-basics/dsn-explainer/). Note that this will only ever be used if `enableErrorReporting` is explicitly enabled.
-**`disableSmartSort`** | `boolean` | _Optional_ | For the most-used and last-used app sort functions to work, a basic open-count is stored in local storage. If you do not want this to happen, then disable smart sort here, but you wil no longer be able to use these sort options. Defaults to `false`.
-**`disableUpdateChecks`** | `boolean` | _Optional_ | If set to true, Dashy will not check for updates. Defaults to `false`.
-**`enableServiceWorker`** | `boolean` | _Optional_ | Service workers cache web applications to improve load times and offer basic offline functionality, and are enabled by default in Dashy. The service worker can sometimes cause older content to be cached, requiring the app to be hard-refreshed. If you do not want SW functionality, or are having issues with caching, set this property to `true` to disable all service workers.
-**`disableContextMenu`** | `boolean` | _Optional_ | If set to `true`, the custom right-click context menu will be disabled. Defaults to `false`.
-
-**[⬆️ Back to Top](#configuring)**
-
-### `appConfig.auth` _(optional)_
-**Field** | **Type** | **Required**| **Description**
---- | --- | --- | ---
-**`users`** | `array` | _Optional_ | An array of objects containing usernames and hashed passwords. If this is not provided, then authentication will be off by default, and you will not need any credentials to access the app. See [`appConfig.auth.users`](#appconfigauthusers-optional). **Note** this method of authentication is handled on the client side, so for security critical situations, it is recommended to use an [alternate authentication method](/docs/authentication.md#alternative-authentication-methods).
-**`enableKeycloak`** | `boolean` | _Optional_ | If set to `true`, then authentication using Keycloak will be anabled. Note that you need to have an instance running, and have also configured `auth.keycloak`. Defaults to `false`
-**`keycloak`** | `object` | _Optional_ | Config options to point Dashy to your Keycloak server. Requires `enableKeycloak: true`. See [`auth.keycloak`](#appconfigauthkeycloak-optional) for more info
-**`enableGuestAccess`** | `boolean` | _Optional_ | When set to `true`, an unauthenticated user will be able to access the dashboard, with read-only access, without having to login. Requires `auth.users` to be configured. Defaults to `false`.
-
-For more info, see the **[Authentication Docs](/docs/authentication.md)**
-
-**[⬆️ Back to Top](#configuring)**
-
-### `appConfig.auth.users` _(optional)_
-
-**Field** | **Type** | **Required**| **Description**
---- | --- | --- | ---
-**`user`** | `string` | Required | Username to log in with
-**`hash`** | `string` | Required | A SHA-256 hashed password
-**`type`** | `string` | _Optional_ | The user type, either admin or normal
-
-**[⬆️ Back to Top](#configuring)**
-
-### `appConfig.auth.keycloak` _(optional)_
-
-**Field** | **Type** | **Required**| **Description**
---- | --- | --- | ---
-**`serverUrl`** | `string` | Required | The URL (or URL/ IP + Port) where your keycloak server is running
-**`realm`** | `string` | Required | The name of the realm (must already be created) that you want to use
-**`clientId`** | `string` | Required | The Client ID of the client you created for use with Dashy
-
-**[⬆️ Back to Top](#configuring)**
-
-### `appConfig.webSearch` _(optional)_
-
-**Field** | **Type** | **Required**| **Description**
---- | --- | --- | ---
-**`disableWebSearch`** | `string` | _Optional_ | Web search is enabled by default, but can be disabled by setting this property to `true`
-**`searchEngine`** | `string` | _Optional_ | Set the key name for your search engine. Can also use a custom engine by setting this property to `custom`. Currently supported: `duckduckgo`, `google`, `whoogle`, `qwant`, `startpage`, `searx-bar` and `searx-info`. Defaults to `duckduckgo`
-**`customSearchEngine`** | `string` | _Optional_ | You can also use a custom search engine, or your own self-hosted instance. This requires `searchEngine: custom` to be set. Then add the URL of your service, with GET query string included here
-**`openingMethod`** | `string` | _Optional_ | Set your preferred opening method for search results: `newtab`, `sametab`, `workspace`. Defaults to `newtab`
-**`searchBangs`** | `object` | _Optional_ | A key-value-pair set of custom search _bangs_ for redirecting query to a specific app or search engine. The key of each should be the bang you will type (typically starting with `/`, `!` or `:`), and value is the destination, either as a search engine key (e.g. `reddit`) or a URL with search parameters (e.g. `https://en.wikipedia.org/w/?search=`)
-
-
-**[⬆️ Back to Top](#configuring)**
-
-### `appConfig.hideComponents` _(optional)_
-
-**Field** | **Type** | **Required**| **Description**
---- | --- | --- | ---
-**`hideHeading`** | `boolean` | _Optional_ | If set to `true`, the page title & sub-title will not be visible. Defaults to `false`
-**`hideNav`** | `boolean` | _Optional_ | If set to `true`, the navigation menu will not be visible. Defaults to `false`
-**`hideSearch`** | `boolean` | _Optional_ | If set to `true`, the search bar will not be visible. Defaults to `false`
-**`hideSettings`** | `boolean` | _Optional_ | If set to `true`, the settings menu will not be visible. Defaults to `false`
-**`hideFooter`** | `boolean` | _Optional_ | If set to `true`, the footer will not be visible. Defaults to `false`
-**`hideSplashScreen`** | `boolean` | _Optional_ | If set to `true`, splash screen will not be visible while the app loads. Defaults to `true` (except on first load, when the loading screen is always shown)
-
-**[⬆️ Back to Top](#configuring)**
-
-### `section`
-
-**Field** | **Type** | **Required**| **Description**
---- | --- | --- | ---
-**`name`** | `string` | Required | The title for the section
-**`icon`** | `string` | _Optional_ | An single icon to be displayed next to the title. See [`section.icon`](#sectionicon-and-sectionitemicon)
-**`items`** | `array` | Required | An array of items to be displayed within the section. See [`item`](#sectionitem)
-**`displayData`** | `object` | _Optional_ | Meta-data to optionally overide display settings for a given section. See [`displayData`](#sectiondisplaydata-optional)
-
-**[⬆️ Back to Top](#configuring)**
-
-### `section.item`
-
-**Field** | **Type** | **Required**| **Description**
---- | --- | --- | ---
-**`title`** | `string` | Required | The text to display/ title of a given item. Max length `18`
-**`description`** | `string` | _Optional_ | Additional info about an item, which is shown in the tooltip on hover, or visible on large tiles
-**`url`** | `string` | Required | The URL / location of web address for when the item is clicked
-**`icon`** | `string` | _Optional_ | The icon for a given item. Can be a font-awesome icon, favicon, remote URL or local URL. See [`item.icon`](#sectionicon-and-sectionitemicon)
-**`target`** | `string` | _Optional_ | The opening method for when the item is clicked, either `newtab`, `sametab`, `top`, `parent`, `modal` or `workspace`. Where `newtab` will open the link in a new tab, `sametab` will open it in the current tab, and `modal` will open a pop-up modal and `workspace` will open in the Workspace view. Defaults to `newtab`
-**`hotkey`** | `number` | _Optional_ | Give frequently opened applications a numeric hotkey, between `0 - 9`. You can then just press that key to launch that application.
-**`tags`** | `string[]` | _Optional_ | A list of tags, which can be used for improved search
-**`statusCheck`** | `boolean` | _Optional_ | When set to `true`, Dashy will ping the URL associated with the current service, and display its status as a dot next to the item. The value here will override `appConfig.statusCheck` so you can turn off or on checks for a given service. Defaults to `appConfig.statusCheck`, falls back to `false`
-**`statusCheckUrl`** | `string` | _Optional_ | If you've enabled `statusCheck`, and want to use a different URL to what is defined under the item, then specify it here
-**`statusCheckHeaders`** | `object` | _Optional_ | If you're endpoint requires any specific headers for the status checking, then define them here
-**`statusCheckAllowInsecure`** | `boolean` | _Optional_ | By default, any request to insecure content will be blocked. Setting this option to `true` will disable the `rejectUnauthorized` option, enabling you to ping non-HTTPS services for the current item. Defaults to `false`
-**`color`** | `string` | _Optional_ | An optional color for the text and font-awesome icon to be displayed in. Note that this will override the current theme and so may not display well
-**`backgroundColor`** | `string` | _Optional_ | An optional background fill color for the that given item. Again, this will override the current theme and so might not display well against the background
-**`provider`** | `string` | _Optional_ | The name of the provider for a given service, useful for when including hosted apps. In some themes, this is visible under the item name
-
-**[⬆️ Back to Top](#configuring)**
-
-### `section.displayData` _(optional)_
-
-**Field** | **Type** | **Required**| **Description**
---- | --- | --- | ---
-**`sortBy`** | `string` | _Optional_ | The sort order for items within the current section. By default items are displayed in the order in which they are listed in within the config. The following sort options are supported: `most-used` (most opened apps first), `last-used` (the most recently used apps), `alphabetical`, `reverse-alphabetical`, `random` and `default`
-**`collapsed`** | `boolean` | _Optional_ | If true, the section will be collapsed initially, and will need to be clicked to open. Useful for less regularly used, or very long sections. Defaults to `false`
-**`rows`** | `number` | _Optional_ | Height of the section, specified as the number of rows it should span vertically, e.g. `2`. Defaults to `1`. Max is `5`.
-**`cols`** | `number` | _Optional_ | Width of the section, specified as the number of columns the section should span horizontally, e.g. `2`. Defaults to `1`. Max is `5`.
-**`itemSize`** | `string` | _Optional_ | Specify the size for items within this group, either `small`, `medium` or `large`. Note that this will overide any settings specified through the UI
-**`color`** | `string` | _Optional_ | A custom accent color for the section, as a hex code or HTML color (e.g. `#fff`)
-**`customStyles`** | `string` | _Optional_ | Custom CSS properties that should be applied to that section, e.g. `border: 2px dashed #ff0000;`
-**`sectionLayout`** | `string` | _Optional_ | Specify which CSS layout will be used to responsivley place items. Can be either `auto` (which uses flex layout), or `grid`. If `grid` is selected, then `itemCountX` and `itemCountY` may also be set. Defaults to `auto`
-**`itemCountX`** | `number` | _Optional_ | The number of items to display per row / horizontally. If not set, it will be calculated automatically based on available space. Can only be set if `sectionLayout` is set to `grid`. Must be a whole number between `1` and `12`
-**`itemCountY`** | `number` | _Optional_ | The number of items to display per column / vertically. If not set, it will be calculated automatically based on available space. If `itemCountX` is set, then `itemCountY` can be calculated automatically. Can only be set if `sectionLayout` is set to `grid`. Must be a whole number between `1` and `12`
-**`hideForUsers`** | `string[]` | _Optional_ | Current section will be visible to all users, except for those specified in this list
-**`showForUsers`** | `string[]` | _Optional_ | Current section will be hidden from all users, except for those specified in this list
-**`hideForGuests`** | `boolean` | _Optional_ | Current section will be visible for logged in users, but not for guests (see `appConfig.enableGuestAccess`). Defaults to `false`
-
-**[⬆️ Back to Top](#configuring)**
-
-### `section.icon` and `section.item.icon`
-
-**Field** | **Type** | **Required**| **Description**
---- | --- | --- | ---
-**`icon`** | `string` | _Optional_ | The icon for a given item or section. See [Icon Docs](/docs/icons.md) for all available supported icon types. To auto-fetch icon from a services URL, aet to `favicon`. To use font-awesome, specify the category, followed by the icon name, e.g. `fas fa-rocket`, `fab fa-monero` or `fal fa-duck`. Similarly, for branded icons, you can use [simple-icons](https://simpleicons.org/) by setting icon to `si-[icon-name]` or [material-design-icons](https://dev.materialdesignicons.com/icons) by setting icon to `mdi-[icon-name]`. If set to `generative`, then a unique icon is generated from the apps URL or IP. You can also use hosted any by specifying it's URL, e.g. `https://i.ibb.co/710B3Yc/space-invader-x256.png`. To use a local image, first store it in `./public/item-icons/` (or `-v /app/public/item-icons/` in Docker) , and reference it by name and extension - e.g. set `image.png` to use `./public/item-icon/image.png`, you can also use sub-folders if you have a lot of icons, to keep them organised.
-
-**[⬆️ Back to Top](#configuring)**
-
----
-
-## Notes
-
-### Editing Config through the UI
-
-Config can be modified directly through the UI, and then written to disk, or applied locally. This can be done wither with the raw config editor (introduced in V 0.6.5 / [#3](https://github.com/Lissy93/dashy/pull/3)), or the interactive editor (introduced in V 1.8.9 / [#298](https://github.com/Lissy93/dashy/pull/298)).
-
-
-
-### About YAML
-If you're new to YAML, it's pretty straight-forward. The format is exactly the same as that of JSON, but instead of using curly braces, structure is denoted using whitespace. This [quick guide](https://linuxhandbook.com/yaml-basics/) should get you up to speed in a few minutes, for more advanced topics take a look at this [Wikipedia article](https://en.wikipedia.org/wiki/YAML).
-
-### Config Saving Methods
-When updating the config through the JSON editor in the UI, you have two save options: **Local** or **Write to Disk**.
-- Changes saved locally will only be applied to the current user through the browser, and will not apply to other instances - you either need to use the cloud sync feature, or manually update the conf.yml file.
-- On the other-hand, if you choose to write changes to disk, then your main `conf.yml` file will be updated, and changes will be applied to all users, and visible across all devices. For this functionality to work, you must be running Dashy with using the Docker container, or the Node server. A backup of your current configuration will also be saved in the same directory.
-
-### Preventing Changes being Written to Disk
-To disallow any changes from being written to disk via the UI config editor, set `appConfig.allowConfigEdit: false`. If you are using users, and have setup `auth` within Dashy, then only users with `type: admin` will be able to write config changes to disk.
-
-### Example
-
-```yaml
----
-pageInfo:
- title: Home Lab
-sections: # An array of sections
-- name: Section 1 - Getting Started
- items: # An array of items
- - title: GitHub
- description: Source code and documentation on GitHub
- icon: fab fa-github
- url: https://github.com/Lissy93/dashy
- - title: Issues
- description: View currently open issues, or raise a new one
- icon: fas fa-bug
- url: https://github.com/Lissy93/dashy/issues
- - title: Demo
- description: A live demo
- icon: far fa-rocket
- url: https://dashy-demo-1.netlify.app
-- name: Section 2 - Local Services
- items:
- - title: Firewall
- icon: favicon
- url: http://192.168.1.1/
- - title: Game Server
- icon: https://i.ibb.co/710B3Yc/space-invader-x256.png
- url: http://192.168.130.1/
-```
-
-For more example config files, see: [this gist](https://gist.github.com/Lissy93/000f712a5ce98f212817d20bc16bab10)
-
-If you need any help, feel free to [Raise an Issue](https://github.com/Lissy93/dashy/issues/new?assignees=Lissy93&labels=%F0%9F%A4%B7%E2%80%8D%E2%99%82%EF%B8%8F+Question&template=question.md&title=%5BQUESTION%5D) or [Start a Discussion](https://github.com/Lissy93/dashy/discussions)
-
-Happy Configuring 🤓🔧
-
-**[⬆️ Back to Top](#configuring)**
-
+# Configuring
+
+All app configuration is specified in [`/public/conf.yml`](https://github.com/Lissy93/dashy/blob/master/public/conf.yml) which is in [YAML Format](https://yaml.org/) format. Changes can also be made [directly through the UI](#editing-config-through-the-ui) and previewed live, from here you can also export, backup, reset, validate and download your configuration file.
+
+The following file provides a reference of all supported configuration options.
+
+---
+
+#### Contents
+
+- [**`pageInfo`**](#pageinfo) - Header text, footer, title, navigation, etc
+ - [`navLinks`](#pageinfonavlinks-optional) - Navigation bar items and links
+- [**`appConfig`**](#appconfig-optional) - Main application settings
+ - [`webSearch`](#appconfigwebsearch-optional) - Configure web search engine options
+ - [`hideComponents`](#appconfighidecomponents-optional) - Show/ hide page components
+ - [`auth`](#appconfigauth-optional) - Built-in authentication setup
+ - [`users`](#appconfigauthusers-optional) - Setup for simple auth
+ - [`keycloak`](#appconfigauthkeycloak-optional) - Auth using Keycloak
+- [**`sections`**](#section) - List of sections
+ - [`displayData`](#sectiondisplaydata-optional) - Section display settings
+ - [`icon`](#sectionicon-and-sectionitemicon) - Icon for a section
+ - [`items`](#sectionitem) - List of items
+ - [`icon`](#sectionicon-and-sectionitemicon) - Icon for an item
+- [**Notes**](#notes)
+ - [Editing Config through the UI](#editing-config-through-the-ui)
+ - [About YAML](#about-yaml)
+ - [Config Saving Methods](#config-saving-methods)
+ - [Preventing Changes](#preventing-changes-being-written-to-disk)
+ - [Example](#example)
+
+---
+
+Tips:
+- You may find it helpful to look at some sample config files to get you started, a collection of which can be found [here](https://gist.github.com/Lissy93/000f712a5ce98f212817d20bc16bab10)
+- You can check that your config file fits the schema, by running `yarn validate-config`
+- After modifying your config, the app needs to be recompiled, by running `yarn build` - this happens automatically whilst the app is running if you're using Docker
+- It is recommended to make and keep a backup of your config file. You can download your current config through the UI either from the Config menu, or using the `/download` endpoint. Alternatively, you can use the [Cloud Backup](./docs/backup-restore.md) feature.
+- The config can also be modified directly through the UI, validated and written to the conf.yml file.
+- All fields are optional, unless otherwise stated.
+
+---
+
+### Top-Level Fields
+
+**Field** | **Type** | **Required**| **Description**
+--- | --- | --- | ---
+**`pageInfo`** | `object` | Required | Basic meta data like title, description, nav bar links, footer text. See [`pageInfo`](#pageinfo)
+**`appConfig`** | `object` | _Optional_ | Settings related to how the app functions, including API keys and global styles. See [`appConfig`](#appconfig-optional)
+**`sections`** | `array` | Required | An array of sections, each containing an array of items, which will be displayed as links. See [`section`](#section)
+
+**[⬆️ Back to Top](#configuring)**
+
+### `PageInfo`
+
+**Field** | **Type** | **Required**| **Description**
+--- | --- | --- | ---
+**`title`** | `string` | Required | Your dashboard title, displayed in the header and browser tab
+**`description`** | `string` | _Optional_ | Description of your dashboard, also displayed as a subtitle
+**`navLinks`** | `array` | _Optional_ | Optional list of a maximum of 6 links, which will be displayed in the navigation bar. See [`navLinks`](#pageinfonavlinks-optional)
+**`footerText`** | `string` | _Optional_ | Text to display in the footer (note that this will override the default footer content). This can also include HTML and inline CSS
+**`logo`** | `string` | _Optional_ | The path to an image to display in the header (to the right of the title). This can be either local, where `/` is the root of `./public`, or any remote image, such as `https://i.ibb.co/yhbt6CY/dashy.png`. It's recommended to scale your image down, so that it doesn't impact load times
+
+**[⬆️ Back to Top](#configuring)**
+
+### `pageInfo.navLinks` _(optional)_
+
+**Field** | **Type** | **Required**| **Description**
+--- | --- | --- | ---
+**`title`** | `string` | Required | The text to display on the link button
+**`path`** | `string` | Required | The URL to navigate to when clicked. Can be relative (e.g. `/about`) or absolute (e.g. `https://example.com` or `http://192.168.1.1`)
+
+**[⬆️ Back to Top](#configuring)**
+
+### `appConfig` _(optional)_
+
+**Field** | **Type** | **Required**| **Description**
+--- | --- | --- | ---
+**`language`** | `string` | _Optional_ | The 2 (or 4-digit) [ISO 639-1 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) for your language, e.g. `en` or `en-GB`. This must be a language that the app has already been [translated](https://github.com/Lissy93/dashy/tree/master/src/assets/locales) into. If your language is unavailable, Dashy will fallback to English. By default Dashy will attempt to auto-detect your language, although this may not work on some privacy browsers.
+**`startingView`** | `enum` | _Optional_ | Which page to load by default, and on the base page or domain root. You can still switch to different views from within the UI. Can be either `default`, `minimal` or `workspace`. Defaults to `default`
+**`defaultOpeningMethod`** | `enum` | _Optional_ | The default opening method for items, if no `target` is specified for a given item. Can be either `newtab`, `sametab`, `modal`, `workspace`, `clipboard`, `top` or `parent`. Defaults to `newtab`
+**`statusCheck`** | `boolean` | _Optional_ | When set to `true`, Dashy will ping each of your services and display their status as a dot next to each item. This can be overridden by setting `statusCheck` under each item. Defaults to `false`
+**`statusCheckInterval`** | `boolean` | _Optional_ | The number of seconds between checks. If set to `0` then service will only be checked on initial page load, which is usually the desired functionality. If value is less than `10` you may experience a hit in performance. Defaults to `0`
+**`webSearch`** | `object` | _Optional_ | Configuration options for the web search feature, set your default search engine, opening method or disable web search. See [`webSearch`](#appconfigwebsearch-optional)
+**`backgroundImg`** | `string` | _Optional_ | Path to an optional full-screen app background image. This can be either remote (http) or local (/). Note that this will slow down initial load
+**`enableFontAwesome`** | `boolean` | _Optional_ | Where `true` is enabled, if left blank font-awesome will be enabled only if required by 1 or more icons
+**`fontAwesomeKey`** | `string` | _Optional_ | If you have a font-awesome key, then you can use it here and make use of premium icons. It is a 10-digit alpha-numeric string from you're FA kit URL (e.g. `13014ae648`)
+**`faviconApi`** | `enum` | _Optional_ | Only applicable if you are using favicons for item icons. Specifies which service to use to resolve favicons. Set to `local` to do this locally, without using an API. Services running locally will use this option always. Available options are: `local`, `faviconkit`, `iconhorse`, `google`, `clearbit`, `webmasterapi` and `allesedv`. Defaults to `faviconkit`. See [Icons](/docs/icons.md#favicons) for more info
+**`auth`** | `object` | _Optional_ | All settings relating to user authentication. See [`auth`](#appconfigauth-optional)
+**`layout`** | `enum` | _Optional_ | Layout for homepage, either `horizontal`, `vertical` or `auto`. Defaults to `auto`. This specifies the layout and direction of how sections are positioned on the home screen. This can also be modified and overridden from the UI.
+**`iconSize`** | `enum` | _Optional_ | The size of link items / icons. Can be either `small`, `medium,` or `large`. Defaults to `medium`. This can also be set directly from the UI.
+**`colCount`** | `number` | _Optional_ | The number of columns of sections displayed on the homepage, using the default view. Should be in integer between `1` and `8`. Note that by default this is applied responsively, based on current screen size, and specifying a value here will override this behavior, which may not be desirable.
+**`theme`** | `string` | _Optional_ | The default theme for first load (you can change this later from the UI)
+**`cssThemes`** | `string[]` | _Optional_ | An array of custom theme names which can be used in the theme switcher dropdown
+**`customColors`** | `object`| _Optional_ | Enables you to apply a custom color palette to any given theme. Use the theme name (lowercase) as the key, for an object including key-value-pairs, with the color variable name as keys, and 6-digit hex code as value. See [Theming](/docs/theming.md#modifying-theme-colors) for more info
+**`externalStyleSheet`** | `string` or `string[]` | _Optional_ | Either a URL to an external stylesheet or an array or URLs, which can be applied as themes within the UI
+**`customCss`** | `string` | _Optional_ | Raw CSS that will be applied to the page. This can also be set from the UI. Please minify it first.
+**`hideComponents`** | `object` | _Optional_ | A list of key page components (header, footer, search, settings, etc) that are present by default, but can be removed using this option. See [`appConfig.hideComponents`](#appconfighideComponents-optional)
+**`routingMode`** | `string` | _Optional_ | Can be either `hash` or `history`. Determines the URL format for sub-pages, hash mode will look like `/#/home` whereas with history mode available you have nice clean URLs, like `/home`. For more info, see the [Vue docs](https://router.vuejs.org/guide/essentials/history-mode.html#example-server-configurations). If you're hosting Dashy with a custom BASE_URL, you will find that a bit of extra server config is necessary to get history mode working, so here you may want to instead use `hash` mode.Defaults to `history`.
+**`enableMultiTasking`** | `boolean` | _Optional_ | If set to true, will keep apps open in the background when in the workspace view. Useful for quickly switching between multiple sites, and preserving their state, but comes at the cost of performance.
+**`workspaceLandingUrl`** | `string` | _Optional_ | The URL or an app, service or website to launch when the workspace view is opened, before another service has been launched
+**`allowConfigEdit`** | `boolean` | _Optional_ | Should prevent / allow the user to write configuration changes to the conf.yml from the UI. When set to `false`, the user can only apply changes locally using the config editor within the app, whereas if set to `true` then changes can be written to disk directly through the UI. Defaults to `true`. Note that if authentication is enabled, the user must be of type `admin` in order to apply changes globally.
+**`showSplashScreen`** | `boolean` | _Optional_ | If set to `true`, a loading screen will be shown. Defaults to `false`.
+**`enableErrorReporting`** | `boolean` | _Optional_ | Enable reporting of unexpected errors and crashes. This is off by default, and **no data will ever be captured unless you explicitly enable it**. Turning on error reporting helps previously unknown bugs get discovered and fixed. Dashy uses [Sentry](https://github.com/getsentry/sentry) for error reporting. Defaults to `false`.
+**`sentryDsn`** | `boolean` | _Optional_ | If you need to monitor errors in your instance, then you can use Sentry to collect and process bug reports. Sentry can be self-hosted, or used as SaaS, once your instance is setup, then all you need to do is pass in the DSN here, and enable error reporting. You can learn more on the [Sentry DSN Docs](https://docs.sentry.io/product/sentry-basics/dsn-explainer/). Note that this will only ever be used if `enableErrorReporting` is explicitly enabled.
+**`disableSmartSort`** | `boolean` | _Optional_ | For the most-used and last-used app sort functions to work, a basic open-count is stored in local storage. If you do not want this to happen, then disable smart sort here, but you wil no longer be able to use these sort options. Defaults to `false`.
+**`disableUpdateChecks`** | `boolean` | _Optional_ | If set to true, Dashy will not check for updates. Defaults to `false`.
+**`enableServiceWorker`** | `boolean` | _Optional_ | Service workers cache web applications to improve load times and offer basic offline functionality, and are enabled by default in Dashy. The service worker can sometimes cause older content to be cached, requiring the app to be hard-refreshed. If you do not want SW functionality, or are having issues with caching, set this property to `true` to disable all service workers.
+**`disableContextMenu`** | `boolean` | _Optional_ | If set to `true`, the custom right-click context menu will be disabled. Defaults to `false`.
+
+**[⬆️ Back to Top](#configuring)**
+
+### `appConfig.auth` _(optional)_
+**Field** | **Type** | **Required**| **Description**
+--- | --- | --- | ---
+**`users`** | `array` | _Optional_ | An array of objects containing usernames and hashed passwords. If this is not provided, then authentication will be off by default, and you will not need any credentials to access the app. See [`appConfig.auth.users`](#appconfigauthusers-optional). **Note** this method of authentication is handled on the client side, so for security critical situations, it is recommended to use an [alternate authentication method](/docs/authentication.md#alternative-authentication-methods).
+**`enableKeycloak`** | `boolean` | _Optional_ | If set to `true`, then authentication using Keycloak will be anabled. Note that you need to have an instance running, and have also configured `auth.keycloak`. Defaults to `false`
+**`keycloak`** | `object` | _Optional_ | Config options to point Dashy to your Keycloak server. Requires `enableKeycloak: true`. See [`auth.keycloak`](#appconfigauthkeycloak-optional) for more info
+**`enableGuestAccess`** | `boolean` | _Optional_ | When set to `true`, an unauthenticated user will be able to access the dashboard, with read-only access, without having to login. Requires `auth.users` to be configured. Defaults to `false`.
+
+For more info, see the **[Authentication Docs](/docs/authentication.md)**
+
+**[⬆️ Back to Top](#configuring)**
+
+### `appConfig.auth.users` _(optional)_
+
+**Field** | **Type** | **Required**| **Description**
+--- | --- | --- | ---
+**`user`** | `string` | Required | Username to log in with
+**`hash`** | `string` | Required | A SHA-256 hashed password
+**`type`** | `string` | _Optional_ | The user type, either admin or normal
+
+**[⬆️ Back to Top](#configuring)**
+
+### `appConfig.auth.keycloak` _(optional)_
+
+**Field** | **Type** | **Required**| **Description**
+--- | --- | --- | ---
+**`serverUrl`** | `string` | Required | The URL (or URL/ IP + Port) where your keycloak server is running
+**`realm`** | `string` | Required | The name of the realm (must already be created) that you want to use
+**`clientId`** | `string` | Required | The Client ID of the client you created for use with Dashy
+
+**[⬆️ Back to Top](#configuring)**
+
+### `appConfig.webSearch` _(optional)_
+
+**Field** | **Type** | **Required**| **Description**
+--- | --- | --- | ---
+**`disableWebSearch`** | `string` | _Optional_ | Web search is enabled by default, but can be disabled by setting this property to `true`
+**`searchEngine`** | `string` | _Optional_ | Set the key name for your search engine. Can also use a custom engine by setting this property to `custom`. Currently supported: `duckduckgo`, `google`, `whoogle`, `qwant`, `startpage`, `searx-bar` and `searx-info`. Defaults to `duckduckgo`
+**`customSearchEngine`** | `string` | _Optional_ | You can also use a custom search engine, or your own self-hosted instance. This requires `searchEngine: custom` to be set. Then add the URL of your service, with GET query string included here
+**`openingMethod`** | `string` | _Optional_ | Set your preferred opening method for search results: `newtab`, `sametab`, `workspace`. Defaults to `newtab`
+**`searchBangs`** | `object` | _Optional_ | A key-value-pair set of custom search _bangs_ for redirecting query to a specific app or search engine. The key of each should be the bang you will type (typically starting with `/`, `!` or `:`), and value is the destination, either as a search engine key (e.g. `reddit`) or a URL with search parameters (e.g. `https://en.wikipedia.org/w/?search=`)
+
+
+**[⬆️ Back to Top](#configuring)**
+
+### `appConfig.hideComponents` _(optional)_
+
+**Field** | **Type** | **Required**| **Description**
+--- | --- | --- | ---
+**`hideHeading`** | `boolean` | _Optional_ | If set to `true`, the page title & sub-title will not be visible. Defaults to `false`
+**`hideNav`** | `boolean` | _Optional_ | If set to `true`, the navigation menu will not be visible. Defaults to `false`
+**`hideSearch`** | `boolean` | _Optional_ | If set to `true`, the search bar will not be visible. Defaults to `false`
+**`hideSettings`** | `boolean` | _Optional_ | If set to `true`, the settings menu will be initially collapsed. Defaults to `false`
+**`hideFooter`** | `boolean` | _Optional_ | If set to `true`, the footer will not be visible. Defaults to `false`
+
+**[⬆️ Back to Top](#configuring)**
+
+### `section`
+
+**Field** | **Type** | **Required**| **Description**
+--- | --- | --- | ---
+**`name`** | `string` | Required | The title for the section
+**`icon`** | `string` | _Optional_ | An single icon to be displayed next to the title. See [`section.icon`](#sectionicon-and-sectionitemicon)
+**`items`** | `array` | _Optional_ | An array of items to be displayed within the section. See [`item`](#sectionitem). Sections must include either 1 or more items, or 1 or more widgets.
+**`widgets`** | `array` | _Optional_ | An array of widgets to be displayed within the section. See [`widget`](#sectionwidget-optional)
+**`displayData`** | `object` | _Optional_ | Meta-data to optionally overide display settings for a given section. See [`displayData`](#sectiondisplaydata-optional)
+
+**[⬆️ Back to Top](#configuring)**
+
+### `section.item`
+
+**Field** | **Type** | **Required**| **Description**
+--- | --- | --- | ---
+**`title`** | `string` | Required | The text to display/ title of a given item. Max length `18`
+**`description`** | `string` | _Optional_ | Additional info about an item, which is shown in the tooltip on hover, or visible on large tiles
+**`url`** | `string` | Required | The URL / location of web address for when the item is clicked
+**`icon`** | `string` | _Optional_ | The icon for a given item. Can be a font-awesome icon, favicon, remote URL or local URL. See [`item.icon`](#sectionicon-and-sectionitemicon)
+**`target`** | `string` | _Optional_ | The opening method for when the item is clicked, either `newtab`, `sametab`, `modal`, `workspace`, `clipboard`, `top` or `parent`. Where `newtab` will open the link in a new tab, `sametab` will open it in the current tab, and `modal` will open a pop-up modal, `workspace` will open in the Workspace view and `clipboard` will copy the URL to system clipboard (but not launch app). Defaults to `newtab`
+**`hotkey`** | `number` | _Optional_ | Give frequently opened applications a numeric hotkey, between `0 - 9`. You can then just press that key to launch that application.
+**`tags`** | `string[]` | _Optional_ | A list of tags, which can be used for improved search
+**`statusCheck`** | `boolean` | _Optional_ | When set to `true`, Dashy will ping the URL associated with the current service, and display its status as a dot next to the item. The value here will override `appConfig.statusCheck` so you can turn off or on checks for a given service. Defaults to `appConfig.statusCheck`, falls back to `false`
+**`statusCheckUrl`** | `string` | _Optional_ | If you've enabled `statusCheck`, and want to use a different URL to what is defined under the item, then specify it here
+**`statusCheckHeaders`** | `object` | _Optional_ | If you're endpoint requires any specific headers for the status checking, then define them here
+**`statusCheckAllowInsecure`** | `boolean` | _Optional_ | By default, any request to insecure content will be blocked. Setting this option to `true` will disable the `rejectUnauthorized` option, enabling you to ping non-HTTPS services for the current item. Defaults to `false`
+**`color`** | `string` | _Optional_ | An optional color for the text and font-awesome icon to be displayed in. Note that this will override the current theme and so may not display well
+**`backgroundColor`** | `string` | _Optional_ | An optional background fill color for the that given item. Again, this will override the current theme and so might not display well against the background
+**`provider`** | `string` | _Optional_ | The name of the provider for a given service, useful for when including hosted apps. In some themes, this is visible under the item name
+
+**[⬆️ Back to Top](#configuring)**
+
+### `section.widget` _(optional)_
+
+**Field** | **Type** | **Required**| **Description**
+--- | --- | --- | ---
+**`type`** | `string` | Required | The widget type. See [Widget Docs](/docs/widgets.md) for full list of supported widgets
+**`options`** | `object` | _Optional_ | Some widgets accept either optional or required additional options. Again, see the [Widget Docs](/docs/widgets.md) for full list of options
+**`updateInterval`** | `number` | _Optional_ | You can keep a widget constantly updated by specifying an update interval, in seconds. See [Continuous Updates Docs](/docs/widgets.md#continuous-updates) for more info
+**`useProxy`** | `boolean` | _Optional_ | Some widgets make API requests to services that are not CORS-enabled. For these instances, you will need to route requests through a proxy, Dashy has a built in CORS-proxy, which you can use by setting this option to `true`. Defaults to `false`. See the [Proxying Requests Docs](/docs/widgets.md#proxying-requests) for more info
+
+**[⬆️ Back to Top](#configuring)**
+
+
+### `section.displayData` _(optional)_
+
+**Field** | **Type** | **Required**| **Description**
+--- | --- | --- | ---
+**`sortBy`** | `string` | _Optional_ | The sort order for items within the current section. By default items are displayed in the order in which they are listed in within the config. The following sort options are supported: `most-used` (most opened apps first), `last-used` (the most recently used apps), `alphabetical`, `reverse-alphabetical`, `random` and `default`
+**`collapsed`** | `boolean` | _Optional_ | If true, the section will be collapsed initially, and will need to be clicked to open. Useful for less regularly used, or very long sections. Defaults to `false`
+**`cutToHeight`** | `boolean` | _Optional_ | By default, sections will fill available space. Set this option to true to match section height with content height
+**`rows`** | `number` | _Optional_ | Height of the section, specified as the number of rows it should span vertically, e.g. `2`. Defaults to `1`. Max is `5`.
+**`cols`** | `number` | _Optional_ | Width of the section, specified as the number of columns the section should span horizontally, e.g. `2`. Defaults to `1`. Max is `5`.
+**`itemSize`** | `string` | _Optional_ | Specify the size for items within this group, either `small`, `medium` or `large`. Note that this will overide any settings specified through the UI
+**`color`** | `string` | _Optional_ | A custom accent color for the section, as a hex code or HTML color (e.g. `#fff`)
+**`customStyles`** | `string` | _Optional_ | Custom CSS properties that should be applied to that section, e.g. `border: 2px dashed #ff0000;`
+**`sectionLayout`** | `string` | _Optional_ | Specify which CSS layout will be used to responsivley place items. Can be either `auto` (which uses flex layout), or `grid`. If `grid` is selected, then `itemCountX` and `itemCountY` may also be set. Defaults to `auto`
+**`itemCountX`** | `number` | _Optional_ | The number of items to display per row / horizontally. If not set, it will be calculated automatically based on available space. Can only be set if `sectionLayout` is set to `grid`. Must be a whole number between `1` and `12`
+**`itemCountY`** | `number` | _Optional_ | The number of items to display per column / vertically. If not set, it will be calculated automatically based on available space. If `itemCountX` is set, then `itemCountY` can be calculated automatically. Can only be set if `sectionLayout` is set to `grid`. Must be a whole number between `1` and `12`
+**`hideForUsers`** | `string[]` | _Optional_ | Current section will be visible to all users, except for those specified in this list
+**`showForUsers`** | `string[]` | _Optional_ | Current section will be hidden from all users, except for those specified in this list
+**`hideForGuests`** | `boolean` | _Optional_ | Current section will be visible for logged in users, but not for guests (see `appConfig.enableGuestAccess`). Defaults to `false`
+**`hideForKeycloakUsers`** | `object` | _Optional_ | Current section will be visible to all keycloak users, except for those configured via these groups and roles. See `hideForKeycloakUsers`
+**`showForKeycloakUsers`** | `object` | _Optional_ | Current section will be hidden from all keyclaok users, except for those configured via these groups and roles. See `showForKeycloakUsers`
+
+**[⬆️ Back to Top](#configuring)**
+
+### `section.icon` and `section.item.icon`
+
+**Field** | **Type** | **Required**| **Description**
+--- | --- | --- | ---
+**`icon`** | `string` | _Optional_ | The icon for a given item or section. See [Icon Docs](/docs/icons.md) for all available supported icon types, including: auto-fetched favicons, generative icons, emoji icons, home-lab service logos, font-awesome, simple-icons, material icons, and icons specified by URL
+
+**[⬆️ Back to Top](#configuring)**
+
+### `section.displayData.hideForKeycloakUsers` and `section.displayData.showForKeycloakUsers`
+
+**Field** | **Type** | **Required**| **Description**
+--- |------------| --- | ---
+**`groups`** | `string[]` | _Optional_ | Current Section will be hidden or shown based on the user having any of the groups in this list
+**`roles`** | `string[]` | _Optional_ | Current Section will be hidden or shown based on the user having any of the roles in this list
+
+**[⬆️ Back to Top](#configuring)**
+
+---
+
+## Notes
+
+### Editing Config through the UI
+
+Config can be modified directly through the UI, and then written to disk, or applied locally. This can be done wither with the raw config editor (introduced in V 0.6.5 / [#3](https://github.com/Lissy93/dashy/pull/3)), or the interactive editor (introduced in V 1.8.9 / [#298](https://github.com/Lissy93/dashy/pull/298)).
+
+
+
+### About YAML
+If you're new to YAML, it's pretty straight-forward. The format is exactly the same as that of JSON, but instead of using curly braces, structure is denoted using whitespace. This [quick guide](https://linuxhandbook.com/yaml-basics/) should get you up to speed in a few minutes, for more advanced topics take a look at this [Wikipedia article](https://en.wikipedia.org/wiki/YAML).
+
+### Config Saving Methods
+When updating the config through the JSON editor in the UI, you have two save options: **Local** or **Write to Disk**.
+- Changes saved locally will only be applied to the current user through the browser, and will not apply to other instances - you either need to use the cloud sync feature, or manually update the conf.yml file.
+- On the other-hand, if you choose to write changes to disk, then your main `conf.yml` file will be updated, and changes will be applied to all users, and visible across all devices. For this functionality to work, you must be running Dashy with using the Docker container, or the Node server. A backup of your current configuration will also be saved in the same directory.
+
+### Preventing Changes being Written to Disk
+To disallow any changes from being written to disk via the UI config editor, set `appConfig.allowConfigEdit: false`. If you are using users, and have setup `auth` within Dashy, then only users with `type: admin` will be able to write config changes to disk.
+
+### Example
+
+```yaml
+---
+pageInfo:
+ title: Home Lab
+sections: # An array of sections
+- name: Section 1 - Getting Started
+ items: # An array of items
+ - title: GitHub
+ description: Source code and documentation on GitHub
+ icon: fab fa-github
+ url: https://github.com/Lissy93/dashy
+ - title: Issues
+ description: View currently open issues, or raise a new one
+ icon: fas fa-bug
+ url: https://github.com/Lissy93/dashy/issues
+ - title: Demo
+ description: A live demo
+ icon: far fa-rocket
+ url: https://dashy-demo-1.netlify.app
+- name: Section 2 - Local Services
+ items:
+ - title: Firewall
+ icon: favicon
+ url: http://192.168.1.1/
+ - title: Game Server
+ icon: https://i.ibb.co/710B3Yc/space-invader-x256.png
+ url: http://192.168.130.1/
+```
+
+For more example config files, see: [this gist](https://gist.github.com/Lissy93/000f712a5ce98f212817d20bc16bab10)
+
+If you need any help, feel free to [Raise an Issue](https://github.com/Lissy93/dashy/issues/new?assignees=Lissy93&labels=%F0%9F%A4%B7%E2%80%8D%E2%99%82%EF%B8%8F+Question&template=question.md&title=%5BQUESTION%5D) or [Start a Discussion](https://github.com/Lissy93/dashy/discussions)
+
+Happy Configuring 🤓🔧
+
+**[⬆️ Back to Top](#configuring)**
+
diff --git a/docs/contributing.md b/docs/contributing.md
index 0f242c38..690a896e 100644
--- a/docs/contributing.md
+++ b/docs/contributing.md
@@ -1,14 +1,8 @@
# Contributing
First off, thank you for considering contributing towards Dashy! 🙌
-There are several ways that you can help out (but don't feel you have to).
-Any contributions, however small will always be very much appreciated, and you will be appropriately credited in the readme - huge thank you to [everyone who has helped](/docs/credits.md) so far 💞
-
-## Submit a PR
-Contributing to the code or documentation is super helpful. You can fix a bug, add a new feature or improve an existing one. I've written [several guides](https://github.com/Lissy93/dashy/blob/master/docs/development-guides.md) to help you get started. For setting up the development environment, outline of the standards, and understanding the PR flow, see the [Development Docs](https://github.com/Lissy93/dashy/blob/master/docs/development.md). I've tried to keep the code neat and documentation thorough, so understanding what everything does should be fairly straight forward, but feel free to ask if you have any questions.
-
-## Add Translations
-If you speak another language, then adding translations would be really helpful, and you will be credited in the readme for your work. Multi-language support makes Dashy accessible for non-English speakers, which I feel is important. This is a very quick and easy task, as all application text is located in [`locales/en.json`](https://github.com/Lissy93/dashy/blob/master/src/assets/locales/en.json), so adding a new language is as simple as copying this file and translating the values. You don't have to translate it all, as any missing attributes will just fallback to English. For a full tutorial, see the [Multi-Language Support Docs](https://github.com/Lissy93/dashy/blob/master/docs/multi-language-support.md).
+There are several ways that you can help out, and any contributions, however small will always be very much appreciated.
+You will be appropriately credited in the readme - huge thank you to [everyone who has helped](/docs/credits.md) so far 💞
## Take a 2-minute survey
Help improve Dashy by taking a very short, 6-question survey. This will give me a better understanding of what is important to you, so that I can make Dashy better in the future :)
@@ -16,51 +10,18 @@ Help improve Dashy by taking a very short, 6-question survey. This will give me
[](https://survey.typeform.com/to/gl0L68ou)
## Share your dashboard
-Dashy now has a [Showcase](https://github.com/Lissy93/dashy/blob/master/docs/showcase.md#dashy-showcase-) where you can show off a screenshot of your dashboard, and get inspiration from other users. I also really enjoy seeing how people are using Dashy. To [submit your dashboard](https://github.com/Lissy93/dashy/blob/master/docs/showcase.md#submitting-your-dashboard), please either open a PR or raise an issue.
+Dashy now has a [Showcase](https://github.com/Lissy93/dashy/blob/master/docs/showcase.md#dashy-showcase-) where you can show off a screenshot of your dashboard, and get inspiration from other users (and I really love seeing how people are using Dashy). To [submit your dashboard](https://github.com/Lissy93/dashy/blob/master/docs/showcase.md#submitting-your-dashboard), either open a PR or raise an issue.
-## Improve the Docs
-Found a typo, or something that isn't as clear as it could be? Maybe I've missed something off altogether, or you hit a roadblock that took you a while to figure out. Submitting a pull request to add to or improve the documentation will help future users get Dashy up and running more easily.
-All content is located either in the [`./README.md`](/README.md) or [`/docs/`](/docs) directory, and synced to the Wiki and website using a GH [action](/actions/workflows/wiki-sync.yml).
-
-## Raise a bug
-If you've found a bug, then please do raise it as an issue. This will help me know if there's something that needs fixing. Try and include as much detail as possible, such as your environment, steps to reproduce, any console output and maybe an example screenshot or recording if necessary.
-
-[](https://github.com/Lissy93/dashy/issues/new?assignees=lissy93&labels=%F0%9F%90%9B+Bug&template=bug.yml&title=%5BBUG%5D+%3Ctitle%3E)
-
-## Join the discussion
-I've enabled the discussion feature on GitHub, here you can share tips and tricks, useful information, or your dashboard. You can also ask questions, and offer basic support to other users.
-
-[](https://github.com/Lissy93/dashy/discussions)
-
-## Spread the word
-Dashy is still a relatively young project, and as such not many people know of it. It would be great to see more users, and so it would be awesome if you could consider sharing on social platforms.
-
-[](https://mastodon.social/?text=Check%20out%20Dashy%2C%20the%20privacy-friendly%2C%20self-hosted%20startpage%20for%20organizing%20your%20life%3A%20https%3A%2F%2Fgithub.com%2FLissy93%2Fdashy%20-%20By%20%40lissy93%40mastodon.social)
-[](http://www.reddit.com/submit?url=https://github.com/Lissy93/dashy&title=Dashy%20-%20The%20self-hosted%20dashboard%20for%20your%20homelab%20%F0%9F%9A%80)
-[](https://twitter.com/intent/tweet?url=https://github.com/lissy93/dashy&text=Check%20out%20Dashy%20by%20@Lissy_Sykes,%20the%20self-hosted%20dashboard%20for%20your%20homelab%20%F0%9F%9A%80)
-[](https://www.facebook.com/sharer/sharer.php?u=https://github.com/lissy93/dashy)
-[](https://www.linkedin.com/shareArticle?mini=true&url=https://github.com/lissy93/dashy)
-[](https://pinterest.com/pin/create/button/?url=https://github.com/lissy93/dashy&media=https://raw.githubusercontent.com/Lissy93/dashy/master/docs/showcase/1-home-lab-material.png&description=Check%20out%20Dashy,%20the%20self-hosted%20dashboard%20for%20your%20homelab%20%F0%9F%9A%80)
-[](https://vk.com/share.php?url=https%3A%2F%2Fgithub.com%2Flissy93%2Fdashy%2F&title=Check%20out%20Dashy%20-%20The%20Self-Hosted%20Dashboard%20for%20your%20Homelab%20%F0%9F%9A%80)
-[](viber://forward?text=https%3A%2F%2Fgithub.com%2Flissy93%2Fdashy%0ACheck%20out%20Dashy%2C%20the%20self-hosted%20dashboard%20for%20your%20homelab%20%F0%9F%9A%80)
-[](https://t.me/share/url?url=https%3A%2F%2Fgithub.com%2Flissy93%2Fdashy&text=Check%20out%20Dashy%2C%20the%20self-hosted%20dashboard%20for%20your%20homelab%20%F0%9F%9A%80)
-[](mailto:info@example.com?&subject=Check%20out%20Dashy%20-%20The%20self-hosted%20dashboard%20for%20your%20homelab%20%F0%9F%9A%80&cc=&bcc=&body=https://github.com/lissy93/dashy)
-
-## Star, Upvote or Leave a Review
-Dashy is on the following platforms, and if you could spare a few seconds to give it an upvote or review, this will also help new users find it.
-
-[](https://www.producthunt.com/posts/dashy)
-[](https://alternativeto.net/software/dashy/about/)
-[](https://www.slant.co/improve/topics/27783/viewpoints/1/~self-hosted-homelab-startpage~dashy)
-[](https://github.com/Lissy93/dashy/stargazers)
-[](https://hub.docker.com/r/lissy93/dashy)
+[](https://github.com/Lissy93/dashy/issues/new?assignees=&labels=%F0%9F%92%AF+Showcase&template=showcase-addition.yml&title=%5BSHOWCASE%5D+%3Ctitle%3E)
## Make a small donation
-Please only do this is you can definitely afford to. Don't feel any pressure to donate anything, as Dashy and my other projects will always be 100% free, for everyone, for ever.
-[](https://github.com/sponsors/Lissy93)
+Donations help to cover server costs, development time and caffeine ;)
+Don't feel any pressure to donate anything, as Dashy and my other projects will always be 100% free, for everyone, for ever.
-Sponsoring will give you several perks, from $1 / £0.70 per month, as well as a sponsor badge on your profile, you can also be credited on the readme, with a link to your website/ profile/ socials, get priority support, have your feature ideas implemented, plus lots more. For more info, see [@Lissy93's Sponsor Page](https://github.com/sponsors/Lissy93).
+[](https://github.com/sponsors/Lissy93)
+
+Sponsoring will give you several perks - for $1 / £0.75 per month, you'll get a sponsor badge on your profile, be credited on the Dashy's readme, with a link to your website/ profile/ socials, get priority support, have your feature ideas implemented, plus lots more. For more info, see [@Lissy93's Sponsor Page](https://github.com/sponsors/Lissy93).
You can also send a one-off small contribution using crypto
@@ -77,13 +38,9 @@ Sponsoring will give you several perks, from $1 / £0.70 per month, as well as a
-## Request a feature via BountySource
-BountySource is a platform for sponsoring the development of certain features on open source projects. If there is a feature you'd like implemented into Dashy, but either isn't high enough priority or is deemed to be more work than it's worth, then you can instead contribute a bounty towards it's development. You won't pay a penny until your proposal is fully built, and you are satisfied with the result. This helps support the developers, and makes Dashy better for everyone.
-
-[](https://www.bountysource.com/teams/dashy)
-
## Enable Anonymous Bug Reports
-[Sentry](https://github.com/getsentry/sentry) is an open source error tracking and performance monitoring tool, which enables the identification any errors which occur in the production app (only if you enable it). It helps me to discover bugs I was unaware of, and then fix them, in order to make Dashy more reliable long term. This is a simple, yet really helpful step you can take to help improve Dashy.
+
+Bug reports helps me to discover bugs I was unaware of, and then fix them, in order to make Dashy more reliable long term. This is a simple, yet really helpful step you can take to help improve Dashy. [Sentry](https://github.com/getsentry/sentry) is an open source error tracking and performance monitoring tool, which enables the identification any errors which occur in the production app (only if you enable it).
To enable error reporting:
```yaml
@@ -91,7 +48,55 @@ appConfig:
enableErrorReporting: true
```
-All reporting is **disabled** by default, and no data will ever be sent to any external endpoint without your explicit consent. In fact, the error tracking package will not even be imported unless you have actively enabled it. All statistics are anonomized and stored securely. For more about privacy and security, see the [Sentry Docs](https://sentry.io/security/).
+All reporting is **disabled** by default, and no data will ever be sent to any external endpoint without your explicit consent. All statistics are anonomized and stored securely. For more about privacy and security, see the [Sentry Security Docs](https://sentry.io/security/).
+
+## Add Translations
+If you speak another language, then adding translations will help make Dashy available to non-native English speakers. This is a very quick and easy task, as all application text is located in [`locales/en.json`](https://github.com/Lissy93/dashy/blob/master/src/assets/locales/en.json), so adding a new language is as simple as copying this file and translating the values. You don't have to translate it all, as any missing attributes will just fallback to English. For a full tutorial, see the [Multi-Language Support Docs](https://github.com/Lissy93/dashy/blob/master/docs/multi-language-support.md).
+
+## Submit a PR
+Contributing to the code or docs is super helpful. You can fix a bug, add a new feature or improve an existing one. If you've built your own custom widget, theme or view, consider sharing it in a PR. I've written [several guides](/docs/development-guides.md) to help you get started, and the steps for setting up the development environment are outlined in the [Development Docs](/docs/development.md). Feel free to ask if you have any questions.
+
+## Improve the Docs
+Found a typo, or something that isn't as clear as it could be? Maybe I've missed something off altogether, or you hit a roadblock that took you a while to figure out. Submitting a pull request to add to or improve the documentation will help future users get Dashy up and running more easily.
+All content is located either in the [`./README.md`](/README.md) or [`/docs/`](/docs) directory, and synced to the Wiki and website using a GH [action](/actions/workflows/wiki-sync.yml).
+
+## Raise a bug
+If you've found a bug, then please do raise it as an issue. This will help me know if there's something that needs fixing. Try and include as much detail as possible, such as your environment, steps to reproduce, any console output and maybe an example screenshot or recording if necessary.
+
+[](https://github.com/Lissy93/dashy/issues/new?assignees=lissy93&labels=%F0%9F%90%9B+Bug&template=bug.yml&title=%5BBUG%5D+%3Ctitle%3E)
+
+## Join the discussion
+I've enabled the discussion feature on GitHub, here you can share tips and tricks, useful information, or your dashboard. You can also ask questions, and offer basic support to other users.
+
+[](https://github.com/Lissy93/dashy/discussions)
+
+## Request a feature via BountySource
+BountySource is a platform for sponsoring the development of certain features on open source projects. If there is a feature you'd like implemented into Dashy, but either isn't high enough priority or is deemed to be more work than it's worth, then you can instead contribute a bounty towards it's development. You won't pay a penny until your proposal is fully built, and you are satisfied with the result. This helps support the developers, and makes Dashy better for everyone.
+
+[](https://www.bountysource.com/teams/dashy)
+
+## Spread the word
+Dashy is still a relatively young project, and as such not many people know of it. It would be great to see more users, and so it would be awesome if you could consider sharing with your friends or on social platforms.
+
+[](https://mastodon.social/?text=Check%20out%20Dashy%2C%20the%20privacy-friendly%2C%20self-hosted%20startpage%20for%20organizing%20your%20life%3A%20https%3A%2F%2Fgithub.com%2FLissy93%2Fdashy%20-%20By%20%40lissy93%40mastodon.social)
+[](http://www.reddit.com/submit?url=https://github.com/Lissy93/dashy&title=Dashy%20-%20The%20self-hosted%20dashboard%20for%20your%20homelab%20%F0%9F%9A%80)
+[](https://twitter.com/intent/tweet?url=https://github.com/lissy93/dashy&text=Check%20out%20Dashy%20by%20@Lissy_Sykes,%20the%20self-hosted%20dashboard%20for%20your%20homelab%20%F0%9F%9A%80)
+[](https://www.facebook.com/sharer/sharer.php?u=https://github.com/lissy93/dashy)
+[](https://www.linkedin.com/shareArticle?mini=true&url=https://github.com/lissy93/dashy)
+[](https://pinterest.com/pin/create/button/?url=https://github.com/lissy93/dashy&media=https://raw.githubusercontent.com/Lissy93/dashy/master/docs/showcase/1-home-lab-material.png&description=Check%20out%20Dashy,%20the%20self-hosted%20dashboard%20for%20your%20homelab%20%F0%9F%9A%80)
+[](https://vk.com/share.php?url=https%3A%2F%2Fgithub.com%2Flissy93%2Fdashy%2F&title=Check%20out%20Dashy%20-%20The%20Self-Hosted%20Dashboard%20for%20your%20Homelab%20%F0%9F%9A%80)
+[](viber://forward?text=https%3A%2F%2Fgithub.com%2Flissy93%2Fdashy%0ACheck%20out%20Dashy%2C%20the%20self-hosted%20dashboard%20for%20your%20homelab%20%F0%9F%9A%80)
+[](https://t.me/share/url?url=https%3A%2F%2Fgithub.com%2Flissy93%2Fdashy&text=Check%20out%20Dashy%2C%20the%20self-hosted%20dashboard%20for%20your%20homelab%20%F0%9F%9A%80)
+[](mailto:info@example.com?&subject=Check%20out%20Dashy%20-%20The%20self-hosted%20dashboard%20for%20your%20homelab%20%F0%9F%9A%80&cc=&bcc=&body=https://github.com/lissy93/dashy)
+
+## Star, Upvote or Leave a Review
+Dashy is on the following platforms, and if you could spare a few seconds to give it an upvote or review, this will also help new users discover Dashy
+
+[](https://www.producthunt.com/posts/dashy)
+[](https://alternativeto.net/software/dashy/about/)
+[](https://www.slant.co/improve/topics/27783/viewpoints/1/~self-hosted-homelab-startpage~dashy)
+[](https://github.com/Lissy93/dashy/stargazers)
+[](https://hub.docker.com/r/lissy93/dashy)
## Follow for More
If you've enjoyed Dashy, you can follow the me to get updates about other projects that I am working on.
@@ -100,11 +105,11 @@ If you've enjoyed Dashy, you can follow the me to get updates about other projec
[](https://github.com/Lissy93)
[](https://mastodon.social/web/accounts/1032965)
[](https://keybase.io/aliciasykes)
-[](https://keybase.io/aliciasykes/pgp_keys.asc)
[](https://aliciasykes.com)
[](https://notes.aliciasykes.com/)
+[](https://keybase.io/aliciasykes/pgp_keys.asc)
-If you like, you could also consider [subscribing to my mailing list](https://notes.aliciasykes.com/subscribe) for very occasional blog post updates.
+If you like, you could also consider [subscribing to my mailing list](https://notes.aliciasykes.com/subscribe) for occasional blog post updates.
---
diff --git a/docs/credits.md b/docs/credits.md
index dbbb754f..631d60da 100644
--- a/docs/credits.md
+++ b/docs/credits.md
@@ -13,7 +13,7 @@
+```
+
+Or
+
+```yaml
+- type: embed
+ options:
+ css: '.coinmarketcap-currency-widget { color: var(--widget-text-color); }'
+ html: ''
+ scriptSrc: 'https://files.coinmarketcap.com/static/widget/currency.js'
+```
+
+---
+
+### API Response
+
+Directly output plain-text response from any API-enabled service.
+
+// Coming soon...
+
+---
+
+### Prometheus Data
+
+Display data from any service with a Prometheus exporter.
+
+// Coming soon...
+
+---
+
+### Data Feed
+
+Show live data from an RSS-enabled service. The only required parameter is `rssUrl`, which is the URL to the ATOM feed. See [RSS Widget](#rss-feed) for full list of available options.
+
+
+
+##### Example
+
+```yaml
+- type: rss-feed
+ options:
+ rssUrl: https://notes.aliciasykes.com/feed
+```
+
+---
+
+## Usage & Customizations
+
+### Widget Usage Guide
+
+Like items, widgets are placed under sections. You may have one or more widgets per section.
+
+In your YAML config file, this will look something like:
+
+```yaml
+sections:
+- name: Today
+ icon: far fa-calendar-day
+ widgets:
+ - type: clock
+ options:
+ format: en-GB
+ - type: weather
+ options:
+ apiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+ city: London
+ units: metric
+```
+
+> In this example, there is a single section, named "Today", using a Calendar icon from Font-Awesome. It has 2 widgets, a clock and the current weather.
+
+---
+
+### Continuous Updates
+
+By default, a widget which displays dynamic data from an external source, will only fetch results on page load. If you would like to keep data updated at all times, you can enable **Continuous Updates**. This is done by setting a time value in the `updateInterval` field.
+
+The value of `updateInterval` is optional, and is specified and seconds. It must be more than `10` and less than `7200`.
+
+For example, the following widget displaying stats from Pi-Hole will update ever 20 seconds.
+
+```yaml
+widgets:
+- type: pi-hole-stats
+ updateInterval: 20
+ options:
+ hostname: http://192.168.130.2
+```
+
+Note that if you have many widgets, and set them to continuously update frequently, you will notice a hit to performance. A widget that relies on data from an external API, will also consume your usage quota faster, if set to keep updating.
+
+---
+
+### Proxying Requests
+
+If a widget fails to make a data request, and the console shows a CORS error, this means the server is blocking client-side requests.
+
+Dashy has a built-in CORS proxy ([`services/cors-proxy.js`](https://github.com/Lissy93/dashy/blob/master/services/cors-proxy.js)), which will be used automatically by some widgets, or can be forced to use by other by setting the `useProxy` option.
+
+For example:
+
+```yaml
+widgets:
+- type: pi-hole-stats
+ useProxy: true
+ options:
+ hostname: http://pi-hole.local
+```
+
+Alternativley, and more securley, you can set the auth headers on your service to accept requests from Dashy. For example:
+
+```
+Access-Control-Allow-Origin: https://location-of-dashy/
+Vary: Origin
+```
+
+---
+
+### Widget Styling
+
+Like elsewhere in Dashy, all colours can be easily modified with CSS variables.
+
+Widgets use the following color variables, which can be overridden if desired:
+- `--widget-text-color` - Text color, defaults to `--primary`
+- `--widget-background-color` - Background color, defaults to `--background-darker`
+- `--widget-accent-color` - Accent color, defaults to `--background`
+
+For more info on how to apply custom variables, see the [Theming Docs](/docs/theming.md#setting-custom-css-in-the-ui)
+
+---
+
+### Customizing Charts
+
+For widgets that contain charts, you can set an array of colors under `chartColors`.
+To specify the chart height, set `chartHeight` to an integer (in `px`), defaults to `300`.
+For example:
+
+```yaml
+- type: gl-load-history
+ options:
+ hostname: http://192.168.130.2:61208
+ chartColors: ['#9b5de5', '#f15bb5', '#00bbf9', '#00f5d4']
+ chartHeight: 450
+```
+
+---
+
+### Language Translations
+
+Since most of the content displayed within widgets is fetched from an external API, unless that API supports multiple languages, translating dynamic content is not possible.
+
+However, any hard-coded content is translatable, and all dates and times will display in your local format.
+
+For more info about multi-language support, see the [Internationalization Docs](/docs/multi-language-support.md).
+
+---
+
+### Widget UI Options
+
+Widgets can be opened in full-page view, by clicking the Arrow icon (top-right). The URL in your address bar will also update, and visiting that web address directly will take you straight to that widget.
+
+You can reload the data of any widget, by clicking the Refresh Data icon (also in top-right). This will only affect the widget where the action was triggered from.
+
+All [config options](/docs/configuring.md#section) that can be applied to sections, can also be applied to widget sections. For example, to make a widget section double the width, set `displayData.cols: 2` within the parent section. You can collapse a widget (by clicking the section title), and collapse state will be saved locally.
+
+Widgets cannot currently be edited through the UI. This feature is in development, and will be released soon. In the meantime, you can either use the JSON config editor, or use [VS Code Server](https://github.com/coder/code-server), or just SSH into your box and edit the conf.yml file directly.
+
+---
+
+### Build your own Widget
+
+Widgets are built in a modular fashion, making it easy for anyone to create their own custom components.
+
+For a full tutorial on creating your own widget, you can follow [this guide](/docs/development-guides.md#building-a-widget), or take a look at [here](https://github.com/Lissy93/dashy/commit/3da76ce2999f57f76a97454c0276301e39957b8e) for a code example.
+
+Alternatively, for displaying simple data, you could also just use the either the [iframe](#iframe-widget), [embed](#html-embedded-widget), [data feed](#data-feed) or [API response](#api-response) widgets.
+
+---
+
+### Requesting a Widget
+
+Suggestions for widget ideas are welcome. But there is no guarantee that I will build your widget idea.
+
+You can suggest a widget [here](https://git.io/Jygo3), please star the repo before submitting a ticket.
+
+Please only request widgets for services that:
+- Have a publicly accessible API
+- Are CORS and HTTPS enabled
+- Are free to use, or have a free plan
+- Allow for use in their Terms of Service
+- Would be useful for other users
+
+For services that are not officially supported, it is likely still possible to display data using either the [iframe](#iframe-widget), [embed](#html-embedded-widget) or [API response](#api-response) widgets. For more advanced features, like charts and action buttons, you could also build your own widget, using [this tutorial](/docs/development-guides.md#building-a-widget), it's fairly straight forward, and you can use an [existing widget](https://github.com/Lissy93/dashy/tree/master/src/components/Widgets) (or [this example](https://git.io/JygKI)) as a template.
+
+---
+
+### Troubleshooting Widget Errors
+
+If an error occurs when fetching or rendering results, you will see a short message in the UI. If that message doesn't addequatley explain the problem, then you can [open the browser console](/docs/troubleshooting.md#how-to-open-browser-console) to see more details.
+
+Before proceeding, ensure that if the widget requires auth your API is correct, and for custom widgets, double check that the URL and protocol is correct.
+
+If you're able to, you can find more information about why the request may be failing in the Dev Tools under the Network tab, and you can ensure your endpoint is correct and working using a tool like Postman.
+
+#### CORS Errors
+
+The most common issue is a CORS error. This is a browser security mechanism which prevents the client-side app (Dashy) from from accessing resources on a remote origin, without that server's explicit permission (e.g. with headers like Access-Control-Allow-Origin). See the MDN Docs for more info: [Cross-Origin Resource Sharing](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS).
+
+There are several ways to fix a CORS error:
+
+##### Option 1 - Ensure Correct Protocol
+You will get a CORS error if you try and access a http service from a https source. So ensure that the URL you are requesting has the right protocol, and is correctly formatted.
+
+##### Option 2 - Set Headers
+
+If you have control over the destination (e.g. for a self-hosted service), then you can simply apply the correct headers.
+Add the `Access-Control-Allow-Origin` header, with the value of either `*` to allow requests from anywhere, or more securely, the host of where Dashy is served from. For example:
+
+```
+Access-Control-Allow-Origin: https://url-of-dashy.local
+```
+
+or
+
+```
+Access-Control-Allow-Origin: *
+```
+
+##### Option 3 - Proxying Request
+
+You can route requests through Dashy's built-in CORS proxy. Instructions and more details can be found [here](#proxying-requests). If you don't have control over the target origin, and you are running Dashy either through Docker, with the Node server or on Netlify, then this solution will work for you.
+
+Just add the `useProxy: true` option to the failing widget.
+
+##### Option 4 - Use a plugin
+
+For testing purposes, you can use an addon, which will disable the CORS checks. You can get the Allow-CORS extension for [Chrome](https://chrome.google.com/webstore/detail/allow-cors-access-control/lhobafahddgcelffkeicbaginigeejlf?hl=en-US) or [Firefox](https://addons.mozilla.org/en-US/firefox/addon/access-control-allow-origin/), more details [here](https://mybrowseraddon.com/access-control-allow-origin.html)
+
+---
+
+### Raising an Issue
+
+If you need to submit a bug report for a failing widget, then please include the full console output (see [how](/docs/troubleshooting.md#how-to-open-browser-console)) as well as the relevant parts of your config file. Before sending the request, ensure you've read the docs. If you're new to GitHub, an haven't previously contributed to the project, then please fist star the repo to avoid your ticket being closed by the anti-spam bot.
\ No newline at end of file
diff --git a/netlify.toml b/netlify.toml
index 6ed4983e..e0062796 100644
--- a/netlify.toml
+++ b/netlify.toml
@@ -1,42 +1,48 @@
-# Enables you to easily deploy a fork of Dashy to Netlify
-# without the need to configure anything in admin UI
-# Docs: https://www.netlify.com/docs/netlify-toml-reference/
-
-# Essential site config
-[build]
- base = "/"
- command = "yarn build"
- publish = "dist"
- functions = "services/serverless-functions"
-
-# Site info, used for the 1-Click deploy page
-[template.environment]
- STATUSKIT_PAGE_TITLE = "Dashy"
- STATUSKIT_COMPANY_LOGO = "https://raw.githubusercontent.com/Lissy93/dashy/master/docs/assets/logo.png"
- STATUSKIT_SUPPORT_CONTACT_LINK = "https://github.com/lissy93/dashy"
- STATUSKIT_RESOURCES_LINK = "https://dashy.to/docs"
-
-# Redirect the Node endpoints to serverless functions
-[[redirects]]
- from = "/status-check"
- to = "/.netlify/functions/cloud-status-check"
- status = 301
- force = true
-[[redirects]]
- from = "/config-manager/*"
- to = "/.netlify/functions/not-supported"
- status = 301
- force = true
-
-# For router history mode, ensure pages land on index
-[[redirects]]
- from = "/*"
- to = "/index.html"
- status = 200
-
-# Set any security headers here
-[[headers]]
- for = "/*"
- [headers.values]
- # Uncomment to enable Netlify user control. You must have a paid plan.
- # Basic-Auth = "someuser:somepassword anotheruser:anotherpassword"
+# Enables you to easily deploy a fork of Dashy to Netlify
+# without the need to configure anything in admin UI
+# Docs: https://www.netlify.com/docs/netlify-toml-reference/
+
+# Essential site config
+[build]
+ base = "/"
+ command = "yarn build"
+ publish = "dist"
+ functions = "services/serverless-functions"
+
+# Site info, used for the 1-Click deploy page
+[template.environment]
+ STATUSKIT_PAGE_TITLE = "Dashy"
+ STATUSKIT_COMPANY_LOGO = "https://raw.githubusercontent.com/Lissy93/dashy/master/docs/assets/logo.png"
+ STATUSKIT_SUPPORT_CONTACT_LINK = "https://github.com/lissy93/dashy"
+ STATUSKIT_RESOURCES_LINK = "https://dashy.to/docs"
+
+# Redirect the Node endpoints to serverless functions
+[[redirects]]
+ from = "/status-check"
+ to = "/.netlify/functions/cloud-status-check"
+ status = 301
+ force = true
+[[redirects]]
+ from = "/config-manager/*"
+ to = "/.netlify/functions/not-supported"
+ status = 301
+ force = true
+[[redirects]]
+ from = "/cors-proxy"
+ to = "/.netlify/functions/netlify-cors"
+ status = 301
+ force = true
+
+# For router history mode, ensure pages land on index
+[[redirects]]
+ from = "/*"
+ to = "/index.html"
+ status = 200
+
+# Set any security headers here
+[[headers]]
+ for = "/*"
+ [headers.values]
+ # Uncomment to enable Netlify user control. You must have a paid plan.
+ # Basic-Auth = "someuser:somepassword anotheruser:anotherpassword"
+
diff --git a/package.json b/package.json
index 59685373..83331ee7 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "Dashy",
- "version": "1.9.3",
+ "version": "1.9.9",
"license": "MIT",
"main": "server",
"author": "Alicia Sykes (https://aliciasykes.com)",
@@ -25,6 +25,7 @@
"connect-history-api-fallback": "^1.6.0",
"crypto-js": "^4.1.1",
"express": "^4.17.1",
+ "frappe-charts": "^1.6.2",
"js-yaml": "^4.1.0",
"keycloak-js": "^15.0.2",
"register-service-worker": "^1.6.2",
diff --git a/public/fonts/Digital-Regular.ttf b/public/fonts/Digital-Regular.ttf
new file mode 100644
index 00000000..5dbe6f90
Binary files /dev/null and b/public/fonts/Digital-Regular.ttf differ
diff --git a/public/widget-resources/WeatherIcons.eot b/public/widget-resources/WeatherIcons.eot
new file mode 100644
index 00000000..30cde10b
Binary files /dev/null and b/public/widget-resources/WeatherIcons.eot differ
diff --git a/public/widget-resources/WeatherIcons.svg b/public/widget-resources/WeatherIcons.svg
new file mode 100644
index 00000000..a6bebbf0
--- /dev/null
+++ b/public/widget-resources/WeatherIcons.svg
@@ -0,0 +1,69 @@
+
+
+
diff --git a/public/widget-resources/WeatherIcons.ttf b/public/widget-resources/WeatherIcons.ttf
new file mode 100644
index 00000000..55925b45
Binary files /dev/null and b/public/widget-resources/WeatherIcons.ttf differ
diff --git a/public/widget-resources/WeatherIcons.woff b/public/widget-resources/WeatherIcons.woff
new file mode 100644
index 00000000..05b3b406
Binary files /dev/null and b/public/widget-resources/WeatherIcons.woff differ
diff --git a/public/widget-resources/WeatherIcons.woff2 b/public/widget-resources/WeatherIcons.woff2
new file mode 100644
index 00000000..e7176427
Binary files /dev/null and b/public/widget-resources/WeatherIcons.woff2 differ
diff --git a/server.js b/server.js
index f3455f46..bc66efc3 100644
--- a/server.js
+++ b/server.js
@@ -24,7 +24,9 @@ require('./services/config-validator'); // Include and kicks off the config file
const statusCheck = require('./services/status-check'); // Used by the status check feature, uses GET
const saveConfig = require('./services/save-config'); // Saves users new conf.yml to file-system
const rebuild = require('./services/rebuild-app'); // A script to programmatically trigger a build
-const sslServer = require('./services/ssl-server');
+const systemInfo = require('./services/system-info'); // Basic system info, for resource widget
+const sslServer = require('./services/ssl-server'); // TLS-enabled web server
+const corsProxy = require('./services/cors-proxy'); // Enables API requests to CORS-blocked services
/* Helper functions, and default config */
const printMessage = require('./services/print-message'); // Function to print welcome msg on start
@@ -91,6 +93,24 @@ const app = express()
}).catch((response) => {
res.end(JSON.stringify(response));
});
+ })
+ // GET endpoint to return system info, for widget
+ .use(ENDPOINTS.systemInfo, (req, res) => {
+ try {
+ const results = systemInfo();
+ systemInfo.success = true;
+ res.end(JSON.stringify(results));
+ } catch (e) {
+ res.end(JSON.stringify({ success: false, message: e }));
+ }
+ })
+ // GET for accessing non-CORS API services
+ .use(ENDPOINTS.corsProxy, (req, res) => {
+ try {
+ corsProxy(req, res);
+ } catch (e) {
+ res.end(JSON.stringify({ success: false, message: e }));
+ }
});
/* Create HTTP server from app on port, and print welcome message */
diff --git a/services/cors-proxy.js b/services/cors-proxy.js
new file mode 100644
index 00000000..9c51214c
--- /dev/null
+++ b/services/cors-proxy.js
@@ -0,0 +1,47 @@
+/**
+ * A simple CORS proxy, for accessing API services which aren't CORS-enabled.
+ * Receives requests from frontend, applies correct access control headers,
+ * makes request to endpoint, then responds to the frontend with the response
+ */
+
+const axios = require('axios');
+
+module.exports = (req, res) => {
+ // Apply allow-all response headers
+ res.header('Access-Control-Allow-Origin', '*');
+ res.header('Access-Control-Allow-Methods', 'GET, PUT, PATCH, POST, DELETE');
+ if (req.header('access-control-request-headers')) {
+ res.header('Access-Control-Allow-Headers', req.header('access-control-request-headers'));
+ }
+
+ // Pre-flight
+ if (req.method === 'OPTIONS') {
+ res.send();
+ return;
+ }
+
+ // Get desired URL, from Target-URL header
+ const targetURL = req.header('Target-URL');
+ if (!targetURL) {
+ res.status(500).send({ error: 'There is no Target-Endpoint header in the request' });
+ return;
+ }
+ // Apply any custom headers, if needed
+ const headers = req.header('CustomHeaders') ? JSON.parse(req.header('CustomHeaders')) : {};
+
+ // Prepare the request
+ const requestConfig = {
+ method: req.method,
+ url: targetURL,
+ json: req.body,
+ headers,
+ };
+
+ // Make the request, and respond with result
+ axios.request(requestConfig)
+ .then((response) => {
+ res.status(200).send(response.data);
+ }).catch((error) => {
+ res.status(500).send({ error });
+ });
+};
diff --git a/services/serverless-functions/netlify-cors.js b/services/serverless-functions/netlify-cors.js
new file mode 100644
index 00000000..3789238e
--- /dev/null
+++ b/services/serverless-functions/netlify-cors.js
@@ -0,0 +1,48 @@
+/* A Netlify cloud function to handle requests to CORS-disabled services */
+const axios = require('axios');
+
+exports.handler = (event, context, callback) => {
+ // Get input data
+ const { body, headers, queryStringParameters } = event;
+
+ // Get URL from header or GET param
+ const requestUrl = queryStringParameters.url || headers['Target-URL'] || headers['target-url'];
+
+ const returnError = (msg, error) => {
+ callback(null, {
+ statusCode: 400,
+ body: JSON.stringify({ success: false, msg, error }),
+ });
+ };
+ // If URL missing, return error
+ if (!requestUrl) {
+ returnError('Missing Target-URL header', null);
+ }
+
+ let custom = {};
+ try {
+ custom = JSON.parse(headers.CustomHeaders || headers.customheaders || '{}');
+ } catch (e) { returnError('Unable to parse custom headers'); }
+
+ // Response headers
+ const requestHeaders = {
+ 'Access-Control-Allow-Origin': '*',
+ ...custom,
+ };
+
+ // Prepare request
+ const requestConfig = {
+ method: 'GET',
+ url: requestUrl,
+ json: body,
+ headers: requestHeaders,
+ };
+
+ // Make request
+ axios.request(requestConfig)
+ .then((response) => {
+ callback(null, { statusCode: 200, body: JSON.stringify(response.data) });
+ }).catch((error) => {
+ returnError('Request failed', error);
+ });
+};
diff --git a/services/system-info.js b/services/system-info.js
new file mode 100644
index 00000000..baf10012
--- /dev/null
+++ b/services/system-info.js
@@ -0,0 +1,24 @@
+/**
+ * Gets basic system info, for the resource usage widget
+ */
+const os = require('os');
+
+module.exports = () => {
+ const meta = {
+ timestamp: new Date(),
+ uptime: os.uptime(),
+ hostname: os.hostname(),
+ username: os.userInfo().username,
+ system: `${os.version()} (${os.platform()})`,
+ };
+
+ const memory = {
+ total: `${Math.round(os.totalmem() / (1024 * 1024 * 1024))} GB`,
+ freePercent: (os.freemem() / os.totalmem()).toFixed(2),
+ };
+
+ const loadAv = os.loadavg();
+ const load = { one: loadAv[0], five: loadAv[1], fifteen: loadAv[2] };
+
+ return { meta, memory, load };
+};
diff --git a/src/App.vue b/src/App.vue
index d1f0e761..d669556f 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -19,7 +19,6 @@ import Keys from '@/utils/StoreMutations';
import {
localStorageKeys,
splashScreenTime,
- visibleComponents as defaultVisibleComponents,
language as defaultLanguage,
} from '@/utils/defaults';
@@ -36,6 +35,12 @@ export default {
isLoading: true, // Set to false after mount complete
};
},
+ watch: {
+ isEditMode(isEditMode) {
+ // When in edit mode, show confirmation dialog on page exit
+ window.onbeforeunload = isEditMode ? this.confirmExit : null;
+ },
+ },
computed: {
/* If the user has specified custom text for footer - get it */
footerText() {
@@ -43,7 +48,7 @@ export default {
},
/* Determine if splash screen should be shown */
shouldShowSplash() {
- return (this.visibleComponents || defaultVisibleComponents).splashScreen;
+ return (this.appConfig.showSplashScreen);
},
config() {
return this.$store.state.config;
@@ -77,7 +82,7 @@ export default {
/* Hide splash screen, either after 2 seconds, or immediately based on user preference */
hideSplash() {
if (this.shouldShowSplash) {
- setTimeout(() => { this.isLoading = false; }, splashScreenTime || 1500);
+ setTimeout(() => { this.isLoading = false; }, splashScreenTime || 1000);
} else {
this.isLoading = false;
}
@@ -118,21 +123,27 @@ export default {
this.$i18n.locale = language;
document.getElementsByTagName('html')[0].setAttribute('lang', language);
},
+ /* If placeholder element still visible, hide it */
hideLoader() {
const loader = document.getElementById('loader');
if (loader) loader.style.display = 'none';
},
+ /* Called when in edit mode and navigating away from page */
+ confirmExit(e) {
+ e.preventDefault();
+ return 'You may have unsaved edits. Are you sure you want to exit the page?';
+ },
},
- /* When component mounted, hide splash and initiate the injection of custom styles */
+ /* Basic initialization tasks on app load */
mounted() {
- this.applyLanguage();
- this.hideSplash();
- if (this.appConfig.customCss) {
+ this.applyLanguage(); // Apply users local language
+ this.hideSplash(); // Hide the splash screen, if visible
+ if (this.appConfig.customCss) { // Inject users custom CSS, if present
const cleanedCss = this.appConfig.customCss.replace(/<\/?[^>]+(>|$)/g, '');
this.injectCustomStyles(cleanedCss);
- this.hideLoader();
}
- welcomeMsg();
+ this.hideLoader(); // If initial placeholder still visible, hide it
+ welcomeMsg(); // Show message in console
},
};
diff --git a/src/assets/interface-icons/open-clipboard.svg b/src/assets/interface-icons/open-clipboard.svg
new file mode 100644
index 00000000..2f3bff6e
--- /dev/null
+++ b/src/assets/interface-icons/open-clipboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/interface-icons/widget-update.svg b/src/assets/interface-icons/widget-update.svg
new file mode 100644
index 00000000..29e37fbe
--- /dev/null
+++ b/src/assets/interface-icons/widget-update.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json
index 50d58465..6f7e1cd6 100644
--- a/src/assets/locales/en.json
+++ b/src/assets/locales/en.json
@@ -1,248 +1,295 @@
-{
- "home": {
- "no-results": "No Search Results",
- "no-data": "No Data Configured"
- },
- "search": {
- "search-label": "Search",
- "search-placeholder": "Start typing to filter",
- "clear-search-tooltip": "Clear Search",
- "enter-to-search-web": "Press enter to search the web"
- },
- "login": {
- "title": "Dashy",
- "username-label": "Username",
- "password-label": "Password",
- "login-button": "Login",
- "remember-me-label": "Remember me for",
- "remember-me-never": "Never",
- "remember-me-hour": "4 Hours",
- "remember-me-day": "1 Day",
- "remember-me-week": "1 Week",
- "remember-me-long-time": "A long time",
- "error-missing-username": "Missing Username",
- "error-missing-password": "Missing Password",
- "error-incorrect-username": "User not found",
- "error-incorrect-password": "Incorrect Password",
- "success-message": "Logging in...",
- "logout-message": "Logged Out",
- "already-logged-in-title": "Already Logged In",
- "already-logged-in-text": "You're logged in as",
- "proceed-to-dashboard": "Proceed to Dashboard",
- "log-out-button": "Logout",
- "proceed-guest-button": "Proceed as Guest"
- },
- "config": {
- "main-tab": "Main Menu",
- "view-config-tab": "View Config",
- "edit-config-tab": "Edit Config",
- "custom-css-tab": "Custom Styles",
- "heading": "Configuration Options",
- "download-config-button": "View / Export Config",
- "edit-config-button": "Edit Config",
- "edit-css-button": "Edit Custom CSS",
- "cloud-sync-button": "Enable Cloud Sync",
- "edit-cloud-sync-button": "Edit Cloud Sync",
- "rebuild-app-button": "Rebuild Application",
- "change-language-button": "Change App Language",
- "reset-settings-button": "Reset Local Settings",
- "app-info-button": "App Info",
- "backup-note": "It is recommend to make a backup of your configuration before making changes.",
- "reset-config-msg-l1": "This will remove all user settings from local storage, but won't effect your 'conf.yml' file.",
- "reset-config-msg-l2": "You should first backup any changes you've made locally, if you want to use them in the future.",
- "reset-config-msg-l3": "Are you sure you want to proceed?",
- "data-cleared-msg": "Data cleared successfully",
- "actions-label": "Actions",
- "copy-config-label": "Copy Config",
- "data-copied-msg": "Config has been copied to clipboard",
- "reset-config-label": "Reset Config",
- "css-save-btn": "Save Changes",
- "css-note-label": "Note",
- "css-note-l1": "You will need to refresh the page for your changes to take effect.",
- "css-note-l2": "Styles overrides are only stored locally, so it is recommended to make a copy of your CSS.",
- "css-note-l3": "To remove all custom styles, delete the contents and hit Save Changes"
- },
- "alternate-views": {
- "alternate-view-heading": "Switch View",
- "default": "Default",
- "workspace": "Workspace",
- "minimal": "Minimal"
- },
- "settings": {
- "theme-label": "Theme",
- "layout-label": "Layout",
- "layout-auto": "Auto",
- "layout-horizontal": "Horizontal",
- "layout-vertical": "Vertical",
- "item-size-label": "Item Size",
- "item-size-small": "Small",
- "item-size-medium": "Medium",
- "item-size-large": "Large",
- "config-launcher-label": "Config",
- "config-launcher-tooltip": "Update Configuration",
- "sign-out-tooltip": "Sign Out",
- "sign-in-tooltip": "Log In",
- "sign-in-welcome": "Hello {username}!"
- },
- "updates": {
- "app-version-note": "Dashy version",
- "up-to-date": "Up-to-Date",
- "out-of-date": "Update Available",
- "unsupported-version-l1": "You are using an unsupported version of Dashy",
- "unsupported-version-l2": "For the best experience, and recent security patches, please update to"
- },
- "language-switcher": {
- "title": "Change Application Language",
- "dropdown-label": "Select a Language",
- "save-button": "Save",
- "success-msg": "Language Updated to"
- },
- "theme-maker": {
- "title": "Theme Configurator",
- "export-button": "Export Custom Variables",
- "reset-button": "Reset Styles for",
- "show-all-button": "Show All Variables",
- "change-fonts-button": "Change Fonts",
- "save-button": "Save",
- "cancel-button": "Cancel",
- "saved-toast": "{theme} Updated Successfully",
- "copied-toast": "Theme data for {theme} copied to clipboard",
- "reset-toast": "Custom Colors for {theme} Removed"
- },
- "config-editor": {
- "save-location-label": "Save Location",
- "location-local-label": "Apply Locally",
- "location-disk-label": "Write Changes to Config File",
- "save-button": "Save Changes",
- "preview-button": "Preview Changes",
- "valid-label": "Config is Valid",
- "status-success-msg": "Task Complete",
- "status-fail-msg": "Task Failed",
- "success-msg-disk": "Config file written to disk successfully",
- "success-msg-local": "Local changes saved successfully",
- "success-note-l1": "The app should rebuild automatically.",
- "success-note-l2": "This may take up to a minute.",
- "success-note-l3": "You will need to refresh the page for changes to take effect.",
- "error-msg-save-mode": "Please select a Save Mode: Local or File",
- "error-msg-cannot-save": "An error occurred saving config",
- "error-msg-bad-json": "Error in JSON, possibly malformed",
- "warning-msg-validation": "Validation Warning",
- "not-admin-note": "You cannot write changed to disk, because you are not logged in as an admin"
- },
- "app-rebuild": {
- "title": "Rebuild Application",
- "rebuild-note-l1": "A rebuild is required for changes written to the conf.yml file to take effect.",
- "rebuild-note-l2": "This should happen automatically, but if it hasn't, you can manually trigger it here.",
- "rebuild-note-l3": "This is not required for modifications stored locally.",
- "rebuild-button": "Start Build",
- "rebuilding-status-1": "Building...",
- "rebuilding-status-2": "This may take a few minutes",
- "error-permission": "You don't have permission to trigger this action",
- "success-msg": "Build completed successfully",
- "fail-msg": "Build operation failed",
- "reload-note": "A page reload is now required for changes to take effect",
- "reload-button": "Reload Page"
- },
- "cloud-sync": {
- "title": "Cloud Backup & Restore",
- "intro-l1": "Cloud backup and restore is an optional feature, that enables you to upload your config to the internet, and then restore it on any other device or instance of Dashy.",
- "intro-l2": "All data is fully end-to-end encrypted with AES, using your password as the key.",
- "intro-l3": "For more info, please see the",
- "backup-title-setup": "Make a Backup",
- "backup-title-update": "Update Backup",
- "password-label-setup": "Choose a Password",
- "password-label-update": "Enter your Password",
- "backup-button-setup": "Backup",
- "backup-button-update": "Update Backup",
- "backup-id-label": "Your Backup ID",
- "backup-id-note": "This is used to restore from backups later. So keep it, along with your password somewhere safe.",
- "restore-title": "Restore a Backup",
- "restore-id-label": "Restore ID",
- "restore-password-label": "Password",
- "restore-button": "Restore",
- "backup-missing-password": "Missing Password",
- "backup-error-unknown": "Unable to process request",
- "backup-error-password": "Incorrect password. Please enter your current password.",
- "backup-success-msg": "Completed Successfully",
- "restore-success-msg": "Config Restored Successfully"
- },
- "menu": {
- "open-section-title": "Open In",
- "sametab": "Current Tab",
- "newtab": "New Tab",
- "modal": "Pop-Up Modal",
- "workspace": "Workspace View",
- "options-section-title": "Options",
- "edit-item": "Edit",
- "move-item": "Copy or Move",
- "remove-item": "Remove"
- },
- "context-menus": {
- "item": {
- "open-section-title": "Open In",
- "sametab": "Current Tab",
- "newtab": "New Tab",
- "modal": "Pop-Up Modal",
- "workspace": "Workspace View",
- "options-section-title": "Options",
- "edit-item": "Edit",
- "move-item": "Copy or Move",
- "remove-item": "Remove"
- },
- "section": {
- "open-section": "Open Section",
- "edit-section": "Edit",
- "move-section": "Move To",
- "remove-section": "Remove"
- }
- },
- "interactive-editor": {
- "menu": {
- "start-editing-tooltip": "Enter the Interactive Editor",
- "edit-site-data-subheading": "Edit Site Data",
- "edit-page-info-btn": "Edit Page Info",
- "edit-page-info-tooltip": "App title, description, nav links, footer text, etc",
- "edit-app-config-btn": "Edit App Config",
- "edit-app-config-tooltip": "All other app configuration options",
- "config-save-methods-subheading": "Config Saving Options",
- "save-locally-btn": "Save Locally",
- "save-locally-tooltip": "Save config locally, to browser storage. This will not affect your config file, but changes will only be saved on this device",
- "save-disk-btn": "Save to Disk",
- "save-disk-tooltip": "Save config to the conf.yml file on disk. This will backup, and then over-write your existing config",
- "export-config-btn": "Export Config",
- "export-config-tooltip": "View and export new config, either to a file, or to clipboard",
- "cloud-backup-btn": "Backup to Cloud",
- "cloud-backup-tooltip": "Save encrypted backup of configuration to cloud",
- "edit-raw-config-btn": "Edit Raw Config",
- "edit-raw-config-tooltip": "View and modify raw config via JSON editor",
- "cancel-changes-btn": "Cancel Edit",
- "cancel-changes-tooltip": "Reset current modifications, and exit Edit Mode. This will not affect your saved config",
- "edit-mode-name": "Edit Mode",
- "edit-mode-subtitle": "You are in Edit Mode",
- "edit-mode-description": "This means you can make modifications to your config, and preview the results, but until you save, none of your changes will be preserved.",
- "save-stage-btn": "Save",
- "cancel-stage-btn": "Cancel"
- },
- "edit-section": {
- "edit-section-title": "Edit Section",
- "add-section-title": "Add New Section",
- "edit-tooltip": "Click to Edit, or right-click for more options",
- "remove-confirm": "Are you sure you want to remove this section? This action can be undone later."
- },
- "edit-app-config": {
- "warning-msg-title": "Proceed with Caution",
- "warning-msg-l1": "The following options are for advanced app configuration.",
- "warning-msg-l2": "If you are unsure about any of the fields, please reference the",
- "warning-msg-docs": "documentation",
- "warning-msg-l3": "to avoid unintended consequences."
- },
- "export": {
- "export-title": "Export Config",
- "copy-clipboard-btn": "Copy to Clipboard",
- "copy-clipboard-tooltip": "Copy all app config to system clipboard, in YAML format",
- "download-file-btn": "Download as File",
- "download-file-tooltip": "Download all app config to your device, in a YAML file",
- "view-title": "View Config"
- }
- }
+{
+ "home": {
+ "no-results": "No Search Results",
+ "no-data": "No Data Configured",
+ "no-items-section": "No Items to Show Yet"
+ },
+ "search": {
+ "search-label": "Search",
+ "search-placeholder": "Start typing to filter",
+ "clear-search-tooltip": "Clear Search",
+ "enter-to-search-web": "Press enter to search the web"
+ },
+ "login": {
+ "title": "Dashy",
+ "username-label": "Username",
+ "password-label": "Password",
+ "login-button": "Login",
+ "remember-me-label": "Remember me for",
+ "remember-me-never": "Never",
+ "remember-me-hour": "4 Hours",
+ "remember-me-day": "1 Day",
+ "remember-me-week": "1 Week",
+ "remember-me-long-time": "A long time",
+ "error-missing-username": "Missing Username",
+ "error-missing-password": "Missing Password",
+ "error-incorrect-username": "User not found",
+ "error-incorrect-password": "Incorrect Password",
+ "success-message": "Logging in...",
+ "logout-message": "Logged Out",
+ "already-logged-in-title": "Already Logged In",
+ "already-logged-in-text": "You're logged in as",
+ "proceed-to-dashboard": "Proceed to Dashboard",
+ "log-out-button": "Logout",
+ "proceed-guest-button": "Proceed as Guest"
+ },
+ "config": {
+ "main-tab": "Main Menu",
+ "view-config-tab": "View Config",
+ "edit-config-tab": "Edit Config",
+ "custom-css-tab": "Custom Styles",
+ "heading": "Configuration Options",
+ "download-config-button": "View / Export Config",
+ "edit-config-button": "Edit Config",
+ "edit-css-button": "Edit Custom CSS",
+ "cloud-sync-button": "Enable Cloud Sync",
+ "edit-cloud-sync-button": "Edit Cloud Sync",
+ "rebuild-app-button": "Rebuild Application",
+ "change-language-button": "Change App Language",
+ "reset-settings-button": "Reset Local Settings",
+ "app-info-button": "App Info",
+ "backup-note": "It is recommend to make a backup of your configuration before making changes.",
+ "reset-config-msg-l1": "This will remove all user settings from local storage, but won't effect your 'conf.yml' file.",
+ "reset-config-msg-l2": "You should first backup any changes you've made locally, if you want to use them in the future.",
+ "reset-config-msg-l3": "Are you sure you want to proceed?",
+ "data-cleared-msg": "Data cleared successfully",
+ "actions-label": "Actions",
+ "copy-config-label": "Copy Config",
+ "data-copied-msg": "Config has been copied to clipboard",
+ "reset-config-label": "Reset Config",
+ "css-save-btn": "Save Changes",
+ "css-note-label": "Note",
+ "css-note-l1": "You will need to refresh the page for your changes to take effect.",
+ "css-note-l2": "Styles overrides are only stored locally, so it is recommended to make a copy of your CSS.",
+ "css-note-l3": "To remove all custom styles, delete the contents and hit Save Changes"
+ },
+ "alternate-views": {
+ "alternate-view-heading": "Switch View",
+ "default": "Default",
+ "workspace": "Workspace",
+ "minimal": "Minimal"
+ },
+ "settings": {
+ "theme-label": "Theme",
+ "layout-label": "Layout",
+ "layout-auto": "Auto",
+ "layout-horizontal": "Horizontal",
+ "layout-vertical": "Vertical",
+ "item-size-label": "Item Size",
+ "item-size-small": "Small",
+ "item-size-medium": "Medium",
+ "item-size-large": "Large",
+ "config-launcher-label": "Config",
+ "config-launcher-tooltip": "Update Configuration",
+ "sign-out-tooltip": "Sign Out",
+ "sign-in-tooltip": "Log In",
+ "sign-in-welcome": "Hello {username}!"
+ },
+ "updates": {
+ "app-version-note": "Dashy version",
+ "up-to-date": "Up-to-Date",
+ "out-of-date": "Update Available",
+ "unsupported-version-l1": "You are using an unsupported version of Dashy",
+ "unsupported-version-l2": "For the best experience, and recent security patches, please update to"
+ },
+ "language-switcher": {
+ "title": "Change Application Language",
+ "dropdown-label": "Select a Language",
+ "save-button": "Save",
+ "success-msg": "Language Updated to"
+ },
+ "theme-maker": {
+ "title": "Theme Configurator",
+ "export-button": "Export Custom Variables",
+ "reset-button": "Reset Styles for",
+ "show-all-button": "Show All Variables",
+ "change-fonts-button": "Change Fonts",
+ "save-button": "Save",
+ "cancel-button": "Cancel",
+ "saved-toast": "{theme} Updated Successfully",
+ "copied-toast": "Theme data for {theme} copied to clipboard",
+ "reset-toast": "Custom Colors for {theme} Removed"
+ },
+ "config-editor": {
+ "save-location-label": "Save Location",
+ "location-local-label": "Apply Locally",
+ "location-disk-label": "Write Changes to Config File",
+ "save-button": "Save Changes",
+ "preview-button": "Preview Changes",
+ "valid-label": "Config is Valid",
+ "status-success-msg": "Task Complete",
+ "status-fail-msg": "Task Failed",
+ "success-msg-disk": "Config file written to disk successfully",
+ "success-msg-local": "Local changes saved successfully",
+ "success-note-l1": "The app should rebuild automatically.",
+ "success-note-l2": "This may take up to a minute.",
+ "success-note-l3": "You will need to refresh the page for changes to take effect.",
+ "error-msg-save-mode": "Please select a Save Mode: Local or File",
+ "error-msg-cannot-save": "An error occurred saving config",
+ "error-msg-bad-json": "Error in JSON, possibly malformed",
+ "warning-msg-validation": "Validation Warning",
+ "not-admin-note": "You cannot write changed to disk, because you are not logged in as an admin"
+ },
+ "app-rebuild": {
+ "title": "Rebuild Application",
+ "rebuild-note-l1": "A rebuild is required for changes written to the conf.yml file to take effect.",
+ "rebuild-note-l2": "This should happen automatically, but if it hasn't, you can manually trigger it here.",
+ "rebuild-note-l3": "This is not required for modifications stored locally.",
+ "rebuild-button": "Start Build",
+ "rebuilding-status-1": "Building...",
+ "rebuilding-status-2": "This may take a few minutes",
+ "error-permission": "You don't have permission to trigger this action",
+ "success-msg": "Build completed successfully",
+ "fail-msg": "Build operation failed",
+ "reload-note": "A page reload is now required for changes to take effect",
+ "reload-button": "Reload Page"
+ },
+ "cloud-sync": {
+ "title": "Cloud Backup & Restore",
+ "intro-l1": "Cloud backup and restore is an optional feature, that enables you to upload your config to the internet, and then restore it on any other device or instance of Dashy.",
+ "intro-l2": "All data is fully end-to-end encrypted with AES, using your password as the key.",
+ "intro-l3": "For more info, please see the",
+ "backup-title-setup": "Make a Backup",
+ "backup-title-update": "Update Backup",
+ "password-label-setup": "Choose a Password",
+ "password-label-update": "Enter your Password",
+ "backup-button-setup": "Backup",
+ "backup-button-update": "Update Backup",
+ "backup-id-label": "Your Backup ID",
+ "backup-id-note": "This is used to restore from backups later. So keep it, along with your password somewhere safe.",
+ "restore-title": "Restore a Backup",
+ "restore-id-label": "Restore ID",
+ "restore-password-label": "Password",
+ "restore-button": "Restore",
+ "backup-missing-password": "Missing Password",
+ "backup-error-unknown": "Unable to process request",
+ "backup-error-password": "Incorrect password. Please enter your current password.",
+ "backup-success-msg": "Completed Successfully",
+ "restore-success-msg": "Config Restored Successfully"
+ },
+ "menu": {
+ "open-section-title": "Open In",
+ "sametab": "Current Tab",
+ "newtab": "New Tab",
+ "modal": "Pop-Up Modal",
+ "workspace": "Workspace View",
+ "options-section-title": "Options",
+ "edit-item": "Edit",
+ "move-item": "Copy or Move",
+ "remove-item": "Remove"
+ },
+ "context-menus": {
+ "item": {
+ "open-section-title": "Open In",
+ "sametab": "Current Tab",
+ "newtab": "New Tab",
+ "modal": "Pop-Up Modal",
+ "workspace": "Workspace View",
+ "clipboard": "Copy to Clipboard",
+ "options-section-title": "Options",
+ "edit-item": "Edit",
+ "move-item": "Copy or Move",
+ "remove-item": "Remove",
+ "copied-toast": "URL has been copied to clipboard"
+ },
+ "section": {
+ "open-section": "Open Section",
+ "edit-section": "Edit",
+ "move-section": "Move To",
+ "remove-section": "Remove"
+ }
+ },
+ "interactive-editor": {
+ "menu": {
+ "start-editing-tooltip": "Enter the Interactive Editor",
+ "edit-site-data-subheading": "Edit Site Data",
+ "edit-page-info-btn": "Edit Page Info",
+ "edit-page-info-tooltip": "App title, description, nav links, footer text, etc",
+ "edit-app-config-btn": "Edit App Config",
+ "edit-app-config-tooltip": "All other app configuration options",
+ "config-save-methods-subheading": "Config Saving Options",
+ "save-locally-btn": "Save Locally",
+ "save-locally-tooltip": "Save config locally, to browser storage. This will not affect your config file, but changes will only be saved on this device",
+ "save-disk-btn": "Save to Disk",
+ "save-disk-tooltip": "Save config to the conf.yml file on disk. This will backup, and then over-write your existing config",
+ "export-config-btn": "Export Config",
+ "export-config-tooltip": "View and export new config, either to a file, or to clipboard",
+ "cloud-backup-btn": "Backup to Cloud",
+ "cloud-backup-tooltip": "Save encrypted backup of configuration to cloud",
+ "edit-raw-config-btn": "Edit Raw Config",
+ "edit-raw-config-tooltip": "View and modify raw config via JSON editor",
+ "cancel-changes-btn": "Cancel Edit",
+ "cancel-changes-tooltip": "Reset current modifications, and exit Edit Mode. This will not affect your saved config",
+ "edit-mode-name": "Edit Mode",
+ "edit-mode-subtitle": "You are in Edit Mode",
+ "edit-mode-description": "This means you can make modifications to your config, and preview the results, but until you save, none of your changes will be preserved.",
+ "save-stage-btn": "Save",
+ "cancel-stage-btn": "Cancel"
+ },
+ "edit-item": {
+ "missing-title-err": "An item title is required"
+ },
+ "edit-section": {
+ "edit-section-title": "Edit Section",
+ "add-section-title": "Add New Section",
+ "edit-tooltip": "Click to Edit, or right-click for more options",
+ "remove-confirm": "Are you sure you want to remove this section? This action can be undone later."
+ },
+ "edit-app-config": {
+ "warning-msg-title": "Proceed with Caution",
+ "warning-msg-l1": "The following options are for advanced app configuration.",
+ "warning-msg-l2": "If you are unsure about any of the fields, please reference the",
+ "warning-msg-docs": "documentation",
+ "warning-msg-l3": "to avoid unintended consequences."
+ },
+ "export": {
+ "export-title": "Export Config",
+ "copy-clipboard-btn": "Copy to Clipboard",
+ "copy-clipboard-tooltip": "Copy all app config to system clipboard, in YAML format",
+ "download-file-btn": "Download as File",
+ "download-file-tooltip": "Download all app config to your device, in a YAML file",
+ "view-title": "View Config"
+ }
+ },
+ "widgets": {
+ "general": {
+ "loading": "Loading...",
+ "show-more": "Expand Details",
+ "show-less": "Show Less",
+ "open-link": "Continue Reading"
+ },
+ "pi-hole": {
+ "status-heading": "Status"
+ },
+ "stat-ping": {
+ "up": "Online",
+ "down": "Offline"
+ },
+ "net-data": {
+ "cpu-chart-title": "CPU History",
+ "mem-chart-title": "Memory Usage",
+ "mem-breakdown-title": "Memory Breakdown",
+ "load-chart-title": "System Load"
+ },
+ "glances": {
+ "disk-space-free": "Free",
+ "disk-space-used": "Used",
+ "disk-mount-point": "Mount Point",
+ "disk-file-system": "File System",
+ "disk-io-read": "Read",
+ "disk-io-write": "Write",
+ "system-load-desc": "Number of processes waiting in the run-queue, averaged across all cores"
+ },
+ "system-info": {
+ "uptime": "Uptime"
+ },
+ "flight-data": {
+ "arrivals": "Arrivals",
+ "departures": "Departures"
+ },
+ "tfl-status": {
+ "good-service-all": "Good Service on all Lines",
+ "good-service-rest": "Good Service on all other Lines"
+ }
+ }
}
\ No newline at end of file
diff --git a/src/assets/locales/sv.json b/src/assets/locales/sv.json
index 30b7b53c..32a782b3 100644
--- a/src/assets/locales/sv.json
+++ b/src/assets/locales/sv.json
@@ -1,248 +1,284 @@
{
- "home": {
- "no-results": "Inga sökresultat",
- "no-data": "Ingen data konfigurerad"
+ "home":{
+ "no-results":"Inga sökresultat",
+ "no-data":"Ingen data konfigurerad",
+ "no-items-section":"Inga objekt att visa än"
+ },
+ "search":{
+ "search-label":"Sök",
+ "search-placeholder":"Börja skriva för att filtrera",
+ "clear-search-tooltip":"Rensa sök",
+ "enter-to-search-web":"Tryck på Retur för att söka på webben"
+ },
+ "login":{
+ "title":"Dashy",
+ "username-label":"Användarnamn",
+ "password-label":"Lösenord",
+ "login-button":"Logga in",
+ "remember-me-label":"Kom ihåg mig",
+ "remember-me-never":"Aldrig",
+ "remember-me-hour":"4 Timmar",
+ "remember-me-day":"1 Dag",
+ "remember-me-week":"1 Vecka",
+ "remember-me-long-time":"Länge",
+ "error-missing-username":"Användarnamn saknas",
+ "error-missing-password":"Lösenord saknas",
+ "error-incorrect-username":"Användaren hittas inte",
+ "error-incorrect-password":"Fel lösenord",
+ "success-message":"Loggar in...",
+ "logout-message":"Utloggad",
+ "already-logged-in-title":"Redan inloggad",
+ "already-logged-in-text":"Du är inloggad som",
+ "proceed-to-dashboard":"Fortsätt till Dashboard",
+ "log-out-button":"Logga ut",
+ "proceed-guest-button":"Fortsätt som Gäst"
+ },
+ "config":{
+ "main-tab":"Huvudmeny",
+ "view-config-tab":"Visa konfiguration",
+ "edit-config-tab":"Redigera konfiguration",
+ "custom-css-tab":"Egna stilmallar",
+ "heading":"Konfigurationsalternativ",
+ "download-config-button":"Visa / Exportera konfiguration",
+ "edit-config-button":"Redigera konfiguration",
+ "edit-css-button":"Redigera Custom CSS",
+ "cloud-sync-button":"Aktivera molnsynk",
+ "edit-cloud-sync-button":"Redigera molnsynk",
+ "rebuild-app-button":"Återuppbygga appen",
+ "change-language-button":"Ändra appspråk",
+ "reset-settings-button":"Återställ lokala inställningar",
+ "app-info-button":"Appinfo",
+ "backup-note":"Det rekommenderas att du gör en säkerhetskopia av din konfiguration innan du gör ändringar.",
+ "reset-config-msg-l1":"Detta tar bort alla användarinställningar från lokal lagring, men påverkar inte din 'conf.yml'-fil",
+ "reset-config-msg-l2":"Du bör först göra en säkerhetskopia av alla ändringar du har gjort lokalt, om du vill använda dem i framtiden.",
+ "reset-config-msg-l3":"Är du säker på att du vill fortsätta?",
+ "data-cleared-msg":"Datarensning har lyckats",
+ "actions-label":"Åtgärder",
+ "copy-config-label":"Kopiera konfiguration",
+ "data-copied-msg":"Konfiguration har kopierats till urklipp",
+ "reset-config-label":"Återställ konfiguration",
+ "css-save-btn":"Spara ändringar",
+ "css-note-label":"Not",
+ "css-note-l1":"Du måste uppdatera sidan för att dina ändringar ska gälla.",
+ "css-note-l2":"Styles overrides lagras bara lokalt, så det rekommenderas att du gör en kopia av din CSS.",
+ "css-note-l3":"För att ta bort alla egna stilmallar, radera innehållet och tryck på Spara ändringar"
+ },
+ "alternate-views":{
+ "alternate-view-heading":"Ändra vy",
+ "default":"Standard",
+ "workspace":"Workspace",
+ "minimal":"Minimal"
+ },
+ "settings":{
+ "theme-label":"Tema",
+ "layout-label":"Layout",
+ "layout-auto":"Auto",
+ "layout-horizontal":"Vågrät",
+ "layout-vertical":"Lodrät",
+ "item-size-label":"Storlek",
+ "item-size-small":"Liten",
+ "item-size-medium":"Mellan",
+ "item-size-large":"Stor",
+ "config-launcher-label":"Konfig",
+ "config-launcher-tooltip":"Uppdatera konfiguration",
+ "sign-out-tooltip":"Logga ut",
+ "sign-in-tooltip":"Logga in",
+ "sign-in-welcome":"Hej {username}!"
+ },
+ "updates":{
+ "app-version-note":"Dashy-version",
+ "up-to-date":"Uppdaterat",
+ "out-of-date":"Uppdatering finns",
+ "unsupported-version-l1":"Du använder en icke-stödd version av Dashy",
+ "unsupported-version-l2":"För den bästa upplevelsen och de senaste säkerhetskorrigeringarna, uppdatera till"
+ },
+ "language-switcher":{
+ "title":"Ändra appspråk",
+ "dropdown-label":"Välj språk",
+ "save-button":"Spara",
+ "success-msg":"Språket har ändrats till"
+ },
+ "theme-maker":{
+ "title":"Temakonfigurator",
+ "export-button":"Exportera egendefinierade variabler",
+ "reset-button":"Återställ stilmallar för",
+ "show-all-button":"Vissa alla variabler",
+ "change-fonts-button":"Ändra typsnitt",
+ "save-button":"Spara",
+ "cancel-button":"Avbryt",
+ "saved-toast":"{theme} har uppdaterats",
+ "copied-toast":"Temadatan för {theme} har kopierats till urklipp",
+ "reset-toast":"Egna färger för {theme} har tagits bort"
+ },
+ "config-editor":{
+ "save-location-label":"Sparningsplats",
+ "location-local-label":"Tillämpa lokalt",
+ "location-disk-label":"Skriv ändringar till konfigurationsfil",
+ "save-button":"Spara ändringar",
+ "preview-button":"Förhandsgranska ändringar",
+ "valid-label":"Konfigurationen är giltig",
+ "status-success-msg":"Åtgärden slutförts",
+ "status-fail-msg":"Åtgärden misslyckats",
+ "success-msg-disk":"Konfigurationsfil har skrivits till disk utan problem",
+ "success-msg-local":"Lokala ändringar har sparats utan problem",
+ "success-note-l1":"Återskapa",
+ "success-note-l2":"Detta kan ta upp till en minut.",
+ "success-note-l3":"Du måste uppdatera sidan för att ändringar ska gälla",
+ "error-msg-save-mode":"Välj Lagringsläge: Lokalt eller Fil",
+ "error-msg-cannot-save":"Ett fel uppstod när konfigurationen skulle sparas",
+ "error-msg-bad-json":"Fel i JSON, möjligen felformaterat",
+ "warning-msg-validation":"Valideringsvarning",
+ "not-admin-note":"Du kan inte skriva ändringar till disk, eftersom du inte är inloggad som admin"
+ },
+ "app-rebuild":{
+ "title":"Återskapa appen",
+ "rebuild-note-l1":"Appen måste återskapas för att ändringar som skrivits till filen conf.yml ska gälla.",
+ "rebuild-note-l2":"Detta bör ske automatiskt, men om det inte har gjort det kan du aktivera det manuellt här.",
+ "rebuild-note-l3":"Detta krävs inte för ändringar som lagras lokalt.",
+ "rebuild-button":"Återskapa",
+ "rebuilding-status-1":"Återskapar...",
+ "rebuilding-status-2":"Detta kan ta några minuter",
+ "error-permission":"Du har inte behörighet att utföra denna åtgärd",
+ "success-msg":"Återskapning lyckats",
+ "fail-msg":"Återskapning misslyckats",
+ "reload-note":"En omladdning av sidan krävs nu för att ändringarna ska gälla",
+ "reload-button":"Ladda om sidan"
+ },
+ "cloud-sync":{
+ "title":"Molnsäkerhetskopiering och återställning",
+ "intro-l1":"Molnsäkerhetskopiering och återställning är en valfri funktion som gör att du kan ladda upp din konfiguration till internet och sedan återställa den på någon annan enhet eller instans av Dashy.",
+ "intro-l2":"All data är fullständigt end-to-end krypterad med AES, med ditt lösenord som nyckel.",
+ "intro-l3":"För mer information, vänligen se",
+ "backup-title-setup":"Gör en säkerhetskopia",
+ "backup-title-update":"Uppdatera säkerhetskopia",
+ "password-label-setup":"Välj lösenord",
+ "password-label-update":"Ange ditt lösenord",
+ "backup-button-setup":"Säkerhetskopiering",
+ "backup-button-update":"Uppdatera säkerhetskopia",
+ "backup-id-label":"Ditt säkerhetskopierings-ID",
+ "backup-id-note":"Detta används för att återställa från säkerhetskopior senare. Så förvara det tillsammans med ditt lösenord någonstans säkert.",
+ "restore-title":"Återställ en säkerhetskopia",
+ "restore-id-label":"Återställ ID",
+ "restore-password-label":"Lösenord",
+ "restore-button":"Återställ",
+ "backup-missing-password":"Lösenord saknas",
+ "backup-error-unknown":"Begäran kan inte behandlas",
+ "backup-error-password":"Fel lösenord. Vänligen ange ditt aktuella lösenord.",
+ "backup-success-msg":"Slutfört utan problem",
+ "restore-success-msg":"Konfigurationen har återställts utan problem"
+ },
+ "menu":{
+ "open-section-title":"Öppna i",
+ "sametab":"Denna flik",
+ "newtab":"Ny flik",
+ "modal":"Pop-Up Modal",
+ "workspace":"Workspace-vy",
+ "options-section-title":"Alternativ",
+ "edit-item":"Redigera",
+ "move-item":"Kopiera eller flytta",
+ "remove-item":"Ta bort"
+ },
+ "context-menus":{
+ "item":{
+ "open-section-title":"Öppna i",
+ "sametab":"Denna flik",
+ "newtab":"Ny flik",
+ "modal":"Pop-Up Modal",
+ "workspace":"Workspace View",
+ "options-section-title":"Alternativ",
+ "edit-item":"Redigera",
+ "move-item":"Kopiera eller flytta",
+ "remove-item":"Ta bort"
},
- "search": {
- "search-label": "Sök",
- "search-placeholder": "Börja skriva för att filtrera",
- "clear-search-tooltip": "Rensa sök",
- "enter-to-search-web": "Tryck på Retur för att söka på webben"
- },
- "login": {
- "title": "Dashy",
- "username-label": "Användarnamn",
- "password-label": "Lösenord",
- "login-button": "Logga in",
- "remember-me-label": "Kom ihåg mig",
- "remember-me-never": "Aldrig",
- "remember-me-hour": "4 Timmar",
- "remember-me-day": "1 Dag",
- "remember-me-week": "1 Vecka",
- "remember-me-long-time": "Länge",
- "error-missing-username": "Användarnamn saknas",
- "error-missing-password": "Lösenord saknas",
- "error-incorrect-username": "Användaren hittas inte",
- "error-incorrect-password": "Fel lösenord",
- "success-message": "Loggar in...",
- "logout-message": "Utloggad",
- "already-logged-in-title": "Redan inloggad",
- "already-logged-in-text": "Du är inloggad som",
- "proceed-to-dashboard": "Fortsätt till Dashboard",
- "log-out-button": "Logga ut",
- "proceed-guest-button": "Fortsätt som Gäst"
- },
- "config": {
- "main-tab": "Huvudmeny",
- "view-config-tab": "Visa konfiguration",
- "edit-config-tab": "Redigera konfiguration",
- "custom-css-tab": "Egendefinierade stilmallar",
- "heading": "Konfigurationsalternativ",
- "download-config-button": "Visa / Exportera konfiguration",
- "edit-config-button": "Redigera konfiguration",
- "edit-css-button": "Redigera egendefinierad CSS",
- "cloud-sync-button": "Aktivera molnsynkronisering",
- "edit-cloud-sync-button": "Redigera molnsynkronisering",
- "rebuild-app-button": "Återuppbygga appen",
- "change-language-button": "Ändra appspråk",
- "reset-settings-button": "Återställ lokala inställningar",
- "app-info-button": "Appinfo",
- "backup-note": "Det rekommenderas att du gör en säkerhetskopia av din konfiguration innan du gör ändringar.",
- "reset-config-msg-l1": "Detta tar bort alla användarinställningar från lokal lagring, men påverkar inte din 'conf.yml'-fil",
- "reset-config-msg-l2": "Du bör först göra en säkerhetskopia av alla ändringar du har gjort lokalt, om du vill använda dem i framtiden.",
- "reset-config-msg-l3": "Är du säker på att du vill fortsätta?",
- "data-cleared-msg": "Datarensning har lyckats",
- "actions-label": "Åtgärder",
- "copy-config-label": "Kopiera konfiguration",
- "data-copied-msg": "Konfiguration har kopierats till urklipp",
- "reset-config-label": "Återställ konfiguration",
- "css-save-btn": "Spara ändringar",
- "css-note-label": "Not",
- "css-note-l1": "Du måste uppdatera sidan för att dina ändringar ska gälla.",
- "css-note-l2": "Styles overrides lagras bara lokalt, så det rekommenderas att du gör en kopia av din CSS.",
- "css-note-l3": "För att ta bort alla egendefinierade stilmallar, radera innehållet och tryck på Spara ändringar"
- },
- "alternate-views": {
- "alternate-view-heading": "Ändra vy",
- "default": "Standard",
- "workspace": "Workspace",
- "minimal": "Minimal"
- },
- "settings": {
- "theme-label": "Tema",
- "layout-label": "Layout",
- "layout-auto": "Auto",
- "layout-horizontal": "Vågrät",
- "layout-vertical": "Lodrät",
- "item-size-label": "Storlek",
- "item-size-small": "Liten",
- "item-size-medium": "Mellan",
- "item-size-large": "Stor",
- "config-launcher-label": "Konfig",
- "config-launcher-tooltip": "Uppdatera konfiguration",
- "sign-out-tooltip": "Logga ut",
- "sign-in-tooltip": "Logga in",
- "sign-in-welcome": "Hej {username}!"
- },
- "updates": {
- "app-version-note": "Dashy-version",
- "up-to-date": "Uppdaterat",
- "out-of-date": "Uppdatering finns",
- "unsupported-version-l1": "Du använder en icke-stödd version av Dashy",
- "unsupported-version-l2": "För den bästa upplevelsen och de senaste säkerhetskorrigeringarna, uppdatera till"
- },
- "language-switcher": {
- "title": "Ändra appspråk",
- "dropdown-label": "Välj språk",
- "save-button": "Spara",
- "success-msg": "Språket har ändrats till"
- },
- "theme-maker": {
- "title": "Temakonfigurator",
- "export-button": "Exportera egendefinierade variabler",
- "reset-button": "Återställ stilmallar för",
- "show-all-button": "Visa alla variabler",
- "change-fonts-button": "Ändra typsnitt",
- "save-button": "Spara",
- "cancel-button": "Avbryt",
- "saved-toast": "Uppdatering av {theme} har lyckats",
- "copied-toast": "Temadatan för {theme} har kopierats till urklipp",
- "reset-toast": "Egendefinierade färger för {theme} har tagits bort"
- },
- "config-editor": {
- "save-location-label": "Sparningsplats",
- "location-local-label": "Tillämpa lokalt",
- "location-disk-label": "Skriv ändringar till konfigurationsfil",
- "save-button": "Spara ändringar",
- "preview-button": "Förhandsgranska ändringar",
- "valid-label": "Konfigurationen är giltig",
- "status-success-msg": "Åtgärden slutförts",
- "status-fail-msg": "Åtgärden misslyckats",
- "success-msg-disk": "Konfigurationsfil har skrivits till disk utan problem",
- "success-msg-local": "Lokala ändringar har sparats utan problem",
- "success-note-l1": "Återskapa",
- "success-note-l2": "Detta kan ta upp till en minut.",
- "success-note-l3": "Du måste uppdatera sidan för att ändringar ska gälla",
- "error-msg-save-mode": "Välj Lagringsläge: Lokalt eller Fil",
- "error-msg-cannot-save": "Ett fel uppstod när konfigurationen skulle sparas",
- "error-msg-bad-json": "Fel i JSON, möjligen felformaterat",
- "warning-msg-validation": "Valideringsvarning",
- "not-admin-note": "Du kan inte skriva ändringar till disk, eftersom du inte är inloggad som admin"
- },
- "app-rebuild": {
- "title": "Återskapa appen",
- "rebuild-note-l1": "Appen måste återskapas för att ändringar som skrivits till filen conf.yml ska gälla.",
- "rebuild-note-l2": "Detta bör ske automatiskt, men om det inte har gjort det kan du aktivera det manuellt här.",
- "rebuild-note-l3": "Detta krävs inte för ändringar som lagras lokalt.",
- "rebuild-button": "Återskapa",
- "rebuilding-status-1": "Återskapar...",
- "rebuilding-status-2": "Detta kan ta några minuter",
- "error-permission": "Du har inte behörighet att utföra denna åtgärd",
- "success-msg": "Återskapning lyckats",
- "fail-msg": "Återskapning misslyckats",
- "reload-note": "En omladdning av sidan krävs nu för att ändringarna ska gälla",
- "reload-button": "Ladda om sidan"
- },
- "cloud-sync": {
- "title": "Molnsäkerhetskopiering och återställning",
- "intro-l1": "Molnsäkerhetskopiering och återställning är en valfri funktion som gör att du kan ladda upp din konfiguration till internet och sedan återställa den på någon annan enhet eller instans av Dashy.",
- "intro-l2": "All data är fullständigt end-to-end krypterad med AES, med ditt lösenord som nyckel.",
- "intro-l3": "För mer information, vänligen se",
- "backup-title-setup": "Gör en säkerhetskopia",
- "backup-title-update": "Uppdatera säkerhetskopia",
- "password-label-setup": "Välj lösenord",
- "password-label-update": "Ange ditt lösenord",
- "backup-button-setup": "Säkerhetskopiering",
- "backup-button-update": "Uppdatera säkerhetskopia",
- "backup-id-label": "Ditt säkerhetskopierings-ID",
- "backup-id-note": "Detta används för att återställa från säkerhetskopior senare. Så förvara det tillsammans med ditt lösenord någonstans säkert.",
- "restore-title": "Återställ en säkerhetskopia",
- "restore-id-label": "Återställ ID",
- "restore-password-label": "Lösenord",
- "restore-button": "Återställ",
- "backup-missing-password": "Lösenord saknas",
- "backup-error-unknown": "Begäran kan inte behandlas",
- "backup-error-password": "Fel lösenord. Vänligen ange ditt aktuella lösenord.",
- "backup-success-msg": "Slutfört utan problem",
- "restore-success-msg": "Konfigurationen har återställts utan problem"
- },
- "menu": {
- "open-section-title": "Öppna i",
- "sametab": "Denna flik",
- "newtab": "Ny flik",
- "modal": "Pop-Up Modal",
- "workspace": "Workspace-vy",
- "options-section-title": "Alternativ",
- "edit-item": "Redigera",
- "move-item": "Kopiera eller flytta",
- "remove-item": "Ta bort"
- },
- "context-menus": {
- "item": {
- "open-section-title": "Öppna i",
- "sametab": "Denna flik",
- "newtab": "Ny flik",
- "modal": "Pop-Up Modal",
- "workspace": "Workspace View",
- "options-section-title": "Alternativ",
- "edit-item": "Redigera",
- "move-item": "Kopiera eller flytta",
- "remove-item": "Ta bort"
- },
- "section": {
- "open-section": "Öppna sektion",
- "edit-section": "Redigera",
- "move-section": "Flytta till",
- "remove-section": "Ta bort"
- }
- },
- "interactive-editor": {
- "menu": {
- "start-editing-tooltip": "Öppna den interaktiva redigeraren",
- "edit-site-data-subheading": "Redigera webbplatsinformation",
- "edit-page-info-btn": "Redigera sidinformation",
- "edit-page-info-tooltip": "Appnamn, beskrivning, navigeringslänkar, sidfotstext, etc",
- "edit-app-config-btn": "Redigera appkonfiguration",
- "edit-app-config-tooltip": "Övriga appkonfigurationsalternativ",
- "config-save-methods-subheading": "Alternativ för konfigurationssparande",
- "save-locally-btn": "Spara lokalt",
- "save-locally-tooltip": "Spara konfigurationen lokalt, till webbläsarens lagring. Detta påverkar inte din konfigurationsfil, men ändringarna sparas bara på denna enhet",
- "save-disk-btn": "Spara till disk",
- "save-disk-tooltip": "Spara konfiguration to conf.yml-filen på disk. Detta kommer att säkerhetskopiera och sedan skriva över din befintliga konfiguration",
- "export-config-btn": "Exportera konfiguration",
- "export-config-tooltip": "Visa och exportera den nya konfigurationen, antingen till fil eller urklipp",
- "cloud-backup-btn": "Säkerhetskopiera till molnet",
- "cloud-backup-tooltip": "Spara krypterad säkerhetskopia av konfigurationen i molnet",
- "edit-raw-config-btn": "Redigera raw-konfiguration",
- "edit-raw-config-tooltip": "Visa och redigera raw-konfiguration via JSON-redigeraren",
- "cancel-changes-btn": "Avbryt redigering",
- "cancel-changes-tooltip": "Radera nuvarande ändringar och lämna Redigeringsläge. Detta kommer in påverka din sparade konfiguration.",
- "edit-mode-name": "Redigeringsläge",
- "edit-mode-subtitle": "Du är i Redigeringsläge",
- "edit-mode-description": "Detta innebär att du kan göra ändringar i din konfiguration och förhandsgranska resultaten, men tills du sparar kommer inga av dina ändringar att bevaras.",
- "save-stage-btn": "Spara",
- "cancel-stage-btn": "Avbryt"
- },
- "edit-section": {
- "edit-section-title": "Redigera sektion",
- "add-section-title": "Lägg till ny sektion",
- "edit-tooltip": "Tryck för att redigera, eller högerklicka för fler alternativ",
- "remove-confirm": "Är du säker på att du vill ta bort denna sektion? Denna åtgärd kan ångras senare."
- },
- "edit-app-config": {
- "warning-msg-title": "Fortsätt med försiktighet",
- "warning-msg-l1": "Följande alternativ är för avancerade appkonfigurationer.",
- "warning-msg-l2": "Om du är osäker på något av fälten, vänligen kolla",
- "warning-msg-docs": "dokumentationen",
- "warning-msg-l3": "för att undvika oavsiktliga konsekvenser."
- },
- "export": {
- "export-title": "Exportera konfiguration",
- "copy-clipboard-btn": "Kopiera till urklipp",
- "copy-clipboard-tooltip": "Kopiera alla appkonfigurationer till systemets urklipp i YAML-format",
- "download-file-btn": "Ladda ned som fil",
- "download-file-tooltip": "Ladda ner alla appkonfigurationer till din enhet som en YAML-fil",
- "view-title": "Visa konfiguration"
- }
+ "section":{
+ "open-section":"Öppna sektion",
+ "edit-section":"Redigera",
+ "move-section":"Flytta till",
+ "remove-section":"Ta bort"
}
- }
\ No newline at end of file
+ },
+ "interactive-editor":{
+ "menu":{
+ "start-editing-tooltip":"Öppna den interaktiva redigeraren",
+ "edit-site-data-subheading":"Redigera webbplatsinformation",
+ "edit-page-info-btn":"Redigera sidinformation",
+ "edit-page-info-tooltip":"Appnamn, beskrivning, navigeringslänkar, sidfotstext, etc",
+ "edit-app-config-btn":"Redigera appkonfiguration",
+ "edit-app-config-tooltip":"Övriga appkonfigurationsalternativ",
+ "config-save-methods-subheading":"Alternativ för konfigurationssparande",
+ "save-locally-btn":"Spara lokalt",
+ "save-locally-tooltip":"Spara konfigurationen lokalt, till webbläsarens lagring. Detta påverkar inte din konfigurationsfil, men ändringarna sparas bara på denna enhet",
+ "save-disk-btn":"Spara till disk",
+ "save-disk-tooltip":"Spara konfiguration to conf.yml-filen på disk. Detta kommer att säkerhetskopiera och sedan skriva över din befintliga konfiguration",
+ "export-config-btn":"Exportera konfiguration",
+ "export-config-tooltip":"Visa och exportera den nya konfigurationen, antingen till fil eller urklipp",
+ "cloud-backup-btn":"Säkerhetskopiera till molnet",
+ "cloud-backup-tooltip":"Spara krypterad säkerhetskopia av konfigurationen i molnet",
+ "edit-raw-config-btn":"Redigera raw-konfiguration",
+ "edit-raw-config-tooltip":"Visa och redigera raw-konfiguration via JSON-redigeraren",
+ "cancel-changes-btn":"Avbryt redigering",
+ "cancel-changes-tooltip":"Radera nuvarande ändringar och lämna Redigeringsläge. Detta kommer in påverka din sparade konfiguration.",
+ "edit-mode-name":"Redigeringsläge",
+ "edit-mode-subtitle":"Du är i Redigeringsläge",
+ "edit-mode-description":"Detta innebär att du kan göra ändringar i din konfiguration och förhandsgranska resultaten, men tills du sparar kommer inga av dina ändringar att bevaras.",
+ "save-stage-btn":"Spara",
+ "cancel-stage-btn":"Avbryt"
+ },
+ "edit-item":{
+ "missing-title-err":"Objektet måste ha en titel"
+ },
+ "edit-section":{
+ "edit-section-title":"Redigera sektion",
+ "add-section-title":"Lägg till ny sektion",
+ "edit-tooltip":"Tryck för att redigera, eller högerklicka för fler alternativ",
+ "remove-confirm":"Är du säker på att du vill ta bort denna sektion? Denna åtgärd kan ångras senare."
+ },
+ "edit-app-config":{
+ "warning-msg-title":"Fortsätt med försiktighet",
+ "warning-msg-l1":"Följande alternativ är för avancerade appkonfigurationer.",
+ "warning-msg-l2":"Om du är osäker på något av fälten, vänligen kolla",
+ "warning-msg-docs":"dokumentationen",
+ "warning-msg-l3":"för att undvika oavsiktliga konsekvenser."
+ },
+ "export":{
+ "export-title":"Exportera konfiguration",
+ "copy-clipboard-btn":"Kopiera till urklipp",
+ "copy-clipboard-tooltip":"Kopiera alla appkonfigurationer till systemets urklipp i YAML-format",
+ "download-file-btn":"Ladda ned som fil",
+ "download-file-tooltip":"Ladda ner alla appkonfigurationer till din enhet som en YAML-fil",
+ "view-title":"Visa konfiguration"
+ }
+ },
+ "widgets":{
+ "general":{
+ "loading":"Laddar...",
+ "show-more":"Visa mer info",
+ "show-less":"Visa mindre",
+ "open-link":"Läs mer"
+ },
+ "pi-hole":{
+ "status-heading":"Status"
+ },
+ "stat-ping":{
+ "up":"Online",
+ "down":"Offline"
+ },
+ "net-data":{
+ "cpu-chart-title":"CPU History",
+ "mem-chart-title":"Memory Usage",
+ "mem-breakdown-title":"Memory Breakdown",
+ "load-chart-title":"System Load"
+ },
+ "system-info":{
+ "uptime":"Uptime"
+ },
+ "flight-data":{
+ "arrivals":"Ankomster",
+ "departures":"Avgångar"
+ },
+ "tfl-status":{
+ "good-service-all":"Good Service på alla linjer",
+ "good-service-rest":"Good Service på alla övriga linjer"
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/components/Charts/Gauge.vue b/src/components/Charts/Gauge.vue
new file mode 100644
index 00000000..d4edc5cb
--- /dev/null
+++ b/src/components/Charts/Gauge.vue
@@ -0,0 +1,366 @@
+
+
+ For a break-down of how your data is managed by Dashy, see
+ the Privacy Policy.
+ For advise in securing your dashboard, you can reference the
+ Management Docs.
+ If you've found a potential security issue, report it following our
+ Security Policy