Compare commits

...

78 Commits

Author SHA1 Message Date
Ben Phelps
0eab49a449 New translations common.json (Yue) (#2132) 2023-10-05 23:56:05 +00:00
shamoon
24121cd5f0 run ci on merge_group 2023-10-05 15:17:05 -07:00
Lavender Shannon
8aeded4774 Update gluetun.md (#2137)
Fixed link to control server documentation
2023-10-05 22:14:37 +00:00
Denis Papec
40522fbb96 Fix: Quicklaunch shows also services without a url (#2136)
* Fix: Quicklaunch show only services with a link

Signed-off-by: Denis Papec <denis.papec@gmail.com>

* Revert "Fix: Quicklaunch show only services with a link"

This reverts commit 30ee825611.

* Filter only bookmarks and services with href

---------

Signed-off-by: Denis Papec <denis.papec@gmail.com>
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2023-10-05 22:14:25 +00:00
Ben Phelps
76cbb6e2ed Revert "New Crowdin updates (#2124)" (#2131)
This reverts commit b29c0f809c.
2023-10-05 10:02:01 -07:00
Ben Phelps
b29c0f809c New Crowdin updates (#2124) 2023-10-05 09:49:10 -07:00
shamoon
4f41be512c Include tailwind bg-black/white, greedy ping regex, adjust position 2023-10-05 09:28:43 -07:00
shamoon
b765330b4a Fix: dot visibility in some cases, translation strings (#2129) 2023-10-05 07:19:20 -07:00
Ben Phelps
ed3055ae1b Update Crowdin configuration file 2023-10-05 11:19:02 +03:00
Ben Phelps
5460f89cc9 Update Crowdin configuration file 2023-10-05 11:07:44 +03:00
Ben Phelps
29018873f5 Update Crowdin configuration file 2023-10-05 10:37:26 +03:00
Anonymous
11cacfb823 Translated using Weblate (Basque)
Currently translated at 6.2% (34 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eu/
2023-10-05 09:29:21 +02:00
Anonymous
eddec4adc2 Translated using Weblate (Indonesian)
Currently translated at 4.4% (24 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/
2023-10-05 09:29:21 +02:00
Anonymous
2faf51b4c0 Translated using Weblate (Slovenian)
Currently translated at 95.9% (521 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-10-05 09:29:21 +02:00
Anonymous
891c387062 Translated using Weblate (Greek)
Currently translated at 33.3% (181 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-10-05 09:29:21 +02:00
Anonymous
3b2b6cc064 Translated using Weblate (Korean)
Currently translated at 31.8% (173 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-10-05 09:29:20 +02:00
Anonymous
83a5d1b17a Translated using Weblate (Slovak)
Currently translated at 23.7% (129 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-10-05 09:29:20 +02:00
Anonymous
29b0240abd Translated using Weblate (Thai)
Currently translated at 8.8% (48 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-10-05 09:29:20 +02:00
Anonymous
8ad1f9f422 Translated using Weblate (Latvian)
Currently translated at 21.7% (118 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-10-05 09:29:20 +02:00
Anonymous
ea15a1b9e5 Translated using Weblate (Japanese)
Currently translated at 93.1% (506 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-10-05 09:29:20 +02:00
Anonymous
691ed78e75 Translated using Weblate (Ukrainian)
Currently translated at 93.1% (506 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-10-05 09:29:20 +02:00
Anonymous
5f58cb285d Translated using Weblate (Esperanto)
Currently translated at 26.7% (145 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-10-05 09:29:20 +02:00
Anonymous
a6696700b7 Translated using Weblate (Hindi)
Currently translated at 1.8% (10 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-10-05 09:29:19 +02:00
Anonymous
985ca4ae84 Translated using Weblate (Malay)
Currently translated at 46.4% (252 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-10-05 09:29:19 +02:00
Anonymous
ebda0f7b70 Translated using Weblate (Danish)
Currently translated at 95.9% (521 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-10-05 09:29:19 +02:00
Anonymous
8e7723b51d Translated using Weblate (Czech)
Currently translated at 81.7% (444 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-10-05 09:29:19 +02:00
Anonymous
24635268a0 Translated using Weblate (Arabic)
Currently translated at 48.2% (262 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-10-05 09:29:19 +02:00
Anonymous
729c161271 Translated using Weblate (Serbian)
Currently translated at 1.8% (10 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-10-05 09:29:19 +02:00
Anonymous
69af86eebe Translated using Weblate (Turkish)
Currently translated at 72.3% (393 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-10-05 09:29:18 +02:00
Anonymous
369a996f1f Translated using Weblate (Bulgarian)
Currently translated at 14.9% (81 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-10-05 09:29:18 +02:00
Anonymous
b7b63abee0 Translated using Weblate (Telugu)
Currently translated at 39.7% (216 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-10-05 09:29:18 +02:00
Anonymous
4ba47c426a Translated using Weblate (Finnish)
Currently translated at 32.5% (177 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-10-05 09:29:17 +02:00
Anonymous
29d54b032c Translated using Weblate (Yue (Traditional))
Currently translated at 21.7% (118 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-10-05 09:29:17 +02:00
Anonymous
8791aa8d0d Translated using Weblate (Portuguese (Brazil))
Currently translated at 84.8% (461 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-10-05 09:29:17 +02:00
Anonymous
337ada148c Translated using Weblate (Romanian)
Currently translated at 28.7% (156 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-10-05 09:29:17 +02:00
Anonymous
2c8348f5b5 Translated using Weblate (Hebrew)
Currently translated at 18.6% (101 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-10-05 09:29:17 +02:00
Anonymous
0eeaa99fe3 Translated using Weblate (Hungarian)
Currently translated at 86.7% (471 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-10-05 09:29:16 +02:00
Anonymous
38d2cc7bd7 Translated using Weblate (Croatian)
Currently translated at 86.5% (470 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-10-05 09:29:16 +02:00
Anonymous
759dc9f3d2 Translated using Weblate (Swedish)
Currently translated at 24.3% (132 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-10-05 09:29:16 +02:00
Anonymous
72d9a614fd Translated using Weblate (Polish)
Currently translated at 68.8% (374 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-10-05 09:29:16 +02:00
Anonymous
3d209bf572 Translated using Weblate (Catalan)
Currently translated at 48.0% (261 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-10-05 09:29:16 +02:00
Anonymous
3268db1298 Translated using Weblate (Chinese (Traditional))
Currently translated at 98.3% (534 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-10-05 09:29:16 +02:00
Anonymous
ab4a28d04a Translated using Weblate (Dutch)
Currently translated at 98.3% (534 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-10-05 09:29:15 +02:00
Anonymous
3c1644e18f Translated using Weblate (Vietnamese)
Currently translated at 8.2% (45 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-10-05 09:29:15 +02:00
Anonymous
e1f6ddaeab Translated using Weblate (Norwegian Bokmål)
Currently translated at 14.9% (81 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-10-05 09:29:15 +02:00
Anonymous
826bad8ff4 Translated using Weblate (Italian)
Currently translated at 99.4% (540 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-10-05 09:29:15 +02:00
Anonymous
8aa2bbcdd3 Translated using Weblate (Chinese (Simplified))
Currently translated at 82.8% (450 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-10-05 09:29:15 +02:00
Anonymous
aece2954df Translated using Weblate (Russian)
Currently translated at 79.1% (430 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-10-05 09:29:15 +02:00
Anonymous
5fbdbce79c Translated using Weblate (Portuguese)
Currently translated at 76.4% (415 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-10-05 09:29:14 +02:00
Anonymous
ce2bfd9d21 Translated using Weblate (French)
Currently translated at 99.6% (541 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-10-05 09:29:14 +02:00
Anonymous
df4cc6086c Translated using Weblate (Spanish)
Currently translated at 99.6% (541 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-10-05 09:29:14 +02:00
Anonymous
2c632e2b3e Translated using Weblate (German)
Currently translated at 99.0% (538 of 543 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-10-05 09:29:14 +02:00
shamoon
6de20f0ab6 Update homepage-move.md 2023-10-05 00:26:41 -07:00
shamoon
7434d597c9 Update migration docs 2023-10-05 00:22:51 -07:00
shamoon
59dbc79656 Remove deprecated notification 2023-10-04 23:55:03 -07:00
shamoon
b475f89d85 Migrate more URLs 2023-10-04 23:24:59 -07:00
shamoon
7f9ae3d01b Updating more repo URLs 2023-10-04 23:15:59 -07:00
shamoon
b12d27551a Update repo in docs 2023-10-04 23:12:53 -07:00
shamoon
3cf88d290f Merge branch 'feature-move-notification' 2023-10-04 22:47:11 -07:00
shamoon
9f030d1540 Update ping.jsx 2023-10-04 22:46:31 -07:00
shamoon
e8f6d81d13 Update ping.jsx 2023-10-04 22:37:53 -07:00
shamoon
571f627b3b Enhancement: statusStyle improvements (#2119) 2023-10-04 22:12:57 -07:00
shamoon
861ab32ca3 Update links 2023-10-03 18:55:02 -07:00
shamoon
aa5d24b9e4 Support notification re deprecated repo 2023-10-03 16:17:17 -07:00
shamoon
7adfe2ffd9 Documentation: correct ping statusStyle info 2023-10-01 01:54:06 -07:00
しぐれ
f8d2bb8611 Documentation: remove extra Service Widgets section (#2096) 2023-10-01 01:54:06 -07:00
Gino Cicatiello
892ebb8bd9 Translated using Weblate (Italian)
Currently translated at 99.8% (540 of 541 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-10-01 01:54:06 -07:00
Nonoss117
456fe6afc2 Translated using Weblate (French)
Currently translated at 100.0% (541 of 541 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-10-01 01:54:06 -07:00
Antonio Sanchez Castellón
ce3fb1abc1 Translated using Weblate (Spanish)
Currently translated at 100.0% (541 of 541 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-10-01 01:54:06 -07:00
shamoon
a1e023e240 CI: filter ci by paths, docs ci test vs build, update PR template 2023-10-01 01:54:06 -07:00
Denis Papec
56f46ae85c Enhancement: go to current day when clicking calendar month name (#2091) 2023-09-30 10:01:14 -07:00
Denis Papec
67ebe29db7 Skip workflows if it is fork (#2092)
Signed-off-by: Denis Papec <denis.papec@gmail.com>
2023-09-30 09:59:41 -07:00
Nagy László Zoltán
0c2671ea00 Update services/glances.md with correct info/glances link (#2087) 2023-09-30 07:27:12 -07:00
Ben Phelps
7a6470381b update build for insiders 2023-09-30 15:06:56 +03:00
Ben Phelps
86d3fc4fbb enable social cards, allow building docs without insiders 2023-09-30 15:06:25 +03:00
Ben Phelps
ceeb007ca0 ignore mkdocs cache 2023-09-30 14:39:51 +03:00
shamoon
87113eaac4 Add social icons to footer 2023-09-29 22:38:17 -07:00
shamoon
25cd09a117 Update .gitignore 2023-09-29 17:02:18 -07:00
82 changed files with 916 additions and 728 deletions

View File

@@ -11,13 +11,13 @@ body:
- type: markdown - type: markdown
attributes: attributes:
value: | value: |
Have a question? 👉 [Start a new discussion](https://github.com/benphelps/homepage/discussions/new) or [ask in chat](https://discord.gg/SaPGSzrEZC). Have a question? 👉 [Start a new discussion](https://github.com/gethomepage/homepage/discussions/new) or [ask in chat](https://discord.gg/SaPGSzrEZC).
Before opening an issue, please double check: Before opening an issue, please double check:
- [The troubleshooting guide](https://gethomepage.dev/en/more/troubleshooting/). - [The troubleshooting guide](https://gethomepage.dev/latest/more/troubleshooting/).
- [The homepage documentation](https://gethomepage.dev/) - [The homepage documentation](https://gethomepage.dev/)
- [Existing issues](https://github.com/benphelps/homepage/search?q=&type=issues) and [discussions](https://github.com/benphelps/homepage/search?q=&type=discussions). - [Existing issues](https://github.com/gethomepage/homepage/search?q=&type=issues) and [discussions](https://github.com/gethomepage/homepage/search?q=&type=discussions).
- type: textarea - type: textarea
id: description id: description
attributes: attributes:
@@ -78,7 +78,7 @@ body:
id: troubleshooting id: troubleshooting
attributes: attributes:
label: Troubleshooting label: Troubleshooting
description: Please include output from your [troubleshooting tests](https://gethomepage.dev/en/more/troubleshooting/#service-widget-errors). If this is a service widget issue and you do not include any information here your issue will be closed. If it is not, indicate e.g. 'n/a' description: Please include output from your [troubleshooting tests](https://gethomepage.dev/latest/more/troubleshooting/#service-widget-errors). If this is a service widget issue and you do not include any information here your issue will be closed. If it is not, indicate e.g. 'n/a'
validations: validations:
required: true required: true
- type: textarea - type: textarea
@@ -93,7 +93,7 @@ body:
options: options:
- label: Check [the documentation](https://gethomepage.dev/) - label: Check [the documentation](https://gethomepage.dev/)
required: true required: true
- label: Follow [the troubleshooting guide](https://gethomepage.dev/en/more/troubleshooting/) (please include output above if applicable). - label: Follow [the troubleshooting guide](https://gethomepage.dev/latest/more/troubleshooting/) (please include output above if applicable).
required: true required: true
- label: Search [existing issues](https://github.com/benphelps/homepage/search?q=&type=issues) and [discussions](https://github.com/benphelps/homepage/search?q=&type=discussions). - label: Search [existing issues](https://github.com/gethomepage/homepage/search?q=&type=issues) and [discussions](https://github.com/gethomepage/homepage/search?q=&type=discussions).
required: true required: true

View File

@@ -1,11 +1,11 @@
blank_issues_enabled: false blank_issues_enabled: false
contact_links: contact_links:
- name: 🤔 Questions and Help - name: 🤔 Questions and Help
url: https://github.com/benphelps/homepage/discussions url: https://github.com/gethomepage/homepage/discussions
about: This issue tracker is for bugs only, not general support questions. Please refer to our Discussions. about: This issue tracker is for bugs only, not general support questions. Please refer to our Discussions.
- name: 💬 Chat - name: 💬 Chat
url: https://discord.gg/k4ruYNrudu url: https://discord.gg/k4ruYNrudu
about: Want to discuss homepage with others? Check out our chat. about: Want to discuss homepage with others? Check out our chat.
- name: 🚀 Feature Request - name: 🚀 Feature Request
url: https://github.com/benphelps/homepage/discussions/new?category=feature-requests url: https://github.com/gethomepage/homepage/discussions/new?category=feature-requests
about: Remember to search for existing feature requests and "up-vote" any you like about: Remember to search for existing feature requests and "up-vote" any you like

View File

@@ -3,10 +3,10 @@
<!-- <!--
Please include a summary of the change. Screenshots and / or videos can also be helpful if appropriate. Please include a summary of the change. Screenshots and / or videos can also be helpful if appropriate.
*** Please see the development guidelines for new widgets: https://gethomepage.dev/en/more/development/#service-widget-guidelines *** Please see the development guidelines for new widgets: https://gethomepage.dev/latest/more/development/#service-widget-guidelines
*** If you do not follow these guidelines your PR will likely be closed without review. *** If you do not follow these guidelines your PR will likely be closed without review.
New service widgets should include example(s) of relevant relevant API output as well as a PR to the docs for the new widget. New service widgets should include example(s) of relevant relevant API output as well updates to the docs for the new widget.
--> -->
Closes # (issue) Closes # (issue)
@@ -20,11 +20,12 @@ What type of change does your PR introduce to Homepage?
- [ ] New service widget - [ ] New service widget
- [ ] Bug fix (non-breaking change which fixes an issue) - [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality) - [ ] New feature (non-breaking change which adds functionality)
- [ ] Documentation only
- [ ] Other (please explain) - [ ] Other (please explain)
## Checklist: ## Checklist:
- [ ] If adding a service widget or a change that requires it, I have added corresponding documentation. - [ ] If adding a service widget or a change that requires it, I have added corresponding documentation changes.
- [ ] If adding a new widget I have reviewed the [guidelines](https://gethomepage.dev/en/more/development/#service-widget-guidelines). - [ ] If adding a new widget I have reviewed the [guidelines](https://gethomepage.dev/latest/more/development/#service-widget-guidelines).
- [ ] If applicable, I have checked that all tests pass with e.g. `pnpm lint`. - [ ] If applicable, I have checked that all tests pass with e.g. `pnpm lint`.
- [ ] If applicable, I have tested my code for new features & regressions on both mobile & desktop devices, using the latest version of major browsers. - [ ] If applicable, I have tested my code for new features & regressions on both mobile & desktop devices, using the latest version of major browsers.

View File

@@ -12,8 +12,15 @@ on:
branches: [ "main" ] branches: [ "main" ]
# Publish semver tags as releases. # Publish semver tags as releases.
tags: [ 'v*.*.*' ] tags: [ 'v*.*.*' ]
paths-ignore:
- 'docs/**'
- 'mkdocs.yml'
pull_request: pull_request:
branches: [ "main" ] branches: [ "main" ]
paths-ignore:
- 'docs/**'
- 'mkdocs.yml'
merge_group:
env: env:
# Use docker.io for Docker Hub if empty # Use docker.io for Docker Hub if empty
@@ -24,7 +31,8 @@ env:
jobs: jobs:
build: build:
name: Docker Build & Push
if: github.repository == 'gethomepage/homepage'
runs-on: self-hosted runs-on: self-hosted
permissions: permissions:
contents: read contents: read
@@ -40,7 +48,7 @@ jobs:
# Install the cosign tool except on PR # Install the cosign tool except on PR
# https://github.com/sigstore/cosign-installer # https://github.com/sigstore/cosign-installer
- name: Install cosign - name: Install cosign
if: github.event_name != 'pull_request' if: github.event_name != 'pull_request'
uses: sigstore/cosign-installer@main uses: sigstore/cosign-installer@main
with: with:
cosign-release: 'v1.13.1' # optional cosign-release: 'v1.13.1' # optional

View File

@@ -4,13 +4,44 @@ on:
push: push:
tags: [ 'v*.*.*' ] tags: [ 'v*.*.*' ]
branches: ['main'] branches: ['main']
paths:
- 'docs/**'
- 'mkdocs.yml'
pull_request:
paths:
- 'docs/**'
- 'mkdocs.yml'
merge_group:
workflow_dispatch: workflow_dispatch:
permissions: permissions:
contents: write contents: write
jobs: jobs:
test:
name: Test Build
if: github.repository == 'gethomepage/homepage' && github.event_name == 'pull_request'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
python-version: 3.x
- run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV
- uses: actions/cache@v3
with:
key: mkdocs-material-${{ env.cache_id }}
path: .cache
restore-keys: |
mkdocs-material-
- run: sudo apt-get install pngquant
- run: pip install mike
- run: pip install mkdocs-material
- name: Test Docs Build
run: MKINSIDERS=false mkdocs build
deploy: deploy:
name: Build & Deploy
if: github.repository == 'gethomepage/homepage' && github.event_name != 'pull_request'
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
@@ -26,7 +57,7 @@ jobs:
path: .cache path: .cache
restore-keys: | restore-keys: |
mkdocs-material- mkdocs-material-
- run: sudo apt-get install pngquant - run: sudo apt-get install pngquant
- run: pip install mike - run: pip install mike
- run: pip install git+https://${GH_TOKEN}@github.com/benphelps/mkdocs-material-insiders.git - run: pip install git+https://${GH_TOKEN}@github.com/benphelps/mkdocs-material-insiders.git
- name: Set Git config - name: Set Git config
@@ -39,11 +70,11 @@ jobs:
git checkout gh-pages git checkout gh-pages
git pull origin gh-pages git pull origin gh-pages
git checkout main git checkout main
- name: Mike Deploy for Main - name: Docs Deploy for Main
if: github.ref == 'refs/heads/main' if: github.ref == 'refs/heads/main'
run: mike deploy --update --push ${{github.ref_name}} run: MKINSIDERS=true mike deploy --update --push ${{github.ref_name}}
- name: Mike Deploy for Tags - name: Docs Deploy for Tags
if: github.ref != 'refs/heads/main' if: github.ref != 'refs/heads/main'
run: mike deploy --update --push ${{github.ref_name}} latest run: MKINSIDERS=true mike deploy --update --push ${{github.ref_name}} latest
env: env:
GH_TOKEN: ${{ secrets.GH_TOKEN }} GH_TOKEN: ${{ secrets.GH_TOKEN }}

4
.gitignore vendored
View File

@@ -48,3 +48,7 @@ next-env.d.ts
# MkDocs documentation # MkDocs documentation
site*/ site*/
.cache/
# venv
.venv/

View File

@@ -13,8 +13,8 @@ We use github to host code, to track issues and feature requests, as well as acc
## Any contributions you make will be under the GNU General Public License v3.0 ## Any contributions you make will be under the GNU General Public License v3.0
In short, when you submit code changes, your submissions are understood to be under the same [GNU General Public License v3.0](https://choosealicense.com/licenses/gpl-3.0/) that covers the project. Feel free to contact the maintainers if that's a concern. In short, when you submit code changes, your submissions are understood to be under the same [GNU General Public License v3.0](https://choosealicense.com/licenses/gpl-3.0/) that covers the project. Feel free to contact the maintainers if that's a concern.
## Report bugs using Github's [issues](https://github.com/benphelps/homepage/issues) ## Report bugs using Github's [issues](https://github.com/gethomepage/homepage/issues)
We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/benphelps/homepage/issues/new); it's that easy! We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/gethomepage/homepage/issues/new); it's that easy!
## Write bug reports with detail, background, and sample configurations ## Write bug reports with detail, background, and sample configurations
Homepage includes a lot of configuration options and is often deploying in larger systems. Please include as much information (configurations, deployment method, Docker & API versions, etc) as you can when reporting an issue. Homepage includes a lot of configuration options and is often deploying in larger systems. Please include as much information (configurations, deployment method, Docker & API versions, etc) as you can when reporting an issue.
@@ -32,7 +32,7 @@ Homepage includes a lot of configuration options and is often deploying in large
People *love* thorough bug reports. I'm not even kidding. People *love* thorough bug reports. I'm not even kidding.
## Development Guidelines ## Development Guidelines
Please see the [documentation regarding development](https://gethomepage.dev/en/more/development/) and specifically the [guidelines for new service widgets](https://gethomepage.dev/en/more/development/#service-widget-guidelines) if you are considering making one. Please see the [documentation regarding development](https://gethomepage.dev/latest/more/development/) and specifically the [guidelines for new service widgets](https://gethomepage.dev/latest/more/development/#service-widget-guidelines) if you are considering making one.
## Use a Consistent Coding Style ## Use a Consistent Coding Style
This project follows the [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript), please follow it when submitting pull requests. This project follows the [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript), please follow it when submitting pull requests.

View File

@@ -36,9 +36,9 @@ RUN npm run telemetry \
FROM docker.io/node:18-alpine AS runner FROM docker.io/node:18-alpine AS runner
LABEL org.opencontainers.image.title "Homepage" LABEL org.opencontainers.image.title "Homepage"
LABEL org.opencontainers.image.description "A self-hosted services landing page, with docker and service integrations." LABEL org.opencontainers.image.description "A self-hosted services landing page, with docker and service integrations."
LABEL org.opencontainers.image.url="https://github.com/benphelps/homepage" LABEL org.opencontainers.image.url="https://github.com/gethomepage/homepage"
LABEL org.opencontainers.image.documentation='https://github.com/benphelps/homepage/wiki' LABEL org.opencontainers.image.documentation='https://github.com/gethomepage/homepage/wiki'
LABEL org.opencontainers.image.source='https://github.com/benphelps/homepage' LABEL org.opencontainers.image.source='https://github.com/gethomepage/homepage'
LABEL org.opencontainers.image.licenses='Apache-2.0' LABEL org.opencontainers.image.licenses='Apache-2.0'
ENV NODE_ENV production ENV NODE_ENV production

View File

@@ -14,7 +14,7 @@
</p> </p>
<p align="center"> <p align="center">
<a href="https://github.com/benphelps/homepage/actions/workflows/docker-publish.yml"><img alt="GitHub Workflow Status (with event)" src="https://img.shields.io/github/actions/workflow/status/benphelps/homepage/docker-publish.yml"></a> <a href="https://github.com/gethomepage/homepage/actions/workflows/docker-publish.yml"><img alt="GitHub Workflow Status (with event)" src="https://img.shields.io/github/actions/workflow/status/gethomepage/homepage/docker-publish.yml"></a>
&nbsp; &nbsp;
<a href="https://hosted.weblate.org/engage/homepage/"><img src="https://hosted.weblate.org/widgets/homepage/-/homepage/svg-badge.svg" alt="Weblate"></a> <a href="https://hosted.weblate.org/engage/homepage/"><img src="https://hosted.weblate.org/widgets/homepage/-/homepage/svg-badge.svg" alt="Weblate"></a>
&nbsp; &nbsp;
@@ -39,19 +39,19 @@ With features like quick search, bookmarks, weather support, a wide range of int
## Docker Integration ## Docker Integration
Homepage has built-in support for Docker, and can automatically discover and add services to the homepage based on labels. See the [Docker](https://gethomepage.dev/en/installation/docker/) page for more information. Homepage has built-in support for Docker, and can automatically discover and add services to the homepage based on labels. See the [Docker](https://gethomepage.dev/latest/installation/docker/) page for more information.
## Service Widgets ## Service Widgets
Homepage also has support for over 100 3rd party services, including all popular starr apps, and most popular self-hosted apps. Some examples include: Radarr, Sonarr, Lidarr, Bazarr, Ombi, Tautulli, Plex, Jellyfin, Emby, Transmission, qBittorrent, Deluge, Jackett, NZBGet, SABnzbd, etc. As well as service integrations, Homepage also has a number of information providers, sourcing information from a variety of external 3rd party APIs. See the [Service](https://gethomepage.dev/en/configs/service-widgets/) page for more information. Homepage also has support for over 100 3rd party services, including all popular starr apps, and most popular self-hosted apps. Some examples include: Radarr, Sonarr, Lidarr, Bazarr, Ombi, Tautulli, Plex, Jellyfin, Emby, Transmission, qBittorrent, Deluge, Jackett, NZBGet, SABnzbd, etc. As well as service integrations, Homepage also has a number of information providers, sourcing information from a variety of external 3rd party APIs. See the [Service](https://gethomepage.dev/latest/configs/service-widgets/) page for more information.
## Information Widgets ## Information Widgets
Homepage has built-in support for a number of information providers, including weather, time, date, search, glances and more. System and status information presented at the top of the page. See the [Information Providers](https://gethomepage.dev/en/configs/widgets/) page for more information. Homepage has built-in support for a number of information providers, including weather, time, date, search, glances and more. System and status information presented at the top of the page. See the [Information Providers](https://gethomepage.dev/latest/configs/widgets/) page for more information.
## Customization ## Customization
Homepage is highly customizable, with support for custom themes, custom CSS & JS, custom layouts, formatting, localization and more. See the [Settings](https://gethomepage.dev/en/configs/settings/) page for more information. Homepage is highly customizable, with support for custom themes, custom CSS & JS, custom layouts, formatting, localization and more. See the [Settings](https://gethomepage.dev/latest/configs/settings/) page for more information.
# Getting Started # Getting Started
@@ -65,7 +65,7 @@ Using docker compose:
version: "3.3" version: "3.3"
services: services:
homepage: homepage:
image: ghcr.io/benphelps/homepage:latest image: ghcr.io/gethomepage/homepage:latest
container_name: homepage container_name: homepage
environment: environment:
PUID: 1000 -- optional, your user id PUID: 1000 -- optional, your user id
@@ -88,7 +88,7 @@ docker run --name homepage \
-v /path/to/config:/app/config \ -v /path/to/config:/app/config \
-v /var/run/docker.sock:/var/run/docker.sock:ro \ -v /var/run/docker.sock:/var/run/docker.sock:ro \
--restart unless-stopped \ --restart unless-stopped \
ghcr.io/benphelps/homepage:latest ghcr.io/gethomepage/homepage:latest
``` ```
## With Node ## With Node
@@ -96,7 +96,7 @@ docker run --name homepage \
First, clone the repository: First, clone the repository:
```bash ```bash
git clone https://github.com/benphelps/homepage.git git clone https://github.com/gethomepage/homepage.git
``` ```
Then install dependencies and build the production bundle (I'm using pnpm here, you can use npm or yarn if you like): Then install dependencies and build the production bundle (I'm using pnpm here, you can use npm or yarn if you like):
@@ -158,9 +158,9 @@ mkdocs serve # or build, to build the static site
# Support & Suggestions # Support & Suggestions
If you have any questions, suggestions, or general issues, please start a discussion on the [Discussions](https://github.com/benphelps/homepage/discussions) page. If you have any questions, suggestions, or general issues, please start a discussion on the [Discussions](https://github.com/gethomepage/homepage/discussions) page.
For bug reports, please open an issue on the [Issues](https://github.com/benphelps/homepage/issues) page. For bug reports, please open an issue on the [Issues](https://github.com/gethomepage/homepage/issues) page.
## Contributing & Contributers ## Contributing & Contributers

3
crowdin.yml Normal file
View File

@@ -0,0 +1,3 @@
files:
- source: /public/locales/en/*.json
translation: /public/locales/%osx_locale%/%original_file_name%

View File

@@ -49,7 +49,7 @@ dockerproxy:
restart: unless-stopped restart: unless-stopped
homepage: homepage:
image: ghcr.io/benphelps/homepage:latest image: ghcr.io/gethomepage/homepage:latest
container_name: homepage container_name: homepage
volumes: volumes:
- /path/to/config:/app/config - /path/to/config:/app/config
@@ -76,7 +76,7 @@ If you'd rather use the socket directly, first make sure that you're passing the
```yaml ```yaml
homepage: homepage:
image: ghcr.io/benphelps/homepage:latest image: ghcr.io/gethomepage/homepage:latest
container_name: homepage container_name: homepage
volumes: volumes:
- /path/to/config:/app/config - /path/to/config:/app/config

View File

@@ -121,11 +121,9 @@ Services may have an optional `ping` property that allows you to monitor the ava
ping: http://some.other.host/ ping: http://some.other.host/
``` ```
<img width="1038" alt="Ping" src="https://github.com/benphelps/homepage/assets/88257202/7bc13bd3-0d0b-44e3-888c-a20e069a3233"> <img width="1038" alt="Ping" src="https://github.com/gethomepage/homepage/assets/88257202/7bc13bd3-0d0b-44e3-888c-a20e069a3233">
You can also apply different styles to the ping indicator by using the `statusStyle` property. The default is no value, and displays the response time in ms, but you can also use `dot` or `simple`. `dot` showing a green dot for a successful ping, and `simple` showing either ONLINE or OFFLINE to match the status style of Docker containers. You can also apply different styles to the ping indicator by using the `statusStyle` property, see [settings](settings.md#status-style).
<!-- TODO: Insert images of the new status styles there -->
## Docker Integration ## Docker Integration
@@ -147,7 +145,7 @@ Services may be connected to a Docker container, either running on the local mac
container: other-container container: other-container
``` ```
<img width="1038" alt="Service Containers" src="https://github.com/benphelps/homepage/assets/88257202/4c685783-52c6-4e55-afb3-affe9baac09b"> <img width="1038" alt="Service Containers" src="https://github.com/gethomepage/homepage/assets/88257202/4c685783-52c6-4e55-afb3-affe9baac09b">
**Clicking on the status label of a service with Docker integration enabled will expand the container stats, where you can see CPU, Memory, and Network activity.** **Clicking on the status label of a service with Docker integration enabled will expand the container stats, where you can see CPU, Memory, and Network activity.**
@@ -155,7 +153,7 @@ Services may be connected to a Docker container, either running on the local mac
This can also be controlled with `showStats`. See [show docker stats](docker.md#show-docker-stats) for more information This can also be controlled with `showStats`. See [show docker stats](docker.md#show-docker-stats) for more information
<img width="1038" alt="Docker Stats Expanded" src="https://github.com/benphelps/homepage/assets/88257202/f95fd595-449e-48ae-af67-fd89618904ec"> <img width="1038" alt="Docker Stats Expanded" src="https://github.com/gethomepage/homepage/assets/88257202/f95fd595-449e-48ae-af67-fd89618904ec">
## Service Integrations ## Service Integrations

View File

@@ -380,6 +380,30 @@ or per-service (`services.yaml`) with:
If you have both set the per-service settings take precedence. If you have both set the per-service settings take precedence.
## Status Style
You can choose from the following styles for docker or k8s status and ping: `dot` or `basic`
- The default is no value, and displays the ping response time in ms and the docker / k8s container status
- `dot` shows a green dot for a successful ping or healthy status.
- `basic` shows either UP or DOWN for ping
For example:
```yaml
statusStyle: 'dot'
```
or per-service (`services.yaml`) with:
```yaml
- Example Service:
...
statusStyle: 'dot'
```
If you have both set, the per-service settings take precedence.
## Hide Widget Error Messages ## Hide Widget Error Messages
Hide the visible API error messages either globally in `settings.yaml`: Hide the visible API error messages either globally in `settings.yaml`:

View File

@@ -9,7 +9,7 @@ Using docker compose:
version: "3.3" version: "3.3"
services: services:
homepage: homepage:
image: ghcr.io/benphelps/homepage:latest image: ghcr.io/gethomepage/homepage:latest
container_name: homepage container_name: homepage
ports: ports:
- 3000:3000 - 3000:3000
@@ -30,7 +30,7 @@ In the docker compose example below, the environment variables `$PUID` and `$PGI
version: "3.3" version: "3.3"
services: services:
homepage: homepage:
image: ghcr.io/benphelps/homepage:latest image: ghcr.io/gethomepage/homepage:latest
container_name: homepage container_name: homepage
ports: ports:
- 3000:3000 - 3000:3000
@@ -45,7 +45,7 @@ services:
### With Docker Run ### With Docker Run
```bash ```bash
docker run -p 3000:3000 -v /path/to/config:/app/config -v /var/run/docker.sock:/var/run/docker.sock ghcr.io/benphelps/homepage:latest docker run -p 3000:3000 -v /path/to/config:/app/config -v /var/run/docker.sock:/var/run/docker.sock ghcr.io/gethomepage/homepage:latest
``` ```
### Using Environment Secrets ### Using Environment Secrets

View File

@@ -291,7 +291,7 @@ spec:
enableServiceLinks: true enableServiceLinks: true
containers: containers:
- name: homepage - name: homepage
image: "ghcr.io/benphelps/homepage:latest" image: "ghcr.io/gethomepage/homepage:latest"
imagePullPolicy: Always imagePullPolicy: Always
ports: ports:
- name: http - name: http

View File

@@ -6,7 +6,7 @@ description: Install and run homepage from source
First, clone the repository: First, clone the repository:
```bash ```bash
git clone https://github.com/benphelps/homepage.git git clone https://github.com/gethomepage/homepage.git
``` ```
Then install dependencies and build the production bundle (I'm using pnpm here, you can use npm or yarn if you like): Then install dependencies and build the production bundle (I'm using pnpm here, you can use npm or yarn if you like):

View File

@@ -0,0 +1,8 @@
---
title: Homepage Move
description: Homepage Container Deprecation
---
As of v0.7.2 homepage migrated from benphelps/homepage to an "organization" repository located at [gethomepage/homepage](https://github.com/gethomepage/homepage/). The reason for this was to setup the project for longevity and allow for community maintenance.
Migrating your installation should be as simple as changing `image: ghcr.io/benphelps/homepage:latest` to `image: ghcr.io/gethomepage/homepage:latest`.

View File

@@ -17,7 +17,7 @@ hide:
All service widgets work essentially the same, that is, homepage makes a proxied call to an API made available by that service. The majority of the time widgets don't work it is a configuration issue. Of course, sometimes things do break. Some basic steps to try: All service widgets work essentially the same, that is, homepage makes a proxied call to an API made available by that service. The majority of the time widgets don't work it is a configuration issue. Of course, sometimes things do break. Some basic steps to try:
1. Ensure that you follow the rule mentioned on https://gethomepage.dev/en/configs/service-widgets/. **Unless otherwise noted, URLs should not end with a / or other API path. Each widget will handle the path on its own.**. This is very important as including a trailing slash can result in an error. 1. Ensure that you follow the rule mentioned on https://gethomepage.dev/latest/configs/service-widgets/. **Unless otherwise noted, URLs should not end with a / or other API path. Each widget will handle the path on its own.**. This is very important as including a trailing slash can result in an error.
2. Verify the homepage installation can connect to the IP address or host you are using for the widget `url`. This is most simply achieved by pinging the server from the homepage machine, in Docker this means _from inside the container_ itself, e.g.: 2. Verify the homepage installation can connect to the IP address or host you are using for the widget `url`. This is most simply achieved by pinging the server from the homepage machine, in Docker this means _from inside the container_ itself, e.g.:

View File

@@ -3,9 +3,9 @@ title: Glances
description: Glances Widget Configuration description: Glances Widget Configuration
--- ---
<img width="1614" alt="glances" src="https://github.com/benphelps/homepage-docs/assets/82196/25648c97-2c1b-4db0-b5a5-f1509806079c"> <img width="1614" alt="glances" src="https://github.com/gethomepage/homepage-docs/assets/82196/25648c97-2c1b-4db0-b5a5-f1509806079c">
_(Find the Glances information widget [here](../services/glances.md))_ _(Find the Glances information widget [here](../info/glances.md))_
The Glances widget allows you to monitor the resources (cpu, memory, diskio, sensors & processes) of host or another machine. You can have multiple instances by adding another service block. The Glances widget allows you to monitor the resources (cpu, memory, diskio, sensors & processes) of host or another machine. You can have multiple instances by adding another service block.
@@ -59,7 +59,7 @@ The metric field in the configuration determines the type of system monitoring d
All widgets offer an alternative to the full or "graph" view, which is the compact, or "graphless" view. All widgets offer an alternative to the full or "graph" view, which is the compact, or "graphless" view.
<img width="970" alt="Screenshot 2023-09-06 at 1 51 48PM" src="https://github.com/benphelps/homepage-docs/assets/82196/cc6b9adc-4218-4274-96ca-36c3e64de5d0"> <img width="970" alt="Screenshot 2023-09-06 at 1 51 48PM" src="https://github.com/gethomepage/homepage-docs/assets/82196/cc6b9adc-4218-4274-96ca-36c3e64de5d0">
To switch to the alternative "graphless" view, simply passs `chart: false` as an option to the widget, like so: To switch to the alternative "graphless" view, simply passs `chart: false` as an option to the widget, like so:

View File

@@ -3,7 +3,7 @@ title: Gluetun
description: Gluetun Widget Configuration description: Gluetun Widget Configuration
--- ---
Requires [HTTP control server options](https://github.com/qdm12/gluetun/wiki/HTTP-control-server-options) to be enabled. Requires [HTTP control server options](https://github.com/qdm12/gluetun-wiki/blob/main/setup/advanced/control-server.md) to be enabled.
Allowed fields: `["public_ip", "region", "country"]`. Allowed fields: `["public_ip", "region", "country"]`.

View File

@@ -3,7 +3,7 @@ title: MJPEG
description: MJPEG Stream Widget Configuration description: MJPEG Stream Widget Configuration
--- ---
![camera-preview](https://github.com/benphelps/homepage-docs/assets/82196/dc375ae3-0670-489f-8db6-83ff1f423d12) ![camera-preview](https://github.com/gethomepage/homepage-docs/assets/82196/dc375ae3-0670-489f-8db6-83ff1f423d12)
Pass the stream URL from a service like [µStreamer](https://github.com/pikvm/ustreamer) or [camera-streamer](https://github.com/ayufan/camera-streamer). Pass the stream URL from a service like [µStreamer](https://github.com/pikvm/ustreamer) or [camera-streamer](https://github.com/ayufan/camera-streamer).

View File

@@ -3,7 +3,7 @@ title: Syncthing Relay Server
description: Syncthing Relay Server Widget Configuration description: Syncthing Relay Server Widget Configuration
--- ---
Pulls stats from the [relay server](https://docs.syncthing.net/users/strelaysrv.html). [See here](https://github.com/benphelps/homepage/pull/230#issuecomment-1253053472) for more information on configuration. Pulls stats from the [relay server](https://docs.syncthing.net/users/strelaysrv.html). [See here](https://github.com/gethomepage/homepage/pull/230#issuecomment-1253053472) for more information on configuration.
Allowed fields: `["numActiveSessions", "numConnections", "bytesProxied"]`. Allowed fields: `["numActiveSessions", "numConnections", "bytesProxied"]`.

View File

@@ -4,9 +4,9 @@ site_name: homepage
site_url: https://gethomepage.dev/ site_url: https://gethomepage.dev/
# Repository # Repository
repo_name: benphelps/homepage repo_name: gethomepage/homepage
repo_url: https://github.com/benphelps/homepage repo_url: https://github.com/gethomepage/homepage
edit_uri: https://github.com/benphelps/homepage/tree/main/docs/ edit_uri: https://github.com/gethomepage/homepage/tree/main/docs/
nav: nav:
- "Home": - "Home":
@@ -63,7 +63,6 @@ nav:
- widgets/services/homeassistant.md - widgets/services/homeassistant.md
- widgets/services/homebridge.md - widgets/services/homebridge.md
- widgets/services/immich.md - widgets/services/immich.md
- widgets/services/index.md
- widgets/services/jackett.md - widgets/services/jackett.md
- widgets/services/jdownloader.md - widgets/services/jdownloader.md
- widgets/services/jellyfin.md - widgets/services/jellyfin.md
@@ -150,6 +149,7 @@ nav:
- more/index.md - more/index.md
- more/development.md - more/development.md
- more/translations.md - more/translations.md
- more/homepage-move.md
theme: theme:
name: material name: material
@@ -193,6 +193,13 @@ extra_css:
extra: extra:
version: version:
provider: mike provider: mike
social:
- icon: fontawesome/brands/discord
link: https://discord.gg/k4ruYNrudu
- icon: fontawesome/regular/message
link: https://github.com/gethomepage/homepage/discussions
- icon: fontawesome/brands/github
link: https://github.com/gethomepage/homepage
markdown_extensions: markdown_extensions:
- pymdownx.highlight: - pymdownx.highlight:
@@ -216,10 +223,13 @@ markdown_extensions:
- admonition - admonition
plugins: plugins:
- group:
enabled: !ENV MKINSIDERS
plugins:
- optimize
- typeset
- social
- tags - tags
- typeset
# - social
- optimize
- search: - search:
pipeline: pipeline:
- stemmer - stemmer

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "خطأ", "error": "خطأ",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "إجتاز", "passed": "إجتاز",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"ping": "Ping", "ping": "Ping",
"error": "Грешка" "error": "Грешка",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Passed", "passed": "Passed",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Error", "error": "Error",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Aprobat", "passed": "Aprobat",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Chyba", "error": "Chyba",
"ping": "Odezva" "ping": "Odezva",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Úspěšné", "passed": "Úspěšné",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Fejl", "error": "Fejl",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Bestået", "passed": "Bestået",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"ping": "Ping", "ping": "Ping",
"error": "Fehler" "error": "Fehler",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Bestanden", "passed": "Bestanden",

View File

@@ -136,7 +136,9 @@
}, },
"ping": { "ping": {
"error": "Σφάλμα", "error": "Σφάλμα",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"emby": { "emby": {
"playing": "Παίζει", "playing": "Παίζει",

View File

@@ -79,8 +79,12 @@
"partial": "Partial" "partial": "Partial"
}, },
"ping": { "ping": {
"http_status": "HTTP status",
"error": "Error", "error": "Error",
"ping": "Ping" "ping": "Ping",
"down": "Down",
"up": "Up",
"not_available": "Not Available"
}, },
"emby": { "emby": {
"playing": "Playing", "playing": "Playing",

View File

@@ -67,7 +67,9 @@
}, },
"ping": { "ping": {
"error": "Eraro", "error": "Eraro",
"ping": "Sondaĵo" "ping": "Sondaĵo",
"up": "Up",
"down": "Down"
}, },
"emby": { "emby": {
"playing": "Ludante", "playing": "Ludante",

View File

@@ -300,8 +300,8 @@
"73-night": "Nevada", "73-night": "Nevada",
"75-day": "Fuertes Nevadas", "75-day": "Fuertes Nevadas",
"75-night": "Fuertes Nevadas", "75-night": "Fuertes Nevadas",
"77-day": "Nevada Leve", "77-day": "Granizada",
"77-night": "Nevada Leve", "77-night": "Granizada",
"80-day": "Llovizna", "80-day": "Llovizna",
"80-night": "Llovizna", "80-night": "Llovizna",
"81-day": "Lluvia", "81-day": "Lluvia",
@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Error", "error": "Error",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Aprobado", "passed": "Aprobado",
@@ -741,8 +743,8 @@
"absolutePower": "Encender" "absolutePower": "Encender"
}, },
"calendar": { "calendar": {
"physicalRelease": "Physical release", "physicalRelease": "Lanzamiento en físico",
"inCinemas": "In cinemas", "inCinemas": "En cine",
"digitalRelease": "Digital release" "digitalRelease": "Lanzamiento en digital"
} }
} }

View File

@@ -140,7 +140,9 @@
}, },
"ping": { "ping": {
"error": "Errorea", "error": "Errorea",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"emby": { "emby": {
"playing": "Playing", "playing": "Playing",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Error", "error": "Error",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Passed", "passed": "Passed",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Erreur", "error": "Erreur",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Réussi", "passed": "Réussi",
@@ -527,7 +529,7 @@
"alertstriggered": "Alertes déclenchées" "alertstriggered": "Alertes déclenchées"
}, },
"nextcloud": { "nextcloud": {
"freespace": "Espace Libre", "freespace": "Libre",
"activeusers": "Utilisateurs Actifs", "activeusers": "Utilisateurs Actifs",
"cpuload": "Charge Cpu", "cpuload": "Charge Cpu",
"memoryusage": "Utilisation Mémoire", "memoryusage": "Utilisation Mémoire",
@@ -741,8 +743,8 @@
"absolutePower": "Puissance" "absolutePower": "Puissance"
}, },
"calendar": { "calendar": {
"physicalRelease": "Physical release", "physicalRelease": "Release physique",
"inCinemas": "In cinemas", "inCinemas": "En salle",
"digitalRelease": "Digital release" "digitalRelease": "Release digitale"
} }
} }

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Error", "error": "Error",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Passed", "passed": "Passed",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Error", "error": "Error",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Passed", "passed": "Passed",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Greška", "error": "Greška",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Uspjelo", "passed": "Uspjelo",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Hiba", "error": "Hiba",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Megfelelt", "passed": "Megfelelt",

View File

@@ -610,7 +610,9 @@
}, },
"ping": { "ping": {
"error": "Error", "error": "Error",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"emby": { "emby": {
"playing": "Playing", "playing": "Playing",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Errore", "error": "Errore",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Passati", "passed": "Passati",
@@ -735,14 +737,14 @@
"unknown": "Sconosciuto" "unknown": "Sconosciuto"
}, },
"opendtu": { "opendtu": {
"relativePower": "Power %", "relativePower": "Potenza %",
"yieldDay": "Today", "yieldDay": "Oggi",
"limit": "Limit", "limit": "Limite",
"absolutePower": "Power" "absolutePower": "Potenza"
}, },
"calendar": { "calendar": {
"physicalRelease": "Physical release", "physicalRelease": "Release fisici",
"inCinemas": "In cinemas", "inCinemas": "Al cinema",
"digitalRelease": "Digital release" "digitalRelease": "Digital release"
} }
} }

View File

@@ -117,7 +117,9 @@
}, },
"ping": { "ping": {
"error": "エラー", "error": "エラー",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"emby": { "emby": {
"playing": "再生中", "playing": "再生中",

View File

@@ -85,7 +85,9 @@
}, },
"ping": { "ping": {
"error": "오류", "error": "오류",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"emby": { "emby": {
"playing": "재생 중", "playing": "재생 중",

View File

@@ -71,7 +71,9 @@
}, },
"ping": { "ping": {
"error": "Kļūda", "error": "Kļūda",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"emby": { "emby": {
"playing": "Atskaņo", "playing": "Atskaņo",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Ralat", "error": "Ralat",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Lulus", "passed": "Lulus",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Error", "error": "Error",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Passed", "passed": "Passed",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Fout", "error": "Fout",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Gepasseerd", "passed": "Gepasseerd",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Błąd", "error": "Błąd",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Powodzenie", "passed": "Powodzenie",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Erro", "error": "Erro",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Passou", "passed": "Passou",

View File

@@ -395,7 +395,9 @@
}, },
"ping": { "ping": {
"error": "Erro", "error": "Erro",
"ping": "Tempo de resposta" "ping": "Tempo de resposta",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Aprovado", "passed": "Aprovado",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Error", "error": "Error",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Passed", "passed": "Passed",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Ошибка", "error": "Ошибка",
"ping": "Пинг" "ping": "Пинг",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"failed": "Неудачно", "failed": "Неудачно",

View File

@@ -195,7 +195,9 @@
}, },
"ping": { "ping": {
"error": "Chyba", "error": "Chyba",
"ping": "Odozva" "ping": "Odozva",
"up": "Up",
"down": "Down"
}, },
"emby": { "emby": {
"playing": "Prehrávané", "playing": "Prehrávané",

View File

@@ -152,7 +152,9 @@
}, },
"ping": { "ping": {
"error": "Napaka", "error": "Napaka",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"emby": { "emby": {
"playing": "Predvaja", "playing": "Predvaja",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Error", "error": "Error",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Passed", "passed": "Passed",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Error", "error": "Error",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Passed", "passed": "Passed",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Error", "error": "Error",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Passed", "passed": "Passed",

View File

@@ -107,7 +107,9 @@
}, },
"ping": { "ping": {
"error": "ข้อผิดพลาด", "error": "ข้อผิดพลาด",
"ping": "ปิง" "ping": "ปิง",
"up": "Up",
"down": "Down"
}, },
"emby": { "emby": {
"playing": "กำลังเล่น", "playing": "กำลังเล่น",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Hata", "error": "Hata",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Geçti", "passed": "Geçti",

View File

@@ -172,7 +172,9 @@
}, },
"ping": { "ping": {
"error": "Помилка", "error": "Помилка",
"ping": "Пінг" "ping": "Пінг",
"up": "Up",
"down": "Down"
}, },
"emby": { "emby": {
"playing": "Відтворення", "playing": "Відтворення",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "Error", "error": "Error",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "Passed", "passed": "Passed",

File diff suppressed because it is too large Load Diff

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "错误", "error": "错误",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "通过", "passed": "通过",

View File

@@ -382,7 +382,9 @@
}, },
"ping": { "ping": {
"error": "錯誤", "error": "錯誤",
"ping": "Ping" "ping": "Ping",
"up": "Up",
"down": "Down"
}, },
"scrutiny": { "scrutiny": {
"passed": "通過", "passed": "通過",

View File

@@ -15,6 +15,7 @@ export default function Item({ service, group }) {
const hasLink = service.href && service.href !== "#"; const hasLink = service.href && service.href !== "#";
const { settings } = useContext(SettingsContext); const { settings } = useContext(SettingsContext);
const showStats = (service.showStats === false) ? false : settings.showStats; const showStats = (service.showStats === false) ? false : settings.showStats;
const statusStyle = (service.statusStyle !== undefined) ? service.statusStyle : settings.statusStyle;
const [statsOpen, setStatsOpen] = useState(service.showStats); const [statsOpen, setStatsOpen] = useState(service.showStats);
const [statsClosing, setStatsClosing] = useState(false); const [statsClosing, setStatsClosing] = useState(false);
@@ -76,10 +77,10 @@ export default function Item({ service, group }) {
</div> </div>
)} )}
<div className="absolute top-0 right-0 flex flex-row justify-end gap-2 mr-2 z-30 service-tags"> <div className={`absolute top-0 right-0 flex flex-row justify-end ${statusStyle === 'dot' ? 'gap-0' : 'gap-2 mr-2'} z-30 service-tags`}>
{service.ping && ( {service.ping && (
<div className="flex-shrink-0 flex items-center justify-center service-tag service-ping"> <div className="flex-shrink-0 flex items-center justify-center service-tag service-ping">
<Ping group={group} service={service.name} style={service.statusStyle} /> <Ping group={group} service={service.name} style={statusStyle} />
<span className="sr-only">Ping status</span> <span className="sr-only">Ping status</span>
</div> </div>
)} )}
@@ -90,7 +91,7 @@ export default function Item({ service, group }) {
onClick={() => (statsOpen ? closeStats() : setStatsOpen(true))} onClick={() => (statsOpen ? closeStats() : setStatsOpen(true))}
className="flex-shrink-0 flex items-center justify-center cursor-pointer service-tag service-container-stats" className="flex-shrink-0 flex items-center justify-center cursor-pointer service-tag service-container-stats"
> >
<Status service={service} /> <Status service={service} style={statusStyle} />
<span className="sr-only">View container stats</span> <span className="sr-only">View container stats</span>
</button> </button>
)} )}
@@ -100,7 +101,7 @@ export default function Item({ service, group }) {
onClick={() => (statsOpen ? closeStats() : setStatsOpen(true))} onClick={() => (statsOpen ? closeStats() : setStatsOpen(true))}
className="flex-shrink-0 flex items-center justify-center cursor-pointer service-tag service-app" className="flex-shrink-0 flex items-center justify-center cursor-pointer service-tag service-app"
> >
<KubernetesStatus service={service} /> <KubernetesStatus service={service} style={statusStyle} />
<span className="sr-only">View container stats</span> <span className="sr-only">View container stats</span>
</button> </button>
)} )}

View File

@@ -1,35 +1,42 @@
import useSWR from "swr"; import useSWR from "swr";
import { t } from "i18next"; import { t } from "i18next";
export default function KubernetesStatus({ service }) { export default function KubernetesStatus({ service, style }) {
const podSelectorString = service.podSelector !== undefined ? `podSelector=${service.podSelector}` : ""; const podSelectorString = service.podSelector !== undefined ? `podSelector=${service.podSelector}` : "";
const { data, error } = useSWR(`/api/kubernetes/status/${service.namespace}/${service.app}?${podSelectorString}`); const { data, error } = useSWR(`/api/kubernetes/status/${service.namespace}/${service.app}?${podSelectorString}`);
let statusLabel = t("docker.unknown");
let statusTitle = "";
let backgroundClass = "px-1.5 py-0.5 bg-theme-500/10 dark:bg-theme-900/50";
let colorClass = "text-black/20 dark:text-white/40 opacity-20";
if (error) { if (error) {
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden k8s-status-error" title={t("docker.error")}> statusTitle = t("docker.error");
<div className="text-[8px] font-bold text-rose-500/80 uppercase">{t("docker.error")}</div> statusLabel = statusTitle;
</div> colorClass = "text-rose-500/80";
} else if (data) {
if (data.status === "running") {
statusTitle = data.health ?? data.status;
statusLabel = statusTitle;
colorClass = "text-emerald-500/80";
}
if (data.status === "not found" || data.status === "down" || data.status === "partial") {
statusTitle = data.status;
statusLabel = statusTitle;
colorClass = "text-orange-400/50 dark:text-orange-400/80";
}
} }
if (data && data.status === "running") { if (style === 'dot') {
return ( colorClass = colorClass.replace(/text-/g, 'bg-').replace(/\/\d\d/g, '');
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden k8s-status" title={data.health ?? data.status}> backgroundClass = "p-4 hover:bg-theme-500/10 dark:hover:bg-theme-900/20";
<div className="text-[8px] font-bold text-emerald-500/80 uppercase">{data.health ?? data.status}</div>
</div>
);
}
if (data && (data.status === "not found" || data.status === "down" || data.status === "partial")) {
return (
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden k8s-status-warning" title={data.status}>
<div className="text-[8px] font-bold text-orange-400/50 dark:text-orange-400/80 uppercase">{data.status}</div>
</div>
);
} }
return ( return (
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden k8s-status-unknown"> <div className={`w-auto text-center overflow-hidden ${backgroundClass} rounded-b-[3px] k8s-status`} title={statusTitle}>
<div className="text-[8px] font-bold text-black/20 dark:text-white/40 uppercase">{t("docker.unknown")}</div> {style !== 'dot' && <div className={`text-[8px] font-bold ${colorClass} uppercase`}>{statusLabel}</div>}
{style === 'dot' && <div className={`rounded-full h-3 w-3 ${colorClass}`}/>}
</div> </div>
); );
} }

View File

@@ -7,52 +7,49 @@ export default function Ping({ group, service, style }) {
refreshInterval: 30000 refreshInterval: 30000
}); });
let textSize = "text-[8px]"; let colorClass = "text-black/20 dark:text-white/40 opacity-20";
let colorClass = "" let backgroundClass = "bg-theme-500/10 dark:bg-theme-900/50 px-1.5 py-0.5";
let backgroundClass = "bg-theme-500/10 dark:bg-theme-900/50"; let statusTitle = t("ping.http_status");
let statusTitle = "HTTP status"; let statusText = "";
let statusText;
if (error) { if (error) {
colorClass = "text-rose-500" colorClass = "text-rose-500";
statusText = t("ping.error") statusText = t("ping.error");
statusTitle += " error" statusTitle += ` ${t("ping.error")}`;
} else if (!data) { } else if (!data) {
colorClass = "text-black/20 dark:text-white/40" statusText = t("ping.ping");
statusText = t("ping.ping") statusTitle += ` ${t("ping.not_available")}`;
statusTitle += " not available"
} else if (data.status > 403) { } else if (data.status > 403) {
colorClass = "text-rose-500/80" colorClass = "text-rose-500/80";
statusTitle += ` ${data.status}` statusTitle += ` ${data.status}`;
if (style === "basic") { if (style === "basic") {
statusText = t("docker.offline") statusText = t("ping.down");
} else if (style === "dot") {
statusText = "◉"
textSize = "text-[14px]"
backgroundClass = ""
} else { } else {
statusText = data.status statusText = data.status;
} }
} else { } else if (data) {
const ping = t("common.ms", { value: data.latency, style: "unit", unit: "millisecond", maximumFractionDigits: 0 }) const ping = t("common.ms", { value: data.latency, style: "unit", unit: "millisecond", maximumFractionDigits: 0 })
statusTitle += ` ${data.status} (${ping})`; statusTitle += ` ${data.status} (${ping})`;
colorClass = "text-emerald-500/80" colorClass = "text-emerald-500/80";
if (style === "basic") { if (style === "basic") {
statusText = t("docker.running") statusText = t("ping.up");
} else if (style === "dot") {
statusText = "◉"
textSize = "text-[14px]"
backgroundClass = ""
} else { } else {
statusText = ping statusText = ping;
colorClass += " lowercase";
} }
} }
if (style === "dot") {
backgroundClass = 'p-4';
colorClass = colorClass.replace(/text-/g, 'bg-').replace(/\/\d\d/g, '');
}
return ( return (
<div className={`w-auto px-1.5 py-0.5 text-center rounded-b-[3px] overflow-hidden ping-status-invalid ${backgroundClass}`} title={statusTitle}> <div className={`w-auto text-center rounded-b-[3px] overflow-hidden ping-status ${backgroundClass}`} title={statusTitle}>
<div className={`font-bold uppercase ${textSize} ${colorClass}`}>{statusText}</div> {style !== 'dot' && <div className={`font-bold uppercase text-[8px] ${colorClass}`}>{statusText}</div>}
{style === 'dot' && <div className={`rounded-full h-3 w-3 ${colorClass}`}/>}
</div> </div>
); );
} }

View File

@@ -1,65 +1,58 @@
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import useSWR from "swr"; import useSWR from "swr";
export default function Status({ service }) { export default function Status({ service, style }) {
const { t } = useTranslation(); const { t } = useTranslation();
const { data, error } = useSWR(`/api/docker/status/${service.container}/${service.server || ""}`); const { data, error } = useSWR(`/api/docker/status/${service.container}/${service.server || ""}`);
let statusLabel = t("docker.unknown");
let statusTitle = "";
let backgroundClass = "px-1.5 py-0.5 bg-theme-500/10 dark:bg-theme-900/50";
let colorClass = "text-black/20 dark:text-white/40 ";
if (error) { if (error) {
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden docker-error" title={t("docker.error")}> statusTitle = t("docker.error");
<div className="text-[8px] font-bold text-rose-500/80 uppercase">{t("docker.error")}</div> colorClass = "text-rose-500/80";
</div> } else if (data) {
}
if (data) {
let statusLabel = "";
if (data.status?.includes("running")) { if (data.status?.includes("running")) {
if (data.health === "starting") { if (data.health === "starting") {
return ( statusTitle = t("docker.starting");
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden docker-starting" title={t("docker.starting")}> colorClass = "text-blue-500/80";
<div className="text-[8px] font-bold text-blue-500/80 uppercase">{t("docker.starting")}</div>
</div>
);
} }
if (data.health === "unhealthy") { if (data.health === "unhealthy") {
return ( statusTitle = t("docker.unhealthy");
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden docker-unhealthy" title={t("docker.unhealthy")}> colorClass = "text-orange-400/50 dark:text-orange-400/80";
<div className="text-[8px] font-bold text-orange-400/50 dark:text-orange-400/80 uppercase">{t("docker.unhealthy")}</div>
</div>
);
} }
if (!data.health) { if (!data.health) {
statusLabel = data.status.replace("running", t("docker.running")) statusLabel = data.status.replace("running", t("docker.running"));
} else { } else {
statusLabel = data.health === "healthy" ? t("docker.healthy") : data.health statusLabel = data.health === "healthy" ? t("docker.healthy") : data.health;
} }
return ( statusTitle = statusLabel;
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden docker-status" title={statusLabel}> colorClass = "text-emerald-500/80";
<div className="text-[8px] font-bold text-emerald-500/80 uppercase">{statusLabel}</div>
</div>
);
} }
if (data.status === "not found" || data.status === "exited" || data.status?.startsWith("partial")) { if (data.status === "not found" || data.status === "exited" || data.status?.startsWith("partial")) {
if (data.status === "not found") statusLabel = t("docker.not_found") if (data.status === "not found") statusLabel = t("docker.not_found")
else if (data.status === "exited") statusLabel = t("docker.exited") else if (data.status === "exited") statusLabel = t("docker.exited")
else statusLabel = data.status.replace("partial", t("docker.partial")) else statusLabel = data.status.replace("partial", t("docker.partial"))
return ( colorClass = "text-orange-400/50 dark:text-orange-400/80";
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden docker-status-warning" title={statusLabel}>
<div className="text-[8px] font-bold text-orange-400/50 dark:text-orange-400/80 uppercase">{statusLabel}</div>
</div>
);
} }
} }
if (style === 'dot') {
colorClass = colorClass.replace('text-', 'bg-').replace(/\/\d\d$/, '');
backgroundClass = "p-4 hover:bg-theme-500/10 dark:hover:bg-theme-900/20";
}
return ( return (
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden docker-status-unknown"> <div className={`w-auto text-center overflow-hidden ${backgroundClass} rounded-b-[3px] docker-status`} title={statusTitle}>
<div className="text-[8px] font-bold text-black/20 dark:text-white/40 uppercase">{t("docker.unknown")}</div> {style !== 'dot' && <div className={`text-[8px] font-bold ${colorClass} uppercase`}>{statusLabel}</div>}
{style === 'dot' && <div className={`rounded-full h-3 w-3 ${colorClass}`}/>}
</div> </div>
); );
} }

View File

@@ -33,7 +33,7 @@ export default function Version() {
</> </>
) : ( ) : (
<a <a
href={`https://github.com/benphelps/homepage/releases/tag/${version}`} href={`https://github.com/gethomepage/homepage/releases/tag/${version}`}
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
className="ml-2 text-xs text-theme-500 dark:text-theme-400 flex flex-row items-center" className="ml-2 text-xs text-theme-500 dark:text-theme-400 flex flex-row items-center"

View File

@@ -1,6 +1,6 @@
import cachedFetch from "utils/proxy/cached-fetch"; import cachedFetch from "utils/proxy/cached-fetch";
export default async function handler(req, res) { export default async function handler(req, res) {
const releasesURL = "https://api.github.com/repos/benphelps/homepage/releases"; const releasesURL = "https://api.github.com/repos/gethomepage/homepage/releases";
return res.send(await cachedFetch(releasesURL, 5)); return res.send(await cachedFetch(releasesURL, 5));
} }

View File

@@ -183,7 +183,7 @@ function Home({ initialSettings }) {
const { data: bookmarks } = useSWR("/api/bookmarks"); const { data: bookmarks } = useSWR("/api/bookmarks");
const { data: widgets } = useSWR("/api/widgets"); const { data: widgets } = useSWR("/api/widgets");
const servicesAndBookmarks = [...services.map(sg => sg.services).flat(), ...bookmarks.map(bg => bg.bookmarks).flat()] const servicesAndBookmarks = [...services.map(sg => sg.services).flat(), ...bookmarks.map(bg => bg.bookmarks).flat()].filter(i => i?.href);
useEffect(() => { useEffect(() => {
if (settings.language) { if (settings.language) {

View File

@@ -1,6 +1,6 @@
--- ---
# For configuration options and examples, please see: # For configuration options and examples, please see:
# https://gethomepage.dev/en/configs/bookmarks # https://gethomepage.dev/latest/configs/bookmarks
- Developer: - Developer:
- Github: - Github:

View File

@@ -1,6 +1,6 @@
--- ---
# For configuration options and examples, please see: # For configuration options and examples, please see:
# https://gethomepage.dev/en/configs/docker/ # https://gethomepage.dev/latest/configs/docker/
# my-docker: # my-docker:
# host: 127.0.0.1 # host: 127.0.0.1

View File

@@ -1,6 +1,6 @@
--- ---
# For configuration options and examples, please see: # For configuration options and examples, please see:
# https://gethomepage.dev/en/configs/services # https://gethomepage.dev/latest/configs/services
- My First Group: - My First Group:
- My First Service: - My First Service:

View File

@@ -1,6 +1,6 @@
--- ---
# For configuration options and examples, please see: # For configuration options and examples, please see:
# https://gethomepage.dev/en/configs/settings # https://gethomepage.dev/latest/configs/settings
providers: providers:
openweathermap: openweathermapapikey openweathermap: openweathermapapikey

View File

@@ -1,6 +1,6 @@
--- ---
# For configuration options and examples, please see: # For configuration options and examples, please see:
# https://gethomepage.dev/en/configs/widgets # https://gethomepage.dev/latest/configs/widgets
- resources: - resources:
cpu: true cpu: true

View File

@@ -75,7 +75,7 @@ export function getSettings() {
if (initialSettings.layout) { if (initialSettings.layout) {
// support yaml list but old spec was object so convert to that // support yaml list but old spec was object so convert to that
// see https://github.com/benphelps/homepage/issues/1546 // see https://github.com/gethomepage/homepage/issues/1546
if (Array.isArray(initialSettings.layout)) { if (Array.isArray(initialSettings.layout)) {
const layoutItems = initialSettings.layout const layoutItems = initialSettings.layout
initialSettings.layout = {} initialSettings.layout = {}

View File

@@ -259,6 +259,9 @@ export async function servicesFromKubernetes() {
if (ingress.metadata.annotations[`${ANNOTATION_BASE}/ping`]) { if (ingress.metadata.annotations[`${ANNOTATION_BASE}/ping`]) {
constructedService.ping = ingress.metadata.annotations[`${ANNOTATION_BASE}/ping`]; constructedService.ping = ingress.metadata.annotations[`${ANNOTATION_BASE}/ping`];
} }
if (ingress.metadata.annotations[`${ANNOTATION_BASE}/statusStyle`]) {
constructedService.statusStyle = ingress.metadata.annotations[`${ANNOTATION_BASE}/statusStyle`];
}
Object.keys(ingress.metadata.annotations).forEach((annotation) => { Object.keys(ingress.metadata.annotations).forEach((annotation) => {
if (annotation.startsWith(ANNOTATION_WIDGET_BASE)) { if (annotation.startsWith(ANNOTATION_WIDGET_BASE)) {
shvl.set( shvl.set(

View File

@@ -126,7 +126,7 @@ export default function MonthlyView({ service }) {
return <div className="w-full text-center"> return <div className="w-full text-center">
<div className="flex-col"> <div className="flex-col">
<span><button type="button" onClick={ () => setShowDate(showDate.minus({ months: 1 }).startOf("day")) } className={classNames(monthButton)}>&lt;</button></span> <span><button type="button" onClick={ () => setShowDate(showDate.minus({ months: 1 }).startOf("day")) } className={classNames(monthButton)}>&lt;</button></span>
<span>{ showDate.setLocale(i18n.language).toFormat("MMMM y") }</span> <span><button type="button" onClick={ () => setShowDate(currentDate.startOf("day")) }>{ showDate.setLocale(i18n.language).toFormat("MMMM y") }</button></span>
<span><button type="button" onClick={ () => setShowDate(showDate.plus({ months: 1 }).startOf("day")) } className={classNames(monthButton)}>&gt;</button></span> <span><button type="button" onClick={ () => setShowDate(showDate.plus({ months: 1 }).startOf("day")) } className={classNames(monthButton)}>&gt;</button></span>
</div> </div>

View File

@@ -24,7 +24,7 @@ async function fetchFromPyloadAPI(url, sessionId, params, service) {
}, },
}; };
// see https://github.com/benphelps/homepage/issues/517 // see https://github.com/gethomepage/homepage/issues/517
const isNg = cache.get(`${isNgCacheKey}.${service}`); const isNg = cache.get(`${isNgCacheKey}.${service}`);
if (isNg && !params) { if (isNg && !params) {
delete options.body; delete options.body;
@@ -50,7 +50,7 @@ async function login(loginUrl, service, username, password = '') {
if (status !== 200 || sessionId === false) { if (status !== 200 || sessionId === false) {
logger.error(`HTTP ${status} logging into Pyload API, returned: ${JSON.stringify(sessionId)}`); logger.error(`HTTP ${status} logging into Pyload API, returned: ${JSON.stringify(sessionId)}`);
} else if (responseHeaders['set-cookie']?.join().includes('pyload_session')) { } else if (responseHeaders['set-cookie']?.join().includes('pyload_session')) {
// Support pyload-ng, see https://github.com/benphelps/homepage/issues/517 // Support pyload-ng, see https://github.com/gethomepage/homepage/issues/517
cache.put(`${isNgCacheKey}.${service}`, true); cache.put(`${isNgCacheKey}.${service}`, true);
const sessionCookie = responseHeaders['set-cookie'][0]; const sessionCookie = responseHeaders['set-cookie'][0];
cache.put(`${sessionCacheKey}.${service}`, sessionCookie, 60 * 60 * 23 * 1000); // cache for 23h cache.put(`${sessionCacheKey}.${service}`, sessionCookie, 60 * 60 * 23 * 1000); // cache for 23h

View File

@@ -70,5 +70,8 @@ module.exports = {
'lg:grid-cols-6', 'lg:grid-cols-6',
'lg:grid-cols-7', 'lg:grid-cols-7',
'lg:grid-cols-8', 'lg:grid-cols-8',
'bg-white',
'bg-black',
'dark:bg-white',
], ],
} }