Compare commits

...

257 Commits

Author SHA1 Message Date
Alicia Sykes
d947ed5c53
🔀 Merge pull request #1877 from alayham/bug/1746-xml-parsing-error-on-status-check
Send json response for status check
2025-07-27 19:41:48 +01:00
Alicia Sykes
4ec76d35e0
🔀 Merge pull request #1878 from aypt/patch-1
Fix incorrect translation
2025-07-27 15:22:32 +01:00
liss-bot
629b93f7e3 💛 Updates sponsors table 2025-07-27 02:30:19 +01:00
liss-bot
e1bc9b2f34 💜 Updates contributors list 2025-07-27 02:30:18 +01:00
Alicia Sykes
5387ec4e9d
🔀 Merge pull request #1883 from domportera/patch-2
glow-dark theme
2025-07-26 04:09:03 +01:00
dom
459450a87e
add 'glow-dark' theme to drop-down list 2025-07-24 13:28:18 -04:00
dom
ef741e319b
glow-dark theme 2025-07-23 09:54:24 -04:00
Alicia Sykes
cab60c1f4c
🔀 Merge pull request #1866 from yeralin/patch-1
Update Workspace.vue
2025-07-22 17:43:00 +01:00
Al Saleh
f9c0ff68f7 Send content type header response 2025-07-21 07:04:00 +02:00
aypt
247110ecf5
Fix incorrect translation
Changed incorrect translation "登陆" to correct term "登录".
2025-07-21 11:05:49 +08:00
Alicia Bot
df108e75dc 💙 Updates contributor SVG 2025-07-20 02:30:16 +01:00
liss-bot
cbbe542906 💜 Updates contributors list 2025-07-20 02:30:08 +01:00
Al Saleh
806db58be6 send json response for status check 2025-07-19 11:40:50 +02:00
Alicia Sykes
4a4bf2e33c
🔀 Merge pull request #1729 from click0/Fix-Ukrainian-language
Corrected Ukrainian translation
2025-07-19 10:27:06 +01:00
Alicia Sykes
951aa74510
🔀 Merge pull request #1868 from he0119/fix/manifest
Fix pwa conflicting/missing entries in cache list
2025-07-19 07:38:35 +01:00
Alicia Sykes
2d36386507
🔀 Merge pull request #1869 from s-weigand/fix/typo-in-ip-api-provider-check
🩹 Fix typo in Public Ip Widget endpoint definition for ip-api provider
2025-07-19 07:38:08 +01:00
Alicia Sykes
b7d40c5b61
🔀 Merge pull request #1871 from alayham/feature/custom-list-widget
Added the custom list widget
2025-07-19 07:37:12 +01:00
Alicia Sykes
2576b541b0
🔀 Merge pull request #1817 from SharpCoder/master
🐛 Fix a bug in RssFeed widget that crashes on small feeds.
2025-07-19 07:33:33 +01:00
Alicia Sykes
ab74915c0b
🔀 Merge pull request #1786 from LinuxSBC/master
Add selfh.st/icons support
2025-07-19 07:32:43 +01:00
Alicia Sykes
f094880851
🔀 Merge pull request #1790 from armageddon421/kuma-fixes
Uptime-Kuma fixes
2025-07-19 07:31:08 +01:00
Alicia Sykes
e3d14fe7b8
🔀 Merge pull request #1794 from pho3nixf1re/update-simple-icons
Update simple-icons to bring it the latest icons
2025-07-19 07:30:48 +01:00
Alicia Sykes
a03047693f
🔀 Merge pull request #1770 from vishwamartur/add-auto-theme-switch
Add auto dark/light theme switch based on OS preference
Fixes #825
2025-07-19 06:07:09 +01:00
Al Saleh
9ee4d249ee Added the custom list widget 2025-07-19 00:45:16 +02:00
Alicia Sykes
29c931a301
🔀 Merge pull request #1766 from ThrustVector/update_sv_translation
Update Swedish translation
2025-07-18 19:35:50 +01:00
Alicia Sykes
4dc2c29d86
🔀 Merge pull request #1752 from RobLoach/patch-1
🩹 Fix compilation warning on comment
2025-07-18 19:35:27 +01:00
Alicia Sykes
535ca07400
🔀 Merge pull request #1751 from sasetz/master
🌐 Revised and updated ru.json
2025-07-18 19:00:50 +01:00
Alicia Sykes
52a4e5a09d
🔀 Merge pull request #1745 from Kf637/master
Updated Norwegian language file.
2025-07-18 19:00:08 +01:00
Alicia Sykes
4ba9aa70f8
🔀 Merge pull request #1732 from RoubenRehman/patch-1
Fixed typo in icons.md
2025-07-18 18:59:50 +01:00
Alicia Sykes
3ce134304d
✏️ Fix flag in readme 2025-07-18 18:58:48 +01:00
s-weigand
02b40459ca
🩹 Fix typo in PublicIp Widget endpoint definition for ip-api provider 2025-07-18 11:15:14 +02:00
Alicia Sykes
b205e01620
🔀 Merge pull request #1864 from kit494way/update-docs-conf-pages
Update docs conf pages
2025-07-16 21:45:34 +01:00
Daniyar Yeralin
d145e09afa
Update Workspace.vue
1. Initialize Material design icons
2. Align initialization order with Minimal.vue
2025-07-15 21:39:55 -04:00
uy/sun
14fb8cd5e7 fix: update workboxOptions to exclude specific file patterns 2025-07-13 15:41:37 +00:00
Alicia Bot
cda3010569 💙 Updates contributor SVG 2025-07-13 02:30:17 +01:00
liss-bot
bc2e43b1e3 💜 Updates contributors list 2025-07-13 02:30:07 +01:00
uy/sun
c0820d7fc6
fix: exclude dotfiles (.gitignore, .nojekyll) from PWA precache manifest
https://cli.vuejs.org/core-plugins/pwa.html#configuration
https://developer.chrome.com/docs/workbox/modules/workbox-build?hl=zh-cn#type-GlobPartial
2025-07-13 00:28:50 +08:00
uy/sun
b916de9182
fix: conflicting entries in cache list 2025-07-12 22:48:12 +08:00
KITAGAWA Yasutaka
92e7092e0c
Add link 2025-07-12 14:47:09 +09:00
KITAGAWA Yasutaka
b70869ad10
Fix description of pages[].path 2025-07-12 14:17:09 +09:00
liss-bot
0a03002b7d 💛 Updates sponsors table 2025-07-06 02:29:53 +01:00
liss-bot
6092c40dad 💜 Updates contributors list 2025-07-06 02:29:52 +01:00
Alicia Bot
1389f80cae 💙 Updates contributor SVG 2025-06-29 02:30:03 +01:00
liss-bot
b7f79c856c 💛 Updates sponsors table 2025-06-29 02:29:55 +01:00
liss-bot
60af9e7bda 💜 Updates contributors list 2025-06-29 02:29:54 +01:00
Alicia Sykes
69f44134d0
Merge pull request #1858 from The127/patch-1
Update quick-start.md
2025-06-28 20:13:07 +01:00
Alicia Bot
03ac6ec5ec 💙 Updates contributor SVG 2025-06-22 02:29:54 +01:00
liss-bot
ac1e0e1dc1 💛 Updates sponsors table 2025-06-22 02:29:50 +01:00
liss-bot
616c245f43 💜 Updates contributors list 2025-06-22 02:29:48 +01:00
Darkarotte
89843461fc
Update quick-start.md
fix amount of root attributes
2025-06-17 19:39:23 +02:00
liss-bot
c33eb5bede 💛 Updates sponsors table 2025-06-15 02:29:57 +01:00
liss-bot
37fbc500a0 💜 Updates contributors list 2025-06-15 02:29:55 +01:00
Alicia Bot
126e083e12 💙 Updates contributor SVG 2025-05-25 02:29:48 +01:00
liss-bot
f45f0f41ac 💜 Updates contributors list 2025-05-25 02:29:42 +01:00
Tobias
190bbef978
Merge pull request #1852 from sxravan/master
Fixed one error in quick-start.md
2025-05-22 06:42:27 +02:00
Shravan Dwarka
fc9b4fd525 Fixed one error in quick-start.md 2025-05-21 19:50:58 -04:00
Alicia Bot
5416d9402a 💙 Updates contributor SVG 2025-05-11 02:29:37 +01:00
liss-bot
6cff61f18d 💜 Updates contributors list 2025-05-11 02:29:30 +01:00
Alicia Bot
de47432a27 💙 Updates contributor SVG 2025-05-04 02:29:43 +01:00
liss-bot
56b70fd4fa 💛 Updates sponsors table 2025-05-04 02:29:37 +01:00
liss-bot
b9335f2210 💜 Updates contributors list 2025-05-04 02:29:36 +01:00
Alicia Sykes
eec6c52815
🔁 Merge pull request #1840 from lucolvin/patch-1
Update widgets.md
2025-04-27 22:41:14 +01:00
liss-bot
e0a2716222 💛 Updates sponsors table 2025-04-27 02:29:19 +01:00
liss-bot
349ca5951c 💜 Updates contributors list 2025-04-27 02:29:18 +01:00
liss-bot
e80585ed3c 💛 Updates sponsors table 2025-04-20 02:29:19 +01:00
liss-bot
dd32bf4627 💜 Updates contributors list 2025-04-20 02:29:17 +01:00
liss-bot
0bd3fa7102 💛 Updates sponsors table 2025-04-13 02:48:11 +01:00
liss-bot
d4e22d4830 💜 Updates contributors list 2025-04-13 02:48:10 +01:00
Luke
87ce18f087
Update widgets.md 2025-04-11 16:07:59 -05:00
liss-bot
62774ab042 💛 Updates sponsors table 2025-04-06 02:29:05 +01:00
liss-bot
a772052845 💜 Updates contributors list 2025-04-06 02:29:04 +01:00
Alicia Bot
fecc761eeb 💙 Updates contributor SVG 2025-03-30 02:29:19 +01:00
liss-bot
6fb1e93423 💛 Updates sponsors table 2025-03-30 02:29:16 +01:00
liss-bot
593a571725 💜 Updates contributors list 2025-03-30 02:29:14 +01:00
Alicia Sykes
3dffc3339c
🔀 Merge pull request #1836 from webysther/master
Memory usage improvements
2025-03-29 11:25:54 +00:00
Webysther Sperandio
a5b1c47785
Update rebuild-app.js set GC 2025-03-27 09:48:48 +01:00
Webysther Sperandio
b229387b78
Update vue.config.js to use disk and less memory 2025-03-27 09:42:20 +01:00
Webysther Sperandio
3db6ccda2d
Update tsconfig.json to support incremental 2025-03-27 09:41:09 +01:00
Alicia Bot
05181ad9b2 💙 Updates contributor SVG 2025-03-23 01:29:16 +00:00
Alicia Bot
21f9320cef 💙 Updates contributor SVG 2025-03-16 01:29:11 +00:00
liss-bot
0f7c2214f0 💛 Updates sponsors table 2025-03-16 01:29:08 +00:00
liss-bot
34308491c6 💜 Updates contributors list 2025-03-16 01:29:06 +00:00
Alicia Sykes
45579d6df3
Merge pull request #1727 from NicholasWilsonDEV/patch-1
Update README.md, fix a typo
2025-03-15 17:36:57 +00:00
Alicia Sykes
50b4cb972f
🔀 Merge pull request #1713 from TJonesy/FEATURE/minecraft-widget
 Add support for minecraft server status widget
2025-03-15 16:11:42 +00:00
Alicia Sykes
b61e892b67
🔀 Merge pull request #1710 from lucolvin/lucolvin-patch-1
Fix docs typo
2025-03-15 16:11:11 +00:00
Alicia Sykes
f7954a994b
Merge branch 'master' into lucolvin-patch-1 2025-03-15 16:11:02 +00:00
Alicia Sykes
e07a0b0cca
🔀 Merge pull request #1709 from lucolvin/patch-1
Fix typo in docs
2025-03-15 16:10:27 +00:00
liss-bot
befa9a5c25 💛 Updates sponsors table 2025-03-09 01:27:54 +00:00
liss-bot
1543d57f7b 💜 Updates contributors list 2025-03-09 01:27:53 +00:00
Alicia Bot
431d275ff6 💙 Updates contributor SVG 2025-03-02 01:28:55 +00:00
liss-bot
726a45aabb 💛 Updates sponsors table 2025-03-02 01:28:50 +00:00
liss-bot
a4202850f6 💜 Updates contributors list 2025-03-02 01:28:48 +00:00
Alicia Bot
1cfe3445f6 💙 Updates contributor SVG 2025-02-23 01:28:56 +00:00
liss-bot
0090b87c48 💛 Updates sponsors table 2025-02-23 01:28:46 +00:00
liss-bot
26476df490 💜 Updates contributors list 2025-02-23 01:28:45 +00:00
Alicia Bot
95590bd889 💙 Updates contributor SVG 2025-02-16 01:29:04 +00:00
liss-bot
413e198dff 💛 Updates sponsors table 2025-02-16 01:28:54 +00:00
Josh Cole
b6ae17aad1 🐛 Fix a bug in RssFeed widget that crashes on small feeds.
RssFeed would always default to this.limit for the size of the feed item array.
Feeds that came in with fewer items than the limit would throw an exception, because
the loop would then try to iterate over non-existent entries.
2025-02-13 20:47:30 -08:00
liss-bot
40b6699d04 💛 Updates sponsors table 2025-02-09 01:28:37 +00:00
liss-bot
77ecf62ec5 💜 Updates contributors list 2025-02-09 01:28:36 +00:00
Alicia Bot
26086acf8d 💙 Updates contributor SVG 2025-02-02 01:28:40 +00:00
liss-bot
e4ead1d97e 💛 Updates sponsors table 2025-02-02 01:28:34 +00:00
liss-bot
13788c92df 💜 Updates contributors list 2025-02-02 01:28:33 +00:00
Matthew Turney
b5ef8f23ea
Update simple-icons to bring it the latest icons 2025-01-27 21:01:15 -06:00
Alicia Bot
1ce1e00f9c 💙 Updates contributor SVG 2025-01-26 01:28:41 +00:00
liss-bot
2efdd288eb 💛 Updates sponsors table 2025-01-26 01:28:31 +00:00
liss-bot
f69189043f 💜 Updates contributors list 2025-01-26 01:28:30 +00:00
Alicia Bot
b8d1d2b4b7 💙 Updates contributor SVG 2025-01-19 01:28:43 +00:00
liss-bot
60f454d930 💛 Updates sponsors table 2025-01-19 01:28:34 +00:00
liss-bot
379d51d557 💜 Updates contributors list 2025-01-19 01:28:33 +00:00
armageddon421
6d75bebe84
uptimekuma: Fix value regex to handle decimals 2025-01-14 17:54:26 +01:00
armageddon421
87e25b213b
uptimekuma: Fix too large pill margin 2025-01-14 17:52:03 +01:00
Alicia Bot
60241df28c 💙 Updates contributor SVG 2025-01-12 01:29:00 +00:00
liss-bot
ef65d80a5b 💛 Updates sponsors table 2025-01-12 01:28:55 +00:00
liss-bot
a21ce4c5c1 💜 Updates contributors list 2025-01-12 01:28:52 +00:00
LinuxSBC
88a6c22c40
Update icon information in README.md 2025-01-08 22:46:13 -06:00
LinuxSBC
b1b5da858a
Add new icon option to configuring.md 2025-01-08 22:38:01 -06:00
LinuxSBC
675a387b02
Add selfh.st to config information 2025-01-08 22:15:26 -06:00
LinuxSBC
17d6c2f57e
Update documentation 2025-01-08 22:07:59 -06:00
LinuxSBC
12372f826e
Add selfh.st/icons support 2025-01-08 21:44:53 -06:00
Alicia Bot
459b483a8e 💙 Updates contributor SVG 2025-01-05 01:29:00 +00:00
liss-bot
28216c28e0 💛 Updates sponsors table 2024-12-29 01:28:51 +00:00
liss-bot
d633415531 💜 Updates contributors list 2024-12-29 01:28:50 +00:00
Alicia Bot
5335d82f61 💙 Updates contributor SVG 2024-12-22 01:28:55 +00:00
Vishwanath Martur
c2bad0b0a9 Add auto dark/light theme switch based on OS preference
Related to #825

Add automatic theme switching based on OS preference

* Add logic in `src/mixins/ThemingMixin.js` to detect OS theme preference using `window.matchMedia`.
* Update `initializeTheme` method in `src/mixins/ThemingMixin.js` to set theme based on OS preference.
* Modify `applyLocalTheme` method in `src/mixins/ThemingMixin.js` to apply the detected theme dynamically.
* Include logic in `src/App.vue` to detect and apply theme based on OS preference during app initialization.
2024-12-17 22:03:15 +05:30
Alicia Bot
85f842587b 💙 Updates contributor SVG 2024-12-15 01:29:28 +00:00
liss-bot
a680efad94 💛 Updates sponsors table 2024-12-15 01:29:23 +00:00
liss-bot
00a5ef480e 💜 Updates contributors list 2024-12-15 01:29:21 +00:00
ThrustVector
a56f174be8 Add Swedish translation section for "nextcloud" widget 2024-12-11 22:20:46 +01:00
ThrustVector
bb007b69f1 Add Swedish translation for "gluetun-status" widget 2024-12-11 21:57:55 +01:00
ThrustVector
773e3e1ac2 Add Swedish translation for the glances widget 2024-12-11 21:51:40 +01:00
ThrustVector
454fd11c0d Add some missing lines in "interactive-editor" section in sv.json 2024-12-11 21:47:42 +01:00
ThrustVector
0f76b21dc6 Update "context-menus" section in sv.json 2024-12-11 21:40:51 +01:00
ThrustVector
2d7fc6eb07 Update translation in "settings" section in sv.json 2024-12-11 21:32:51 +01:00
ThrustVector
ca48c6fcbd Add missing section "splash-screen" to sv.json 2024-12-11 21:19:25 +01:00
liss-bot
39eef6623a 💛 Updates sponsors table 2024-12-08 01:29:17 +00:00
liss-bot
a6d8107a97 💜 Updates contributors list 2024-12-08 01:29:16 +00:00
liss-bot
7a3addc00f 💛 Updates sponsors table 2024-12-01 01:29:44 +00:00
liss-bot
c270716deb 💜 Updates contributors list 2024-12-01 01:29:42 +00:00
Rob Loach
99fd2e0f72
🩹 Fix compilation warning on comment
Was getting the following error...

> 71:50  error  Expected exception block, space or tab after '//' in comment  spaced-comment
2024-11-21 01:34:11 -05:00
sasetz
2145730a49 🌐 Revised and updated ru.json 2024-11-21 02:01:25 +01:00
Kf637
4e58a3e77b
Update nb.json 2024-11-14 11:36:35 +01:00
Kf637
70f4634098
Update nb.json 2024-11-14 11:35:13 +01:00
Kf637
cb3e83c296 Update nb.json 2024-11-14 11:24:09 +01:00
liss-bot
a62c3f6cd8 💛 Updates sponsors table 2024-11-10 01:28:46 +00:00
liss-bot
bcb7f6b3ac 💜 Updates contributors list 2024-11-10 01:28:44 +00:00
liss-bot
3e0b4caa6b 💛 Updates sponsors table 2024-11-03 01:28:49 +00:00
liss-bot
97037033ae 💜 Updates contributors list 2024-11-03 01:28:47 +00:00
Rouben Rehman
2501702f6e
Fixed typo in icons.md
Changed "the the" to "to the" in icons.md
2024-10-30 23:59:36 +01:00
Alicia Bot
e8dc034b40 💙 Updates contributor SVG 2024-10-27 01:29:01 +00:00
vlad11
bdd0baa84e
Changed country code to uk, according to ISO 639-1 code.
The translation into Ukrainian has been corrected.

Signed-off-by: vlad11 <admin@support.od.ua>
2024-10-26 03:42:32 +03:00
Bob Conan
877c6706c4
Update README.md, fix a typo 2024-10-24 13:08:17 -05:00
Alicia Bot
197eaf38dd 💙 Updates contributor SVG 2024-10-20 02:28:57 +01:00
Taylor Jones
e96a8e1f6c
Fix linting for MinecraftStatus.vue 2024-10-15 10:55:11 -06:00
Taylor Jones
8e4e95597a
Add support for minecraft server status widgets 2024-10-15 10:44:54 -06:00
Alicia Bot
146055541f 💙 Updates contributor SVG 2024-10-13 02:28:55 +01:00
Luke
f8c2a7bc79
Fix docs typo 2024-10-10 20:37:29 -05:00
Luke
67bff29e3f
Update widgets.md
Fixed a typo
2024-10-10 17:39:05 -05:00
Alicia Bot
9f98271e2a 💙 Updates contributor SVG 2024-10-06 02:28:48 +01:00
liss-bot
db5542de00 💛 Updates sponsors table 2024-10-06 02:28:42 +01:00
liss-bot
d59c2d3e02 💜 Updates contributors list 2024-10-06 02:28:41 +01:00
Alicia Sykes
0686f9d001
🔄️Merge pull request #1703 from johnhorton2010/fix-doc-typo
Fix small doc typo
2024-09-30 22:36:38 +03:00
John
015561d973 Fix small doc typo
Replaced with the correct homophone for the context of the documentation.
2024-09-30 04:19:00 -05:00
liss-bot
12b66baebe 💛 Updates sponsors table 2024-09-29 02:28:48 +01:00
liss-bot
8cc114bbf4 💜 Updates contributors list 2024-09-29 02:28:47 +01:00
Alicia Bot
413d0009c4 💙 Updates contributor SVG 2024-09-08 02:28:36 +01:00
liss-bot
e8035718b9 💛 Updates sponsors table 2024-09-08 02:28:31 +01:00
liss-bot
8d58d1604f 💜 Updates contributors list 2024-09-08 02:28:30 +01:00
Tobias
60a7113023
🐺 Update issue auto-assign 2024-09-04 20:16:20 +02:00
Tobias
6d219e70b4 🐺 Update issue auto-assign 2024-09-04 20:13:25 +02:00
Tobias
bede08c00c
🔀 Merge pull request #1646 from hockwill/BUG/1608_glances-network-error
Resolves and updates the various broken glances widgets to be compatible with V4 of glances.
2024-09-01 19:08:40 +02:00
Alicia Bot
4741b9310c 💙 Updates contributor SVG 2024-09-01 02:28:59 +01:00
liss-bot
98fe877830 💛 Updates sponsors table 2024-09-01 02:28:50 +01:00
liss-bot
bb9b0f1623 💜 Updates contributors list 2024-09-01 02:28:49 +01:00
Alicia Bot
f1eae498b9 💙 Updates contributor SVG 2024-08-25 02:28:24 +01:00
liss-bot
86817db14c 💛 Updates sponsors table 2024-08-25 02:28:18 +01:00
liss-bot
cb511413e9 💜 Updates contributors list 2024-08-25 02:28:17 +01:00
hockwill
12e3dbe9f4
Merge branch 'Lissy93:master' into BUG/1608_glances-network-error 2024-08-24 06:45:02 -04:00
Alicia Sykes
0bb22d0c52
🔀 Merge pull request #1678 from m42cel/master
[FIX] Add missing 16x16 favicon and fix 32x32 and 64x64 favicon resolution
2024-08-23 17:56:36 +01:00
m42cel
e22ae2819f Fix resolution of favicons and make them square 2024-08-23 11:10:27 +02:00
m42cel
b90aa79795 Add 16x16 favicon 2024-08-23 11:09:42 +02:00
hockwill
fc23f94ed1
Merge branch 'Lissy93:master' into BUG/1608_glances-network-error 2024-08-19 17:53:23 -04:00
Alicia Bot
baced8f780 💙 Updates contributor SVG 2024-08-18 02:28:17 +01:00
liss-bot
b30691595d 💛 Updates sponsors table 2024-08-18 02:28:12 +01:00
liss-bot
100ed67c53 💜 Updates contributors list 2024-08-18 02:28:10 +01:00
Alicia Sykes
2b36eb3f1f
🔀 Merge pull request #1674 from Lissy93/REVERT/1649-requestConfig-param
[REVERT] param change in cors-proxy.js
2024-08-17 15:48:10 +01:00
Alicia Sykes
ff13552c96
🚑 Rever param change in cors-proxy.js 2024-08-17 15:42:15 +01:00
Alicia Sykes
80e8dc94fb
🔀 Merge pull request #1641 from nOw-Ay/master
🔧 add OIDC scope option
2024-08-17 15:34:07 +01:00
Alicia Sykes
864fecaaff
🔀 Merge pull request #1637 from willbrowningme/anonaddy-to-addy-io
Update AnonAddy to new addy.io branding
2024-08-17 15:32:46 +01:00
Alicia Sykes
439c73c89f
Specify scope, or fallback to sensible 2024-08-17 15:31:20 +01:00
Alicia Sykes
ce89f1dd9d
Merge branch 'master' into master 2024-08-17 15:29:59 +01:00
Alicia Sykes
b6668c6811
🔀 Merge pull request #1649 from conlan0/master
 Tactical RMM Widget
2024-08-17 15:25:26 +01:00
Alicia Sykes
5dff4cd65a
🔀 Merge pull request #1667 from dasunsrule32/docs-oidc-authentik
Update authentication.md
2024-08-17 15:17:41 +01:00
Aaron Echols
37fd064fa4
authentication.md: fix some grammer 2024-08-14 12:45:23 -04:00
Aaron Echols
d16cfb8b4e
authentication.md: remove duplicate comment 2024-08-12 13:22:20 -04:00
Aaron Echols
2db28a3119
authentication.md: fix typo 2024-08-12 12:59:05 -04:00
Aaron Echols
535c6ab96b
Update authentication.md
Add `authenik` documentation.
2024-08-12 12:49:41 -04:00
Alicia Bot
c372da6971 💙 Updates contributor SVG 2024-08-11 02:28:22 +01:00
liss-bot
2b59c32ad6 💛 Updates sponsors table 2024-08-11 02:28:17 +01:00
liss-bot
15c1c95bc0 💜 Updates contributors list 2024-08-11 02:28:15 +01:00
Tobias
85922be11e
🔀 Merge pull request #1656 from ip2location/master
Added support for IP2Location.io API
2024-08-07 12:49:13 +02:00
Tobias
0514ee464a
🔀 Merge pull request #1659 from kt-alt/fix/tama_dead_bkgUrl
Updated dead tama theme Background-Url
2024-08-07 12:48:12 +02:00
Tobias
63b9ba38cb
🔀 Merge pull request #1658 from ThibautSnoeijs/master
Fixed a typo
2024-08-07 12:46:50 +02:00
Alicia Sykes
b75d1db867
🔀 Merge pull request #1660 from Lissy93/theme/night-bat
🎨 New theme: NightBat
2024-08-05 12:40:06 +01:00
Alicia Sykes
531bb954d6 🎨 New theme: NightBat 2024-08-05 12:20:36 +01:00
kt-alt
c5649b80e9 updated dead tama theme bkgUrl 2024-08-04 01:07:50 -07:00
liss-bot
090fc87859 💛 Updates sponsors table 2024-08-04 02:28:11 +01:00
liss-bot
5a3f81e250 💜 Updates contributors list 2024-08-04 02:28:09 +01:00
Thibaut
c542e5b2c1
Fixed a typo 2024-08-03 16:10:14 +02:00
IP2Location
d8d55d7d94 Added support for IP2Location.io API 2024-07-31 11:13:16 +08:00
liss-bot
33b4343dd4 💛 Updates sponsors table 2024-07-28 02:28:06 +01:00
liss-bot
92c430a817 💜 Updates contributors list 2024-07-28 02:28:04 +01:00
conlan0
7051aeda83
📝 Add Tactical RMM Documentation 2024-07-25 15:54:37 -04:00
conlan0
78ea929c93
🩹 Send request body as data instead of json 2024-07-25 15:25:58 -04:00
conlan0
bfcccd0139
Add Tactical RMM Widget 2024-07-25 15:24:19 -04:00
conlan0
17c3605794
Tactical RMM Widget 2024-07-25 15:22:46 -04:00
hockwill
d2da68bc6c spelling of keyword 2024-07-21 22:42:23 -04:00
hockwill
55bcadedff On branch BUG/1608_glances-network-error
Changes to be committed:
	modified:   src/components/Widgets/GlNetworkInterfaces.vue
	modified:   src/components/Widgets/GlNetworkTraffic.vue

bug ref: https://github.com/Lissy93/dashy/issues/1608

v4api ref: https://glances.readthedocs.io/en/latest/api.html#get-network
v3api ref: https://github.com/nicolargo/glances/blob/support/glancesv3/docs/api.rst#get-network
2024-07-21 22:38:41 -04:00
liss-bot
264cb754cd 💛 Updates sponsors table 2024-07-21 02:28:09 +01:00
liss-bot
12e25d04d3 💜 Updates contributors list 2024-07-21 02:28:08 +01:00
noway_/
9547c3baec 🔧 add OIDC scope option 2024-07-16 14:00:03 +02:00
Alicia Bot
66dac6ff6d 💙 Updates contributor SVG 2024-07-14 02:28:18 +01:00
liss-bot
4990d4043a 💜 Updates contributors list 2024-07-14 02:28:13 +01:00
Will Browning
80fe545626
Update AnonAddy to new addy.io branding 2024-07-12 09:20:50 +01:00
Alicia Sykes
d3d1de6964
🔀 Merge pull request #1636 from danfein/patch-1
Update deployment.md
2024-07-09 21:19:25 +01:00
Dan
2f450e7026
Update deployment.md
Update docker compose port to match docker and docker Quickstart sections
2024-07-08 18:15:57 -07:00
Alicia Bot
3aa038ce05 💙 Updates contributor SVG 2024-07-07 02:28:05 +01:00
liss-bot
254d45f747 💛 Updates sponsors table 2024-07-07 02:27:59 +01:00
liss-bot
a02e1e8a99 💜 Updates contributors list 2024-07-07 02:27:57 +01:00
Alicia Sykes
da22108ffd
🔀 Merge pull request #1622 from Lissy93/dependabot/npm_and_yarn/ws-6.2.3
Bump ws from 6.2.2 to 6.2.3
2024-07-05 17:39:24 +01:00
Alicia Sykes
89aeb0b007
🔀 Merge pull request #1623 from ddenev/master
[Fix] Scolling on mobile brings up menu #1261
2024-06-30 22:39:58 +01:00
Alicia Bot
23f7a84649 💙 Updates contributor SVG 2024-06-30 02:28:10 +01:00
Dragomir Denev
b32852cf3c fixes #1261 2024-06-19 17:40:44 +03:00
dependabot[bot]
2d9b90e48c
Bump ws from 6.2.2 to 6.2.3
Bumps [ws](https://github.com/websockets/ws) from 6.2.2 to 6.2.3.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/6.2.2...6.2.3)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-18 16:23:33 +00:00
Alicia Bot
f0f87dbb11 💙 Updates contributor SVG 2024-06-16 02:28:01 +01:00
liss-bot
77af028107 💜 Updates contributors list 2024-06-16 02:27:59 +01:00
Alicia Sykes
14c02b1c34
🔀 Merge pull request #1619 from michaelfeinbier/update-simple-icons
Bump simple-icons to 12.2.0
2024-06-15 00:14:03 +01:00
Michael Feinbier
0b1af9db48 Bump simple-icons to 12.2.0 2024-06-14 16:09:21 +02:00
Alicia Bot
bb3d3d7ef3 💙 Updates contributor SVG 2024-06-09 02:28:11 +01:00
liss-bot
f49ba2fb2d 💛 Updates sponsors table 2024-06-09 02:28:07 +01:00
liss-bot
e1e6452b3a 💜 Updates contributors list 2024-06-09 02:28:05 +01:00
Alicia Sykes
768d746cbf
🔒 Adds no-referrer meta tag (#1606) 2024-06-05 17:38:36 +01:00
Alicia Sykes
d4ac785b1b
🔀 Merge pull request #1562 from alhazmy13/master
Update Github trending widget
2024-06-03 23:19:40 +01:00
liss-bot
89adda8adf 💛 Updates sponsors table 2024-06-02 02:27:45 +01:00
liss-bot
5c19c03a62 💜 Updates contributors list 2024-06-02 02:27:44 +01:00
Abdullah Alhazmy
ef851d005f
Update GitHubTrending.vue 2024-05-29 08:29:17 +03:00
Alicia Sykes
f4285a7531 🔃 Pull branch master 2024-05-22 01:07:01 +01:00
Alicia Sykes
7aba2af0f7 🔃 Pull branch master 2024-05-22 01:04:38 +01:00
Alicia Bot
7b5055c02c 💙 Updates contributor SVG 2024-05-26 02:27:47 +01:00
liss-bot
86dd435903 💛 Updates sponsors table 2024-05-26 02:27:41 +01:00
liss-bot
66d12bef13 💜 Updates contributors list 2024-05-26 02:27:39 +01:00
Alicia Sykes
cc736b2209 🐳 Update Docker workflow with the latest versions 2024-05-25 21:12:56 +01:00
Alicia Sykes
34887272ed 🔨 Update how Docker tagging works 2024-05-25 20:51:11 +01:00
Alicia Sykes
8e01d342a8
🔨 Add a manual dispatch, with tag input 2024-05-25 15:27:26 +01:00
Abdullah Alhazmy
eb62c7c53c
Update GitHubTrending.vue 2024-05-01 12:26:10 +03:00
Abdullah Alhazmy
bfba50aa8e
Update GitHubTrending.vue 2024-05-01 12:20:48 +03:00
Abdullah Alhazmy
b4bf81fe3c
Update GitHubTrending.vue 2024-05-01 12:17:49 +03:00
Abdullah Alhazmy
80eaea069e
Update Github trending widget URL 2024-05-01 11:54:20 +03:00
53 changed files with 3964 additions and 2033 deletions

View File

@ -4,7 +4,6 @@ title: '[BUG] <title>'
labels: ['🐛 Bug']
assignees:
- Lissy93
- CrazyWolf13
body:
- type: dropdown
id: environment

View File

@ -3,7 +3,7 @@ description: Suggest an idea for future development of Dashy
title: '[FEATURE_REQUEST] <title>'
labels: ['🦄 Feature Request']
assignees:
- CrazyWolf13
- Lissy93
body:

View File

@ -3,7 +3,7 @@ description: Got a question about Dashy, deployment, development or usage?
title: '[QUESTION] <title>'
labels: ['🤷‍♂️ Question']
assignees:
- CrazyWolf13
- Lissy93
body:
# Filed 1 - Intro Text

View File

@ -4,7 +4,6 @@ title: '[SHOWCASE] <title>'
labels: ['💯 Showcase']
assignees:
- lissy93
- CrazyWolf13
body:
# 1 - Title

View File

@ -4,7 +4,7 @@ on:
workflow_dispatch:
push:
branches: ['master']
tags: ['v*']
tags: ['*.*']
paths:
- '**.js'
- 'src/**'
@ -32,7 +32,7 @@ jobs:
steps:
- name: 🛎️ Checkout Repo
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: 🔖 Get App Version
uses: tyankatsu0105/read-package-version-actions@v1
@ -46,8 +46,12 @@ jobs:
${{ env.DH_IMAGE }}
ghcr.io/${{ env.GH_IMAGE }}
tags: |
type=ref,event=tag,prefix=release-,suffix={{tag}}
type=semver,pattern={{major}}.x,value=${{ steps.package-version.outputs.version }}
type=ref,event=tag
type=semver,pattern={{version}},enable=false
type=semver,pattern={{major}}.x
type=raw,value=latest
flavor: |
latest=false
labels: |
maintainer=Lissy93
org.opencontainers.image.title=Dashy
@ -62,10 +66,10 @@ jobs:
platforms: linux/amd64,linux/arm64,linux/arm/v7
- name: 🔧 Set up Docker Buildx
uses: docker/setup-buildx-action@v1
id: buildx
uses: docker/setup-buildx-action@v2
with:
driver-opts: image=moby/buildkit:v0.10.6
use-buildkit: true
buildkit-daemon-opts: "--oci-worker-no-process-sandbox"
- name: 👀 Inspect builder
run: |
@ -76,13 +80,13 @@ jobs:
echo "Platforms: ${{ steps.buildx.outputs.platforms }}"
- name: 🔑 Login to DockerHub
uses: docker/login-action@v1
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: 🔑 Login to GitHub Container Registry
uses: docker/login-action@v1
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
@ -92,7 +96,7 @@ jobs:
uses: crazy-max/ghaction-docker-status@v1
- name: ⚒️ Build and push
uses: docker/build-push-action@v2
uses: docker/build-push-action@v3
with:
context: .
file: ./Dockerfile

View File

@ -3,7 +3,13 @@ name: 🏗️ Draft New Release
on:
push:
tags:
- '*.*.*'
- '^[0-9]+\.[0-9]+\.[0-9]+$'
- '**'
workflow_dispatch:
inputs:
tag:
description: 'Tag to draft a release for (must already exist)'
required: true
jobs:
create-draft-release:
@ -20,8 +26,8 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
tag_name: ${{ github.event.inputs.tag || github.ref_name }}
release_name: Release ${{ github.event.inputs.tag || github.ref_name }}
draft: true
prerelease: false
generate_release_notes: true

110
README.md
View File

@ -198,7 +198,7 @@ Both sections and items can have an icon associated with them, defined under the
The following icon types are supported:
- **Favicon** - Automatically fetch an apps icon from its Favicon or logo image
- **Icon Packs** - Use any icon from [font-awesome], [simple-icons] or [material icons]
- **Icon Packs** - Use any icon from [font-awesome], [simple-icons], [selfh.st/icons], or [material icons]
- **Emoji** - Any valid emoji can be used as an icon
- **Generative** - Unique, auto-generated images for easily identifying services
- **URL** - Pass the URL of any valid image in to have it fetched and rendered
@ -209,6 +209,7 @@ The following icon types are supported:
[font-awesome]: https://fontawesome.com/icons
[simple-icons]: https://simpleicons.org/
[material icons]: https://github.com/Templarian/MaterialDesign
[selfh.st/icons]: https://selfh.st/icons
[dashboard-icons]: https://github.com/WalkxCode/dashboard-icons
@ -241,7 +242,7 @@ Status indicators can be globally enabled by setting `appConfig.statusCheck: tru
> 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.
You can display dynamic content from services in the form of widgets. There are several pre-built widgets available for showing useful info, and integrations with commonly self-hosted services, but you can also easily create your own for almost any app.
<p align="center">
@ -417,13 +418,14 @@ Dashy supports multiple languages and locales. When available, your language sho
- 🇵🇱 **Polish**: `pl` - Contributed by **[@skaarj1989](https://github.com/skaarj1989)**
- 🇵🇹 **Portuguese**: `pt` - Contributed by **[@LeoColman](https://github.com/LeoColman)**
- 🛰️ **Galician**: `gl` - Contributed by **[@pvillaverde](https://github.com/pvillaverde)**
- 🇷🇺 **Russian**: `ru` - _Auto-generated_
- 🇷🇺 **Russian**: `ru` -Contributed by **[@sasetz](https://github.com/sasetz)**
- 🇸🇰 **Slovak**: `sk` - Contributed by **[@Smexhy](https://github.com/Smexhy)**
- 🇸🇮 **Slovenian**: `sl` - Contributed by **[@UrekD](https://github.com/UrekD)**
- 🇪🇸 **Spanish**: `es` - Contributed by **[@lu4t](https://github.com/lu4t)**
- 🇸🇪 **Swedish**: `sv` - Contributed by **[@BOZG](https://github.com/BOZG)**
- 🇹🇼 **Traditional Chinese**: `zh-TW` - Contributed by **[@stanly0726](https://github.com/stanly0726)**
- 🇹🇷 **Turkish**: `tr` - Contributed by **[@imsakg](https://github.com/imsakg)**
- 🇺🇦 **Ukrainian**: `uk` - Contributed by **[@allozavrr](https://github.com/allozavrr)**
- 🏴‍☠️ **Pirate**: `pirate` - Contributed by **[@Lissy93](https://github.com/lissy93)**
#### Add your Language
@ -526,31 +528,24 @@ Huge thanks to the sponsors helping to support Dashy's development!
<table>
<tr>
<td align="center">
<a href="https://github.com/undefined">
<img src="" width="80;" alt="undefined"/>
<br />
<sub><b>Undefined</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/koconder">
<img src="https://avatars.githubusercontent.com/u/25068?u=582657b23622aaa3dfe68bd028a780f272f456fa&v=4" width="80;" alt="koconder"/>
<a href="https://github.com/vincentkoc">
<img src="https://avatars.githubusercontent.com/u/25068?u=fbd5b2d51142daa4bdbc21e21953a3b8b8188a4a&v=4" width="80;" alt="vincentkoc"/>
<br />
<sub><b>Vincent Koc</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/Admonstrator">
<img src="https://avatars.githubusercontent.com/u/69824?u=1e226d7a36cdd661c3e4cd486fea140d045b7d57&v=4" width="80;" alt="Admonstrator"/>
<a href="https://github.com/anivar">
<img src="https://avatars.githubusercontent.com/u/422943?v=4" width="80;" alt="anivar"/>
<br />
<sub><b>Aaron Viehl</b></sub>
<sub><b>Anivar Aravind</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/tbjers">
<img src="https://avatars.githubusercontent.com/u/1117052?v=4" width="80;" alt="tbjers"/>
<a href="https://github.com/BrianCurliss">
<img src="https://avatars.githubusercontent.com/u/1222949?v=4" width="80;" alt="BrianCurliss"/>
<br />
<sub><b>Torgny Bjers</b></sub>
<sub><b>Brian Curliss</b></sub>
</a>
</td>
<td align="center">
@ -560,14 +555,6 @@ Huge thanks to the sponsors helping to support Dashy's development!
<sub><b>Anand Chowdhary</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/shrippen">
<img src="https://avatars.githubusercontent.com/u/2873570?v=4" width="80;" alt="shrippen"/>
<br />
<sub><b>Shrippen</b></sub>
</a>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/bile0026">
<img src="https://avatars.githubusercontent.com/u/5022496?u=aec96ad173c0ea9baaba93807efa8a848af6595c&v=4" width="80;" alt="bile0026"/>
@ -581,14 +568,8 @@ Huge thanks to the sponsors helping to support Dashy's development!
<br />
<sub><b>Ulises Gascón</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/digitalarche">
<img src="https://avatars.githubusercontent.com/u/6546135?u=564756d7f44ab2206819eb3148f6d822673f5066&v=4" width="80;" alt="digitalarche"/>
<br />
<sub><b>Digital Archeology</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/InDieTasten">
<img src="https://avatars.githubusercontent.com/u/7047377?u=8d8f8017628b38bc46dcbf3620e194b01d3fb2d1&v=4" width="80;" alt="InDieTasten"/>
@ -609,13 +590,12 @@ Huge thanks to the sponsors helping to support Dashy's development!
<br />
<sub><b>Brian McGonagill</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/vlad-timofeev">
<img src="https://avatars.githubusercontent.com/u/11474041?u=eee43705b54d2ec9f51fc4fcce5ad18dd17c87e4&v=4" width="80;" alt="vlad-timofeev"/>
<a href="https://github.com/vlad-tim">
<img src="https://avatars.githubusercontent.com/u/11474041?u=eee43705b54d2ec9f51fc4fcce5ad18dd17c87e4&v=4" width="80;" alt="vlad-tim"/>
<br />
<sub><b>Vlad Timofeev</b></sub>
<sub><b>Vlad</b></sub>
</a>
</td>
<td align="center">
@ -625,47 +605,26 @@ Huge thanks to the sponsors helping to support Dashy's development!
<sub><b>HeliXZz</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/patvdv">
<img src="https://avatars.githubusercontent.com/u/12430107?u=e8911c2fb91af4d30432f76da8c40927b2830bd7&v=4" width="80;" alt="patvdv"/>
<br />
<sub><b>Patrick Van Der Veken</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/plgonzalezrx8">
<img src="https://avatars.githubusercontent.com/u/19900049?u=48a58d2da520a9d712184c6e6e99927ff3cbf179&v=4" width="80;" alt="plgonzalezrx8"/>
<br />
<sub><b>Pedro Gonzalez</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/mryesiller">
<img src="https://avatars.githubusercontent.com/u/24632172?u=0d20f2d615158f87cd60a3398d3efb026c32f291&v=4" width="80;" alt="mryesiller"/>
<br />
<sub><b>Göksel Yeşiller</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/allesauseinerhand">
<img src="https://avatars.githubusercontent.com/u/32039836?v=4" width="80;" alt="allesauseinerhand"/>
<br />
<sub><b>Allesauseinerhand</b></sub>
</a>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/Bastii717">
<img src="https://avatars.githubusercontent.com/u/53431819?u=604977bed6ad6875ada890d0d3765a4cacc2fa14&v=4" width="80;" alt="Bastii717"/>
<a href="https://github.com/undefined">
<img src="" width="80;" alt="undefined"/>
<br />
<sub><b>Bastii717</b></sub>
<sub><b>Undefined</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/M2TD">
<img src="https://avatars.githubusercontent.com/u/85460457?v=4" width="80;" alt="M2TD"/>
<a href="https://github.com/OlliVHH">
<img src="https://avatars.githubusercontent.com/u/84959562?v=4" width="80;" alt="OlliVHH"/>
<br />
<sub><b>M2TD</b></sub>
<sub><b>HamburgerJung</b></sub>
</a>
</td>
<td align="center">
@ -676,17 +635,24 @@ Huge thanks to the sponsors helping to support Dashy's development!
</a>
</td>
<td align="center">
<a href="https://github.com/NixyJuppie">
<img src="https://avatars.githubusercontent.com/u/138570196?u=b102c222487905728b858704962d32759df29ebe&v=4" width="80;" alt="NixyJuppie"/>
<a href="https://github.com/hudsonrock-partnerships">
<img src="https://avatars.githubusercontent.com/u/163282900?u=5f2667f7fe5d284ac7a2da6b0800ea8970b0fcbf&v=4" width="80;" alt="hudsonrock-partnerships"/>
<br />
<sub><b>Nixy</b></sub>
<sub><b>Hudsonrock-partnerships</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/nrvo">
<img src="https://avatars.githubusercontent.com/u/151435968?u=e1dcb307fd0efdc45cddbe9490a7b956e4da6835&v=4" width="80;" alt="nrvo"/>
<a href="https://github.com/gl0bal01">
<img src="https://avatars.githubusercontent.com/u/173822055?u=4d323807f120b34da9b156bfd168b46a22844764&v=4" width="80;" alt="gl0bal01"/>
<br />
<sub><b>Nrvo</b></sub>
<sub><b>Gl0bal01 💖 龴ↀ◡ↀ龴</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/phishdestroy">
<img src="https://avatars.githubusercontent.com/u/208413058?v=4" width="80;" alt="phishdestroy"/>
<br />
<sub><b>PhishDestroy</b></sub>
</a>
</td></tr>
</table>

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 31 MiB

After

Width:  |  Height:  |  Size: 39 MiB

View File

@ -15,6 +15,8 @@
- [Setting up Keycloak](#2-setup-keycloak-users)
- [Configuring Dashy for Keycloak](#3-enable-keycloak-in-dashy-config-file)
- [Toubleshooting Keycloak](#troubleshooting-keycloak)
- [OIDC Auth](#oidc)
- [authentik](#authentik)
- [Alternative Authentication Methods](#alternative-authentication-methods)
- [VPN](#vpn)
- [IP-Based Access](#ip-based-access)
@ -152,7 +154,7 @@ With basic auth, all logic is happening on the client-side, which could mean a s
If you'd like to protect all your config files from direct access, you can set the `BASIC_AUTH_USERNAME` and `BASIC_AUTH_PASSWORD` environmental variables. You'll then be prompted to enter these credentials when visiting Dashy.
Then, if you'd like your frontend to automatically log you in, without prompting you for credentials, then also specify `VUE_APP_BASIC_AUTH_USERNAME` and `VUE_APP_BASIC_AUTH_PASSWORD`. This is useful for when you're hosting Dashy on a private server, and you want to prevent unauthorized access to your config files, while still allowing the frontend to access them. Note that a rebuild is required for these changes to take effect.
Then, if you'd like your frontend to automatically log you in, without prompting you for credentials (insecure, so only use on a trusted environment), then also specify `VUE_APP_BASIC_AUTH_USERNAME` and `VUE_APP_BASIC_AUTH_PASSWORD`. This is useful for when you're hosting Dashy on a private server, and just want to use auth for user management and to prevent direct access to your config files, while still allowing the frontend to access them. Note that a rebuild is required for these changes to take effect.
**[⬆️ Back to Top](#authentication)**
@ -283,6 +285,7 @@ appConfig:
oidc:
clientId: [registered client id]
endpoint: [OIDC endpoint]
scope: [The scope(s) to request from the OIDC provider]
```
Because Dashy is a SPA, a [public client](https://datatracker.ietf.org/doc/html/rfc6749#section-2.1) registration with PKCE is needed.
@ -311,10 +314,187 @@ identity_providers:
- 'groups'
```
Groups and roles will be populated and available for controlling display similar to [Keycloak](#Keycloak) abvoe.
Groups and roles will be populated and available for controlling display similar to [Keycloak](#Keycloak) above.
---
### authentik
This documentation is specific to `authentik`, however it may be useful in getting other idP's working with `Dashy`.
This guide will only walk through the following:
* Creating and configuring an OIDC provider
* Creating and configuring an application
* Assigning groups
* Configuring `Dashy` to use the OIDC client
* Show quick examples of how to hide/show `pages`, `items`, and `sections` using OIDC groups
This guide assumes the following:
* You have a working instance of `authentik` terminated with SSL
* You have a working instance of `Dashy` terminated with SSL
* Users and groups are provisioned
* You are familiar with how `authentik` works in case you need to do further troubleshooting that is outside the scope of this guide.
>[!TIP]
>It it recommended that you create groups specific for `Dashy`. Groups will allow you to display content based on group membership as well as limiting user access to `Dashy`. If you do not need this functionality, then you can forgo creating specific groups.
>[!TIP]
>You can use the application wizard to create the provider and application at one time. This is the recommended route, but only the manual process will be outlined in this guide.
![image](https://github.com/user-attachments/assets/72e45162-6c86-4d6f-a1ae-724ac503c00c)
#### 1. Create an OIDC provider
Login to the admin console for `authentik`. Go to `Applications` > `Providers`. Click `Create`.
![image](https://github.com/user-attachments/assets/c1f7f45d-469c-4bf1-a825-34658341a83e)
A dialog box will pop-up, select the `OAuth2/OpenID Provider`. Click `Next`.
![image](https://github.com/user-attachments/assets/ea84fe57-b813-404d-8dad-5e221b440bdb)
On the next page of the wizard, set the `Name`, `Authentication flow`, and `Authorization flow`. See example below. Using the `default-provider-authorization-implicit-consent` authorization flow on internal services and `default-provider-authorization-explicit-consent` on external services is a common practice. However, it is fully up to you on how you would like to configure this option. `Implicit` will login directly without user consent, `explicit` will ask if the user approves the service being logged into with their user credentials.
![image](https://github.com/user-attachments/assets/e600aeaf-08d1-49aa-b304-11e90e5c89cd)
Scroll down and configure the `Protocol settings`. Set the `Client type` to `Public`. Add the `Redirect URIs/Origins (RegEx)`. If the site is hosted at `dashy.lan.domain.com`, then you would enter as the example below.
>[!NOTE]
>If you have an internal and external domain for `Dashy`, enter both URI's. Enter each URI on a new line.
![image](https://github.com/user-attachments/assets/4a289d7e-d7b4-4ff6-af5d-3e5202fae84e)
Scroll down to set the `Signing Key`. It is recommended to use the built in `authentik Self-signed Certificate` here unless you have special needs for your own custom cert.
![image](https://github.com/user-attachments/assets/386c0750-9d2b-4482-8938-8b301b489b38)
Expand `Advanced protocol settings` then verify the `Scopes` are set to what is highlighted in `white` below. Set the `Subject mode` to `Based on the Users's Email`.
![image](https://github.com/user-attachments/assets/ae5e87b8-1ad6-41dd-b6e1-9665623f842a)
Lastly, toggle `Include claims in id_token` to on. Click `Finish` to complete creating the provider.
![image](https://github.com/user-attachments/assets/25353b3c-3f54-47cf-bd47-b5023f86d7cf)
Grab the generated `Client ID` and `OpenID Configuration Issuer` URL by clicking the newly created provider as this will use this later when `Dashy` is configured to use the OIDC auth mechanism. In this tutorial, what was generated is used below. Obviously adjust the `Client ID` that was generated and use your domain here for the `issuer`.
```
Client ID: pzN9DCMLqHTTatgtYFg50cl0jn1NmCyBC3wreX15
OpenID Configuration Issuer: https://auth.domain.com/application/o/dashy/
```
#### 2. Create an application
Make sure you are still in the `authentik` admin console then go to `Applications` > `Applications`. Click `Create`.
![image](https://github.com/user-attachments/assets/fd225936-15a1-409f-83c8-e24a43047df0)
Next, it is required to give a user facing `Name`, `Slug` and assign the newly created provider. Use the example below if you have been following the guide. If you have used your own naming, then adjust accordingly. Click `Create` once you are done.
![image](https://github.com/user-attachments/assets/e6574d7d-6b22-4e7d-b388-45341b98746b)
>[!TIP]
>Open the application in a new tab from the `authentik` user portal and upload a custom icon. You can also enter a user facing `Description` that the user would see.
![image](https://github.com/user-attachments/assets/20561387-549f-49de-98e6-30330dcdc734)
#### 3. *(Optional)* Limiting access via `authentik` with groups
If you would like to deny `Dashy` access from specific users who are not within `authentik` based groups, you bind them to the application you just created now. `authentik` will deny access to those who are not members of this group or groups. If you want to allow everyone access from your `authentik` instance, skip this step.
Make sure you are still in the `authentik` admin console then go to `Applications` > `Applications`. Click the newly created `Dashy` application.
![image](https://github.com/user-attachments/assets/613fafe7-881f-4664-a903-945854ac65e2)
Click the `Policy/Group/User Bindings` tab at the top, then click `Bind existing policy`. This assumes you have already created the groups you want to use for `Dashy` and populated users in those groups.
![image](https://github.com/user-attachments/assets/10fca15b-e77d-4624-ae03-0ece3910904c)
Click `Group` for the binding type. Under `Group` select the appropriate group you would like to bind. Make sure `Enabled` is toggeled on. Click `Create`.
![image](https://github.com/user-attachments/assets/ebf680ab-696f-4c08-ae89-d73fe92b398f)
`Dashy` will now be scoped only to users within the assigned groups you have bound the application to. Keep adding groups if you would like to adjust the dashboard visibilty based on group membership.
#### 4. Configure `Dashy` to use OIDC client
>[!IMPORTANT]
>It is highly recommended to edit your `conf.yml` directly for this step.
>[!CAUTION]
>Do not make the same mistake many have made here by including the fully qualified address for the `OpenID Configuration URL`. `Dashy` will append the `.well-known` configuration automatically. If the `.well-known` URI is included the app will get redirect loops and `400` errors.
Enter the `Client ID` in the `clientId` field and `OpenID Configuration Issuer` in the `endpoint` field.
Below is how to configure the `auth` section in the yaml syntax. Once this is enabled, when an attempt to access `Dashy` is made it will now redirect you to the `authentik` login page moving forward.
```
appConfig:
theme: glass
layout: auto
iconSize: medium
auth:
enableOidc: true
oidc:
clientId: pzN9DCMLqHTTatgtYFg50cl0jn1NmCyBC3wreX15
endpoint: https://auth.domain.com/application/o/dashy/
```
#### 5. *(OPTIONAL)* Example snippets for dashboard visibility
Using the `hideForKeycloakUsers` configuration option is needed to use the `authentik` groups that were created previously.
Adjusting `pages` visibility:
```
pages:
- name: App Management
path: appmgmt.yml
displayData:
hideForKeycloakUsers:
groups:
- Dashy Users
- name: Network Management
path: network.yml
displayData:
hideForKeycloakUsers:
groups:
- Dashy Users
```
Adjusting `items` visibility:
```
items:
- title: Authentik Admin
icon: authentik.svg
url: https://auth.domain.com/if/admin/
target: newtab
id: 0_1472_authentikadmin
displayData:
hideForKeycloakUsers:
groups:
- Dashy Users
- title: Authentik User
icon: authentik-light.png
url: https://auth.domain.com/if/user/
target: newtab
id: 1_1472_authentikuser
```
Adjusting `sections` visibility:
```
sections:
- name: Authentication
displayData:
sortBy: default
rows: 2
cols: 1
collapsed: false
hideForGuests: false
hideForKeycloakUsers:
groups:
- Dashy Users
```
---
## Alternative Authentication Methods
If you are self-hosting Dashy, and require secure authentication to prevent unauthorized access, then you can either use Keycloak, or one of the following options:

View File

@ -93,7 +93,9 @@ The following file provides a reference of all supported configuration options.
**Field** | **Type** | **Required**| **Description**
--- | --- | --- | ---
**`name`** | `string` | Required | A unique name for that page
**`path`** | `string` | Required | The path (local or remote) to the config file to use.<br>For files located within `/public`, you only need to specify filename, for externally hosted files you must include the full URL
**`path`** | `string` | Required | The path (local or remote) to the config file to use.<br>For files located within `/user-data`, you only need to specify filename, for externally hosted files you must include the full URL
For more info, see the[Multi-Page docs](/docs/pages-and-sections.md#multi-page-support)
**[⬆️ Back to Top](#configuring)**
@ -202,6 +204,7 @@ For more info, see the **[Authentication Docs](/docs/authentication.md)**
--- | --- | --- | ---
**`clientId`** | `string` | Required | The client id registered in the OIDC server
**`endpoint`** | `string` | Required | The URL of the OIDC server that should be used.
**`scope`** | `string` | Required | The scope(s) to request from the OIDC provider
**[⬆️ Back to Top](#configuring)**
@ -319,7 +322,7 @@ For more info, see the **[Authentication Docs](/docs/authentication.md)**
**Field** | **Type** | **Required**| **Description**
--- | --- | --- | ---
**`icon`** | `string` | _Optional_ | The icon for a given item or section. <br>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
**`icon`** | `string` | _Optional_ | The icon for a given item or section. <br>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, selfh.st icons, and icons specified by URL
**[⬆️ Back to Top](#configuring)**

File diff suppressed because it is too large Load Diff

View File

@ -112,7 +112,7 @@ services:
# volumes:
# - /root/my-config.yml:/app/user-data/conf.yml
ports:
- 4000:8080
- 8080:8080
# Set any environmental variables
environment:
- NODE_ENV=production
@ -182,7 +182,7 @@ dashy should be up within 1-2min after you've started the install task procedure
If you do not want to use Docker, you can run Dashy directly on your host system. For this, you will need both [git](https://git-scm.com/downloads) and the latest or LTS version of [Node.js](https://nodejs.org/) installed, and optionally [yarn](https://yarnpkg.com/)
1. Get Code: `git clone https://github.com/Lissy93/dashy.git` and `cd dashy`
2. Configuration: Fill in you're settings in `./user-data/conf.yml`
2. Configuration: Fill in your settings in `./user-data/conf.yml`
3. Install dependencies: `yarn`
4. Build: `yarn build`
5. Run: `yarn start`

View File

@ -7,6 +7,7 @@ Both sections and items can have an icon, which is specified using the `icon` at
- [Simple Icons](#simple-icons)
- [Generative Icons](#generative-icons)
- [Emoji Icons](#emoji-icons)
- [selfh.st Icons](#selfhst-icons)
- [Home-Lab Icons](#home-lab-icons)
- [Material Icons](#material-design-icons)
- [Icons by URL](#icons-by-url)
@ -63,7 +64,7 @@ Font-Awesome has a wide variety of free icons, but you can also use their pro ic
## Simple Icons
[SimpleIcons.org](https://simpleicons.org/) is a collection of 2000+ high quality, free and open source brand and logo SVG icons. Usage of which is very similar to font-awesome icons. First find the glyph you want to use on the [website](https://simpleicons.org/), then just set your icon the the simple icon slug, prefixed with `si-`.
[SimpleIcons.org](https://simpleicons.org/) is a collection of 2000+ high quality, free and open source brand and logo SVG icons. Usage of which is very similar to font-awesome icons. First find the glyph you want to use on the [website](https://simpleicons.org/), then just set your icon to the simple icon slug, prefixed with `si-`.
<p align="center">
<img width="580" src="https://i.ibb.co/MVhkXfC/simple-icons-example.png" />
@ -109,9 +110,21 @@ For example, these will all render the same rocket (🚀) emoji: `icon: ':rocket
---
## selfh.st Icons
The [selfh.st](https://selfh.st/) project provides a set of icons, originally for self-hosted services, but now expanded to include a wide variety of services. These icons can be used by specifying the icon name (without extension and with all spaces replaced with -) preceded by `sh-`. See https://selfh.st/icons/ for a full list of all available icons. For example, the Home Assistant icon is `sh-home-assistant`.
Note: These icons are fetched from the jsdelivr CDN, so if you require offline access, the [Local Icons](#local-icons) method may be a better option for you.
<p align="center">
<img width="580" src="https://i.ibb.co/pfy09LH/Screenshot-from-2025-01-08-22-04-21.png" />
</p>
---
## Home-Lab Icons
The [dashboard-icons](https://github.com/walkxcode/Dashboard-Icons) repo by [@WalkxCode](https://github.com/WalkxCode) provides a comprehensive collection of 360+ high-quality PNG icons for commonly self-hosted services. Dashy natively supports these icons, and you can use them just by specifying the icon name (without extension) preceded by `hl-`. See [here](https://github.com/walkxcode/Dashboard-Icons/tree/main/png) for a full list of all available icons. Note that these are fetched and cached strait from GitHub, so if you require offline access, the [Local Icons](#local-icons) method may be a better option for you.
The [dashboard-icons](https://github.com/walkxcode/Dashboard-Icons) repo by [@WalkxCode](https://github.com/WalkxCode) provides a comprehensive collection of 360+ high-quality PNG icons for commonly self-hosted services. Dashy natively supports these icons, and you can use them just by specifying the icon name (without extension) preceded by `hl-`. See [here](https://github.com/walkxcode/Dashboard-Icons/tree/main/png) for a full list of all available icons. Note that these are fetched and cached straight from GitHub, so if you require offline access, the [Local Icons](#local-icons) method may be a better option for you.
For example:

View File

@ -118,9 +118,10 @@ Dashy supports [Widgets](/docs/widgets.md) for displaying dynamic content. Below
- [OWM Privacy Policy](https://openweather.co.uk/privacy-policy)
- **[RSS Feed](/docs/widgets.md#rss-feed)**: `https://api.rss2json.com/v1/api.json`
- [Rss2Json Privacy Policy](https://rss2json.com/privacy-policy)
- **[IP Address](/docs/widgets.md#public-ip)**: `https://ipapi.co/json` or `http://ip-api.com/json`
- **[IP Address](/docs/widgets.md#public-ip)**: `https://ipapi.co/json` or `http://ip-api.com/json` or `https://api.ip2location.io/`
- [IPGeoLocation Privacy Policy](https://ipgeolocation.io/privacy.html)
- [IP-API Privacy Policy](https://ip-api.com/docs/legal)
- [IP2Location.io Privacy Policy](https://ip2location.io/privacy-policy)
- **[IP Blacklist](/docs/widgets.md#ip-blacklist)**: `https://api.blacklistchecker.com`
- [Blacklist Checker Privacy Policy](https://blacklistchecker.com/privacy)
- **[Domain Monitor](/docs/widgets.md#domain-monitor)**: `http://api.whoapi.com`
@ -131,8 +132,8 @@ Dashy supports [Widgets](/docs/widgets.md) for displaying dynamic content. Below
- [BlockCypher Privacy Policy](https://www.blockcypher.com/privacy.html)
- **[Code::Stats](/docs/widgets.md#code-stats)**: `https://codestats.net`
- [Code::Stats Privacy Policy](https://codestats.net/tos#privacy)
- **[AnonAddy](/docs/widgets.md#anonaddy)**: `https://app.anonaddy.com`
- [AnonAddy Privacy Policy](https://anonaddy.com/privacy/)
- **[addy.io](/docs/widgets.md#addyio)**: `https://app.addy.io`
- [addy.io Privacy Policy](https://addy.io/privacy/)
- **[Vulnerability Feed](/docs/widgets.md#vulnerability-feed)**: `https://www.cvedetails.com`
- [CVE Details Privacy Policy](https://www.cvedetails.com/privacy.php)
- **[Exchange Rate](/docs/widgets.md#exchange-rates)**: `https://v6.exchangerate-api.com`

View File

@ -42,7 +42,7 @@ Any files placed here will be served up to the root of the domain, and override
For example, if you had `user-data/favicon.ico` this would be accessible at `http://my-dashy-instance.local/favicon.ico`
Example Files in `user-data`:
- `conf.yml` - This is the only file that is compulsary, it's your main Dashy config
- `conf.yml` - This is the only file that is compulsory, it's your main Dashy config
- `**.yml` - Include more config files, if you'd like to have multiple pages, see [Multi-page support](/docs/pages-and-sections.md#multi-page-support) for docs
- `favicon.ico` - The default favicon, shown in the browser's tab title
- `initialization.html` - Static HTML page displayed before the app has finished compiling, see [`public/initialization.html`](https://github.com/Lissy93/dashy/blob/master/public/initialization.html)
@ -61,7 +61,7 @@ Example Files in `user-data`:
Now that you've got Dashy running, you are going to want to set it up with your own content.
Config is written in [YAML Format](https://yaml.org/), and saved in [`/user-data/conf.yml`](https://github.com/Lissy93/dashy/blob/master/user-data/conf.yml).
The format on the config file is pretty straight forward. There are three root attributes:
The format on the config file is pretty straight forward. There are four root attributes:
- [`pageInfo`](https://github.com/Lissy93/dashy/blob/master/docs/configuring.md#pageinfo) - Dashboard meta data, like title, description, nav bar links and footer text
- [`appConfig`](https://github.com/Lissy93/dashy/blob/master/docs/configuring.md#appconfig-optional) - Dashboard settings, like themes, authentication, language and customization

View File

@ -18,7 +18,7 @@ Dashy has support for displaying dynamic content in the form of widgets. There a
- [Crypto Wallet Balance](#wallet-balance)
- [Code Stats](#code-stats)
- [Mullvad Status](#mullvad-status)
- [Email Aliases (AnonAddy)](#anonaddy)
- [Email Aliases (addy.io)](#addyio)
- [Vulnerability Feed](#vulnerability-feed)
- [Exchange Rates](#exchange-rates)
- [Public Holidays](#public-holidays)
@ -40,6 +40,7 @@ Dashy has support for displaying dynamic content in the form of widgets. There a
- [Mvg Connection](#mvg-connection)
- [Custom search](#custom-search)
- [Rescuetime overview](#rescuetime-overview)
- [Minecraft Server](#minecraft-server)
- **[Self-Hosted Services Widgets](#self-hosted-services-widgets)**
- [System Info](#system-info)
- [Cron Monitoring](#cron-monitoring-health-checks)
@ -67,6 +68,7 @@ Dashy has support for displaying dynamic content in the form of widgets. There a
- [Drone CI Build](#drone-ci-builds)
- [Linkding](#linkding)
- [Uptime Kuma](#uptime-kuma)
- [Tactical RMM](#tactical-rmm)
- **[System Resource Monitoring](#system-resource-monitoring)**
- [CPU Usage Current](#current-cpu-usage)
- [CPU Usage Per Core](#cpu-usage-per-core)
@ -287,7 +289,7 @@ Unless image fetched from remote source, no external data request is made.
### Public IP
Often find yourself searching "What's my IP", just so you can check your VPN is still connected? This widget displays your public IP address, along with ISP name and approx location. Data can be fetched from either [IpApi.co](https://ipapi.co/), [IP-API.com](https://ip-api.com/) or [IpGeolocation.io](https://ipgeolocation.io/).
Often find yourself searching "What's my IP", just so you can check your VPN is still connected? This widget displays your public IP address, along with ISP name and approx location. Data can be fetched from either [IpApi.co](https://ipapi.co/), [IP-API.com](https://ip-api.com/), [IpGeolocation.io](https://ipgeolocation.io/) or [IP2Location.io](https://ip2location.io/).
<p align="center"><img width="400" src="https://i.ibb.co/vc3c8zN/public-ip.png" /></p>
@ -297,8 +299,8 @@ _All fields are optional._
**Field** | **Type** | **Required** | **Description**
--- | --- | --- | ---
**`provider`** | `string` | _Optional_ | The name of the service to fetch IP address from. Can be either `ipapi.co`, `ip-api` or `ipgeolocation`. Defaults to `ipapi.co`. Note, `ip-api` doesn't work on HTTPS, and if you set to `ipgeolocation` then you must also provide an API key
**`apiKey`** | `string` | _Optional_ | Only required if provider is set to `ipgeolocation`. You can get a free API key [here](https://ipgeolocation.io/signup.html)
**`provider`** | `string` | _Optional_ | The name of the service to fetch IP address from. Can be either `ipapi.co`, `ip-api`, `ipgeolocation` or `ip2location.io`. Defaults to `ipapi.co`. Note, `ip-api` doesn't work on HTTPS, and if you set to `ipgeolocation` or `ip2location.io` then you must also provide an API key
**`apiKey`** | `string` | _Optional_ | Only required if provider is set to `ipgeolocation` or `ip2location.io`. You can get a free IPGeolocation API key [here](https://ipgeolocation.io/signup.html) or a free IP2Location.io API key [here](https://ip2location.io/pricing)
#### Example
@ -321,7 +323,7 @@ Or
- **Auth**: 🟠 Optional
- **Price**: 🟢 Free
- **Host**: Managed Instance Only
- **Privacy**: _See [IPGeoLocation Privacy Policy](https://ipgeolocation.io/privacy.html) or [IP-API Privacy Policy](https://ip-api.com/docs/legal)_
- **Privacy**: _See [IPGeoLocation Privacy Policy](https://ipgeolocation.io/privacy.html) or [IP-API Privacy Policy](https://ip-api.com/docs/legal) or [IP2Location.io Privacy Policy](https://ip2location.io/privacy-policy)
---
@ -573,11 +575,11 @@ _No Options._
---
### AnonAddy
### addy.io
[AnonAddy](https://anonaddy.com/) is a free and open source mail forwarding service. Use it to protect your real email address, by using a different alias for each of your online accounts, and have all emails land in your normal inbox(es). Supports custom domains, email replies, PGP-encryption, multiple recipients and more
[addy.io](https://addy.io/) is a free and open source mail forwarding service. Use it to protect your real email address, by using a different alias for each of your online accounts, and have all emails land in your normal inbox(es). Supports custom domains, email replies, PGP-encryption, multiple recipients and more
This widget display email addresses / aliases from AnonAddy. Click an email address to copy to clipboard, or use the toggle switch to enable/ disable it. Shows usage stats (bandwidth, used aliases etc), as well as total messages received, blocked and sent. Works with both self-hosted and managed instances of AnonAddy.
This widget display email addresses / aliases from addy.io. Click an email address to copy to clipboard, or use the toggle switch to enable/ disable it. Shows usage stats (bandwidth, used aliases etc), as well as total messages received, blocked and sent. Works with both self-hosted and managed instances of addy.io.
<p align="center"><img width="400" src="https://i.ibb.co/ZhfyRdV/anonaddy.png" /></p>
@ -585,8 +587,8 @@ This widget display email addresses / aliases from AnonAddy. Click an email addr
**Field** | **Type** | **Required** | **Description**
--- | --- | --- | ---
**`apiKey`** | `string` | Required | Your AnonAddy API Key / Personal Access Token. You can generate this under [Account Settings](https://app.anonaddy.com/settings)
**`hostname`** | `string` | _Optional_ | If your self-hosting AnonAddy, then supply the host name. By default it will use the public hosted instance
**`apiKey`** | `string` | Required | Your addy.io API Key / Personal Access Token. You can generate this under [Account Settings](https://app.addy.io/settings)
**`hostname`** | `string` | _Optional_ | If your self-hosting addy.io, then supply the host name. By default it will use the public hosted instance
**`apiVersion`** | `string` | _Optional_ | If you're using an API version that is not version `v1`, then specify it here
**`limit`** | `number` | _Optional_ | Limit the number of emails shown per page. Defaults to `10`
**`sortBy`** | `string` | _Optional_ | Specify the sort order for email addresses. Defaults to `updated_at`. Can be either: `local_part`, `domain`, `email`, `emails_forwarded`, `emails_blocked`, `emails_replied`, `emails_sent`, `created_at`, `updated_at` or `deleted_at`. Precede with a `-` character to reverse order.
@ -614,7 +616,7 @@ This widget display email addresses / aliases from AnonAddy. Click an email addr
- **Auth**: 🔴 Required
- **Price**: 🟠 Free for Self-Hosted / Free Plan available on managed instance or $1/month for premium
- **Host**: Self-Hosted or Managed
- **Privacy**: _See [AnonAddy Privacy Policy](https://anonaddy.com/privacy/)_
- **Privacy**: _See [addy.io Privacy Policy](https://addy.io/privacy/)_
---
@ -705,7 +707,7 @@ Display current FX rates in your native currency. Hover over a row to view more
Counting down to the next day off work? This widget displays upcoming public holidays for your country. Data is fetched from [Enrico](http://kayaposoft.com/enrico/)
Note, config for this widget is case-sensetive (see [#1268](https://github.com/Lissy93/dashy/issues/1268))
Note, config for this widget is case-sensitive (see [#1268](https://github.com/Lissy93/dashy/issues/1268))
<p align="center"><img width="400" src="https://i.ibb.co/VC6fZqn/public-holidays.png" /></p>
@ -790,7 +792,7 @@ Or
### Sports Scores
Show recent scores and upcoming matches from your favourite sports team. Data is fetched from [TheSportsDB.com](https://www.thesportsdb.com/). From the UI, you can click any other team to view their scores and upcoming games, or click a league name to see all teams.
Show recent scores and upcoming matches from your favorite sports team. Data is fetched from [TheSportsDB.com](https://www.thesportsdb.com/). From the UI, you can click any other team to view their scores and upcoming games, or click a league name to see all teams.
<p align="center"><img width="400" src="https://i.ibb.co/8XhXGkN/sports-scores.png" /></p>
@ -1296,6 +1298,155 @@ In other words: Private, noncomercial, moderate use of the API is tolerated. The
---
### Custom List
Renders custom schema-compliant JOSN in a list.
#### Options
**Field** | **Type** | **Required** | **Description**
--- | --- | --- | ---
**`url`** | `text` | Required | A string containing the url of a json file.
**`title`** | `text` | optional | A title for the widget. Can be helpful if stacking multiple lists in the same section.
**`daysForNew`** | `number` | Optional | Used to highlight new items.
#### Json Schema
The input file should comply with the following schema:
```json
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "array",
"items": [
{
"type": "object",
"properties": {
"link": {
"type": "object",
"properties": {
"text": {
"type": "string"
},
"url": {
"type": "string"
},
"title": {
"type": "string"
}
},
"required": [
"text",
"url",
"title"
]
},
"value": {
"type": "object",
"properties": {
"text": {
"type": "string"
},
"title": {
"type": "string"
}
},
"required": [
"text",
"title"
]
},
"date": {
"type": "string"
}
},
"required": [
"link",
"value",
"date"
]
}
]
}
```
Example: This json data was generated by a data worflow that gets the new releases of a few projects from GitHub. The system used to build the data workflow is n8n.
```json
[
{
"link": {
"text": "jellyfin/jellyfin",
"url": "https://github.com/jellyfin/jellyfin/releases/tag/v10.10.7",
"title": ""
},
"value": {
"text": "v10.10.7",
"title": "2025-04-05"
},
"date": "2025-04-05T19:14:59Z"
},
{
"link": {
"text": "jellyfin/jellyfin-web",
"url": "https://github.com/jellyfin/jellyfin-web/releases/tag/v10.10.7",
"title": ""
},
"value": {
"text": "v10.10.7",
"title": "2025-04-05"
},
"date": "2025-04-05T19:15:00Z"
},
{
"link": {
"text": "lissy93/dashy",
"url": "https://github.com/Lissy93/dashy/releases/tag/3.1.1",
"title": ""
},
"value": {
"text": "3.1.1",
"title": "2024-05-30"
},
"date": "2024-05-30T17:20:53Z"
},
{
"link": {
"text": "VSCodium/vscodium",
"url": "https://github.com/VSCodium/vscodium/releases/tag/1.102.14746",
"title": ""
},
"value": {
"text": "1.102.14746",
"title": "2025-07-16"
},
"date": "2025-07-16T18:27:49Z"
}
]
```
#### Notes
- This widget is designed to render data generated by another system that complies with the schema. The example JSON data above was generated using a n8n workflow, and other ETL or workflow systems can generate similar results.
- To avoid requests to a different system in each refresh, you can save the input files locally in the user-data folder inside your Dashy installation.
- To use json files from a different domain, remember to add `useProxy: true` to the widget configuration. I have not tested this use case because I save all my input data locally on the Dashy server. Please open a ticket if you have an issue in this use case.
#### Example
This widget renders a json file that from a `json-data` directory inside the `user-data` directory on the Dashy server.
```yaml
- type: custom-list
options:
url: /json-data/github-releases.json
title: 'Github Releases'
daysForNew: 5
```
#### Info
- **CORS**: 🟢 Not needed for files hosted inside the `user-data` directory. Use `useProxy: true` to bypass CORS restrictions when using data from a different server.
- **Auth**: 🟢 Not Required
- **Price**: 🟢 Free
- **Host**: user defined
- **Privacy**: depends on the user defined host.
---
### Custom search
Allows web search using multiple user-defined search engines and other websites.
@ -1377,6 +1528,45 @@ Show an overview of how you have spent your time for the current day.
---
### Minecraft Server
Show minecraft server status
<p align="center"><img width="380" src="https://i.ibb.co/hcmd4Wf/minecraft-widget.png" /></p>
#### Options
**Field** | **Type** | **Required** | **Description**
--- | --- | --- | ---
**`title`** | `string` | _Optional_ | Display title for server uses server address if not set.
**`server`** | `string` | Required | Server hostname or ip(:port) will use srv records.
**`bedrock`** | `boolean` | _Optional_ | If server is a bedrock edition server. (default false)
**`showMods`** | `boolean` | _Optional_ | Display mod list if available
**`showPlayers`** | `boolean` | _Optional_ | Display player list if available
**`showPlugins`** | `boolean` | _Optional_ | Display plugin list if available
#### Example
```yaml
- type: minecraft-status
options:
title: Venity Network
server: play.venitymc.com
bedrock: true
showMods: true
showPlayers: true
showPlugins: true
```
#### Info
- **CORS**: 🟢 Enabled
- **Auth**: 🟢 Not Required
- **Price**: 🟢 Free
- **Host**: [Minecraft Server Status](https://mcsrvstat.us/)
- **Privacy**: _See [Minecraft Server Status FAQ](https://mcsrvstat.us/faq)_
---
## Self-Hosted Services Widgets
@ -2333,6 +2523,41 @@ Linkding is a self-hosted bookmarking service, which has a clean interface and i
- **Host**: Self-Hosted (see [Uptime Kuma](https://github.com/louislam/uptime-kuma) )
- **Privacy**: _See [Uptime Kuma](https://github.com/louislam/uptime-kuma)_
---
### Tactical RMM
[Tactical RMM](https://github.com/amidaware/tacticalrmm) is a self-hosted remote monitoring & management tool.
<p align="center"><a href="https://ibb.co/NVHWpD1"><img src="https://i.ibb.co/ng5Qfd3/Capture.png" alt="Capture" border="0"></a></p>
#### Options
| **Field** | **Type** | **Required** | **Description** |
| ------------ | -------- | ------------ | ------------------------------------------------------------------------ |
| **`url`** | `string` | Required | The status endpoint URL (https://api.example.com/core/status/) |
| **`token`** | `string` | Required | The MON_TOKEN (see https://docs.tacticalrmm.com/tipsntricks/#monitor-your-trmm-instance-via-the-built-in-monitoring-endpoint). |
#### Example
```yaml
- type: trmm
useProxy: true
options:
token: PkPVKMzbmXgeQDlJWb0WXYvsIk3JvZyadURud2cSTdMia6hUbQ
url: https://api.example.com/core/status/
```
#### Info
- **CORS**: 🟠 Proxied
- **Auth**: 🟢 Required
- **Price**: 🟢 Free
- **Host**: Self-Hosted (see [Tactical RMM](https://github.com/amidaware/tacticalrmm) )
- **Privacy**: _See [Tactical RMM](https://github.com/amidaware/tacticalrmm)_
---
## System Resource Monitoring
@ -2364,7 +2589,7 @@ Here an example for Docker
Glances can be launched with the `glances` command. You'll need to run it in web server mode, using the `-w` option for the API to be reachable. If you don't plan on using the Web UI, then you can disable it using `--disable-webui`. See the [command reference docs](https://glances.readthedocs.io/en/latest/cmds.html) for more info.
If Glaces is running on a Windows system it is recommanded to add the following arguments ```--disable-plugin all --enable-plugin cpu,mem,diskio,ip,network,containers,quicklook,load,fs,alert -w``` This is due to Glances not being that stable on windows, so disabling all plugins that aren't used by Dashy widgets can save on ressources.
If Glances is running on a Windows system it is recommended to add the following arguments ```--disable-plugin all --enable-plugin cpu,mem,diskio,ip,network,containers,quicklook,load,fs,alert -w``` This is due to Glances not being that stable on windows, so disabling all plugins that aren't used by Dashy widgets can save on ressources.
#### Options

View File

@ -34,8 +34,8 @@
"register-service-worker": "^1.7.2",
"remedial": "^1.0.8",
"rss-parser": "3.13.0",
"simple-icons": "^10.4.0",
"rsup-progress": "^3.2.0",
"simple-icons": "^14.4.0",
"v-jsoneditor": "^1.4.5",
"v-tooltip": "^2.1.3",
"vue": "^2.7.0",

View File

@ -5,9 +5,11 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<meta name="referrer" content="no-referrer">
<!-- Favicon, App Icon -->
<link rel="icon" type="image/png" sizes="64x64" href="<%= BASE_URL %>/web-icons/favicon-64x64.png">
<link rel="icon" type="image/png" sizes="32x32" href="web-icons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="web-icons/favicon-16x16.png">
<link rel="icon" type="image/png" href="/favicon.ico" />
<link rel="stylesheet" type="text/css" href="/loading-screen.css" />
<!-- Default Page Title -->

Binary file not shown.

After

Width:  |  Height:  |  Size: 794 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@ -147,6 +147,7 @@ const app = express()
.use(ENDPOINTS.statusCheck, (req, res) => {
try {
statusCheck(req.url, async (results) => {
res.setHeader('Content-Type', 'application/json');
await res.end(results);
});
} catch (e) {

View File

@ -5,7 +5,7 @@
const { exec } = require('child_process');
module.exports = () => new Promise((resolve, reject) => {
const buildProcess = exec('npm run build'); // Trigger the build command
const buildProcess = exec('NODE_OPTIONS="--max-old-space-size=512" npm run build'); // Trigger the build command
let output = ''; // Will store console output

View File

@ -155,11 +155,21 @@ export default {
e.preventDefault();
return 'You may have unsaved edits. Are you sure you want to exit the page?';
},
/* Detect and apply theme based on OS preference */
applyThemeBasedOnOSPreference() {
const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
const osTheme = prefersDark ? this.appConfig.nightTheme : this.appConfig.dayTheme;
if (osTheme) {
this.$store.commit(Keys.SET_THEME, osTheme);
this.updateTheme(osTheme);
}
},
},
/* Basic initialization tasks on app load */
async mounted() {
await this.$store.dispatch(Keys.INITIALIZE_CONFIG); // Initialize config before moving on
this.applyLanguage(); // Apply users local language
this.applyThemeBasedOnOSPreference(); // Apply theme based on OS preference
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, '');

View File

@ -1,7 +1,7 @@
{
"home": {
"no-results": "Ingen søkeresultater",
"no-data": "Ingen data konfigurert"
"no-data": "Ingen data tilgjengelig"
},
"search": {
"search-label": "Søk",
@ -43,7 +43,7 @@
"cloud-sync-button": "Aktiver skysynkronisering",
"edit-cloud-sync-button": "Rediger skysynkronisering",
"rebuild-app-button": "Bygg program",
"change-language-button": "Endre appspråk",
"change-language-button": "Endre språk",
"reset-settings-button": "Tilbakestill lokale innstillinger",
"app-info-button": "Appinfo",
"backup-note": "Det anbefales å ta en sikkerhetskopi av konfigurasjonen din før du gjør endringer.",
@ -91,7 +91,7 @@
"unsupported-version-l2": "For den beste opplevelsen og de siste sikkerhetsoppdateringene, vennligst oppdater til"
},
"language-switcher": {
"title": "Endre applikasjonsspråk",
"title": "Endre språk",
"dropdown-label": "Velg et språk",
"save-button": "Lagre",
"success-msg": "Språk oppdatert til"
@ -115,7 +115,7 @@
"valid-label": "Konfigurasjon er gyldig",
"status-success-msg": "Oppgaven fullført",
"status-fail-msg": "Oppgaven mislyktes",
"success-msg-disk": "Konfigurasjonsfil skrevet til disk med hell",
"success-msg-disk": "Konfigurasjonsfil skrevet til disk vellykket",
"success-msg-local": "Lokale endringer er lagret",
"success-note-l1": "Appen bør bygge om automatisk.",
"success-note-l2": "Dette kan ta opptil et minutt.",
@ -131,10 +131,10 @@
"rebuild-note-l1": "En ombygging er nødvendig for at endringer skrevet i conf.yml-filen skal tre i kraft.",
"rebuild-note-l2": "Dette bør skje automatisk, men hvis det ikke har blitt gjort, kan du manuelt utløse det her.",
"rebuild-note-l3": "Dette er ikke nødvendig for endringer som er lagret lokalt.",
"rebuild-button": "Start Build",
"rebuilding-status-1": "Building ...",
"rebuild-button": "Start Bygging",
"rebuilding-status-1": "Bygger ...",
"rebuilding-status-2": "Dette kan ta noen minutter",
"error-permission": "Du har ikke tillatelse til å utløse denne handlingen",
"error-permission": "Du har ikke tillatelse til å utføre denne handlingen",
"success-msg": "Byggingen er fullført",
"fail-msg": "Byggoperasjonen mislyktes",
"reload-note": "En sideinnlasting er nå nødvendig for at endringer skal tre i kraft",

View File

@ -1,50 +1,96 @@
{
"home": {
"no-results": "Нет Результатов Поиска",
"no-data": "Данные не настроены"
"no-results": "Нет результатов",
"no-data": "Данные не настроены",
"no-items-section": "Данные загружаются"
},
"search": {
"search-label": "Поиск",
"search-placeholder": "Начните вводить, чтобы отфильтровать",
"clear-search-tooltip": "Очистить поиск",
"search-placeholder": "Начните вводить фильтр",
"clear-search-tooltip": "Очистить",
"enter-to-search-web": "Нажмите \"Ввод\" для поиска в Интернете"
},
"splash-screen": {
"loading": "Загрузка"
},
"login": {
"title": "Даши",
"title": "Dashy",
"guest-label": "Гостевой доступ",
"username-label": "Имя пользователя",
"password-label": "Пароль",
"login-button": "Авторизоваться",
"remember-me-label": "Помни меня за",
"login-button": "Войти",
"remember-me-label": "Запомнить меня на",
"remember-me-never": "Никогда",
"remember-me-hour": "4 часа",
"remember-me-day": "1 день",
"remember-me-week": "1 неделя",
"remember-me-week": "1 неделю",
"remember-me-long-time": "Надолго",
"error-missing-username": "Отсутствует имя пользователя",
"error-missing-password": "Отсутствует пароль",
"error-incorrect-username": "Пользователь не найден",
"error-incorrect-password": "Неверный пароль",
"success-message": "Вход в систему...",
"logout-message": "Вышли из",
"already-logged-in-title": "Уже вошли в систему",
"logout-message": "Вы вышли из системы",
"already-logged-in-title": "Вы уже вошли в систему",
"already-logged-in-text": "Вы вошли как",
"proceed-to-dashboard": "Перейти на панель управления",
"proceed-to-dashboard": "Перейти к панели управления",
"log-out-button": "Выйти",
"proceed-guest-button": "Продолжить как гость"
"proceed-guest-button": "Продолжить как гость",
"guest-intro-1": "Этот экземпляр приложения имеет гостевой доступ.",
"guest-intro-2": "Гости имеют имеют доступ к панелям управления только для чтения, так что они не могут записать изменения на диск.",
"error": "Ошибка",
"error-no-user-configured": "Аутентификация отключена или не было настроено ни одного пользователя.",
"error-go-home-button": "Домой",
"logged-in-guest": "Вы вошли как гость, переадресация...",
"error-guest-access": "Гостевой доступ запрещён"
},
"app-info": {
"title": "Информация о Приложении",
"error-log": "Журнал Ошибок",
"no-errors": "Ошибок не зафиксировано",
"help-support": "Помощь и Поддержка",
"help-support-description" : "Для получения поддержки в запуске и настройке Dashy, обратитесь за помощью на",
"help-support-discussions": "страницу Discussions",
"support-dashy": "Поддержать Dashy",
"support-dashy-description": "Если вы хотите поддержать проект, пожалуйста посетите страницу",
"support-dashy-link": "Contributions",
"report-bug": "Сообщить об ошибке",
"report-bug-description": "Если вы считаете, что нашли ошибку, пожалуйста",
"report-bug-link": "сообщите о проблеме",
"more-info": "Больше информации",
"source": "Исходный код",
"documentation": "Документация",
"privacy-and-security": "Приватность и Безопасность",
"privacy-and-security-l1": "Для получения подробной информации о том, как Dashy управляет вашими данными, см.",
"privacy-and-security-privacy-policy": "Политика Приватности",
"privacy-and-security-advice": "Для получения рекомендаций по обеспечению безопасности вашей панели управления вы можете обратиться к",
"privacy-and-security-advice-link": "Документации по Управлению",
"privacy-and-security-security-issue": "Если вы обнаружили потенциальную проблему безопасности, сообщите о ней, в соответствии с нашей",
"privacy-and-security-security-policy": "Политикой Безопасности",
"license": "Лицензия",
"license-under": "Лицензировано под",
"licence-third-party": "Лицензии на модули сторонних производителей см.",
"licence-third-party-link": "Legal",
"list-contributors": "Чтобы посмотреть полный список авторов и благодарностей, см.",
"list-contributors-link": "Credits",
"version": "Версия"
},
"config": {
"main-tab": "Главное меню",
"view-config-tab": "Просмотр конфигурации",
"view-config-tab": осмотреть конфигурацию",
"edit-config-tab": "Изменить конфигурацию",
"custom-css-tab": "Пользовательские стили",
"custom-css-tab": "Пользовательский CSS",
"heading": "Варианты конфигурации",
"download-config-button": "Скачать конфигурацию",
"edit-config-button": "Изменить конфигурацию",
"edit-css-button": "Редактировать собственный CSS",
"edit-css-button": "Редактировать пользовательский CSS",
"cloud-sync-button": "Включить облачную синхронизацию",
"edit-cloud-sync-button": "Изменить Cloud Sync",
"rebuild-app-button": "Восстановить приложение",
"change-language-button": "Изменить язык приложения",
"edit-cloud-sync-button": "Изменить облачную синхронизацию",
"rebuild-app-button": "Пересобрать приложение",
"change-language-button": "Выбрать язык",
"reset-settings-button": "Сбросить локальные настройки",
"disabled-note": "Некоторые пункты конфигурации были отключены вашим администратором",
"small-screen-note": "Вы используете слишком маленький дисплей, некоторые страницы могут не быть оптимальны",
"app-info-button": "Информация о приложении",
"backup-note": "Перед внесением изменений рекомендуется сделать резервную копию вашей конфигурации.",
"reset-config-msg-l1": "Это удалит все пользовательские настройки из локального хранилища, но не повлияет на ваш файл conf.yml.",
@ -52,69 +98,77 @@
"reset-config-msg-l3": "Вы уверены, что хотите продолжить?",
"data-cleared-msg": "Данные успешно очищены",
"actions-label": "Действия",
"copy-config-label": "Копировать конфигурацию",
"copy-config-label": "Скопировать конфигурацию",
"data-copied-msg": "Конфиг скопирован в буфер обмена",
"reset-config-label": "Сбросить конфигурацию",
"css-save-btn": "Сохранить изменения",
"css-note-label": "Примечание",
"css-note-l1": "Вам нужно будет обновить страницу, чтобы изменения вступили в силу.",
"css-note-l2": "Переопределения стилей хранятся только локально, поэтому рекомендуется сделать копию вашего CSS.",
"css-note-l3": "Чтобы удалить все пользовательские стили, удалите содержимое и нажмите «Сохранить изменения»."
"css-note-l3": "Чтобы удалить все пользовательские стили, удалите содержимое и нажмите «Сохранить изменения».",
"custom-css": {
"title": "Пользовательский CSS",
"base-theme": "Базовая Тема"
}
},
"alternate-views": {
"alternate-view-heading": "Переключить вид",
"default": "Дефолт",
"default": "По умолчанию",
"workspace": "Рабочая среда",
"minimal": "Минимальный"
},
"settings": {
"theme-label": "Тема",
"layout-label": "Макет",
"layout-label": "Сетка",
"layout-auto": "Авто",
"layout-horizontal": "По горизонтали",
"layout-vertical": "Вертикальный",
"layout-horizontal": "Горизонтальная",
"layout-vertical": "Вертикальная",
"item-size-label": "Размер элемента",
"item-size-small": "Небольшой",
"item-size-medium": "Середина",
"item-size-small": "Маленький",
"item-size-medium": "Средний",
"item-size-large": "Большой",
"config-launcher-label": "Конфиг",
"config-launcher-tooltip": "Обновить конфигурацию",
"config-launcher-label": "Конфигурация",
"config-launcher-tooltip": "Редактировать конфигурацию",
"sign-out-tooltip": "Выход",
"sign-in-tooltip": "Авторизоваться",
"sign-in-welcome": "Здравствуйте, {username}!"
"sign-in-welcome": "Здравствуйте, {username}!",
"hide": "Скрыть",
"open": "Открыть"
},
"updates": {
"app-version-note": "Даши версия",
"up-to-date": "Своевременно",
"app-version-note": "Dashy версия",
"up-to-date": "Последняя версия",
"out-of-date": "Доступно обновление",
"unsupported-version-l1": "Вы используете неподдерживаемую версию Dashy",
"unsupported-version-l2": "Для оптимальной работы и получения последних исправлений безопасности, пожалуйста, обновите до"
"unsupported-version-l2": "Для оптимальной работы и получения последних исправлений безопасности, пожалуйста, обновите приложение до версии"
},
"language-switcher": {
"title": "Изменить язык приложения",
"title": "Выбрать язык приложения",
"dropdown-label": "Выберите язык",
"save-button": "Сохранить",
"success-msg": "Язык обновлен до"
"success-msg": "Выбран язык: "
},
"theme-maker": {
"title": "Конфигуратор темы",
"export-button": "Экспорт пользовательских переменных",
"reset-button": "Сбросить стили для",
"reset-button": "Сбросить стили для темы",
"show-all-button": "Показать все переменные",
"change-fonts-button": "Выбрать шрифты",
"save-button": "Сохранить",
"cancel-button": "Отмена",
"saved-toast": "{theme} Обновлено успешно",
"copied-toast": "Данные темы для {theme} скопированы в буфер обмена",
"reset-toast": "Пользовательские цвета для {theme} удалены"
"saved-toast": "Тема {theme} успешно обновлена",
"copied-toast": "Данные для темы {theme} скопированы в буфер обмена",
"reset-toast": "Пользовательские цвета для темы {theme} удалены"
},
"config-editor": {
"save-location-label": "Сохранить местоположение",
"location-local-label": "Применять локально",
"location-disk-label": "Запись изменений в файл конфигурации",
"save-location-label": "Место сохранения",
"location-local-label": "Применить локально",
"location-disk-label": "Записать изменения в файл конфигурации на диск",
"save-button": "Сохранить изменения",
"valid-label": "Конфигурация действительна",
"preview-button": "Предпросмотр",
"valid-label": "Конфигурация верна",
"status-success-msg": "Задача завершена",
"status-fail-msg": "Сбой задачи",
"status-fail-msg": "Задача была провалена",
"success-msg-disk": "Файл конфигурации успешно записан на диск",
"success-msg-local": "Локальные изменения успешно сохранены",
"success-note-l1": "Приложение должно перестроиться автоматически.",
@ -123,38 +177,39 @@
"error-msg-save-mode": "Пожалуйста, выберите режим сохранения: локальный или файл",
"error-msg-cannot-save": "Произошла ошибка при сохранении конфигурации",
"error-msg-bad-json": "Ошибка в JSON, возможно, неверный формат",
"warning-msg-validation": "Предупреждение о проверке",
"warning-msg-validation": "Предупреждение валидатора",
"not-admin-note": "Вы не можете записать измененные на диск, потому что вы не вошли в систему как администратор"
},
"app-rebuild": {
"title": "Восстановить приложение",
"rebuild-note-l1": "Чтобы изменения, записанные в файл conf.yml, вступили в силу, требуется перестройка.",
"rebuild-note-l2": "Это должно произойти автоматически, но если этого не произошло, вы можете запустить это вручную здесь.",
"rebuild-note-l3": "Это не требуется для изменений, хранящихся локально.",
"title": "Пересобрать приложение",
"rebuild-note-l1": "Чтобы изменения, записанные в файл conf.yml, вступили в силу, требуется пересборка.",
"rebuild-note-l2": "Это должно произойти автоматически, но если этого не произошло, вы можете запустить её вручную здесь.",
"rebuild-note-l3": "Заметьте, что эта функция доступна только для экземпляров приложения, которые запущены с помощью Node или Docker, но не для тех, которые запущенны статично",
"rebuild-button": "Начать сборку",
"rebuilding-status-1": "Строительство...",
"rebuilding-status-1": "Сборка...",
"rebuilding-status-2": "Это может занять несколько минут",
"error-permission": "У вас нет разрешения запускать это действие",
"error-permission": "У вас нет разрешения на запуск этого действия",
"success-msg": "Сборка успешно завершена",
"fail-msg": "Не удалось выполнить операцию сборки",
"reload-note": "Теперь требуется перезагрузка страницы, чтобы изменения вступили в силу.",
"reload-note": "Теперь нужно перезагрузить страницу, чтобы изменения вступили в силу.",
"reload-button": "Перезагрузить страницу"
},
"cloud-sync": {
"title": "Резервное копирование и восстановление в облаке",
"intro-l1": "Резервное копирование и восстановление в облако - это дополнительная функция, которая позволяет вам загрузить свою конфигурацию в Интернет, а затем восстановить ее на любом другом устройстве или экземпляре Dashy.",
"intro-l2": "Все данные полностью зашифрованы с помощью AES с использованием вашего пароля в качестве ключа.",
"title": "Облачная конфигурация",
"intro-l1": "Облачная конфигурация - это дополнительная функция, которая позволяет вам загрузить свою конфигурацию в Интернет, а затем восстановить ее на любом другом устройстве или экземпляре Dashy.",
"intro-l2": "Все данные полностью зашифрованы с помощью сквозного шифрования, используя AES и ваш пароль в качестве ключа.",
"intro-l3": "Для получения дополнительной информации см.",
"backup-title-setup": "Сделать резервную копию",
"intro-docs": "документацию",
"backup-title-setup": "Создать резервную копию",
"backup-title-update": "Обновить резервную копию",
"password-label-setup": "Выберите пароль",
"password-label-update": "Введите ваш пароль",
"backup-button-setup": "Резервное копирование",
"backup-button-setup": "Создать резервную копию",
"backup-button-update": "Обновить резервную копию",
"backup-id-label": "Ваш резервный идентификатор",
"backup-id-note": "Это используется для восстановления из резервных копий позже. Так что храните его вместе со своим паролем в надежном месте.",
"backup-id-note": "Он используется для восстановления из резервных копий позже. Так что сохраните его вместе со своим паролем в надежном месте.",
"restore-title": "Восстановить резервную копию",
"restore-id-label": "Восстановить ID",
"restore-id-label": "Восстановить резервный идентификатор",
"restore-password-label": "Пароль",
"restore-button": "Восстановить",
"backup-missing-password": "Отсутствует пароль",
@ -164,9 +219,167 @@
"restore-success-msg": "Конфигурация успешно восстановлена"
},
"menu": {
"sametab": "Открыть в текущей вкладке",
"newtab": "Открыть в новой вкладке",
"modal": "Открыть в модальном всплывающем окне",
"workspace": "Открыть в представлении рабочей области"
"open-section-title": "Открыть в",
"sametab": "Текущей вкладке",
"newtab": "Новой вкладке",
"modal": "Всплывающем окне",
"workspace": "Рабочей области",
"options-section-title": "Настройки",
"edit-item": "Редактировать",
"move-item": "Скопировать или переместить",
"remove-item": "Удалить"
},
"context-menus": {
"item": {
"open-section-title": "Открыть в",
"sametab": "Текущей вкладке",
"newtab": "Новой вкладке",
"modal": "Всплывающем окне",
"workspace": "Рабочей области",
"clipboard": "Копировать в буфер обмена",
"options-section-title": "Настройки",
"edit-item": "Редактировать",
"move-item": "Скопировать или переместить",
"remove-item": "Удалить",
"copied-toast": "Ссылка была скопирована в буфер обмена"
},
"section": {
"open-section": "Открыть секцию",
"edit-section": "Редактировать",
"expand-collapse": "Раскрыть / Свернуть",
"move-section": "Переместить в",
"remove-section": "Удалить"
}
},
"footer": {
"dev-by": "Разработано ",
"licensed-under": "Лицензировано под",
"get-the": "Получите",
"source-code": "Исходный код"
},
"interactive-editor": {
"menu": {
"start-editing-tooltip": "Войти в режим редактирования",
"edit-site-data-subheading": "Редактировать параметры сайта",
"edit-page-info-btn": "Редактировать страницу",
"edit-page-info-tooltip": "Заголовок приложения, описание, ссылки, текст снизу страницы и т. д.",
"edit-app-config-btn": "Редактировать конфигурацию",
"edit-app-config-tooltip": "Конфигурация всего остального приложения",
"edit-pages-btn": "Редактировать страницы",
"edit-pages-tooltip": "Добавить или удалить дополнительные страницы панели управления",
"config-save-methods-subheading": "Сохранить конфигурацию",
"save-locally-btn": "Локально",
"save-locally-tooltip": "Сохранить конфигурацию локально, в хранилище браузера. Это не повлияет на ваш конфигурационный файл на диске, но изменения останутся на этом устройстве",
"save-disk-btn": "На диск",
"save-disk-tooltip": "Сначала создастся резервная копия текущей конфигурации, а затем она перезапишется новой версией",
"export-config-btn": "Экспорт конфигурации",
"export-config-tooltip": "Просмотреть и экспортировать новую конфигурацию, либо как файл, либо в буфер обмена",
"cloud-backup-btn": "Облачное сохранение",
"cloud-backup-tooltip": "Сохранить зашифрованный файл конфигурации в облачное хранилище",
"edit-raw-config-btn": "Редактировать JSON конфигурации",
"edit-raw-config-tooltip": "Просмотреть и редактировать файл конфигурации напрямую, через редактор JSON",
"cancel-changes-btn": "Сбросить изменения",
"cancel-changes-tooltip": "Сбросить текущие изменения и выйти из режима редактирования. Это не изменит сохранённую конфигурацию",
"edit-mode-name": "Режим редактирования",
"edit-mode-subtitle": "Вы находитесь в режиме редактирования",
"edit-mode-description": "Это означает, что вы сможете делать изменения вашей конфигурации и просматривать их результат, но они не вступят в силу, пока вы не сохраните их",
"save-stage-btn": "Сохранить",
"cancel-stage-btn": "Отмена",
"save-locally-warning": "Если вы продолжите, изменения будут сохранены только в вашем браузере. Чтобы использовать новую конфигурацию на других устройствах, экспортируйте её. Продолжить?"
},
"edit-item": {
"missing-title-err": "Отсутствует заголовок элемента"
},
"edit-section": {
"edit-section-title": "Редактировать секцию",
"add-section-title": "Добавить новую секцию",
"edit-tooltip": "Нажмите ЛКМ, чтобы редактировать или ПКМ для дополнительных опций",
"remove-confirm": "Вы уверены, что хотите удалить эту секцию? Это действие можно отменить позже"
},
"edit-app-config": {
"warning-msg-title": "Продолжайте с осторожностью",
"warning-msg-l1": "Следующие настройки предназначены для продвинутой настройки приложения.",
"warning-msg-l2": "Если вы сомневаетесь в том, что значит то или иное поле, пожалуйста ознакомьтесь с",
"warning-msg-docs": "документацией",
"warning-msg-l3": "для избежания непредвиденных последствий."
},
"export": {
"export-title": "Экспорт конфигурации",
"copy-clipboard-btn": "Скопировано в буфер обмена",
"copy-clipboard-tooltip": "Скопировать всю конфигурацию приложения, в формате YAML",
"download-file-btn": "Скачать как файл",
"download-file-tooltip": "Скачать файл конфигурации на ваше устройство в формате YAML",
"view-title": "Просмотреть конфигурацию"
}
},
"critical-error": {
"title": "Ошибка загрузки конфигурации",
"subtitle": "Приложение не смогло загрузиться из-за ошибки в конфигурации.",
"sub-ensure-that": "Удостоверьтесь, что",
"sub-error-details": "Сведения об ошибке",
"sub-next-steps": "Следующие шаги",
"ignore-button": "Игнорировать критические ошибки"
},
"widgets": {
"general": {
"loading": "Загрузка...",
"show-more": "Развернуть сведения",
"cpu-details": "Сведения о ЦПУ",
"mem-details": "Сведения о памяти",
"show-less": "Показать меньше",
"open-link": "Продолжить чтение"
},
"pi-hole": {
"status-heading": "Статус"
},
"stat-ping": {
"up": "Онлайн",
"down": "Оффлайн"
},
"net-data": {
"cpu-chart-title": "История ЦПУ",
"mem-chart-title": "Использование памяти",
"mem-breakdown-title": "Подробности об использовании памяти",
"load-chart-title": "Нагрузка системы"
},
"glances": {
"disk-space-free": "Свободно",
"disk-space-used": "Использовано",
"disk-mount-point": "Путь монитрования",
"disk-file-system": "Файловая система",
"disk-io-read": "Чтение",
"disk-io-write": "Запись",
"system-load-desc": "Количество процессов, ожидающих в очереди запуска, усреднённое между всеми ядрами процессора"
},
"system-info": {
"uptime": "Время работы"
},
"flight-data": {
"arrivals": "Прибытия",
"departures": "Отправления"
},
"tfl-status": {
"good-service-all": "Хорошее обслуживание на всех линиях",
"good-service-rest": "Хорошее обслуживание на всех остальных линиях"
},
"synology-download": {
"download": "Скачивание",
"upload": "Загрузка",
"downloaded": "Скачано",
"uploaded": "Загружено",
"remaining": "Остаётся",
"up": "Вверх",
"down": "Вниз"
},
"gluetun-status": {
"vpn-ip": "VPN IP",
"country": "Страна",
"region": "Регион",
"city": "Город",
"post-code": "Индекс",
"location": "Местоположение",
"timezone": "Часовой пояс",
"organization": "Организация"
}
}
}

View File

@ -10,6 +10,9 @@
"clear-search-tooltip":"Rensa sök",
"enter-to-search-web":"Tryck på retur för att söka på webben"
},
"splash-screen": {
"loading": "Laddar"
},
"login":{
"title":"Dashy",
"username-label":"Användarnamn",
@ -83,7 +86,9 @@
"config-launcher-tooltip":"Uppdatera konfiguration",
"sign-out-tooltip":"Logga ut",
"sign-in-tooltip":"Logga in",
"sign-in-welcome":"Hej {username}!"
"sign-in-welcome":"Hej {username}!",
"hide": "Göm",
"open": "Öppna"
},
"updates":{
"app-version-note":"Dashy-version",
@ -185,14 +190,17 @@
"newtab":"Ny flik",
"modal":"Pop-Up Modal",
"workspace":"Workspace View",
"clipboard": "Kopiera till urklipp",
"options-section-title":"Alternativ",
"edit-item":"Redigera",
"move-item":"Kopiera eller flytta",
"remove-item":"Ta bort"
"remove-item":"Ta bort",
"copied-toast": "URLen har blivit kopierad till urklipp"
},
"section":{
"open-section":"Öppna sektion",
"edit-section":"Redigera",
"expand-collapse": "Expandera / Minimera",
"move-section":"Flytta till",
"remove-section":"Ta bort"
}
@ -205,6 +213,8 @@
"edit-page-info-tooltip":"Appnamn, beskrivning, navigeringslänkar, sidfotstext, etc",
"edit-app-config-btn":"Redigera appkonfiguration",
"edit-app-config-tooltip":"Övriga appkonfigurationsalternativ",
"edit-pages-btn": "Editera sidor",
"edit-pages-tooltip": "Lägg till eller ta bort ytterligare vyer",
"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",
@ -269,6 +279,15 @@
"mem-breakdown-title":"Memory Breakdown",
"load-chart-title":"System Load"
},
"glances": {
"disk-space-free": "Ledigt",
"disk-space-used": "Utnyttjat",
"disk-mount-point": "Mount Point",
"disk-file-system": "Filsystem",
"disk-io-read": "Läs",
"disk-io-write": "Skriv",
"system-load-desc": "Antal processer som väntar i run-queue, i genomsnitt över alla kärnor"
},
"system-info":{
"uptime":"Uptime"
},
@ -279,6 +298,87 @@
"tfl-status":{
"good-service-all":"God service på alla linjer",
"good-service-rest":"God Service på övriga linjer"
},
"gluetun-status": {
"vpn-ip": "VPN IP",
"country": "Land",
"region": "Region",
"city": "Stad",
"post-code": "Postnummer",
"location": "Plats",
"timezone": "Tidszon",
"organization": "Organisation"
},
"nextcloud": {
"active": "aktiv",
"and": "och",
"applications": "applikationer",
"available": "Tillgänglig",
"away": "Borta",
"cache-full": "CACHE FULL",
"chat-room": "chattrum",
"delete-all": "Ta bort alla",
"delete-notification": "Ta bort notifikationer",
"disabled": "Inaktiverad",
"disk-quota": "Disk Quota",
"disk-space": "Diskutrymme",
"dnd": "Stör ej",
"email": "mejl",
"enabled": "aktiverad",
"federated-shares-ucfirst": "Federated shares",
"federated-shares": "federated shares",
"files": "file{plural}",
"free": "ledig",
"groups": "grupper",
"hit-rate": "hit rate",
"hits": "hits",
"home": "hem",
"in": "in",
"keys": "nycklar",
"last-24-hours": "senaste 24 timmarna",
"last-5-minutes": "under de senaste 5 minuterna",
"last-hour": "under den senaste timmen",
"last-login": "Senaste inlogg",
"last-restart": "Senaste omstart",
"load-averages": "Genomsnittlig belastning över alla CPU kärnor",
"local-shares": "Local shares",
"local": "local",
"max-keys": "maximalt antal nycklar",
"memory-used": "memory used",
"memory-utilisation": "memory utilization",
"memory": "minne",
"misses": "misses",
"no-notifications": "Inga notifieringar",
"no-pending-updates": "Inga avvacktande uppdateringar",
"nothing-to-show": "Inget att visa för tillfället",
"of-which": "av vilket",
"of": "av",
"offline": "Offline",
"online": "Online",
"other": "other",
"overall": "Totalt",
"private-link": "privat länk",
"public-link": "publik länk",
"quota-enabled": "Disk Quota är {not}aktiverat för denna användare",
"received": "mottaget",
"scripts": "skript",
"sent": "skickat",
"started": "Startat",
"storages-by-type": "Lagring efter typ",
"storages": "lagring{plural}",
"strings-use": "strings use",
"tasks": "Uppgifter",
"total-files": "totalt antal filer",
"total-users": "totalt antal användare",
"total": "totalt",
"until": "Tills",
"updates-available-for": "Uppdateringar är tillgängliga för",
"updates-available": "uppdatering{plural} tillgänglig",
"used": "använt",
"user": "användare",
"using": "använder",
"version": "version",
"wasted": "onödig"
}
}
}

View File

@ -1,446 +0,0 @@
{
"home": {
"no-results": "Немає результатів пошуку",
"no-data": "Дані не налаштовано",
"no-items-section": "Поки що немає елементів для показу"
},
"search": {
"search-label": "Пошук",
"search-placeholder": "Почніть друкувати для фільтрування",
"clear-search-tooltip": "Очистити пошук",
"enter-to-search-web": "Натисніть enter для пошуку в Інтернеті"
},
"splash-screen": {
"loading": "Завантаження"
},
"login": {
"title": "Dashy",
"guest-label": "Гостьовий доступ",
"username-label": "Ім'я користувача",
"password-label": "Пароль",
"login-button": "Увійти",
"remember-me-label": "Запам'ятати мене для",
"remember-me-never": "Ніколи не запамʼятовувати",
"remember-me-hour": "4 години",
"remember-me-day": "1 день",
"remember-me-week": "1 тиждень",
"remember-me-long-time": "Довгий час",
"error-missing-username": "Відсутнє ім'я користувача",
"error-missing-password": "Відсутній пароль",
"error-incorrect-username": "Користувача не знайдено",
"error-incorrect-password": "Неправильний пароль",
"success-message": "Вхід...",
"logout-message": "Вихід",
"already-logged-in-title": "Вхід вже виконано",
"already-logged-in-text": "Ви ввійшли як",
"proceed-to-dashboard": "Перейти до інформаційної панелі",
"log-out-button": "Вийти",
"proceed-guest-button": "Продовжити як гість",
"guest-intro-1": "Цей інстанс має гостьовий доступ.",
"guest-intro-2": "Гості мають доступ лише для перегляду до інформаційних панелей, тому не можуть записати жодних змін на диск.",
"error": "Помилка",
"error-no-user-configured": "Автентифікацію не ввімкнено, або користувачі не налаштовані",
"error-go-home-button": "Повернутися додому",
"logged-in-guest": "Увійшли як гість, переспрямування...",
"error-guest-access": "Гостьовий доступ заборонено"
},
"app-info": {
"title": "Інформація про програму",
"error-log": "Журнал помилок",
"no-errors": "Останніх помилок не виявлено",
"help-support": "Допомога та підтримка",
"help-support-description": "Щоб отримати підтримку щодо запуску чи налаштування Dashy, див.",
"help-support-discussions": "Обговорення",
"support-dashy": "Підтримка Dashy",
"support-dashy-description": "Щоб дізнатися, як ви можете взяти участь, перегляньте",
"support-dashy-link": "Сторінка внесків",
"report-bug": "Повідомити про помилку",
"report-bug-description": "Якщо ви вважаєте, що знайшли помилку, будь ласка",
"report-bug-link": "повідомте про проблему",
"more-info": "Докладніше",
"source": "Джерело",
"documentation": "Документація",
"privacy-and-security": "Конфіденційність та безпека",
"privacy-and-security-l1": "Для детальної інформації про те, як Dashy керує вашими даними, див.",
"privacy-and-security-privacy-policy": "Політика конфіденційності",
"privacy-and-security-advice": "Щоб отримати поради щодо захисту вашої інформаційної панелі, ви можете звернутися до розділу",
"privacy-and-security-advice-link": "Документи керування",
"privacy-and-security-security-issue": "Якщо ви виявили потенційну проблему з безпекою, повідомте про це до розділу",
"privacy-and-security-security-policy": "Політика безпеки",
"license": "Ліцензія",
"license-under": "Ліцензія згідно",
"licence-third-party": "Ліцензії на сторонні модулі див.",
"licence-third-party-link": "Юридична інформація",
"list-contributors": "Повний список співавторів та подяки див.",
"list-contributors-link": "Кредити",
"version": "Версія"
},
"config": {
"main-tab": "Головне меню",
"view-config-tab": "Переглянути конфігурацію",
"edit-config-tab": "Редагувати конфігурацію",
"custom-css-tab": "Власні стилі",
"heading": "Параметри конфігурації",
"download-config-button": "Переглянути / Експортувати конфігурацію",
"edit-config-button": "Редагувати конфігурацію",
"edit-css-button": "Редагувати власний CSS",
"cloud-sync-button": "Увімкнути хмарну синхронізацію",
"edit-cloud-sync-button": "Редагувати хмарну синхронізацію",
"rebuild-app-button": "Перебудувати програму",
"change-language-button": "Змінити мову програми",
"reset-settings-button": "Скинути локальні налаштування",
"disabled-note": "Деякі функції конфігурації були відключені вашим адміністратором",
"small-screen-note": "Ви використовуєте дуже маленький екран, і деякі екрани в цьому меню можуть бути не найкращими",
"app-info-button": "Інформація про програму",
"backup-note": "Рекомендовано зробити резервну копію конфігурації перед внесенням змін.",
"reset-config-msg-l1": "Це видалить усі налаштування користувача з локального сховища, але не вплине на ваш файл 'conf.yml'.",
"reset-config-msg-l2": "Ви повинні спочатку створити резервну копію будь-яких змін, які ви внесли локально, якщо ви хочете використовувати їх у майбутньому.",
"reset-config-msg-l3": "Ви впевнені, що бажаєте продовжити?",
"data-cleared-msg": "Дані успішно видалено",
"actions-label": "Дії",
"copy-config-label": "Копіювати конфігурацію",
"data-copied-msg": "Конфігурацію скопійовано до буфера обміну",
"reset-config-label": "Скинути конфігурацію",
"css-save-btn": "Зберегти зміни",
"css-note-label": "Примітка",
"css-note-l1": "Вам потрібно буде оновити сторінку, щоб ваші зміни набули чинності.",
"css-note-l2": "Заміни стилів зберігаються лише локально, тому рекомендується зробити копію вашого CSS.",
"css-note-l3": "Щоб видалити всі спеціальні стилі, видаліть вміст та натисніть Зберегти зміни",
"custom-css": {
"title": "Власні стилі",
"base-theme": "Базова тема"
}
},
"alternate-views": {
"alternate-view-heading": "Змінити перегляд",
"default": "За замовчуванням",
"workspace": "Робоча область",
"minimal": "Мінімальний"
},
"settings": {
"theme-label": "Тема",
"layout-label": "Макет",
"layout-auto": "Авто",
"layout-horizontal": "Горизонтально",
"layout-vertical": "Вертикально",
"item-size-label": "Розмір",
"item-size-small": "Маленький",
"item-size-medium": "Середній",
"item-size-large": "Великий",
"config-launcher-label": "Конфіг",
"config-launcher-tooltip": "Оновити конфігурацію",
"sign-out-tooltip": "Вийти",
"sign-in-tooltip": "Увійти",
"sign-in-welcome": "Привіт {username}!",
"hide": "Приховати",
"open": "Відкрити"
},
"updates": {
"app-version-note": "Версія Dashy",
"up-to-date": "Оновити",
"out-of-date": "Оновлення доступне",
"unsupported-version-l1": "Ви використовуєте непідтримувану версію Dashy",
"unsupported-version-l2": "Для найкращого досвіду та останніх виправлень безпеки, будь ласка, оновіться"
},
"language-switcher": {
"title": "Змінити мову програми",
"dropdown-label": "Оберіть мову",
"save-button": "Зберегти",
"success-msg": "Мову оновлено"
},
"theme-maker": {
"title": "Конфігуратор теми",
"export-button": "Експорт змінних користувача",
"reset-button": "Скинути стилі",
"show-all-button": "Показати всі змінні",
"change-fonts-button": "Змінити шрифти",
"save-button": "Зберегти",
"cancel-button": "Скасувати",
"saved-toast": "{theme} успішно оновлена",
"copied-toast": "Дані теми для {theme} скопійовано в буфер обміну",
"reset-toast": "Кольори користувача для {theme} видалено"
},
"config-editor": {
"save-location-label": "Зберегти розташування",
"location-local-label": "Застосувати локально",
"location-disk-label": "Записати зміни до файлу конфігурації",
"save-button": "Зберегти зміни",
"preview-button": "Попередній перегляд змін",
"valid-label": "Конфігурація дійсна",
"status-success-msg": "Завдання виконано",
"status-fail-msg": "Завдання не виконано",
"success-msg-disk": "Файл конфігурації успішно записаний на диск",
"success-msg-local": "Локальні зміни успішно збережено",
"success-note-l1": "Програма повинна автоматично перебудуватися.",
"success-note-l2": "Це може зайняти до хвилини.",
"success-note-l3": "Вам потрібно буде оновити сторінку, щоб зміни набули чинності.",
"error-msg-save-mode": "Будь ласка, виберіть режим збереження: локальний або файловий",
"error-msg-cannot-save": "Під час збереження конфігурації сталася помилка",
"error-msg-bad-json": "Помилка в JSON, можливо, неправильний формат",
"warning-msg-validation": "Попередження про перевірку",
"not-admin-note": "Ви не можете записати зміни на диск, оскільки ви не увійшли як адміністратор"
},
"app-rebuild": {
"title": "Перебудувати програму",
"rebuild-note-l1": "Перебудова потрібна, щоб зміни, записані у файл conf.yml, набули чинності.",
"rebuild-note-l2": "Це має статися автоматично, але якщо цього не сталося, ви можете запустити це звідси вручну.",
"rebuild-note-l3": "Це не потрібно для змін, які зберігаються локально.",
"rebuild-button": "Почати збірку",
"rebuilding-status-1": "Збираємо...",
"rebuilding-status-2": "Це може зайняти кілька хвилин",
"error-permission": "У вас немає дозволу ініціювати цю дію",
"success-msg": "Збірку завершено успішно",
"fail-msg": "Помилка операції збирання",
"reload-note": "Тепер потрібно перезавантажити сторінку, щоб зміни набули чинності",
"reload-button": "Перезавантажити сторінку"
},
"cloud-sync": {
"title": "Резервне копіювання та відновлення в хмарі",
"intro-l1": "Резервне копіювання та відновлення в хмарі є додатковою функцією, яка дає змогу завантажити вашу конфігурацію в Інтернет, а потім відновити її на будь-якому іншому пристрої чи екземплярі Dashy.",
"intro-l2": "Усі дані повністю зашифровані за допомогою AES із використанням вашого пароля як ключа.",
"intro-l3": "Для отримання додаткової інформації див.",
"intro-docs": "документи",
"backup-title-setup": "Створити резервну копію",
"backup-title-update": "Оновити резервну копію",
"password-label-setup": "Оберіть пароль",
"password-label-update": "Введіть свій пароль",
"backup-button-setup": "Резервна копія",
"backup-button-update": "Оновити резервну копію",
"backup-id-label": "Ваш ID резервної копії",
"backup-id-note": "Це використовується для відновлення з резервних копій пізніше. Тож має зберігатися разом із паролем у безпечному місці.",
"restore-title": "Відновити резервну копію",
"restore-id-label": "Відновити ID",
"restore-password-label": "Пароль",
"restore-button": "Відновити",
"backup-missing-password": "Відсутній пароль",
"backup-error-unknown": "Неможливо обробити запит",
"backup-error-password": "Неправильний пароль. Будь ласка введіть поточний пароль.",
"backup-success-msg": "Успішно завершено",
"restore-success-msg": "Конфігурацію успішно відновлено"
},
"menu": {
"open-section-title": "Відкрити в",
"sametab": "Поточна вкладка",
"newtab": "Нова вкладка",
"modal": "Модальне спливаюче вікно",
"workspace": "Перегляд робочої області",
"options-section-title": "Параметри",
"edit-item": "Редагувати",
"move-item": "Копіювати або перемістити",
"remove-item": "Видалити"
},
"context-menus": {
"item": {
"open-section-title": "Відкрити в",
"sametab": "Поточна вкладка",
"newtab": "Нова вкладка",
"modal": "Модальне спливаюче вікно",
"workspace": "Перегляд робочої області",
"clipboard": "Копіювати до буфера обміну",
"options-section-title": "Параметри",
"edit-item": "Редагувати",
"move-item": "Копіювати або перемістити",
"remove-item": "Видалити",
"copied-toast": "URL скопійовано до буфера обміну"
},
"section": {
"open-section": "Відкрити розділ",
"edit-section": "Редагувати",
"expand-collapse": "Розгорнути / Згорнути",
"move-section": "Перемістити до",
"remove-section": "Видалити"
}
},
"footer": {
"dev-by": "Розроблено",
"licensed-under": "Ліцензія згідно",
"get-the": "Отримати",
"source-code": "вихідний код"
},
"interactive-editor": {
"menu": {
"start-editing-tooltip": "Увійти в інтерактивний редактор",
"edit-site-data-subheading": "Редагувати дані сайту",
"edit-page-info-btn": "Редагувати інформацію про сторінку",
"edit-page-info-tooltip": "Назва програми, опис, навігаційні посилання, текст нижнього колонтитула тощо",
"edit-app-config-btn": "Редагувати конфігурацію програми",
"edit-app-config-tooltip": "Усі інші параметри конфігурації програми",
"edit-pages-btn": "Редагувати сторінки",
"edit-pages-tooltip": "Додати або видалити додаткові перегляди",
"config-save-methods-subheading": "Параметри збереження конфігурації",
"save-locally-btn": "Зберегти локально",
"save-locally-tooltip": "Зберегти конфігурацію локально у сховище браузера. Це не вплине на файл конфігурації, але зміни буде збережено лише на цьому пристрої",
"save-disk-btn": "Зберегти на диск",
"save-disk-tooltip": "Збережіть конфігурацію у файл conf.yml на диску. Це створить резервну копію, а потім перезапише існуючу конфігурацію",
"export-config-btn": "Експорт конфігурації",
"export-config-tooltip": "Переглянути та експортувати нову конфігурацію у файл або в буфер обміну",
"cloud-backup-btn": "Резервне копіювання у хмару",
"cloud-backup-tooltip": "Зберегти зашифровану резервну копію конфігурації у хмару",
"edit-raw-config-btn": "Редагувати необроблену конфігурацію",
"edit-raw-config-tooltip": "Переглянути та змінити необроблену конфігурацію за допомогою редактора JSON",
"cancel-changes-btn": "Скасувати редагування",
"cancel-changes-tooltip": "Скинути поточні зміни та вийти з режиму редагування. Це не вплине на вашу збережену конфігурацію",
"edit-mode-name": "Режим редагування",
"edit-mode-subtitle": "Ви перебуваєте в режимі редагування",
"edit-mode-description": "Це означає, що ви можете вносити зміни до конфігурації та переглядати результати, але поки ви не оберете збереження, жодні ваші зміни не будуть записані.",
"save-stage-btn": "Зберегти",
"cancel-stage-btn": "Скасувати",
"save-locally-warning": "Якщо ви продовжите, зміни буде збережено лише у вашому браузері. Вам слід експортувати копію вашої конфігурації для використання на інших машинах. Бажаєте продовжити?"
},
"edit-item": {
"missing-title-err": "Потрібна назва елемента"
},
"edit-section": {
"edit-section-title": "Редагувати розділ",
"add-section-title": "Додати новий розділ",
"edit-tooltip": "Натисніть, щоб редагувати, або клацніть правою кнопкою миші, щоб отримати додаткові параметри",
"remove-confirm": "Ви впевнені, що хочете видалити цей розділ? Цю дію можна скасувати пізніше."
},
"edit-app-config": {
"warning-msg-title": "Дійте з обережністю",
"warning-msg-l1": "Ці параметри призначені для розширеної конфігурації програми.",
"warning-msg-l2": "Якщо ви не впевнені щодо будь-якого значення, зверніться до",
"warning-msg-docs": "Документація",
"warning-msg-l3": ", щоб уникнути небажаних наслідків."
},
"export": {
"export-title": "Експорт конфігурації",
"copy-clipboard-btn": "Копіювати до буфера обміну",
"copy-clipboard-tooltip": "Скопіювати всі конфігурації програми до системного буфера обміну у форматі YAML",
"download-file-btn": "Завантажити як файл",
"download-file-tooltip": "Завантажте всю конфігурацію програми на свій пристрій у файлі YAML",
"view-title": "Переглянути конфігурацію"
}
},
"widgets": {
"general": {
"loading": "Завантаження...",
"show-more": "Розгорнути детальніше",
"show-less": "Показати менше",
"open-link": "Продовжити читання"
},
"pi-hole": {
"status-heading": "Статус"
},
"stat-ping": {
"up": "Онлайн",
"down": "Офлайн"
},
"net-data": {
"cpu-chart-title": "Історія CPU",
"mem-chart-title": "Використання пам'яті",
"mem-breakdown-title": "Переривання пам'яті",
"load-chart-title": "Завантаження системи"
},
"glances": {
"disk-space-free": "Вільно",
"disk-space-used": "Використано",
"disk-mount-point": "Точка монтування",
"disk-file-system": "Файлова система",
"disk-io-read": "Читання",
"disk-io-write": "Запис",
"system-load-desc": "Середня кількість процесів, що очікують у черзі виконання, для всіх ядер"
},
"system-info": {
"uptime": "Час роботи"
},
"flight-data": {
"arrivals": "Прибуття",
"departures": "Відправлення"
},
"tfl-status": {
"good-service-all": "Якісний сервіс на всіх лініях",
"good-service-rest": "Якісний сервіс на всіх інших лініях"
},
"synology-download": {
"download": "Завантажити (Download)",
"upload": "Вивантажити (Upload)",
"downloaded": "Завантажено",
"uploaded": "Вивантажено",
"remaining": "Залишилося",
"up": "Вгору",
"down": "Вниз"
},
"gluetun-status": {
"vpn-ip": "VPN IP",
"country": "Країна",
"region": "Регіон",
"city": "Місто",
"post-code": "Поштовий індекс",
"location": "Розташування",
"timezone": "Часовий пояс",
"organization": "Організація"
},
"nextcloud": {
"active": "активно",
"and": "і",
"applications": "програми",
"available": "доступно",
"away": "відсутнє",
"cache-full": "КЕШ ЗАПОВНЕНИЙ",
"chat-room": "кімната чату",
"delete-all": "Видалити все",
"delete-notification": "Видалити сповіщення",
"disabled": "вимкнено",
"disk-quota": "Дискова квота",
"disk-space": "Простір на диску",
"dnd": "Не турбувати",
"email": "електронна пошта",
"enabled": "увімкнено",
"federated-shares-ucfirst": "Об'єднані спільні ресурси",
"federated-shares": "об'єднані спільні ресурси",
"files": "файл{множина}",
"free": "вільний",
"groups": "групи",
"hit-rate": "швидкість процесів",
"hits": "процеси",
"home": "дім",
"in": "у",
"keys": "ключі",
"last-24-hours": "за останні 24 години",
"last-5-minutes": "останні 5 хвилин",
"last-hour": "за останню годину",
"last-login": "Останній вхід",
"last-restart": "Останній перезапуск",
"load-averages": "Завантажити середні значення для всіх ядер ЦПУ",
"local-shares": "Локальні спільні ресурси",
"local": "локальний",
"max-keys": "макс. ключі",
"memory-used": "використана пам'ять",
"memory-utilisation": "використання пам'яті",
"memory": "пам'ять",
"misses": "пропуски",
"no-notifications": "Немає сповіщень",
"no-pending-updates": "Немає очікуваних оновлень",
"nothing-to-show": "Зараз тут нічого показувати",
"of-which": "з яких",
"of": "з",
"offline": "Офлайн",
"online": "Онлайн",
"other": "інше",
"overall": "Загалом",
"private-link": "приватне посилання",
"public-link": "публічне посилання",
"quota-enabled": "Дискова квота {не}ввімкнена для цього користувача",
"received": "отримано",
"scripts": "скрипти",
"sent": "надіслано",
"started": "Розпочато",
"storages-by-type": "Сховища за типом",
"storages": "сховище{множина}",
"strings-use": "рядки використання",
"tasks": "Завдання",
"total-files": "загальна кількість файлів",
"total-users": "загальна кількість користувачів",
"total": "усього",
"until": "Доки",
"updates-available-for": "Оновлення доступні для",
"updates-available": "доступне оновлення{множина}",
"used": "використано",
"user": "користувач",
"using": "використовуючи",
"version": "версія",
"wasted": "витрачено"
}
}
}

456
src/assets/locales/uk.json Normal file
View File

@ -0,0 +1,456 @@
{
"home": {
"no-results": "Немає результатів пошуку",
"no-data": "Дані не налаштовано",
"no-items-section": "Поки що немає елементів для показу"
},
"search": {
"search-label": "Пошук",
"search-placeholder": "Почніть вводити текст для фільтрування",
"clear-search-tooltip": "Очистити пошук",
"enter-to-search-web": "Натисніть Enter для пошуку в Інтернеті"
},
"splash-screen": {
"loading": "Завантаження"
},
"login": {
"title": "Dashy",
"guest-label": "Гостьовий доступ",
"username-label": "Ім'я користувача",
"password-label": "Пароль",
"login-button": "Увійти",
"remember-me-label": "Запам'ятати мене для",
"remember-me-never": "Ніколи не запам'ятовувати",
"remember-me-hour": "4 години",
"remember-me-day": "1 день",
"remember-me-week": "1 тиждень",
"remember-me-long-time": "Довгий час",
"error-missing-username": "Відсутнє ім'я користувача",
"error-missing-password": "Відсутній пароль",
"error-incorrect-username": "Користувача не знайдено",
"error-incorrect-password": "Неправильний пароль",
"success-message": "Вхід...",
"logout-message": "Вихід",
"already-logged-in-title": "Вхід вже виконано",
"already-logged-in-text": "Ви увійшли як",
"proceed-to-dashboard": "Перейти до інформаційної панелі",
"log-out-button": "Вийти",
"proceed-guest-button": "Продовжити як гість",
"guest-intro-1": "У цій системі увімкнено гостьовий доступ.",
"guest-intro-2": "Гості мають доступ лише для перегляду до інформаційних панелей, тому не можуть записати жодних змін на диск.",
"error": "Помилка",
"error-no-user-configured": "Автентифікацію не ввімкнено, або користувачі не налаштовані",
"error-go-home-button": "Повернутися на головну",
"logged-in-guest": "Ви увійшли як гість, перенаправлення...",
"error-guest-access": "Гостьовий доступ не дозволено"
},
"app-info": {
"title": "Інформація про програму",
"error-log": "Журнал помилок",
"no-errors": "Останніх помилок не виявлено",
"help-support": "Допомога та підтримка",
"help-support-description": "Щоб отримати підтримку щодо запуску чи налаштування Dashy, див.",
"help-support-discussions": "Обговорення",
"support-dashy": "Підтримка Dashy",
"support-dashy-description": "Щоб дізнатися, як ви можете взяти участь, перегляньте",
"support-dashy-link": "Сторінка внесків",
"report-bug": "Повідомити про помилку",
"report-bug-description": "Якщо ви вважаєте, що знайшли помилку, будь ласка",
"report-bug-link": "повідомте про проблему",
"more-info": "Докладніше",
"source": "Джерело",
"documentation": "Документація",
"privacy-and-security": "Конфіденційність та безпека",
"privacy-and-security-l1": "Для детальної інформації про те, як Dashy керує вашими даними, див.",
"privacy-and-security-privacy-policy": "Політика конфіденційності",
"privacy-and-security-advice": "Щоб отримати поради щодо захисту вашої інформаційної панелі, ви можете звернутися до розділу",
"privacy-and-security-advice-link": "Документи керування",
"privacy-and-security-security-issue": "Якщо ви виявили потенційну проблему з безпекою, повідомте про це згідно з нашою",
"privacy-and-security-security-policy": "Політика безпеки",
"license": "Ліцензія",
"license-under": "Ліцензія згідно",
"licence-third-party": "Ліцензії на сторонні модулі див.",
"licence-third-party-link": "Юридична інформація",
"list-contributors": "Повний список співавторів та подяки див.",
"list-contributors-link": "Подяки",
"version": "Версія"
},
"config": {
"main-tab": "Головне меню",
"view-config-tab": "Переглянути налаштування",
"edit-config-tab": "Редагувати налаштування",
"custom-css-tab": "Користувацькі стилі",
"heading": "Параметри налаштування",
"download-config-button": "Переглянути / Експортувати налаштування",
"edit-config-button": "Редагувати налаштування",
"edit-css-button": "Редагувати користувацький CSS",
"cloud-sync-button": "Увімкнути хмарну синхронізацію",
"edit-cloud-sync-button": "Редагувати хмарну синхронізацію",
"rebuild-app-button": "Перебудувати програму",
"change-language-button": "Змінити мову програми",
"reset-settings-button": "Скинути локальні налаштування",
"disabled-note": "Деякі функції налаштувань були вимкнені адміністратором",
"small-screen-note": "Ви використовуєте дуже маленький екран, і деякі екрани в цьому меню можуть бути не найкращими",
"app-info-button": "Інформація про програму",
"backup-note": "Рекомендовано зробити резервну копію налаштування перед внесенням змін.",
"reset-config-msg-l1": "Це видалить усі налаштування користувача з локального сховища, але не вплине на ваш файл 'conf.yml'.",
"reset-config-msg-l2": "Ви повинні спочатку створити резервну копію будь-яких змін, які ви внесли локально, якщо ви хочете використовувати їх у майбутньому.",
"reset-config-msg-l3": "Ви впевнені, що бажаєте продовжити?",
"data-cleared-msg": "Дані успішно видалено",
"actions-label": "Дії",
"copy-config-label": "Копіювати налаштування",
"data-copied-msg": "Налаштування скопійовано до буфера обміну",
"reset-config-label": "Скинути налаштування",
"css-save-btn": "Зберегти зміни",
"css-note-label": "Примітка",
"css-note-l1": "Вам потрібно буде оновити сторінку, щоб ваші зміни набули чинності.",
"css-note-l2": "Заміни стилів зберігаються лише локально, тому рекомендується зробити копію вашого CSS.",
"css-note-l3": "Щоб видалити всі користувацькі стилі, видаліть вміст та натисніть Зберегти зміни",
"custom-css": {
"title": "Користувацькі стилі",
"base-theme": "Базова тема"
}
},
"alternate-views": {
"alternate-view-heading": "Змінити перегляд",
"default": "За замовчуванням",
"workspace": "Робочий простір",
"minimal": "Мінімальний"
},
"settings": {
"theme-label": "Тема",
"layout-label": "Макет",
"layout-auto": "Авто",
"layout-horizontal": "Горизонтально",
"layout-vertical": "Вертикально",
"item-size-label": "Розмір елемента",
"item-size-small": "Маленький",
"item-size-medium": "Середній",
"item-size-large": "Великий",
"config-launcher-label": "Налаштування",
"config-launcher-tooltip": "Оновити налаштування",
"sign-out-tooltip": "Вийти",
"sign-in-tooltip": "Увійти",
"sign-in-welcome": "Вітаємо {username}!",
"hide": "Приховати",
"open": "Відкрити"
},
"updates": {
"app-version-note": "Версія Dashy",
"up-to-date": "Оновити",
"out-of-date": "Оновлення доступне",
"unsupported-version-l1": "Ви використовуєте непідтримувану версію Dashy",
"unsupported-version-l2": "Для найкращого досвіду та останніх виправлень безпеки, будь ласка, оновіться"
},
"language-switcher": {
"title": "Змінити мову програми",
"dropdown-label": "Оберіть мову",
"save-button": "Зберегти",
"success-msg": "Мову оновлено"
},
"theme-maker": {
"title": "Конфігуратор теми",
"export-button": "Експорт змінних користувача",
"reset-button": "Скинути стилі",
"show-all-button": "Показати всі змінні",
"change-fonts-button": "Змінити шрифти",
"save-button": "Зберегти",
"cancel-button": "Скасувати",
"saved-toast": "{theme} успішно оновлена",
"copied-toast": "Дані теми для {theme} скопійовано в буфер обміну",
"reset-toast": "Видалені користувацькі кольори для {theme}"
},
"config-editor": {
"save-location-label": "Місце збереження",
"location-local-label": "Застосувати локально",
"location-disk-label": "Записати зміни до файлу налаштування",
"save-button": "Зберегти зміни",
"preview-button": "Попередній перегляд змін",
"valid-label": "Налаштування дійсне",
"status-success-msg": "Завдання виконано",
"status-fail-msg": "Не вдалося виконати завдання",
"success-msg-disk": "Файл налаштування успішно записаний на диск",
"success-msg-local": "Локальні зміни успішно збережено",
"success-note-l1": "Програма повинна автоматично перебудуватися.",
"success-note-l2": "Це може зайняти до хвилини.",
"success-note-l3": "Вам потрібно буде оновити сторінку, щоб зміни набули чинності.",
"error-msg-save-mode": "Будь ласка, виберіть режим збереження: локальний або файловий",
"error-msg-cannot-save": "Під час збереження налаштування сталася помилка",
"error-msg-bad-json": "Помилка у форматі JSON, можливо, некоректно сформований",
"warning-msg-validation": "Попередження про перевірку",
"not-admin-note": "Ви не можете записати зміни на диск, оскільки ви не увійшли як адміністратор"
},
"app-rebuild": {
"title": "Перебудувати програму",
"rebuild-note-l1": "Перебудова потрібна, щоб зміни, записані у файл conf.yml, набули чинності.",
"rebuild-note-l2": "Це має статися автоматично, але якщо цього не сталося, ви можете запустити це звідси вручну.",
"rebuild-note-l3": "Це не потрібно для змін, які зберігаються локально.",
"rebuild-button": "Почати збірку",
"rebuilding-status-1": "Збираємо...",
"rebuilding-status-2": "Це може зайняти кілька хвилин",
"error-permission": "У вас немає дозволу ініціювати цю дію",
"success-msg": "Збірку завершено успішно",
"fail-msg": "Помилка при виконанні збірки",
"reload-note": "Тепер потрібно перезавантажити сторінку, щоб зміни набули чинності",
"reload-button": "Перезавантажити сторінку"
},
"cloud-sync": {
"title": "Резервне копіювання та відновлення у хмарі",
"intro-l1": "Резервне копіювання та відновлення в хмарі є додатковою функцією, яка дає змогу завантажити ваше налаштування в Інтернет, а потім відновити її на будь-якому іншому пристрої чи екземплярі Dashy.",
"intro-l2": "Усі дані повністю зашифровані за допомогою AES із використанням вашого пароля як ключа.",
"intro-l3": "Для отримання додаткової інформації див.",
"intro-docs": "документи",
"backup-title-setup": "Створити резервну копію",
"backup-title-update": "Оновити резервну копію",
"password-label-setup": "Оберіть пароль",
"password-label-update": "Введіть свій пароль",
"backup-button-setup": "Резервна копія",
"backup-button-update": "Оновити резервну копію",
"backup-id-label": "Ваш ідентифікатор резервної копії",
"backup-id-note": "Це використовується для відновлення з резервних копій пізніше. Тож має зберігатися разом із паролем у безпечному місці.",
"restore-title": "Відновити резервну копію",
"restore-id-label": "Відновити ідентифікатор",
"restore-password-label": "Пароль",
"restore-button": "Відновити",
"backup-missing-password": "Відсутній пароль",
"backup-error-unknown": "Неможливо обробити запит",
"backup-error-password": "Неправильний пароль. Будь ласка, введіть поточний пароль.",
"backup-success-msg": "Успішно завершено",
"restore-success-msg": "Налаштування успішно відновлено"
},
"menu": {
"open-section-title": "Відкрити в",
"sametab": "Поточна вкладка",
"newtab": "Нова вкладка",
"modal": "Модальне спливаюче вікно",
"workspace": "Перегляд робочого простору",
"options-section-title": "Параметри",
"edit-item": "Редагувати",
"move-item": "Копіювати або перемістити",
"remove-item": "Видалити"
},
"context-menus": {
"item": {
"open-section-title": "Відкрити в",
"sametab": "Поточна вкладка",
"newtab": "Нова вкладка",
"modal": "Модальне спливаюче вікно",
"workspace": "Перегляд робочої області",
"clipboard": "Копіювати до буфера обміну",
"options-section-title": "Параметри",
"edit-item": "Редагувати",
"move-item": "Копіювати або перемістити",
"remove-item": "Видалити",
"copied-toast": "URL скопійовано до буфера обміну"
},
"section": {
"open-section": "Відкрити розділ",
"edit-section": "Редагувати",
"expand-collapse": "Розгорнути / Згорнути",
"move-section": "Перемістити до",
"remove-section": "Видалити"
}
},
"footer": {
"dev-by": "Розроблено",
"licensed-under": "Ліцензія згідно",
"get-the": "Отримати",
"source-code": "Вихідний код"
},
"interactive-editor": {
"menu": {
"start-editing-tooltip": "Увійти в інтерактивний редактор",
"edit-site-data-subheading": "Редагувати дані сайту",
"edit-page-info-btn": "Редагувати інформацію про сторінку",
"edit-page-info-tooltip": "Назва програми, опис, навігаційні посилання, текст нижнього колонтитула тощо",
"edit-app-config-btn": "Редагувати налаштування програми",
"edit-app-config-tooltip": "Усі інші параметри налаштування програми",
"edit-pages-btn": "Редагувати сторінки",
"edit-pages-tooltip": "Додати або видалити додаткові перегляди",
"config-save-methods-subheading": "Параметри збереження налаштування",
"save-locally-btn": "Зберегти локально",
"save-locally-tooltip": "Зберегти налаштування локально у сховище браузера. Це не вплине на файл налаштування, але зміни буде збережено лише на цьому пристрої",
"save-disk-btn": "Зберегти на диск",
"save-disk-tooltip": "Збережіть налаштування у файл conf.yml на диску. Це створить резервну копію, а потім перезапише наявне налаштування",
"export-config-btn": "Експорт налаштування",
"export-config-tooltip": "Переглянути та експортувати нове налаштування у файл або в буфер обміну",
"cloud-backup-btn": "Резервне копіювання у хмару",
"cloud-backup-tooltip": "Зберегти зашифровану резервну копію налаштування у хмару",
"edit-raw-config-btn": "Редагувати необроблене налаштування",
"edit-raw-config-tooltip": "Переглянути та змінити необроблене налаштування за допомогою редактора JSON",
"cancel-changes-btn": "Скасувати редагування",
"cancel-changes-tooltip": "Скинути поточні зміни та вийти з режиму редагування. Це не вплине на вашу збережене налаштування",
"edit-mode-name": "Режим редагування",
"edit-mode-subtitle": "Ви перебуваєте в режимі редагування",
"edit-mode-description": "Це означає, що ви можете вносити зміни до налаштування та переглядати результати, але поки ви не оберете збереження, жодні ваші зміни не будуть записані.",
"save-stage-btn": "Зберегти",
"cancel-stage-btn": "Скасувати",
"save-locally-warning": "Якщо ви продовжите, зміни буде збережено лише у вашому браузері. Вам слід експортувати копію вашого налаштування для використання на інших машинах. Бажаєте продовжити?"
},
"edit-item": {
"missing-title-err": "Потрібна назва елемента"
},
"edit-section": {
"edit-section-title": "Редагувати розділ",
"add-section-title": "Додати новий розділ",
"edit-tooltip": "Натисніть, щоб редагувати, або клацніть правою кнопкою миші, щоб отримати додаткові параметри",
"remove-confirm": "Ви впевнені, що хочете видалити цей розділ? Цю дію можна скасувати пізніше."
},
"edit-app-config": {
"warning-msg-title": "Дійте з обережністю",
"warning-msg-l1": "Ці параметри призначені для розширеного налаштування програми.",
"warning-msg-l2": "Якщо ви не впевнені щодо будь-якого значення, зверніться до",
"warning-msg-docs": "Документація",
"warning-msg-l3": ", щоб уникнути небажаних наслідків."
},
"export": {
"export-title": "Експорт налаштування",
"copy-clipboard-btn": "Копіювати до буфера обміну",
"copy-clipboard-tooltip": "Скопіювати всі налаштування програми до системного буфера обміну у форматі YAML",
"download-file-btn": "Завантажити як файл",
"download-file-tooltip": "Завантажте все налаштування програми на свій пристрій у файлі YAML",
"view-title": "Переглянути налаштування"
}
},
"critical-error": {
"title": "Помилка завантаження налаштування",
"subtitle": "Dashy не вдалося правильно завантажити через помилку налаштування.",
"sub-ensure-that": "Переконайтеся в цьому",
"sub-error-details": "Деталі помилки",
"sub-next-steps": "Наступні кроки",
"ignore-button": "Ігнорувати критичні помилки"
},
"widgets": {
"general": {
"loading": "Завантаження...",
"show-more": "Розгорнути детальніше",
"cpu-details": "Детальніше по ЦПУ",
"mem-details": "Детальніше по пам'яті",
"show-less": "Показати менше",
"open-link": "Продовжити читання"
},
"pi-hole": {
"status-heading": "Статус"
},
"stat-ping": {
"up": "Онлайн",
"down": "Офлайн"
},
"net-data": {
"cpu-chart-title": "Історія ЦПУ",
"mem-chart-title": "Використання пам'яті",
"mem-breakdown-title": "Переривання пам'яті",
"load-chart-title": "Завантаження системи"
},
"glances": {
"disk-space-free": "Вільно",
"disk-space-used": "Використано",
"disk-mount-point": "Точка монтування",
"disk-file-system": "Файлова система",
"disk-io-read": "Читання",
"disk-io-write": "Запис",
"system-load-desc": "Середня кількість процесів, що очікують у черзі виконання, для всіх ядер"
},
"system-info": {
"uptime": "Час роботи"
},
"flight-data": {
"arrivals": "Прибуття",
"departures": "Відправлення"
},
"tfl-status": {
"good-service-all": "Якісний сервіс на всіх лініях",
"good-service-rest": "Якісний сервіс на всіх інших лініях"
},
"synology-download": {
"download": "Завантажити (Download)",
"upload": "Вивантажити (Upload)",
"downloaded": "Завантажено",
"uploaded": "Вивантажено",
"remaining": "Залишилося",
"up": "Вгору",
"down": "Вниз"
},
"gluetun-status": {
"vpn-ip": "VPN IP",
"country": "Країна",
"region": "Регіон",
"city": "Місто",
"post-code": "Поштовий індекс",
"location": "Розташування",
"timezone": "Часовий пояс",
"organization": "Організація"
},
"nextcloud": {
"active": "активно",
"and": "і",
"applications": "програми",
"available": "доступно",
"away": "відсутнє",
"cache-full": "КЕШ ЗАПОВНЕНИЙ",
"chat-room": "кімната чату",
"delete-all": "Видалити все",
"delete-notification": "Видалити сповіщення",
"disabled": "вимкнено",
"disk-quota": "Дискова квота",
"disk-space": "Простір на диску",
"dnd": "Не турбувати",
"email": "електронна пошта",
"enabled": "увімкнено",
"federated-shares-ucfirst": "Об'єднані спільні ресурси",
"federated-shares": "об'єднані спільні ресурси",
"files": "файл{множина}",
"free": "вільний",
"groups": "групи",
"hit-rate": "рівень попадань",
"hits": "попадання",
"home": "головна",
"in": "у",
"keys": "ключі",
"last-24-hours": "за останні 24 години",
"last-5-minutes": "останні 5 хвилин",
"last-hour": "за останню годину",
"last-login": "Останній вхід",
"last-restart": "Останній перезапуск",
"load-averages": "Завантажити середні значення для всіх ядер ЦПУ",
"local-shares": "Локальні спільні ресурси",
"local": "локальний",
"max-keys": "максимум ключів",
"memory-used": "використана пам'ять",
"memory-utilisation": "використання пам'яті",
"memory": "пам'ять",
"misses": "промахи",
"no-notifications": "Немає сповіщень",
"no-pending-updates": "немає очікуваних оновлень",
"nothing-to-show": "Зараз тут нічого показувати",
"of-which": "з яких",
"of": "з",
"offline": "Офлайн",
"online": "Онлайн",
"other": "інше",
"overall": "Загалом",
"private-link": "приватне посилання",
"public-link": "публічне посилання",
"quota-enabled": "Дискова квота {не}ввімкнена для цього користувача",
"received": "отримано",
"scripts": "скрипти",
"sent": "надіслано",
"started": "Розпочато",
"storages-by-type": "Сховища за типом",
"storages": "сховище{множина}",
"strings-use": "рядки використання",
"tasks": "Завдання",
"total-files": "загальна кількість файлів",
"total-users": "загальна кількість користувачів",
"total": "усього",
"until": "Доки",
"updates-available-for": "Оновлення доступні для",
"updates-available": "доступне оновлення{множина}",
"used": "використано",
"user": "користувач",
"using": "використовуючи",
"version": "версія",
"wasted": "витрачено"
}
}
}

View File

@ -18,7 +18,7 @@
"guest-label": "访客访问",
"username-label": "用户名",
"password-label": "密码",
"login-button": "登",
"login-button": "登",
"remember-me-label": "记住密码",
"remember-me-never": "永不",
"remember-me-hour": "4 小时",
@ -29,10 +29,10 @@
"error-missing-password": "密码空缺",
"error-incorrect-username": "用户不存在",
"error-incorrect-password": "密码不正确",
"success-message": "登成功。",
"success-message": "登成功。",
"logout-message": "注销",
"already-logged-in-title": "已经成功登",
"already-logged-in-text": "你的登身份",
"already-logged-in-title": "已经成功登",
"already-logged-in-text": "你的登身份",
"proceed-to-dashboard": "前往仪表板",
"log-out-button": "注销",
"proceed-guest-button": "以游客身份前往",
@ -41,7 +41,7 @@
"error": "错误",
"error-no-user-configured": "没有启用验证,或者未配置用户",
"error-go-home-button": "Go Home",
"logged-in-guest": "以访客身份登,正在跳转...",
"logged-in-guest": "以访客身份登,正在跳转...",
"error-guest-access": "不允许访客访问"
},
"app-info": {
@ -130,7 +130,7 @@
"config-launcher-label": "设置",
"config-launcher-tooltip": "更新设置",
"sign-out-tooltip": "注销",
"sign-in-tooltip": "登",
"sign-in-tooltip": "登",
"sign-in-welcome": "你好 {username}",
"hide": "隐藏",
"open": "打开"
@ -402,7 +402,7 @@
"last-24-hours": "24 小时内",
"last-5-minutes": "5 分钟内",
"last-hour": "1 小时内",
"last-login": "最后登",
"last-login": "最后登",
"last-restart": "最后重启",
"load-averages": "所有CPU的平均负载",
"local-shares": "本地分享",

View File

@ -34,6 +34,8 @@
:statusSuccess="statusResponse ? statusResponse.successStatus : undefined"
:statusText="statusResponse ? statusResponse.message : undefined"
/>
<!-- URL of the item (shown on hover, only on some themes) -->
<p class="item-url">{{ item.url | shortUrl }}</p>
<!-- Edit icon (displayed only when in edit mode) -->
<EditModeIcon v-if="isEditMode" class="edit-mode-item" @click="openItemSettings()" />
</a>
@ -122,6 +124,26 @@ export default {
}
},
},
filters: {
shortUrl(value) {
if (!value || typeof value !== 'string') {
return '';
}
try {
// Use URL constructor to parse the input
const url = new URL(value);
return url.hostname;
} catch (e) {
// If the input is not a valid URL, try to handle it as an IP address
const ipPattern = /^(\d{1,3}\.){3}\d{1,3}/;
const match = value.match(ipPattern);
if (match) {
return match[0];
}
return '';
}
},
},
data() {
return {
editMenuOpen: false,
@ -209,6 +231,9 @@ export default {
&.span-7 { min-width: 14%; }
&.span-8 { min-width: 12.5%; }
}
.item-url {
display: none;
}
}
.item {

View File

@ -72,6 +72,7 @@ export default {
else if (img.includes('mdi-')) imgType = 'mdi';
else if (img.includes('si-')) imgType = 'si';
else if (img.includes('hl-')) imgType = 'home-lab-icons';
else if (img.includes('sh-')) imgType = 'selfhst-icons';
else if (img.includes('favicon-')) imgType = 'custom-favicon';
else if (img === 'favicon') imgType = 'favicon';
else if (img === 'generative') imgType = 'generative';
@ -90,6 +91,7 @@ export default {
case 'mdi': return img; // Material design icons
case 'simple-icons': return this.getSimpleIcon(img);
case 'home-lab-icons': return this.getHomeLabIcon(img);
case 'selfhst-icons': return this.getSelfhstIcon(img); // selfh.st/icons
case 'svg': return img; // Local SVG icon
case 'emoji': return img; // Emoji/ unicode
default: return '';
@ -195,6 +197,10 @@ export default {
}
return icon.path;
},
getSelfhstIcon(img, cdn) {
const imageName = img.slice(3).toLocaleLowerCase();
return (cdn || iconCdns.sh).replace('{icon}', imageName);
},
/* Gets home-lab icon from GitHub */
getHomeLabIcon(img, cdn) {
const imageName = img.replace('hl-', '').toLocaleLowerCase();

View File

@ -0,0 +1,106 @@
<template>
<div class="custom-list">
<div class="custom-list-title" v-if="title">
{{ title }}
</div>
<div v-for="(item, key) in data" :key="key" class="custom-list-row">
<div v-if="item.link" class="custom-list-cell">
<a :href="item.link.url" :title="item.link.title" target="_blank">
{{ item.link.text }}
</a>
</div>
<div v-if="item.value" class="custom-list-cell" :title="item.value.title">
{{ item.value.text }}
<span v-if="item.isNew" class="custom-list-new-value"></span>
</div>
</div>
</div>
</template>
<script>
import WidgetMixin from '@/mixins/WidgetMixin';
export default {
mixins: [WidgetMixin],
components: {},
data() {
return {
data: [],
};
},
computed: {
url() {
return this.options.url || '';
},
title() {
return this.options.title || '';
},
daysForNew() {
return parseInt(Number(this.options.daysForNew)) || false;
}
},
methods: {
fetchData() {
if (this.url) {
this.startLoading();
this.makeRequest(this.options.url).then(this.processData);
}
},
processData(data) {
let today = new Date();
this.data = data.sort((a, b) => new Date(a.date) < new Date(b.date));
if (this.daysForNew) {
let threshold = this.daysForNew * 1000 * 60 * 60 * 24;
this.data = this.data.map((item) => {
item.isNew = (today - new Date(item.date) < threshold);
return item;
});
}
this.finishLoading();
},
},
};
</script>
<style scoped lang="scss">
.custom-list {
.custom-list-title {
outline: 2px solid transparent;
border: 1px solid var(--outline-color);
border-radius: var(--curve-factor);
box-shadow: var(--item-shadow);
color: var(--item-text-color);
margin: .5rem;
padding: 0.3rem;
background: var(--item-background);
text-align: center;
}
.custom-list-row {
display: flex;
align-items: center;
justify-content: space-between;
color: var(--widget-text-color);
font-size: 1.1rem;
.custom-list-cell {
display: inline-block;
a {
text-decoration: none;
color: var(--item-text-color);
}
.custom-list-new-value{
width: 0.8rem;
height: 0.8rem;
border-radius: 50%;
background-color: var(--success);
display: inline-block;
}
}
&:not(:last-child) {
border-bottom: 1px dashed var(--widget-text-color);
}
}
}
</style>

View File

@ -77,11 +77,11 @@ export default {
slug: repo.repo,
desc: repo.desc,
lang: repo.lang,
link: repo.repo_link,
link: `https://github.com/${repo.repo}`,
stars: repo.stars,
forks: repo.forks,
newStars: parseInt(repo.added_stars, 10),
avatar: repo.avatars[0] || 'https://github.com/fluidicon.png',
newStars: repo.change,
avatar: repo.build_by[0] || 'https://github.com/fluidicon.png',
});
});
if (this.limit && this.limit < results.length) {

View File

@ -68,11 +68,11 @@ export default {
networks.push({
name: network.interface_name,
speed: network.speed,
online: network.is_up ? 'up' : 'down',
currentDownload: network.rx,
currentUpload: network.tx,
totalDownload: network.cumulative_rx,
totalUpload: network.cumulative_tx,
online: network.speed ? 'up' : 'down', // v3 to v4 is_up no longer seems to be a default response field
currentDownload: network.bytes_recv,
currentUpload: network.bytes_sent,
totalDownload: network.bytes_recv_gauge,
totalUpload: network.bytes_sent_gauge,
changeDownload: this.previous && network.rx > this.previous[index].rx,
changeUpload: this.previous && network.tx > this.previous[index].tx,
});

View File

@ -33,8 +33,8 @@ export default {
/* eslint-disable prefer-destructuring */
Object.keys(trafficData).forEach((keyName) => {
let upOrDown = null;
if (keyName.includes('_tx')) upOrDown = 'up';
else if (keyName.includes('_rx')) upOrDown = 'down';
if (keyName.includes('_sent')) upOrDown = 'up';
else if (keyName.includes('_recv')) upOrDown = 'down';
trafficData[keyName].forEach((dataPoint) => {
const dataTime = this.getRoundedTime(dataPoint[0]);
if (upOrDown === 'up') {

View File

@ -0,0 +1,258 @@
<template>
<div class="minecraft-wrapper">
<a class="minecraft-link" :href="serverLinkEndpoint">
<h3 class="minecraft-title">{{ title }}</h3>
</a>
<div class="minecraft-icon-wrapper">
<img :src="icon" alt="server-icon" class="minecraft-icon" />
</div>
<div class="minecraft-content-wrapper">
<StatusIndicator class="status-indicator" :statusSuccess="status ? online : undefined"
:statusText="status ? statusTooltip : undefined" />
<span v-if="title != server" class="minecraft-server">{{ server }}<br /></span>
<span v-if="!online" class="minecraft-status">Server Offline</span>
<span v-if="online" class="minecraft-version">
{{ software || (bedrock ? "Bedrock" : "Minecraft") }} {{ version }}
</span>
<ul v-if="online" class="minecraft-motd">
<li v-for="(line, idx) in motd" :key="idx">{{ line }}</li>
</ul>
<div v-if="showPlayers" class="player-list">
<span>{{ onlinePlayers }}/{{ maxPlayers }} Players</span>
<ul>
<li v-for="{ name, uuid } in players" :key="uuid">
<a :href="playerLinkEndpoint(uuid)">
<img :src="playerIconEndpoint(uuid)" :alt="`${name}'s Head'`"/>{{ name }}
</a>
</li>
</ul>
</div>
<div v-if="showMods" class="mod-list">
<span>{{ mods.length }} Mods</span>
<ul>
<li v-for="{ name, version } in mods" :key="name">
{{ name }}={{ version }}
</li>
</ul>
</div>
<div v-if="showPlugins" class="plugin-list">
<span>{{ plugins.length }} Plugins</span>
<ul>
<li v-for="{ name, version } in plugins" :key="name">
{{ name }}={{ version }}
</li>
</ul>
</div>
</div>
</div>
</template>
<script>
import WidgetMixin from '@/mixins/WidgetMixin';
import { widgetApiEndpoints } from '@/utils/defaults';
import StatusIndicator from '@/components/LinkItems/StatusIndicator.vue';
export default {
mixins: [WidgetMixin],
components: {
StatusIndicator,
},
data() {
return {
status: false,
online: false,
ip: '',
port: 0,
hostname: '',
iconData: null,
motd: null,
version: null,
software: null,
gamemode: null,
mods: [],
plugins: [],
players: [],
onlinePlayers: null,
maxPlayers: null,
};
},
computed: {
title() {
return this.options.title || this.options.server || this.error('options.server not set');
},
alt() {
return this.title;
},
icon() {
return `https://api.mcsrvstat.us/icon/${this.server}`;
},
server() {
return this.options.server || this.error('options.server not set');
},
bedrock() {
return this.options.bedrock === true;
},
statusTooltip() {
if (!this.status) {
return 'Loading...';
}
if (!this.online) {
return `${this.server} Offline`;
}
return `${this.onlinePlayers}/${this.maxPlayers} Online`;
},
showPlayers() {
return this.options.showPlayers && this.players.length > 0;
},
showMods() {
return this.options.showMods && this.mods.length > 0;
},
showPlugins() {
return this.options.showPlugins && this.plugins.length > 0;
},
endpoint() {
return `${widgetApiEndpoints.minecraftStatus}${this.bedrock ? 'bedrock/' : ''}3/${this.server}`;
},
serverLinkEndpoint() {
return `${widgetApiEndpoints.minecraftServerLink}${this.server}`;
},
},
methods: {
playerIconEndpoint(uuid) {
return `${widgetApiEndpoints.minecraftPlayerIcon}${uuid}/32.png`;
},
playerLinkEndpoint(uuid) {
return `${widgetApiEndpoints.minecraftPlayerLink}${uuid}`;
},
/* Make GET request to McSrvStat.US API endpoint */
fetchData() {
this.startLoading();
fetch(this.endpoint)
.then(response => {
if (!response.ok) {
this.error('Network response was not ok');
}
return response.json();
})
.then(data => {
this.processData(data);
})
.catch(dataFetchError => {
this.error('Unable to fetch data', dataFetchError);
})
.finally(() => {
this.finishLoading();
});
},
/* Assign data variables to the returned data */
processData(data) {
this.online = data.online;
this.ip = data.ip;
this.port = data.port;
this.hostname = data.hostname;
if (this.online) {
this.version = data.version;
this.iconData = data.icon;
this.software = data.software;
this.gamemode = data.gamemode;
this.motd = data.motd.clean || [];
this.players = data.players.list || [];
this.onlinePlayers = data.players.online;
this.maxPlayers = data.players.max;
this.mods = data.mods || [];
this.plugins = data.plugins || [];
}
this.status = true;
},
update() {
this.fetchData();
},
},
};
</script>
<style scoped lang="scss">
.minecraft-wrapper {
margin-top: -1em;
display: grid;
justify-content: center;
grid-template-columns: 64px 1fr;
color: var(--widget-text-color);
padding-top: 0.5rem;
.minecraft-link {
grid-column: 1 / span 2;
text-decoration: none;
.minecraft-title {
font-size: 1.2rem;
margin: 0.25rem auto;
border-bottom: 1px solid var(--widget-text-color);
color: var(--widget-text-color);
}
}
.minecraft-icon {
display: flex;
width: 100%;
max-width: 64px;
margin: 0.25rem auto 0;
padding-top: 0.5rem;
border-radius: var(--curve-factor);
}
.minecraft-content-wrapper {
position: relative;
padding: 0.5rem;
ul.minecraft-motd {
border-top: 1px dashed var(--widget-text-color);
list-style-type: none;
padding: 0.5rem 0;
margin: 0.5rem 0 0 0;
}
.player-list,
.mod-list,
.plugin-list {
span {
font-size: 1.2rem;
border-top: 1px dashed var(--widget-text-color);
padding: 0.25rem 0;
display: block;
}
ul {
list-style-type: '- ';
padding: 0;
margin: 0;
li {
padding: 1rem 0;
margin: 0;
}
}
}
.player-list {
ul {
li {
padding: 0;
list-style-type: none;
img {
width: 1rem;
height: 1rem;
float: left;
position: relative;
margin-right: 1em;
}
}
}
}
}
}
</style>
<style lang="scss">
.minecraft-alt-tt {
min-width: 20rem;
}
</style>

View File

@ -24,17 +24,20 @@ export default {
endpoint() {
if (this.provider === 'ipgeolocation') {
return `${widgetApiEndpoints.publicIp2}?apiKey=${this.apiKey}`;
} else if (this.provider === 'ipapi') {
} else if (this.provider === 'ip2location.io') {
return `${widgetApiEndpoints.publicIp4}?key=${this.apiKey}`;
} else if (this.provider === 'ip-api') {
return widgetApiEndpoints.publicIp3;
}
return widgetApiEndpoints.publicIp;
},
apiKey() {
if (this.provider === 'ipgeolocation' && !this.options.apiKey) this.error('Missing API Key');
if (this.provider === 'ip2location.io' && !this.options.apiKey) this.error('Missing API Key');
return this.options.apiKey;
},
provider() {
// Can be either `ip-api`, `ipapi.co` or `ipgeolocation`
// Can be either `ip-api`, `ipapi.co`, `ipgeolocation` or `ip2location.io`
return this.parseAsEnvVar(this.options.provider) || 'ipapi.co';
},
},
@ -72,6 +75,12 @@ export default {
this.location = `${ipInfo.city}, ${ipInfo.regionName}`;
this.flagImg = getCountryFlag(ipInfo.countryCode);
this.mapsUrl = getMapUrl({ lat: ipInfo.lat, lon: ipInfo.lon });
} else if (this.provider === 'ip2location.io') {
this.ipAddr = ipInfo.ip;
this.ispName = ipInfo.isp || 'IP2Location.io Starter plan or higher required.';
this.location = `${ipInfo.city_name}, ${ipInfo.region_name}`;
this.flagImg = getCountryFlag(ipInfo.country_code);
this.mapsUrl = getMapUrl({ lat: ipInfo.latitude, lon: ipInfo.longitude });
} else {
this.error('Unknown API provider fo IP address');
}

View File

@ -131,7 +131,7 @@ export default {
const posts = [];
let { length } = items;
if (this.limit) {
length = this.limit;
length = Math.min(length, this.limit);
}
for (let i = 0; length > i; i += 1) {
posts.push({

View File

@ -0,0 +1,227 @@
<template>
<div class="status-section">
<template v-if="statusData">
<div class="status-wrapper">
<div class="status-item">
<div class="title">Version</div>
<div class="value">{{ statusData.version }}</div>
</div>
<div class="status-item">
<div class="title">Agent Count</div>
<div class="value">{{ statusData.agent_count }}</div>
</div>
<div class="status-item">
<div class="title">Client Count</div>
<div class="value">{{ statusData.client_count }}</div>
</div>
<div class="status-item">
<div class="title">Site Count</div>
<div class="value">{{ statusData.site_count }}</div>
</div>
<div class="status-item">
<div class="title">Disk Usage</div>
<div class="value">{{ statusData.disk_usage_percent }}%</div>
</div>
<div class="status-item">
<div class="title">Memory Usage</div>
<div class="value">{{ statusData.mem_usage_percent }}%</div>
</div>
<div class="status-item">
<div class="title">Days Until Cert Expires</div>
<div class="value">{{ statusData.days_until_cert_expires }}</div>
</div>
<div class="status-item">
<div class="title">Cert Expired</div>
<div class="value">{{ statusData.cert_expired ? 'Yes' : 'No' }}</div>
</div>
<div class="status-item services">
<div class="title">Services Running</div>
<div class="services-list">
<div
v-for="(status, service) in statusData.services_running"
:key="service"
class="service"
>
<span class="service-name">{{ service }}</span>
<span :class="['service-status', status ? 'running' : 'stopped']">
{{ status ? 'Running' : 'Stopped' }}
</span>
</div>
</div>
</div>
</div>
</template>
<template v-if="errorMessage">
<div class="error-message">
<span class="text">{{ errorMessage }}</span>
</div>
</template>
</div>
</template>
<script>
import axios from 'axios';
import WidgetMixin from '@/mixins/WidgetMixin';
import { serviceEndpoints } from '@/utils/defaults';
export default {
mixins: [WidgetMixin],
props: {
options: {
type: Object,
default: () => ({}),
},
},
data() {
return {
statusData: null,
errorMessage: null,
errorMessageConstants: {
missingToken: 'No Token set',
missingUrl: 'No URL set',
},
};
},
mounted() {
this.fetchData();
},
computed: {
token() {
return this.parseAsEnvVar(this.options.token);
},
url() {
return this.parseAsEnvVar(this.options.url);
},
authHeaders() {
return {
'Content-Type': 'application/json',
};
},
proxyReqEndpoint() {
const baseUrl = process.env.VUE_APP_DOMAIN || window.location.origin;
return `${baseUrl}${serviceEndpoints.corsProxy}`;
},
},
methods: {
update() {
this.startLoading();
this.fetchData();
},
fetchData() {
const {
authHeaders, url, token, proxyReqEndpoint,
} = this;
if (!this.optionsValid({ url, token })) {
return;
}
const targetURL = url;
const customHeaders = JSON.stringify(authHeaders);
axios.post(
proxyReqEndpoint,
{ auth: token },
{
headers: {
'Target-URL': targetURL,
CustomHeaders: customHeaders,
'Content-Type': 'application/json',
},
},
)
.then((response) => {
this.processData(response.data);
})
.catch(() => {
this.errorMessage = 'Failed to fetch data';
})
.finally(() => {
this.finishLoading();
});
},
processData(response) {
this.statusData = response;
},
optionsValid({ url, token }) {
const errors = [];
if (!url) {
errors.push(this.errorMessageConstants.missingUrl);
}
if (!token) {
errors.push(this.errorMessageConstants.missingToken);
}
if (errors.length === 0) {
return true;
}
this.errorMessage = errors.join('\n');
return false;
},
},
};
</script>
<style scoped lang="scss">
.status-section {
background-color: var(--item-background);
padding: 1em;
border-radius: 8px;
}
.status-wrapper {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
color: var(--item-text-color);
}
.status-item {
width: 48%;
margin: 1em 0;
}
.title {
font-weight: bold;
color: var(--item-text-color);
}
.value {
margin-top: 0.5em;
color: var(--item-text-color);
}
.services-list {
display: flex;
flex-direction: column;
}
.service {
display: flex;
justify-content: space-between;
margin: 0.5em 0;
width: 100%;
}
.service-name {
font-weight: bold;
color: var(--item-text-color);
}
.service-status {
margin-left: 1em;
}
.service-status.running {
color: var(--success);
font-weight: bold;
}
.service-status.stopped {
color: var(--danger);
}
.error-message {
color: var(--item-text-color);
}
</style>

View File

@ -144,7 +144,7 @@ export default {
return copy;
},
getRowValue(row) {
return this.getValueWithRegex(row, /\b\d+\b$/);
return this.getValueWithRegex(row, /\b(\d+)(\.\d+)*\b$/);
},
getRowMonitorName(row) {
return this.getValueWithRegex(row, /monitor_name="([^"]+)"/);
@ -193,7 +193,7 @@ export default {
white-space: nowrap;
vertical-align: baseline;
padding: .35em .65em;
margin: 1em 0.5em;
margin: 0.1em 0.5em;
min-width: 64px;
&.up {

View File

@ -46,13 +46,14 @@ const COMPAT = {
'adguard-filter-status': 'AdGuardFilterStatus',
'adguard-stats': 'AdGuardStats',
'adguard-top-domains': 'AdGuardTopDomains',
anonaddy: 'AnonAddy',
anonaddy: 'addy.io',
apod: 'Apod',
'blacklist-check': 'BlacklistCheck',
clock: 'Clock',
'crypto-price-chart': 'CryptoPriceChart',
'crypto-watch-list': 'CryptoWatchList',
'custom-search': 'CustomSearch',
'custom-list': 'CustomList',
'cve-vulnerabilities': 'CveVulnerabilities',
'domain-monitor': 'DomainMonitor',
'code-stats': 'CodeStats',
@ -86,6 +87,7 @@ const COMPAT = {
iframe: 'IframeWidget',
image: 'ImageWidget',
joke: 'Jokes',
'minecraft-status': 'MinecraftStatus',
'mullvad-status': 'MullvadStatus',
mvg: 'Mvg',
linkding: 'Linkding',
@ -115,6 +117,7 @@ const COMPAT = {
'synology-download': 'SynologyDownload',
'system-info': 'SystemInfo',
'tfl-status': 'TflStatus',
trmm: 'TacticalRMM',
'uptime-kuma': 'UptimeKuma',
'wallet-balance': 'WalletBalance',
weather: 'Weather',

View File

@ -39,11 +39,17 @@ export default {
document.removeEventListener('pointerup', onPointerUp);
};
const onPointerMove = () => {
clearTimeout(parseInt(el.dataset.longPressTimeout, 10));
document.removeEventListener('pointermove', onPointerMove);
};
const onPointerDown = (e) => {
// If event was right-click, then immediately trigger
if (e.button === 2) return;
startTime = Date.now();
document.addEventListener('pointerup', onPointerUp);
el.addEventListener('pointermove', onPointerMove);
el.addEventListener('click', swallowClick);
const timeoutDuration = LONG_PRESS_DEFAULT_DELAY;
const timeout = setTimeout(triggerEvent, timeoutDuration);

View File

@ -136,6 +136,14 @@ const ThemingMixin = {
} else if (hasExternal) {
this.applyRemoteTheme(this.externalThemes[initialTheme]);
}
// Detect OS theme preference and apply the corresponding theme
const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
const osTheme = prefersDark ? this.appConfig.nightTheme : this.appConfig.dayTheme;
if (osTheme) {
this.$store.commit(Keys.SET_THEME, osTheme);
this.updateTheme(osTheme);
}
},
},
};

View File

@ -1142,6 +1142,104 @@ html[data-theme='glow'], html[data-theme=glow-colorful] {
}
}
html[data-theme='glow-dark'] {
--primary: #8faeff;
--background: #11111b;
--background-darker: #0a0a0f;
--curve-factor: 12px;
--item-group-background: #1b1b29;
--item-group-outer-background: #171724;
--item-background: #1d1d2b;
--font-headings: 'Sniglet', cursive;
--item-group-heading-text-color: var(--primary);
--item-group-heading-text-color-hover: #a0bfff;
--item-group-shadow: 0 5px 16px 0 #5c6da933;
--item-background-hover: #33334d;
--item-shadow: 0 1px 5px 0 #5c6da980;
--item-hover-shadow: 0 1px 8px 0 #5c6da9a6;
--item-icon-transform: drop-shadow(1px 2px 3px var(--transparent-50)) saturate(1.1);
--item-icon-transform-hover: drop-shadow(1px 2px 4px var(--transparent-50)) saturate(1.1);
--footer-height: 120px;
--transparent-50: #00000080;
header {
padding: 0.5rem;
background: var(--background-darker);
.page-titles {
h1 {
font-size: 1.8rem;
color: var(--primary);
}
span.subtitle {
font-size: 0.8rem;
color: #ccc;
text-shadow: none;
}
}
.nav .nav-item {
padding: 0.2rem 0.4rem;
box-shadow: none;
color: #ddd;
}
}
.settings-outer {
box-shadow: 0 4px 5px 0 #5c6da91a;
.options-container {
padding: 0.25rem 1.5rem 0.25rem 1rem;
background: var(--background-darker);
}
}
footer {
background: var(--background-darker);
box-shadow: 0 -4px 5px 0 #5c6da91a;
}
.search-wrap input {
background: #2a2a3d;
color: #eee;
box-shadow: 0 1px 5px 0 #5c6da980;
}
div.collapsable:nth-child(1n) {
a.item { color: #a88bff; }
--item-group-shadow: 0 5px 16px 0 #9f72ff33;
--item-group-heading-text-color: #bfa2ff;
--item-group-heading-text-color-hover: #cbb8ff;
--item-background-hover: #3a3a55;
--item-shadow: 0 1px 5px 0 #8656ef80;
--item-hover-shadow: 0 1px 8px 0 #8656efa6;
--item-icon-transform: drop-shadow(1px 2px 3px #8656ef80) saturate(1.1);
--item-icon-transform-hover: drop-shadow(1px 2px 4px #8656ef80) saturate(1.1);
}
div.collapsable:nth-child(2n) {
a.item { color: #e58fff; }
--item-group-shadow: 0 5px 16px 0 #728cff33;
--item-group-heading-text-color: #eaaaff;
--item-group-heading-text-color-hover: #f0c2ff;
--item-background-hover: #3a3a55;
--item-shadow: 0 1px 5px 0 #d356ef80;
--item-hover-shadow: 0 1px 8px 0 #d356efa6;
--item-icon-transform: drop-shadow(1px 2px 3px #d356ef80) saturate(1.1);
--item-icon-transform-hover: drop-shadow(1px 2px 4px #d356ef80) saturate(1.1);
}
div.collapsable:nth-child(3n) {
a.item { color: #56e0f0; }
--item-group-shadow: 0 5px 16px 0 #728cff33;
--item-group-heading-text-color: #7feeff;
--item-group-heading-text-color-hover: #a0f5ff;
--item-background-hover: #3a3a55;
--item-shadow: 0 1px 5px 0 #56ddef80;
--item-hover-shadow: 0 1px 8px 0 #56ddefa6;
--item-icon-transform: drop-shadow(1px 2px 3px #56ddef80) saturate(1.1);
--item-icon-transform-hover: drop-shadow(1px 2px 4px #56ddef80) saturate(1.1);
}
}
html[data-theme='cyberpunk'] {
--pink: #ff2a6d;
--pale: #d1f7ff;
@ -1849,6 +1947,88 @@ html[data-theme='neomorphic'] {
}
html[data-theme="night-bat"] {
// Main colors
--primary: #4780ff;
--background: #252931;
--background-darker: #303540;
// Typography
--font-headings: 'Podkova', 'Roboto', serif;
--font-body: 'Roboto', serif;
--heading-text-color: #fff;
// Items
--item-background: #303540;
--item-background-hover: var(--item-background);
--item-shadow: 0px 3px 0px var(--primary), 2px 2px 6px var(--black);
--item-hover-shadow: 0px 20px 0px 0 var(--primary), 2px 2px 6px var(--black);
// Sections
--item-group-heading-text-color: var(--white);
--item-group-heading-text-color-hover: var(--white);
--item-group-shadow: none;
--item-group-background: none;
--item-group-outer-background: none;
// Nav Links
--nav-link-background-color: var(--background);
--nav-link-background-color-hover: var(--background);
--nav-link-border-color: transparent;
--nav-link-border-color-hover: transparent;
--nav-link-shadow: 4px 4px 0px var(--background-darker), -3px 0px 0px var(--primary), 2px 2px 6px var(--black);
--nav-link-shadow-hover: 6px 6px 0px var(--background-darker), -4px 0px 0px var(--primary), 2px 2px 9px var(--black);
// Misc
--curve-factor: 4px;
--curve-factor-navbar: 8px;
--widget-text-color: var(--white);
// Style overrides
label.lbl-toggle h3 { font-size: 1.3rem; font-weight: bold; }
.content-inner { border-top: 1px dashed var(--primary); }
.item.size-large .tile-title p.description { height: 3rem; }
.item, .nav-outer nav .nav-item { border-radius: 1px; }
.item.size-large { margin: 0.5rem; }
// Show outline when collapsed
.is-collapsed {
background: var(--item-background);
box-shadow: var(--item-shadow);
&:hover {
background: var(--item-background-hover);
box-shadow: var(--item-hover-shadow);
}
}
.widget-base {
background: var(--background-darker);
padding: 1rem 0.5rem;
margin: 0.5rem 0;
}
.item-wrapper {
.item-url {
display: block;
opacity: 0;
position: absolute;
bottom: -1.9rem;
font-size: 0.8rem;
color: var(--background);
transition: all 0.2s cubic-bezier(0.8, 0.8, 0.4, 1.4);
}
a {
transition: all 0.2s cubic-bezier(0.8, 0.8, 0.4, 1.4);
height: calc(100% - 1rem);
}
&:hover {
a { height: calc(100% - 2rem); }
.item-icon {
transform: scale(0.9);
}
.item-url {
display: block;
opacity: 1;
}
}
}
}
html[data-theme='cherry-blossom'] {
--primary: #e1e8ee;
--background: #11171d;
@ -1999,7 +2179,7 @@ html[data-theme="tama"] {
// Background Image
body {
//update the query terms after the '?', to customize for images you want
background: url('https://source.unsplash.com/random/1920x1080/?dark,calm,nature,background');
background: url('https://picsum.photos/1920/1080');
background-color: var(--background-darker);
background-size: cover;
}

View File

@ -565,6 +565,11 @@
"title": "OIDC Client Id",
"type": "string",
"description": "ClientId from OIDC provider"
},
"scope" : {
"title": "OIDC Scope",
"type": "string",
"description": "The scope(s) to request from the OIDC provider"
}
}
},
@ -936,7 +941,7 @@
"title": "Icon",
"type": "string",
"nullable": true,
"description": "An icon, either as a font-awesome, simple-icon or mdi identifier, emoji, favicon, generative or the URL/ path to a local or remote icon asset"
"description": "An icon, either as a font-awesome, simple-icon, selfh.st, or mdi identifier, emoji, favicon, generative or the URL/path to a local or remote icon asset"
},
"url": {
"title": "Service URL",

View File

@ -13,14 +13,14 @@ const getAppConfig = () => {
class OidcAuth {
constructor() {
const { auth } = getAppConfig();
const { clientId, endpoint } = auth.oidc;
const { clientId, endpoint, scope } = auth.oidc;
const settings = {
userStore: new WebStorageStateStore({ store: window.localStorage }),
authority: endpoint,
client_id: clientId,
redirect_uri: `${window.location.origin}`,
response_type: 'code',
scope: 'openid profile email roles groups',
scope: scope || 'openid profile email roles groups',
response_mode: 'query',
filterProtocolClaims: true,
};

View File

@ -78,6 +78,7 @@ module.exports = {
'bee',
'tiger',
'glow',
'glow-dark',
'vaporware',
'cyberpunk',
'material-original',
@ -89,6 +90,7 @@ module.exports = {
'tama',
'neomorphic',
'glass-2',
'night-bat',
],
/* Default color options for the theme configurator swatches */
swatches: [
@ -209,6 +211,7 @@ module.exports = {
fa: 'https://kit.fontawesome.com',
mdi: 'https://cdn.jsdelivr.net/npm/@mdi/font@7.0.96/css/materialdesignicons.min.css',
si: 'https://unpkg.com/simple-icons@v7/icons',
sh: 'https://cdn.jsdelivr.net/gh/selfhst/icons@latest/webp/{icon}.webp',
generative: 'https://api.dicebear.com/7.x/identicon/svg?seed={icon}',
generativeFallback: 'https://evatar.io/{icon}',
localPath: './item-icons',
@ -220,7 +223,7 @@ module.exports = {
},
/* API endpoints for widgets that need to fetch external data */
widgetApiEndpoints: {
anonAddy: 'https://app.anonaddy.com',
anonAddy: 'https://app.addy.io',
astronomyPictureOfTheDay: 'https://apod.as93.net/apod',
blacklistCheck: 'https://api.blacklistchecker.com/check',
codeStats: 'https://codestats.net/',
@ -233,17 +236,22 @@ module.exports = {
ethGasHistory: 'https://ethgas.watch/api/gas/trend',
exchangeRates: 'https://v6.exchangerate-api.com/v6/',
flights: 'https://aerodatabox.p.rapidapi.com/flights/airports/icao/',
githubTrending: 'https://gh-trending-repos.herokuapp.com/',
githubTrending: 'https://trend.doforce.xyz/',
hackernewsTrending: 'https://hacker-news.firebaseio.com/v0',
healthChecks: 'https://healthchecks.io/api/v1/checks',
holidays: 'https://kayaposoft.com/enrico/json/v2.0/?action=getHolidaysForDateRange',
jokes: 'https://v2.jokeapi.dev/joke/',
news: 'https://api.currentsapi.services/v1/latest-news',
minecraftPlayerIcon: 'https://mc-heads.net/avatar/',
minecraftPlayerLink: 'https://minecraftuuid.com/?search=',
minecraftServerLink: 'https://mcsrvstat.us/server/',
minecraftStatus: 'https://api.mcsrvstat.us/',
mullvad: 'https://am.i.mullvad.net/json',
mvg: 'https://www.mvg.de/api/fib/v2/',
publicIp: 'https://ipapi.co/json',
publicIp2: 'https://api.ipgeolocation.io/ipgeo',
publicIp3: 'http://ip-api.com/json',
publicIp4: 'https://api.ip2location.io/',
readMeStats: 'https://github-readme-stats.vercel.app/api',
rescueTime: 'https://www.rescuetime.com/anapi/data',
rssToJson: 'https://api.rss2json.com/v1/api.json',
@ -310,7 +318,6 @@ module.exports = {
/* Progressive Web App settings, used by Vue Config */
pwa: {
name: 'Dashy',
manifestPath: './manifest.json',
themeColor: '#00af87',
msTileColor: '#0b1021',
mode: 'production',
@ -318,8 +325,18 @@ module.exports = {
iconPaths: {
favicon64: './web-icons/favicon-64x64.png',
favicon32: './web-icons/favicon-32x32.png',
favicon16: './web-icons/favicon-16x16.png',
maskIcon: './web-icons/dashy-logo.png',
msTileImage: './web-icons/dashy-logo.png',
},
workboxOptions: {
exclude: [
// https://developer.chrome.com/docs/workbox/modules/workbox-build#properties_14
/\.map$/,
/^manifest.*\.js$/, // default value
/\.nojekyll$/,
/\.gitignore$/,
],
},
},
};

View File

@ -24,7 +24,7 @@ import sk from '@/assets/locales/sk.json';
import sl from '@/assets/locales/sl.json';
import sv from '@/assets/locales/sv.json';
import tr from '@/assets/locales/tr.json';
import ua from '@/assets/locales/ua.json';
import uk from '@/assets/locales/uk.json';
import zhCN from '@/assets/locales/zh-CN.json';
import zhTW from '@/assets/locales/zh-TW.json';
import pirate from '@/assets/locales/zz-pirate.json';
@ -184,8 +184,8 @@ export const languages = [
},
{ // Ukrainian
name: 'Ukrainian',
code: 'ua',
locale: ua,
code: 'uk',
locale: uk,
flag: '🇺🇦',
},
{ // Chinese

View File

@ -75,8 +75,9 @@ export default {
},
},
mounted() {
this.setTheme();
this.initiateFontAwesome();
this.initiateMaterialDesignIcons();
this.setTheme();
this.url = this.getInitialUrl();
},
};

View File

@ -1,5 +1,7 @@
{
"compilerOptions": {
"incremental": true,
"tsBuildInfoFile": "/app/.tsbuildinfo",
"target": "esnext",
"module": "esnext",
"strict": false,

View File

@ -96,5 +96,8 @@ module.exports = {
devServer,
chainWebpack: config => {
config.module.rules.delete('svg');
config.cache({
type: 'filesystem',
});
},
};

1753
yarn.lock

File diff suppressed because it is too large Load Diff