diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 0f9aec8ff..864d37800 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -127,7 +127,7 @@ jobs: password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Setup QEMU - uses: docker/setup-qemu-action@v3.6.0 + uses: docker/setup-qemu-action@v3.7.0 - name: Setup Docker buildx uses: docker/setup-buildx-action@v3 diff --git a/Dockerfile b/Dockerfile index d58737923..2e5ff0339 100644 --- a/Dockerfile +++ b/Dockerfile @@ -51,6 +51,8 @@ COPY --link --from=builder --chown=1000:1000 /app/.next/static/ ./.next/static RUN apk add --no-cache su-exec iputils-ping shadow +USER root + ENV NODE_ENV=production ENV HOSTNAME=0.0.0.0 ENV PORT=3000 diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 16ce33aa6..5e8f7aa56 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -57,8 +57,8 @@ if [ -d /app/.next ]; then fi # Drop privileges (when asked to) if root, otherwise run as current user -if [ "$(id -u)" == "0" ] && [ "${PUID}" != "0" ]; then - su-exec ${PUID}:${PGID} "$@" +if [ "$(id -u)" = "0" ] && [ "${PUID}" != "0" ]; then + exec su-exec ${PUID}:${PGID} "$@" else exec "$@" fi diff --git a/docs/widgets/services/omada.md b/docs/widgets/services/omada.md index f42e73a6c..e83038d82 100644 --- a/docs/widgets/services/omada.md +++ b/docs/widgets/services/omada.md @@ -3,7 +3,7 @@ title: Omada description: Omada Widget Configuration --- -The widget supports controller versions 3, 4 and 5. +The widget supports controller versions 3, 4, 5 and 6. Allowed fields: `["connectedAp", "activeUser", "alerts", "connectedGateways", "connectedSwitches"]`. diff --git a/public/locales/zh-Hans/common.json b/public/locales/zh-Hans/common.json index 76b850f6a..a6eda2e21 100644 --- a/public/locales/zh-Hans/common.json +++ b/public/locales/zh-Hans/common.json @@ -200,10 +200,10 @@ "rutorrent": { "active": "活动中", "upload": "Upload", - "download": "Download" + "download": "下载" }, "transmission": { - "download": "Download", + "download": "下载", "upload": "", "leech": "Leech", "seed": "Seed" @@ -223,8 +223,8 @@ "invalid": "Invalid" }, "deluge": { - "download": "Download", - "upload": "Upload", + "download": "下载", + "upload": "上传", "leech": "Leech", "seed": "Seed" }, diff --git a/src/widgets/calendar/integrations/ical.jsx b/src/widgets/calendar/integrations/ical.jsx index 764e57f41..1bf5ebee6 100644 --- a/src/widgets/calendar/integrations/ical.jsx +++ b/src/widgets/calendar/integrations/ical.jsx @@ -106,13 +106,19 @@ export default function Integration({ config, params, setEvents, hideErrors, tim }; const eventsToAdd = []; - events.forEach((event, index) => { + events.forEach((event) => { const occurrences = getOcurrencesFromRange(event); occurrences.forEach((icalDate) => { const date = icalDate.toJSDate(); - const hash = simpleHash(`${event.id}-${event.title}-${index}-${date.toString()}`); + const occurrenceTimestamp = date.getTime(); + const eventIdentifier = + event.id ?? + simpleHash( + `${event.title ?? ""}-${event.type ?? ""}-${event.status ?? ""}-${event.url ?? ""}-${event.location ?? ""}`, + ); + const hash = simpleHash(`${eventIdentifier}-${occurrenceTimestamp}`); let title = event.title; if (showName) { diff --git a/src/widgets/esphome/component.jsx b/src/widgets/esphome/component.jsx index e0f020899..1e9dc2517 100644 --- a/src/widgets/esphome/component.jsx +++ b/src/widgets/esphome/component.jsx @@ -14,6 +14,12 @@ export default function Component({ service }) { return ; } + if (!widget.fields || widget.fields.length === 0) { + widget.fields = ["online", "offline", "offline_alt", "total"]; + } else if (widget.fields.length > 4) { + widget.fields = widget.fields.slice(0, 4); + } + if (!resultData) { return ( diff --git a/src/widgets/komodo/component.jsx b/src/widgets/komodo/component.jsx index 4d22758e5..8034c14b0 100644 --- a/src/widgets/komodo/component.jsx +++ b/src/widgets/komodo/component.jsx @@ -32,7 +32,7 @@ export default function Component({ service }) { if ( (!widget.showStacks && !containersData) || - (widget.showSummary && (!stacksData || !serversData)) || + (widget.showSummary && (!containersData || !stacksData || !serversData)) || (widget.showStacks && !stacksData) ) { return widget.showSummary ? (