chore(release): automatic release v1.2.0

This commit is contained in:
homarr-releases[bot]
2025-01-24 19:11:55 +00:00
committed by GitHub
45 changed files with 967 additions and 625 deletions

View File

@@ -31,8 +31,10 @@ body:
label: Version
description: What version of Homarr are you running?
options:
- 1.0.0-beta
- 1.1.0
- 1.0.1
- 1.0.0
- 1.0.0-beta
- Other (describe in "additional information")
default: 0
validations:

View File

@@ -1,4 +1,4 @@
FROM node:22.13.0-alpine AS base
FROM node:22.13.1-alpine AS base
FROM base AS builder
RUN apk add --no-cache libc6-compat

View File

@@ -85,9 +85,9 @@
"@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0",
"@types/chroma-js": "3.1.0",
"@types/node": "^22.10.7",
"@types/node": "^22.10.10",
"@types/prismjs": "^1.26.5",
"@types/react": "19.0.7",
"@types/react": "19.0.8",
"@types/react-dom": "19.0.3",
"@types/swagger-ui-react": "^4.18.3",
"concurrently": "^9.1.2",

View File

@@ -39,8 +39,8 @@ export const ChangeHomeBoardForm = ({ user, boardsData }: ChangeHomeBoardFormPro
});
const form = useZodForm(validation.user.changeHomeBoards, {
initialValues: {
homeBoardId: user.homeBoardId ?? "",
mobileHomeBoardId: user.mobileHomeBoardId ?? "",
homeBoardId: user.homeBoardId,
mobileHomeBoardId: user.mobileHomeBoardId,
},
});

View File

@@ -44,7 +44,7 @@
"@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0",
"@types/node": "^22.10.7",
"@types/node": "^22.10.10",
"dotenv-cli": "^8.0.0",
"eslint": "^9.18.0",
"prettier": "^3.4.2",

View File

@@ -33,7 +33,7 @@
"@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0",
"@types/ws": "^8.5.13",
"@types/ws": "^8.5.14",
"eslint": "^9.18.0",
"prettier": "^3.4.2",
"typescript": "^5.7.3"

View File

@@ -38,20 +38,20 @@
"@semantic-release/github": "^11.0.1",
"@semantic-release/npm": "^12.0.1",
"@semantic-release/release-notes-generator": "^14.0.3",
"@turbo/gen": "^2.3.3",
"@turbo/gen": "^2.3.4",
"@vitejs/plugin-react": "^4.3.4",
"@vitest/coverage-v8": "^3.0.3",
"@vitest/ui": "^3.0.3",
"@vitest/coverage-v8": "^3.0.4",
"@vitest/ui": "^3.0.4",
"conventional-changelog-conventionalcommits": "^8.0.0",
"cross-env": "^7.0.3",
"jsdom": "^26.0.0",
"prettier": "^3.4.2",
"semantic-release": "^24.2.1",
"testcontainers": "^10.17.1",
"turbo": "^2.3.3",
"turbo": "^2.3.4",
"typescript": "^5.7.3",
"vite-tsconfig-paths": "^5.1.4",
"vitest": "^3.0.3"
"vitest": "^3.0.4"
},
"packageManager": "pnpm@9.15.4",
"engines": {

View File

@@ -96,7 +96,7 @@ export class NzbGetIntegration extends DownloadClientIntegration {
): Promise<ReturnType<NzbGetClient[CallType]>> {
const username = this.getSecretValue("username");
const password = this.getSecretValue("password");
const url = this.url(`/${username}:${password}/jsonrpc`);
const url = this.url(`/${encodeURIComponent(username)}:${encodeURIComponent(password)}/jsonrpc`);
const body = JSON.stringify({ method, params });
return await fetchWithTrustedCertificatesAsync(url, { method: "POST", body })
.then(async (response) => {

View File

@@ -2,8 +2,8 @@ import { objectEntries } from "@homarr/common";
import { logger } from "@homarr/log";
import type { WidgetComponentProps } from "../../../widgets/src/definition";
import { mapKind } from "./definitions";
import type { InversedWidgetMapping, OldmarrWidgetDefinitions, WidgetMapping } from "./definitions";
import { mapKind } from "./definitions";
// This type enforces, that for all widget mappings there is a corresponding option mapping,
// each option of newmarr can be mapped from the value of the oldmarr options
@@ -38,6 +38,9 @@ const optionMapping: OptionMapping = {
return mappedLayouts[oldOptions.layout];
},
hideIcon: (oldOptions) => oldOptions.items.some((item) => item.hideIcon),
hideHostname: (oldOptions) => oldOptions.items.some((item) => item.hideHostname),
openNewTab: (oldOptions) => oldOptions.items.some((item) => item.openNewTab),
},
calendar: {
releaseType: (oldOptions) => [oldOptions.radarrReleaseType],

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "书签",
"add": "添加书签"

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "",
"add": ""

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "Bogmærker",
"add": "Tilføj bogmærke"
@@ -1999,10 +2008,10 @@
},
"customCss": {
"label": "Brugerdefineret css for denne tavle",
"description": "Yderligere, tilpasse dit dashboard ved hjælp af CSS, anbefales kun til erfarne brugere",
"description": "Tilpas din tavle ved hjælp af CSS, anbefales kun til erfarne brugere",
"customClassesAlert": {
"title": "Brugerdefinerede klasser",
"description": "Du kan tilføje brugerdefinerede klasser til dine board elementer i de avancerede muligheder for hvert element og bruge dem i den brugerdefinerede CSS ovenfor."
"description": "Du kan tilføje brugerdefinerede klasser til dine tavle elementer i de avancerede muligheder for hvert element og bruge dem i den brugerdefinerede CSS ovenfor."
}
},
"columnCount": {
@@ -2043,7 +2052,7 @@
"permission": {
"item": {
"view": {
"label": "Se board"
"label": "Se tavle"
},
"modify": {
"label": "Rediger tavle"
@@ -2091,7 +2100,7 @@
"description": "Når du sletter en tavle, er der ingen vej tilbage. Vær venligst sikker.",
"button": "Slet denne tavle",
"confirm": {
"title": "Slet board",
"title": "Slet tavle",
"description": "Er du sikker på, at du vil slette denne tavle? Dette vil permanent slette tavlen og alt dens indhold."
}
}
@@ -2200,7 +2209,7 @@
}
},
"board": {
"title": "Dine boards",
"title": "Dine tavler",
"action": {
"new": {
"label": "Ny tavle"
@@ -2231,7 +2240,7 @@
"delete": {
"label": "Slet permanent",
"confirm": {
"title": "Slet board",
"title": "Slet tavle",
"description": "Er du sikker på, at du vil slette {name} tavlen?"
}
}

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "Lesezeichen",
"add": "Lesezeichen hinzufügen"

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "",
"add": ""

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": "Hide icons"
},
"hideHostname": {
"label": "Hide hostnames"
},
"openNewTab": {
"label": "Open in new tab"
},
"items": {
"label": "Bookmarks",
"add": "Add bookmark"
@@ -1410,6 +1419,10 @@
"healthMonitoring": {
"name": "System Health Monitoring",
"description": "Displays information showing the health and status of your system(s).",
"tab": {
"system": "System",
"cluster": "Cluster"
},
"option": {
"fahrenheit": {
"label": "CPU Temp in Fahrenheit"

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "",
"add": ""

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "",
"add": ""

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "",
"add": ""

View File

@@ -735,12 +735,12 @@
"newLabel": "סיסמה חדשה"
},
"tokenId": {
"label": "",
"newLabel": ""
"label": "מזהה אסימון",
"newLabel": "מזהה אסימון חדש"
},
"realm": {
"label": "",
"newLabel": ""
"label": "תחום",
"newLabel": "תחום חדש"
}
}
},
@@ -787,7 +787,7 @@
"label": "העתק קישור"
},
"open": {
"label": ""
"label": "פתיחת מדיה"
}
}
},
@@ -908,7 +908,7 @@
"passwordRequirements": "הסיסמה אינה עומדת בדרישות",
"boardAlreadyExists": "לוח בשם זה כבר קיים",
"invalidFileType": "סוג קובץ לא חוקי, צפוי {expected}",
"invalidFileName": "",
"invalidFileName": "שם קובץ לא חוקי",
"fileTooLarge": "הקובץ גדול מדי, הגודל המרבי הוא {maxSize}",
"invalidConfiguration": "תצורה לא חוקית",
"groupNameTaken": "שם הקבוצה כבר תפוס"
@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "סימניות",
"add": "הוסף סימניה"
@@ -1191,7 +1200,7 @@
"label": "כתובת השרת"
},
"isBedrockServer": {
"label": ""
"label": "שרת Bedrock"
}
},
"status": {
@@ -1424,10 +1433,10 @@
"label": "הצג מידע על מערכת הקבצים"
},
"defaultTab": {
"label": ""
"label": "כרטיסיית ברירת מחדל"
},
"sectionIndicatorRequirement": {
"label": ""
"label": "דרישת מציין מקטע"
}
},
"popover": {
@@ -1450,47 +1459,47 @@
},
"cluster": {
"summary": {
"cpu": "",
"memory": ""
"cpu": "מעבד",
"memory": "זכרון פנימי"
},
"resource": {
"node": {
"name": ""
"name": "צמתים"
},
"qemu": {
"name": ""
"name": "מכונות וירטואליות"
},
"lxc": {
"name": ""
"name": "קונטיינרים של לינוקס"
},
"storage": {
"name": ""
"name": "אחסון"
}
},
"popover": {
"rightSection": {
"node": "",
"vmId": "",
"plugin": ""
"node": "צומת",
"vmId": "מזהה מכונה ורטואלית",
"plugin": "תוסף"
},
"detail": {
"cpu": "",
"memory": "",
"storage": "",
"uptime": "",
"haState": "",
"cpu": "ליבות",
"memory": "זיכרון",
"storage": "אחסון",
"uptime": "זמן ריצה",
"haState": "מצב זמינות גבוהה",
"storageType": {
"local": "",
"shared": ""
"local": "אחסון מקומי",
"shared": "אחסון משותף"
}
}
},
"table": {
"header": {
"name": "",
"cpu": "",
"memory": "",
"node": ""
"name": "שם",
"cpu": "מעבד",
"memory": "זכרון פנימי",
"node": "צומת"
}
}
}
@@ -2165,7 +2174,7 @@
"docker": "דוקר",
"logs": "קובצי לוג",
"api": "ממשק API",
"certificates": "",
"certificates": "אישורי אבטחה",
"tasks": "משימות"
}
},
@@ -2219,10 +2228,10 @@
}
},
"setMobileHomeBoard": {
"label": "",
"label": "הגדרה כלוח שלך בנייד",
"badge": {
"label": "",
"tooltip": ""
"label": "מכשיר נייד",
"tooltip": "לוח זה יופיע כלוח הנייד שלך"
}
},
"duplicate": {
@@ -2262,10 +2271,10 @@
"item": {
"language": "שפה ואיזור",
"board": {
"title": "",
"title": "לוח בית",
"type": {
"general": "",
"mobile": ""
"general": "כללי",
"mobile": "מכשיר נייד"
}
},
"defaultSearchEngine": "מנוע חיפוש ברירת מחדל",
@@ -2427,7 +2436,7 @@
"title": "לוחות",
"homeBoard": {
"label": "לוח בית גלובלי",
"mobileLabel": "",
"mobileLabel": "לוח גלובלי למכשיר נייד",
"description": "רק לוחות ציבוריים זמינים לבחירה"
}
},
@@ -2505,10 +2514,10 @@
"label": "ניטור בריאות המערכת"
},
"dnsHole": {
"label": ""
"label": "נתוני חור DNS"
},
"sessionCleanup": {
"label": ""
"label": "ניקוי סשן"
},
"updateChecker": {
"label": "בודק עדכונים"
@@ -2522,8 +2531,8 @@
"title": "ממשק API",
"modal": {
"createApiToken": {
"title": "",
"description": "",
"title": "נוצר אסימון API",
"description": "האסימון API נוצר. היזהר, אסימון זה מוצפן בבסיס הנתונים ולא יישלח אליך שוב. אם תאבד את האסימון הזה, לא תוכל לשחזר אותו בשנית.",
"button": "העתקה וסגירה"
}
},
@@ -2549,19 +2558,19 @@
},
"about": {
"version": "גרסה {version}",
"text": "",
"text": "Homarr הוא פרויקט קוד פתוח מונחה קהילה שמתוחזק על ידי מתנדבים. בזכות האנשים האלה, Homarr הוא פרויקט שצומח מאז 2021. הצוות שלנו עובד מרחוק ממדינות שונות בזמן הפנוי שלהם, ללא תמורה.",
"accordion": {
"contributors": {
"title": "",
"subtitle": ""
"title": "תורמים",
"subtitle": "{count} מתחזקי קוד & Homarr"
},
"translators": {
"title": "",
"subtitle": ""
"title": "מתרגמים",
"subtitle": "{count} תורמים בתרגום לשפות שונות"
},
"libraries": {
"title": "",
"subtitle": ""
"title": "ספריות",
"subtitle": "{count} בשימוש בקוד של Homarr"
}
}
}
@@ -2570,9 +2579,9 @@
"docker": {
"title": "מיכלים",
"table": {
"updated": "",
"search": "",
"selected": ""
"updated": "עודכן ב- {when}",
"search": "חפש {count} קונטיינרים",
"selected": "{selectCount} מ- {totalCount} קונטיינרים נבחרו"
},
"field": {
"name": {
@@ -2585,9 +2594,9 @@
"running": "פועל",
"paused": "מושהה",
"restarting": "מפעיל מחדש",
"exited": "",
"exited": "נסגר",
"removing": "מסיר",
"dead": ""
"dead": "מת"
}
},
"containerImage": {
@@ -2602,12 +2611,12 @@
"label": "התחל",
"notification": {
"success": {
"title": "",
"message": ""
"title": "קונטיינרים הופעלו",
"message": "הקונטיינרים הופעלו בהצלחה"
},
"error": {
"title": "",
"message": ""
"title": "הקונטיינרים לא הופעלו",
"message": "לא היה ניתן להפעיל את הקונטיינרים"
}
}
},
@@ -2615,12 +2624,12 @@
"label": "עצור",
"notification": {
"success": {
"title": "",
"message": ""
"title": "הקונטיינרים נעצרו",
"message": "הקונטיינרים נעצרו בהצלחה"
},
"error": {
"title": "",
"message": ""
"title": "הקונטיינרים לא נעצרו",
"message": "לא היה ניתן לעצור את הקונטיינרים"
}
}
},
@@ -2628,12 +2637,12 @@
"label": "אתחל",
"notification": {
"success": {
"title": "",
"message": ""
"title": "הקונטיינרים הופעלו מחדש",
"message": "הקונטיינרים הופעלו מחדש בהצלחה"
},
"error": {
"title": "",
"message": ""
"title": "הקונטיינרים לא הופעלו מחדש",
"message": "לא היה ניתן להפעיל את הקונטיינרים מחדש"
}
}
},
@@ -2641,61 +2650,61 @@
"label": "הסר",
"notification": {
"success": {
"title": "",
"message": ""
"title": "הקונטיינרים הוסרו",
"message": "הקונטיינרים הוסרו בהצלחה"
},
"error": {
"title": "",
"message": ""
"title": "הקונטיינרים לא הוסרו",
"message": "לא היה ניתן להסיר את הקונטיינרים"
}
}
},
"refresh": {
"label": "",
"label": "רענון",
"notification": {
"success": {
"title": "",
"message": ""
"title": "הקונטיינרים התרעננו",
"message": "כעת את/ה צופה בנתונים העדכניים ביותר"
},
"error": {
"title": "",
"message": ""
"title": "הקונטיינרים לא התרעננו",
"message": "משהו השתבש בזמן רענון הקונטיינרים"
}
}
},
"addToHomarr": {
"label": "",
"label": "הוסף ל- Homarr",
"notification": {
"success": {
"title": "",
"message": ""
"title": "הוסף ל- Homarr",
"message": "האפליקציות שנבחרו הוספו ל- Homarr"
},
"error": {
"title": "",
"message": ""
"title": "לא היה ניתן להוסיף ל- Homarr",
"message": "לא היה ניתן להוסיף את האפליקציות שנבחרו ל- Homarr"
}
},
"modal": {
"title": ""
"title": "הוספת דוקר קונטיינר/ים ל- Homarr"
}
}
},
"error": {
"internalServerError": ""
"internalServerError": "נכשל בקבלת קונטיינרי דוקר"
}
},
"permission": {
"title": "",
"title": "הרשאות",
"userSelect": {
"title": ""
"title": "הוספת הרשאת משתמש"
},
"groupSelect": {
"title": ""
"title": "הוספת הרשאת קבוצה"
},
"tab": {
"user": "משתמשים",
"group": "קבוצות",
"inherited": ""
"inherited": "קבוצות בירושה"
},
"field": {
"user": {
@@ -2773,7 +2782,7 @@
"label": "קבצי לוג"
},
"certificates": {
"label": ""
"label": "אישורי אבטחה"
}
},
"settings": {
@@ -2821,14 +2830,14 @@
"label": "קביעה כלוח הבית"
},
"mobileBoard": {
"label": ""
"label": "הגדרה כלוח שלך בנייד"
},
"settings": {
"label": "פתיחת הגדרות"
}
},
"detail": {
"title": ""
"title": "בחירת פעולה עבור הלוח"
}
}
},
@@ -2838,99 +2847,99 @@
}
},
"command": {
"help": "",
"help": "הפעלת מצב פקודות",
"group": {
"localCommand": {
"title": ""
"title": "פקודות מקומיות"
},
"globalCommand": {
"title": "",
"title": "פקודות גלובליות",
"option": {
"colorScheme": {
"light": "עבור למצב בהיר",
"dark": "עבור למצב כהה"
},
"language": {
"label": "",
"label": "שינוי שפה",
"children": {
"detail": {
"title": ""
"title": "בחירת שפה מועודפת"
}
}
},
"newBoard": {
"label": ""
"label": "יצירת לוח חדש"
},
"importBoard": {
"label": ""
"label": "ייבוא לוח"
},
"newApp": {
"label": ""
"label": "יצירת אפליקציה חדשה"
},
"newIntegration": {
"label": "",
"label": "יצירת אינטגרציה חדשה",
"children": {
"detail": {
"title": ""
"title": "בחירת סוג האינטגרציה שברצונך ליצור"
}
}
},
"newUser": {
"label": ""
"label": "יצירת משתמש חדש"
},
"newInvite": {
"label": ""
"label": "יצירת הזמנה חדשה"
},
"newGroup": {
"label": ""
"label": "יצירת קבוצה חדשה"
}
}
}
}
},
"media": {
"requestMovie": "",
"requestSeries": "",
"openIn": ""
"requestMovie": "בקשת סרט",
"requestSeries": "בקשת סדרה",
"openIn": "פתיחה ב- {kind}"
},
"external": {
"help": "",
"help": "שימוש במנוע חיפוש חיצוני",
"group": {
"searchEngine": {
"title": "מנועי חיפוש",
"children": {
"action": {
"search": {
"label": ""
"label": "חיפוש עם {name}"
}
},
"detail": {
"title": ""
"title": "בחירת פעולה עבור מנוע חיפוש"
},
"searchResults": {
"title": ""
"title": "בחירת תוצאה בחיפוש לביצוע פעולות"
}
},
"option": {
"google": {
"name": "",
"description": ""
"name": "גוגל",
"description": "חיפוש באינטרנט עם גוגל"
},
"bing": {
"name": "",
"description": ""
"name": "בינג",
"description": "חיפוש באינטרנט עם בינג"
},
"duckduckgo": {
"name": "",
"description": ""
"name": "DuckDuckGo",
"description": "חיפוש באינטרנט עם DuckDuckGo"
},
"torrent": {
"name": "טורנטים",
"description": ""
"description": "חיפוש טורנטים באמצעות torrentdownloads.pro"
},
"youTube": {
"name": "",
"description": ""
"name": "יוטיוב",
"description": "חיפוש וידאו ביוטיוב"
}
}
}
@@ -2939,7 +2948,7 @@
"help": {
"group": {
"mode": {
"title": ""
"title": "מצבים"
},
"help": {
"title": "עזרה",
@@ -2948,7 +2957,7 @@
"label": "תיעוד"
},
"submitIssue": {
"label": ""
"label": "שליחת בעיה"
},
"discord": {
"label": "קהילת דיסקורד"
@@ -2960,75 +2969,75 @@
"home": {
"group": {
"search": {
"title": "",
"title": "חיפוש",
"option": {
"other": {
"label": ""
"label": "חיפוש באמצעות מנוע חיפוש אחר"
},
"no-default": {
"label": "",
"description": ""
"label": "אין מנוע חיפוש ברירת מחדל",
"description": "הגדרת מנוע חיפוש ברירת מחדל בהעדפות"
},
"search": {
"label": ""
"label": "חיפוש {query} עם {name}"
},
"from-integration": {
"description": ""
"description": "התחל/י להקליד כדי לחפש"
}
}
},
"local": {
"title": ""
"title": "תוצאות מקומיות"
}
}
},
"page": {
"help": "",
"help": "חיפוש עבור דפים",
"group": {
"page": {
"title": "",
"title": "דפים",
"option": {
"manageHome": {
"label": ""
"label": "ניהול דף בית"
},
"manageBoard": {
"label": ""
"label": "ניהול לוחות"
},
"manageApp": {
"label": ""
"label": "ניהול אפליקציות"
},
"manageIntegration": {
"label": ""
"label": "ניהול אינטגרציות"
},
"manageSearchEngine": {
"label": ""
"label": "ניהול מנועי חיפוש"
},
"manageMedia": {
"label": ""
"label": "ניהול מדיה"
},
"manageUser": {
"label": "ניהול משתמשים"
},
"manageInvite": {
"label": ""
"label": "ניהול הזמנות"
},
"manageGroup": {
"label": ""
"label": "ניהול קבוצות"
},
"manageDocker": {
"label": ""
"label": "ניהול דוקר"
},
"manageApi": {
"label": ""
"label": "Swagger API"
},
"manageLog": {
"label": "הצג לוגים"
},
"manageTask": {
"label": ""
"label": "ניהול משימות"
},
"manageSettings": {
"label": ""
"label": "הגדרות כלליות"
},
"about": {
"label": "אודות"
@@ -3044,18 +3053,18 @@
}
},
"userGroup": {
"help": "",
"help": "חיפוש משתמשים או קבוצות",
"group": {
"user": {
"title": "משתמשים",
"children": {
"action": {
"detail": {
"label": ""
"label": "הצגת נתוני משתמש"
}
},
"detail": {
"title": ""
"title": "בחירת פעולה עבור משתנש"
}
}
},
@@ -3064,17 +3073,17 @@
"children": {
"action": {
"detail": {
"label": ""
"label": "הצגת נתוני קבוצה"
},
"manageMember": {
"label": ""
"label": "ניהול חברים"
},
"managePermission": {
"label": ""
"label": "ניהול הרשאות"
}
},
"detail": {
"title": ""
"title": "בחירת פעולה עבור הקבוצה"
}
}
}
@@ -3082,16 +3091,16 @@
}
},
"engine": {
"search": "",
"search": "חיפוש מנוע חיפוש",
"field": {
"name": {
"label": "שם"
},
"short": {
"label": ""
"label": "קצר"
},
"urlTemplate": {
"label": ""
"label": "תבנית חיפוש קישור אינטרנט"
},
"description": {
"label": "תיאור"
@@ -3101,53 +3110,53 @@
"list": {
"title": "מנועי חיפוש",
"noResults": {
"title": "",
"action": ""
"title": "עדיין אין מנוע חיפוש",
"action": "צור את מנוע החיפוש הראשון שלך"
},
"interactive": ""
"interactive": "אינטראקטיבי, עושה שימוש באינטגרציה"
},
"create": {
"title": "",
"title": "מנוע חיפוש חדש",
"notification": {
"success": {
"title": "",
"message": ""
"title": "מנוע חיפוש נוצר",
"message": "מנוע חיפוש נוצר בהצלחה"
},
"error": {
"title": "",
"message": ""
"title": "מנוע חיפוש לא נוצר",
"message": "לא היה ניתן ליצור את מנוע החיפוש"
}
}
},
"edit": {
"title": "",
"title": "עריכת מנוע חיפוש",
"notification": {
"success": {
"title": "השינויים הוחלו בהצלחה",
"message": ""
"message": "מנוע החיפוש נשמר בהצלחה"
},
"error": {
"title": "לא ניתן להחיל שינויים",
"message": ""
"message": "לא היה ניתן לשמור את מנוע החיפוש"
}
},
"configControl": "",
"configControl": "הגדרות",
"searchEngineType": {
"generic": "",
"fromIntegration": ""
"generic": "כללי",
"fromIntegration": "מאינטגרציה"
}
},
"delete": {
"title": "",
"message": "",
"title": "מחיקת מנוע חיפוש",
"message": "האם אתה בטוח/ה שברצונך למחוק את מנוע החיפוש {name}?",
"notification": {
"success": {
"title": "",
"message": ""
"title": "מנוע החיפוש נמחק",
"message": "מנוע החיפוש נמחק בהצלחה"
},
"error": {
"title": "",
"message": ""
"title": "מנוע החיפוש לא נמחק",
"message": "לא היה ניתן למחוק את מנוע החיפוש"
}
}
}
@@ -3155,15 +3164,15 @@
"media": {
"request": {
"modal": {
"title": "",
"title": "בקשה {name}",
"table": {
"header": {
"season": "",
"episodes": ""
"season": "עונה",
"episodes": "פרקים"
}
},
"button": {
"send": ""
"send": "שליחת בקשה"
}
}
}
@@ -3173,39 +3182,39 @@
"certificate": {
"page": {
"list": {
"title": "",
"description": "",
"title": "תעודות מהימנות",
"description": "נעשה שימוש ב-Homarr כדי לבקש נתונים מאינטגרציות.",
"noResults": {
"title": ""
"title": "אין עדיין תעודות אבטחה"
},
"expires": ""
"expires": "פג ב- {when}"
}
},
"action": {
"create": {
"label": "",
"label": "הוספת תעודת אבטחה",
"notification": {
"success": {
"title": "",
"message": ""
"title": "תעודת האבטחה הוספה",
"message": "תעודת האבטחה נוספה בהצלחה"
},
"error": {
"title": "",
"message": ""
"title": "נכשל בהוספת תעודת אבטחה",
"message": "לא היה ניתן להוסיף תעודת אבטחה"
}
}
},
"remove": {
"label": "",
"confirm": "",
"label": "הסרת תעודת אבטחה",
"confirm": "האם את/ה בטוח/ה שברצונך להסיר את תעודת האבטחה?",
"notification": {
"success": {
"title": "",
"message": ""
"title": "תעודת האבטחה הוסרה",
"message": "תעודת האבטחה הוסרה בהצלחה"
},
"error": {
"title": "",
"message": ""
"title": "תעודת אבטחה לא הוסרה",
"message": "לא היה ניתן להסיר את תעודת האבטחה"
}
}
}

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "",
"add": ""

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "Könyjelzők",
"add": "Könyvjelző hozzáadása"

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "",
"add": ""

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "",
"add": ""

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "",
"add": ""

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "",
"add": ""

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "",
"add": ""

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "Bladwijzers",
"add": "Bladwijzer toevoegen"

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "",
"add": ""

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "Zakładki",
"add": "Dodaj zakładkę"

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "",
"add": ""

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "",
"add": ""

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "Закладки",
"add": "Добавить закладку"

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "Záložky",
"add": "Pridať záložku"

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "",
"add": ""

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "",
"add": ""

View File

@@ -787,7 +787,7 @@
"label": "URL'yi kopyala"
},
"open": {
"label": ""
"label": "Medyayı"
}
}
},
@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "Yer İmleri",
"add": "Yer imi ekle"
@@ -3178,7 +3187,7 @@
"noResults": {
"title": "Henüz sertifika yok"
},
"expires": "{when} Sonra Süresi Doluyor"
"expires": "{when} süresi doluyor"
}
},
"action": {

View File

@@ -645,7 +645,7 @@
},
"invalidUrl": {
"title": "Неправильна URL-адреса",
"message": ""
"message": "Невірна URL-адреса"
},
"secretNotDefined": {
"title": "",
@@ -677,7 +677,7 @@
},
"internalServerError": {
"title": "Внутрішня помилка сервера",
"message": ""
"message": "На сервері сталася помилка"
},
"serviceUnavailable": {
"title": "",
@@ -727,8 +727,8 @@
"newLabel": "Нове ім'я користувача"
},
"apiKey": {
"label": "",
"newLabel": ""
"label": "Ключ API",
"newLabel": "Новий ключ API"
},
"password": {
"label": "Пароль",
@@ -747,11 +747,11 @@
"permission": {
"use": "",
"interact": "",
"full": ""
"full": "Повний доступ до інтеграції"
}
},
"media": {
"plural": "",
"plural": "Медіа",
"search": "Пошук медіафайлів",
"field": {
"name": "Ім’я",
@@ -772,7 +772,7 @@
}
},
"delete": {
"label": "",
"label": "Видалити медіа",
"description": "",
"notification": {
"success": {
@@ -787,7 +787,7 @@
"label": ""
},
"open": {
"label": ""
"label": "Відкрити медіа"
}
}
},
@@ -797,7 +797,7 @@
"action": {
"add": "Додати",
"apply": "Застосувати",
"backToOverview": "",
"backToOverview": "Назад до огляду",
"create": "Створити",
"edit": "Редагувати",
"import": "Імпорт",
@@ -874,7 +874,7 @@
"preferences": "Ваші уподобання",
"logout": "Вийти",
"login": "Логін",
"homeBoard": "",
"homeBoard": "Ваша домашня дошка",
"loggedOut": "Ви вийшли",
"updateAvailable": ""
}
@@ -939,8 +939,8 @@
"remove": "Видалити категорію",
"moveUp": "Рухайся.",
"moveDown": "Вниз.",
"createAbove": "",
"createBelow": ""
"createAbove": "Нові категорії зверху",
"createBelow": "Нова категорія знизу"
},
"create": {
"title": "Нова категорія",
@@ -964,12 +964,12 @@
},
"item": {
"action": {
"create": "",
"import": "",
"edit": "",
"moveResize": "",
"duplicate": "",
"remove": ""
"create": "Новий елемент",
"import": "Імпортувати елемент",
"edit": "Редагувати елемент",
"moveResize": "Перемістити/змінити розмір",
"duplicate": "Дублювати елемент",
"remove": "Видалити елемент"
},
"menu": {
"label": {
@@ -977,12 +977,12 @@
}
},
"create": {
"title": "",
"search": "",
"title": "Виберіть елемент для додавання",
"search": "Фільтр елементів",
"addToBoard": ""
},
"moveResize": {
"title": "",
"title": "Перемістити/змінити розмір",
"field": {
"width": {
"label": "Ширина"
@@ -999,14 +999,14 @@
}
},
"edit": {
"title": "",
"title": "Редагувати елемент",
"advancedOptions": {
"label": "",
"title": ""
"label": "Розширені налаштування",
"title": "Розширені налаштування елемента"
},
"field": {
"integrations": {
"label": ""
"label": "Інтеграції"
},
"customCssClasses": {
"label": ""
@@ -1014,17 +1014,17 @@
}
},
"remove": {
"title": "",
"message": ""
"title": "Видалити елемент",
"message": "Ви впевнені, що хочете видалити цей елемент?"
}
},
"widget": {
"app": {
"name": "",
"name": "Додаток",
"description": "",
"option": {
"appId": {
"label": ""
"label": "Виберіть додаток"
},
"openInNewTab": {
"label": "Відкрити в новій вкладці"
@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "",
"add": ""
@@ -1100,8 +1109,8 @@
"integrationsDisconnected": ""
},
"data": {
"adsBlockedToday": "",
"adsBlockedTodayPercentage": "",
"adsBlockedToday": "Заблоковано сьогодні",
"adsBlockedTodayPercentage": "Заблоковано сьогодні",
"dnsQueriesToday": "Запити за сьогодні",
"domainsBeingBlocked": ""
},
@@ -1135,7 +1144,7 @@
"controls": {
"enableAll": "",
"disableAll": "",
"setTimer": "",
"setTimer": "Встановити таймер",
"set": "",
"enabled": "Увімкнено",
"disabled": "Вимкнено",
@@ -1147,7 +1156,7 @@
}
},
"clock": {
"name": "",
"name": "Дата і час",
"description": "Показує поточні дату і час.",
"option": {
"customTitleToggle": {
@@ -1155,11 +1164,11 @@
"description": ""
},
"customTitle": {
"label": ""
"label": "Назва"
},
"is24HourFormat": {
"label": "",
"description": ""
"label": "24-годинний формат",
"description": "Використовувати 24-годинний формат замість 12-годинного"
},
"showSeconds": {
"label": ""
@@ -1175,28 +1184,28 @@
"label": ""
},
"dateFormat": {
"label": "",
"description": ""
"label": "Формат дати",
"description": "Як має виглядати дата"
}
}
},
"minecraftServerStatus": {
"name": "",
"name": "Статус сервера Minecraft",
"description": "",
"option": {
"title": {
"label": ""
"label": "Назва"
},
"domain": {
"label": ""
"label": "Адреса сервера"
},
"isBedrockServer": {
"label": ""
}
},
"status": {
"online": "",
"offline": ""
"online": "Онлайн",
"offline": "Офлайн"
}
},
"notebook": {
@@ -1214,13 +1223,13 @@
}
},
"controls": {
"bold": "",
"italic": "",
"bold": "Жирний",
"italic": "Курсив",
"strikethrough": "",
"underline": "",
"colorText": "",
"colorText": "Колір тексту",
"colorHighlight": "",
"code": "",
"code": "Код",
"clear": "",
"heading": "",
"align": "",
@@ -1231,8 +1240,8 @@
"checkList": "",
"increaseIndent": "",
"decreaseIndent": "",
"link": "",
"unlink": "",
"link": "Посилання",
"unlink": "Видалити посилання",
"image": "",
"addTable": "",
"deleteTable": "",
@@ -1338,9 +1347,9 @@
"releaseType": {
"label": "Radarr - тип релізів",
"options": {
"inCinemas": "",
"digitalRelease": "",
"physicalRelease": ""
"inCinemas": "У кінотеатрі",
"digitalRelease": "Цифровий випуск",
"physicalRelease": "Фізичний випуск"
}
},
"filterPastMonths": {
@@ -1497,18 +1506,18 @@
},
"common": {
"location": {
"query": "",
"query": "Місто / Поштовий індекс",
"latitude": "",
"longitude": "",
"disabledTooltip": "",
"unknownLocation": "",
"disabledTooltip": "Введіть місто або поштовий індекс",
"unknownLocation": "Невідоме місцерозташування",
"search": "Пошук",
"table": {
"header": {
"city": "",
"country": "",
"coordinates": "",
"population": ""
"city": "Місто",
"country": "Країна",
"coordinates": "Координати",
"population": "Населення"
},
"action": {
"select": ""
@@ -1560,9 +1569,9 @@
"description": "",
"option": {},
"items": {
"user": "",
"user": "Користувач",
"name": "",
"id": ""
"id": "Id"
}
},
"downloads": {
@@ -1621,11 +1630,11 @@
"detailsTitle": "Швидкість завантаження"
},
"index": {
"columnTitle": "",
"columnTitle": "#",
"detailsTitle": ""
},
"id": {
"columnTitle": ""
"columnTitle": "Id"
},
"integration": {
"columnTitle": "Інтеграція"
@@ -1650,7 +1659,7 @@
"detailsTitle": ""
},
"size": {
"columnTitle": "",
"columnTitle": "Розмір файлу",
"detailsTitle": ""
},
"state": {
@@ -1662,7 +1671,7 @@
"detailsTitle": ""
},
"type": {
"columnTitle": "",
"columnTitle": "Тип",
"detailsTitle": ""
},
"upSpeed": {
@@ -1696,7 +1705,7 @@
"pause": "",
"resume": "",
"delete": {
"title": "",
"title": "Видалити елемент",
"modalTitle": "",
"entry": "",
"entryAndFiles": ""
@@ -1706,7 +1715,7 @@
"globalRatio": ""
},
"mediaRequests-requestList": {
"name": "",
"name": "Список медіа запитів",
"description": "Перегляньте список усіх медіазапитів від ваших Overseerr або Jellyseerr",
"option": {
"linksTargetNewTab": {
@@ -1714,21 +1723,21 @@
}
},
"pending": {
"approve": "",
"approve": "Схвалити запит",
"approving": "",
"decline": ""
"decline": "Відхилити запит"
},
"availability": {
"unknown": "Невідомо",
"pending": "",
"processing": "",
"pending": "В очікуванні",
"processing": "В обробці",
"partiallyAvailable": "",
"available": ""
"available": "Доступно"
},
"toBeDetermined": ""
},
"mediaRequests-requestStats": {
"name": "",
"name": "Статистика медіазапитів",
"description": "Статистика ваших запитів у медіа",
"option": {},
"titles": {
@@ -1736,16 +1745,16 @@
"main": "Медіа-статистика",
"approved": "Вже затверджено",
"pending": "Очікує схвалення",
"processing": "",
"declined": "",
"available": "",
"tv": "Запити на ТБ",
"processing": "Обробляється",
"declined": "Вже відхилено",
"available": "Вже доступно",
"tv": "Запити на серіали",
"movie": "Запити на фільми",
"total": "Всього"
},
"users": {
"main": "Найкращі користувачі",
"requests": ""
"requests": "Запитів"
}
}
},
@@ -2033,7 +2042,7 @@
"title": "Фон"
},
"color": {
"title": ""
"title": "Кольори"
},
"customCss": {
"title": ""
@@ -2043,7 +2052,7 @@
"permission": {
"item": {
"view": {
"label": "Дошка оголошень"
"label": "Перегляд дошки"
},
"modify": {
"label": ""
@@ -2187,7 +2196,7 @@
"statistic": {
"board": "Дошки",
"user": "Користувачі",
"invite": "Запрошує",
"invite": "Запрошення",
"integration": "",
"app": "Додатки",
"group": ""
@@ -2260,7 +2269,7 @@
"general": {
"title": "Загальне",
"item": {
"language": "",
"language": "Мова та Регіон",
"board": {
"title": "",
"type": {
@@ -2321,14 +2330,14 @@
"title": "Керування запрошеннями користувачів",
"action": {
"new": {
"title": "",
"title": "Нове запрошення",
"description": "Після закінчення терміну дії запрошення буде недійсним, і одержувач запрошення не зможе створити обліковий запис."
},
"copy": {
"title": "",
"title": "Копіювати запрошення",
"description": "",
"link": "Посилання на запрошення",
"button": ""
"button": "Копіювати та закрити"
},
"delete": {
"title": "Видалити запрошення",
@@ -2346,7 +2355,7 @@
"label": "Термін придатності"
},
"token": {
"label": "Токен."
"label": "Токен"
}
}
}
@@ -2761,7 +2770,7 @@
"label": ""
},
"invites": {
"label": "Запрошує"
"label": "Запрошення"
}
},
"tools": {
@@ -2879,7 +2888,7 @@
"label": ""
},
"newInvite": {
"label": ""
"label": "Створити нове запрошення"
},
"newGroup": {
"label": ""

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "",
"add": ""

View File

@@ -1067,6 +1067,15 @@
}
}
},
"hideIcon": {
"label": ""
},
"hideHostname": {
"label": ""
},
"openNewTab": {
"label": ""
},
"items": {
"label": "書籤",
"add": "新增書籤"

View File

@@ -1,6 +1,6 @@
"use client";
import { Anchor, Box, Card, Divider, Flex, Group, Stack, Text, Title, UnstyledButton } from "@mantine/core";
import { Anchor, Box, Card, Divider, Flex, Group, Image, Stack, Text, Title, UnstyledButton } from "@mantine/core";
import type { RouterOutputs } from "@homarr/api";
import { clientApi } from "@homarr/api/client";
@@ -42,8 +42,25 @@ export default function BookmarksWidget({ options, width, height, itemId }: Widg
<Title order={4} px="0.25rem">
{options.title}
</Title>
{options.layout === "grid" && <GridLayout data={data} width={width} height={height} />}
{options.layout !== "grid" && <FlexLayout data={data} direction={options.layout} />}
{options.layout === "grid" && (
<GridLayout
data={data}
width={width}
height={height}
hideIcon={options.hideIcon}
hideHostname={options.hideHostname}
openNewTab={options.openNewTab}
/>
)}
{options.layout !== "grid" && (
<FlexLayout
data={data}
direction={options.layout}
hideIcon={options.hideIcon}
hideHostname={options.hideHostname}
openNewTab={options.openNewTab}
/>
)}
</Stack>
);
}
@@ -51,9 +68,12 @@ export default function BookmarksWidget({ options, width, height, itemId }: Widg
interface FlexLayoutProps {
data: RouterOutputs["app"]["byIds"];
direction: "row" | "column";
hideIcon: boolean;
hideHostname: boolean;
openNewTab: boolean;
}
const FlexLayout = ({ data, direction }: FlexLayoutProps) => {
const FlexLayout = ({ data, direction, hideIcon, hideHostname, openNewTab }: FlexLayoutProps) => {
return (
<Flex direction={direction} gap="0" h="100%" w="100%">
{data.map((app, index) => (
@@ -66,7 +86,7 @@ const FlexLayout = ({ data, direction }: FlexLayoutProps) => {
<UnstyledButton
component="a"
href={app.href ?? undefined}
target="_blank"
target={openNewTab ? "_blank" : "_self"}
rel="noopener noreferrer"
key={app.id}
h="100%"
@@ -81,7 +101,11 @@ const FlexLayout = ({ data, direction }: FlexLayoutProps) => {
display="flex"
p={0}
>
{direction === "row" ? <VerticalItem app={app} /> : <HorizontalItem app={app} />}
{direction === "row" ? (
<VerticalItem app={app} hideIcon={hideIcon} hideHostname={hideHostname} />
) : (
<HorizontalItem app={app} hideIcon={hideIcon} hideHostname={hideHostname} />
)}
</Card>
</UnstyledButton>
</div>
@@ -94,9 +118,12 @@ interface GridLayoutProps {
data: RouterOutputs["app"]["byIds"];
width: number;
height: number;
hideIcon: boolean;
hideHostname: boolean;
openNewTab: boolean;
}
const GridLayout = ({ data, width, height }: GridLayoutProps) => {
const GridLayout = ({ data, width, height, hideIcon, hideHostname, openNewTab }: GridLayoutProps) => {
// Calculates the perfect number of columns for the grid layout based on the width and height in pixels and the number of items
const columns = Math.ceil(Math.sqrt(data.length * (width / height)));
@@ -113,13 +140,13 @@ const GridLayout = ({ data, width, height }: GridLayoutProps) => {
<UnstyledButton
component="a"
href={app.href ?? undefined}
target="_blank"
target={openNewTab ? "_blank" : "_self"}
rel="noopener noreferrer"
key={app.id}
h="100%"
>
<Card withBorder style={{ containerType: "size" }} h="100%" className={classes.card} p="5cqmin">
<VerticalItem app={app} />
<VerticalItem app={app} hideIcon={hideIcon} hideHostname={hideHostname} />
</Card>
</UnstyledButton>
))}
@@ -127,55 +154,79 @@ const GridLayout = ({ data, width, height }: GridLayoutProps) => {
);
};
const VerticalItem = ({ app }: { app: RouterOutputs["app"]["byIds"][number] }) => {
const VerticalItem = ({
app,
hideIcon,
hideHostname,
}: {
app: RouterOutputs["app"]["byIds"][number];
hideIcon: boolean;
hideHostname: boolean;
}) => {
return (
<Stack h="100%" gap="5cqmin">
<Text fw={700} ta="center" size="20cqmin">
{app.name}
</Text>
<img
style={{
maxHeight: "100%",
maxWidth: "100%",
overflow: "auto",
flex: 1,
objectFit: "contain",
scale: 0.8,
}}
src={app.iconUrl}
alt={app.name}
/>
<Anchor ta="center" component="span" size="12cqmin">
{app.href ? new URL(app.href).hostname : undefined}
</Anchor>
{!hideIcon && (
<Image
style={{
maxHeight: "100%",
maxWidth: "100%",
overflow: "auto",
flex: 1,
objectFit: "contain",
scale: 0.8,
}}
src={app.iconUrl}
alt={app.name}
/>
)}
{!hideHostname && (
<Anchor ta="center" component="span" size="12cqmin">
{app.href ? new URL(app.href).hostname : undefined}
</Anchor>
)}
</Stack>
);
};
const HorizontalItem = ({ app }: { app: RouterOutputs["app"]["byIds"][number] }) => {
const HorizontalItem = ({
app,
hideIcon,
hideHostname,
}: {
app: RouterOutputs["app"]["byIds"][number];
hideIcon: boolean;
hideHostname: boolean;
}) => {
return (
<Group wrap="nowrap">
<img
style={{
overflow: "auto",
objectFit: "contain",
scale: 0.8,
minHeight: "100cqh",
maxHeight: "100cqh",
minWidth: "100cqh",
maxWidth: "100cqh",
}}
src={app.iconUrl}
alt={app.name}
/>
{!hideIcon && (
<Image
style={{
overflow: "auto",
objectFit: "contain",
scale: 0.8,
minHeight: "100cqh",
maxHeight: "100cqh",
minWidth: "100cqh",
maxWidth: "100cqh",
}}
src={app.iconUrl}
alt={app.name}
/>
)}
<Stack justify="space-between" gap={0}>
<Text fw={700} size="45cqh" lineClamp={1}>
{app.name}
</Text>
<Anchor component="span" size="30cqh">
{app.href ? new URL(app.href).hostname : undefined}
</Anchor>
{!hideHostname && (
<Anchor component="span" size="30cqh">
{app.href ? new URL(app.href).hostname : undefined}
</Anchor>
)}
</Stack>
</Group>
);

View File

@@ -19,6 +19,9 @@ export const { definition, componentLoader } = createWidgetDefinition("bookmarks
})),
defaultValue: "column",
}),
hideIcon: factory.switch({ defaultValue: false }),
hideHostname: factory.switch({ defaultValue: false }),
openNewTab: factory.switch({ defaultValue: true }),
items: factory.sortableItemList<RouterOutputs["app"]["all"][number], string>({
ItemComponent: ({ item, handle: Handle, removeItem, rootAttributes }) => {
return (

View File

@@ -30,7 +30,7 @@ export default function ClockWidget({ options }: WidgetComponentProps<"clock">)
{dayjs(time).tz(timezone).format(timeFormat)}
</Text>
{options.showDate && (
<Text className="clock-date-text" size="12.5cqmin" pt="1cqmin" lineClamp={1}>
<Text className="clock-date-text" size="12.5cqmin" p="1cqmin" lineClamp={1}>
{dayjs(time).tz(timezone).format(dateFormat)}
</Text>
)}

View File

@@ -5,6 +5,7 @@ import dayjs from "dayjs";
import duration from "dayjs/plugin/duration";
import { clientApi } from "@homarr/api/client";
import { useI18n } from "@homarr/translation/client";
import type { WidgetComponentProps } from "../definition";
import { ClusterHealthMonitoring } from "./cluster/cluster-health";
@@ -14,6 +15,7 @@ dayjs.extend(duration);
export default function HealthMonitoringWidget(props: WidgetComponentProps<"healthMonitoring">) {
const [integrations] = clientApi.integration.byIds.useSuspenseQuery(props.integrationIds);
const t = useI18n();
const proxmoxIntegrationId = integrations.find((integration) => integration.kind === "proxmox")?.id;
@@ -43,14 +45,14 @@ export default function HealthMonitoringWidget(props: WidgetComponentProps<"heal
<Tabs defaultValue={props.options.defaultTab} variant="outline">
<Tabs.List grow>
<Tabs.Tab value="system">
<b>System</b>
<b>{t("widget.healthMonitoring.tab.system")}</b>
</Tabs.Tab>
<Tabs.Tab value="cluster">
<b>Cluster</b>
<b>{t("widget.healthMonitoring.tab.cluster")}</b>
</Tabs.Tab>
</Tabs.List>
<Tabs.Panel mt="lg" value="system">
<SystemHealthMonitoring {...props} />
<SystemHealthMonitoring {...props} integrationIds={otherIntegrationIds} />
</Tabs.Panel>
<Tabs.Panel mt="lg" value="cluster">
<ClusterHealthMonitoring integrationId={proxmoxIntegrationId} {...props} />

563
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -19,7 +19,7 @@
"dependencies": {
"@next/eslint-plugin-next": "^15.1.6",
"eslint-config-prettier": "^10.0.1",
"eslint-config-turbo": "^2.3.3",
"eslint-config-turbo": "^2.3.4",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-react": "^7.37.4",