Compare commits

...

562 commits

Author SHA1 Message Date
Alicia Sykes
996de036e8
🔀 Merge pull request #1932 from ga-lep/FEATURE/1924_uptime-kuma-status-page-widget
 Add Uptime Kuma Status Page Widget
2025-11-08 21:25:55 +00:00
Alicia Sykes
10d8559ccc
Merge pull request #1947 from pwhelan/custom-search-opening-method
Add opening method option for custom search widget.
2025-11-08 21:25:11 +00:00
Phillip Whelan
1e20f3e72c Document the new openingMethod option for the custom search widget. 2025-11-04 19:21:24 -03:00
Phillip Whelan
1b77917335 Add opening method option for custom search widget. 2025-11-04 19:16:26 -03:00
Alicia Sykes
667feb4d10
Merge pull request #1944 from apgyorfi/i18n/hu-translation
🌐 i18n(hu): add Hungarian translation
2025-10-25 18:17:52 +01:00
Peter Gyorfi
0e325d8ea4
🇭🇺 Add Hungarian language contribution to README 2025-10-23 22:11:40 +02:00
Peter Gyorfi
772026a17f
🇭🇺 Add Hungarian language support 2025-10-23 22:10:14 +02:00
Peter Gyorfi
4d88d1394d
🇭🇺 Create Hungarian localization file
Added Hungarian localization for the application.
2025-10-23 22:08:36 +02:00
Alicia Sykes
8fea366703
🔀 Merge pull request #1940 from rnowotniak/FIX/1939_Flights-widget-issues
Fix Flights.vue widget to work with the current aerodatabox API
2025-10-18 22:31:52 +01:00
Alicia Sykes
e2197049d6
💗 Adds LambdaTest to README.md
Added sponsorship information for LambdaTest and Umbrel.
2025-10-12 22:05:11 +01:00
Robert Nowotniak
7d44e8e7cf
Display Departures/Arrivals only if direction !== arrival/departure
Display Departures if direction = 'departure' or 'both'
Display Arrivals   if direction = 'arrival'   or 'both'
2025-10-12 14:48:36 +02:00
Robert Nowotniak
e00a547d6f
Use .revisedTime.local and .scheduledTime.local
Use .revisedTime.local and .scheduledTime.local instead of
.actualTimeUTC which is no longer present in the API schema.
2025-10-12 14:47:27 +02:00
Galep
cea9b1e23f 📝 Revert linter mess 2025-10-02 19:06:26 +02:00
Galep
4800d3ff10 Add Uptime Kuma Status Page Widget 2025-10-02 17:37:40 +02:00
Alicia Sykes
9c6686376e
⬆️ Merge pull request #1917 from Lissy93/dependabot/npm_and_yarn/axios-1.12.0
Bump axios from 1.7.2 to 1.12.0
2025-09-13 09:16:24 +01:00
dependabot[bot]
53bfb3b255
Bump axios from 1.7.2 to 1.12.0
Bumps [axios](https://github.com/axios/axios) from 1.7.2 to 1.12.0.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.7.2...v1.12.0)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.12.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-13 04:06:02 +00:00
Alicia Sykes
e70ade555f
🔀 Merge pull request #1914 from pedorich-n/oidc-userinfo
fix: Load userInfo in OidcAuth
2025-09-12 15:30:21 +01:00
Nikita Pedorich
9ad6379425
fix: Load userInfo in OidcAuth 2025-09-07 13:04:54 +09:00
Alicia Sykes
3890c5006a
🔀 Merge pull request #1909 from dkadioglu/patch-1
Add Widget for Chuck Norris quotes
2025-08-31 23:36:04 +01:00
dkadioglu
31b7a07078
fix some linting errors in ChuckNorris.vue 2025-08-31 10:04:26 +02:00
dkadioglu
9fc0254cf8
Re-refactor widget keys to remove quotes
Putting those quotes was a mistake, reverting.
2025-08-31 09:47:27 +02:00
dkadioglu
3e728b314b
add documentation for Chuck Norris Widget 2025-08-31 09:12:55 +02:00
dkadioglu
877ec0060d
add widget for Chuck Norris quotes and sort some lines of WidgetBase.vue alphabetically. 2025-08-31 08:38:29 +02:00
Alicia Sykes
c1f27c64b6
🔀 Merge pull request #1892 from casmbu/master
Add v6 versions of Pi-Hole widgets and fix minor bug in Uptime Kuma widget
2025-08-30 21:02:11 +01:00
casmbu
042c5c091c
Merge branch 'Lissy93:master' into master 2025-08-15 08:41:53 -04:00
Alicia Sykes
6e843cfe66
🔀 Merge pull request #1902 from he0119/fix/pwa-runtimeCaching
fix(pwa): should always fetch conf.yml first
2025-08-13 16:23:41 +01:00
Alicia Sykes
cbc93e78be
🔀 Merge pull request #1897 from Lissy93/ref/admin
Ref/admin
2025-08-13 16:22:55 +01:00
Alicia Sykes
1e585b78ad
Merge branch 'master' into ref/admin 2025-08-13 16:22:44 +01:00
uy/sun
d7bd5a6d79 fix(pwa): should always fetch conf.yml first 2025-08-13 00:54:06 +00:00
liss-bot
d453d24ccb 💜 Updates contributors list 2025-08-10 02:30:07 +01:00
Alicia Sykes
15c37eb1d9
🔀 Merge pull request #1890 from AndreasdeReus/patch-1
Fixed spelling in da.json
2025-08-03 14:08:02 +01:00
Alicia Sykes
4e00947322
🔀 Merge pull request #1894 from Alexis-BX/Fix-Oidc-user-islogin-and-admin
Fix OIDC getUser and added admin role and group
2025-08-03 14:05:27 +01:00
Alexis-BX
ac13e546b7 add admin role and group 2025-08-03 02:57:30 -04:00
casmbu
9b32b0ec15 chore: add table of contents item for pi-hole recent traffic v6 and fix pi-hole hyphen 2025-08-02 21:52:33 -04:00
casmbu
894b57937b Merge branch 'master' of https://github.com/casmbu/dashy 2025-08-02 21:49:17 -04:00
casmbu
434a41a08a chore: remove leftover minecraft-status doc 2025-08-02 21:47:28 -04:00
casmbu
99d7768d1c
Merge branch 'Lissy93:master' into master 2025-08-02 21:33:30 -04:00
liss-bot
d4fa31098d 💛 Updates sponsors table 2025-08-03 02:30:41 +01:00
liss-bot
68bffe725f 💜 Updates contributors list 2025-08-03 02:30:39 +01:00
casmbu
8a0ec73ca7 feat: add pi-hole-traffic-v6 widget and docs 2025-08-02 17:13:39 -04:00
casmbu
f738cd2726 chore: add pi-hole-queries-v6 widget docs 2025-08-02 16:43:05 -04:00
casmbu
6641e263de feat: add pi-hole-top-queries-v6 widget 2025-08-02 16:41:42 -04:00
casmbu
78f8f08fe2 chore: minor changes to pi-hole-stats-v6 widget 2025-08-02 16:19:05 -04:00
casmbu
a7a1fbb27f chore: remove duplicated minecraft widget doc 2025-08-02 15:44:18 -04:00
casmbu
da87c76207 chore: add pi-hole-stats-v6 documentation 2025-08-02 15:41:42 -04:00
casmbu
7d5b955526 feat: add pi-hole-stats-v6 widget 2025-08-02 15:29:38 -04:00
casmbu
dcf124e17b bug fix: uptime-kuma widget should be able to use environment variables for its api key 2025-08-02 15:29:04 -04:00
casmbu
97b884d9c4 chore: add minecraft-status widget documentation 2025-08-02 15:27:38 -04:00
Andreas de Reus
f3ff209389
Update da.json
Updated da,json with corrected spelling mistakes
2025-08-02 00:58:39 +02:00
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
Alicia Sykes
3e50636c04 🗑 Remove no-longer needed workflows 2025-07-18 18:55:41 +01:00
Alicia Sykes
8e93475042 ♻ Replace generated contributors with badge instead, cleanner commit history 2025-07-18 18:55:05 +01:00
Alicia Sykes
1ace681a39 🔃 Merge branch 'master' of github.com:lissy93/dashy into ref/admin 2025-07-18 18:33:24 +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
a4ab101b83 📚 Updates image paths for widgets 2025-07-18 06:20:04 +01: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
Alicia Sykes
462d9dbff2
🔖 Bump to 3.1.1 2024-05-25 15:11:58 +01:00
Alicia Sykes
6db97b0f7f
🔀 Merge pull request #1602 from Lissy93/BUILD/repo-docker-tagging
BUILD/ Update taging and release workflows
2024-05-25 15:10:48 +01:00
Alicia Sykes
4474cccf30 🔨 Add a workflow to draft a release when new tag published 2024-05-25 14:59:34 +01:00
Alicia Sykes
17fa29c54f 🔨 Add a workflow to auto tag when new version made 2024-05-25 14:59:12 +01:00
Alicia Sykes
86adcbd8dd 🔨 Update docker workflow, to only publish tag when new 2024-05-25 14:58:43 +01:00
Alicia Sykes
d2b68fbd58 🔨 Add a workflow to auto tag when new version made 2024-05-25 14:58:27 +01:00
Alicia Sykes
abb1730a88 ✏ Update PR template 2024-05-25 14:57:55 +01:00
Alicia Sykes
19b24d96a8
🔀 Merge pull request #1601 from CrazyWolf13/master
📝 Updated multi-page docs
2024-05-24 22:09:59 +01:00
Tobias
c558491bc8 📝 Updated multi-page docs 2024-05-22 22:02:44 +02:00
Alicia Sykes
2337be155c 🐺 Update issue auto-assign 2024-05-21 17:48:39 +01:00
Alicia Sykes
c3b04f60d5 🔀 Merge branch 'master' of github.com:lissy93/dashy 2024-05-21 17:41:06 +01:00
Alicia Sykes
aa6ed69015
🔀 Merge pull request #1595 from CrazyWolf13/master
 Update Glances to API V4
2024-05-21 17:30:25 +01:00
Alicia Sykes
1acc60f95c
Merge branch 'master' into master 2024-05-21 17:29:55 +01:00
github-actions[bot]
c5717814eb
💙 Updates contributor SVG 2024-05-19 01:30:49 +00:00
liss-bot
843a1df862 💛 Updates sponsors table 2024-05-19 01:30:45 +00:00
liss-bot
e7d16478b3 💜 Updates contributors list 2024-05-19 01:30:43 +00:00
Alicia Bot
d4509691bc 💙 Updates contributor SVG 2024-05-19 02:27:43 +01:00
liss-bot
e84133ddd7 💛 Updates sponsors table 2024-05-19 02:27:39 +01:00
liss-bot
2070a17835 💜 Updates contributors list 2024-05-19 02:27:38 +01:00
Tobias
a1721def37 Update Glances to API V4 2024-05-18 16:55:46 +02:00
Alicia Sykes
c92340649e Merge branch 'master' of github.com:lissy93/dashy 2024-05-17 00:05:47 +01:00
Tobias
a768d01dbe
Merge pull request #1581 from CrazyWolf13/master
🧾 [docs](add) keycloak troubleshooting
2024-05-13 22:57:33 +02:00
Tobias
c3b199361c 🧾 [docs](add) keycloak troubleshooting 2024-05-13 22:24:10 +02:00
Alicia Sykes
4b919f8a9b
🔀 Merge pull request #1573 from twsouthwick/oidc
Enable public application OIDC client support
Fixes #823
2024-05-13 21:02:44 +01:00
Alicia Bot
5a88beaf64 💙 Updates contributor SVG 2024-05-12 02:27:43 +01:00
liss-bot
e151729cd8 💛 Updates sponsors table 2024-05-12 02:27:41 +01:00
liss-bot
be9a996928 💜 Updates contributors list 2024-05-12 02:27:39 +01:00
Alicia Sykes
9b60229f14 🐳 Updates build command, to not remove pre-existing dist (#1570) 2024-05-11 15:39:52 +01:00
Alicia Sykes
07dbcccc83 🐛 Fixes iframe widget refresh (#1571) 2024-05-11 15:26:32 +01:00
Alicia Sykes
eea193ae5c
🔀 Merge pull request #1577 from Lissy93/FIX/holiday-widget
[FIX] Date parsing on Safari for the Public Holidays widget
Fixes  #1532
2024-05-10 01:09:13 +01:00
Alicia Sykes
72d2f1bb74 🐛 Fixes (i think) date parsing for Safari users in holidays widget (#1532) 2024-05-10 00:56:30 +01:00
Alicia Sykes
b97ba745a5
🔀 Merge pull request #1576 from Lissy93/FIX/widget-header-auth
[FIX] Auth headers for widgets
Fixes #1549
2024-05-10 00:45:33 +01:00
Alicia Sykes
46e1c2027e 🐛 Fixes auth headers for widgets (#1549) (#1561) 2024-05-10 00:13:59 +01:00
Alicia Sykes
bb9bced18b
🔀 Merge pull request #1575 from twsouthwick/devcontainer
Add devcontainer support
2024-05-09 22:27:38 +01:00
Taylor Southwick
c5f4f17449 Add devcontainer support 2024-05-09 17:13:01 +00:00
Taylor Southwick
b9902e3fa0 Enable public application OIDC client support
This change uses oidc-client-ts to enable dashy to authenticate with as OIDC client. It populates the groups and roles so that it can be used the same as keycloak for showing/hiding elements on the dashboard.
2024-05-09 06:24:36 +00:00
Alicia Bot
93c2c77f6b 💙 Updates contributor SVG 2024-05-05 02:27:14 +01:00
liss-bot
d6af666230 💛 Updates sponsors table 2024-05-05 02:27:10 +01:00
liss-bot
beb262871e 💜 Updates contributors list 2024-05-05 02:27:09 +01:00
Tobias
a7c15ce36f
Merge pull request #1563 from CrazyWolf13/master
🐳 Revert start cmd Dockerfile
2024-05-01 11:38:58 +02:00
Tobias
2f86b16491 temp revert start cmd 2024-05-01 11:33:01 +02: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
Alicia Sykes
5854db4205
🔀 Merge pull request #1423 from stinkybernie/update-simple-icons
Update 'simple-icons' from v7.19.0 to v10.4.0
Fixes #1254
2024-04-29 01:14:24 +01:00
Alicia Sykes
c3aa2b5282
Merge branch 'master' into update-simple-icons 2024-04-29 00:54:02 +01:00
Alicia Sykes
d92ae25700
🔀 Merge pull request #1542 from Lissy93/FEAT/3.0.1-improvements
[FEAT] Clearer error messaging and documented user-data dir (3.0.1)
2024-04-28 22:58:57 +01:00
Alicia Sykes
3fb87fa9b8 🔥 Fix DeepScan warn, by removing obsolete param 2024-04-28 22:27:24 +01:00
Alicia Sykes
b5415ca5b9 💫 Adds explainer, below loading animation 2024-04-28 22:24:35 +01:00
Alicia Sykes
749f3b21da 🛂 Disable config for guests (#1552) 2024-04-28 22:21:51 +01:00
Alicia Sykes
e970fc69c1 🐛 Apply custom headers to fetch request (#1549) 2024-04-28 21:54:16 +01:00
Alicia Sykes
a9c46c362d
🔀 Merge pull request #1524 from zcq100/update-chinese-translate
Update chinese translate
2024-04-28 21:14:03 +01:00
Alicia Sykes
c6f72ad84a
🔀 Merge pull request #1509 from GuilhermeLCS95/master
I added some translations to portuguese in pt.json
2024-04-28 21:07:09 +01:00
Alicia Sykes
31bf46a406
🔀 Merge pull request #1508 from dyauss/master
Translation for gluetun status sentences in pt.json
2024-04-28 21:06:45 +01:00
Alicia Sykes
83059bc536 Merge branch 'master' of github.com:lissy93/dashy into FEAT/3.0.1-improvements 2024-04-28 20:41:23 +01:00
Alicia Sykes
a327bf2349 💫 Increase time between stages on initilization screen 2024-04-28 20:40:57 +01:00
Alicia Sykes
21eb2a604d 🐳 Updates port comment in docker-compose (#1555) 2024-04-28 20:16:15 +01:00
Alicia Sykes
db9d7e362d 🛂 Remove page reload on auth failure (#981) 2024-04-28 20:00:17 +01:00
Alicia Sykes
85de40d950 🛂 Adds option for env vars for passwords 2024-04-28 15:08:05 +01:00
Alicia Sykes
fd421cda15 🛂 Adds option for env vars for passwords 2024-04-28 15:07:48 +01:00
Alicia Sykes
98b3fda407 🔧 Adds new template vars to .env 2024-04-28 15:07:02 +01:00
Alicia Sykes
27f10d76db 🦺 Update schema validation, disable strict for multi options 2024-04-28 15:05:53 +01:00
Alicia Sykes
29626ebb06 🗃 Updates schema to allow for env vars on user passwords 2024-04-28 15:05:01 +01:00
Alicia Bot
f9f365aa3a 💙 Updates contributor SVG 2024-04-28 02:27:13 +01:00
liss-bot
292a46f402 💛 Updates sponsors table 2024-04-28 02:27:07 +01:00
liss-bot
f766e990b9 💜 Updates contributors list 2024-04-28 02:27:05 +01:00
Alicia Sykes
25ba708a9f 📝 Add Umbrel asset 2024-04-27 23:20:22 +01:00
Alicia Sykes
0813b796ab 📝 Documents HTTP authorization 2024-04-27 23:17:43 +01:00
Alicia Sykes
1f6b433148 🛂 Implements HTTP authorization client-side 2024-04-27 23:17:23 +01:00
Alicia Sykes
99643acddf 🛂 Adds support for HTTP authorization 2024-04-27 23:16:56 +01:00
Alicia Sykes
9d683dcbf0 🐛 Fix layout and item size buttons 2024-04-27 15:52:40 +01:00
Alicia Sykes
3416615d30 Merge branch 'FEAT/3.0.1-improvements' of github.com:lissy93/dashy into FEAT/3.0.1-improvements 2024-04-27 01:01:48 +01:00
Alicia Sykes
db63362327 💬 Translate critical error text, and update styles 2024-04-27 00:45:30 +01:00
Alicia Sykes
9e6fb17d93 🥅 Catch error caused by empty config 2024-04-27 00:32:01 +01:00
Alicia Sykes
4594c99b57 🐛 Fix collapse state persistence (#1546) 2024-04-26 00:29:35 +01:00
Alicia Sykes
f77c192e66
📝 Switch Umbrel asset 2024-04-24 11:05:08 +01:00
Alicia Sykes
ca96e0c1de
📝 Adds Umbrel sponsor link 2024-04-23 22:25:44 +01:00
Alicia Sykes
1bbb91b3fe 🐳 Change start command in Dockerfile (#1543) 2024-04-22 12:40:46 +01:00
Alicia Sykes
d58cde69f6 🐛 Fix page title not being applied (#1544) 2024-04-22 12:25:09 +01:00
Alicia Sykes
f68d65264c 🤖 Remove star reminder automation (#1412) 2024-04-21 23:37:03 +01:00
Alicia Sykes
27bbdef6df 🔖 Bump to 3.0.1 2024-04-21 22:33:49 +01:00
Alicia Sykes
94307da70b 🗑 Deleted old img folder 2024-04-21 22:33:24 +01:00
Alicia Sykes
d34c4b55f5 💄 Adds another shade of white 2024-04-21 22:30:41 +01:00
Alicia Sykes
915a5dfd38 🥅 Also catch error for sub-pages 2024-04-21 22:30:11 +01:00
Alicia Sykes
be513a0952 Shows error details, if a critical error happens 2024-04-21 22:29:32 +01:00
Alicia Sykes
2ce3b29ad2 👔 Adds logic to show dialog on critical error 2024-04-21 22:28:50 +01:00
Alicia Sykes
a138602670 📝 Clearer docs for user-data directory (#1538) 2024-04-21 21:39:14 +01:00
Alicia Sykes
ecef01b034 🥅 Better error handling when config cannot be found 2024-04-21 14:46:38 +01:00
Alicia Sykes
f295958c44 Put config backups in own directory 2024-04-21 14:45:52 +01:00
Alicia Bot
382f8f3ec0 💙 Updates contributor SVG 2024-04-21 02:26:38 +01:00
liss-bot
1e72debe5f 💛 Updates sponsors table 2024-04-21 02:26:32 +01:00
liss-bot
54a00ee099 💜 Updates contributors list 2024-04-21 02:26:30 +01:00
Alicia Sykes
fa6d1925b7 🚸 Makes GitHub cards hyperlinks (fixes #1531) 2024-04-20 21:47:51 +01:00
Alicia Sykes
931915f366
🔀 Merge pull request #1528 from Lissy93/FEAT/Dashy-V3
[FEAT] Remove the need for rebuild after config changes
2024-04-20 12:07:26 +01:00
Alicia Sykes
ff2be31df4 📝 Add update note to README 2024-04-20 12:06:13 +01:00
Alicia Sykes
f1867d3cc0 🔨 Update automations 2024-04-20 12:05:52 +01:00
Alicia Sykes
d043c21264 🔧 Fix dup bool check in webpack config 2024-04-20 11:25:36 +01:00
Alicia Sykes
7f011878b4 Copy static files, when running on Vercel, Netlify, etc 2024-04-19 23:09:41 +01:00
Alicia Sykes
6a6fcd4be9 Set IS_SERVER 2024-04-18 23:08:50 +01:00
Alicia Sykes
b711f77cf7 🔧 For CDN hosting, ensure user-data is coppied over during build 2024-04-16 21:47:12 +01:00
Alicia Sykes
c1f23d2fce 📝 Update port number in docs 2024-04-16 21:24:57 +01:00
Alicia Sykes
23576873de 📝 Update docs for V3 2024-04-16 17:00:22 +01:00
Alicia Sykes
3c9e5bd369 Less confusing handling of local config 2024-04-16 16:50:06 +01:00
Alicia Sykes
c456bd6bd6 🔥 Remove now obsolete code 2024-04-15 21:46:30 +01:00
Alicia Sykes
133718972d 💬 Update en text about rebuild 2024-04-15 21:46:10 +01:00
Alicia Sykes
a82d10a0c8 💬 Update en text about rebuild 2024-04-15 21:46:02 +01:00
Alicia Sykes
f353780ad4 Update widget mixin to use fetch instead of axios 2024-04-15 21:43:49 +01:00
Alicia Sykes
88498d3887 Reordered endpoint priority in server entrypoint 2024-04-15 21:08:56 +01:00
Alicia Sykes
25e774ca79 🔒 Enables sensetive data to be passed by env var 2024-04-14 20:50:03 +01:00
Alicia Sykes
75f65de8f6 Updates parseAsEnvVar to read env vars for widget API keys 2024-04-14 20:49:32 +01:00
Alicia Sykes
27a8c8fa56
🔀 Merge pull request #1438 from zigotica/FEATURE/environment-variables
 Feature: add user defined environment variables
2024-04-14 18:22:49 +01:00
Alicia Sykes
f98441644b
Merge branch 'FEAT/Dashy-V3' into FEATURE/environment-variables 2024-04-14 18:22:28 +01:00
Alicia Sykes
ca0ec003e7
Merge branch 'master' into FEAT/Dashy-V3 2024-04-14 14:12:40 +01:00
Alicia Bot
6f94ac8764 💙 Makes author list 2024-04-14 02:30:26 +01:00
liss-bot
edf2eb8c98 💛 Updates sponsors table 2024-04-14 02:30:02 +01:00
liss-bot
6623127702 💜 Updates contributors list 2024-04-14 02:30:00 +01:00
Alicia Sykes
ae8357fa6e 🐳 Remove rm dist/config, no longer needed 2024-04-13 14:40:11 +01:00
Alicia Sykes
5214583ad0 ⬆ Update dependencies 2024-04-13 14:09:42 +01:00
Alicia Sykes
77236779c8 🔨 Remove asset size warning 2024-04-13 14:07:06 +01:00
Alicia Sykes
bbb9ce7272 Better spacing in print-message service 2024-04-13 14:06:33 +01:00
Alicia Sykes
4ea77a1015 🐛 Fix config not saving from JSON editor 2024-04-13 14:05:49 +01:00
Alicia Sykes
91e4cfe14d 📝 Update port and directory in readme 2024-04-13 12:43:18 +01:00
Alicia Sykes
e1a95405c1 🗑 Remove watch-for-changes script, no longer needed 2024-04-13 12:42:51 +01:00
Alicia Sykes
5b11c0af34 📝 Update port and directory in docs 2024-04-13 12:41:15 +01:00
Alicia Sykes
4d851b6e86 Lint and port update 2024-04-13 12:35:21 +01:00
Alicia Sykes
7f45c29931 🔨 Setup Typescript 2024-04-13 12:33:16 +01:00
Alicia Sykes
a6381a4a7e 🐳 Update options and port for Dockerfile 2024-04-13 12:32:17 +01:00
Alicia Sykes
743b5340f8 Minor fixes/adjustments 2024-04-13 12:25:50 +01:00
Alicia Sykes
0a56db5397 🔥 Local saving for multi-page full working 2024-04-13 12:17:40 +01:00
Alicia Sykes
016b6dff09 🎨 Adds glass theme 2024-04-12 20:17:18 +01:00
Alicia Sykes
b66ce53669 📡 Make user-data directory configurable 2024-04-10 22:59:35 +01:00
Alicia Sykes
a32e76935e 🗑 Delete test asset 2024-04-10 21:45:13 +01:00
Alicia Sykes
c1c75f78ba 🗑 Remove commented out code 2024-04-10 21:44:55 +01:00
Alicia Sykes
ee735fe342 🔒 Add missing null checks 2024-04-09 20:39:48 +01:00
Alicia Sykes
49eb262465 Makes config location user-configurable 2024-04-09 20:35:25 +01:00
Alicia Sykes
6fa782d6a8 📝 Sync upstream docs 2024-04-09 14:03:02 +01:00
Alicia Sykes
2e38a33fa7 🔂 Resolve conflicts 2024-04-09 14:02:40 +01:00
Alicia Sykes
c6ab08f7f0 🔖 Bump to V3.0.0, and update start command, so no watch needed 2024-04-08 20:38:19 +01:00
Alicia Sykes
a1bf7a6931 New state options for sub-config 2024-04-08 20:37:33 +01:00
Alicia Sykes
31b40e60f6 🚨 Fix lint warn, by removing console.log 2024-04-08 20:37:09 +01:00
Alicia Sykes
18e2338735 🚨 Fix linter warning 2024-04-08 20:36:35 +01:00
Alicia Sykes
fd45aa6bd1 🚚 Update path to config file 2024-04-08 20:36:00 +01:00
Alicia Sykes
5f6aadcb95 Adds mutations for setting sub-config 2024-04-08 20:34:16 +01:00
Alicia Bot
d77045bee1 💙 Makes author list 2024-04-07 02:26:38 +01:00
liss-bot
b97c48bc35 💛 Updates sponsors table 2024-04-07 02:26:18 +01:00
liss-bot
7cde9fea34 💜 Updates contributors list 2024-04-07 02:26:17 +01:00
Alicia Sykes
e2e581de59 Adds new template variables 2024-04-02 19:28:22 +01:00
Alicia Sykes
492bddd192 🗑 Delete .yarn/cache 2024-04-01 13:40:12 +01:00
Alicia Sykes
6547452d1d 💀 Delete old conf.yml 2024-04-01 13:38:50 +01:00
Alicia Sykes
61127b046b ⚰ Remove old footer text 2024-04-01 13:38:32 +01:00
Alicia Sykes
ecacd145e0 👷 Config for Vue dev server, to use user-data 2024-04-01 13:38:04 +01:00
Alicia Sykes
a9548fe8f4 🍱 user-data is the new assets directory 2024-04-01 13:37:26 +01:00
Alicia Sykes
e219296d15 🔂 Merge master into feat 2024-03-31 09:30:36 +01:00
Alicia Bot
c24d169511 💙 Makes author list 2024-03-31 02:26:36 +01:00
Alicia Bot
a3e703aa8e 💙 Updates contributor SVG 2024-03-31 02:26:21 +01:00
liss-bot
c4d7e4907a 💛 Updates sponsors table 2024-03-31 02:26:21 +01:00
liss-bot
62779c1668 💜 Updates contributors list 2024-03-31 02:26:18 +01:00
Alicia Sykes
041e5d8c28 🔂 Merge master into branch 2024-03-30 21:35:46 +00:00
r1a
07391dd4d1
Update chinese translate 2024-03-28 10:04:43 +08:00
Alicia Sykes
5d26f8a607
🔀 Merge pull request #1521 from z3r0l1nk/master
🇷🇴 Romanian translation
2024-03-27 09:56:56 +00:00
Mihai
8656606d46
Update languages.js 2024-03-27 10:08:05 +02:00
Alicia Sykes
60fc852255
🔀 Merge pull request #1510 from Lissy93/FIX/memory-issues-1500
[FIX] Memory issue (WIP)
2024-03-26 18:58:43 +00:00
z3r0l1nk
12d07fd301 🇷🇴 Romanian translation 2024-03-25 11:42:42 +02:00
z3r0l1nk
b6ac9ff909 🇷🇴 Romanian translation 2024-03-25 11:41:11 +02:00
Mihai
f94ef50b99
Create ro.json 2024-03-25 11:10:43 +02:00
Alicia Bot
0618aaa93e 💙 Makes author list 2024-03-24 01:26:16 +00:00
liss-bot
594beeb5b0 💛 Updates sponsors table 2024-03-24 01:26:04 +00:00
liss-bot
2636d54cc9 💜 Updates contributors list 2024-03-24 01:26:03 +00:00
Alicia Bot
99a2153e9a 💙 Makes author list 2024-03-17 01:25:07 +00:00
liss-bot
dcf1107dae 💛 Updates sponsors table 2024-03-17 01:24:52 +00:00
liss-bot
b213fa1e18 💜 Updates contributors list 2024-03-17 01:24:51 +00:00
Alicia Sykes
6268584741 🔨 Update build-and-start command 2024-03-14 05:50:19 +00:00
GuilhermeLCS
b2e5597e49 I added some translations to portuguese in pt.json 2024-03-13 22:05:43 -03:00
GuilhermeLCS
ee3e45a56e I added some portuguese translations in pt.json 2024-03-13 21:32:48 -03:00
Dyauss
b55b7f7778 Translation for gluetun status sentences 2024-03-13 21:32:02 -03:00
Alicia Sykes
762c6789b1 🤖 Re-enables docs site build automation 2024-03-10 21:31:08 +00:00
Alicia Sykes
2ca71efa29 🤖 Re-enables docs site build automation 2024-03-10 21:30:22 +00:00
Alicia Sykes
a6960a804f
🔀 Merge pull request #1505 from CrazyWolf13/master
Fixed typo's in uptime-kuma docs
2024-03-10 21:26:05 +00:00
Tobias
e3f6609b52
Fixed a ")" to much 2024-03-10 22:08:33 +01:00
Tobias
e7fbc5c690
Typo in uptime-kuma link 2024-03-10 22:05:18 +01:00
Alicia Sykes
6dd18dfca2 🗑 Removal of domain check (.to domains no longer support full WHOIS) 2024-03-10 16:04:50 +00:00
Alicia Bot
129c6d71de 💙 Makes author list 2024-03-10 01:25:03 +00:00
Alicia Bot
ae68f8cddb 💙 Updates contributor SVG 2024-03-10 01:24:55 +00:00
liss-bot
fa48ec83b2 💛 Updates sponsors table 2024-03-10 01:24:50 +00:00
liss-bot
2981a677a5 💜 Updates contributors list 2024-03-10 01:24:49 +00:00
Alicia Sykes
8371218c73
🔀 Merge pull request #1501 from imjimmeh/feat/uptime-kuma-widget
feat(widgets):  Add Uptime Kuma Widget
2024-03-09 22:09:22 +00:00
Alicia Sykes
828f25de37
📝 Adds latest commit (re proxmox) back in 2024-03-09 22:08:08 +00:00
Jimmeh
c93c041858 chore: undo auto formatting 2024-03-07 23:05:31 +00:00
Alicia Sykes
1eed8e5313 🔨 Submits workflow path fix for docs site sync 2024-03-07 18:35:03 +00:00
Alicia Sykes
c2368e1af2
🔀 Merge pull request #1502 from Lissy93/FEAT/automate-documentation-site-update
[FEAT] Adds a GH workflow automation to sync docs to docs site
2024-03-07 18:12:00 +00:00
Alicia Sykes
2de5c8fef5
🔨 Updates automation for syncing website 2024-03-06 22:35:35 +00:00
Alicia Sykes
b1892d8c32
🔀 Merge pull request #1497 from CrazyWolf13/master
Add MNDashboard by mahrnet
2024-03-06 22:32:50 +00:00
Alicia Sykes
8a76fc8e34
🖼️ Updated img to higher-def version 2024-03-06 22:32:33 +00:00
Alicia Sykes
0229ad6a76 🔨 Adds a GH workflow automation to sync docs to docs site 2024-03-06 22:15:09 +00:00
Alicia Sykes
02bdbb3dc1 📝 Small docs update 2024-03-06 21:58:54 +00:00
Jimmeh
f62f628805 chore: undo more formatting 2024-03-06 19:14:42 +00:00
Jimmeh
4471e316ff chore: Undo accidental formattnig 2024-03-06 19:11:17 +00:00
Jimmeh
98ed7d1190 chore: Linting changes 2024-03-06 19:06:28 +00:00
Jimmeh
59a52c652b docs: Add Uptime Kuma widget to docs 2024-03-06 18:58:53 +00:00
Jimmeh
f304cbc74f feat: finish styling, fix errors 2024-03-06 18:58:42 +00:00
Jimmeh
e8845d90e3 feat: stylings 2024-03-05 19:58:33 +00:00
Jimmeh
6f937fbe00 feat(widgets): Uptime Kuma widget 2024-03-05 19:29:35 +00:00
Tobias
631883a0d8
typo 2024-03-05 07:01:59 +01:00
Tobias
3f11b0024c
Added MNDashboard by mahrnet 2024-03-05 07:01:16 +01:00
Alicia Sykes
3c5531dcd1
🔀 Merge pull request #1496 from Lissy93/FIX/rebuild-loop
🚑 Hotfix: Use chokidar to watch only for conf.yml changes
2024-03-04 22:17:56 +00:00
Alicia Sykes
147016278a Auto-rebuild script done, with debounce and term logging 2024-03-04 21:29:53 +00:00
Alicia Sykes
1f6bb48463 Implement debounce, to stop dup rebuild when file meta changes in Linux 2024-03-04 20:21:33 +00:00
Alicia Sykes
a6a2ee232a 🧱 Writes script to watch for changes and trigger re-build 2024-03-04 20:07:34 +00:00
Alicia Sykes
1ed49c3340 🚑 Hotfix: Use chokidar to watch only for conf.yml changes 2024-03-04 19:34:35 +00:00
Alicia Sykes
aef7f785ef
🔀 Merge pull request #1492 from Lissy93/FIX/docker-arm-v7
[FIX] 🐳 Adds back Docker arm/v7 support
2024-03-04 15:16:02 +00:00
Alicia Sykes
427e46a702 Neaten build environment options in Netlify config 2024-03-04 15:13:31 +00:00
Alicia Sykes
da12eb65a0 Sets YARN_FLAGS in Netlify config 2024-03-04 13:58:00 +00:00
Alicia Sykes
08e6bc6c27 Update Node version for Netlify deployments 2024-03-04 13:47:15 +00:00
Alicia Sykes
4886e97f2c Remove NODE_OPTIONS from build command, fix Netlify 2024-03-04 13:40:03 +00:00
Alicia Sykes
0d79fcf8a5 🐳 Fix Docker arm/v7 support 2024-03-04 13:00:17 +00:00
Jimmeh
777b2a1319 wip: initial widget 2024-03-03 22:10:46 +00:00
Alicia Sykes
2caec6a8a9 🏗 Adds linux/arm/v7 support 2024-03-03 21:23:03 +00:00
Alicia Sykes
472932806d 🏗 Remove verbose logging, support linux/amd64,linux/arm64 architectures 2024-03-03 21:07:56 +00:00
Alicia Sykes
70651b75f7 🏗 Restricts network concurency to 1 thread, and adds verbose logging to installation command 2024-03-03 20:51:35 +00:00
Alicia Sykes
5600d26d5e 🏗 Remove docker driver 2024-03-03 20:32:14 +00:00
Alicia Sykes
124e86e407 🏗 Re-add arm/v7, set driver type to Docker, no-cache 2024-03-03 20:29:25 +00:00
Alicia Sykes
0abc2584bd 🏗 Temp remove arm/v7 2024-03-03 20:24:59 +00:00
Alicia Sykes
502d34e460 🏗 Updates path to Dockerfile 2024-03-03 20:21:40 +00:00
Alicia Sykes
02923fa64c 🏗 Adds --immutable to yarn installation 2024-03-03 19:24:23 +00:00
Alicia Sykes
dbb750d306 🏗 Revert to yarn for package installation 2024-03-03 19:03:17 +00:00
Alicia Sykes
0a8df26914 🏗 Docker container uses npm for install 2024-03-03 19:02:02 +00:00
Alicia Sykes
4fdfb6ecc1 Add yarn cache clean, to remove un-needed cached files 2024-03-03 17:46:09 +00:00
Alicia Sykes
d25a80dd48 Add --no-cache to reduce Docker container size 2024-03-03 17:44:36 +00:00
Alicia Sykes
47762390d4 Decrease network timeout 2024-03-03 17:18:35 +00:00
Alicia Sykes
e290451040 🚑 Update start command 2024-03-03 16:53:01 +00:00
Alicia Sykes
453f15c8d9 🧵 Temp updates to arm/v7 to get docker publish working 2024-03-03 16:42:58 +00:00
Alicia Sykes
5a029afb52 🔂 Trigger rebuild 2024-03-03 16:31:47 +00:00
zigotica
e818c701b8 🔖 v2.2.0 2024-01-15 18:54:20 +01:00
zigotica
19da2ec829 Add env vars parser to avoid leaking secrets 2024-01-15 18:45:40 +01:00
Michael D
69caa99c90 ⬆️ - Updated 'simple-icons' from v7.19.0 to v10.4.0 and update API calls 2023-12-29 11:59:59 -08:00
Alicia Sykes
2d350ae7f2
🔀 Merge pull request #1390 from toddejohnson/REFACTOR/2.1.2_unified-config
Attempt at adding header auth. Ignore Settings #981
2023-12-17 21:30:43 +00:00
Todd E Johnson
821ed3433b Add Proxy IP check for header security 2023-11-24 00:11:04 -06:00
Todd E Johnson
756d640d06 Untested documentation for headerAuth 2023-11-23 23:51:36 -06:00
Todd E Johnson
27dfe6219a Make userHeader pull from config 2023-11-23 00:02:08 -06:00
Todd E Johnson
4aa34f66dc WIP: Attempt at adding header auth. Ignore Settings #981 2023-11-17 00:00:48 -06:00
Alicia Sykes
4813d49e42 ⤴ Rebased from master 2023-06-11 11:30:55 +01:00
Alicia Sykes
c0836acc5e 😆 Change order of served up files, fixes everything :) 2022-09-25 19:44:40 +01:00
Alicia Sykes
cdf1bb9529 🚧 WIP 2022-08-19 10:04:38 +01:00
Alicia Sykes
8f893c36d7 Removed config dependency from searchbar 2022-08-14 20:32:23 +01:00
Alicia Sykes
c9cd395313 🔀 Rebase from master 2022-08-06 18:53:48 +01:00
Alicia Sykes
18f6e4d268 🚚 Re-writes all theming functionality. Much better now :) 2022-08-06 18:52:54 +01:00
Alicia Sykes
0523c1933e 👔 Updates logic for theming 2022-07-31 13:39:25 +01:00
Alicia Sykes
8eb08143be 😑 Neatens store. ihml 2022-07-28 21:10:33 +01:00
Alicia Sykes
b0c52b53c9 🚚 Neaten footer code 2022-07-24 14:43:40 +01:00
Alicia Sykes
d25de1147c 🔀 Merge branch 'master' of github.com:Lissy93/dashy into REFACTOR/2.1.2_unified-config 2022-07-24 14:29:26 +01:00
Alicia Sykes
8588ba5772 🔀 Merge branch 'master' of github.com:Lissy93/dashy into REFACTOR/2.1.2_unified-config 2022-07-23 21:45:19 +01:00
Alicia Sykes
efa49a5b25 Merge branch 'master' of github.com:Lissy93/dashy into REFACTOR/2.1.2_unified-config 2022-07-21 22:47:04 +01:00
Alicia Sykes
88568e8435 Merge branch 'master' of github.com:Lissy93/dashy into REFACTOR/2.1.2_unified-config 2022-07-19 13:16:01 +01:00
Alicia Sykes
deb055b9bc 🚧 Fetch use root config in store (#799) 2022-07-16 16:39:27 +01:00
Alicia Sykes
6be38b9f58 Work in progress, config re-write (#799) 2022-07-15 20:03:55 +01:00
172 changed files with 9732 additions and 4640 deletions

View file

@ -0,0 +1,36 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/javascript-node
{
"name": "Dashy",
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
"image": "mcr.microsoft.com/devcontainers/javascript-node:1-18-bullseye",
"customizations": {
"vscode": {
"extensions": [
"Vue.volar",
"dbaeumer.vscode-eslint",
"ms-azuretools.vscode-docker",
"ms-edgedevtools.vscode-edge-devtools",
"firefox-devtools.vscode-firefox-debug",
"aaravb.chrome-extension-developer-tools"
]
}
},
// Features to add to the dev container. More info: https://containers.dev/features.
"features": {
"ghcr.io/devcontainers/features/github-cli:1": {}
},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created.
"postCreateCommand": "yarn install --ignore-engines --immutable --no-cache --network-timeout 300000 --network-concurrency 1"
// Configure tool-specific properties.
// "customizations": {},
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root"
}

110
.env
View file

@ -1,40 +1,70 @@
# Store environmental variables here. All variables are optional.
# Lines beginning in '#' are ignored.
# Can be either development, production or test
# NODE_ENV=production
# The port to expose the running application on
# PORT=4000
# If you've proved SSL certs, then can set HTTPS port
# SSL_PORT=4001
# The host that Dashy is running on, domain or IP
# HOST=localhost
# The default base path for serving up static assets
# BASE_URL=./
# Optionally, specify the path of SSL private + public keys
# SSL_PRIV_KEY_PATH=/etc/ssl/certs/dashy-priv.key
# SSL_PUB_KEY_PATH=/etc/ssl/certs/dashy-pub.pem
# If SSL enabled, choose whether or not to redirect http to https
# Defaults to true
# REDIRECT_HTTPS=true
# Usually the same as BASE_URL, but accessible in frontend
# VUE_APP_DOMAIN=https://dashy.to
# Should enable SRI for build script and link resources
# INTEGRITY=true
# Computed automatically on build. Indicates if running in container
# IS_DOCKER=true
# Again, set automatically using package.json during build time
# VUE_APP_VERSION=2.0.0
# Directory for conf.yml backups
# BACKUP_DIR=./public/
# Store environmental variables here. All variables are optional.
# Lines beginning in '#' are ignored.
# Can be either development, production or test
# NODE_ENV=production
# The port to expose the running application on
# PORT=4000
# If you've proved SSL certs, then can set HTTPS port
# SSL_PORT=4001
# The host that Dashy is running on, domain or IP
# HOST=localhost
# The default base path for serving up static assets
# BASE_URL=./
# Optionally, specify the path of SSL private + public keys
# SSL_PRIV_KEY_PATH=/etc/ssl/certs/dashy-priv.key
# SSL_PUB_KEY_PATH=/etc/ssl/certs/dashy-pub.pem
# If SSL enabled, choose whether or not to redirect http to https
# Defaults to true
# REDIRECT_HTTPS=true
# The path to the user data directory
# USER_DATA_DIR=user-data
# Enable HTTP basic auth to protect your *.yml config files
# ENABLE_HTTP_AUTH=true
# Enable basic HTTP auth to protect your *.yml config files
# BASIC_AUTH_USERNAME
# BASIC_AUTH_PASSWORD
# If you'd like frontend to automatically authenticate when basic auth enabled, set credentials here too
# VUE_APP_BASIC_AUTH_USERNAME
# VUE_APP_BASIC_AUTH_PASSWORD
# Override where the path to the configuration file is, can be a remote URL
# VUE_APP_CONFIG_PATH=/conf.yml
# Usually the same as BASE_URL, but accessible in frontend
# VUE_APP_DOMAIN=https://dashy.to
# Override the page title for the frontend app
# VUE_APP_TITLE=''
# Set the default view to load on startup (can be `minimal`, `workspace` or `home`)
# VUE_APP_STARTING_VIEW=home
# Set the Vue app routing mode (can be 'hash', 'history' or 'abstract')
# VUE_APP_ROUTING_MODE=history
# Should enable SRI for build script and link resources
# INTEGRITY=true
# Computed automatically on build. Indicates if running in container
# IS_DOCKER=true
# Again, set automatically using package.json during build time
# VUE_APP_VERSION=2.0.0
# Directory for conf.yml backups
# BACKUP_DIR=./user-data/config-backups
# Setup any other user defined vars by prepending VUE_APP_ to the var name
# VUE_APP_pihole_ip=http://your.pihole.ip
# VUE_APP_pihole_key=your_pihole_secret_key

24
.github/AUTHORS.txt vendored
View file

@ -94,6 +94,7 @@ Brendan O&#39;Leary <boleary@gitlab.com> - 2 commits
CHAIYEON CHO <stoutcho21@gmail.com> - 2 commits
Dan Gilbert <ddg@daentech.co.uk> - 2 commits
Denis Savosin <dsavosin@at-consulting.ru> - 2 commits
Mihai <31653632+z3r0l1nk@users.noreply.github.com> - 2 commits
Ruben Silva <rubensilva945@gmail.com> - 2 commits
Tammes Burghard <kde@kuchenmampfer.de> - 2 commits
Thomas Dissert <dissertthomas@gmail.com> - 2 commits
@ -108,6 +109,7 @@ patrickheeney <patrickheeney@gmail.com> - 2 commits
rokiden <cheto@bk.ru> - 2 commits
root <root@dashy-dev.alayham.com> - 2 commits
rtm516 <rtm516@users.noreply.github.com> - 2 commits
z3r0l1nk <stroescu.mihai@gmail.com> - 2 commits
zcq100 <m@zcq100.com> - 2 commits
ᗪєνιη ᗷυнʟ <onedr0p@users.noreply.github.com> - 2 commits
Alucarddelta <dreyer.brent@gmail.com> - 3 commits
@ -132,17 +134,19 @@ Alicie <gh@d0h.co> - 5 commits
Benjamin Montgomery <bmontgom@montynet.org> - 5 commits
Chris Nielsen <nielsen.chris@gmail.com> - 5 commits
UrekD <urek.denis@gmail.com> - 5 commits
dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - 5 commits
Erik Vroon <erik.vroon22@gmail.com> - 6 commits
Jammo2k5 <jammo2k5@hotmail.co.uk> - 6 commits
Leonardo Covarrubias <leos@leocov.com> - 6 commits
Magnus Sundström <kmvsundstrom@gmail.com> - 6 commits
dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - 6 commits
kristian <kristianbrasel@gmail.com> - 6 commits
liss-bot <liss-bot@users.noreply.github.com> - 6 commits
Josua Blejeru <josua@blejeru.com> - 8 commits
Tobias <96661824+CrazyWolf13@users.noreply.github.com> - 8 commits
Tobias <tobias.meier109@gmail.com> - 8 commits
Jimmeh <jimmeh@gmail.com> - 9 commits
Kashif Sohail <kashif.ezone@gmail.com> - 9 commits
Liss-Bot <liss-bot@d0h.co> - 11 commits
Tobias <96661824+CrazyWolf13@users.noreply.github.com> - 12 commits
Alejandro Pinar Ruiz <alejandropinarruiz@gmail.com> - 14 commits
Alicia Sykes <&#x3D;> - 16 commits
github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> - 16 commits
@ -150,14 +154,14 @@ snyk-bot <snyk-bot@users.noreply.github.com> - 18 commits
Matthias Bilger <matthias@bilger.info> - 19 commits
aterox <church.kennetha@gmail.com> - 19 commits
EVOTk <45015615+EVOTk@users.noreply.github.com> - 24 commits
snyk-bot <snyk-bot@snyk.io> - 24 commits
Marcell Fülöp <marekful@protonmail.com> - 27 commits
Alicia Sykes <alicia@futr.ai> - 28 commits
Lissy93 <gh@d0h.co> - 78 commits
snyk-bot <snyk-bot@snyk.io> - 83 commits
repo-visualizer <repo-visualizer@users.noreply.github.com> - 127 commits
Lissy93 <Lissy93@users.noreply.github.com> - 219 commits
Alicia Bot <87835202+liss-bot@users.noreply.github.com> - 231 commits
liss-bot <liss-bot@d0h.co> - 232 commits
Alicia Sykes <alicia@omg.lol> - 412 commits
Alicia Sykes <gh@d0h.co> - 440 commits
Alicia Sykes <sykes.alicia@gmail.com> - 1488 commits
repo-visualizer <repo-visualizer@users.noreply.github.com> - 128 commits
Lissy93 <Lissy93@users.noreply.github.com> - 222 commits
Alicia Bot <87835202+liss-bot@users.noreply.github.com> - 240 commits
liss-bot <liss-bot@d0h.co> - 244 commits
Alicia Sykes <gh@d0h.co> - 439 commits
Alicia Sykes <alicia@omg.lol> - 471 commits
Alicia Sykes <sykes.alicia@gmail.com> - 1488 commits

View file

@ -3,7 +3,7 @@ description: Report something that's not working the way it's (probably) intende
title: '[BUG] <title>'
labels: ['🐛 Bug']
assignees:
- lissy93
- Lissy93
body:
- type: dropdown
id: environment

View file

@ -2,6 +2,8 @@ name: Feature Request ✨
description: Suggest an idea for future development of Dashy
title: '[FEATURE_REQUEST] <title>'
labels: ['🦄 Feature Request']
assignees:
- Lissy93
body:
@ -59,4 +61,4 @@ body:
Please note that there is no guarantee that your idea will be implemented
If you haven't already done so, please Star the Dashy's repository on GitHub, to help other users discover it
validations:
required: false
required: false

View file

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

View file

@ -2,6 +2,8 @@ name: Add your Dashboard to the Showcase 🌟
description: Share a screenshot of your dashboard to the Readme showcase!
title: '[SHOWCASE] <title>'
labels: ['💯 Showcase']
assignees:
- lissy93
body:
# 1 - Title
@ -55,4 +57,4 @@ body:
## That's It!
Thanks for sharing your dashboard :) You will receive an update to this ticket once it's added to the showcase
validations:
required: false
required: false

12
.github/dependabot.yml vendored Normal file
View file

@ -0,0 +1,12 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for more information:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
# https://containers.dev/guide/dependabot
version: 2
updates:
- package-ecosystem: "devcontainers"
directory: "/"
schedule:
interval: weekly

View file

@ -1,4 +1,7 @@
*Thank you for contributing to Dashy! So that your PR can be handled effectively, please populate the following fields (delete sections that are not applicable)*
<!--
Thank you for contributing to Dashy!
So that your PR can be handled effectively, please populate the following fields
-->
**Category**:
> One of: Bugfix / Feature / Code style update / Refactoring Only / Build related changes / Documentation / Other (please specify)
@ -20,5 +23,5 @@
- [ ] There are no (new) build warnings or errors
- [ ] _(If a new config option is added)_ Attribute is outlined in the schema and documented
- [ ] _(If a new dependency is added)_ Package is essential, and has been checked out for security or performance
- [ ] Bumps version, if new feature added
- [ ] _(If significant change)_ Bumps version in package.json

View file

@ -1,27 +0,0 @@
# Based on a label applied to an issue, the bot will add a comment with some additional info
name: 🎯 Auto-Reply to Labeled Tickets
on:
issues:
types:
- labeled
- unlabeled
pull_request_target:
types:
- labeled
- unlabeled
permissions:
contents: read
issues: write
pull-requests: write
jobs:
comment:
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Label Commenter
uses: peaceiris/actions-label-commenter@v1
with:
config_file: .github/issue-auto-comments.yml
github_token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}

View file

@ -1,43 +0,0 @@
# Creates a new tag, whenever the app version (in package.json) is updated in master
# And marks any relevant issues as fixed
name: 🏗️ Release Tag new Versions
on:
push:
branches:
- master
jobs:
tag-pre-release:
runs-on: ubuntu-latest
permissions:
contents: write
outputs:
tag: ${{ steps.autotag.outputs.tagname }}
steps:
- uses: actions/checkout@v2
- uses: butlerlogic/action-autotag@stable
id: autotag
with:
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
strategy: package
commit_message_template: "🔖 {{number}} {{message}} (by {{author}})\nSHA: {{sha}}\n."
github-release:
runs-on: ubuntu-latest
needs: tag-pre-release
if: ${{ needs.tag-pre-release.outputs.tag }}
steps:
- uses: actions/checkout@v2
- uses: ncipollo/release-action@v1
env:
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
with:
tag: ${{ needs.tag-pre-release.outputs.tag }}
bodyFile: ".github/LATEST_CHANGELOG.md"
mark-issue-fixed:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Label Fixed Issues
uses: gh-bot/fix-labeler@master
with:
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
label: '✅ Fixed'

View file

@ -1,14 +0,0 @@
# Updates multiple issues with a certain tag, with a comment containing a given message
name: 🎯 Broadcast Message across Issues
on:
workflow_dispatch:
inputs:
message: { required: false }
labels: { required: false }
jobs:
broadcast:
runs-on: ubuntu-latest
steps:
- uses: jenschelkopf/broadcast-action@master
with:
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}

18
.github/workflows/build-docs-site.yml vendored Normal file
View file

@ -0,0 +1,18 @@
# Builds and published Dashy's documentation website
name: 📝 Build Docs Site
on:
workflow_dispatch:
push:
branches: [ WEBSITE/docs-site-source ]
jobs:
deploy:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/WEBSITE/docs-site-source'
steps:
- uses: actions/checkout@master
- uses: redkubes/docusaurus-deploy-action@v1
with:
source-folder: ./
git-user: ${{ github.actor }}
git-password: ${{ secrets.GITHUB_TOKEN }}
deployment-branch: gh-pages

View file

@ -1,21 +0,0 @@
# Close any issue that does not match any of the issue templates
name: 🎯 Close Incomplete Issues
on:
issues:
types: [opened, edited]
jobs:
auto_close_issues:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v1
- name: Automatically close issues that don't follow the issue template
uses: lucasbento/auto-close-issues@v1.0.2
with:
github-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
closed-issues-label: '🙁 Auto-Closed'
issue-close-message: |
Hello @${issue.user.login} 👋
Unfortunately your issue does not follow the format outlined in the template, and has therefore been auto-closed.
To ensure that all relevant info is included, please either update or recreate your issue, and complete the sub-headings provided.
Thank you :)

View file

@ -0,0 +1,55 @@
# When Dashy's version in package.json is updated
# this workflow will create a new tag
# And then publish it to the repository
name: 🏗️ Tag on Version Change
on:
workflow_dispatch:
push:
branches:
- master
paths:
- 'package.json'
jobs:
tag-if-version-updated:
runs-on: ubuntu-latest
steps:
- name: Check Out Repository 🛎️
uses: actions/checkout@v2
- name: Set Up Python 🐍
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Extract Version from package.json 🔢
id: package_version
run: |
import json
with open('package.json', 'r') as f:
version = json.load(f)['version']
print(f"::set-output name=VERSION::{version}")
shell: python
- name: Get Latest Tag 🏷️
id: latest_tag
run: |
git fetch --tags
latest_tag=$(git describe --tags `git rev-list --tags --max-count=1` 2>/dev/null)
echo "::set-output name=TAG::${latest_tag:-0}"
- name: Create and Push Tag ⤴️
if: steps.package_version.outputs.VERSION != steps.latest_tag.outputs.TAG && steps.latest_tag.outputs.TAG != '0'
run: |
git config --local user.email "liss-bot@d0h.co"
git config --local user.name "Liss-Bot"
git tag -a ${{ steps.package_version.outputs.VERSION }} -m "Release v${{ steps.package_version.outputs.VERSION }}"
git push origin ${{ steps.package_version.outputs.VERSION }}
env:
GIT_AUTHOR_NAME: Liss-Bot
GIT_AUTHOR_EMAIL: liss-bot@d0h.co
GIT_COMMITTER_NAME: Liss-Bot
GIT_COMMITTER_EMAIL: liss-bot@d0h.co
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}

View file

@ -15,4 +15,3 @@ jobs:
collapsibleThreshold: '25'
failOnDowngrade: 'false'
path: 'yarn.lock'
updateComment: 'true'

View file

@ -1,16 +1,24 @@
# Scans, builds and releases a multi-architecture docker image
name: 🐳 Build + Publish Multi-Platform Image
on:
workflow_dispatch:
push:
branches: ['master']
tags: [v*]
tags: ['*.*']
paths:
- '**.js'
- 'src/**'
- 'public/**'
- 'services/**'
- '.github/workflows/docker-build-publish.yml'
- 'Dockerfile'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
packages: write
env:
DH_IMAGE: ${{ secrets.DOCKER_REPO }}
@ -24,18 +32,12 @@ jobs:
steps:
- name: 🛎️ Checkout Repo
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: 🔖 Get App Version
uses: tyankatsu0105/read-package-version-actions@v1
id: package-version
# - name: ✨ Validate Dockerfile
# uses: ghe-actions/dockerfile-validator@v1
# with:
# dockerfile: 'Dockerfile'
# lint: 'hadolint'
- name: 🗂️ Make Docker Meta
id: meta
uses: docker/metadata-action@v3
@ -43,10 +45,13 @@ jobs:
images: |
${{ env.DH_IMAGE }}
ghcr.io/${{ env.GH_IMAGE }}
# ${{ secrets.ACR_SERVER }}/${{ secrets.ACR_USERNAME }}
tags: |
type=ref,event=tag,prefix=release-,suffix={{tag}}
type=semver,pattern={{raw}},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
@ -57,35 +62,41 @@ jobs:
- name: 🔧 Set up QEMU
uses: docker/setup-qemu-action@v1
with:
platforms: linux/amd64,linux/arm64,linux/arm/v7
- name: 🔧 Set up Docker Buildx
uses: docker/setup-buildx-action@v1
uses: docker/setup-buildx-action@v2
with:
use-buildkit: true
buildkit-daemon-opts: "--oci-worker-no-process-sandbox"
- name: 👀 Inspect builder
run: |
echo "Name: ${{ steps.buildx.outputs.name }}"
echo "Endpoint: ${{ steps.buildx.outputs.endpoint }}"
echo "Status: ${{ steps.buildx.outputs.status }}"
echo "Flags: ${{ steps.buildx.outputs.flags }}"
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 }}
password: ${{ secrets.GITHUB_TOKEN }}
# - name: 🔑 Login to Azure Container Registry
# uses: docker/login-action@v1
# with:
# registry: ${{ secrets.ACR_SERVER }}
# username: ${{ secrets.ACR_USERNAME }}
# password: ${{ secrets.ACR_PASSWORD }}
- name: 🚦 Check Registry Status
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
@ -93,13 +104,3 @@ jobs:
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
push: true
# - name: 💬 Set Docker Hub Description
# uses: peter-evans/dockerhub-description@v2
# with:
# repository: lissy93/dashy
# readme-filepath: ./docker/docker-readme.md
# short-description: Dashy - A self-hosted start page for your server
# username: ${{ secrets.DOCKER_USERNAME }}
# password: ${{ secrets.DOCKER_USER_PASS }}

View file

@ -1,63 +0,0 @@
# Builds a Docker image from with latest tag when master branch is updated
# The publishes it to GitHub container registry as a package
name: 🏗️ Build + Publish Docker Image to GHCR
on:
workflow_dispatch:
push:
branches: ['master']
tags: [v*]
env:
REGISTRY: ghcr.io
IMAGE_NAME: dashy
jobs:
build-and-push-image:
runs-on: ubuntu-latest
if: "!contains(github.event.head_commit.message, '[ci-skip]')"
permissions:
contents: read
packages: write
steps:
# Fetch the code
- name: Checkout repository
uses: actions/checkout@v2
- name: Prepare
id: prep
run: echo ::set-output name=version::${GITHUB_REF##*/}
# Use QEMU for multi-architecture builds
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
with:
platforms: all
# # Use Moby BuildKit
# - name: Set up Docker Buildx
# id: buildx
# uses: docker/setup-buildx-action@v1
# with:
# install: true
# version: latest
# driver-opts: image=moby/buildkit:master
# Login into GH container registry
- name: Log in to registry
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
# Build the image from default Dockerfile
- name: Build image
run: docker build . --file docker/Dockerfile-multi-arch --tag $IMAGE_NAME --label "runnumber=${GITHUB_RUN_ID}"
# Push build image
- name: Push image
run: |
IMAGE_ID=ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME
IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]')
VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')
[[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
[ "$VERSION" == "master" ] && VERSION=latest
echo IMAGE_ID=$IMAGE_ID
echo VERSION=$VERSION
docker tag $IMAGE_NAME $IMAGE_ID:$VERSION
docker push $IMAGE_ID:$VERSION

View file

@ -1,43 +0,0 @@
name: 📕 Check Docs Domain Expiry
on:
workflow_dispatch:
schedule:
- cron: '0 1 * * 0' # At 01:00 on Sunday.
jobs:
check-domain:
runs-on: ubuntu-latest
name: Check domain
strategy:
matrix:
domain:
- https://dashy.to
steps:
- name: Check domain SSL and registry expire date
id: check-domain
uses: codex-team/action-check-domain@v1
with:
url: ${{ matrix.domain }}
- name: Raise issue if domain expiring soon
if: ${{ steps.check-domain.outputs.paid-till-days-left && steps.check-domain.outputs.paid-till-days-left < 30 }}
uses: rishabhgupta/git-action-issue@v2
with:
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
assignees: Lissy93
title: '[WEBSITE] Domain Expiring Soon'
body: >
**Priority Notice**
Domain, ${{ matrix.domain }} will expire in ${{ steps.check-domain.outputs.paid-till-days-left }} days.
@Lissy93 - Please take action immediately to prevent any downtime
- name: Raise issue if SSL Cert expiring soon
if: ${{ steps.check-domain.outputs.ssl-expire-days-left && steps.check-domain.outputs.ssl-expire-days-left < 14 }}
uses: rishabhgupta/git-action-issue@v2
with:
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
assignees: Lissy93
title: '[WEBSITE] SSL Cert Expiring Soon'
body: >
**Priority Notice**
The SSL Certificate for ${{ matrix.domain }} will expire in ${{ steps.check-domain.outputs.ssl-expire-days-left }} days, on ${{ steps.check-domain.outputs.ssl-expire-date }}.
@Lissy93 - Please take action immediately to prevent any downtime

36
.github/workflows/draft-release.yml vendored Normal file
View file

@ -0,0 +1,36 @@
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:
runs-on: ubuntu-latest
steps:
- name: Checkout code 🛎️
uses: actions/checkout@v2
with:
fetch-depth: 0 # We need all history for generating release notes
- name: Create Draft Release 📝
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
with:
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
- name: Output new release URL ↗️
run: 'echo "Draft release URL: ${{ steps.create_release.outputs.html_url }}"'

View file

@ -1,83 +0,0 @@
# Inserts list of contributors and community members into ./docs/credits.md
# Also generates an SVG showing all contributors, which is embedded into readme
name: 📊 Generate Contributor Credits
on:
workflow_dispatch: # Manual dispatch
schedule:
- cron: '0 1 * * 0' # At 01:00 on Sunday.
jobs:
# Job #1 - Generate an embedded SVG asset, showing all contributors
generate-contributors:
runs-on: ubuntu-latest
steps:
- uses: bubkoo/contributors-list@v1
with:
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
svgPath: docs/assets/CONTRIBUTORS.svg
affiliation: all
includeBots: false
excludeUsers: BeginCI snyk-bot
avatarSize: 96
userNameHeight: 20
svgWidth: 830
commitMessage: ':blue_heart: Updates contributor SVG'
# Job #2 - Fetches sponsors and inserts into readme and credits page
insert-sponsors:
runs-on: ubuntu-latest
steps:
- name: Checkout 🛎️
uses: actions/checkout@v2
- name: Generate Sponsors in Readme 💖
uses: JamesIves/github-sponsors-readme-action@1.0.5
with:
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
file: 'README.md'
- name: Generate Sponsors in Credits 💖
uses: JamesIves/github-sponsors-readme-action@1.0.5
with:
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
file: 'docs/credits.md'
# Job #3 - Update the Credits page
insert-credits:
runs-on: ubuntu-latest
name: Inserts contributors into credits.md
steps:
- name: Contributer List - Credits Page
uses: akhilmhdh/contributors-readme-action@v2.3.6
env:
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
with:
image_size: 80
readme_path: docs/credits.md
columns_per_row: 6
commit_message: ':purple_heart: Updates contributors list'
collaborators: all
committer_username: liss-bot
committer_email: liss-bot@d0h.co
- name: Sponsors List - Readme
uses: akhilmhdh/contributors-readme-action@v2.2
env:
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
with:
image_size: 80
readme_path: README.md
columns_per_row: 6
commit_message: ':yellow_heart: Updates sponsors table'
committer_username: liss-bot
committer_email: liss-bot@d0h.co
make-author-list:
runs-on: ubuntu-latest
steps:
- name: Checkout 🛎️
uses: actions/checkout@v2
with:
fetch-depth: 0
- uses: wow-actions/update-authors@v1.1.4
with:
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
sort: commits
bots: true
path: .github/AUTHORS.txt
commit: ':blue_heart: Makes author list'
template: '{{name}} <{{email}}> - {{commits}} commits'

View file

@ -1,22 +0,0 @@
name: ⭐ Hello non-Stargazers
on:
issues:
types: [opened, reopened]
jobs:
check-user:
if: >
${{
! contains( github.event.issue.labels.*.name, '📌 Keep Open') &&
! contains( github.event.issue.labels.*.name, '🌈 Feedback') &&
! contains( github.event.issue.labels.*.name, '💯 Showcase') &&
github.event.comment.author_association != 'CONTRIBUTOR'
}}
runs-on: ubuntu-latest
name: Add comment to issues opened by non-stargazers
steps:
- name: comment
uses: qxip/please-star-light@v4
with:
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
autoclose: false
message: "If you're enjoying Dashy, consider dropping us a ⭐<br>_<sub>🤖 I'm a bot, and this message was automated</sub>_"

View file

@ -1,19 +0,0 @@
# Adds a comment to all issues & PRs that were fixed on a new release
name: 💡 Update Issue after Release
on:
release:
types: [published]
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: apexskier/github-release-commenter@v1
with:
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
label-template: 🛩️ Released {release_tag}, 🔨 Fixed
comment-template: |
**The fix for this issue has now been released in {release_name} ✨**
If you haven't done so already, please [update your instance](https://github.com/Lissy93/dashy/blob/master/docs/management.md#updating) to `{release_tag}` or later. See {release_link} for full info.
Feel free to reach out if you need any more support. If you are enjoying Dashy, consider [supporting the project](https://github.com/Lissy93/dashy/blob/master/docs/contributing.md#contributing).

58
.github/workflows/update-docs-site.yml vendored Normal file
View file

@ -0,0 +1,58 @@
name: 📝 Update Documentation
# This will run whenever the /docs directory in master branch is updated,
# or if the workflow is manually dispatched, plus a sync check on Sun at 03:30 UTC
on:
workflow_dispatch:
schedule:
- cron: '30 3 * * 0'
push:
branches:
- master
paths:
- 'docs/**'
# Jobs to be run:
# 1. Checkout master branch
# 2. Checkout website source code branch
# 3. Install Python
# 4. Copy /docs from master to website branch
# 5. Run the script which processes documentation
# 6. Commit and push updated docs to the website source code branch
jobs:
update-docs:
runs-on: ubuntu-latest
steps:
- name: Checkout master branch 🛎️
uses: actions/checkout@v2
with:
path: 'master-docs'
- name: Checkout WEBSITE/docs-site-source branch 🛎️
uses: actions/checkout@v2
with:
ref: 'WEBSITE/docs-site-source'
path: 'website-docs'
- name: Install Python 🐍
uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Run script to update documentation 🪄
working-directory: website-docs
run: |
cp -r ../master-docs/docs ./
python ./do-markdown-magic.py
- name: Commit changes 🚀
run: |
cd website-docs
git config --local user.email "liss-bot@d0h.co"
git config --local user.name "Liss-Bot"
git add docs
git commit -m "Update documentation" || echo "No changes to commit"
git push
env:
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}

1
.gitignore vendored
View file

@ -13,7 +13,6 @@ yarn-error.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj

65
.vscode/launch.json vendored Normal file
View file

@ -0,0 +1,65 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "msedge",
"request": "launch",
"name": "dashy: edge",
"url": "http://localhost:8080",
"webRoot": "${workspaceFolder}",
"breakOnLoad": true,
"pathMapping": {
"/_karma_webpack_": "${workspaceFolder}"
},
"sourceMapPathOverrides": {
"webpack:/*": "${webRoot}/*",
"/./*": "${webRoot}/*",
"/src/*": "${webRoot}/*",
"/*": "*",
"/./~/*": "${webRoot}/node_modules/*"
},
"preLaunchTask": "dashy start"
},
{
"type": "chrome",
"request": "launch",
"name": "dashy: chrome",
"url": "http://localhost:8080",
"webRoot": "${workspaceFolder}",
"breakOnLoad": true,
"pathMapping": {
"/_karma_webpack_": "${workspaceFolder}"
},
"sourceMapPathOverrides": {
"webpack:/*": "${webRoot}/*",
"/./*": "${webRoot}/*",
"/src/*": "${webRoot}/*",
"/*": "*",
"/./~/*": "${webRoot}/node_modules/*"
},
"preLaunchTask": "dashy start"
},
{
"type": "firefox",
"request": "launch",
"name": "dashy: firefox",
"url": "http://localhost:8080",
"webRoot": "${workspaceFolder}",
"breakOnLoad": true,
"pathMapping": {
"/_karma_webpack_": "${workspaceFolder}"
},
"sourceMapPathOverrides": {
"webpack:/*": "${webRoot}/*",
"/./*": "${webRoot}/*",
"/src/*": "${webRoot}/*",
"/*": "*",
"/./~/*": "${webRoot}/node_modules/*"
},
"preLaunchTask": "dashy start"
}
]
}

21
.vscode/tasks.json vendored Normal file
View file

@ -0,0 +1,21 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "dashy start",
"type": "npm",
"script": "dev",
"isBackground": true,
"problemMatcher": [
{
"base": "$tsc-watch",
"background": {
"activeOnStart": true,
"beginsPattern": "Starting development server",
"endsPattern": "Compiled successfully"
}
}
],
}
]
}

1
.yarnrc.yml Normal file
View file

@ -0,0 +1 @@
nodeLinker: node-modules

View file

@ -1,4 +1,4 @@
FROM node:20.11.1-alpine AS BUILD_IMAGE
FROM node:18.19.1-alpine AS BUILD_IMAGE
# Set the platform to build image for
ARG TARGETPLATFORM
@ -16,19 +16,19 @@ WORKDIR /app
# Install app dependencies
COPY package.json yarn.lock ./
RUN yarn install --ignore-engines --frozen-lockfile --network-timeout 1000000
RUN yarn install --ignore-engines --immutable --no-cache --network-timeout 300000 --network-concurrency 1
# Copy over all project files and folders to the working directory
COPY . ./
# Build initial app for production
RUN NODE_OPTIONS=--openssl-legacy-provider yarn build --mode production
RUN yarn build --mode production --no-clean
# Production stage
FROM node:20.11.1-alpine
FROM node:20.11.1-alpine3.19
# Define some ENV Vars
ENV PORT=80 \
ENV PORT=8080 \
DIRECTORY=/app \
IS_DOCKER=true
@ -40,8 +40,6 @@ RUN apk add --no-cache tzdata
# Copy built application from build phase
COPY --from=BUILD_IMAGE /app ./
# Ensure only one version of conf.yml exists
RUN rm dist/conf.yml
# Finally, run start command to serve up the built application
CMD [ "yarn", "build-and-start" ]

269
README.md
View file

@ -6,34 +6,38 @@
<img width="120" src="https://i.ibb.co/yhbt6CY/dashy.png" />
<br/>
<b><a href="./docs/showcase.md">User Showcase</a></b> | <b><a href="https://demo.dashy.to">Live Demo</a></b> | <b><a href="./docs/quick-start.md">Getting Started</a></b> | <b><a href="https://dashy.to/docs">Documentation</a></b> | <b><a href="https://github.com/Lissy93/dashy">GitHub</a></b>
<br/><br/>
<a href="https://github.com/awesome-selfhosted/awesome-selfhosted#personal-dashboards">
<img src="https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg" alt="Awesome Self-Hosted">
</a>
<a href="./LICENSE">
<img src="https://img.shields.io/badge/License-MIT-0aa8d2?logo=opensourceinitiative&logoColor=fff" alt="License MIT">
</a>
<a href="./.github/CHANGELOG.md">
<img src="https://img.shields.io/github/package-json/v/lissy93/dashy?logo=azurepipelines&amp;color=0aa8d2" alt="Current Version">
</a>
<a href="https://hub.docker.com/r/lissy93/dashy">
<img src="https://img.shields.io/docker/pulls/lissy93/dashy?logo=docker&color=0aa8d2&logoColor=fff" alt="Docker Pulls">
</a>
<a href="http://as93.link/dashy-build-status">
<img src="https://badgen.net/github/status/lissy93/dashy?icon=github" alt="GitHub Status">
</a>
<a href="https://snyk.io/test/github/lissy93/dashy">
<img src="https://snyk.io/test/github/lissy93/dashy/badge.svg" alt="Known Vulnerabilities">
</p>
---
<p align="center">
<sup>Dashy is kindly sponsored by <a href="https://www.lambdatest.com/?utm_source=dashy&utm_medium=sponsor">LambdaTest</a> - Browser Testing</sup><br>
<a href="https://www.lambdatest.com/?utm_source=dashy&utm_medium=sponsor" target="_blank">
<img src="https://www.lambdatest.com/blue-logo.png" width="400" alt="LambdaTest" />
</a>
</p>
<p align="center">
<br>
<sup>Dashy is kindly sponsored by <a href="https://umbrel.com?ref=dashy">Umbrel</a> - the personal home cloud and OS for self-hosting</sup><br>
<a href="https://umbrel.com?ref=dashy">
<img width="400" src="https://github.com/Lissy93/dashy/blob/WEBSITE/docs-site-source/static/umbrel-banner.jpg?raw=true" />
</a>
</p>
> [!NOTE]
> Version [3.0.0](https://github.com/Lissy93/dashy/releases/tag/3.0.0) has been released, and requires some changes to your setup, see [#1529](https://github.com/Lissy93/dashy/discussions/1529) for details.
<details>
<summary><b>Table of Contents</b></summary>
<p>
- **Getting Started**
- [🌈 Features](#features-)
- [⚡Demo](#demo-)
- [ Demo](#demo-)
- [🚀 Getting Started](#getting-started-)
- [🔧 Configuring](#configuring-)
- **Feature Overview**
@ -95,7 +99,7 @@
**Screenshots**: Checkout the [Showcase](./docs/showcase.md), to see example dashboards from the community
**Spin up your own demo**: [![One-Click Deploy with PWD](https://img.shields.io/badge/Play--with--Docker-Deploy-2496ed?style=flat-square&logo=docker)](https://labs.play-with-docker.com/?stack=https://raw.githubusercontent.com/Lissy93/dashy/master/docker-compose.yml) or [`docker run -p 8080:80 lissy93/dashy`](./docs/quick-start.md)
**Spin up your own demo**: [![One-Click Deploy with PWD](https://img.shields.io/badge/Play--with--Docker-Deploy-2496ed?style=flat-square&logo=docker)](https://labs.play-with-docker.com/?stack=https://raw.githubusercontent.com/Lissy93/dashy/master/docker-compose.yml) or [`docker run -p 8080:8080 lissy93/dashy`](./docs/quick-start.md)
<p align="center">
@ -116,15 +120,15 @@
You will need [Docker](https://docs.docker.com/get-docker/) installed on your system
```
docker run -p 8080:80 lissy93/dashy
docker run -p 8080:8080 lissy93/dashy
```
Or
```docker
docker run -d \
-p 4000:80 \
-v /root/my-local-conf.yml:/app/public/conf.yml \
-p 4000:8080 \
-v /root/my-local-conf.yml:/app/user-data/conf.yml \
--name my-dashboard \
--restart=always \
lissy93/dashy:latest
@ -140,7 +144,7 @@ See also: [examples with Docker Compose](./docs/deployment.md#using-docker-compo
You will need [git](https://git-scm.com/downloads), the latest or LTS version of [Node.js](https://nodejs.org/) and _(optionally)_ [Yarn](https://yarnpkg.com/) installed on your system.
- Clone the Repo: `git clone https://github.com/Lissy93/dashy.git` and `cd dashy`
- Configuration: Fill in your settings in `./public/conf.yml`
- Configuration: Fill in your settings in `./user-data/conf.yml`
- Install dependencies: `yarn`
- Build: `yarn build`
- Run: `yarn start`
@ -169,7 +173,7 @@ Dashy supports **1-Click deployments** on several popular cloud platforms. To sp
> For full configuration documentation, see: [**Configuring**](./docs/configuring.md)
Dashy is configured through a YAML file, located at `./public/conf.yml`. In addition, you can find a complete list of available options in the [Configuring Docs](./docs/configuring.md). The config can also be edited and saved directly through the UI.
Dashy is configured through a YAML file, located at `./user-data/conf.yml`. In addition, you can find a complete list of available options in the [Configuring Docs](./docs/configuring.md). The config can also be edited and saved directly through the UI.
**[⬆️ Back to Top](#dashy)**
@ -205,7 +209,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
@ -216,6 +220,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
@ -248,7 +253,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,6 +422,7 @@ Dashy supports multiple languages and locales. When available, your language sho
- 🇩🇪 **German**: `de` - Contributed by **[@Niklashere](https://github.com/Niklashere)**
- 🇬🇷 **Greek**: `el` - Contributed by **[@aviolaris](https://github.com/aviolaris)**
- 🇮🇳 **Hindi**: `hi` - _Auto-generated_
- 🇭🇺 **Hungarian**: `hu` - Contributed by **[@apgyorfi](https://github.com/apgyorfi)**
- 🇮🇹 **Italian**: `it` - Contributed by **[@alexdelprete](https://github.com/alexdelprete)**
- 🇯🇵 **Japanese**: `ja` - _Auto-generated_
- 🇰🇷 **Korean**: `ko` - Contributed by **[@boggy-cs](https://github.com/boggy-cs)**
@ -424,13 +430,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
@ -529,178 +536,11 @@ Thank you so much to everyone who has helped with Dashy so far; every contributi
#### Sponsors
Huge thanks to the sponsors helping to support Dashy's development!
<!-- readme: sponsors -start -->
<table>
<tr>
<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"/>
<br />
<sub><b>Vincent Koc</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/peng1can">
<img src="https://avatars.githubusercontent.com/u/225854?v=4" width="80;" alt="peng1can"/>
<br />
<sub><b>Peng1can</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/alydemah">
<img src="https://avatars.githubusercontent.com/u/652035?u=ac2c04e474da37bfeafcfa25076cc1800997aedb&v=4" width="80;" alt="alydemah"/>
<br />
<sub><b>Aly Mohamed</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/bgadrian">
<img src="https://avatars.githubusercontent.com/u/830001?v=4" width="80;" alt="bgadrian"/>
<br />
<sub><b>B.G.Adrian</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/tbjers">
<img src="https://avatars.githubusercontent.com/u/1117052?u=539d96d5e581b3139c75713ce35b89a36626404c&v=4" width="80;" alt="tbjers"/>
<br />
<sub><b>Torgny Bjers</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/emlazzarin">
<img src="https://avatars.githubusercontent.com/u/1141361?u=714e3487a3f2e0df721b01a0133945f075d3ff68&v=4" width="80;" alt="emlazzarin"/>
<br />
<sub><b>Eddy Lazzarin</b></sub>
</a>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/AnandChowdhary">
<img src="https://avatars.githubusercontent.com/u/2841780?u=747e554b3a7f12eb20b7910e1c87d817844f714f&v=4" width="80;" alt="AnandChowdhary"/>
<br />
<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>
<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"/>
<br />
<sub><b>Zach Biles</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/UlisesGascon">
<img src="https://avatars.githubusercontent.com/u/5110813?u=3c41facd8aa26154b9451de237c34b0f78d672a5&v=4" width="80;" alt="UlisesGascon"/>
<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=d033c9c16e8367987aec3f9ff5922bc67dd1eedf&v=4" width="80;" alt="digitalarche"/>
<br />
<sub><b>Digital Archeology</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/InDieTasten">
<img src="https://avatars.githubusercontent.com/u/7047377?v=4" width="80;" alt="InDieTasten"/>
<br />
<sub><b>InDieTasten</b></sub>
</a>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/bmcgonag">
<img src="https://avatars.githubusercontent.com/u/7346620?u=2a0f9284f3e12ac1cc15288c254d1ec68a5081e8&v=4" width="80;" alt="bmcgonag"/>
<br />
<sub><b>Brian McGonagill</b></sub>
</a>
</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"/>
<br />
<sub><b>Vlad Timofeev</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/helixzz">
<img src="https://avatars.githubusercontent.com/u/12218889?u=d06d0c103dfbdb99450623064f7da3c5a3675fb6&v=4" width="80;" alt="helixzz"/>
<br />
<sub><b>HeliXZz</b></sub>
</a>
</td>
<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/Bastii717">
<img src="https://avatars.githubusercontent.com/u/53431819?u=604977bed6ad6875ada890d0d3765a4cacc2fa14&v=4" width="80;" alt="Bastii717"/>
<br />
<sub><b>Bastii717</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/frankdez93">
<img src="https://avatars.githubusercontent.com/u/87549420?v=4" width="80;" alt="frankdez93"/>
<br />
<sub><b>Frankdez93</b></sub>
</a>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/ratty222">
<img src="https://avatars.githubusercontent.com/u/92832598?u=137b65530cbd5f5af9c24cde51baa6cc77cc934b&v=4" width="80;" alt="ratty222"/>
<br />
<sub><b>Ratty222</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/hernanpopper">
<img src="https://avatars.githubusercontent.com/u/104868017?v=4" width="80;" alt="hernanpopper"/>
<br />
<sub><b>Hernanpopper</b></sub>
</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"/>
<br />
<sub><b>Nixy</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"/>
<br />
<sub><b>Nrvo</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/mezza93">
<img src="https://avatars.githubusercontent.com/u/153599966?v=4" width="80;" alt="mezza93"/>
<br />
<sub><b>mezza93</b></sub>
</a>
</td></tr>
</table>
<!-- readme: sponsors -end -->
![sponsors badge](https://readme-contribs.as93.net/sponsors/lissy93)
#### Contributors
[![Auto-generated contributors](https://raw.githubusercontent.com/Lissy93/dashy/master/docs/assets/CONTRIBUTORS.svg)](./docs/credits.md)
[![contributors badge](https://readme-contribs.as93.net/contributors/lissy93/dashy?perRow=12&limit=96)](./docs/credits.md)
#### Stats
[![Stats](https://repobeats.axiom.co/api/embed/48546e3c768d38c450ba136e32c0992bcf58ad73.svg "Repobeats analytics image")](https://github.com/Lissy93/dashy/blob/master/docs/credits.md)
@ -843,16 +683,25 @@ For more info, see TLDR Legal's [Explanation of MIT](https://tldrlegal.com/licen
---
<p align="center">
<br>
<a href="https://dashboard.trackgit.com/token/ks0bx7bb14lsvbwoc3ik">
<img src="https://us-central1-trackgit-analytics.cloudfunctions.net/token/ping/ks0bx7bb14lsvbwoc3ik?style=flat-square" />
</a>
<br><br>
<a href="https://github.com/Lissy93/dashy">
<img src="https://github.githubassets.com/images/icons/emoji/octocat.png" />
</a>
<br><br>
<i>Thank you for Visiting</i>
<!-- License + Copyright -->
<p align="center">
<i>© <a href="https://aliciasykes.com">Alicia Sykes</a> 2024</i><br>
<i>Licensed under <a href="https://gist.github.com/Lissy93/143d2ee01ccc5c052a17">MIT</a></i><br>
<a href="https://github.com/lissy93"><img src="https://i.ibb.co/4KtpYxb/octocat-clean-mini.png" /></a><br>
<sup>Thanks for visiting :)</sup>
</p>
<!-- Dinosaurs are Awesome -->
<!--
. - ~ ~ ~ - .
.. _ .-~ ~-.
//| \ `..~ `.
|| | } } / \ \
(\ \\ \~^..' | } \
\`.-~ o / } | / \
(__ | / | / `.
`- - ~ ~ -._| /_ - ~ ~ ^| /- _ `.
| / | / ~-. ~- _
|_____| |_____| ~ - . _ _~_-_
-->

View file

@ -12,21 +12,17 @@ services:
# To build from source, replace 'image: lissy93/dashy' with 'build: .'
# build: .
# Or, to use a Dockerfile for your archtecture, uncomment the following
# context: .
# dockerfile: ./docker/Dockerfile-arm32v7
# You can also use an image with a different tag, or pull from a different registry, e.g:
# image: ghcr.io/lissy93/dashy or image: lissy93/dashy:arm64v8
# image: ghcr.io/lissy93/dashy or image: lissy93/dashy:3.0.0
# Pass in your config file below, by specifying the path on your host machine
# volumes:
# - /path/to/my-config.yml:/app/public/conf.yml
# - /path/to/item-icons:/app/public/item-icons
# - /path/to/my-config.yml:/app/user-data/conf.yml
# - /path/to/item-icons:/app/user-data/item-icons/
# Set port that web service will be served on. Keep container port as 80
# Set port that web service will be served on. Keep container port as 8080
ports:
- 4000:80
- 4000:8080
# Set any environmental variables
environment:

View file

@ -55,7 +55,7 @@
**Screenshots**: Checkout the [Showcase](https://github.com/Lissy93/dashy/blob/master/docs/showcase.md), to see example dashboards from the community
**Spin up your own demo**: [![One-Click Deploy with PWD](https://img.shields.io/badge/Play--with--Docker-Deploy-2496ed?style=flat-square&logo=docker)](https://labs.play-with-docker.com/?stack=https://raw.githubusercontent.com/Lissy93/dashy/master/docker-compose.yml) or [`docker run -p 8080:80 lissy93/dashy`](./docs/quick-start.md)
**Spin up your own demo**: [![One-Click Deploy with PWD](https://img.shields.io/badge/Play--with--Docker-Deploy-2496ed?style=flat-square&logo=docker)](https://labs.play-with-docker.com/?stack=https://raw.githubusercontent.com/Lissy93/dashy/master/docker-compose.yml) or [`docker run -p 8080:8080 lissy93/dashy`](./docs/quick-start.md)
<p align="center">
@ -69,7 +69,7 @@
## Getting Started 🛫
To deploy Dashy with Docker, just run `docker run -p 8080:80 lissy93/dashy`, then open `http://localhost:8080`
To deploy Dashy with Docker, just run `docker run -p 8080:8080 lissy93/dashy`, then open `http://localhost:8080`
For full list of options and a Docker compose file, see the [Deployment Docs](https://github.com/Lissy93/dashy/blob/master/docs/deployment.md).

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 29 MiB

After

Width:  |  Height:  |  Size: 39 MiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 94 KiB

View file

@ -6,11 +6,17 @@
- [Logging In and Out](#logging-in-and-out)
- [Guest Access](#enabling-guest-access)
- [Per-User Access](#granular-access)
- [Using Environment Variables for Passwords](#using-environment-variables-for-passwords)
- [Adding HTTP Auth to Configuration](#adding-http-auth-to-configuration)
- [Security Considerations](#security)
- [HTTP Auth](#http-auth)
- [Keycloak Auth](#keycloak)
- [Deploying Keycloak](#1-deploy-keycloak)
- [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)
@ -20,7 +26,7 @@
> [!IMPORTANT]
> Dashy's built-in auth is not indented to protect a publicly hosted instance against unauthorized access. Instead you should use an auth provider compatible with your reverse proxy, or access Dashy via your VPN.
> Dashy's built-in auth is not indented to protect a publicly hosted instance against unauthorized access. Instead you should use an auth provider compatible with your reverse proxy, or access Dashy via your VPN, or implement your own SSO logic.
>
> In cases where Dashy is only accessibly within your home network, and you just want to add a login page, then the built-in auth may be sufficient, but keep in mind that configuration can still be accessed.
@ -28,6 +34,11 @@
Dashy has a basic login page included, and frontend authentication. You can enable this by adding users to the `auth` section under `appConfig` in your `conf.yml`. If this section is not specified, then no authentication will be required to access the app, and the homepage will resolve to your dashboard.
> [!NOTE]
> Since the auth is initiated in the main app entry point (for security), a rebuild is required to apply changes to the auth configuration.
> You can trigger a rebuild through the UI, under Config --> Rebuild, or by running `yarn build` in the root directory.
### Setting Up Authentication
The `auth` property takes an array of users. Each user needs to include a username, hash and optional user type (`admin` or `normal`). The hash property is a [SHA-256 Hash](https://en.wikipedia.org/wiki/SHA-2) of your desired password.
@ -110,6 +121,27 @@ You can also prevent any user from writing changes to disk, using `preventWriteT
To disable all UI config features, including View Config, set `disableConfiguration`. Alternatively you can disable UI config features for all non admin users by setting `disableConfigurationForNonAdmin` to true.
### Using Environment Variables for Passwords
If you don't want to hash your password, you can instead leave out the `hash` attribute, and replace it with `password` which should have the value of an environmental variable name you wish to use.
Note that env var must begin with `VUE_APP_`, and you must set this variable before building the app.
For example:
```yaml
auth:
users:
- user: bob
password: VUE_APP_BOB
```
Just be sure to set `VUE_APP_BOB='my super secret password'` before build-time.
### Adding HTTP Auth to Configuration
If you'd also like to prevent direct visit access to your configuration file, you can set the `ENABLE_HTTP_AUTH` environmental variable.
### Security
With basic auth, all logic is happening on the client-side, which could mean a skilled user could manipulate the code to view parts of your configuration, including the hash. If the SHA-256 hash is of a common password, it may be possible to determine it, using a lookup table, in order to find the original password. Which can be used to manually generate the auth token, that can then be inserted into session storage, to become a valid logged in user. Therefore, you should always use a long, strong and unique password, and if you instance contains security-critical info and/ or is exposed directly to the internet, and alternative authentication method may be better. The purpose of the login page is merely to prevent immediate unauthorized access to your homepage.
@ -118,6 +150,16 @@ With basic auth, all logic is happening on the client-side, which could mean a s
---
## HTTP Auth
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 (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)**
---
## Keycloak
Dashy also supports using a [Keycloak](https://www.keycloak.org/) authentication server. The setup for this is a bit more involved, but it gives you greater security overall, useful for if your instance is exposed to the internet.
@ -214,6 +256,246 @@ From within the Keycloak console, you can then configure things like time-outs,
---
### Troubleshooting Keycloak
If you encounter issues with your Keycloak setup, follow these steps to troubleshoot and resolve common problems.
1. Client Authentication Issue
Problem: Redirect loop, if client authentication is enabled.
Solution: Switch off "client authentication" in "TC clients" -> "Advanced" settings.
2. Double URL
Problem: If you get redirected to "https://dashy.my.domain/#iss=https://keycloak.my.domain/realms/my-realm"
Solution: Make sure to turn on "Exclude Issuer From Authentication Response" in "TC clients" -> "Advanced" -> "OpenID Connect Compatibility Modes"
3. Problems with mutiple Dashy Pages
Problem: Refreshing or logging out of dashy results in an "invalid_redirect_uri" error.
Solution: In "TC clients" -> "Access settings" -> "Root URL" https://dashy.my.domain/, valid redirect URIs must be /*
---
## OIDC
Dashy also supports using a general [OIDC compatible](https://openid.net/connect/) authentication server. In order to use it, the authentication section needs to be configured:
```yaml
appConfig:
auth:
enableOidc: true
oidc:
clientId: [registered client id]
endpoint: [OIDC endpoint]
scope: [The scope(s) to request from the OIDC provider]
adminGroup: admin
```
Because Dashy is a SPA, a [public client](https://datatracker.ietf.org/doc/html/rfc6749#section-2.1) registration with PKCE is needed.
An example for Authelia is shared below, but other OIDC systems can be used:
```yaml
identity_providers:
oidc:
clients:
- client_id: dashy
client_name: dashy
public: true
authorization_policy: 'one_factor'
require_pkce: true
pkce_challenge_method: 'S256'
redirect_uris:
- https://dashy.local # should point to your dashy endpoint
grant_types:
- authorization_code
scopes:
- 'openid'
- 'profile'
- 'roles'
- 'email'
- 'groups'
```
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:
@ -263,7 +545,7 @@ In NGINX you can specify [control access](https://docs.nginx.com/nginx/admin-gui
```text
server {
listen 80;
listen 8080;
server_name www.dashy.example.com;
location / {
root /path/to/dashy/;

View file

@ -1,5 +1,7 @@
# Cloud Backup and Restore
Beyond the cloud backup/restore service, there are several other self-hosted options you can use to backup Dashy, and any other Docker container data. These are outlined in the Management docs, at: [Docker Backup Options](/docs/management.md#backing-up).
Dashy has a built-in feature for securely backing up your config to a hosted cloud service, and then restoring it on another instance. This feature is totally optional, and if you do not enable it, then Dashy will not make any external network requests.
This is useful not only for backing up your configuration off-site, but it also enables Dashy to be used without having write a YAML config file, and makes it possible to use a public hosted instance, without the need to self-host.

View file

@ -1,6 +1,6 @@
# Configuring
All app configuration is specified in [`/public/conf.yml`](https://github.com/Lissy93/dashy/blob/master/public/conf.yml) which is in [YAML Format](https://yaml.org/) format. If you're using Docker, this file can be passed in as a volume. Changes can either be made directly to this file, or done [through the UI](#editing-config-through-the-ui). From the UI you can also export, backup, reset, validate and download your configuration file.
All app configuration is specified in [`/user-data/conf.yml`](https://github.com/Lissy93/dashy/blob/master/user-data/conf.yml) which is in [YAML Format](https://yaml.org/) format. If you're using Docker, this file can be passed in as a volume. Changes can either be made directly to this file, or done [through the UI](#editing-config-through-the-ui). From the UI you can also export, backup, reset, validate and download your configuration file.
## There are three ways to edit the config
@ -36,6 +36,7 @@ The following file provides a reference of all supported configuration options.
- [`auth`](#appconfigauth-optional) - Built-in authentication setup
- [`users`](#appconfigauthusers-optional) - List or users (for simple auth)
- [`keycloak`](#appconfigauthkeycloak-optional) - Auth config for Keycloak
- [`headerAuth`](#appconfigauthheaderauth-optional) - Auth config for HeaderAuth
- [**`sections`**](#section) - List of sections
- [`displayData`](#sectiondisplaydata-optional) - Section display settings
- [`show/hideForKeycloakUsers`](#sectiondisplaydatahideforkeycloakusers-sectiondisplaydatashowforkeycloakusers-itemdisplaydatahideforkeycloakusers-and-itemdisplaydatashowforkeycloakusers) - Set user controls
@ -92,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)**
@ -101,7 +104,7 @@ The following file provides a reference of all supported configuration options.
**Field** | **Type** | **Required**| **Description**
--- | --- | --- | ---
**`language`** | `string` | _Optional_ | The 2 (or 4-digit) [ISO 639-1 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) for your language, e.g. `en` or `en-GB`. This must be a language that the app has already been [translated](https://github.com/Lissy93/dashy/tree/master/src/assets/locales) into. If your language is unavailable, Dashy will fallback to English. By default Dashy will attempt to auto-detect your language, although this may not work on some privacy browsers.
**`startingView`** | `enum` | _Optional_ | Which page to load by default, and on the base page or domain root. You can still switch to different views from within the UI. Can be either `default`, `minimal` or `workspace`. Defaults to `default`
~~**`startingView`**~~ | `enum` | _Optional_ | Which page to load by default, and on the base page or domain root. You can still switch to different views from within the UI. Can be either `default`, `minimal` or `workspace`. Defaults to `default`. NOTE: This has been replaced by an environmental variable: `VUE_APP_STARTING_VIEW` in V3 onwards
**`defaultOpeningMethod`** | `enum` | _Optional_ | The default opening method for items, if no `target` is specified for a given item. Can be either `newtab`, `sametab`, `modal`, `workspace`, `clipboard`, `top` or `parent`. Defaults to `newtab`
**`statusCheck`** | `boolean` | _Optional_ | When set to `true`, Dashy will ping each of your services and display their status as a dot next to each item. This can be overridden by setting `statusCheck` under each item. Defaults to `false`
**`statusCheckInterval`** | `number` | _Optional_ | The number of seconds between checks. If set to `0` then service will only be checked on initial page load, which is usually the desired functionality. If value is less than `10` you may experience a hit in performance. Defaults to `0`
@ -142,11 +145,23 @@ The following file provides a reference of all supported configuration options.
## `appConfig.auth` _(optional)_
> [!NOTE]
> Since the auth is initiated in the main app entry point (for security), a rebuild is required to apply changes to the auth configuration.
> You can trigger a rebuild through the UI, under Config --> Rebuild, or by running `yarn build` in the root directory.
> [!WARNING]
> Built-in auth should **not be used** for security-critical applications, or if your Dashy instance is publicly accessible.
> For these, it is recommended to use an [alternate authentication method](/docs/authentication.md#alternative-authentication-methods).
**Field** | **Type** | **Required**| **Description**
--- | --- | --- | ---
**`users`** | `array` | _Optional_ | An array of objects containing usernames and hashed passwords. If this is not provided, then authentication will be off by default, and you will not need any credentials to access the app. See [`appConfig.auth.users`](#appconfigauthusers-optional). <br>**Note** this method of authentication is handled on the client side, so for security critical situations, it is recommended to use an [alternate authentication method](/docs/authentication.md#alternative-authentication-methods).
**`enableKeycloak`** | `boolean` | _Optional_ | If set to `true`, then authentication using Keycloak will be enabled. Note that you need to have an instance running, and have also configured `auth.keycloak`. Defaults to `false`
**`keycloak`** | `object` | _Optional_ | Config options to point Dashy to your Keycloak server. Requires `enableKeycloak: true`. See [`auth.keycloak`](#appconfigauthkeycloak-optional) for more info
**`enableHeaderAuth`** | `boolean` | _Optional_ | If set to `true`, then authentication using HeaderAuth will be enabled. Note that you need to have your web server/reverse proxy running, and have also configured `auth.headerAuth`. Defaults to `false`
**`headerAuth`** | `object` | _Optional_ | Config options to point Dashy to your headers for authentication. Requires `enableHeaderAuth: true`. See [`auth.headerAuth`](#appconfigauthheaderauth-optional) for more info
**`enableOidc`** | `boolean` | _Optional_ | If set to `true`, then authentication using OIDC will be enabled. Note that you need to have a configured OIDC server and configure it with `auth.oidc`. Defaults to `false`
**`oidc`** | `object` | _Optional_ | Config options to point Dash to your OIDC configuration. Request `enableOidc: true`. See [`auth.oidc`](#appconfigauthoidc-optional) for more info
**`enableGuestAccess`** | `boolean` | _Optional_ | When set to `true`, an unauthenticated user will be able to access the dashboard, with read-only access, without having to login. Requires `auth.users` to be configured. Defaults to `false`.
For more info, see the **[Authentication Docs](/docs/authentication.md)**
@ -174,6 +189,27 @@ For more info, see the **[Authentication Docs](/docs/authentication.md)**
**[⬆️ Back to Top](#configuring)**
## `appConfig.auth.headerAuth` _(optional)_
**Field** | **Type** | **Required**| **Description**
--- | --- | --- | ---
**`userHeader`** | `string` | _Optional_ | The Header name which contains username (default: REMOTE_USER). Case insensitive
**`proxyWhitelist`** | `array` | Required | An array of Upstream proxy servers to expect authencticated requests from
**[⬆️ Back to Top](#configuring)**
## `appConfig.auth.oidc` _(optional)_
**Field** | **Type** | **Required**| **Description**
--- | --- | --- | ---
**`clientId`** | `string` | Required | The client id registered in the OIDC server
**`endpoint`** | `string` | Required | The URL of the OIDC server that should be used.
**`adminRole`** | `string` | _Optional_ | The role that will be considered as admin.
**`adminGroup`** | `string` | _Optional_ | The group that will be considered as admin.
**`scope`** | `string` | Required | The scope(s) to request from the OIDC provider
**[⬆️ Back to Top](#configuring)**
## `appConfig.webSearch` _(optional)_
**Field** | **Type** | **Required**| **Description**
@ -288,7 +324,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)**

View file

@ -130,7 +130,7 @@ If you like, you could also consider [subscribing to my mailing list](https://no
For a full list of Dashy's contributors, see the [Credits Page](/docs/credits.md)
[![Auto-generated contributors](https://raw.githubusercontent.com/Lissy93/dashy/master/docs/assets/CONTRIBUTORS.svg)](/docs/credits.md)
[![Auto-generated contributors](https://raw.githubusercontent.com/Lissy93/dashy/master/docs/assets/CONTRIBUTORS.svg)](https://github.com/Lissy93/dashy/blob/master/docs/credits.md)
### Star-Gazers Over Time

File diff suppressed because it is too large Load diff

View file

@ -7,7 +7,7 @@ Welcome to Dashy, so glad you're here :) Deployment is super easy, and there are
If you want to skip the fuss, and [get straight down to it](/docs/quick-start.md), then you can spin up a new instance of Dashy by running:
```bash
docker run -p 8080:80 lissy93/dashy
docker run -p 8080:8080 lissy93/dashy
```
See [Management Docs](/docs/management.md) for info about securing, monitoring, updating, health checks, auto starting, web server configuration, etc
@ -67,8 +67,8 @@ Dashy has a built container image hosted on [Docker Hub](https://hub.docker.com/
```bash
docker run -d \
-p 8080:80 \
-v /root/my-local-conf.yml:/app/public/conf.yml \
-p 8080:8080 \
-v /root/my-local-conf.yml:/app/user-data/conf.yml \
--name my-dashboard \
--restart=always \
lissy93/dashy:latest
@ -110,9 +110,9 @@ services:
container_name: Dashy
# Pass in your config file below, by specifying the path on your host machine
# volumes:
# - /root/my-config.yml:/app/public/conf.yml
# - /root/my-config.yml:/app/user-data/conf.yml
ports:
- 4000:80
- 8080:8080
# Set any environmental variables
environment:
- NODE_ENV=production
@ -166,8 +166,8 @@ Installing dashy is really simply and fast:
```bash
docker run -d \
-p 4000:80 \
-v /volume1/docker/dashy/my-local-conf.yml:/app/public/conf.yml \
-p 4000:8080 \
-v /volume1/docker/dashy/my-local-conf.yml:/app/user-data/conf.yml \
--name dashy \
--restart=always \
lissy93/dashy:latest
@ -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 `./public/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

@ -51,7 +51,7 @@ Dashy should now be being served on <http://localhost:8080/>. Hot reload is enab
#### Utils and Checks
- **`yarn validate-config`** - If you have quite a long configuration file, you may wish to check that it's all good to go, before deploying the app. This can be done with `yarn validate-config` or `docker exec -it [container-id] yarn validate-config`. Your config file needs to be in `/public/conf.yml` (or within your Docker container at `/app/public/conf.yml`). This will first check that your YAML is valid, and then validates it against Dashy's [schema](https://github.com/Lissy93/dashy/blob/master/src/utils/ConfigSchema.js).
- **`yarn validate-config`** - If you have quite a long configuration file, you may wish to check that it's all good to go, before deploying the app. This can be done with `yarn validate-config` or `docker exec -it [container-id] yarn validate-config`. Your config file needs to be in `/user-data/conf.yml` (or within your Docker container at `/app/user-data/conf.yml`). This will first check that your YAML is valid, and then validates it against Dashy's [schema](https://github.com/Lissy93/dashy/blob/master/src/utils/ConfigSchema.js).
- **`yarn health-check`** - Checks that the application is up and running on it's specified port, and outputs current status and response times. Useful for integrating into your monitoring service, if you need to maintain high system availability
#### Alternate Start Commands

View file

@ -104,7 +104,7 @@ If you are not comfortable with making pull requests, or do not want to modify t
This section is for, adding a new setting to the config file.
All of the users config is specified in `./public/conf.yml` - see [Configuring Docs](./configuring.md) for info.
All of the users config is specified in `./user-data/conf.yml` - see [Configuring Docs](./configuring.md) for info.
It's important to first ensure that there isn't a similar option already available, the new option is definitely necessary, and most importantly that it is fully backwards compatible.
Next choose the appropriate section to place it under

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:
@ -167,7 +180,7 @@ You can also set an icon by passing in a valid URL pointing to the icons locatio
## Local Icons
You may also want to store your icons locally, bundled within Dashy so that there is no reliance on outside services. This can be done by putting the icons within Dashy's `./public/item-icons/` directory. If you are using Docker, then the easiest option is to map a volume from your host system, for example: `-v /local/image/directory:/app/public/item-icons/`. To reference an icon stored locally, just specify it's name and extension. For example, if my icon was stored in `/app/public/item-icons/maltrail.png`, then I would just set `icon: maltrail.png`.
You may also want to store your icons locally, bundled within Dashy so that there is no reliance on outside services. This can be done by putting the icons within Dashy's `./user-data/item-icons/` directory. If you are using Docker, then the easiest option is to map a volume from your host system, for example: `-v /local/image/directory:/app/user-data/item-icons/`. To reference an icon stored locally, just specify it's name and extension. For example, if my icon was stored in `/app/user-data/item-icons/maltrail.png`, then I would just set `icon: maltrail.png`.
You can also use sub-folders within the `item-icons` directory to keep things organized. You would then specify an icon with it's folder name slash image name. For example: `networking/monit.png`
@ -187,7 +200,7 @@ If you don't wish for a given item or section to have an icon, just leave out th
## Icon Collections and Resources
The following websites provide good-quality, free icon sets. To use any of these icons, either copy the link to the raw icon (it should end in `.svg` or `.png`) and paste it as your `icon`, or download and save the icons in `/public/item-icons` / mapped Docker volume. Full credit to the authors, please see the licenses for each service for usage and copyright information.
The following websites provide good-quality, free icon sets. To use any of these icons, either copy the link to the raw icon (it should end in `.svg` or `.png`) and paste it as your `icon`, or download and save the icons in `/user-data/item-icons` / mapped Docker volume. Full credit to the authors, please see the licenses for each service for usage and copyright information.
- [Icons for Self-Hosted Apps](https://thehomelab.wiki/books/helpful-tools-resources/page/icons-for-self-hosted-dashboards) - 350+ high-quality icons for commonly self-hosted services
- [SVG Box](https://svgbox.net/iconsets/) - Cryptocurrency, social media apps and flag icons

View file

@ -30,11 +30,11 @@ _The following article is a primer on managing self-hosted apps. It covers every
Although not essential, you will most likely want to provide several assets to your running app.
This is easy to do using [Docker Volumes](https://docs.docker.com/storage/volumes/), which lets you share a file or directory between your host system, and the container. Volumes are specified in the Docker run command, or Docker compose file, using the `--volume` or `-v` flags. The value of which consists of the path to the file / directory on your host system, followed by the destination path within the container. Fields are separated by a colon (`:`), and must be in the correct order. For example: `-v ~/alicia/my-local-conf.yml:/app/public/conf.yml`
This is easy to do using [Docker Volumes](https://docs.docker.com/storage/volumes/), which lets you share a file or directory between your host system, and the container. Volumes are specified in the Docker run command, or Docker compose file, using the `--volume` or `-v` flags. The value of which consists of the path to the file / directory on your host system, followed by the destination path within the container. Fields are separated by a colon (`:`), and must be in the correct order. For example: `-v ~/alicia/my-local-conf.yml:/app/user-data/conf.yml`
In Dashy, commonly configured resources include:
- `./public/conf.yml` - Your main application config file
- `./user-data/conf.yml` - Your main application config file
- `./public/item-icons` - A directory containing your own icons. This allows for offline access, and better performance than fetching from a CDN
- Also within `./public` you'll find standard website assets, including `favicon.ico`, `manifest.json`, `robots.txt`, etc. There's no need to pass these in, but you can do so if you wish
- `/src/styles/user-defined-themes.scss` - A stylesheet for applying custom CSS to your app. You can also write your own themes here.
@ -197,7 +197,9 @@ docker run --rm -v some_volume:/volume -v /tmp:/backup alpine sh -c "rm -rf /vol
### Dashy-Specific Backup
Since Dashy is open source, and freely available, providing you're configuration data is passed in as volumes, there shouldn't be any need to backup the main container. Your main config file, and any assets you're using should be kept backed up, preferably in at least two places, and you should ensure that you can easily restore from backup, if needed.
All configuration and dashboard settings are stored in your `user-data/conf.yml` file. If you provide additional assets (like icons, fonts, themes, etc), these will also live in the `user-data` directory. So to backup all Dashy data, this is the only directory you need to backup.
Since Dashy is open source, there shouldn't be any need to backup the main container.
Dashy also has a built-in cloud backup feature, which is free for personal users, and will let you make and restore fully encrypted backups of your config directly through the UI. To learn more, see the [Cloud Backup Docs](/docs/backup-restore.md)
@ -238,7 +240,7 @@ Once you've generated your SSL cert, you'll need to pass it to Dashy. This can b
```bash
docker run -d \
-p 8080:80 \
-p 8080:8080 \
-v ~/my-private-key.key:/etc/ssl/certs/dashy-priv.key:ro \
-v ~/my-public-key.pem:/etc/ssl/certs/dashy-pub.pem:ro \
lissy93/dashy:latest
@ -276,9 +278,9 @@ services:
container_name: Dashy
image: lissy93/dashy
volumes:
- /root/my-config.yml:/app/public/conf.yml
- /root/my-config.yml:/app/user-data/conf.yml
ports:
- 4000:80
- 4000:8080
environment:
- BASE_URL=/my-dashboard
restart: unless-stopped
@ -550,7 +552,7 @@ upstream dashy {
}
server {
listen 80;
listen 8080;
server_name dashy.mydomain.com;
# Setup SSL
@ -577,7 +579,7 @@ Similarly, a basic `Caddyfile` might look like:
```text
dashy.example.com {
reverse_proxy / nginx:80
reverse_proxy / nginx:8080
}
```
@ -614,7 +616,7 @@ To prevent known container escape vulnerabilities, which typically end in escala
Docker enables you to limit resource consumption (CPU, memory, disk) on a per-container basis. This not only enhances system performance, but also prevents a compromised container from consuming a large amount of resources, in order to disrupt service or perform malicious activities. To learn more, see the [Resource Constraints Docs](https://docs.docker.com/config/containers/resource_constraints/)
For example, to run Dashy with max of 1GB ram, and max of 50% of 1 CP core:
`docker run -d -p 8080:80 --cpus=".5" --memory="1024m" lissy93/dashy:latest`
`docker run -d -p 8080:8080 --cpus=".5" --memory="1024m" lissy93/dashy:latest`
### Don't Run as Root
@ -629,7 +631,7 @@ One of the best ways to prevent privilege escalation attacks, is to configure th
You can specify a user, using the [`--user` param](https://docs.docker.com/engine/reference/run/#user), and should include the user ID (`UID`), which can be found by running `id -u`, and the and the group ID (`GID`), using `id -g`.
With Docker run, you specify it like:
`docker run --user 1000:1000 -p 8080:80 lissy93/dashy`
`docker run --user 1000:1000 -p 8080:8080 lissy93/dashy`
Of if you're using Docker-compose, you could use an environmental variable
@ -639,7 +641,7 @@ services:
dashy:
image: lissy93/dashy
user: ${CURRENT_UID}
ports: [ 4000:80 ]
ports: [ 4000:8080 ]
```
And then to set the variable, and start the container, run: `CURRENT_UID=$(id -u):$(id -g) docker-compose up`
@ -659,7 +661,7 @@ version: "3.8"
services:
dashy:
image: lissy93/dashy
ports: [ 4000:80 ]
ports: [ 4000:8080 ]
cap_drop:
- ALL
cap_add:
@ -675,7 +677,7 @@ services:
To prevent processes inside the container from getting additional privileges, pass in the `--security-opt=no-new-privileges:true` option to the Docker run command (see [docs](https://docs.docker.com/engine/reference/run/#security-configuration)).
Run Command:
`docker run --security-opt=no-new-privileges:true -p 8080:80 lissy93/dashy`
`docker run --security-opt=no-new-privileges:true -p 8080:8080 lissy93/dashy`
Docker Compose
@ -701,14 +703,14 @@ You can specify that a specific volume should be read-only by appending `:ro` to
```bash
docker run -d \
-p 8080:80 \
-v ~/dashy-conf.yml:/app/public/conf.yml \
-p 8080:8080 \
-v ~/dashy-conf.yml:/app/user-data/conf.yml \
-v ~/dashy-icons:/app/public/item-icons:ro \
-v ~/dashy-theme.scss:/app/src/styles/user-defined-themes.scss:ro \
lissy93/dashy:latest
```
You can also prevent a container from writing any changes to volumes on your host's disk, using the `--read-only` flag. Although, for Dashy, you will not be able to write config changes to disk, when edited through the UI with this method. You could make this work, by specifying the config directory as a temp write location, with `--tmpfs /app/public/conf.yml` - but that this will not write the volume back to your host.
You can also prevent a container from writing any changes to volumes on your host's disk, using the `--read-only` flag. Although, for Dashy, you will not be able to write config changes to disk, when edited through the UI with this method. You could make this work, by specifying the config directory as a temp write location, with `--tmpfs /app/user-data/conf.yml` - but that this will not write the volume back to your host.
### Set the Logging Level
@ -778,8 +780,8 @@ Create a new file in `/etc/nginx/sites-enabled/dashy`
```text
server {
listen 80;
listen [::]:80;
listen 8080;
listen [::]:8080;
root /var/www/dashy/html;
index index.html;
@ -898,7 +900,7 @@ Similar to above, you'll first need to fork and clone Dashy to your local system
Then, either use Dashy's default [`Dockerfile`](https://github.com/Lissy93/dashy/blob/master/Dockerfile) as is, or modify it according to your needs.
To build and deploy locally, first build the app with: `docker build -t dashy .`, and then start the app with `docker run -p 8080:80 --name my-dashboard dashy`. Or modify the `docker-compose.yml` file, replacing `image: lissy93/dashy` with `build: .` and run `docker compose up`.
To build and deploy locally, first build the app with: `docker build -t dashy .`, and then start the app with `docker run -p 8080:8080 --name my-dashboard dashy`. Or modify the `docker-compose.yml` file, replacing `image: lissy93/dashy` with `build: .` and run `docker compose up`.
Your container should now be running, and will appear in the list when you run `docker container ls a`. If you'd like to enter the container, run `docker exec -it [container-id] /bin/ash`.

View file

@ -8,9 +8,9 @@ You can edit additional pages using the interactive editor, exactly the same was
### Using Local Sub-Pages
To get started, create a new `.yml` config file for your sub-page, placing it within `/app/public`. Then within your primary `conf.yml`, choose a name, and specify the path to the new file.
To get started, create a new `.yml` config file for your sub-page, placing it within `/app/user-data`. Then within your primary `conf.yml`, choose a name, and specify the path to the new file.
For example:
This is an example. Make sure to add this to the topmost line above appConfig:, or anywhere else appropriately, to match the yml syntax.
```yaml
pages:
@ -20,7 +20,17 @@ pages:
path: 'work.yml'
```
If you're sub-page is located within `/app/public`, then you only need to specify the filename, but if it's anywhere else, then the full path is required.
The next step is to create the new page, if you mounted `/app/user-data` in the docker command and not a volume, you can simply create the new page into that folder on the host.
If you mounted `/app/user-data/conf.yml` in docker, you can either switch to the volume or create another bind mount to your new additional page.
If you're sub-page is located within `/app/user-data`, then you only need to specify the filename, but if it's anywhere else, then the full path is required.
A default template a page can be found here: [https://github.com/lissy93/dashy/blob/master/user-data/conf.yml](https://github.com/lissy93/dashy/blob/master/user-data/conf.yml) Keep in mind the appConfig cannot be used on subpages and should be removed, for further info see [Restrictions](#restrictions)
The last very important step is to rebuild dashy, this can be easily done through to UI, by opening the settings menu on the top right, navigato to update config and then recompile application.
Now if you reload the page, on the top right there should be a new button to navigate to the new page. 🎉
### Using Remote Sub-Pages
@ -71,7 +81,7 @@ A normal section will contain zero or more items, for example:
url: http://stackoverflow.com/
```
But items can also be grouped together, referred to as sub-items. This is useful for a group of less frequently used items, which you don't want to take up too much space, or for action buttons (_coming soon_).
But items can also be grouped together, referred to as sub-items. This is useful for a group of less frequently used items, which you don't want to take up too much space.
Item groups may also have an optional title.

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`
@ -192,7 +193,7 @@ The following section outlines all data that is stored in the browsers, as cooki
> [Local storage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage) is persisted between sessions, and only deleted when manually removed
- `LANGUAGE` - The locale to show app text in
- `HIDE_WELCOME_BANNER` - Set to true once user dismissed welcome message, so that it's not shown again
- `HIDE_INFO_NOTIFICATION` - Set to true once user dismissed welcome message, so that it's not shown again
- `LAYOUT_ORIENTATION` - Preferred section layout, either horizontal, vertical or auto
- `COLLAPSE_STATE` - Remembers which sections are collapsed
- `ICON_SIZE` - Size of items, either small, medium or large

View file

@ -2,7 +2,7 @@
Welcome to Dashy! So glad you're here 😊 In a couple of minutes, you'll have your new dashboard up and running 🚀
**TLDR;** Run `docker run -p 8080:80 lissy93/dashy`, then open `http://localhost:8080`
**TLDR;** Run `docker run -p 8080:8080 lissy93/dashy`, then open `http://localhost:8080`
---
@ -19,8 +19,8 @@ To pull the latest image, and build and start the app run:
```bash
docker run -d \
-p 8080:80 \
-v ~/my-conf.yml:/app/public/conf.yml \
-p 8080:8080 \
-v ~/my-conf.yml:/app/user-data/conf.yml \
--name my-dashboard \
--restart=always \
lissy93/dashy:latest
@ -32,15 +32,41 @@ Your dashboard should now be up and running at `http://localhost:8080` (or your
---
## 3. Configure
## 3. User Data Directory
Your config file should be placed inside `user-data/` (in Docker, that's `/app/user-data/`).
This directory can also contain some optional assets you wish to use within your dashboard, like icons, fonts, styles, scripts, etc.
Any files placed here will be served up to the root of the domain, and override the contents of `public/`.
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 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)
- `robots.txt` - Search engine crawl rules, override this if you want your dashboard to be indexable
- `manifest.json` - PWA configuration file, for installing Dashy on mobile devices
- `index.html` - The main index page which initializes the client-side app, copy it from [`/public/index.html`](https://github.com/Lissy93/dashy/blob/master/public/index.html)
- `**.html` - Write your own HTML pages, and access them at `http://my-dashy-instance.local/my-page.html`
- `fonts/` - Custom fonts (be sure to include the ones already in [`public/fonts`](https://github.com/Lissy93/dashy/tree/master/public/fonts)
- `item-icons/` - To use your own icons for items on your dashboard, see [Icons --> Local Icons](/docs/icons.md#local-icons)
- `web-icons/` - Override Dashy logo
- `widget-resources/` - Fonts, icons and assets for custom widgets
---
## 4. Configure
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 [`/public/conf.yml`](https://github.com/Lissy93/dashy/blob/master/public/conf.yml).
The format on the config file is pretty straight forward. There are three root attributes:
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 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
- [`sections`](https://github.com/Lissy93/dashy/blob/master/docs/configuring.md#section) - An array of sections, each including an array of items
- [`pages`](https://github.com/Lissy93/dashy/blob/master/docs/configuring.md#pages-optional) - Have multiples pages in your dashboard
You can view a full list of all available config options in the [Configuring Docs](https://github.com/Lissy93/dashy/blob/master/docs/configuring.md).
@ -72,15 +98,15 @@ sections: # An array of sections
Notes:
- You can use a Docker volume to pass a config file from your host system to the container
- E.g. `-v ./host-system/my-local-conf.yml:/app/public/conf.yml`
- E.g. `-v ./host-system/my-local-conf.yml:/app/user-data/conf.yml`
- It's also possible to edit your config directly through the UI, and changes will be saved in this file
- Check your config against Dashy's schema, with `docker exec -it [container-id] yarn validate-config`
- You might find it helpful to look at some examples, a collection of which can be [found here](https://gist.github.com/Lissy93/000f712a5ce98f212817d20bc16bab10)
- After editing your config, the app will rebuild in the background, which may take a minute
- It's also possible to load a remote config, e.g. from a GitHub Gist
---
## 4. Further Customisation
## 5. Further Customisation
Once you've got Dashy setup, you'll want to ensure the container is properly healthy, secured, backed up and kept up-to-date. All this is covered in the [Management Docs](https://github.com/Lissy93/dashy/blob/master/docs/management.md).
@ -97,7 +123,7 @@ You might also want to check out the docs for specific features you'd like to us
---
## 5. Final Note
## 6. Final Note
If you need any help or support in getting Dashy running, head over to the [Discussions](https://github.com/Lissy93/dashy/discussions) page. If you think you've found a bug, please do [raise it](https://github.com/Lissy93/dashy/issues/new/choose) so it can be fixed. For contact options, see the [Support Page](https://github.com/Lissy93/dashy/blob/master/.github/SUPPORT.md).
@ -118,7 +144,7 @@ yarn build # Build the app
yarn start # Start the app
```
Then edit `./public/conf.yml` and rebuild the app with `yarn build`
Then edit `./user-data/conf.yml`
---
@ -129,7 +155,7 @@ Don't have a server? No problem! You can run Dashy for free on Netlify (as well
1. Fork Dashy's repository on GitHub
2. [Log in](app.netlify.com/login/) to Netlify with GitHub
3. Click "New site from Git" and select your forked repo, then click **Deploy**!
4. You can then edit the config in `./public/conf.yml` in your repo, and Netlify will rebuild the app
4. You can then edit the config in `./user-data/conf.yml` in your repo, and Netlify will rebuild the app
---

View file

@ -3,6 +3,14 @@
| 💗 Got a sweet dashboard? Submit it to the showcase! 👉 [See How](#submitting-your-dashboard) |
|-|
## MNDashboard
> By [@mahrnet](https://github.com/mahrnet) <sup>Re: [#1491](https://github.com/Lissy93/dashy/issues/1491)</sup>
![screenshot-MNDashboard](https://i.ibb.co/mCJRZgp/d2-At-QO4c-PT4u.png)
---
## Home Lab 2.0
![screenshot-homelab](https://raw.githubusercontent.com/Lissy93/dashy/master/docs/showcase/1-home-lab-material.png)

View file

@ -156,7 +156,7 @@ If you're getting an error about scenarios, then you've likely installed the wro
Alternatively, as a workaround, you have several options:
- Try using [NPM](https://www.npmjs.com/get-npm) instead: So clone, cd, then run `npm install`, `npm run build` and `npm start`
- Try using [Docker](https://www.docker.com/get-started) instead, and all of the system setup and dependencies will already be taken care of. So from within the directory, just run `docker build -t lissy93/dashy .` to build, and then use docker start to run the project, e.g: `docker run -it -p 8080:80 lissy93/dashy` (see the [deploying docs](https://github.com/Lissy93/dashy/blob/master/docs/deployment.md#deploy-with-docker) for more info)
- Try using [Docker](https://www.docker.com/get-started) instead, and all of the system setup and dependencies will already be taken care of. So from within the directory, just run `docker build -t lissy93/dashy .` to build, and then use docker start to run the project, e.g: `docker run -it -p 8080:8080 lissy93/dashy` (see the [deploying docs](https://github.com/Lissy93/dashy/blob/master/docs/deployment.md#deploy-with-docker) for more info)
---
@ -234,7 +234,7 @@ Version 2.0.4 introduced changes to how the config is read, and the app is build
```yaml
volumes:
- /srv/dashy/conf.yml:/app/public/conf.yml
- /srv/dashy/conf.yml:/app/user-data/conf.yml
- /srv/dashy/item-icons:/app/public/item-icons
```
@ -273,12 +273,12 @@ See also: #479, #409, #507, #491, #341, #520
Error response from daemon: OCI runtime create failed: container_linux.go:380:
starting container process caused: process_linux.go:545: container init caused:
rootfs_linux.go:76: mounting "/home/ubuntu/my-conf.yml" to rootfs at
"/app/public/conf.yml" caused: mount through procfd: not a directory:
"/app/user-data/conf.yml" caused: mount through procfd: not a directory:
unknown: Are you trying to mount a directory onto a file (or vice-versa)?
Check if the specified host path exists and is the expected type.
```
If you get an error similar to the one above, you are mounting a directory to the config file's location, when a plain file is expected. Create a YAML file, (`touch my-conf.yml`), populate it with a sample config, then pass it as a volume: `-v ./my-local-conf.yml:/app/public/conf.yml`
If you get an error similar to the one above, you are mounting a directory to the config file's location, when a plain file is expected. Create a YAML file, (`touch my-conf.yml`), populate it with a sample config, then pass it as a volume: `-v ./my-local-conf.yml:/app/user-data/conf.yml`
---

File diff suppressed because it is too large Load diff

View file

@ -8,14 +8,12 @@
command = "yarn build"
publish = "dist"
functions = "services/serverless-functions"
environment = { NODE_VERSION = "16.13.2" }
# Site info, used for the 1-Click deploy page
[template.environment]
STATUSKIT_PAGE_TITLE = "Dashy"
STATUSKIT_COMPANY_LOGO = "https://raw.githubusercontent.com/Lissy93/dashy/master/docs/assets/logo.png"
STATUSKIT_SUPPORT_CONTACT_LINK = "https://github.com/lissy93/dashy"
STATUSKIT_RESOURCES_LINK = "https://dashy.to/docs"
# Environmental variables for build command
[build.environment]
NODE_VERSION = "20.11.1"
NODE_OPTIONS = "--openssl-legacy-provider"
YARN_FLAGS = "--ignore-engines"
# Redirect the Node endpoints to serverless functions
[[redirects]]

View file

@ -1,21 +1,20 @@
{
"name": "Dashy",
"version": "2.1.2",
"name": "dashy",
"version": "3.1.1",
"license": "MIT",
"main": "server",
"author": "Alicia Sykes <alicia@omg.lol> (https://aliciasykes.com)",
"scripts": {
"start": "npm-run-all --parallel build-watch start",
"dev": "vue-cli-service serve",
"build": "vue-cli-service build",
"start": "node server",
"dev": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service serve",
"build": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service build",
"lint": "vue-cli-service lint",
"pm2-start": "npx pm2 start server.js",
"build-watch": "vue-cli-service build --watch --mode production",
"build-and-start": "npm-run-all --parallel build-watch start",
"build-and-start": "NODE_OPTIONS=--openssl-legacy-provider npm-run-all --parallel build start",
"validate-config": "node services/config-validator",
"health-check": "node services/healthcheck",
"dependency-audit": "npx improved-yarn-audit --ignore-dev-deps",
"static-start": "node server"
"dependency-audit": "npx improved-yarn-audit --ignore-dev-deps"
},
"dependencies": {
"@babel/core": "^7.0.0",
@ -23,18 +22,20 @@
"@sentry/tracing": "^7.102.1",
"@sentry/vue": "^7.102.1",
"ajv": "^8.10.0",
"axios": "^1.6.0",
"axios": "^1.12.0",
"connect-history-api-fallback": "^1.6.0",
"crypto-js": "^4.2.0",
"express": "^4.17.2",
"express-basic-auth": "^1.2.1",
"frappe-charts": "^1.6.2",
"js-yaml": "^4.1.0",
"keycloak-js": "^20.0.3",
"oidc-client-ts": "^3.0.1",
"register-service-worker": "^1.7.2",
"remedial": "^1.0.8",
"rss-parser": "3.13.0",
"rsup-progress": "^3.2.0",
"simple-icons": "^7.19.0",
"simple-icons": "^14.4.0",
"v-jsoneditor": "^1.4.5",
"v-tooltip": "^2.1.3",
"vue": "^2.7.0",
@ -53,15 +54,18 @@
"@vue/cli-plugin-babel": "^4.5.15",
"@vue/cli-plugin-eslint": "^4.5.15",
"@vue/cli-plugin-pwa": "^4.5.15",
"@vue/cli-service": "^4.5.15",
"@vue/cli-plugin-typescript": "^5.0.8",
"@vue/cli-service": "^4.5.19",
"@vue/eslint-config-standard": "^4.0.0",
"babel-eslint": "^10.0.1",
"copy-webpack-plugin": "6.4.0",
"eslint": "^6.8.0",
"eslint-config-airbnb": "^18.0.1",
"eslint-plugin-vue": "^7.9.0",
"npm-run-all": "^4.1.5",
"sass": "^1.38.0",
"sass-loader": "^7.1.0",
"typescript": "^5.4.4",
"vue-cli-plugin-yaml": "^1.0.2",
"vue-svg-loader": "^0.16.0",
"vue-template-compiler": "^2.7.0"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 827 B

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

View file

@ -50,6 +50,14 @@
<p class="time-note" id="note">This may take a minute or two</p>
<div class="why-am-i-seeing-this">
<h3>Why are you seeing this screen?</h3>
<p>
The app's built files aren't yet present in the /dist directory,
so this page is displayed while we compile the source.
</p>
</div>
<style lang="css">
/* Page Layout Styles */
body,
@ -60,7 +68,7 @@
}
body {
background: #141b33;
background: #0d1220;
display: flex;
flex-direction: column;
justify-content: center;
@ -194,15 +202,34 @@
}
.hide { display: none; }
.why-am-i-seeing-this {
color: #808080a6;
font-family: Tahoma, 'Trebuchet MS', sans-serif;
max-width: 25rem;
border: 2px solid #808080a6;
border-radius: 6px;
padding: 0.5rem;
position: absolute;
bottom: 1rem;
background: #8080800d;
font-size: 0.9rem;
}
.why-am-i-seeing-this h3 {
margin: 0 0 0.5rem 0;
}
.why-am-i-seeing-this p {
margin: 0;
}
</style>
<script>
const refreshRate = 8000;
// Refresh at interval
// Refresh the page every 10 seconds
const refreshRate = 10000;
setTimeout(() => { location.reload(); }, refreshRate);
// Get current stage
let initStage = parseInt(sessionStorage.getItem('initStage') || 0);
// Get current stage
let initStage = parseInt(sessionStorage.getItem('initStage') || 0);
// Check if stage in session storage is old, and if so, reset it
const now = Math.round(Date.now()/1000);
@ -262,4 +289,4 @@
</script>
</body>
</html>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 794 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

109
server.js
View file

@ -6,19 +6,27 @@
* */
/* Import built-in Node server modules */
const fs = require('fs');
const os = require('os');
const dns = require('dns');
const http = require('http');
const path = require('path');
const util = require('util');
const dns = require('dns');
const os = require('os');
const crypto = require('crypto');
/* Import NPM dependencies */
const yaml = require('js-yaml');
/* Import Express + middleware functions */
const express = require('express');
const basicAuth = require('express-basic-auth');
const history = require('connect-history-api-fallback');
/* Kick of some basic checks */
require('./services/update-checker'); // Checks if there are any updates available, prints message
require('./services/config-validator'); // Include and kicks off the config file validation script
let config = {}; // setup the config
config = require('./services/config-validator'); // Include and kicks off the config file validation script
/* Include route handlers for API endpoints */
const statusCheck = require('./services/status-check'); // Used by the status check feature, uses GET
@ -27,6 +35,7 @@ const rebuild = require('./services/rebuild-app'); // A script to programmatical
const systemInfo = require('./services/system-info'); // Basic system info, for resource widget
const sslServer = require('./services/ssl-server'); // TLS-enabled web server
const corsProxy = require('./services/cors-proxy'); // Enables API requests to CORS-blocked services
const getUser = require('./services/get-user'); // Enables server side user lookup
/* Helper functions, and default config */
const printMessage = require('./services/print-message'); // Function to print welcome msg on start
@ -35,12 +44,15 @@ const ENDPOINTS = require('./src/utils/defaults').serviceEndpoints; // API endpo
/* Checks if app is running within a container, from env var */
const isDocker = !!process.env.IS_DOCKER;
/* Checks env var for port. If undefined, will use Port 80 for Docker, or 4000 for metal */
const port = process.env.PORT || (isDocker ? 80 : 4000);
/* Checks env var for port. If undefined, will use Port 8080 for Docker, or 4000 for metal */
const port = process.env.PORT || (isDocker ? 8080 : 4000);
/* Checks env var for host. If undefined, will use 0.0.0.0 */
const host = process.env.HOST || '0.0.0.0';
/* Indicates for the webpack config, that running as a server */
process.env.IS_SERVER = 'True';
/* Attempts to get the users local IP, used as part of welcome message */
const getLocalIp = () => {
const dnsLookup = util.promisify(dns.lookup);
@ -55,7 +67,7 @@ const printWelcomeMessage = () => {
console.log(printMessage(ip, port, isDocker)); // eslint-disable-line no-console
});
} catch (e) {
// Fetching info for welcome message failed, print simple msg instead
// No clue what could of gone wrong here, but print fallback message if above failed
console.log(`Dashy server has started (${port})`); // eslint-disable-line no-console
}
};
@ -65,32 +77,88 @@ const printWarning = (msg, error) => {
console.warn(`\x1b[103m\x1b[34m${msg}\x1b[0m\n`, error || ''); // eslint-disable-line no-console
};
/* Load appConfig.auth.users from config (if present) for authorization purposes */
function loadUserConfig() {
try {
const filePath = path.join(__dirname, process.env.USER_DATA_DIR || 'user-data', 'conf.yml');
const fileContents = fs.readFileSync(filePath, 'utf8');
const data = yaml.load(fileContents);
return data?.appConfig?.auth?.users || null;
} catch (e) {
return [];
}
}
/* If HTTP auth is enabled, and no username/password are pre-set, then check passed credentials */
function customAuthorizer(username, password) {
const sha256 = (input) => crypto.createHash('sha256').update(input).digest('hex').toUpperCase();
const generateUserToken = (user) => {
if (!user.user || (!user.hash && !user.password)) return '';
const strAndUpper = (input) => input.toString().toUpperCase();
const passwordHash = user.hash || sha256(process.env[user.password]);
const sha = sha256(strAndUpper(user.user) + strAndUpper(passwordHash));
return strAndUpper(sha);
};
if (password.startsWith('Bearer ')) {
const token = password.slice('Bearer '.length);
const users = loadUserConfig();
return users.some(user => generateUserToken(user) === token);
} else {
const users = loadUserConfig();
const userHash = sha256(password);
return users.some(user => (
user.user.toLowerCase() === username.toLowerCase() && user.hash.toUpperCase() === userHash
));
}
}
/* If a username and password are set, setup auth for config access, otherwise skip */
function getBasicAuthMiddleware() {
const configUsers = process.env.ENABLE_HTTP_AUTH ? loadUserConfig() : null;
const { BASIC_AUTH_USERNAME, BASIC_AUTH_PASSWORD } = process.env;
if (BASIC_AUTH_USERNAME && BASIC_AUTH_PASSWORD) {
return basicAuth({
users: { [BASIC_AUTH_USERNAME]: BASIC_AUTH_PASSWORD },
challenge: true,
unauthorizedResponse: () => 'Unauthorized - Incorrect username or password',
});
} else if ((configUsers && configUsers.length > 0)) {
return basicAuth({
authorizer: customAuthorizer,
challenge: true,
unauthorizedResponse: () => 'Unauthorized - Incorrect token',
});
} else {
return (req, res, next) => next();
}
}
const protectConfig = getBasicAuthMiddleware();
/* A middleware function for Connect, that filters requests based on method type */
const method = (m, mw) => (req, res, next) => (req.method === m ? mw(req, res, next) : next());
const app = express()
// Load SSL redirection middleware
.use(sslServer.middleware)
// Serves up static files
.use(express.static(path.join(__dirname, 'dist')))
.use(express.static(path.join(__dirname, 'public'), { index: 'initialization.html' }))
// Load middlewares for parsing JSON, and supporting HTML5 history routing
.use(express.json({ limit: '1mb' }))
.use(history())
// GET endpoint to run status of a given URL with GET request
.use(ENDPOINTS.statusCheck, (req, res) => {
try {
statusCheck(req.url, async (results) => {
res.setHeader('Content-Type', 'application/json');
await res.end(results);
});
} catch (e) {
printWarning(`Error running status check for ${req.url}\n`, e);
}
})
// POST Endpoint used to save config, by writing conf.yml to disk
// POST Endpoint used to save config, by writing config file to disk
.use(ENDPOINTS.save, method('POST', (req, res) => {
try {
saveConfig(req.body, (results) => { res.end(results); });
config = req.body.config; // update the config
} catch (e) {
printWarning('Error writing config file to disk', e);
res.end(JSON.stringify({ success: false, message: e }));
@ -122,6 +190,25 @@ const app = express()
res.end(JSON.stringify({ success: false, message: e }));
}
})
// GET endpoint to return user info
.use(ENDPOINTS.getUser, (req, res) => {
try {
const user = getUser(config, req);
res.end(JSON.stringify(user));
} catch (e) {
res.end(JSON.stringify({ success: false, message: e }));
}
})
// Middleware to serve any .yml files in USER_DATA_DIR with optional protection
.get('/*.yml', protectConfig, (req, res) => {
const ymlFile = req.path.split('/').pop();
res.sendFile(path.join(__dirname, process.env.USER_DATA_DIR || 'user-data', ymlFile));
})
// Serves up static files
.use(express.static(path.join(__dirname, process.env.USER_DATA_DIR || 'user-data')))
.use(express.static(path.join(__dirname, 'dist')))
.use(express.static(path.join(__dirname, 'public'), { index: 'initialization.html' }))
.use(history())
// If no other route is matched, serve up the index.html with a 404 status
.use((req, res) => {
res.status(404).sendFile(path.join(__dirname, 'dist', 'index.html'));

View file

@ -11,7 +11,7 @@ const schema = require('../src/utils/ConfigSchema.json');
/* Tell AJV to use strict mode, and report all errors */
const validatorOptions = {
strict: true,
strict: false,
allowUnionTypes: true,
allErrors: true,
};
@ -98,11 +98,14 @@ const printFileReadError = (e) => {
}
};
let config = {};
try { // Try to open and parse the YAML file
const config = yaml.load(fs.readFileSync('./public/conf.yml', 'utf8'));
config = yaml.load(fs.readFileSync(`./${process.env.USER_DATA_DIR || 'user-data'}/conf.yml`, 'utf8'));
validate(config);
} catch (e) { // Something went very wrong...
setIsValidVariable(false);
logToConsole(bigError());
printFileReadError(e);
}
module.exports = config;

15
services/get-user.js Normal file
View file

@ -0,0 +1,15 @@
module.exports = (config, req) => {
try {
if (config.appConfig.auth.enableHeaderAuth) {
const { userHeader } = config.appConfig.auth.headerAuth;
const { proxyWhitelist } = config.appConfig.auth.headerAuth;
if (proxyWhitelist.includes(req.socket.remoteAddress)) {
return { success: true, user: req.headers[userHeader.toLowerCase()] };
}
}
return {};
} catch (e) {
console.warn('Error get-user: ', e);
return { success: false };
}
};

View file

@ -6,11 +6,17 @@
const isSsl = !!process.env.SSL_PRIV_KEY_PATH && !!process.env.SSL_PUB_KEY_PATH;
// eslint-disable-next-line import/no-dynamic-require
const http = require(isSsl ? 'https' : 'http');
/* Location of the server to test */
const isDocker = !!process.env.IS_DOCKER;
const port = isSsl ? (process.env.SSL_PORT || (isDocker ? 443 : 4001)) : (process.env.PORT || (isDocker ? 80 : 4000));
/* Get the port to use (depending on, if docker, if SSL) */
const sslPort = process.env.SSL_PORT || (isDocker ? 443 : 4001);
const normalPort = process.env.PORT || (isDocker ? 8080 : 4000);
const port = isSsl ? sslPort : normalPort;
const host = process.env.HOST || '0.0.0.0';
const timeout = 2000;
@ -18,7 +24,9 @@ const agent = new http.Agent({
rejectUnauthorized: false, // Allow self-signed certificates
});
const requestOptions = { host, port, timeout, agent };
const requestOptions = {
host, port, timeout, agent,
};
const startTime = new Date(); // Initialize timestamp to calculate time taken

View file

@ -32,7 +32,7 @@ module.exports = (ip, port, isDocker) => {
} else {
// Prepare message for users running app on bare metal
msg = `${chars.GREEN}${line(75)}${chars.BR}`
+ `${chars.CYAN}Welcome to Dashy! 🚀${blanks(55)}${chars.GREEN}${chars.BR}`
+ `${chars.CYAN}Welcome to Dashy! 🚀${blanks(54)}${chars.GREEN}${chars.BR}`
+ `${chars.CYAN}Your new dashboard is now up and running at ${chars.BRIGHT}`
+ `http://${ip}:${port}${chars.RESET}${blanks(18 - ip.length)}${chars.GREEN}${chars.BR}`
+ `${line(75)}${chars.BR}${chars.BR}${chars.RESET}`;

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

@ -14,19 +14,24 @@ module.exports = async (newConfig, render) => {
return configObj.filename.replaceAll('/', '').replaceAll('..', '');
};
// Path to config file (with navigational characters stripped)
const usersFileName = makeSafeFileName(newConfig);
// Path to user data directory
const userDataDirectory = process.env.USER_DATA_DIR || './user-data/';
// Define constants for the config file
const settings = {
defaultLocation: './public/',
defaultLocation: userDataDirectory,
backupLocation: process.env.BACKUP_DIR || path.join(userDataDirectory, 'config-backups'),
defaultFile: 'conf.yml',
filename: 'conf',
backupDenominator: '.backup.yml',
};
// Make the full file name and path to save the backup config file
const backupFilePath = path.normalize(process.env.BACKUP_DIR || settings.defaultLocation)
+ `/${usersFileName || settings.filename}-`
const backupFilePath = `${path.normalize(settings.backupLocation)
}/${usersFileName || settings.filename}-`
+ `${Math.round(new Date() / 1000)}${settings.backupDenominator}`;
// The path where the main conf.yml should be read and saved to
@ -45,15 +50,20 @@ module.exports = async (newConfig, render) => {
message: !success ? errorMsg : getSuccessMessage(),
});
// Makes a backup of the existing config file
// Create a backup of current config, and if backup dir doesn't yet exist, create it
await fsPromises
.copyFile(defaultFilePath, backupFilePath)
.catch((error) => render(getRenderMessage(false, `Unable to backup conf.yml: ${error}`)));
.mkdir(settings.backupLocation, { recursive: true })
.then(() => fsPromises.copyFile(defaultFilePath, backupFilePath))
.catch((error) => render(
getRenderMessage(false, `Unable to backup ${settings.defaultFile}: ${error}`),
));
// Writes the new content to the conf.yml file
await fsPromises
.writeFile(defaultFilePath, newConfig.config.toString(), writeFileOptions)
.catch((error) => render(getRenderMessage(false, `Unable to write to conf.yml: ${error}`)));
.catch((error) => render(
getRenderMessage(false, `Unable to write to ${settings.defaultFile}: ${error}`),
));
// If successful, then render hasn't yet been called- call it
await render(getRenderMessage(true));

View file

@ -4,6 +4,7 @@
<LoadingScreen :isLoading="isLoading" v-if="shouldShowSplash" />
<Header :pageInfo="pageInfo" />
<router-view v-if="!isFetching" />
<CriticalError v-if="hasCriticalError" />
<Footer :text="footerText" v-if="visibleComponents.footer && !isFetching" />
</div>
</template>
@ -12,6 +13,7 @@
import Header from '@/components/PageStrcture/Header.vue';
import Footer from '@/components/PageStrcture/Footer.vue';
import EditModeTopBanner from '@/components/InteractiveEditor/EditModeTopBanner.vue';
import CriticalError from '@/components/PageStrcture/CriticalError.vue';
import LoadingScreen from '@/components/PageStrcture/LoadingScreen.vue';
import { welcomeMsg } from '@/utils/CoolConsole';
import ErrorHandler from '@/utils/ErrorHandler';
@ -29,6 +31,7 @@ export default {
Footer,
LoadingScreen,
EditModeTopBanner,
CriticalError,
},
data() {
return {
@ -64,7 +67,7 @@ export default {
return this.$store.getters.pageInfo;
},
sections() {
return this.$store.getters.pageInfo;
return this.$store.getters.sections;
},
visibleComponents() {
return this.$store.getters.visibleComponents;
@ -72,6 +75,9 @@ export default {
isEditMode() {
return this.$store.state.editMode;
},
hasCriticalError() {
return this.$store.state.criticalError;
},
subPageClassName() {
const currentSubPage = this.$store.state.currentConfigInfo;
return (currentSubPage && currentSubPage.pageId) ? currentSubPage.pageId : '';
@ -149,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

@ -2,7 +2,7 @@
"home": {
"no-results": "Ingen søgeresultater",
"no-data": "Ingen data konfigureret",
"no-items-section": "Ingen genstander at vise endnu"
"no-items-section": "Ingen genstande at vise endnu"
},
"search": {
"search-label": "Søg",
@ -20,7 +20,7 @@
"remember-me-hour": "4 timer",
"remember-me-day": "1 dag",
"remember-me-week": "1 uge",
"remember-me-long-time": "en lang tid",
"remember-me-long-time": "lang tid",
"error-missing-username": "Mangler brugernavn",
"error-missing-password": "Manglende adgangskode",
"error-incorrect-username": "Bruger ikke fundet",
@ -54,7 +54,7 @@
"reset-config-msg-l3": "Er du sikker på at du vil fortsætte?",
"data-cleared-msg": "Data blev succesfuldt ryddet",
"actions-label": "Handlinger",
"copy-config-label": "Kopiera Config",
"copy-config-label": "Kopiere Config",
"data-copied-msg": "Konfigurationen er blevet kopieret til clipboard",
"reset-config-label": "Nulstil konfiguration",
"css-save-btn": "Gem ændringer",
@ -95,7 +95,7 @@
"language-switcher": {
"title": "Skift applikationssprog",
"dropdown-label": "Valg en sprog",
"save-button": "Gemme",
"save-button": "Gem",
"success-msg": "Sprog opdateret til"
},
"theme-maker": {
@ -104,17 +104,17 @@
"reset-button": "Nulstil styles for",
"show-all-button": "Vis alle variabler",
"change-fonts-button": "Skift skrifttyper",
"save-button": "Gemme",
"cancel-button": "Ophæve",
"saved-toast": "{theme} opdateret med succes",
"save-button": "Gem",
"cancel-button": "Annuller",
"saved-toast": "{theme} opdateret succesfuldt",
"copied-toast": "Temadata for {theme} kopieret til udklipsholder",
"reset-toast": "Tilpassede farver for {theme} fjernet"
},
"config-editor": {
"save-location-label": "Gemme beliggenhed",
"location-local-label": "Anbringe lokalt",
"save-location-label": "Lokation for gem",
"location-local-label": "Gem lokalt",
"location-disk-label": "Skriv ændringer til konfigurationsfil",
"save-button": "Gemme ændringer",
"save-button": "Gem ændringer",
"preview-button": "Forhåndsvisning af ændringer",
"valid-label": "Konfigurationen er gyldig",
"status-success-msg": "Opgave fuldført",
@ -155,7 +155,7 @@
"password-label-update": "Skriv dit kodeord",
"backup-button-setup": "Sikkerhedskopiering",
"backup-button-update": "Opdater sikkerhedskopiering",
"backup-id-label": "Din sikkerhedskopi-ID",
"backup-id-label": "Dit sikkerhedskopi-ID",
"backup-id-note": "Dette bruges til at gendanne fra sikkerhedskopier senere. Så gem det sammen med din adgangskode et sikkert sted.",
"restore-title": "Gendan en sikkerhedskopi",
"restore-id-label": "Gendan-ID",
@ -165,7 +165,7 @@
"backup-error-unknown": "Kan ikke behandle anmodningen",
"backup-error-password": "Forkert kodeord. Indtast venligst din nuværende adgangskode.",
"backup-success-msg": "Afsluttet med succes",
"restore-success-msg": "Konfiguration gendan med succes"
"restore-success-msg": "Konfiguration gendannet med succes"
},
"menu": {
"open-section-title": "Åbn i",
@ -174,9 +174,9 @@
"modal": "Pop-Up Modal",
"workspace": "Arbejdsrumsvisning",
"options-section-title": "Muligheder",
"edit-item": "Redigere",
"edit-item": "Rediger",
"move-item": "Kopier eller flyt",
"remove-item": "Fjerne"
"remove-item": "Fjern"
},
"context-menus": {
"item": {
@ -187,14 +187,14 @@
"workspace": "Arbejdsrumsvisning",
"clipboard": "Kopier til udklipsholder",
"options-section-title": "Muligheder",
"edit-item": "Redigere",
"edit-item": "Rediger",
"move-item": "Kopier eller flyt",
"remove-item": "Fjerne",
"copied-toast": "URL er blevet kopieret til udklipsholder"
},
"section": {
"open-section": "Åbn sektion",
"edit-section": "Redigere",
"edit-section": "Rediger",
"expand-collapse": "Udvid / Skjul",
"move-section": "Flytte til",
"remove-section": "Fjerne"
@ -206,35 +206,35 @@
"edit-site-data-subheading": "Rediger webstedsdata",
"edit-page-info-btn": "Rediger sideoplysninger",
"edit-page-info-tooltip": "Apptitel, beskrivelse, navigationslinks, sidefodstekst osv.",
"edit-app-config-btn": "Redigere appkonfiguration",
"edit-app-config-btn": "Rediger appkonfiguration",
"edit-app-config-tooltip": "Alle andre appkonfigurationsmuligheder",
"edit-pages-btn": "Redigere sider",
"edit-pages-btn": "Rediger sider",
"edit-pages-tooltip": "Tilføj eller fjern yderligere visninger",
"config-save-methods-subheading": "Indstillinger for lagring af konfiguration",
"save-locally-btn": "Gemme lokalt",
"save-locally-btn": "Gem lokalt",
"save-locally-tooltip": "Gem konfigurationen lokalt i browserlageret. Dette vil ikke påvirke din konfigurationsfil, men ændringer vil kun blive gemt på denne enhed",
"save-disk-btn": "Gemme til disk",
"save-disk-btn": "Gem til disk",
"save-disk-tooltip": "Gem konfigurationen i filen conf.yml på disken. Dette vil sikkerhedskopiere og derefter overskrive din eksisterende konfiguration",
"export-config-btn": "Exportere konfiguration",
"export-config-btn": "Exporter konfiguration",
"export-config-tooltip": "Se og eksporter ny konfiguration, enten til en fil eller til udklipsholder",
"cloud-backup-btn": "Sikkerhedskopier til cloud",
"cloud-backup-tooltip": "Gem krypteret backup af konfiguration til cloud",
"edit-raw-config-btn": "Rediger rå konfiguration",
"edit-raw-config-tooltip": "Se og rediger rå config via JSON-editor",
"cancel-changes-btn": "Avbryd redigering",
"cancel-changes-btn": "Afbryd redigering",
"cancel-changes-tooltip": "Nulstil aktuelle ændringer, og afslut redigeringstilstand. Dette vil ikke påvirke din gemte konfiguration",
"edit-mode-name": "Redigeringstilstand",
"edit-mode-subtitle": "Du er i redigeringstilstand",
"edit-mode-description": "Det betyder, at du kan foretage ændringer i din konfiguration og se resultaterne, men indtil du gemmer, vil ingen af dine ændringer blive bevaret.",
"save-stage-btn": "Gemme",
"cancel-stage-btn": "Avbryd",
"save-stage-btn": "Gem",
"cancel-stage-btn": "Afbryd",
"save-locally-warning": "Hvis du fortsætter, vil ændringer kun blive gemt i din browser. Du bør eksportere en kopi af din konfiguration til brug på andre maskiner. Vil du fortsætte?"
},
"edit-item": {
"missing-title-err": "En varetitel er påkrævet"
},
"edit-section": {
"edit-section-title": "Redigere sektion",
"edit-section-title": "Rediger sektion",
"add-section-title": "Tilføj ny sektion",
"edit-tooltip": "Klik for at redigere, eller højreklik for at få flere muligheder",
"remove-confirm": "Er du sikker på, at du vil fjerne denne sektion? Denne handling kan fortrydes senere."
@ -273,11 +273,11 @@
"cpu-chart-title": "CPU-historie",
"mem-chart-title": "Hukommelsesbrug",
"mem-breakdown-title": "Hukommelsesnedbrydning",
"load-chart-title": "Systeminlæsning"
"load-chart-title": "Systemindlæsning"
},
"glances": {
"disk-space-free": "Ledig",
"disk-space-used": "I bruk",
"disk-space-used": "I brug",
"disk-mount-point": "Mount Point",
"disk-file-system": "Filsystem",
"disk-io-read": "Læs",
@ -329,7 +329,7 @@
"disk-space": "Diskudrymme",
"dnd": "Forstyr ikke",
"email": "email",
"enabled": "aktivert",
"enabled": "aktiveret",
"federated-shares-ucfirst": "Fødereret deler",
"federated-shares": "fødereret deler",
"files": "fil{plural}",
@ -363,7 +363,7 @@
"other": "andet",
"overall": "Samlet set",
"private-link": "privat link",
"public-link": "publik link",
"public-link": "offentlig link",
"quota-enabled": "Diskkvote er {not} aktiveret for denne bruger",
"received": "modtaget",
"scripts": "scripts",
@ -371,7 +371,7 @@
"started": "Startede",
"storages-by-type": "Opbevaring efter type",
"storages": "Opbevaring{plural}",
"strings-use": "strings brug",
"strings-use": "tråde brug",
"tasks": "Opgaver",
"total-files": "samlede filer",
"total-users": "samlede bruger",
@ -379,7 +379,7 @@
"until": "Så længe",
"updates-available-for": "Opdateringer er tilgængelige for",
"updates-available": "opdatering{plural} tilgængelig",
"used": "brugd",
"used": "brugt",
"user": "bruger",
"using": "ved brug af",
"version": "version",

View file

@ -171,9 +171,9 @@
"status-fail-msg": "Task Failed",
"success-msg-disk": "Config file written to disk successfully",
"success-msg-local": "Local changes saved successfully",
"success-note-l1": "The app should rebuild automatically.",
"success-note-l2": "This may take up to a minute.",
"success-note-l3": "You will need to refresh the page for changes to take effect.",
"success-note-l1": "You will need to refresh the page for changes to take effect.",
"success-note-l2": "",
"success-note-l3": "",
"error-msg-save-mode": "Please select a Save Mode: Local or File",
"error-msg-cannot-save": "An error occurred saving config",
"error-msg-bad-json": "Error in JSON, possibly malformed",
@ -182,9 +182,9 @@
},
"app-rebuild": {
"title": "Rebuild Application",
"rebuild-note-l1": "A rebuild is required for changes written to the conf.yml file to take effect.",
"rebuild-note-l2": "This should happen automatically, but if it hasn't, you can manually trigger it here.",
"rebuild-note-l3": "This is not required for modifications stored locally.",
"rebuild-note-l1": "A rebuild is no longer required for changes to take effect.",
"rebuild-note-l2": "Some changes (entry-point, and auth settings) are read at build-time. So to apply these, you should trigger a rebuild here.",
"rebuild-note-l3": "Note that this is only available on Node and Docker installations, not via statically deployed instances.",
"rebuild-button": "Start Build",
"rebuilding-status-1": "Building...",
"rebuilding-status-2": "This may take a few minutes",
@ -312,6 +312,14 @@
"view-title": "View Config"
}
},
"critical-error": {
"title": "Configuration Load Error",
"subtitle": "Dashy has failed to load correctly due to a configuration error.",
"sub-ensure-that": "Ensure that",
"sub-error-details": "Error Details",
"sub-next-steps": "Next Steps",
"ignore-button": "Ignore Critical Errors"
},
"widgets": {
"general": {
"loading": "Loading...",

385
src/assets/locales/hu.json Normal file
View file

@ -0,0 +1,385 @@
{
"home": {
"no-results": "Nincs találat a keresésre",
"no-data": "Nincs beállítva adat",
"no-items-section": "Még nincs mit megjeleníteni"
},
"search": {
"search-label": "Keresés",
"search-placeholder": "Kezdj el gépelni a szűréshez",
"clear-search-tooltip": "Keresés törlése",
"enter-to-search-web": "Nyomj entert a webes kereséshez"
},
"splash-screen": {
"loading": "Betöltés"
},
"login": {
"title": "Dashy",
"guest-label": "Vendég hozzáférés",
"username-label": "Felhasználónév",
"password-label": "Jelszó",
"login-button": "Bejelentkezés",
"remember-me-label": "Emlékezz rám",
"remember-me-never": "Soha",
"remember-me-hour": "4 óráig",
"remember-me-day": "1 napig",
"remember-me-week": "1 hétig",
"remember-me-long-time": "Hosszabb ideig",
"error-missing-username": "Hiányzó felhasználónév",
"error-missing-password": "Hiányzó jelszó",
"error-incorrect-username": "A felhasználó nem található",
"error-incorrect-password": "Hibás jelszó",
"success-message": "Bejelentkezés folyamatban...",
"logout-message": "Kijelentkezve",
"already-logged-in-title": "Már be vagy jelentkezve",
"already-logged-in-text": "Be vagy jelentkezve mint",
"proceed-to-dashboard": "Tovább az irányítópultra",
"log-out-button": "Kijelentkezés",
"proceed-guest-button": "Belépés vendégként",
"guest-intro-1": "Ez a rendszer engedélyezi a vendég hozzáférést.",
"guest-intro-2": "A vendég felhasználók csak megtekinthetik az irányítópultokat, módosításokat nem tudnak menteni.",
"error": "Hiba",
"error-no-user-configured": "A hitelesítés nincs engedélyezve, vagy nincs beállított felhasználó",
"error-go-home-button": "Vissza a főoldalra",
"logged-in-guest": "Vendégként bejelentkezve, átirányítás...",
"error-guest-access": "A vendég hozzáférés nem engedélyezett"
},
"app-info": {
"title": "App Info",
"error-log": "Hibanapló",
"no-errors": "Nem található friss hiba",
"help-support": "Súgó és támogatás",
"help-support-description" : "Ha segítségre van szükséged a Dashy futtatásához vagy beállításához, nézd meg a",
"help-support-discussions": "fórumot",
"support-dashy": "Dashy támogatása",
"support-dashy-description": "Ha szeretnél részt venni a projektben, nézd meg a",
"support-dashy-link": "közreműködők oldalát",
"report-bug": "Hiba bejelentése",
"report-bug-description": "Ha úgy gondolod, hogy hibát találtál, kérlek",
"report-bug-link": "jelentsd be itt",
"more-info": "További információ",
"source": "Forráskód",
"documentation": "Dokumentáció",
"privacy-and-security": "Adatvédelem és biztonság",
"privacy-and-security-l1": "Ha szeretnéd megtudni, hogyan kezeli a Dashy az adataidat, nézd meg az",
"privacy-and-security-privacy-policy": "adatvédelmi irányelveinket",
"privacy-and-security-advice": "Ha tanácsot keresel az irányítópultod biztonságossá tételéhez, olvasd el a",
"privacy-and-security-advice-link": "kezelési útmutatót",
"privacy-and-security-security-issue": "Ha biztonsági hibát találtál, jelezd azt a",
"privacy-and-security-security-policy": "biztonsági szabályzatunk alapján",
"license": "Licenc",
"license-under": "Licenc típusa:",
"licence-third-party": "A harmadik féltől származó modulok licenceiért látogasd meg a",
"licence-third-party-link": "jogi oldalunkat",
"list-contributors": "A teljes közreműködői lista és köszönetnyilvánítás itt található:",
"list-contributors-link": "Készítők",
"version": "Verzió"
},
"config": {
"main-tab": "Főmenü",
"view-config-tab": "Beállítások megtekintése",
"edit-config-tab": "Beállítások szerkesztése",
"custom-css-tab": "Egyéni stílusok",
"heading": "Beállítási lehetőségek",
"download-config-button": "Megtekintés / Exportálás",
"edit-config-button": "Beállítások szerkesztése",
"edit-css-button": "Egyéni CSS szerkesztése",
"cloud-sync-button": "Szinkronizálás bekapcsolása",
"edit-cloud-sync-button": "Szinkronizálási beállítások szerkesztése",
"rebuild-app-button": "Alkalmazás újraépítése",
"change-language-button": "Nyelv módosítása",
"reset-settings-button": "Helyi beállítások visszaállítása",
"disabled-note": "Néhány beállítási lehetőséget a rendszergazda letiltott",
"small-screen-note": "Kis képernyőt használsz, ezért néhány menüelem nem tud jól megjelenni",
"app-info-button": "App infó",
"backup-note": "Módosítás előtt érdemes biztonsági mentést készíteni a beállításokról.",
"reset-config-msg-l1": "Ez törli az összes helyi beállítást, de nem módosítja a 'conf.yml' fájlt.",
"reset-config-msg-l2": "Mentsd el a helyi változtatásokat, ha később is használni akarod őket",
"reset-config-msg-l3": "Biztosan folytatod?",
"data-cleared-msg": "Az adatok sikeresen törölve",
"actions-label": "Műveletek",
"copy-config-label": "Beállítások másolása",
"data-copied-msg": "A konfiguráció a vágólapra másolva",
"reset-config-label": "Beállítások visszaállítása",
"css-save-btn": "Változtatások mentése",
"css-note-label": "Megjegyzés",
"css-note-l1": "A változtatások életbe lépéséhez frissítened kell az oldalt.",
"css-note-l2": "A stílusmódosítások csak helyben vannak mentve, ezért ajánlott másolatot készíteni a CSS-ről.",
"css-note-l3": "Az összes egyéni stílus eltávolításához töröld a tartalmat, majd mentsd a változtatásokat.",
"custom-css": {
"title": "Egyéni CSS",
"base-theme": "Alaptéma"
}
},
"alternate-views": {
"alternate-view-heading": "Váltás másik nézetre",
"default": "Alapértelmezett",
"workspace": "Munkaterület",
"minimal": "Minimalista"
},
"settings": {
"theme-label": "Téma",
"layout-label": "Elrendezés",
"layout-auto": "Automatikus",
"layout-horizontal": "Vízszintes",
"layout-vertical": "Függőleges",
"item-size-label": "Elem mérete",
"item-size-small": "Kicsi",
"item-size-medium": "Közepes",
"item-size-large": "Nagy",
"config-launcher-label": "Beállítások",
"config-launcher-tooltip": "Beállítások frissítése",
"sign-out-tooltip": "Kijelentkezés",
"sign-in-tooltip": "Bejelentkezés",
"sign-in-welcome": "Szia, {username}!",
"hide": "Elrejtés",
"open": "Megnyitás"
},
"updates": {
"app-version-note": "Dashy verzió",
"up-to-date": "Naprakész",
"out-of-date": "Frissítés elérhető",
"unsupported-version-l1": "A Dashy nem támogatott verzióját használod",
"unsupported-version-l2": "A legjobb élmény és a biztonsági javítások érdekében frissíts a következő verzióra"
},
"language-switcher": {
"title": "Alkalmazás nyelvének módosítása",
"dropdown-label": "Válassz nyelvet",
"save-button": "Mentés",
"success-msg": "A nyelv frissítve erre:"
},
"theme-maker": {
"title": "Téma szerkesztő",
"export-button": "Egyéni változók exportálása",
"reset-button": "Stílus visszaállítása ehhez:",
"show-all-button": "Összes változó megjelenítése",
"change-fonts-button": "Betűtípus módosítása",
"save-button": "Mentés",
"cancel-button": "Mégse",
"saved-toast": "{theme} sikeresen frissítve",
"copied-toast": "{theme} témához tartozó adatok a vágólapra másolva",
"reset-toast": "A(z) {theme} egyéni színei törölve"
},
"config-editor": {
"save-location-label": "Mentés helye",
"location-local-label": "Helyi mentés",
"location-disk-label": "Változások mentése a konfigurációs fájlba",
"save-button": "Változtatások mentése",
"preview-button": "Változtatások előnézete",
"valid-label": "A konfiguráció érvényes",
"status-success-msg": "Feladat sikeresen befejezve",
"status-fail-msg": "A feladat sikertelen volt",
"success-msg-disk": "A konfigurációs fájl sikeresen mentve a lemezre",
"success-msg-local": "A helyi változtatások sikeresen elmentve",
"success-note-l1": "A változtatások érvényesítéséhez frissítened kell az oldalt.",
"success-note-l2": "",
"success-note-l3": "",
"error-msg-save-mode": "Válaszd ki a mentés módját: helyi vagy fájlba mentés",
"error-msg-cannot-save": "Hiba történt a konfiguráció mentése közben",
"error-msg-bad-json": "Hibás JSON-formátum, valószínűleg rosszul van megadva",
"warning-msg-validation": "Érvényesítési figyelmeztetés",
"not-admin-note": "Nem írhatsz a lemezre, mert nem rendszergazdaként vagy bejelentkezve"
},
"app-rebuild": {
"title": "Alkalmazás újraépítése",
"rebuild-note-l1": "A változtatások érvényesítéséhez már nem szükséges újraépítés.",
"rebuild-note-l2": "Bizonyos beállítások (például a belépési pont és a hitelesítés) csak az építés során kerülnek betöltésre, ezért ezekhez újraépítést kell indítani.",
"rebuild-note-l3": "Ez a funkció csak Node és Docker telepítéseken érhető el, statikus verziókban nem.",
"rebuild-button": "Build indítása",
"rebuilding-status-1": "Build folyamatban...",
"rebuilding-status-2": "Ez néhány percet igénybe vehet",
"error-permission": "Nincs jogosultságod a folyamat elindításához",
"success-msg": "Az újraépítés sikeresen befejeződött",
"fail-msg": "Az újraépítés sikertelen volt",
"reload-note": "A változtatások érvényesítéséhez frissíteni kell az oldalt",
"reload-button": "Oldal újratöltése"
},
"cloud-sync": {
"title": "Mentés felhőbe, visszaállítás",
"intro-l1": "A mentés felhőbe, visszaállítás egy választható funkció, amellyel feltöltheted a beállításaidat az internetre, majd bármely másik Dashy példányban visszaállíthatod azokat.",
"intro-l2": "Minden adat teljes körűen AES titkosítással védett, ahol a jelszavad szolgál kulcsként.",
"intro-l3": "További információért lásd a",
"intro-docs": "dokumentációt",
"backup-title-setup": "Biztonsági mentés készítése",
"backup-title-update": "Mentés frissítése",
"password-label-setup": "Válassz jelszót",
"password-label-update": "Add meg a jelszavad",
"backup-button-setup": "Biztonsági mentés",
"backup-button-update": "Biztonsági mentés frissítése",
"backup-id-label": "Biztonsági mentés azonosítója",
"backup-id-note": "Ezt az azonosítót a későbbi visszaállításhoz használhatod, ezért őrizd meg biztonságos helyen a jelszavaddal együtt.",
"restore-title": "Biztonsági mentés visszaállítása",
"restore-id-label": "Visszaállítási azonosító",
"restore-password-label": "Jelszó",
"restore-button": "Visszaállítás",
"backup-missing-password": "Hiányzó jelszó",
"backup-error-unknown": "A kérés feldolgozása nem sikerült",
"backup-error-password": "Hibás jelszó. Kérlek, add meg a helyes jelszót.",
"backup-success-msg": "Sikeresen befejezve",
"restore-success-msg": "A beállítások sikeresen visszaállítva"
},
"menu": {
"open-section-title": "Megnyitás itt",
"sametab": "Jelenlegi fülön",
"newtab": "Új fülön",
"modal": "Felugró ablakban",
"workspace": "Munkaterület nézet",
"options-section-title": "Beállítások",
"edit-item": "Szerkesztés",
"move-item": "Másolás vagy áthelyezés",
"remove-item": "Eltávolítás"
},
"context-menus": {
"item": {
"open-section-title": "Megnyitás itt",
"sametab": "Jelenlegi fülön",
"newtab": "Új fülön",
"modal": "Felugró ablakban",
"workspace": "Munkaterület nézet",
"clipboard": "Másolás vágólapra",
"options-section-title": "Beállítások",
"edit-item": "Szerkesztés",
"move-item": "Másolás vagy áthelyezés",
"remove-item": "Eltávolítás",
"copied-toast": "Az URL a vágólapra másolva"
},
"section": {
"open-section": "Szakasz megnyitása",
"edit-section": "Szerkesztés",
"expand-collapse": "Kinyitás / Összecsukás",
"move-section": "Áthelyezés ide",
"remove-section": "Eltávolítás"
}
},
"footer": {
"dev-by": "Fejlesztette",
"licensed-under": "Licenc típusa:",
"get-the": "Nézd meg a",
"source-code": "forráskódot"
},
"interactive-editor": {
"menu": {
"start-editing-tooltip": "Belépés az interaktív szerkesztőbe",
"edit-site-data-subheading": "Oldaladatok szerkesztése",
"edit-page-info-btn": "Oldalinformációk szerkesztése",
"edit-page-info-tooltip": "Alkalmazás címe, leírása, menülinkek, lábléc szöveg stb.",
"edit-app-config-btn": "Alkalmazás beállításainak szerkesztése",
"edit-app-config-tooltip": "Az alkalmazás összes további beállítási lehetősége",
"edit-pages-btn": "Oldalak szerkesztése",
"edit-pages-tooltip": "További nézetek hozzáadása vagy eltávolítása",
"config-save-methods-subheading": "Mentési beállítások",
"save-locally-btn": "Mentés helyileg",
"save-locally-tooltip": "A konfiguráció helyi mentése a böngészőben. Ez nem módosítja a konfigurációs fájlt, és csak ezen az eszközön marad meg.",
"save-disk-btn": "Mentés lemezre",
"save-disk-tooltip": "A konfiguráció mentése a conf.yml fájlba. Biztonsági mentést készít, majd felülírja a meglévő beállításokat.",
"export-config-btn": "Beállítások exportálása",
"export-config-tooltip": "A beállítások megtekintése és exportálása fájlba vagy vágólapra",
"cloud-backup-btn": "Mentés felhőbe",
"cloud-backup-tooltip": "Titkosított konfigurációs mentés feltöltése a felhőbe",
"edit-raw-config-btn": "Nyers konfiguráció szerkesztése",
"edit-raw-config-tooltip": "A nyers konfiguráció megtekintése és módosítása JSON szerkesztőben",
"cancel-changes-btn": "Szerkesztés megszakítása",
"cancel-changes-tooltip": "A jelenlegi módosítások visszaállítása és a szerkesztési mód bezárása. A mentett beállításokat nem érinti.",
"edit-mode-name": "Szerkesztési mód",
"edit-mode-subtitle": "Jelenleg szerkesztési módban vagy",
"edit-mode-description": "Ez azt jelenti, hogy módosíthatod a beállításokat és megtekintheted az eredményt, de a változtatások nem lesznek automatikusan mentve, amíg kézzel el nem mented azokat.",
"save-stage-btn": "Mentés",
"cancel-stage-btn": "Mégse",
"save-locally-warning": "Ha folytatod, a változtatások csak a böngészőben kerülnek mentésre. Javasolt egy másolat exportálása más eszközök használatához. Szeretnéd folytatni?"
},
"edit-item": {
"missing-title-err": "Hiányzó elemcím"
},
"edit-section": {
"edit-section-title": "Szakasz szerkesztése",
"add-section-title": "Új szakasz hozzáadása",
"edit-tooltip": "Kattints a szerkesztéshez, vagy jobb klikk a további lehetőségekért",
"remove-confirm": "Biztosan törölni szeretnéd ezt a szakaszt? Ez a művelet később nem vonható vissza."
},
"edit-app-config": {
"warning-msg-title": "Csak óvatosan!",
"warning-msg-l1": "A következő beállítások haladó konfigurációhoz valók.",
"warning-msg-l2": "Ha nem vagy biztos benne, hogy melyik mező mire való, olvass utána a",
"warning-msg-docs": "dokumentációban,",
"warning-msg-l3": "hogy elkerüld a nem kívánt következményeket."
},
"export": {
"export-title": "Konfiguráció exportálása",
"copy-clipboard-btn": "Másolás vágólapra",
"copy-clipboard-tooltip": "Az összes beállítás másolása a vágólapra YAML formátumban",
"download-file-btn": "Letöltés fájlként",
"download-file-tooltip": "Az összes beállítás letöltése YAML fájlként az eszközre",
"view-title": "Beállítások megtekintése"
}
},
"critical-error": {
"title": "Konfigurációs betöltési hiba",
"subtitle": "A Dashy nem tudott megfelelően betöltődni a konfigurációs hiba miatt.",
"sub-ensure-that": "Győződj meg róla, hogy",
"sub-error-details": "Hiba részletei",
"sub-next-steps": "Következő lépések",
"ignore-button": "Kritikus hibák figyelmen kívül hagyása"
},
"widgets": {
"general": {
"loading": "Betöltés",
"show-more": "Részletek megjelenítése",
"cpu-details": "CPU adatai",
"mem-details": "Mamória adatai",
"show-less": "Kevesebb megjelenítése",
"open-link": "Tovább olvasás"
},
"pi-hole": {
"status-heading": "Állapot"
},
"stat-ping": {
"up": "Online",
"down": "Offline"
},
"net-data": {
"cpu-chart-title": "CPU-használat",
"mem-chart-title": "Memóriahasználat",
"mem-breakdown-title": "Memória-összeomlás",
"load-chart-title": "Rendszerterhelés"
},
"glances": {
"disk-space-free": "Szabad",
"disk-space-used": "Foglalt",
"disk-mount-point": "Csatolás helye",
"disk-file-system": "Fájlrendszer",
"disk-io-read": "Olvasás",
"disk-io-write": "Írás",
"system-load-desc": "A futási sorban várakozó folyamatok száma, az összes mag átlaga"
},
"system-info": {
"uptime": "Rendszer futási ideje"
},
"flight-data": {
"arrivals": "Érkezések",
"departures": "Indulások"
},
"tfl-status": {
"good-service-all": "Minden vonalon zavartalan a közlekedés",
"good-service-rest": "Minden más vonalon zavartalan a közlekedés"
},
"synology-download": {
"download": "Letöltés",
"upload": "Feltöltés",
"downloaded": "Letöltve",
"uploaded": "Feltöltve",
"remaining": "Hátralévő",
"up": "Feltöltés",
"down": "Letöltés"
},
"gluetun-status": {
"vpn-ip": "VPN IP-cím",
"country": "Ország",
"region": "Vármegye / Régió",
"city": "Város",
"post-code": "Irányítószám",
"location": "Cím / Földrajzi hely",
"timezone": "Időzóna",
"organization": "Szervezet"
}
}
}

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",
@ -169,4 +169,4 @@
"modal": "Åpne i popup-modus",
"workspace": "Åpne i Workspace-visning"
}
}
}

View file

@ -10,8 +10,12 @@
"clear-search-tooltip": "Limpar busca",
"enter-to-search-web": "Tecle enter para buscar na rede"
},
"splash-screen": {
"loading": "Carregando"
},
"login": {
"title": "Dashy",
"guest-label": "Entrar como convidado",
"username-label": "Nome do usuário",
"password-label": "Senha",
"login-button": "Conectar",
@ -31,8 +35,20 @@
"already-logged-in-text": "Você está logado como",
"proceed-to-dashboard": "Ir para o Painel",
"log-out-button": "Sair",
"proceed-guest-button": "Seguir como Convidado"
"proceed-guest-button": "Seguir como Convidado",
"guest-intro-1": "Essa instância possui o acesso como convidado ativado",
"guest-intro-2": "Convidados podem apenas visualizar os painéis, logo não podem escrever quaisquer mudanças no disco.",
"error": "Erro",
"error-no-user-configured": "Autenticação não está habilitada, ou nenhum usuário foi configurado.",
"error-go-home-button": "Ir para a página inicial",
"logged-in-guest": "Logado como convidado. Redirecionando...",
"error-guest-access": "O acesso como convidado não foi permitido"
},
"app-info": {
"title": "Informação do App"
},
"config": {
"main-tab": "Menu Principal",
"view-config-tab": "Ver configuração",
@ -299,6 +315,16 @@
"remaining": "Restante",
"up": "Up",
"down": "Down"
},
"gluetun-status": {
"vpn-ip": "IP da VPN",
"country": "País",
"region": "Região",
"city": "Cidade",
"post-code": "Código postal",
"location": "Localização",
"timezone": "Fuso horário",
"organization": "Organização"
}
}
}
}

448
src/assets/locales/ro.json Normal file
View file

@ -0,0 +1,448 @@
{
"home": {
"no-results": "Niciun rezultat găsit",
"no-data": "Nicio dată configurată",
"no-items-section": "Niciun element de afișat încă"
},
"search": {
"search-label": "Caută",
"search-placeholder": "Începeți să tastați pentru a filtra",
"clear-search-tooltip": "Șterge căutarea",
"enter-to-search-web": "Apasă enter pentru a căuta pe web"
},
"splash-screen": {
"loading": "Încărcare"
},
"login": {
"title": "Dashy",
"guest-label": "Acces Vizitator",
"username-label": "Nume utilizator",
"password-label": "Parolă",
"login-button": "Autentificare",
"remember-me-label": "Ține-mă minte pentru",
"remember-me-never": "Niciodată",
"remember-me-hour": "4 Ore",
"remember-me-day": "1 Zi",
"remember-me-week": "1 Săptămână",
"remember-me-long-time": "O perioadă lungă",
"error-missing-username": "Lipsește numele de utilizator",
"error-missing-password": "Lipsește parola",
"error-incorrect-username": "Utilizator negăsit",
"error-incorrect-password": "Parolă incorectă",
"success-message": "Autentificare...",
"logout-message": "Deconectat",
"already-logged-in-title": "Deja autentificat",
"already-logged-in-text": "Ești autentificat ca",
"proceed-to-dashboard": "Continuă către Tabloul de bord",
"log-out-button": "Deconectare",
"proceed-guest-button": "Continuă ca Vizitator",
"guest-intro-1": "Această instanță are acces pentru vizitatori activat.",
"guest-intro-2": "Vizitatorii au acces doar pentru vizualizare la tablourile de bord, deci nu pot scrie modificări pe disc.",
"error": "Eroare",
"error-no-user-configured": "Autentificarea nu este activată, sau nu au fost configurați utilizatori",
"error-go-home-button": "Mergi la Pagina Principală",
"logged-in-guest": "Autentificat ca Vizitator, Redirecționare...",
"error-guest-access": "Acces Vizitator Interzis"
},
"app-info": {
"title": "Informații Aplicație",
"error-log": "Jurnal Erori",
"no-errors": "Nicio eroare recentă detectată",
"help-support": "Ajutor & Suport",
"help-support-description" : "Pentru suport în utilizarea sau configurarea Dashy, consultați",
"help-support-discussions": "Discuțiile",
"support-dashy": "Suport pentru Dashy",
"support-dashy-description": "Pentru moduri în care poți contribui, verificați",
"support-dashy-link": "Pagina de Contribuții",
"report-bug": "Raportează o Eroare",
"report-bug-description": "Dacă crezi că ai găsit o eroare, atunci te rog",
"report-bug-link": "deschide o Problemă",
"more-info": "Mai Multe Informații",
"source": "Sursă",
"documentation": "Documentație",
"privacy-and-security": "Confidențialitate & Securitate",
"privacy-and-security-l1": "Pentru o descompunere a modului în care datele tale sunt gestionate de Dashy, consultați",
"privacy-and-security-privacy-policy": "Politica de Confidențialitate",
"privacy-and-security-advice": "Pentru sfaturi în securizarea tabloului tău de bord, poți consulta",
"privacy-and-security-advice-link": "Documentele de Management",
"privacy-and-security-security-issue": "Dacă ați descoperit o potențială problemă de securitate, raportați-o urmând",
"privacy-and-security-security-policy": "Politica de Securitate",
"license": "Licență",
"license-under": "Licențiat sub",
"licence-third-party": "Pentru licențele modulelor terțe părți, vă rugăm să consultați",
"licence-third-party-link": "Legal",
"list-contributors": "Pentru lista completă a contribuitorilor și mulțumiri, vedeți",
"list-contributors-link": "Credite",
"version": "Versiune"
},
"config": {
"main-tab": "Meniu Principal",
"view-config-tab": "Vizualizare Configurație",
"edit-config-tab": "Editare Configurație",
"custom-css-tab": "Stiluri Personalizate",
"heading": "Opțiuni de Configurare",
"download-config-button": "Vizualizați / Exportați Configurația",
"edit-config-button": "Editare Configurație",
"edit-css-button": "Editare CSS Personalizat",
"cloud-sync-button": "Activează Sincronizarea în Cloud",
"edit-cloud-sync-button": "Editare Sincronizare în Cloud",
"rebuild-app-button": "Reconstruire Aplicație",
"change-language-button": "Schimbă Limba Aplicației",
"reset-settings-button": "Resetează Setările Locale",
"disabled-note": "Unele caracteristici de configurare au fost dezactivate de administratorul tău",
"small-screen-note": "Utilizați un ecran foarte mic, și unele ecrane din acest meniu s-ar putea să nu fie optimale",
"app-info-button": "Informații Aplicație",
"backup-note": "Este recomandat să faceți o copie de siguranță a configurației înainte de a face modificări.",
"reset-config-msg-l1": "Aceasta va elimina toate setările utilizatorilor din stocarea locală, dar nu va afecta fișierul 'conf.yml'.",
"reset-config-msg-l2": "Ar trebui să faceți mai întâi o copie de siguranță a oricăror modificări pe care le-ați făcut local, dacă doriți să le utilizați în viitor.",
"reset-config-msg-l3": "Sunteți sigur că doriți să continuați?",
"data-cleared-msg": "Datele au fost șterse cu succes",
"actions-label": "Acțiuni",
"copy-config-label": "Copiază Configurația",
"data-copied-msg": "Configurația a fost copiată în clipboard",
"reset-config-label": "Resetează Configurația",
"css-save-btn": "Salvează Modificările",
"css-note-label": "Notă",
"css-note-l1": "Va trebui să reîmprospătați pagina pentru ca modificările să aibă efect.",
"css-note-l2": "Suprascrierile de stiluri sunt stocate doar local, deci este recomandat să faceți o copie a CSS-ului dvs.",
"css-note-l3": "Pentru a elimina toate stilurile personalizate, ștergeți conținutul și apăsați 'Salvează Modificările'",
"custom-css": {
"title": "CSS Personalizat",
"base-theme": "Tema de Bază"
}
},
"alternate-views": {
"alternate-view-heading": "Schimbă Vederea",
"default": "Implicit",
"workspace": "Spațiu de Lucru",
"minimal": "Minimal"
},
"settings": {
"theme-label": "Temă",
"layout-label": "Aspect",
"layout-auto": "Automat",
"layout-horizontal": "Orizontal",
"layout-vertical": "Vertical",
"item-size-label": "Dimensiune Element",
"item-size-small": "Mic",
"item-size-medium": "Mediu",
"item-size-large": "Mare",
"config-launcher-label": "Config",
"config-launcher-tooltip": "Actualizează Configurația",
"sign-out-tooltip": "Deconectare",
"sign-in-tooltip": "Conectare",
"sign-in-welcome": "Bună {username}!",
"hide": "Ascunde",
"open": "Deschide"
},
"updates": {
"app-version-note": "Versiune Dashy",
"up-to-date": "Actualizat",
"out-of-date": "Actualizare Disponibilă",
"unsupported-version-l1": "Utilizați o versiune nesuportată de Dashy",
"unsupported-version-l2": "Pentru cea mai bună experiență și patch-uri de securitate recente, vă rugăm să actualizați la"
},
"language-switcher": {
"title": "Schimbă Limba Aplicației",
"dropdown-label": "Selectați o Limbă",
"save-button": "Salvează",
"success-msg": "Limba Actualizată la"
},
"theme-maker": {
"title": "Configurator de Temă",
"export-button": "Exportă Variabile Personalizate",
"reset-button": "Resetează Stilurile pentru",
"show-all-button": "Arată Toate Variabilele",
"change-fonts-button": "Schimbă Fonturile",
"save-button": "Salvează",
"cancel-button": "Anulează",
"saved-toast": "{theme} Actualizat cu Succes",
"copied-toast": "Datele temei pentru {theme} au fost copiate în clipboard",
"reset-toast": "Culorile Personalizate pentru {theme} au fost Eliminate"
},
"config-editor": {
"save-location-label": "Locația de Salvare",
"location-local-label": "Aplică Local",
"location-disk-label": "Scrie Modificările în Fișierul de Configurație",
"save-button": "Salvează Modificările",
"preview-button": "Previzualizează Modificările",
"valid-label": "Configurația este Valabilă",
"status-success-msg": "Sarcină Completată",
"status-fail-msg": "Sarcină Eșuată",
"success-msg-disk": "Fișierul de configurație a fost scris pe disc cu succes",
"success-msg-local": "Modificările locale au fost salvate cu succes",
"success-note-l1": "Aplicația ar trebui să se reconstruiască automat.",
"success-note-l2": "Aceasta poate dura până la un minut.",
"success-note-l3": "Va trebui să reîmprospătați pagina pentru ca modificările să aibă efect.",
"error-msg-save-mode": "Vă rugăm să selectați un Mod de Salvare: Local sau Fișier",
"error-msg-cannot-save": "A apărut o eroare la salvarea configurației",
"error-msg-bad-json": "Eroare în JSON, posibil malformat",
"warning-msg-validation": "Avertisment de Validare",
"not-admin-note": "Nu puteți scrie modificările pe disc deoarece nu sunteți conectat ca administrator"
},
"app-rebuild": {
"title": "Reconstruire Aplicație",
"rebuild-note-l1": "O reconstruire este necesară pentru ca modificările scrise în fișierul conf.yml să aibă efect.",
"rebuild-note-l2": "Aceasta ar trebui să se întâmple automat, dar dacă nu s-a întâmplat, o puteți declanșa manual aici.",
"rebuild-note-l3": "Aceasta nu este necesară pentru modificările stocate local.",
"rebuild-button": "Începeți Reconstruirea",
"rebuilding-status-1": "Se reconstruiește...",
"rebuilding-status-2": "Aceasta poate dura câteva minute",
"error-permission": "Nu aveți permisiunea de a declanșa această acțiune",
"success-msg": "Reconstruirea a fost completată cu succes",
"fail-msg": "Operațiunea de reconstruire a eșuat",
"reload-note": "Este necesară reîncărcarea paginii pentru ca modificările să aibă efect",
"reload-button": "Reîncarcă Pagina"
},
"cloud-sync": {
"title": "Backup și Restaurare în Cloud",
"intro-l1": "Backup-ul și restaurarea în cloud este o caracteristică opțională, care vă permite să încărcați configurația pe internet și apoi să o restaurați pe orice alt dispozitiv sau instanță de Dashy.",
"intro-l2": "Toate datele sunt criptate end-to-end cu AES, folosind parola dumneavoastră ca cheie.",
"intro-l3": "Pentru mai multe informații, vă rugăm să consultați",
"intro-docs": "documentația",
"backup-title-setup": "Creați un Backup",
"backup-title-update": "Actualizați Backup-ul",
"password-label-setup": "Alegeți o Parolă",
"password-label-update": "Introduceți Parola",
"backup-button-setup": "Backup",
"backup-button-update": "Actualizați Backup-ul",
"backup-id-label": "ID-ul Dvs. de Backup",
"backup-id-note": "Acesta este utilizat pentru a restaura din backup-uri mai târziu. Deci păstrați-l, împreună cu parola dvs., într-un loc sigur.",
"restore-title": "Restaurare Backup",
"restore-id-label": "ID de Restaurare",
"restore-password-label": "Parola",
"restore-button": "Restaurare",
"backup-missing-password": "Lipsește Parola",
"backup-error-unknown": "Imposibil de procesat solicitarea",
"backup-error-password": "Parolă incorectă. Vă rugăm să introduceți parola actuală.",
"backup-success-msg": "Finalizat cu Succes",
"restore-success-msg": "Configurația a fost Restaurată cu Succes"
},
"menu": {
"open-section-title": "Deschide În",
"sametab": "Tab Curent",
"newtab": "Tab Nou",
"modal": "Modal Pop-Up",
"workspace": "Vizualizare Spațiu de Lucru",
"options-section-title": "Opțiuni",
"edit-item": "Editare",
"move-item": "Copiază sau Mută",
"remove-item": "Șterge"
},
"context-menus": {
"item": {
"open-section-title": "Deschide În",
"sametab": "Tab Curent",
"newtab": "Tab Nou",
"modal": "Modal Pop-Up",
"workspace": "Vizualizare Spațiu de Lucru",
"clipboard": "Copiază în Clipboard",
"options-section-title": "Opțiuni",
"edit-item": "Editare",
"move-item": "Copiază sau Mută",
"remove-item": "Șterge",
"copied-toast": "URL-ul a fost copiat în clipboard"
},
"section": {
"open-section": "Deschide Secțiunea",
"edit-section": "Editare",
"expand-collapse": "Extinde / Colapsează",
"move-section": "Mută La",
"remove-section": "Șterge"
}
},
"footer": {
"dev-by": "Dezvoltat de",
"licensed-under": "Licențiat sub",
"get-the": "Obțineți",
"source-code": "Codul Sursă"
},
"interactive-editor": {
"menu": {
"start-editing-tooltip": "Intră în Editorul Interactiv",
"edit-site-data-subheading": "Editează Datele Site-ului",
"edit-page-info-btn": "Editează Informațiile Paginii",
"edit-page-info-tooltip": "Titlul aplicației, descriere, link-uri de navigare, textul din footer, etc.",
"edit-app-config-btn": "Editează Configurația Aplicației",
"edit-app-config-tooltip": "Toate celelalte opțiuni de configurare a aplicației",
"edit-pages-btn": "Editează Paginile",
"edit-pages-tooltip": "Adaugă sau elimină vizualizări suplimentare",
"config-save-methods-subheading": "Opțiuni de Salvare a Configurației",
"save-locally-btn": "Salvează Local",
"save-locally-tooltip": "Salvează configurația local, în stocarea browserului. Aceasta nu va afecta fișierul tău de configurare, dar schimbările vor fi salvate doar pe acest dispozitiv",
"save-disk-btn": "Salvează pe Disc",
"save-disk-tooltip": "Salvează configurația în fișierul conf.yml de pe disc. Aceasta va face un backup și apoi va suprascrie configurația existentă",
"export-config-btn": "Exportă Configurația",
"export-config-tooltip": "Vizualizează și exportă noua configurație, fie într-un fișier, fie în clipboard",
"cloud-backup-btn": "Backup în Cloud",
"cloud-backup-tooltip": "Salvează un backup criptat al configurației în cloud",
"edit-raw-config-btn": "Editează Configurația Brută",
"edit-raw-config-tooltip": "Vizualizează și modifică configurația brută prin editorul JSON",
"cancel-changes-btn": "Anulează Modificările",
"cancel-changes-tooltip": "Resetează modificările curente și ieși din Modul de Editare. Aceasta nu va afecta configurația salvată",
"edit-mode-name": "Mod de Editare",
"edit-mode-subtitle": "Ești în Modul de Editare",
"edit-mode-description": "Aceasta înseamnă că poți face modificări la configurația ta și să previzualizezi rezultatele, dar până nu salvezi, niciuna dintre modificările tale nu va fi păstrată.",
"save-stage-btn": "Salvează",
"cancel-stage-btn": "Anulează",
"save-locally-warning": "Dacă vei continua, modificările vor fi salvate doar în browserul tău. Ar trebui să exporți o copie a configurației tale pentru utilizare pe alte mașini. Dorești să continui?"
},
"edit-item": {
"missing-title-err": "Este necesar un titlu pentru element"
},
"edit-section": {
"edit-section-title": "Editează Secțiunea",
"add-section-title": "Adaugă o Secțiune Nouă",
"edit-tooltip": "Clic pentru a edita, sau clic dreapta pentru mai multe opțiuni",
"remove-confirm": "Ești sigur că vrei să elimini această secțiune? Această acțiune poate fi anulată mai târziu."
},
"edit-app-config": {
"warning-msg-title": "Procedează cu Atenție",
"warning-msg-l1": "Următoarele opțiuni sunt pentru configurarea avansată a aplicației.",
"warning-msg-l2": "Dacă nu ești sigur în legătură cu oricare dintre câmpuri, te rog să consulți",
"warning-msg-docs": "documentația",
"warning-msg-l3": "pentru a evita consecințele nedorite."
},
"export": {
"export-title": "Exportă Configurația",
"copy-clipboard-btn": "Copiază în Clipboard",
"copy-clipboard-tooltip": "Copiază toată configurația aplicației în clipboard-ul sistemului, în format YAML",
"download-file-btn": "Descarcă ca Fișier",
"download-file-tooltip": "Descarcă toată configurația aplicației pe dispozitivul tău, într-un fișier YAML",
"view-title": "Vizualizează Configurația"
}
},
"widgets": {
"general": {
"loading": "Se încarcă...",
"show-more": "Extinde Detaliile",
"cpu-details": "Detalii CPU",
"mem-details": "Detalii Memorie",
"show-less": "Arată Mai Puțin",
"open-link": "Continuă Citirea"
},
"pi-hole": {
"status-heading": "Stare"
},
"stat-ping": {
"up": "Online",
"down": "Offline"
},
"net-data": {
"cpu-chart-title": "Istoric CPU",
"mem-chart-title": "Utilizare Memorie",
"mem-breakdown-title": "Detalii Memorie",
"load-chart-title": "Încărcare Sistem"
},
"glances": {
"disk-space-free": "Liber",
"disk-space-used": "Utilizat",
"disk-mount-point": "Punct de Montare",
"disk-file-system": "Sistem de Fișiere",
"disk-io-read": "Citire",
"disk-io-write": "Scriere",
"system-load-desc": "Numărul de procese așteptând în coada de execuție, mediat pe toate nucleele"
},
"system-info": {
"uptime": "Timp de Funcționare"
},
"flight-data": {
"arrivals": "Sosiri",
"departures": "Plecări"
},
"tfl-status": {
"good-service-all": "Servicii Bune pe Toate Liniile",
"good-service-rest": "Servicii Bune pe Celelalte Linii"
},
"synology-download": {
"download": "Descărcare",
"upload": "Încărcare",
"downloaded": "Descărcat",
"uploaded": "Încărcat",
"remaining": "Rămas",
"up": "Sus",
"down": "Jos"
},
"gluetun-status": {
"vpn-ip": "IP VPN",
"country": "Țară",
"region": "Regiune",
"city": "Oraș",
"post-code": "Cod Poștal",
"location": "Locație",
"timezone": "Fus Orar",
"organization": "Organizație"
},
"nextcloud": {
"active": "activ",
"and": "și",
"applications": "aplicații",
"available": "disponibil",
"away": "Plecat",
"cache-full": "CACHE PLIN",
"chat-room": "camera de chat",
"delete-all": "Șterge tot",
"delete-notification": "Șterge notificarea",
"disabled": "dezactivat",
"disk-quota": "Cotă de Disc",
"disk-space": "Spațiu pe Disc",
"dnd": "Nu Deranja",
"email": "email",
"enabled": "activat",
"federated-shares-ucfirst": "Partajări Federate",
"federated-shares": "partajări federate",
"files": "fișier{plural}",
"free": "liber",
"groups": "grupuri",
"hit-rate": "rata de accesare",
"hits": "accesări",
"home": "acasă",
"in": "în",
"keys": "chei",
"last-24-hours": "ultimele 24 de ore",
"last-5-minutes": "în ultimele 5 minute",
"last-hour": "în ultima oră",
"last-login": "Ultima autentificare",
"last-restart": "Ultimul restart",
"load-averages": "Mediile de Încărcare pe toate nucleele CPU",
"local-shares": "Partajări Locale",
"local": "local",
"max-keys": "chei maxime",
"memory-used": "memorie utilizată",
"memory-utilisation": "utilizarea memoriei",
"memory": "memorie",
"misses": "rateuri",
"no-notifications": "Fără notificări",
"no-pending-updates": "fără actualizări în așteptare",
"nothing-to-show": "Nimic de afișat aici în acest moment",
"of-which": "din care",
"of": "din",
"offline": "Deconectat",
"online": "Conectat",
"other": "alt",
"overall": "În total",
"private-link": "link privat",
"public-link": "link public",
"quota-enabled": "Cota de Disc este {not}activată pentru acest utilizator",
"received": "primit",
"scripts": "scripturi",
"sent": "trimis",
"started": "Început",
"storages-by-type": "Stocări pe tip",
"storages": "stocare{plural}",
"strings-use": "utilizare șiruri",
"tasks": "Sarcini",
"total-files": "total fișiere",
"total-users": "total utilizatori",
"total": "total",
"until": "Până la",
"updates-available-for": "Actualizări disponibile pentru",
"updates-available": "actualizare{plural} disponibilă",
"used": "utilizat",
"user": "utilizator",
"using": "utilizând",
"version": "versiune",
"wasted": "pierdut"
}
}
}

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,19 +29,19 @@
"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": "以游客身份前往",
"guest-intro-1": "该实例已启用访客访问.",
"guest-intro-2": "访客只有访问权限,无法保存变更",
"guest-intro-2": "访客只有访问权限无法保存变更",
"error": "错误",
"error-no-user-configured": "没有启用验证,或者未配置用户",
"error-no-user-configured": "没有启用验证或者未配置用户",
"error-go-home-button": "Go Home",
"logged-in-guest": "以访客身份登陆,正在跳转...",
"logged-in-guest": "以访客身份登录,正在跳转...",
"error-guest-access": "不允许访客访问"
},
"app-info": {
@ -78,22 +78,22 @@
"config": {
"main-tab": "主菜单",
"view-config-tab": "视图设置",
"edit-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": "编辑云端同步",
"edit-config-button": "修改设置",
"edit-css-button": "自定义CSS",
"cloud-sync-button": "云端同步",
"edit-cloud-sync-button": "修改云端同步",
"rebuild-app-button": "重建应用",
"change-language-button": "更改语言",
"reset-settings-button": "恢复本地设置",
"reset-settings-button": "恢复默认设置",
"disabled-note": "您的管理员已禁用某些配置功能",
"small-screen-note": "您正在使用非常小的屏幕,某些菜单屏幕可能不够优化",
"app-info-button": "应用详情",
"backup-note": "建议在进行更改之前备份你的配置。",
"reset-config-msg-l1": "这将从本地存储中删除所有用户设置,但不会影响conf.yml文件。",
"reset-config-msg-l1": "这将从本地存储中删除所有用户设置,但不会影响 conf.yml 文件。",
"reset-config-msg-l2": "如果想在以后使用它们,应该首先备份你所做的任何更改。",
"reset-config-msg-l3": "确定执行吗?",
"data-cleared-msg": "成功清空数据",
@ -103,9 +103,9 @@
"reset-config-label": "重置设置",
"css-save-btn": "保存更改",
"css-note-label": "注意",
"css-note-l1": "你需要刷新页面才能使更改生效。",
"css-note-l2": "样式覆盖仅存储在本地,因此建议复制你的 CSS。",
"css-note-l3": "要删除所有自定义样式,请删除内容并点击保存更改",
"css-note-l1": "需刷新页面使其生效。",
"css-note-l2": "自定义样式仅在本地有效,设置储存在当前浏览器,建议做好备份。",
"css-note-l3": "如需删除自定义样式,清空上面内容并点击保存。",
"custom-css": {
"title": "自定义 CSS",
"base-theme": "基础主题"
@ -130,10 +130,10 @@
"config-launcher-label": "设置",
"config-launcher-tooltip": "更新设置",
"sign-out-tooltip": "注销",
"sign-in-tooltip": "登",
"sign-in-tooltip": "登",
"sign-in-welcome": "你好 {username}",
"hide": "Hide",
"open": "Open"
"hide": "隐藏",
"open": "打开"
},
"updates": {
"app-version-note": "Dashy 版本",
@ -195,9 +195,10 @@
"reload-button": "刷新页面"
},
"cloud-sync": {
"title": "云备份 &恢复",
"title": "云备份&恢复",
"intro-l1": "云备份和云恢复是一项试验性功能,你将配置上传到网络,然后在其他设备或 Dashy 实例上恢复。",
"intro-l2": "所有数据都使用AES端对端加密使用你的密码作为密钥。",
"intro-docs": "文档",
"intro-l3": "有关更多信息,请参阅",
"backup-title-setup": "创建备份",
"backup-title-update": "更新备份",
@ -268,11 +269,11 @@
"edit-pages-tooltip": "添加或删除其他的视图",
"config-save-methods-subheading": "配置保存选项",
"save-locally-btn": "暂存本地",
"save-locally-tooltip": "将设置保存在本地浏览器上. 这不会影响配置文件,但更改只会保留在当前设备上.",
"save-locally-tooltip": "将设置保存在浏览器上。这不会影响配置文件,仅作用于当前的浏览器。",
"save-disk-btn": "保存",
"save-disk-tooltip": "将设置保存到服务端的conf.yml文件.它会备份之前的配置文件.",
"save-disk-tooltip": "将设置保存到服务端的conf.yml文件它会备份之前的配置文件.",
"export-config-btn": "导出配置",
"export-config-tooltip": "查看并导出新的配置 到 文件 或 剪贴板",
"export-config-tooltip": "查看并导出新的配置到 文件 或 剪贴板",
"cloud-backup-btn": "备份到云端",
"cloud-backup-tooltip": "以加密的方式保存到云端",
"edit-raw-config-btn": "编辑原始配置",
@ -284,10 +285,10 @@
"edit-mode-description": "你可以对配置进行修改并预览,在保存之前,你的任何更改都不会被保留。",
"save-stage-btn": "保存",
"cancel-stage-btn": "取消",
"save-locally-warning": "如果你继续,更改将仅保存在你的浏览器中。 你应该导出配置的副本以在其他机器上使用。 你想继续吗"
"save-locally-warning": "配置将保存到你当前的浏览器上。你也可以导出配置到其他设备上使用。是否继续"
},
"edit-item": {
"missing-title-err": "项目标题是必需的"
"missing-title-err": "标题是必需的"
},
"edit-section": {
"edit-section-title": "编辑 Section",
@ -314,7 +315,9 @@
"widgets": {
"general": {
"loading": "加载中...",
"show-more": "展开详情",
"show-more": "显示更多",
"cpu-details": "CPU 详情",
"mem-details": "内存 详情",
"show-less": "显示更少信息",
"open-link": "继续读取"
},
@ -399,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": "本地分享",
@ -442,4 +445,4 @@
"wasted": "浪费"
}
}
}
}

View file

@ -155,12 +155,23 @@ export default {
},
/* When restored data is revieved, then save to local storage, and apply it in state */
applyRestoredData(config, backupId) {
// Store restored data in local storage
localStorage.setItem(localStorageKeys.CONF_SECTIONS, JSON.stringify(config.sections));
localStorage.setItem(localStorageKeys.APP_CONFIG, JSON.stringify(config.appConfig));
localStorage.setItem(localStorageKeys.PAGE_INFO, JSON.stringify(config.pageInfo));
if (config.appConfig.theme) {
localStorage.setItem(localStorageKeys.THEME, config.appConfig.theme);
const isSubPage = !!this.$store.state.currentConfigInfo.confId;
if (isSubPage) { // Apply to sub-page only
const subConfigId = this.$store.state.currentConfigInfo.confId;
const sectionStorageKey = `${localStorageKeys.CONF_SECTIONS}-${subConfigId}`;
const pageInfoStorageKey = `${localStorageKeys.PAGE_INFO}-${subConfigId}`;
const themeStoreKey = `${localStorageKeys.THEME}-${subConfigId}`;
localStorage.setItem(sectionStorageKey, JSON.stringify(config.sections));
localStorage.setItem(pageInfoStorageKey, JSON.stringify(config.pageInfo));
localStorage.setItem(themeStoreKey, config.appConfig.theme);
} else { // Apply to main config
localStorage.setItem(localStorageKeys.CONF_SECTIONS, JSON.stringify(config.sections));
localStorage.setItem(localStorageKeys.APP_CONFIG, JSON.stringify(config.appConfig));
localStorage.setItem(localStorageKeys.PAGE_INFO, JSON.stringify(config.pageInfo));
localStorage.setItem(localStorageKeys.CONF_PAGES, JSON.stringify(config.pages || []));
if (config.appConfig.theme) {
localStorage.setItem(localStorageKeys.THEME, config.appConfig.theme);
}
}
// Save hashed token in local storage
this.setBackupIdLocally(backupId, this.restorePassword);

View file

@ -47,16 +47,17 @@
</Button>
<!-- Display app version and language -->
<p class="language">{{ getLanguage() }}</p>
<p v-if="$store.state.currentConfigInfo" class="config-location">
Using Config From<br>
{{ $store.state.currentConfigInfo.confPath }}
<!-- Display location of config file -->
<p class="config-location">
Using config from
<a :href="configPath">{{ configPath }}</a>
</p>
<AppVersion />
</div>
<!-- Display note if Config disabled, or if on mobile -->
<p v-if="!enableConfig" class="config-disabled-note">{{ $t('config.disabled-note') }}</p>
<p class="small-screen-note" style="display: none;">{{ $t('config.small-screen-note') }}</p>
<div class="config-note">
<div class="config-note" @click="openExportConfigModal">
<span>{{ $t('config.backup-note') }}</span>
</div>
</div>
@ -116,6 +117,11 @@ export default {
enableConfig() {
return this.$store.getters.permissions.allowViewConfig;
},
configPath() {
return this.$store.state.currentConfigInfo?.confPath
|| process.env.VUE_APP_CONFIG_PATH
|| '/conf.yml';
},
},
components: {
Button,
@ -248,8 +254,12 @@ a.hyperlink-wrapper {
p.app-version, p.language, p.config-location {
margin: 0.5rem auto;
font-size: 1rem;
color: var(--transparent-white-50);
color: var(--config-settings-color);
cursor: default;
opacity: var(--dimming-factor);
a {
color: var(--config-settings-color);
}
}
div.code-container {

View file

@ -116,7 +116,8 @@ export default {
},
mounted() {
const jsonData = { ...this.config };
jsonData.sections = jsonData.sections.map(({ filteredItems, ...section }) => section);
jsonData.sections = (jsonData.sections || []).map(({ filteredItems, ...section }) => section);
if (!jsonData.pageInfo) jsonData.pageInfo = { title: 'Dashy' };
this.jsonData = jsonData;
if (!this.allowWriteToDisk) this.saveMode = 'local';
},
@ -143,7 +144,11 @@ export default {
this.$modal.hide(modalNames.CONF_EDITOR);
},
writeToDisk() {
this.writeConfigToDisk(this.config);
const newData = this.jsonData;
this.writeConfigToDisk(newData);
// this.$store.commit(StoreKeys.SET_APP_CONFIG, newData.appConfig);
this.$store.commit(StoreKeys.SET_PAGE_INFO, newData.pageInfo);
this.$store.commit(StoreKeys.SET_SECTIONS, newData.sections);
},
saveLocally() {
const msg = this.$t('interactive-editor.menu.save-locally-warning');

View file

@ -22,6 +22,14 @@
<DownloadConfigIcon />
</Button>
</div>
<!-- Show path to which config file is being used -->
<div class="config-path-info">
<h3>Config Location</h3>
<p>
The base config file you are currently using is
<a :href="configPath">{{ configPath }}</a>
</p>
</div>
<!-- View Config in Tree Mode Section -->
<h3>{{ $t('interactive-editor.export.view-title') }}</h3>
<tree-view :data="config" class="config-tree-view" />
@ -61,6 +69,11 @@ export default {
allowViewConfig() {
return this.$store.getters.permissions.allowViewConfig;
},
configPath() {
return this.$store.state.currentConfigInfo?.confPath
|| process.env.VUE_APP_CONFIG_PATH
|| '/conf.yml';
},
},
methods: {
convertJsonToYaml() {
@ -121,6 +134,13 @@ export default {
border-bottom: 1px dashed var(--interactive-editor-color);
button { margin: 0 1rem; }
}
.config-path-info {
p, a {
color: var(--interactive-editor-color);
font-size: 1.2rem;
}
border-bottom: 1px dashed var(--interactive-editor-color);
}
.config-tree-view {
padding: 0.5rem;
font-family: var(--font-monospace);

View file

@ -64,7 +64,6 @@ export default {
return this.$store.state.editMode;
},
sectionKey() {
if (this.isEditMode) return undefined;
return `collapsible-${this.uniqueKey}`;
},
collapseClass() {
@ -104,12 +103,23 @@ export default {
watch: {
checkboxState(newState) {
this.isExpanded = newState;
this.updateLocalStorage(); // Save every change immediately
},
uniqueKey() {
this.checkboxState = this.isExpanded;
uniqueKey(newVal, oldVal) {
if (newVal !== oldVal) {
this.refreshCollapseState(); // Refresh state when key changes
}
},
},
methods: {
refreshCollapseState() {
this.checkboxState = this.isExpanded;
},
updateLocalStorage() {
const collapseState = this.locallyStoredCollapseStates();
collapseState[this.uniqueKey] = this.checkboxState;
localStorage.setItem(localStorageKeys.COLLAPSE_STATE, JSON.stringify(collapseState));
},
/* Either expand or collapse section, based on it's current state */
toggle() {
this.checkboxState = !this.checkboxState;

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

@ -21,7 +21,6 @@
</template>
<script>
import simpleIcons from 'simple-icons';
import BrokenImage from '@/assets/interface-icons/broken-icon.svg';
import ErrorHandler from '@/utils/ErrorHandler';
import EmojiUnicodeRegex from '@/utils/EmojiUnicodeRegex';
@ -29,6 +28,8 @@ import emojiLookup from '@/utils/emojis.json';
import { asciiHash } from '@/utils/MiscHelpers';
import { faviconApi as defaultFaviconApi, faviconApiEndpoints, iconCdns } from '@/utils/defaults';
const simpleicons = require('simple-icons');
export default {
name: 'Icon',
props: {
@ -71,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';
@ -89,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 '';
@ -186,14 +189,18 @@ export default {
},
/* Returns the SVG path content */
getSimpleIcon(img) {
const imageName = img.replace('si-', '');
const icon = simpleIcons.Get(imageName);
const imageName = img.charAt(3).toUpperCase() + img.slice(4);
const icon = simpleicons[`si${imageName}`];
if (!icon) {
this.imageNotFound(`No icon was found for '${imageName}' in Simple Icons`);
return null;
}
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,153 @@
<template>
<div class="critical-error-wrap" v-if="shouldShow">
<button class="close" title="Close Warning" @click="close">🗙</button>
<h3>{{ $t('critical-error.title') }}</h3>
<p>{{ $t('critical-error.subtitle') }}</p>
<h4>{{ $t('critical-error.sub-ensure-that') }}</h4>
<ul>
<li>The configuration file can be found at the specified location</li>
<li>There are no CORS rules preventing client-side access</li>
<li>The YAML is valid, parsable and matches the schema</li>
</ul>
<h4>{{ $t('critical-error.sub-error-details') }}</h4>
<pre>{{ this.$store.state.criticalError }}</pre>
<h4>{{ $t('critical-error.sub-next-steps') }}</h4>
<ul>
<li>Check the browser console for more details
(<a href="https://github.com/Lissy93/dashy/blob/master/docs/troubleshooting.md#how-to-open-browser-console">see how</a>)
</li>
<li>View the
<a href="https://github.com/Lissy93/dashy/blob/master/docs/troubleshooting.md">Troubleshooting Guide</a>
and <a href="https://dashy.to/docs/">Docs</a>
</li>
<li>
If you've verified the config is present, accessible and valid, and cannot find the solution
in the troubleshooting, docs or GitHub issues,
then <a href="https://github.com/Lissy93/dashy/issues/new/choose">open a ticket on GitHub</a>
</li>
<li>Click 'Ignore Critical Errors' below to not show this warning again</li>
</ul>
<button class="user-doesnt-care" @click="ignoreWarning">
{{ $t('critical-error.ignore-button') }}
</button>
</div>
</template>
<script>
import { localStorageKeys } from '@/utils/defaults';
import Keys from '@/utils/StoreMutations';
export default {
name: 'CriticalError',
computed: {
/* Determines if we should show this component.
* If error present AND user hasn't disabled */
shouldShow() {
return this.$store.state.criticalError
&& !localStorage[localStorageKeys.DISABLE_CRITICAL_WARNING];
},
},
methods: {
/* Ignore all future errors, by putting a key in local storage */
ignoreWarning() {
localStorage.setItem(localStorageKeys.DISABLE_CRITICAL_WARNING, true);
this.close();
},
/* Close this dialog, by removing this error from the local store */
close() {
this.$store.commit(Keys.CRITICAL_ERROR_MSG, null);
},
},
};
</script>
<style scoped lang="scss">
@import '@/styles/media-queries.scss';
.critical-error-wrap {
position: absolute;
top: 40%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 3;
max-width: 50rem;
background: var(--background-darker);
padding: 1rem;
border-radius: var(--curve-factor);
color: var(--danger);
border: 2px solid var(--danger);
display: flex;
flex-direction: column;
justify-content: center;
gap: 0.5rem;
transition: all 0.2s ease-in-out;
@include tablet-down {
top: 50%;
width: 85vw;
}
p, ul, h4, a {
margin: 0;
color: var(--white);
}
pre {
color: var(--warning);
font-size: 0.8rem;
overflow: auto;
background: var(--transparent-white-10);
padding: 0.5rem;
border-radius: var(--curve-factor);
}
h4 {
margin: 0.5rem 0 0 0;
font-size: 1.2rem;
}
h3 {
font-size: 2.2rem;
text-align: center;
background: var(--danger);
color: var(--white);
margin: -1rem -1rem 1rem -1rem;
padding: 0.5rem;
}
ul {
padding-left: 1rem;
}
.user-doesnt-care {
background: var(--background-darker);
color: var(--white);
border-radius: var(--curve-factor);
border: none;
text-decoration: underline;
padding: 0.25rem 0.5rem;
cursor: pointer;
width: fit-content;
margin: 0 auto;
transition: all 0.2s ease-in-out;
&:hover {
background: var(--danger);
color: var(--background-darker);
text-decoration: none;
}
}
.close {
position: absolute;
top: 1rem;
right: 1rem;
width: 1.5rem;
height: 1.5rem;
padding: 0;
display: flex;
justify-content: center;
align-items: center;
font-size: 1rem;
background: var(--background);
color: var(--primary);
border: none;
border-radius: var(--curve-factor);
transition: all 0.2s ease-in-out;
&:hover {
background: var(--primary);
color: var(--background);
}
}
}
</style>

View file

@ -1,16 +1,13 @@
<template>
<!-- User Footer -->
<footer v-if="text && text !== '' && visible" v-html="text"></footer>
<!-- Default Footer -->
<footer v-else-if="visible">
<span v-if="$store.state.currentConfigInfo" class="path-to-config">
Using: {{ $store.state.currentConfigInfo.confPath }}
</span>
<span>
{{ $t('footer.dev-by') }} <a :href="authorUrl">{{authorName}}</a>.
{{ $t('footer.licensed-under') }} <a :href="licenseUrl">{{license}}</a>
{{ showCopyright? '©': '' }} {{date}}.
{{ $t('footer.get-the') }} <a :href="repoUrl">{{ $t('footer.source-code') }}</a>.
<footer v-if="visible">
<!-- User-defined footer -->
<span v-if="text" v-html="text"></span>
<!-- Default footer -->
<span v-else>
<a :href="defaultInfo.projectUrl">Dashy</a> is free & open source
- licensed under <a :href="defaultInfo.licenseUrl">{{defaultInfo.license}}</a>,
© <a :href="defaultInfo.authorUrl">{{defaultInfo.authorName}}</a> {{defaultInfo.date}}.
Get support on GitHub, at <a :href="defaultInfo.repoUrl">{{defaultInfo.repoName}}</a>.
</span>
</footer>
</template>
@ -23,13 +20,20 @@ export default {
name: 'Footer',
props: {
text: String,
authorName: { type: String, default: 'Alicia Sykes' },
authorUrl: { type: String, default: 'https://aliciasykes.com' },
license: { type: String, default: 'MIT' },
licenseUrl: { type: String, default: 'https://gist.github.com/Lissy93/143d2ee01ccc5c052a17' },
date: { type: String, default: `${new Date().getFullYear()}` },
showCopyright: { type: Boolean, default: true },
repoUrl: { type: String, default: 'https://github.com/lissy93/dashy' },
},
data() {
return {
defaultInfo: {
authorName: 'Alicia Sykes',
authorUrl: 'https://as93.net',
license: 'MIT',
licenseUrl: 'https://gist.github.com/Lissy93/143d2ee01ccc5c052a17',
date: `${new Date().getFullYear()}`,
repoUrl: 'https://github.com/lissy93/dashy',
repoName: 'Lissy93/Dashy',
projectUrl: 'https://dashy.to',
},
};
},
computed: {
visible() {
@ -56,7 +60,7 @@ footer {
display: none;
}
span.path-to-config {
float: right;
float: left;
font-size: 0.75rem;
margin: 0.1rem 0.5rem 0 0;
opacity: var(--dimming-factor);

View file

@ -66,7 +66,7 @@ export default {
span.subtitle {
color: var(--heading-text-color);
font-style: italic;
text-shadow: 1px 1px 2px #130f23;
text-shadow: 1px 1px 2px #130f2347;
opacity: var(--dimming-factor);
}
img.site-logo {

View file

@ -24,6 +24,13 @@
v-tooltip="tooltip($t('settings.sign-out-tooltip'))"
class="layout-icon" tabindex="-2"
/>
<!-- If user logged in via oidc, show oidc logout button -->
<IconLogout
v-if="userType == userStateEnum.oidcEnabled"
@click="oidcLogout()"
v-tooltip="tooltip($t('settings.sign-out-tooltip'))"
class="layout-icon" tabindex="-2"
/>
</div>
</div>
</template>
@ -32,6 +39,7 @@
import router from '@/router';
import { logout as registerLogout } from '@/utils/Auth';
import { getKeycloakAuth } from '@/utils/KeycloakAuth';
import { getOidcAuth } from '@/utils/OidcAuth';
import { localStorageKeys, userStateEnum } from '@/utils/defaults';
import IconLogout from '@/assets/interface-icons/user-logout.svg';
@ -56,6 +64,13 @@ export default {
router.push({ path: '/login' });
}, 500);
},
oidcLogout() {
const oidc = getOidcAuth();
this.$toasted.show(this.$t('login.logout-message'));
setTimeout(() => {
oidc.logout();
}, 500);
},
keycloakLogout() {
const keycloak = getKeycloakAuth();
this.$toasted.show(this.$t('login.logout-message'));

View file

@ -37,8 +37,10 @@ export default {
input: '',
};
},
props: {
iconSize: String,
computed: {
iconSize() {
return this.$store.getters.iconSize;
},
},
components: {
IconSmall,

View file

@ -5,19 +5,19 @@
<IconDeafault
@click="updateDisplayLayout('auto')"
v-tooltip="tooltip($t('settings.layout-auto'))"
:class="`layout-icon ${displayLayout === 'auto' ? 'selected' : ''}`"
:class="`layout-icon ${layout === 'auto' ? 'selected' : ''}`"
tabindex="-2"
/>
<IconHorizontal
@click="updateDisplayLayout('horizontal')"
v-tooltip="tooltip($t('settings.layout-horizontal'))"
:class="`layout-icon ${displayLayout === 'horizontal' ? 'selected' : ''}`"
:class="`layout-icon ${layout === 'horizontal' ? 'selected' : ''}`"
tabindex="-2"
/>
<IconVertical
@click="updateDisplayLayout('vertical')"
v-tooltip="tooltip($t('settings.layout-vertical'))"
:class="`layout-icon ${displayLayout === 'vertical' ? 'selected' : ''}`"
:class="`layout-icon ${layout === 'vertical' ? 'selected' : ''}`"
tabindex="-2"
/>
</div>
@ -40,6 +40,11 @@ export default {
IconHorizontal,
IconVertical,
},
computed: {
layout() {
return this.$store.getters.layout;
},
},
methods: {
updateDisplayLayout(layout) {
this.$store.commit(StoreKeys.SET_ITEM_LAYOUT, layout);

View file

@ -1,36 +1,70 @@
<template>
<transition name="slide-fade">
<div class="kb-sc-info" v-if="!shouldHide">
<h5>There are keyboard shortcuts! 🙌</h5>
<h5>{{ popupContent.title }}</h5>
<div class="close" title="Hide forever [Esc]" @click="hideWelcomeHelper()">x</div>
<p title="Press [Esc] to hide this tip forever. See there's even a shortcut for that! 🚀">
Just start typing to filter. Then use the tab key to cycle through results,
and press enter to launch the selected item, or alt + enter to open in a modal.
You can hit Esc at anytime to clear the search. Easy 🥳
</p>
<p :title="popupContent.hoverText">{{ popupContent.message }}</p>
<p :title="popupContent.hoverText">{{ popupContent.messageContinued }}</p>
<div class="action-buttons">
<button @click="exportConfig">Export Local Config</button>
<button @click="saveConfig">Save Changes to Disk</button>
<button @click="resetLocalConfig">Reset Local Changes</button>
<button @click="hideWelcomeHelper">Dismiss this Notification</button>
</div>
</div>
</transition>
</template>
<script>
import { localStorageKeys } from '@/utils/defaults';
import { localStorageKeys, modalNames } from '@/utils/defaults';
import StoreKeys from '@/utils/StoreMutations';
import configSavingMixin from '@/mixins/ConfigSaving';
export default {
name: 'KeyboardShortcutInfo',
mixins: [configSavingMixin],
data() {
return {
shouldHide: true, // False = show/ true = hide. Intuitive, eh?
timeDelay: 3000, // Short delay in ms before popup appears
timeDelay: 2000, // Short delay in ms before popup appears
popupContent: {
title: '⚠️ You\'re using a local config',
message: `This means that your settings are saved in this browser only,
and won't persist across devices.`,
messageContinued: `To ensure you don't loose your changes,
it's recommended to download a copy of your config, so you can restore it later.`,
hoverText: 'Press [Esc] to hide this warning',
},
};
},
methods: {
exportConfig() {
this.$modal.show(modalNames.EXPORT_CONFIG_MENU);
this.shouldHide = true;
},
saveConfig() {
const localConfig = this.$store.state.config;
this.writeConfigToDisk(localConfig);
this.shouldHide = true;
},
resetLocalConfig() {
const msg = `${this.$t('config.reset-config-msg-l1')} `
+ `${this.$t('config.reset-config-msg-l2')}\n\n${this.$t('config.reset-config-msg-l3')}`;
const isTheUserSure = confirm(msg); // eslint-disable-line no-alert, no-restricted-globals
if (isTheUserSure) {
localStorage.clear();
this.$toasted.show(this.$t('config.data-cleared-msg'));
this.$store.dispatch(StoreKeys.INITIALIZE_CONFIG);
this.shouldHide = true;
}
},
/**
* Returns true if the key exists in session storage, otherwise false
* And the !! just converts 'false' to false, as strings resolve to true
*/
shouldHideWelcomeMessage() {
return !!localStorage[localStorageKeys.HIDE_WELCOME_BANNER];
return !!localStorage[localStorageKeys.HIDE_INFO_NOTIFICATION];
},
/**
* Update session storage, so that it won't be shown again
@ -38,7 +72,7 @@ export default {
*/
hideWelcomeHelper() {
this.shouldHide = true;
localStorage.setItem(localStorageKeys.HIDE_WELCOME_BANNER, true);
localStorage.setItem(localStorageKeys.HIDE_INFO_NOTIFICATION, true);
window.removeEventListener('keyup', this.keyPressEvent);
},
/* Passed to window function, to add/ remove event listener */
@ -114,6 +148,23 @@ export default {
}
}
}
.action-buttons {
display: flex;
justify-content: space-around;
margin-top: 1em;
button {
padding: 0.2rem;
background: var(--welcome-popup-background);
color: var(--welcome-popup-text-color);
border: 1px solid var(--welcome-popup-text-color);
border-radius: var(--curve-factor);
transition: all 0.2s ease-in-out;
&:hover {
background: var(--welcome-popup-text-color);
color: var(--welcome-popup-background);
}
}
}
/* Animations, animations everywhere */
.slide-fade-enter-active {
transition: all 1s ease;

View file

@ -95,7 +95,8 @@ export default {
},
/* If configured, launch specific app when hotkey pressed */
handleHotKey(key) {
const usersHotKeys = this.getCustomKeyShortcuts();
const sections = this.$store.getters.sections || [];
const usersHotKeys = this.getCustomKeyShortcuts(sections);
usersHotKeys.forEach((hotkey) => {
if (hotkey.hotkey === parseInt(key, 10)) {
if (hotkey.url) window.open(hotkey.url, '_blank');

View file

@ -7,7 +7,7 @@
<div class="options-outer">
<div :class="`options-container ${!settingsVisible ? 'hide' : ''}`">
<ThemeSelector />
<LayoutSelector :displayLayout="displayLayout" />
<LayoutSelector :displayLayout="$store.getters.layout" />
<ItemSizeSelector :iconSize="iconSize" />
<ConfigLauncher />
<AuthButtons v-if="userState !== 0" :userType="userState" />

View file

@ -8,7 +8,7 @@
:value="$store.getters.theme"
class="theme-dropdown"
:tabindex="-2"
@input="themeChanged"
@input="themeChangedInUI"
/>
</div>
<IconPalette
@ -28,18 +28,13 @@
<script>
import CustomThemeMaker from '@/components/Settings/CustomThemeMaker';
import {
LoadExternalTheme,
ApplyLocalTheme,
ApplyCustomVariables,
} from '@/utils/ThemeHelper';
import Defaults, { localStorageKeys } from '@/utils/defaults';
import Keys from '@/utils/StoreMutations';
import ErrorHandler from '@/utils/ErrorHandler';
import IconPalette from '@/assets/interface-icons/config-color-palette.svg';
import ThemingMixin from '@/mixins/ThemingMixin';
export default {
name: 'ThemeSelector',
mixins: [ThemingMixin],
props: {
hidePallete: Boolean,
},
@ -47,101 +42,16 @@ export default {
CustomThemeMaker,
IconPalette,
},
watch: {
/* When theme in VueX store changes, then update theme */
themeFromStore(newTheme) {
this.selectedTheme = newTheme;
this.updateTheme(newTheme);
},
},
data() {
return {
selectedTheme: '',
themeConfiguratorOpen: false, // Control the opening of theme config popup
themeHelper: new LoadExternalTheme(),
ApplyLocalTheme,
ApplyCustomVariables,
};
},
computed: {
/* Get appConfig from store */
appConfig() {
return this.$store.getters.appConfig;
},
/* Get users theme from store */
themeFromStore() {
return this.$store.getters.theme;
},
/* Combines all theme names (builtin and user defined) together */
themeNames: function themeNames() {
const externalThemeNames = Object.keys(this.externalThemes);
const specialThemes = ['custom'];
return [...this.extraThemeNames, ...externalThemeNames,
...Defaults.builtInThemes, ...specialThemes];
},
extraThemeNames() {
const userThemes = this.appConfig.cssThemes || [];
if (typeof userThemes === 'string') return [userThemes];
return userThemes;
},
/* Returns an array of links to external CSS from the Config */
externalThemes() {
const availibleThemes = {};
if (this.appConfig && this.appConfig.externalStyleSheet) {
const externals = this.appConfig.externalStyleSheet;
if (Array.isArray(externals)) {
externals.forEach((ext, i) => {
availibleThemes[`External Stylesheet ${i + 1}`] = ext;
});
} else if (typeof externals === 'string') {
availibleThemes['External Stylesheet'] = this.appConfig.externalStyleSheet;
} else {
ErrorHandler('External stylesheets must be of type string or string[]');
}
}
// availibleThemes.Default = '#';
return availibleThemes;
},
},
computed: {},
mounted() {
const initialTheme = this.getInitialTheme();
this.selectedTheme = initialTheme;
// Quicker loading, if the theme is local we can apply it immidiatley
if (this.isThemeLocal(initialTheme)) {
this.updateTheme(initialTheme);
}
// If it's an external stylesheet, then wait for promise to resolve
if (this.externalThemes && Object.entries(this.externalThemes).length > 0) {
const added = Object.keys(this.externalThemes).map(
name => this.themeHelper.add(name, this.externalThemes[name]),
);
// Once, added, then apply users initial theme
Promise.all(added).then(() => {
this.updateTheme(initialTheme);
});
}
this.initializeTheme();
},
methods: {
/* Called when dropdown changed
* Updates store, which will in turn update theme through watcher
*/
themeChanged() {
const pageId = this.$store.state.currentConfigInfo?.pageId || null;
this.$store.commit(Keys.SET_THEME, { theme: this.selectedTheme, pageId });
this.updateTheme(this.selectedTheme);
},
/* Returns the initial theme */
getInitialTheme() {
const localTheme = localStorage[localStorageKeys.THEME];
if (localTheme && localTheme !== 'undefined') return localTheme;
return this.appConfig.theme || Defaults.theme;
},
/* Determines if a given theme is local / not a custom user stylesheet */
isThemeLocal(themeToCheck) {
const localThemes = [...Defaults.builtInThemes, ...this.extraThemeNames];
return localThemes.includes(themeToCheck);
},
/* Opens the theme color configurator popup */
openThemeConfigurator() {
this.$store.commit(Keys.SET_MODAL_OPEN, true);
@ -154,24 +64,6 @@ export default {
this.themeConfiguratorOpen = false;
}
},
/* Updates theme. Checks if the new theme is local or external,
and calls appropirate updating function. Updates local storage */
updateTheme(newTheme) {
if (newTheme === 'Default') {
this.resetToDefault();
this.themeHelper.theme = 'Default';
} else if (this.isThemeLocal(newTheme)) {
this.ApplyLocalTheme(newTheme);
} else {
this.themeHelper.theme = newTheme;
}
this.ApplyCustomVariables(newTheme);
// localStorage.setItem(localStorageKeys.THEME, newTheme);
},
/* Removes any applied themes */
resetToDefault() {
document.getElementsByTagName('html')[0].removeAttribute('data-theme');
},
},
};
</script>

View file

@ -26,7 +26,7 @@ export default {
/* URL/ IP or hostname to the AdGuardHome instance, without trailing slash */
hostname() {
if (!this.options.hostname) this.error('You must specify the path to your AdGuard server');
return this.options.hostname;
return this.parseAsEnvVar(this.options.hostname);
},
showFullInfo() {
return this.options.showFullInfo;
@ -39,7 +39,9 @@ export default {
},
authHeaders() {
if (this.options.username && this.options.password) {
const encoded = window.btoa(`${this.options.username}:${this.options.password}`);
const password = this.parseAsEnvVar(this.options.password);
const username = this.parseAsEnvVar(this.options.username);
const encoded = window.btoa(`${username}:${password}`);
return { Authorization: `Basic ${encoded}` };
}
return {};

View file

@ -38,7 +38,7 @@ export default {
/* URL/ IP or hostname to the AdGuardHome instance, without trailing slash */
hostname() {
if (!this.options.hostname) this.error('You must specify the path to your AdGuard server');
return this.options.hostname;
return this.parseAsEnvVar(this.options.hostname);
},
showOnOffStatusOnly() {
return this.options.showOnOffStatusOnly;
@ -48,7 +48,9 @@ export default {
},
authHeaders() {
if (this.options.username && this.options.password) {
const encoded = window.btoa(`${this.options.username}:${this.options.password}`);
const username = this.parseAsEnvVar(this.options.username);
const password = this.parseAsEnvVar(this.options.password);
const encoded = window.btoa(`${username}:${password}`);
return { Authorization: `Basic ${encoded}` };
}
return {};

View file

@ -20,14 +20,16 @@ export default {
/* URL/ IP or hostname to the AdGuardHome instance, without trailing slash */
hostname() {
if (!this.options.hostname) this.error('You must specify the path to your AdGuard server');
return this.options.hostname;
return this.parseAsEnvVar(this.options.hostname);
},
endpoint() {
return `${this.hostname}/control/stats`;
},
authHeaders() {
if (this.options.username && this.options.password) {
const encoded = window.btoa(`${this.options.username}:${this.options.password}`);
const username = this.parseAsEnvVar(this.options.username);
const password = this.parseAsEnvVar(this.options.password);
const encoded = window.btoa(`${username}:${password}`);
return { Authorization: `Basic ${encoded}` };
}
return {};

View file

@ -36,11 +36,13 @@ export default {
/* URL/ IP or hostname to the AdGuardHome instance, without trailing slash */
hostname() {
if (!this.options.hostname) this.error('You must specify the path to your AdGuard server');
return this.options.hostname;
return this.parseAsEnvVar(this.options.hostname);
},
authHeaders() {
if (this.options.username && this.options.password) {
const encoded = window.btoa(`${this.options.username}:${this.options.password}`);
const username = this.parseAsEnvVar(this.options.username);
const password = this.parseAsEnvVar(this.options.password);
const encoded = window.btoa(`${username}:${password}`);
return { Authorization: `Basic ${encoded}` };
}
return {};

Some files were not shown because too many files have changed in this diff Show more