Compare commits

...
Author SHA1 Message Date
Meier Lukas c2ddb676fe Merge branch 'dev' into fix-stacked-dynamic-sections-menu 2024-10-26 18:06:22 +02:00
homarr-renovate[bot] f8c21f6000 fix(deps): update dependency tldts to ^6.1.56 (#1375)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-26 10:48:09 +00:00
homarr-renovate[bot] 3127182f5c fix(deps): update dependency eslint-plugin-jsx-a11y to ^6.10.2 (#1374)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-26 05:11:06 +00:00
homarr-renovate[bot] 0c41241bbd chore(deps): update dependency @types/node to ^20.17.1 (#1371)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-25 13:39:34 +00:00
homarr-renovate[bot] 4985bd8f91 fix(deps): update dependency video.js to ^8.19.1 (#1370)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-25 07:37:26 +00:00
homarr-renovate[bot] 3a6e957710 fix(deps): update dependency tldts to ^6.1.55 (#1369)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-24 23:27:09 +00:00
Meier Lukas 041006c181 fix: docker build not working (#1365) 2024-10-24 22:45:36 +02:00
homarr-renovate[bot] 2bac28a50a fix(deps): update dependency sass to ^1.80.4 (#1366)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-23 23:11:15 +00:00
homarr-renovate[bot] f55b813aa1 fix(deps): update mantine monorepo to ^7.13.4 (#1364)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-23 17:39:32 +00:00
Meier LukasandYossi Hillali c37a0e38d9 fix: health-check widget sorting & last seen (#1363)
Co-authored-by: Yossi Hillali <950010+hillaliy@users.noreply.github.com>
2024-10-23 17:30:10 +02:00
homarr-renovate[bot] 32b0059b10 chore(deps): update dependency @types/node to ^20.17.0 (#1362)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-23 14:48:51 +00:00
homarr-renovate[bot] b542bad939 fix(deps): update tanstack-query monorepo to ^5.59.16 (#1361)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-23 14:42:10 +00:00
Yossi Hillali cf9b0581a4 feat: plex integration (#1342)
* feat: plex integration

* feat: plex integration

* fix: DeepSource error

* fix: lint error

* fix: pnpm-lock

* fix: lint error

* fix: errors

* fix: pnpm-lock

* fix: reviewed changes

* fix: reviewed changes

* fix: reviewed changes

* fix: pnpm-lock
2024-10-23 17:18:55 +03:00
homarr-renovate[bot] d4919dc908 fix(deps): update tiptap monorepo to v2.9.1 (#1360)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-23 09:40:01 +00:00
homarr-renovate[bot] 30d4464067 fix(deps): update dependency @tabler/icons-react to ^3.20.0 (#1359)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-23 06:16:16 +00:00
homarr-renovate[bot] 44176b403e chore(deps): update dependency @types/react to ^18.3.12 (#1358)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-23 04:49:15 +00:00
homarr-renovate[bot] f756d17901 chore(deps): update dependency @types/prismjs to ^1.26.5 (#1357)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-23 04:33:36 +00:00
homarr-renovate[bot] dea6d6c311 chore(deps): update dependency @types/node to ^20.16.15 (#1356)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-23 04:13:58 +00:00
homarr-renovate[bot] aea65eadcd fix(deps): update nextjs monorepo to ^14.2.16 (#1355)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-23 02:58:20 +00:00
homarr-renovate[bot] 1a2f0adfc8 fix(deps): update dependency eslint-plugin-react to ^7.37.2 (#1354)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-22 22:31:36 +00:00
homarr-renovate[bot] c3b9d981f7 fix(deps): update tiptap monorepo to v2.9.0 (#1352)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-22 21:27:12 +00:00
homarr-renovate[bot] e062ea1507 fix(deps): update dependency tldts to ^6.1.54 (#1353)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-22 21:10:26 +00:00
homarr-renovate[bot] a8c36f35c3 fix(deps): update dependency tldts to ^6.1.53 (#1351)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-22 06:51:30 +00:00
homarr-renovate[bot] d599390512 fix(deps): update dependency better-sqlite3 to ^11.5.0 (#1350)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-22 03:42:12 +00:00
homarr-renovate[bot] 4e41af51eb chore(deps): update dependency @types/node to ^20.16.14 (#1349)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-22 03:23:32 +00:00
homarr-renovate[bot] 85a5ebd288 fix(deps): update dependency drizzle-orm to ^0.35.3 (#1348)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-21 21:26:30 +00:00
homarr-renovate[bot] 81372a81e2 chore(deps): update turbo monorepo to ^2.2.3 (#1345)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-21 17:48:38 +00:00
homarr-renovate[bot] a005ead158 fix(deps): update dependency typescript-eslint to ^8.11.0 (#1346)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-21 17:39:58 +00:00
Meier Lukas 2f1c800844 feat: add everyone group (#1322)
* feat: add everyone group through seed

* feat: add reserved group name check in group router actions

* feat: improve user interface for everyone group

* fix: reserved group alert is a server component

* feat: add all users to everyone group

* chore: update lockfile

* fix: format issues

* fix: lint issues

* fix: lint format issues

* test: add unit tests for everyone group

* refactor: add codegen for documentation urls by sitemap

* refactor: change group query to count

* chore: remove migrations temporarily

* chore: add migrations again

* chore: add lint rule to prevent usage of raw documentation links

* fix: format issues
2024-10-21 17:23:51 +02:00
homarr-renovate[bot] 654880d7e4 chore(deps): update turbo monorepo to ^2.2.2 (#1344)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-21 14:32:05 +00:00
Yossi Hillali 9a7e845010 feat: RTL option to RSS widget (#1247) 2024-10-21 13:19:34 +03:00
homarr-renovate[bot] 564096e463 fix(deps): update dependency eslint-plugin-jsx-a11y to ^6.10.1 (#1343)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-21 06:45:21 +00:00
homarr-renovate[bot] 278107a1a4 fix(deps): update dependency next-auth to v5.0.0-beta.25 (#1341)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-19 21:10:50 +00:00
homarr-renovate[bot] c5cc21a4b0 fix(deps): update dependency @auth/drizzle-adapter to ^1.7.2 (#1339)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-19 20:40:19 +00:00
homarr-renovate[bot] aa2d2f8c4b fix(deps): update dependency @auth/core to ^0.37.2 (#1338)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-19 20:29:37 +00:00
homarr-renovate[bot] 9b5b8e6db3 chore(deps): update dependency @vitejs/plugin-react to ^4.3.3 (#1336)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-19 16:33:23 +00:00
Meier Lukas 9c5972faf4 fix: missing migration for default colorscheme change (#1335)
* fix: missing migration for default colorscheme change

* fix: format issues
2024-10-19 17:57:00 +02:00
homarr-renovate[bot] 98f1c33318 fix(deps): update dependency react-error-boundary to ^4.1.2 (#1334)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-19 14:29:30 +00:00
homarr-renovate[bot] 6e24553e10 chore(deps): update turbo monorepo to ^2.2.1 (#1333)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-19 13:16:08 +00:00
Meier Lukas 799d6c5d4a fix: color scheme manager should use cookie and not session value (#1329)
* fix: color scheme manager should use cookie and not session value

* fix: cookie saved for random path
2024-10-19 10:27:31 +02:00
Meier Lukas 7572634780 fix: local websocket url wrong (#1328) 2024-10-19 10:27:13 +02:00
homarr-renovate[bot] 7e219bc86f chore(deps): update dependency @types/node to ^20.16.13 (#1332)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-19 04:13:11 +00:00
homarr-renovate[bot] e46bf5d248 fix(deps): update dependency sass to ^1.80.3 (#1331)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-19 00:48:44 +00:00
homarr-renovate[bot] d40655134f chore(deps): update dependency eslint to ^9.13.0 (#1330)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-18 21:27:06 +00:00
homarr-renovate[bot] fa1a2c4b31 chore(deps): update turbo monorepo to ^2.2.0 (#1327)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-18 19:48:32 +00:00
Yossi Hillali ce67fcd57c fix: add subscription to health monitoring widget (#1210)
* fix: add subscription

* fix: add time stamped

* fix: rtl, timestamp, scrollArea

* fix: common.rtl

* fix: rtl

* fix: reviewed changes

* fix: translation

* fix: reviewed changes

* fix: deepScource

* fix: reviewed changes

* fix: add last seen
2024-10-18 21:42:33 +03:00
homarr-renovate[bot] c52fd972b7 fix(deps): update dependency next-auth to v5.0.0-beta.23 (#1325)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-18 17:48:55 +00:00
homarr-renovate[bot] b1393fa59b fix(deps): update dependency @auth/drizzle-adapter to ^1.7.1 (#1324)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-18 17:39:32 +00:00
homarr-renovate[bot] dac2b5063b fix(deps): update dependency @auth/core to ^0.37.1 (#1323)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-18 17:29:44 +00:00
homarr-renovate[bot] c8b1bb8d62 fix(deps): update dependency drizzle-orm to ^0.35.2 (#1321)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-18 11:48:33 +00:00
homarr-renovate[bot] 601af7acd8 fix(deps): update dependency better-sqlite3 to ^11.4.0 (#1320)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-17 21:26:58 +00:00
homarr-renovate[bot] 3781fe5cf8 fix(deps): update dependency sass to ^1.80.2 (#1319)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-17 21:10:42 +00:00
homarr-renovate[bot] a231a2da6c fix(deps): update dependency typescript-eslint to ^8.10.0 (#1317)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-17 20:29:44 +00:00
Meier Lukas 0df7cb5c25 feat: improve metadata (#1308) 2024-10-17 12:38:38 +02:00
homarr-renovate[bot] a44c907745 fix(deps): update dependency sass to ^1.80.1 (#1314)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-17 08:35:20 +00:00
homarr-renovate[bot] 84bb1deae5 fix(deps): update mantine monorepo to ^7.13.3 (#1316)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-17 08:15:09 +00:00
homarr-renovate[bot] 3b5082c107 fix(deps): update dependency react-error-boundary to ^4.1.1 (#1315)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-17 02:58:23 +00:00
homarr-renovate[bot] c57bf54bbb chore(deps): update dependency @types/node to ^20.16.12 (#1313)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-17 00:49:04 +00:00
homarr-renovate[bot] 0c134dde6e fix(deps): update dependency sass to ^1.79.6 (#1312)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-16 23:27:36 +00:00
Meier Lukas 727f10448f feat: add manifest (#1309) 2024-10-16 21:46:32 +02:00
Meier Lukas 12105b3b29 fix: inconsistent session cookie (#1310) 2024-10-16 21:46:12 +02:00
Meier Lukas cd77acdfab fix: prevent flickering by removing auto color scheme and default background color (#1299)
* fix: prevent flickering by removing auto color scheme and default background color

* fix: typecheck issue
2024-10-16 21:44:53 +02:00
Meier Lukas e99fd64882 feat: add notes for creation of apps and integrations in widget edit modal (#1297)
* feat: add notes for creation of apps and integrations in widget edit modal

* fix: unit test failing when with-description flag missing
2024-10-16 21:44:28 +02:00
Meier Lukas a0cc31da70 feat: populate integration name for new integrations automatically (#1296) 2024-10-16 21:44:12 +02:00
homarr-renovate[bot]andMeier Lukas a87c937b69 fix(deps): update dependency eslint-plugin-react-hooks to v5 (#1280)
* fix(deps): update dependency eslint-plugin-react-hooks to v5

* fix: lint issues after reenabling hook rules

* fix: format issues

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-10-16 21:43:51 +02:00
homarr-renovate[bot] ea43ed0ca4 chore(deps): update pnpm to v9.12.2 (#1311)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-16 15:30:28 +00:00
homarr-renovate[bot] c4ec4f3c66 fix(deps): update dependency tldts to ^6.1.52 (#1307)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-16 13:48:21 +00:00
homarr-renovate[bot] c053a373b4 fix(deps): update dependency drizzle-orm to ^0.35.1 (#1306)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-16 08:52:11 +00:00
homarr-renovate[bot] 9fa4bef2a4 fix(deps): update dependency react-error-boundary to ^4.1.0 (#1304)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-16 08:14:59 +00:00
homarr-renovate[bot] da13d63969 fix(deps): update dependency drizzle-kit to ^0.26.2 (#1305)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-16 07:48:32 +00:00
homarr-renovate[bot] f50f46d4b7 fix(deps): update dependency drizzle-kit to ^0.26.1 (#1303)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-15 20:29:39 +00:00
homarr-renovate[bot] c6daccbdf0 fix(deps): update dependency drizzle-orm to ^0.35.0 (#1302)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-15 19:48:50 +00:00
homarr-renovate[bot] f2f31b5ee0 fix(deps): update dependency drizzle-kit to ^0.26.0 (#1301)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-15 19:34:33 +00:00
Meier Lukas 476fda279d fix: integration actions hidden for full access users (#1300) 2024-10-15 21:11:32 +02:00
homarr-renovate[bot] bb0026a9fd fix(deps): update tanstack-query monorepo to ^5.59.15 (#1298)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-15 17:40:54 +00:00
homarr-renovate[bot] ba81e5e35a fix(deps): update dependency jotai to ^2.10.1 (#1295)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-15 15:11:33 +00:00
homarr-renovate[bot] df8f6d25d4 fix(deps): update tanstack-query monorepo to ^5.59.14 (#1282)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-15 07:38:17 +00:00
homarr-renovate[bot] c707b4b10f fix(deps): update dependency @million/lint to v1.0.11 (#1294)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-15 02:15:37 +00:00
homarr-renovate[bot] ed52b26f6d fix(deps): update dependency @million/lint to v1.0.10 (#1293)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-14 22:12:26 +00:00
homarr-renovate[bot] 65b1ae26d1 fix(deps): update dependency typescript-eslint to ^8.9.0 (#1292)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-14 17:40:37 +00:00
homarr-renovate[bot] 85cf101043 fix(deps): update dependency undici to v6.20.1 (#1291)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-14 12:58:46 +00:00
homarr-renovate[bot] bd31a4c3ad chore(deps): update vitest monorepo to ^2.1.3 (#1290)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-14 11:25:16 +00:00
Yossi Hillali 98b62a9f91 feat: radarr release type to calendar widget (#1256)
* feat: add release type

* fix: type check

* fix: deepSource

* fix: new approach

* fix: deepSource

* fix: typecheck

* fix: reviewed changes
2024-10-14 11:38:13 +03:00
homarr-renovate[bot] 1bc470a39f fix(deps): update dependency chroma-js to ^3.1.2 (#1289)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-13 10:41:00 +00:00
homarr-renovate[bot] 0fadc28a12 fix(deps): update dependency tldts to ^6.1.51 (#1288)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-12 09:28:18 +00:00
homarr-renovate[bot] 6f97741862 fix(deps): update dependency mantine-react-table to v2.0.0-beta.7 (#1287)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-12 05:11:06 +00:00
Meier Lukas 348687670d feat: user setting ping icons (#1277)
* feat: user setting ping icons

* fix: format issues

* test: adjust test to match expectations
2024-10-12 00:20:47 +02:00
Meier Lukas 0f8d9edb3e refactor: replace serverdata with suspense query (#1265)
* refactor: replace serverdata with suspense query

* fix: deepsource issues
2024-10-11 23:47:07 +02:00
Meier Lukas 511c9a4dbb fix: credentials auth not working (#1284) 2024-10-11 23:36:05 +02:00
Meier Lukas fe99421ec9 Merge branch 'dev' into fix-stacked-dynamic-sections-menu 2024-10-11 21:59:26 +02:00
homarr-renovate[bot] c051bf55b2 chore(deps): update dependency @types/react-dom to ^18.3.1 (#1281)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-11 19:22:46 +00:00
homarr-renovate[bot] 99ddd9214e fix(deps): update dependency sass to ^1.79.5 (#1279)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-11 02:13:06 +00:00
homarr-renovate[bot] 0ca140f4ff fix(deps): update tanstack-query monorepo to ^5.59.9 (#1278)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-10 19:23:01 +00:00
Meier Lukas 98cf214aed fix: groups can be created with empty names (#1267) 2024-10-09 17:23:19 +02:00
homarr-renovate[bot] efd06ea107 fix(deps): update tanstack-query monorepo to ^5.59.6 (#1276)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-09 14:49:27 +00:00
homarr-renovate[bot] c7b226142f fix(deps): update dependency undici to v6.20.0 (#1275)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-09 08:35:02 +00:00
homarr-renovate[bot] e3cd8a8b25 fix(deps): update tanstack-query monorepo to ^5.59.3 (#1274)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-09 06:40:45 +00:00
homarr-renovate[bot] 8bcba350d5 fix(deps): update dependency @auth/core to ^0.37.0 (#1272)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-09 02:13:10 +00:00
homarr-renovate[bot] a44ead09a3 fix(deps): update dependency @auth/drizzle-adapter to ^1.7.0 (#1273)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-09 00:48:35 +00:00
homarr-renovate[bot] 388717ec3c chore(deps): update dependency typescript to ^5.6.3 (#1271)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-08 22:31:09 +00:00
homarr-renovate[bot] 2bbe594cd2 fix(deps): update nextjs monorepo to ^14.2.15 (#1270)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-08 21:27:57 +00:00
homarr-renovate[bot] 6f2bc8e9be chore(deps): update dependency @types/node to ^20.16.11 (#1269)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-07 22:48:25 +00:00
homarr-renovate[bot] 14d1ce842a fix(deps): update dependency drizzle-orm to ^0.34.1 (#1268)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-07 20:31:36 +00:00
Meier Lukas ab1744ce20 feat: add first day of week user setting (#1249)
* feat: add first day of week user setting

* fix: add missing migrations

* fix: format and test issues

* fix: deepsource issue

* refactor: rename first-day-of-week procedure
2024-10-07 21:13:38 +02:00
Meier Lukas eb21628ee4 refactor: replace signIn callback with signIn event, adjust getUserByEmail in adapter to check provider (#1223)
* refactor: replace signIn callback with signIn event, adjust getUserByEmail in adapter to check provider

* test: adjusting tests for adapter and events

* docs: add comments for unknown auth provider

* fix: missing dayjs import
2024-10-07 21:13:15 +02:00
homarr-renovate[bot] 4d51e3b344 fix(deps): update dependency typescript-eslint to ^8.8.1 (#1266)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-07 17:39:10 +00:00
homarr-renovate[bot] 23ee229906 fix(deps): update dependency drizzle-orm to ^0.34.0 (#1262)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-07 15:30:13 +00:00
homarr-renovate[bot] 635fadfce9 fix(deps): update dependency drizzle-kit to ^0.25.0 (#1261)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-07 15:12:13 +00:00
homarr-renovate[bot] 2d5a7a26c1 chore(deps): update pnpm to v9.12.1 (#1260)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-07 13:48:27 +00:00
homarr-renovate[bot] ea84b1c372 fix(deps): update dependency video.js to ^8.18.1 (#1259)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-07 09:41:13 +00:00
homarr-renovate[bot] dea62547e0 fix(deps): update dependency @auth/drizzle-adapter to ^1.6.1 (#1258)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-07 02:16:47 +00:00
homarr-renovate[bot] 1d281c0cc9 fix(deps): update dependency @million/lint to v1.0.9 (#1255)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-06 02:19:40 +00:00
homarr-renovate[bot] 9c5ca6f906 fix(deps): update dependency @auth/drizzle-adapter to ^1.6.0 (#1251)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-05 17:48:50 +00:00
homarr-renovate[bot] d0d2a82a68 fix(deps): update dependency @auth/core to ^0.36.0 (#1250)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-05 17:38:25 +00:00
Meier Lukas 1421ccc917 fix: permissions not restricted for certain management pages / actions (#1219)
* fix: restrict parts of manage navigation to admins

* fix: restrict stats cards on manage home page

* fix: restrict access to amount of certain stats for manage home

* fix: restrict visibility of board create button

* fix: restrict access to integration pages

* fix: restrict access to tools pages for admins

* fix: restrict access to user and group pages

* test: adjust tests to match permission changes for routes

* fix: remove certain pages from spotlight without admin

* fix: app management not restricted
2024-10-05 17:03:32 +02:00
Meier Lukas 770768eb21 fix: rtl common translation unnecessary (#1246)
* fix: rtl common translation unnecessary

* fix: format issue
2024-10-05 16:31:15 +02:00
ManuelandMeier Lukas b14f82b4bb feat: add api keys (#991)
* feat: add api keys

* chore: address pull request feedback

---------

Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-10-05 16:18:31 +02:00
homarr-renovate[bot] ee8375756c chore(deps): update node.js to v20.18.0 (#1239)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-05 12:11:37 +02:00
homarr-renovate[bot] 20e6399d5e fix(deps): update dependency winston to v3.15.0 (#1245)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-05 05:30:18 +00:00
oussama Dahmazandoussama Dahmaz b5bfe90453 fix(notebook): default-content image path (#1244)
Co-authored-by: oussama Dahmaz <dahmaz@MacBook-Pro-de-odahmaz.local>
2024-10-04 23:29:32 +02:00
homarr-renovate[bot] 41538a7366 chore(deps): update dependency eslint to ^9.12.0 (#1241)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-04 20:48:44 +00:00
Meier Lukas 0aa760a786 wip: dynamic section menu 2024-10-04 22:47:29 +02:00
Meier Lukas 6ad201f4a2 chore: revert base image to 20.17.0 alpine (#1236) 2024-10-04 21:31:01 +02:00
homarr-renovate[bot] 87b46deaf7 chore(deps): update node.js to v20.18.0 (#1234)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-04 19:09:36 +00:00
Meier Lukas b5e0848436 Merge branch 'dev' into fix-stacked-dynamic-sections-menu 2024-10-04 16:19:13 +02:00
Meier Lukas 4c9471e608 feat(spotlight): add support for custom search-engines (#1200)
* feat(spotlight): add search settings link

* feat(search-engine): add to manage pages

* feat(spotlight): add children option for external search engines

* chore: revert search settings

* fix: deepsource issue

* fix: inconsistent breadcrum placement

* chore: address pull request feedback
2024-10-04 15:59:08 +02:00
homarr-renovate[bot] 8ea8b2ded5 fix(deps): update testcontainers-node monorepo to ^10.13.2 (#1233)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-04 08:34:41 +00:00
Meier Lukas ac0750452c fix: confirm not selected by default in confirm modal (#1232) 2024-10-03 23:24:33 +02:00
homarr-renovate[bot] 547287dba1 fix(deps): update dependency @million/lint to v1.0.8 (#1231)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-03 19:21:39 +00:00
Meier Lukas 665df53a39 fix: new sections without add and change listeners (#1230) 2024-10-03 21:07:57 +02:00
homarr-renovate[bot] 8dde6bb042 chore(deps): update dependency node to v20.18.0 (#1229)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-03 18:36:42 +00:00
Meier Lukas 52b45d835d feat(docker): add encryption key generation for integration secrets (#1202)
* feat(docker): add encryption key generation for integration secrets

* chore: address pull request feedback

* fix: build failing

* fix: docker build fails because of error when encryption key not defined
2024-10-03 19:59:44 +02:00
homarr-renovate[bot] 770a0d63f9 fix(deps): update dependency @million/lint to v1.0.7 (#1225)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-03 17:40:28 +00:00
homarr-renovate[bot] 17572bc602 fix(deps): update dependency tldts to ^6.1.50 (#1228)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-03 17:10:16 +00:00
homarr-renovate[bot] d3836648c2 fix(deps): update mantine monorepo to ^7.13.2 (#1227)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-03 13:22:13 +00:00
homarr-renovate[bot] 9d20362cf1 fix(deps): update dependency eslint-plugin-import to ^2.31.0 (#1226)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-03 11:48:30 +00:00
homarr-renovate[bot] 59ab63c6d8 chore(deps): update vitest monorepo to ^2.1.2 (#1222)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-02 16:52:00 +00:00
homarr-renovate[bot] 3277754290 chore(deps): update dependency @types/react to ^18.3.11 (#1221)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-02 15:48:11 +00:00
homarr-renovate[bot] bc4644609c chore(deps): update pnpm to v9.12.0 (#1220)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-02 13:22:50 +00:00
Meier Lukas 8b5ea3c5d3 fix: email verified check is in a newline in users table (#1218) 2024-10-02 12:00:42 +02:00
Meier Lukas d63f6d270f fix: it was possible to go to the create user page when credentials login disabled (#1217) 2024-10-02 10:41:14 +02:00
homarr-renovate[bot] 2f3619b68d fix(deps): update dependency tldts to ^6.1.49 (#1216)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-02 08:15:41 +00:00
homarr-renovate[bot] 6f5c993510 fix(deps): update nextjs monorepo to ^14.2.14 (#1215)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-01 17:48:46 +00:00
homarr-renovate[bot] c3d54b49a0 fix(deps): update tanstack-query monorepo to ^5.59.0 (#1214)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-01 16:15:12 +00:00
Meier Lukas 61333094df feat: add member sync between groups of ldap and homarr (#1149)
* feat: add member sync between groups of ldap and homarr

* chore: remove temporary console statement

* test: add unit tests for adding and removing ldap group members
2024-10-01 16:46:18 +02:00
homarr-renovate[bot] 4a8ed13a87 fix(deps): update dependency eslint-plugin-react to ^7.37.1 (#1213)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-01 14:32:30 +00:00
homarr-renovate[bot] f73dff5482 chore(deps): update turbo monorepo to ^2.1.3 (#1209)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-01 09:41:15 +00:00
homarr-renovate[bot] b3f6645783 fix(deps): update dependency @million/lint to v1.0.0 (#1212)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-10-01 09:31:22 +00:00
homarr-renovate[bot] 1b0d927e88 fix(deps): update dependency ldapts to v7.2.1 (#1211)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-30 22:48:25 +00:00
Meier Lukas f24c06852e fix: sensitive data can be leaked through query parameters (#1208) 2024-09-30 21:59:21 +02:00
homarr-renovate[bot] 233033f1ce fix(deps): update dependency typescript-eslint to ^8.8.0 (#1207)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-30 17:39:20 +00:00
homarr-renovate[bot] 7dd4d4ec7b fix(deps): update tiptap monorepo to v2.8.0 (#1206)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-30 15:31:35 +00:00
homarr-renovate[bot] 0c24cc1a69 chore(deps): update dependency @vitejs/plugin-react to ^4.3.2 (#1204)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-30 11:25:35 +00:00
Yossi Hillali 0f56dc1ecd feat: OMV integration & health monitoring widget (#1142) 2024-09-30 14:05:13 +03:00
homarr-renovate[bot] 6ce466d38e fix(deps): update mantine monorepo to ^7.13.1 (#1205)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-30 07:48:30 +00:00
Meier Lukas 42a49e6461 fix(spotlight): x button not clickable, help links open in current tab, bad screen usage on mobile (#1199)
* fix: spotlight help links should open in new tab

* fix: x button is not clickable in spotlight

* fix: reduce offset for spotlight, to improve screen usage on mobile
2024-09-28 23:30:09 +02:00
Manuel 08c6303fa6 feat: add healthchecks (#1187) 2024-09-28 23:02:28 +02:00
homarr-renovate[bot] 8aaa4f5856 fix(deps): update dependency @tabler/icons-react to ^3.19.0 (#1197)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-28 04:14:54 +00:00
homarr-renovate[bot] c3e1ce30fa fix(deps): update dependency next-auth to v5.0.0-beta.22 (#1195)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-28 03:48:21 +00:00
homarr-renovate[bot] 9af01bb680 fix(deps): update dependency sass to ^1.79.4 (#1198)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-28 03:35:01 +00:00
homarr-renovate[bot] adb59b292b fix(deps): update dependency @auth/drizzle-adapter to ^1.5.3 (#1194)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-27 20:13:22 +00:00
homarr-renovate[bot] 1994a5938d fix(deps): update dependency @auth/core to ^0.35.3 (#1193)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-27 19:23:18 +00:00
homarr-renovate[bot] f2c3d109cc chore(deps): update dependency @types/react to ^18.3.10 (#1192)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-27 16:50:57 +00:00
homarr-renovate[bot] 3ead13e479 chore(deps): update dependency @types/node to ^20.16.10 (#1191)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-27 16:35:23 +00:00
homarr-renovate[bot] 2245e7aae8 fix(deps): update dependency eslint-plugin-react to ^7.37.0 (#1189)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-27 15:29:22 +00:00
homarr-renovate[bot] f6c7271fb4 fix(deps): update dependency tldts to ^6.1.48 (#1190)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-27 15:11:35 +00:00
homarr-renovate[bot] 1bce7a300d fix(deps): update dependency @tabler/icons-react to ^3.18.0 (#1188)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-26 21:48:08 +00:00
Meier Lukas 8f7ed056c4 fix: issue with color scheme in layout (#1168)
* fix: issue with color scheme in layout

* test: add and adjust unit tests for sign-in-callback
2024-09-26 19:02:45 +02:00
Meier Lukas a30be7bc1e feat: add env variable to disable db migrations on startup (#1179) 2024-09-26 18:54:28 +02:00
homarr-renovate[bot] 2dd21d6688 chore(deps): update dependency @types/node to ^20.16.9 (#1185)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-26 16:52:03 +00:00
homarr-renovate[bot] 4795c8c557 fix(deps): update tiptap monorepo to v2.7.4 (#1186)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-26 13:25:38 +00:00
Meier Lukas 0386449ec1 wip: fix stacked dynamic sections menu 2024-09-25 21:39:56 +02:00
homarr-renovate[bot] 17d6229a0f fix(deps): update dependency @auth/drizzle-adapter to ^1.5.2 (#1181)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-25 18:36:56 +00:00
Michon van Dooren 65f26117fc fix: container image always being on AMD64 arch (#1173) 2024-09-25 19:56:16 +02:00
homarr-renovate[bot] 80e896f658 chore(deps): update dependency @types/node to ^20.16.8 (#1183)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-25 17:48:17 +00:00
Michon van Dooren d029f48f79 fix: various issues with docker image workflow (#1172) 2024-09-25 19:34:52 +02:00
homarr-renovate[bot] b2143eddeb fix(deps): update tiptap monorepo to v2.7.3 (#1182)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-25 16:41:42 +00:00
homarr-renovate[bot] f495383bcf fix(deps): update dependency @auth/core to ^0.35.2 (#1180)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-25 13:25:00 +00:00
homarr-renovate[bot] 78230b1fe9 fix(deps): update mantine monorepo to ^7.13.0 (#1178)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-25 09:48:24 +00:00
homarr-renovate[bot] 4e431b4f89 fix(deps): update dependency @auth/drizzle-adapter to ^1.5.1 (#1177)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-25 09:40:02 +00:00
homarr-renovate[bot] 16e7f938bd fix(deps): update dependency @auth/core to ^0.35.1 (#1176)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-25 09:30:02 +00:00
homarr-renovate[bot] e2414f5e9f fix(deps): update dependency @tanstack/react-query-devtools to ^5.58.0 (#1175)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-25 08:17:01 +00:00
homarr-renovate[bot] ea0c35fa6e chore(deps): update dependency @types/node to ^20.16.7 (#1174)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-25 02:15:25 +00:00
SeDemalandMeier Lukas 36915d95fe feat: DnsHole feature parity with oldmarr (#1145)
* feat: DnsHole feature parity with oldmarr
feat: advanced control management
feat: disconnected state
fix: summary widget sizing
feat: summary text flash on update

* feat: dnshole summary integrations disconnected error page

* fix: classnaming

* refactor: small rename, console to logger and unnecessary as conversion changes

---------

Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-09-24 23:25:13 +02:00
homarr-renovate[bot] 07f72f7367 chore(deps): update dependency @types/react to ^18.3.9 (#1170)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-24 14:31:29 +00:00
homarr-renovate[bot] 141c65149a chore(deps): update dependency eslint to ^9.11.1 (#1167)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-23 21:34:24 +00:00
homarr-renovate[bot] f3858f0902 chore(deps): update dependency @types/node to ^20.16.6 (#1169)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-23 21:26:23 +00:00
Meier Lukas cc29cb8e43 refactor: replace custom no integration selected logic with existing error (#1166) 2024-09-23 22:44:56 +02:00
homarr-renovate[bot] 6aa5adf5b0 fix(deps): update dependency typescript-eslint to ^8.7.0 (#1165)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-23 17:39:06 +00:00
homarr-renovate[bot] df7ba1edaf chore(deps): update pascalgn/automerge-action action to v0.16.4 (#1164)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-22 20:11:59 +00:00
homarr-renovate[bot] da2c8fa00b chore(deps): update dependency jsdom to ^25.0.1 (#1163)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-22 05:30:19 +00:00
Meier Lukas bbd0ff775a ci: fix issue with pnpm installation (#1160) 2024-09-21 11:36:21 +02:00
Meier Lukas 9eea8d48e8 fix: insert limit of sqlite is smaller than amount of icons (#1161) 2024-09-21 11:08:24 +02:00
homarr-renovate[bot] 612a15810b fix(deps): update dependency sass to ^1.79.3 (#1159)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-20 21:25:49 +00:00
homarr-renovate[bot] 6692c83fbf chore(deps): update dependency eslint to ^9.11.0 (#1157)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-20 20:39:16 +00:00
Manuel 82bfbc6f23 config: ignore build artifacts from docker 2024-09-20 22:26:58 +02:00
Meier Lukas ce1ef3cbe7 feat: add improved search (#1051)
* feat: add improved search

* wip: add support for sorting, rename use-options to use-query-options, add use-options for local usage, add pages search group

* feat: add help links from manage layout to help search mode

* feat: add additional search engines

* feat: add group search details

* refactor: improve users search group type

* feat: add apps search group, add disabled search interaction

* feat: add integrations and boards for search

* wip: hook issue with react

* fix: hook issue regarding actions and interactions

* chore: address pull request feedback

* fix: format issues

* feat: add additional global actions to search

* chore: remove unused code

* fix: search engine short key

* fix: typecheck issues

* fix: deepsource issues

* fix: eslint issue

* fix: lint issues

* fix: unordered dependencies

* chore: address pull request feedback
2024-09-20 16:51:42 +02:00
homarr-renovate[bot] 0c44af2f67 chore(deps): update pnpm to v9.11.0 (#1156)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-20 11:10:56 +00:00
homarr-renovate[bot] dd9080f781 fix(deps): update dependency jotai to ^2.10.0 (#1155)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-20 03:14:53 +00:00
homarr-renovate[bot] a02825113a fix(deps): update dependency sass to ^1.79.2 (#1153)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-20 02:53:49 +00:00
homarr-renovate[bot] 2258dc3ec6 fix(deps): update nextjs monorepo to ^14.2.13 (#1154)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-20 02:11:53 +00:00
homarr-renovate[bot] aa2d440acb fix(deps): update dependency tldts to ^6.1.47 (#1152)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-19 19:48:33 +00:00
homarr-renovate[bot] 2bbde5ebd1 chore(deps): update dependency @types/react to ^18.3.8 (#1151)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-19 19:09:41 +00:00
homarr-renovate[bot] d0e9e0f09d fix(deps): update tiptap monorepo to v2.7.2 (#1150)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-19 09:29:44 +00:00
SeDemal 6d4d6efe3f fix: indexer manager UI behaviour + class naming (#1134) 2024-09-18 12:11:23 +02:00
homarr-renovate[bot] 8f5d7f8387 fix(deps): update nextjs monorepo to ^14.2.12 (#1146)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-18 07:48:58 +00:00
homarr-renovate[bot] 3cb1221038 fix(deps): update dependency sass to ^1.79.1 (#1148)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-18 07:36:26 +00:00
homarr-renovate[bot] f1d5dd03cb fix(deps): update dependency sass to ^1.79.0 (#1147)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-17 23:38:29 +00:00
Meier Lukas fc317840a7 refactor: use suspense query instead of serverdata for app widget (#1143)
* refactor: use suspense query instead of serverdata for app widget

* chore: add missing translation for loading tooltip
2024-09-17 19:30:14 +02:00
Meier Lukas 003cc5160c fix: mysql migration not working (#1138)
* fix: mysql migration not working

* test: add system integration test for mysql migration

* fix: format issues

* fix: deepsource issues

* chore: address bad name for mysql migration test
2024-09-17 19:27:47 +02:00
homarr-renovate[bot] 6f50f37462 chore(deps): update dependency @types/react to ^18.3.7 (#1140)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-17 15:29:18 +00:00
homarr-renovate[bot] 657c2eef80 fix(deps): update tiptap monorepo to v2.7.1 (#1139)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-17 14:39:02 +00:00
Meier Lukas d01ddd61b6 fix: db port validation for env variable wrong (#1137)
* fix: db port validation for env variable wrong

* fix: wrong default
2024-09-16 21:41:40 +02:00
Meier Lukas 6738296830 refactor: move modals to seperate package (#1135)
* refactor: move modals to seperate package

* fix: format issue

* fix: lint issues

* fix: format issue

* fix: only used as type
2024-09-16 19:53:37 +02:00
homarr-renovate[bot] 3ef478c53a fix(deps): update dependency typescript-eslint to ^8.6.0 (#1136)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-16 17:42:28 +00:00
homarr-renovate[bot] 5a73700f57 fix(deps): update dependency next-auth to v5.0.0-beta.21 (#1131)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-16 17:33:37 +00:00
homarr-renovate[bot] 6c39612c07 fix(deps): update dependency mysql2 to v3.11.3 (#1132)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-16 17:11:02 +00:00
homarr-renovate[bot] 5986160265 fix(deps): update dependency @ctrl/transmission to v7 (#1103)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-16 18:45:53 +02:00
homarr-renovate[bot]andMeier Lukas f9cc34c12f fix(deps): update dependency @auth/core to ^0.35.0 (#1129)
* fix(deps): update dependency @auth/core to ^0.35.0

* fix(deps): update dependency @auth/core to ^0.35.0

* fix: type issue

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-09-16 18:42:45 +02:00
SeDemal b9206d3628 refactor: Remove typed-rpc dependency and used fetch instead (#1108)
* feat: Remove typed-rpc dependency and used fetch instead

* fix: tests

* fix: typing
2024-09-16 18:21:27 +02:00
Meier Lukas cd4619845b feat: add nginx proxy (#1073)
* feat: add nginx proxy

* fix: adjust path for websocket client to connect
2024-09-16 18:10:58 +02:00
SeDemal 9fb6e67ed3 feat: Add Simple-Icons and Selfh.st collections (#1118)
* feat: Add Simple-Icons and Selfh.st collections
refactor: icon file path parsing

* refactor: allowed extensions check
2024-09-16 16:34:45 +02:00
homarr-renovate[bot] 929054d5bd fix(deps): update dependency @auth/drizzle-adapter to ^1.5.0 (#1130)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-16 09:48:33 +00:00
homarr-renovate[bot] 414fb32c32 chore(deps): update dependency @types/react to ^18.3.6 (#1133)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-16 09:33:11 +00:00
homarr-renovate[bot] aca5c279b5 fix(deps): update dependency tldts to ^6.1.46 (#1128)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-15 18:34:25 +00:00
homarr-renovate[bot] 6685f4c806 fix(deps): update dependency @tabler/icons-react to ^3.17.0 (#1126)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-15 13:15:44 +00:00
homarr-renovate[bot] 7059a3d88f fix(deps): update dependency tldts to ^6.1.45 (#1121)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-14 09:26:15 +00:00
Manuel 16a5b43695 fix: node cache cleanup error (#1124) 2024-09-14 11:08:09 +02:00
Manuel c8dfbc8e2d fix: workflow inputs and docker push (#1123) 2024-09-14 10:01:22 +02:00
homarr-renovate[bot] 93a3083c60 chore(deps): update vitest monorepo to ^2.1.1 (#1120)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-13 15:48:25 +00:00
homarr-renovate[bot] 7a56006533 fix(deps): update nextjs monorepo to ^14.2.11 (#1117)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-12 22:48:47 +00:00
homarr-renovate[bot] 50bd4344bc chore(deps): update turbo monorepo to ^2.1.2 (#1119)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-12 22:40:44 +00:00
homarr-renovate[bot] 2351617177 fix(deps): update dependency eslint-plugin-react to ^7.36.1 (#1115)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-12 19:09:00 +00:00
homarr-renovate[bot] fb55f1272d fix(deps): update nextjs monorepo to ^14.2.10 (#1109)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-12 18:50:17 +00:00
homarr-renovate[bot] cae9a800c4 fix(deps): update tanstack-query monorepo to ^5.56.2 (#1116)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-12 18:36:43 +00:00
homarr-renovate[bot] 2d4681d079 fix(deps): update tanstack-query monorepo to ^5.56.1 (#1114)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-12 15:12:06 +00:00
homarr-renovate[bot] 564fcea8d7 chore(deps): update vitest monorepo to ^2.1.0 (#1113)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-12 14:32:45 +00:00
homarr-renovate[bot] 703ecece63 fix(deps): update tanstack-query monorepo to ^5.56.0 (#1112)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-12 10:33:38 +00:00
homarr-renovate[bot] 41b41a3c53 chore(deps): update dependency concurrently to ^9.0.1 (#1110)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-12 07:48:18 +00:00
homarr-renovate[bot] cd43253061 fix(deps): update dependency eslint-plugin-react to ^7.36.0 (#1111)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-12 07:34:57 +00:00
Meier Lukas 5e772215a9 fix: hard to move iframe widget #1075 (#1101) 2024-09-11 18:15:47 +02:00
Manuel 2535192b2c feat: downloads widget (#844)
Usenet and Torrent downloads in 1 widget.
sabNZBd, NzbGet, Deluge, qBitTorrent, and transmission support.
Columns can be reordered in Edit mode.
Sorting enabled.
Time uses Dayjs with auto translation.
Can pause/resume single items, clients, or all.
Can delete items (With option to delete assossiated files).
Clients list and details.
Include all filtering and processing for ratio from oldmarr torrent widget.
Invalidation of old data (older than 30 seconds) to show an integration is not responding anymore.

Misc (So many miscs):
Fixed validation error with multiText.
Fixed translation application for multiSelect to behave the same as select.
Added background to gitignore (I needed to add a background to visually test opacity, probably will in the future too)
Added setOptions to frontend components so potential updates made from the Dashboard can be saved.
Extracted background and border color to use in widgets.
humanFileSize function based on the si format (powers of 1024, not 1000).
Improved integrationCreatorByKind by @Meierschlumpf.
Changed integrationCreatorByKind to integrationCreator so it functions directly from the integration.
Added integrationCreatorFromSecrets to directly work with secrets from db.
Added getIntegrationKindsByCategory to get a list of integrations sharing categories.
Added IntegrationKindByCategory type to get the types possible for a category (Great to cast on integration.kind that isn't already properly limited/typed but for which we know the limitation)
Added a common AtLeastOneOf type. Applied to TKind and IntegrationSecretKind[] where it was already being used and Added to the getIntegrationKindsByCategory's output to be more freely used.
Added the Modify type, instead of omiting to then add again just to change a parameters type, use the modify instead. Applied code wide already.
Hook to get list of integration depending on permission level of user. (By @Meierschlumpf)
2024-09-11 17:30:21 +02:00
homarr-renovate[bot] 3d4e607a9d chore(deps): update dependency testcontainers to ^10.13.1 (#1100)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-11 13:18:19 +00:00
homarr-renovate[bot] 8c9bb6e5d5 fix(deps): update dependency video.js to ^8.17.4 (#1099)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-11 09:48:23 +00:00
homarr-renovate[bot] d2a30db3c1 fix(deps): update dependency mysql2 to v3.11.2 (#1098)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-11 03:48:18 +00:00
homarr-renovate[bot] 9d5007c05c fix(deps): update dependency ldapts to v7.2.0 (#1097)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-10 18:35:15 +00:00
homarr-renovate[bot] 18c1da4a62 fix(deps): update dependency @tabler/icons-react to ^3.16.0 (#1096)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-10 16:49:06 +00:00
homarr-renovate[bot] 18347fef3b fix(deps): update dependency tldts to ^6.1.44 (#1095)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-10 12:21:48 +00:00
homarr-renovate[bot] ed0c6136e6 fix(deps): update dependency better-sqlite3 to ^11.3.0 (#1092)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-10 10:48:12 +00:00
homarr-renovate[bot] 40af17083a fix(deps): update dependency mysql2 to v3.11.1 (#1094)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-10 10:32:39 +00:00
homarr-renovate[bot] 3f076fafcd fix(deps): update nextjs monorepo to ^14.2.9 (#1091)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-09 19:21:59 +00:00
homarr-renovate[bot] ea4de527b2 chore(deps): update dependency concurrently to v9 (#1083)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-09 19:52:05 +02:00
homarr-renovate[bot] c844eb2a22 fix(deps): update dependency typescript-eslint to ^8.5.0 (#1089)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-09 17:39:14 +00:00
homarr-renovate[bot] 8069d7acf0 chore(deps): update dependency typescript to ^5.6.2 (#1088)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-09 16:49:18 +00:00
homarr-renovate[bot] 1272976c1a chore(deps): update pnpm to v9.10.0 (#1087)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-09 14:49:10 +00:00
homarr-renovate[bot] 36a7a18c35 fix(deps): update tanstack-query monorepo to ^5.55.4 (#1086)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-09 06:51:43 +00:00
homarr-renovate[bot] 7b6301e498 fix(deps): update dependency @tabler/icons-react to ^3.15.0 (#1085)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-08 21:10:08 +00:00
homarr-renovate[bot] 930bc2d7d2 fix(deps): update tanstack-query monorepo to ^5.55.2 (#1084)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-08 16:33:13 +00:00
homarr-renovate[bot] 6bf0a53d21 fix(deps): update dependency chroma-js to ^3.1.1 (#1082)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-08 08:30:23 +00:00
homarr-renovate[bot] 4f421433c2 fix(deps): update dependency chroma-js to ^3.1.0 (#1081)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-08 07:48:26 +00:00
Yossi HillaliandMeier Lukas 08d4472d8b feat: indexer manager widget (#1057)
* fix(deps): update tanstack-query monorepo to ^5.53.2 (#1055)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>

<br/>
<div align="center">
  <img src="https://homarr.dev/img/logo.png" height="80" alt="" />
  <h3>Homarr</h3>
</div>

**Thank you for your contribution. Please ensure that your pull request meets the following pull request:**

- [ ] Builds without warnings or errors (``pnpm buid``, autofix with ``pnpm format:fix``)
- [ ] Pull request targets ``dev`` branch
- [ ] Commits follow the [conventional commits guideline](https://www.conventionalcommits.org/en/v1.0.0/)
- [ ] No shorthand variable names are used (eg. ``x``, ``y``, ``i`` or any abbrevation)

* fix: requested changes

* fix: requested changes

* feat: add cron job

* fix: review changes

* fix: add missing oldmarr import mappings

---------

Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-09-07 23:18:16 +02:00
Yossi Hillali e88854c0e5 feat: radarr integration (#1053)
* feat: sonarr integration

* fix: reviewed changes
2024-09-07 20:58:40 +02:00
Meier Lukas 5404cebf5b feat: add import for config files from oldmarr (#1019)
* wip: add oldmarr config import

* wip: add support for wrong amount of categories / sections with autofix, color mapping, position adjustments of wrappers

* fix: lockfile broken

* feat: add support for form data trpc requests

* wip: improve file upload

* refactor: restructure import, add import configuration

* wip: add configurations for import to modal

* refactor: move oldmarr import to old-import package

* fix: column count not respects screen size for board

* feat: add beta badge for oldmarr config import

* chore: address pull request feedback

* fix: format issues

* fix: inconsistent versions

* fix: deepsource issues

* fix: revert {} to Record<string, never> convertion to prevent typecheck issue

* fix: inconsistent zod version

* fix: format issue

* chore: address pull request feedback

* fix: wrong import

* fix: broken lock file

* fix: inconsistent versions

* fix: format issues
2024-09-07 18:13:24 +02:00
homarr-renovate[bot] fc1bff2110 fix(deps): update dependency tldts to ^6.1.43 (#1080)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-07 10:48:21 +00:00
ManuelandMeier Lukas 19cd41a8e5 feat: add crawling settings (#959)
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-09-06 22:51:18 +02:00
homarr-renovate[bot] d20384dfe0 chore(deps): update dependency eslint to ^9.10.0 (#1078)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-06 20:35:26 +00:00
Meier Lukas 8c205535eb fix: wevbsocket url is always localhost (#1072) 2024-09-06 21:11:58 +02:00
Yossi Hillali 753d091dbb fix: display on safari (#1071) 2024-09-06 16:29:53 +02:00
homarr-renovate[bot] 00d5020824 fix(deps): update tanstack-query monorepo to ^5.55.0 (#1070)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-06 06:36:38 +00:00
homarr-renovate[bot] 247de555ce fix(deps): update dependency tldts to ^6.1.42 (#1069)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-05 16:34:36 +00:00
homarr-renovate[bot] ca83872151 fix(deps): update nextjs monorepo to ^14.2.8 (#1067)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-04 22:29:57 +00:00
homarr-renovate[bot] 049e1107e6 chore(deps): update dependency @types/node to ^20.16.5 (#1068)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-04 22:11:35 +00:00
homarr-renovate[bot] 364d6f4555 chore(deps): update dependency @types/node to ^20.16.4 (#1065)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-04 10:12:07 +00:00
homarr-renovate[bot] bef5832470 fix(deps): update dependency eslint-plugin-jsx-a11y to ^6.10.0 (#1066)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-04 09:48:34 +00:00
homarr-renovate[bot] 3d1b626baa fix(deps): update dependency sass to ^1.78.0 (#1064)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-03 23:27:20 +00:00
homarr-renovate[bot] 9e1faa03b1 fix(deps): update tanstack-query monorepo to ^5.54.1 (#1063)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-03 21:26:08 +00:00
homarr-renovate[bot] 1249fb9612 fix(deps): update dependency eslint-plugin-react to ^7.35.2 (#1062)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-03 19:35:26 +00:00
homarr-renovate[bot] 0f34bf85a8 fix(deps): update dependency eslint-plugin-import to ^2.30.0 (#1061)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-03 07:24:19 +00:00
homarr-renovate[bot] 6ea4a74675 fix(deps): update dependency @tanstack/react-query-devtools to ^5.54.0 (#1060)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-02 23:48:14 +00:00
homarr-renovate[bot] 4c52cc338e fix(deps): update dependency eslint-plugin-react to ^7.35.1 (#1059)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-02 23:35:46 +00:00
homarr-renovate[bot] 1d236678b3 fix(deps): update dependency typescript-eslint to ^8.4.0 (#1058)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-02 17:34:48 +00:00
homarr-renovate[bot] 8fe162e16c fix(deps): update tanstack-query monorepo to ^5.53.3 (#1056)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-02 15:36:14 +00:00
Manuel 0c657276a5 feat: support arm64 (#1022)
* feat: support arm64

* feat: support arm64
2024-09-02 17:26:04 +02:00
homarr-renovate[bot] d69fed6514 fix(deps): update tanstack-query monorepo to ^5.53.2 (#1055)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-01 21:10:14 +00:00
Meier Lukas b080e0de71 feat: add colorscheme to user in db (#987) 2024-09-01 20:37:52 +02:00
homarr-renovate[bot] 824ec8a9ca chore(deps): update dependency @types/node to ^20.16.3 (#1054)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-09-01 14:08:42 +00:00
Yossi HillaliandManuel 6ff36405ba feat: Prowlarr integration (#965)
Co-authored-by: Manuel <30572287+manuel-rw@users.noreply.github.com>
2024-09-01 15:40:22 +02:00
homarr-renovate[bot] acb4cb9c82 chore(deps): update dependency testcontainers to ^10.13.0 (#1052)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-31 21:09:47 +00:00
homarr-renovate[bot] fcf23c3872 chore(deps): update turbo monorepo to ^2.1.1 (#1050)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-30 21:26:06 +00:00
homarr-renovate[bot] 51be02477b fix(deps): update mantine monorepo to ^7.12.2 (#1048)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-30 14:10:14 +00:00
homarr-renovate[bot] 6d437bd2be chore(deps): update dependency jsdom to v25 (#1030)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-30 14:00:10 +02:00
homarr-renovate[bot] 775c3597dc fix(deps): update tanstack-query monorepo to ^5.53.1 (#1045)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-30 10:41:53 +00:00
homarr-renovate[bot] 0f14e378d7 chore(deps): update dependency @types/react to ^18.3.5 (#1044)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-30 10:31:13 +00:00
homarr-renovate[bot] afb6adf1e6 fix(deps): update tanstack-query monorepo to ^5.52.3 (#1043)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-29 23:25:54 +00:00
Meier Lukas 2738f40c5e fix: when removing one item and then adding another one that newly added one can not be moved (#1025)
* fix: when removing one item and then adding another one that newly added one can not be moved

* chore: address pull request feedback

* fix: deepsource canceled
2024-08-29 22:26:02 +02:00
Thomas CamlongandMeier Lukas 94984ac11b feat: add million-lint (#607)
* feat: Add `million-lint`

* fix: some parts not working because of missing skipTransform flag

* chore: address pull request feedback

* chore: make with-million-lint method that can be used when debugging performance

* fix: format issue

* fix: format issue

---------

Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-08-29 22:25:51 +02:00
homarr-renovate[bot] c7a7cef1a2 chore(deps): update dependency @types/node to ^20.16.2 (#1042)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-28 10:11:00 +00:00
Yossi Hillali 69e69ee315 fix: DnsHole controls timer (#953)
* fix: DnsHole controls timer

* fix: use plural naming

* fix: reviewed changes

* fix: change ControlsCard to jsx component

* fix: DeepSource
2024-08-28 11:26:36 +03:00
homarr-renovate[bot] 3771a61c49 fix(deps): update nextjs monorepo to ^14.2.7 (#1041)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-27 16:13:16 +00:00
homarr-renovate[bot] f7f676ace9 chore(deps): update turbo monorepo to ^2.1.0 (#1040)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-27 14:29:27 +00:00
homarr-renovate[bot] 961fca0f64 fix(deps): update dependency @tabler/icons-react to ^3.14.0 (#1039)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-27 10:11:09 +00:00
homarr-renovate[bot] b507bf2ae6 fix(deps): update dependency ldapts to v7.1.1 (#1038)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-26 23:25:34 +00:00
homarr-renovate[bot] 48d01e3c6c fix(deps): update tanstack-query monorepo to ^5.52.2 (#1037)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-26 18:08:40 +00:00
homarr-renovate[bot] b0e269209e fix(deps): update dependency typescript-eslint to ^8.3.0 (#1036)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-26 18:02:58 +00:00
homarr-renovate[bot] 09c88a1c36 chore(deps): update pnpm to v9.9.0 (#1035)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-26 17:10:32 +00:00
homarr-renovate[bot] 2ea0d04c71 fix(deps): update dependency @tabler/icons-react to ^3.13.0 (#1034)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-26 13:36:27 +00:00
homarr-renovate[bot] 78b45c4a5b fix(deps): update dependency drizzle-kit to ^0.24.2 (#1033)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-26 13:17:31 +00:00
homarr-renovate[bot] e60e4a49f8 fix(deps): update dependency trpc-swagger to ^1.2.6 (#1032)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-25 16:40:57 +00:00
homarr-renovate[bot] 6351bf78ff fix(deps): update dependency swagger-ui-react to ^5.17.14 (#1031)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-25 16:30:40 +00:00
Manuel f0cd45c813 feat: implement openapi (#482) 2024-08-25 18:03:32 +02:00
homarr-renovate[bot] a3520e4dfd chore(deps): update dependency jsdom to ^24.1.3 (#1028)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-25 11:33:29 +00:00
homarr-renovate[bot] e193c1c6f5 fix(deps): update dependency @t3-oss/env-nextjs to ^0.11.1 (#1029)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-25 11:23:17 +00:00
homarr-renovate[bot] 89fe289fc5 chore(deps): update dependency jsdom to ^24.1.2 (#1027)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-25 10:29:18 +00:00
Yossi Hillali e34af8659b fix: testConnectionAsync url (#1024) 2024-08-25 12:56:08 +03:00
Meier Lukas 022fad92a9 fix: empty wrappers without items should not be visible in view mode (#1026) 2024-08-25 11:38:05 +02:00
homarr-renovate[bot] ec2de901aa chore(deps): update dependency testcontainers to ^10.12.0 (#1023)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-24 17:27:41 +00:00
Meier Lukas b81f5a2ee3 fix: improve ping performance (#1020) 2024-08-24 16:56:40 +02:00
acbb834889 feat: add media requests widget (#774)
Co-authored-by: SeDemal <Tagaishi@hotmail.ch>
Co-authored-by: SeDemal <demal.sebastien@bluewin.ch>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-08-24 15:23:16 +02:00
homarr-renovate[bot] 7ec4adcb24 chore(deps): update dependency eslint to ^9.9.1 (#1021)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-23 20:48:24 +00:00
homarr-renovate[bot] cbf2ecfb9d fix(deps): update tiptap monorepo to v2.6.6 (#1015)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-23 10:48:40 +00:00
homarr-renovate[bot] 8779b7d607 fix(deps): update tanstack-query monorepo to ^5.52.1 (#1013)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-22 17:09:49 +00:00
homarr-renovate[bot] cd0af7e8f1 fix(deps): update dependency drizzle-kit to ^0.24.1 (#1012)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-22 14:10:03 +00:00
homarr-renovate[bot] 1311e72ca0 fix(deps): update nextjs monorepo to ^14.2.6 (#1009)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-22 11:35:43 +00:00
homarr-renovate[bot] 7742d5f5b4 fix(deps): update dependency tldts to ^6.1.41 (#1011)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-22 11:22:41 +00:00
homarr-renovate[bot] df08258ba1 chore(deps): update pnpm to v9.8.0 (#1010)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-22 11:10:40 +00:00
homarr-renovate[bot] 30ee123072 chore(deps): update node.js to v20.17.0 (#1008)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-21 22:09:56 +00:00
homarr-renovate[bot] 051d57bb39 fix(deps): update dependency better-sqlite3 to ^11.2.1 (#1006)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-21 17:48:19 +00:00
homarr-renovate[bot] f10c8fcb48 chore(deps): update dependency node to v20.17.0 (#1007)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-21 17:34:23 +00:00
homarr-renovate[bot] d401c8fa0f fix(deps): update tiptap monorepo to v2.6.5 (#1005)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-21 07:34:49 +00:00
homarr-renovate[bot] 4e6437a180 fix(deps): update dependency better-sqlite3 to ^11.2.0 (#1004)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-21 06:48:16 +00:00
homarr-renovate[bot] 34374e9a18 chore(deps): update dependency @types/react to ^18.3.4 (#1003)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-20 20:48:42 +00:00
homarr-renovate[bot] 432af79055 fix(deps): update tanstack-query monorepo to ^5.52.0 (#1002)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-20 19:33:58 +00:00
homarr-renovate[bot] 27d08baa2d fix(deps): update dependency dayjs to ^1.11.13 (#1001)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-20 19:21:08 +00:00
homarr-renovate[bot] 72aed22125 fix(deps): update dependency @umami/node to ^0.4.0 (#1000)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-19 23:11:49 +00:00
Meier Lukas 2d155fa0c4 feat: add password requirements (#988)
* feat: add password requirements

* fix: format issue

* fix: unexpected empty string in component jsx

* test: adjust unit test passwords
2024-08-19 21:11:36 +02:00
homarr-renovate[bot] 058518710e fix(deps): update dependency typescript-eslint to ^8.2.0 (#999)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-19 17:48:15 +00:00
homarr-renovate[bot] 9666440e80 fix(deps): update dependency undici to v6.19.8 (#998)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-19 17:36:28 +00:00
homarr-renovate[bot] f5c380f75b fix(deps): update dependency tldts to ^6.1.40 (#996)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-19 13:48:29 +00:00
homarr-renovate[bot] 33441d11ac chore(deps): update dependency @types/node to ^20.16.1 (#995)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-19 13:37:43 +00:00
homarr-renovate[bot] 2f77be8045 fix(deps): update tanstack-query monorepo to ^5.51.24 (#997)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-19 13:30:11 +00:00
homarr-renovate[bot] 0883173d7b chore(deps): update dependency @types/node to ^20.16.0 (#993)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-18 10:29:28 +00:00
Meier Lukas 7521ef0519 feat: add hotkeys (#986) 2024-08-18 12:07:00 +02:00
homarr-renovate[bot] 3eb90968ac fix(deps): update dependency chroma-js to v3 (#992)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-18 11:45:32 +02:00
Meier Lukas c5894136f6 refactor: remove item import for now (#985) 2024-08-16 22:49:56 +02:00
homarr-renovate[bot] 17b29620fd chore(deps): update dependency @types/node to ^20.15.0 (#989)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-16 18:33:10 +00:00
homarr-renovate[bot] 5e7ee1b657 fix(deps): update dependency eslint-config-turbo to ^2.0.14 (#984)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-15 15:10:13 +00:00
homarr-renovate[bot] 5bf4a2d95b chore(deps): update dependency @turbo/gen to ^2.0.14 (#982)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-15 14:48:39 +00:00
homarr-renovate[bot] 1657ebc288 chore(deps): update dependency turbo to ^2.0.14 (#983)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-15 14:36:38 +00:00
homarr-renovate[bot] 0ba647ad51 fix(deps): update tiptap monorepo to v2.6.4 (#981)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-15 09:26:57 +00:00
homarr-renovate[bot] cc61e27fad fix(deps): update tiptap monorepo to v2.6.3 (#980)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-14 19:23:31 +00:00
homarr-renovate[bot] b9bcc1d23a fix(deps): update dependency winston to v3.14.2 (#979)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-14 17:33:59 +00:00
homarr-renovate[bot] 497363b491 fix(deps): update dependency eslint-config-turbo to ^2.0.13 (#978)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-14 16:14:14 +00:00
homarr-renovate[bot] f2629d9ac7 chore(deps): update pnpm to v9.7.1 (#977)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-14 15:48:30 +00:00
homarr-renovate[bot] ced289095c chore(deps): update dependency turbo to ^2.0.13 (#976)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-14 15:34:44 +00:00
homarr-renovate[bot] 38b011a767 chore(deps): update dependency @turbo/gen to ^2.0.13 (#975)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-14 15:27:00 +00:00
homarr-renovate[bot] ba3f1739f4 fix(deps): update dependency @drizzle-team/brocli to ^0.10.1 (#974)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-13 19:34:02 +00:00
homarr-renovate[bot] 81a13b0e59 fix(deps): update tiptap monorepo to v2.6.2 (#972)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-13 16:49:03 +00:00
homarr-renovate[bot] 4a34ec91e5 fix(deps): update tiptap monorepo to v2.6.1 (#970)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-13 14:38:08 +00:00
homarr-renovate[bot] 04725942ee fix(deps): update dependency video.js to ^8.17.3 (#971)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-13 09:28:28 +00:00
homarr-renovate[bot] 9d62fb42c4 fix(deps): update dependency jotai to ^2.9.3 (#969)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-13 03:11:47 +00:00
homarr-renovate[bot] b9f048c57d fix(deps): update dependency typescript-eslint to ^8.1.0 (#968)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-12 17:35:41 +00:00
homarr-renovate[bot] 5b651a782a fix(deps): update mantine monorepo to ^7.12.1 (#967)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-12 13:16:26 +00:00
Meier Lukas f8c9ae67f8 wip: add modal to move items on board (#927) 2024-08-10 22:58:48 +02:00
homarr-renovate[bot] 4b39c16d25 fix(deps): update dependency tldts to ^6.1.39 (#966)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-10 17:34:44 +00:00
Meier Lukas bc886d9476 feat: add collapse to login screen with cli command for password reset (#963)
* feat: add collapse to login screen with cli command for password reset

* refactor: add translations
2024-08-10 15:54:43 +02:00
Meier Lukas 9ce172e78a feat: add dynamic section (#842)
* chore: add parent_section_id and change position to x and y_offset for sqlite section table

* chore: rename existing positions to x_offset and y_offset

* chore: add related mysql migration

* chore: add missing height and width to section table

* fix: missing width and height in migration copy script

* fix: typecheck issues

* fix: test not working caused by unsimilar schemas

* wip: add dynamic section

* refactor: improve structure of gridstack sections

* feat: add rendering of dynamic sections

* feat: add saving of moved sections

* wip: add static row count, restrict min-width and height

* chore: address pull request feedback

* fix: format issues

* fix: size calculation within dynamic sections

* fix: on resize not called when min width or height is reached

* fix: size of items while dragging is to big

* chore: temporarly remove migration files

* chore: readd migrations

* fix: format and deepsource issues

* chore: remove db_dev.sqlite file

* chore: add *.sqlite to .gitignore

* chore: address pull request feedback

* feat: add dynamic section actions for adding and removing them
2024-08-10 12:37:16 +02:00
homarr-renovate[bot] a9d87e4e6b chore(deps): update dependency eslint to ^9.9.0 (#961)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-09 20:48:37 +00:00
homarr-renovate[bot] f6e551807f chore(deps): update dependency @types/node to ^20.14.15 (#958)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-09 18:33:11 +00:00
homarr-renovate[bot] 3be110097b fix(deps): update dependency undici to v6.19.7 (#950)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-09 17:32:51 +00:00
Meier Lukas f327837d82 feat: add user setting for home board (#956) 2024-08-09 19:24:50 +02:00
Meier Lukas 13e09968d9 feat: add logout redirect url (#954)
* feat: add logout redirect url

* fix: format issue
2024-08-09 19:24:07 +02:00
Meier Lukas 67195c6051 fix: wrong id for renovate auto approval (#957) 2024-08-09 19:23:14 +02:00
Meier Lukas fcb72e6716 feat: add column count and is public options to board creation modal (#930)
* feat: add column count and is public options to board creation modal

* test: adjust board creation test to match modified schema
2024-08-09 18:28:52 +02:00
Meier Lukas 349c49462f fix: redirect url from login not working (#952) 2024-08-09 16:08:08 +02:00
Meier Lukas 6dafbaae48 feat: add session expiry (#951) 2024-08-09 15:59:00 +02:00
Meier Lukas 25452ff063 feat: change visibility in item options based on selected integration kinds (#949) 2024-08-09 15:55:30 +02:00
Meier Lukas ab7d3f8e4c fix: renovate approval workflow not running (#948) 2024-08-09 15:25:07 +02:00
homarr-renovate[bot] 21c0e4b354 fix(deps): update dependency @tabler/icons-react to ^3.12.0 (#944)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-09 02:33:55 +00:00
homarr-renovate[bot] e18c773af9 chore(deps): update dependency vite-tsconfig-paths to ^5.0.1 (#946)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-09 01:57:01 +00:00
Meier Lukas c833f2cbf2 fix: github actor name for automatic approval wrong (#943) 2024-08-08 22:27:01 +02:00
homarr-renovate[bot] db9c200f89 fix(deps): update dependency winston to v3.14.1 (#941)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-08 20:26:50 +00:00
Meier Lukas 017c378582 fix: renovate approval run for all pull requests on every pull request change (#942)
* fix: renovate approval run for all pull requests on every pull request change

* fix: run approval only for renovate branches

* fix: restrict actor to renovate bot
2024-08-08 22:02:36 +02:00
homarr-renovate[bot]andMeier Lukas a80b49a03e fix(deps): update dependency @drizzle-team/brocli to ^0.10.0 (#937)
* fix(deps): update dependency @drizzle-team/brocli to ^0.10.0

* fix: rename cliName to name

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-08-08 21:43:04 +02:00
homarr-renovate[bot]andMeier Lukas 013c0c0eeb chore(deps): update dependency vite-tsconfig-paths to v5 (#934)
* chore(deps): update dependency vite-tsconfig-paths to v5

* fix: esm only issue

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-08-08 21:29:52 +02:00
Meier Lukas 9258c397e0 fix: alert that certain fields in user settings are disabled is always shown (#928)
* fix: alert that certain fields in user settings are disabled is always shown

* fix: wrong inverted check
2024-08-08 20:38:17 +02:00
Meier Lukas 81946e50a9 feat: add duplication action for items (#926) 2024-08-08 20:37:41 +02:00
Meier Lukas 365e267b8d fix: ping urls are not reset when restarting (#924) 2024-08-08 20:36:51 +02:00
homarr-renovate[bot] f9e2df085b fix(deps): update tanstack-query monorepo to ^5.51.23 (#936)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-08 17:07:53 +02:00
homarr-renovate[bot] 940a4890e2 fix(deps): update dependency drizzle-kit to ^0.24.0 (#939)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-08 14:48:48 +00:00
homarr-renovate[bot] c399d832e5 fix(deps): update dependency drizzle-orm to ^0.33.0 (#938)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-08 14:36:20 +00:00
homarr-renovate[bot] ac4b4ed9cf fix(deps): update dependency winston to v3.14.0 (#935)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-08 05:29:08 +00:00
homarr-renovate[bot]andMeier Lukas c2bf6779c0 fix(deps): update dependency jotai to ^2.9.2 (#933)
* fix(deps): update dependency jotai to ^2.9.2

* fix: lint issue

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-08-08 07:04:17 +02:00
Yossi Hillali 44712608b7 feat: AdGuard Home integration (#929)
* feat: AdGuard Home integration

* fix: code improvments

* fix: a better errorMessages method
2024-08-07 09:06:59 +03:00
homarr-renovate[bot] d4c2bd2789 chore(deps): update pnpm to v9.7.0 (#932)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-07 01:53:06 +00:00
homarr-renovate[bot] a2be781f81 fix(deps): update dependency tldts to ^6.1.38 (#931)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-06 20:09:19 +00:00
Meier Lukas c4c4d41e4d feat: add support for app url variables (#915)
* feat: add support for app url variables

* fix: test not working

* fix: format issue
2024-08-06 21:43:12 +02:00
homarr-renovate[bot] 693e319e26 chore(deps): update turbo monorepo to ^2.0.12 (#923)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-06 17:37:19 +00:00
homarr-renovate[bot] c6bb272318 fix(deps): update tiptap monorepo to v2.5.9 (#922)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-06 15:36:34 +00:00
homarr-renovate[bot] c69483a12c fix(deps): update dependency typescript-eslint to ^8.0.1 (#921)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-05 17:38:02 +00:00
homarr-renovate[bot] 137ebf6d22 fix(deps): update mantine monorepo to ^7.12.0 (#920)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-05 16:48:06 +00:00
homarr-renovate[bot] 3f35163481 fix(deps): update dependency drizzle-orm to ^0.32.2 (#919)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-05 16:31:47 +00:00
homarr-renovate[bot] d378ddb42b fix(deps): update dependency drizzle-kit to ^0.23.2 (#918)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-05 15:48:23 +00:00
homarr-renovate[bot] 796261c5f5 fix(deps): update dependency video.js to ^8.17.2 (#917)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-05 08:32:53 +00:00
Meier Lukas 7fa5e70d5b feat: reset password cli (#903)
* feat: add password reset cli

* feat: add homarr cli to docker image
2024-08-04 21:44:51 +02:00
Meier Lukas ca1ecdf848 feat: add preview to icon picker (#914) 2024-08-04 21:20:21 +02:00
Meier Lukas b53a2b6b78 feat: add refresh button to docker containers table (#913) 2024-08-04 21:19:31 +02:00
Meier Lukas b8b084c188 fix: restrict access to docker containers page to admins (#912) 2024-08-04 21:19:16 +02:00
SeDemal 0cec1dbb17 fix: Fix typecheck, lint issues and errors brought to dnshole summary. (#916) 2024-08-04 20:46:27 +02:00
Yossi Hillali 65c6854e44 feat: dnshole controls widget (#867)
* feat: dnshole controls widget

* feat: add duration and timer modal

* fix: code improvment

* fix: add support for many integrations

* fix: add support for more integrations

* fix: move ControlsCard outside of main component

* fix: deepsource
2024-08-04 18:47:00 +03:00
Manuel 9013d5dbf0 feat: remove manual flag to pushing image 2024-08-02 21:41:26 +02:00
homarr-renovate[bot] 2a459dda20 fix(deps): update tanstack-query monorepo to ^5.51.21 (#905)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-02 19:21:00 +00:00
homarr-renovate[bot] afe2637f2d chore(deps): update dependency @types/node to ^20.14.14 (#902)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-02 08:48:37 +00:00
homarr-renovate[bot] 26615d80e7 fix(deps): update tanstack-query monorepo to ^5.51.18 (#900)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-01 14:09:47 +00:00
homarr-renovate[bot] 5c73b54428 fix(deps): update tanstack-query monorepo to ^5.51.17 (#899)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-08-01 13:35:52 +00:00
homarr-renovate[bot]andMeier Lukas a9a46024e2 fix(deps): update dependency typescript-eslint to v8 (#896)
* fix(deps): update dependency typescript-eslint to v8

* fix: lint issues

* fix: more lint issues

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-08-01 10:13:12 +02:00
homarr-renovate[bot] 1811e1de79 chore(deps): update turbo monorepo to ^2.0.11 (#897)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-31 21:25:09 +00:00
homarr-renovate[bot] 25e732bf45 chore(deps): update vitest monorepo to ^2.0.5 (#894)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-31 11:22:23 +00:00
homarr-renovate[bot] 5256853351 fix(deps): update dependency undici to v6.19.5 (#893)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-31 10:49:18 +00:00
homarr-renovate[bot] 3a5f818e7c fix(deps): update tanstack-query monorepo to ^5.51.16 (#892)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-31 09:35:52 +00:00
homarr-renovate[bot] 15171dd5af fix(deps): update dependency chroma-js to ^2.6.0 (#891)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-30 23:21:24 +00:00
homarr-renovate[bot] 79cabe6580 fix(deps): update dependency chroma-js to ^2.5.0 (#890)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-30 22:48:25 +00:00
homarr-renovate[bot] 5f89d93db6 fix(deps): update dependency drizzle-kit to ^0.23.1 (#888)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-30 22:33:12 +00:00
homarr-renovate[bot] d98112eae4 chore(deps): update turbo monorepo to ^2.0.10 (#889)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-30 22:24:17 +00:00
homarr-renovate[bot] e0566dfcfa fix(deps): update tiptap monorepo to v2.5.8 (#887)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-30 09:26:56 +00:00
homarr-renovate[bot] 1a24ba6ef7 fix(deps): update dependency typescript-eslint to ^7.18.0 (#886)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-29 17:33:32 +00:00
homarr-renovate[bot] 74f1580cba chore(deps): update dependency testcontainers to ^10.11.0 (#885)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-29 15:48:25 +00:00
homarr-renovate[bot] bce73bc38f fix(deps): update dependency video.js to ^8.17.1 (#884)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-29 09:48:21 +00:00
homarr-renovate[bot] e40d2d776f chore(deps): update dependency @types/ws to ^8.5.12 (#883)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-29 09:11:18 +00:00
Meier Lukas 67dad45214 fix: fetch timeout for external requests to small (#881)
* fix: fetch timeout for external requests to small

* fix: format issue

* fix: move clear timeout for fetch to finally
2024-07-29 06:30:56 +02:00
Meier Lukas 406ed16ce4 fix: overview in series of sonarr schema is optional (#880) 2024-07-28 19:38:47 +02:00
Meier Lukas 9cb6200895 feat: add validation to widget edit modal inputs (#879)
* feat: add validation to widget edit modal inputs

* chore: remove unused console.log statements
2024-07-28 19:38:19 +02:00
homarr-renovate[bot] 851f5e486d chore(deps): update dependency @types/node to ^20.14.13 (#882)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-28 10:28:40 +00:00
homarr-renovate[bot] a0c55459d1 fix(deps): update dependency next-auth to v5.0.0-beta.20 (#878)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-28 04:12:05 +00:00
homarr-renovate[bot] 37309e0727 fix(deps): update dependency @auth/drizzle-adapter to ^1.4.2 (#877)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-28 03:48:18 +00:00
homarr-renovate[bot] 9181f11b13 fix(deps): update dependency @auth/core to ^0.34.2 (#876)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-28 03:27:46 +00:00
Meier Lukas 8e10c48d2f fix: videos not playing automatically on iOS / mobile (#875) 2024-07-27 23:00:45 +02:00
Meier Lukas 55a000a7fc fix: missing breadcrumb translation, wrong spacing in user layout (#872) 2024-07-27 21:09:34 +02:00
Manuel b0e10f0c62 config: test new tag name 2024-07-27 20:04:03 +02:00
Manuel ff847f0910 feat: use different tag name 2024-07-27 19:33:22 +02:00
Manuel fa2c448bac fix: specify step image version 2024-07-27 19:19:48 +02:00
Manuel 4836801004 fix: login before pushing image 2024-07-27 19:17:26 +02:00
Manuel eab5c10fa6 fix: docker push flag 2024-07-27 19:08:18 +02:00
Manuel 1128110be3 fix: docker push flag 2024-07-27 19:02:29 +02:00
Manuel bce085c028 config: add push image input 2024-07-27 18:58:26 +02:00
ManuelandSeDemal 15d9327d46 feat: add rss widget (#760)
Co-authored-by: SeDemal <demal.sebastien@bluewin.ch>
2024-07-27 18:11:29 +02:00
Meier Lukas 4380aa9b3e fix: mantine-react-table not localized #333 (#873) 2024-07-27 17:10:51 +02:00
homarr-renovate[bot] c973a3bfa5 fix(deps): update dependency mysql2 to v3.11.0 (#874)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-27 14:48:10 +00:00
Meier Lukas 6f7327b774 feat: restrict non credential provider interactions (#871)
* wip: add provider field to sqlite user table

* feat: disable invites when credentials provider is not used

* wip: add migration for provider field in user table with sqlite

* wip: remove fields that can not be modified by non credential users

* wip: make username, mail and avatar disabled instead of hidden

* wip: external users membership of group cannot be managed manually

* feat: add alerts to inform about disabled fields and managing group members

* wip: add mysql migration for provider on user table

* chore: fix format issues

* chore: address pull request feedback

* fix: build issue

* fix: deepsource issues

* fix: tests not working

* feat: restrict login to specific auth providers

* chore: address pull request feedback

* fix: deepsource issue
2024-07-27 11:38:51 +02:00
homarr-renovate[bot] eba4052522 chore(deps): update dependency eslint to ^9.8.0 (#870)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-26 21:09:40 +00:00
homarr-renovate[bot] 89ab1df2db fix(deps): update tiptap monorepo to v2.5.7 (#869)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-26 13:13:04 +00:00
homarr-renovate[bot] 63b3c1bff1 fix(deps): update tanstack-query monorepo to ^5.51.15 (#868)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-26 12:50:34 +00:00
homarr-renovate[bot] 04a836e824 fix(deps): update tanstack-query monorepo to ^5.51.14 (#866)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-26 09:26:08 +00:00
Meier Lukas 90ef982066 fix: deployment pipeline for docker not working (#860)
* fix: skip env validation in dockerfile not working

* fix: skip env validation in dockerfile not working

* fix: remove linux/arm/v7 for now as node commands are run forever

* fix: remove cache because it is to big?

* refactor: remove redis log transport during build

* fix: add more checks for conditional redis connection

* fix: docker build not working locally

* refactor: move base image to debian

* chore: add arm v7 platform support

* fix: remove armv7 support as not supported by turbo

* chore: profile amd64 build

* chore: enable webpack logging

* chore: disable linux/arm64 for now

* chore: remove profiling from build in dockerfile

* chore: revert to node alpine image
2024-07-25 19:52:31 +02:00
homarr-renovate[bot] 32a8488b7b chore(deps): update dependency @types/dockerode to ^3.3.31 (#865)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-24 23:10:46 +00:00
homarr-renovate[bot] 69d9a79b05 chore(deps): update node.js to v20.16.0 (#864)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-24 18:13:39 +00:00
homarr-renovate[bot] d70e99c973 fix(deps): update tiptap monorepo to v2.5.6 (#863)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-24 17:48:31 +00:00
homarr-renovate[bot] 20d44121e6 chore(deps): update dependency node to v20.16.0 (#862)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-24 14:10:18 +00:00
homarr-renovate[bot] d8c21f996c chore(deps): update dependency @types/node to ^20.14.12 (#861)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-23 21:14:33 +02:00
homarr-renovate[bot] 868b7b890e fix(deps): update dependency drizzle-orm to ^0.32.1 (#859)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-23 15:11:02 +00:00
homarr-renovate[bot] fc5f02b022 fix(deps): update dependency jotai to ^2.9.1 (#858)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-23 10:10:34 +00:00
homarr-renovate[bot] 47834d4288 chore(deps): update dependency typescript to ^5.5.4 (#857)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-22 23:24:14 +00:00
Manuel 43e48010e5 fix: job translations (#846) 2024-07-22 21:02:36 +02:00
Manuel 508fcb9861 feat: allow no secrets for integration (#856) 2024-07-22 21:00:14 +02:00
homarr-renovate[bot] b2860ffbd3 fix(deps): update dependency typescript-eslint to ^7.17.0 (#855)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-22 17:36:50 +00:00
homarr-renovate[bot] 0c7264bc52 fix(deps): update dependency undici to v6.19.4 (#854)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-22 14:28:46 +00:00
homarr-renovate[bot] c512ddba49 fix(deps): update tiptap monorepo to v2.5.5 (#853)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-22 11:48:47 +00:00
homarr-renovate[bot] 6a6f9595f6 chore(deps): update vitest monorepo to ^2.0.4 (#852)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-22 09:39:25 +00:00
homarr-renovate[bot] 1098725bd1 fix(deps): update dependency undici to v6.19.3 (#850)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-22 09:12:59 +00:00
homarr-renovate[bot] 88e5ac2f71 fix(deps): update dependency @t3-oss/env-nextjs to ^0.11.0 (#851)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-22 08:49:32 +00:00
homarr-renovate[bot] e5e06baeb3 chore(deps): update pnpm to v9.6.0 (#849)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-22 01:56:52 +00:00
homarr-renovate[bot] 41e576039f fix(deps): update dependency postcss-preset-mantine to ^1.17.0 (#843)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-21 12:16:32 +00:00
homarr-renovate[bot] 56e7aed87f chore(deps): update dependency jsdom to ^24.1.1 (#841)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-21 05:28:47 +00:00
homarr-renovate[bot] c33086d8b5 fix(deps): update dependency ldapts to v7.1.0 (#839)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-20 20:48:07 +00:00
Meier Lukas dc75ffb9e6 feat: add ldap and oidc sso (#500)
* wip: sso

* feat: add ldap client and provider

* feat: implement login form

* feat: finish sso

* fix: lint and format issue

* chore: address pull request feedback

* fix: build not working

* fix: oidc is redirected to internal docker container hostname

* fix: build not working

* refactor: migrate to ldapts

* fix: format and frozen lock file

* fix: deepsource issues

* fix: unit tests for ldap authorization not working

* refactor: remove unnecessary args from dockerfile

* chore: address pull request feedback

* fix: use console instead of logger in auth env.mjs

* fix: default value for auth provider of wrong type

* fix: broken lock file

* fix: format issue
2024-07-20 22:23:58 +02:00
homarr-renovate[bot] 5da74ca7e0 fix(deps): update dependency mantine-react-table to v2.0.0-beta.6 (#837)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-20 13:25:30 +00:00
homarr-renovate[bot] 14d19fcd8b fix(deps): update tanstack-query monorepo to ^5.51.11 (#836)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-20 11:08:48 +00:00
homarr-renovate[bot] 37a8a0fe5a fix(deps): update dependency eslint-plugin-react to ^7.35.0 (#835)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-20 06:14:30 +00:00
homarr-renovate[bot] 445c0c4d2e chore(deps): update turbo monorepo to ^2.0.9 (#834)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-19 22:29:12 +00:00
homarr-renovate[bot] b5379c5352 chore(deps): update turbo monorepo to ^2.0.8 (#833)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-19 15:36:32 +00:00
homarr-renovate[bot] c8f3eb69e5 fix(deps): update tanstack-query monorepo to ^5.51.9 (#831)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-18 13:28:55 +00:00
homarr-renovate[bot] 5c92f6a3cc fix(deps): update dependency dayjs to ^1.11.12 (#832)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-18 13:14:20 +00:00
homarr-renovate[bot] ee2703ca4b fix(deps): update tanstack-query monorepo to ^5.51.8 (#830)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-18 07:24:12 +00:00
homarr-renovate[bot] a4edda6932 fix(deps): update tanstack-query monorepo to ^5.51.5 (#829)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-17 14:48:25 +00:00
homarr-renovate[bot] 002d011b18 fix(deps): update dependency postcss-preset-mantine to ^1.16.0 (#827)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-17 13:48:17 +00:00
homarr-renovate[bot] baf552bf52 fix(deps): update tiptap monorepo to v2.5.4 (#828)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-17 13:35:32 +00:00
homarr-renovate[bot] 015b42aa61 fix(deps): update tiptap monorepo to v2.5.3 (#825)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-17 12:18:06 +00:00
SeDemal 4e03e7f49d fix: Manage banner animation hitch fix (#826) 2024-07-17 13:45:27 +02:00
homarr-renovate[bot] 86c729a83f fix(deps): update tanstack-query monorepo to ^5.51.4 (#824)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-17 11:33:49 +00:00
homarr-renovate[bot] 86d526db28 chore(deps): update dependency testcontainers to ^10.10.4 (#823)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-17 10:11:13 +00:00
homarr-renovate[bot] b82128a90c fix(deps): update tiptap monorepo to v2.5.2 (#822)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-17 08:13:36 +00:00
homarr-renovate[bot] 05bbc19a15 fix(deps): update tanstack-query monorepo to ^5.51.3 (#821)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-16 21:10:26 +00:00
homarr-renovate[bot] 54a4173e72 chore(deps): update turbo monorepo to ^2.0.7 (#820)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-16 20:48:26 +00:00
homarr-renovate[bot] ed1ac628a1 chore(deps): update dependency @types/node to ^20.14.11 (#819)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-16 20:24:28 +00:00
homarr-renovate[bot] 30669d23e3 fix(deps): update dependency @tabler/icons-react to ^3.11.0 (#818)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-16 11:48:26 +00:00
homarr-renovate[bot] c8d57ac3fa chore(deps): update dependency @types/dockerode to ^3.3.30 (#817)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-16 02:30:58 +00:00
homarr-renovate[bot] 636d3c670c fix(deps): update dependency mysql2 to v3.10.3 (#816)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-15 23:10:55 +00:00
homarr-renovate[bot] 56c6be523d fix(deps): update dependency typescript-eslint to ^7.16.1 (#814)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-15 17:35:18 +00:00
homarr-renovate[bot] 08ba282528 fix(deps): update tiptap monorepo to v2.5.1 (#813)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-15 13:29:14 +00:00
homarr-renovate[bot] ea47e4c0a0 chore(deps): update vitest monorepo to ^2.0.3 (#812)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-15 10:30:53 +00:00
homarr-renovate[bot] 7f341efdb3 fix(deps): update tiptap monorepo to v2.5.0 (#811)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-14 14:48:46 +00:00
homarr-renovate[bot] fd642011ba fix(deps): update dependency eslint-plugin-react to ^7.34.4 (#809)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-13 18:29:29 +00:00
homarr-renovate[bot] fe5af9231e fix(deps): update mantine monorepo to ^7.11.2 (#808)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-13 15:33:24 +00:00
Manuel e438bac0f5 feat: make notifications optional 2024-07-13 17:23:08 +02:00
Manuel 5c68ac9e2e fix: try using other variable 2024-07-13 17:22:09 +02:00
Manuel d7a30cd0dd fix: disable env validation in ci 2024-07-13 15:30:29 +02:00
homarr-renovate[bot] 66036b08bc fix(deps): update dependency prettier to ^3.3.3 (#805)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-13 13:25:36 +00:00
Manuel c84fb63b25 fix: disable env validation in ci 2024-07-13 15:09:29 +02:00
Manuel f0d6676917 fix: docker platforms 2024-07-13 15:02:31 +02:00
Manuel f23831be5e fix: add missing tags 2024-07-13 14:54:53 +02:00
Manuel 0c7f479952 fix: use correct branch for tag compare 2024-07-13 14:46:27 +02:00
Manuel a8748fa439 fix: base branch for semver 2024-07-13 14:43:20 +02:00
Manuel 82caec402a feat: use gh app for merging 2024-07-13 14:32:43 +02:00
Manuel 3df6dcfbe7 feat: approve before automerge 2024-07-13 14:19:21 +02:00
Manuel 653f42bccb fix: pass token to cli 2024-07-13 14:06:33 +02:00
Manuel 3fb6458edf refactor: use gh cli to create pr (#795) 2024-07-13 14:00:53 +02:00
homarr-renovate[bot] 8a0411341d chore(deps): update dependency @types/ws to ^8.5.11 (#793)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-13 03:10:57 +00:00
homarr-renovate[bot] 7d61baad03 chore(deps): update dependency eslint to ^9.7.0 (#786)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-12 21:10:47 +00:00
homarr-renovate[bot] 0169501676 fix(deps): update dependency glob to v11 (#766)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-12 20:48:00 +02:00
Manuel 01eb84654d fix: docker build (#777) 2024-07-12 20:46:58 +02:00
Manuel f58c38a1aa fix: correctly set pr description (#778) 2024-07-12 20:46:18 +02:00
homarr-renovate[bot] 0a4ff4b883 fix(deps): update dependency @ianvs/prettier-plugin-sort-imports to ^4.3.1 (#784)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-12 15:26:38 +00:00
homarr-renovate[bot] be4748b8fa fix(deps): update tanstack-query monorepo to ^5.51.1 (#782)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-11 20:34:07 +00:00
homarr-renovate[bot] ec4b3a6408 fix(deps): update dependency sass to ^1.77.8 (#783)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-11 20:25:07 +00:00
homarr-renovate[bot] 5382b1999f fix(deps): update dependency winston to v3.13.1 (#781)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-10 21:33:52 +00:00
homarr-renovate[bot] e54d9aaf44 chore(deps): update vitest monorepo to ^2.0.2 (#780)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-10 16:11:28 +00:00
homarr-renovate[bot] 99175feda4 fix(deps): update nextjs monorepo to ^14.2.5 (#779)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-10 15:27:39 +00:00
homarr-renovate[bot] 3da5734571 fix(deps): update dependency drizzle-orm to ^0.32.0 (#776)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-10 13:28:35 +00:00
homarr-renovate[bot] f2c70a4d0b fix(deps): update dependency drizzle-kit to ^0.23.0 (#775)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-10 13:13:36 +00:00
homarr-renovate[bot] dcb9cfaf29 fix(deps): update dependency sass to ^1.77.7 (#773)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-09 22:29:07 +00:00
homarr-renovate[bot] 8085e72cf4 fix(deps): update dependency video.js to ^8.16.1 (#772)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-09 17:09:42 +00:00
homarr-renovate[bot] ea0a6a62a8 chore(deps): update node.js to v20.15.1 (#771)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-09 16:12:34 +00:00
homarr-renovate[bot] c3f988cc02 chore(deps): update dependency testcontainers to ^10.10.3 (#770)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-09 14:09:25 +00:00
homarr-renovate[bot] bf70143cca fix(deps): update dependency @tabler/icons-react to ^3.10.0 (#769)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-09 11:22:21 +00:00
homarr-renovate[bot] 4cee3dfbe0 fix(deps): update dependency glob to ^10.4.5 (#768)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-09 09:10:29 +00:00
homarr-renovate[bot] 5e3dc1e44d fix(deps): update dependency jotai to ^2.9.0 (#767)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-09 03:37:37 +00:00
homarr-renovate[bot] 74b017d9f4 fix(deps): update dependency glob to ^10.4.4 (#765)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-08 22:36:03 +00:00
homarr-renovate[bot] 60669999d1 chore(deps): update dependency node to v20.15.1 (#763)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-08 20:11:45 +00:00
homarr-renovate[bot] ea17975406 chore(deps): update dependency testcontainers to ^10.10.2 (#764)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-08 19:48:20 +00:00
homarr-renovate[bot] 2c197bc59b fix(deps): update dependency typescript-eslint to ^7.16.0 (#762)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-08 17:34:19 +00:00
homarr-renovate[bot] 4f94e98140 chore(deps): update vitest monorepo to ^2.0.1 (#761)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-08 16:11:23 +00:00
Meier Lukas 46943b147a feat: add integration access check to middlewares (#756)
* feat: add integration access check to middlewares

* fix: format issues

* fix: remove group and user permissions and items from context

* refactor: move action check to seperate function
2024-07-08 17:39:36 +02:00
homarr-renovate[bot] 8d42ca8b5e fix(deps): update dependency drizzle-orm to ^0.31.4 (#759)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-08 15:26:45 +00:00
homarr-renovate[bot] 0d98335354 chore(deps): update vitest monorepo to v2 (#757)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-08 15:39:35 +02:00
homarr-renovate[bot] 0a3d1e9e5e fix(deps): update dependency drizzle-orm to ^0.31.3 (#758)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-08 13:37:50 +00:00
Meier Lukas 3214d889fa refactor: add color initials to avatar, improve usage of user avatar (#753) 2024-07-08 00:00:54 +02:00
Meier Lukas 408cdeb5c3 feat: add integration access settings (#725)
* feat: add integration access settings

* fix: typecheck and test issues

* fix: test timeout

* chore: address pull request feedback

* chore: add throw if action forbidden for integration permissions

* fix: unable to create new migrations because of duplicate prevId in sqlite snapshots

* chore: add sqlite migration for integration permissions

* test: add unit tests for integration access

* test: add permission checks to integration router tests

* test: add unit test for integration permissions

* chore: add mysql migration

* fix: format issues
2024-07-08 00:00:37 +02:00
Meier Lukas be711149f7 fix: manage links wrong (#754) 2024-07-07 21:32:36 +02:00
homarr-renovate[bot] 680cc284d6 chore(deps): update pnpm to v9.5.0 (#755)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-07 17:09:25 +00:00
Meier Lukas 95101e34ed feat: add docker actions (#752)
* feat: add docker actions

* chore: remove unnecessary import
2024-07-07 09:58:40 +02:00
Meier Lukas 998615fc11 fix: memory leak caused by many unclosed redis subscriptions (#750)
* fix: memory leak caused by many unclosed redis subscriptions

* chore: address pull request feedback
2024-07-07 09:58:20 +02:00
homarr-renovate[bot] 61cbb74d14 fix(deps): update dependency glob to ^10.4.3 (#751)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-06 04:29:19 +00:00
homarr-renovate[bot] 228fc48e33 chore(deps): update dependency @types/node to ^20.14.10 (#748)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-05 19:20:33 +00:00
homarr-renovate[bot] a67050e77b fix(deps): update tanstack-query monorepo to ^5.50.1 (#747)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-05 04:14:08 +00:00
homarr-renovate[bot] 9375738e05 fix(deps): update dependency react-simple-code-editor to ^0.14.1 (#746)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-04 23:24:40 +00:00
homarr-renovate[bot] 75e5a6c42f fix(deps): update dependency @tabler/icons-react to ^3.9.0 (#745)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-04 20:10:12 +00:00
Meier Lukas 41dba7b516 fix: controller is already closed trpc subscription observable error (#743) 2024-07-03 20:31:06 +02:00
homarr-renovate[bot] f557fbbae1 chore(deps): update dependency testcontainers to ^10.10.1 (#739)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-03 20:28:57 +02:00
homarr-renovate[bot] 1dd509a40f fix(deps): update dependency ws to ^8.18.0 (#740)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-03 20:28:47 +02:00
Manuel bb8640b162 feat: add jellyfin integration (#672)
* feat: #655 implement jellyfin media server

* fix: table overflow

* feat: pr feedback

* refactor: format

* refactor: merge existing code

* fix: code smells

* refactor: format commit
2024-07-03 20:06:57 +02:00
Manuel 1cf119c768 feat: log elapsed cron job time (#742) 2024-07-03 19:47:13 +02:00
Meier Lukas 15f3493b5b chore(deps): update pnpm/action-setup to v4 (#741) 2024-07-03 19:37:54 +02:00
homarr-renovate[bot] d32075d410 fix(deps): update dependency react-simple-code-editor to ^0.14.0 (#738)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-02 23:48:11 +00:00
homarr-renovate[bot] e12531cccc fix(deps): update dependency @tabler/icons-react to ^3.8.0 (#737)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-02 21:23:14 +00:00
homarr-renovate[bot] 6aecd1a713 fix(deps): update dependency better-sqlite3 to ^11.1.2 (#736)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-02 17:09:08 +00:00
homarr-renovate[bot] 60c0cfa911 fix(deps): update mantine monorepo to ^7.11.1 (#735)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-02 11:21:36 +00:00
Manuel dba97a3bd6 feat: add calendar widget (#663)
* feat: add calendar widget

* feat: add artifacts to gitignore
2024-07-02 12:13:13 +02:00
homarr-renovate[bot] 83ee03b192 chore(deps): update dependency @types/better-sqlite3 to v7.6.11 (#734)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-02 04:12:02 +00:00
homarr-renovate[bot] 0ac123b59f chore(deps): update dependency typescript to ^5.5.3 (#733)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-01 19:09:01 +00:00
homarr-renovate[bot] 0990e4b552 fix(deps): update dependency typescript-eslint to ^7.15.0 (#732)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-01 17:35:31 +00:00
Manuel 08d571ad74 feat: add tasks page (#692) 2024-07-01 18:57:40 +02:00
homarr-renovate[bot] 663eb0bf5b fix(deps): update dependency mysql2 to v3.10.2 (#731)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-07-01 02:46:23 +00:00
homarr-renovate[bot] 8ee0d67a36 fix(deps): update tanstack-query monorepo to ^5.49.2 (#730)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-30 06:48:29 +00:00
Manuel 4e1bbf2ae6 feat: add dynamic breadcrumb (#706)
* feat: add dynamic breadcrumb

* feat: pr feedback
2024-06-29 17:28:22 +02:00
homarr-renovate[bot] be100b610e fix(deps): update dependency drizzle-kit to ^0.22.8 (#729)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-29 12:48:32 +00:00
homarr-renovate[bot] 531cd0de25 fix(deps): update tanstack-query monorepo to ^5.49.0 (#728)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-29 06:40:56 +00:00
Meier Lukas 8fc28844bb fix: typo in automatic release commit message (#726) 2024-06-28 22:03:24 +02:00
homarr-renovate[bot] 4cf10b97c5 chore(deps): update turbo monorepo to ^2.0.6 (#723)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-28 19:33:31 +00:00
homarr-renovate[bot] e057affddf chore(deps): update dependency eslint to ^9.6.0 (#722)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-28 17:48:14 +00:00
homarr-renovate[bot] e46bfd9146 fix(deps): update dependency jotai to ^2.8.4 (#721)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-28 04:28:46 +00:00
homarr-renovate[bot] c8d4461ab8 fix(deps): update dependency better-sqlite3 to ^11.1.1 (#720)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-27 18:11:16 +00:00
homarr-renovate[bot] 52e936f979 fix(deps): update mantine monorepo to ^7.11.0 (#719)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-26 17:08:53 +00:00
homarr-renovate[bot] 7a14c255be fix(deps): update dependency @ianvs/prettier-plugin-sort-imports to ^4.3.0 (#718)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-26 14:09:06 +00:00
Manuel c4b54ed36c fix: open navigation item by default (#716) 2024-06-26 12:19:05 +02:00
homarr-renovate[bot] 988ec6bebb chore(deps): update dependency @types/node to ^20.14.9 (#717)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-25 22:26:38 +00:00
homarr-renovate[bot] 6a3a8465e7 fix(deps): update dependency @tabler/icons-react to ^3.7.0 (#715)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-25 15:48:11 +00:00
homarr-renovate[bot] a76e941378 fix(deps): update tanstack-query monorepo to ^5.48.0 (#714)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-25 14:38:27 +00:00
homarr-renovate[bot] 75748dfbc3 fix(deps): update tanstack-query monorepo to ^5.47.0 (#713)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-25 13:12:11 +00:00
homarr-renovate[bot] 196ac340a1 fix(deps): update dependency typescript-eslint to ^7.14.1 (#709)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-24 22:36:37 +00:00
homarr-renovate[bot] fab69c1c07 chore(deps): update turbo monorepo to ^2.0.5 (#711)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-24 22:28:16 +00:00
homarr-renovate[bot] a2140d0870 chore(deps): update node.js to v20.15.0 (#710)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-24 22:11:17 +00:00
Meier Lukas 6029a5b592 style: improve mobile compatibility of certain manage pages (#678)
* style: improve mobile compatibility of certain manage pages

* style: improve mobile support for more manage pages

* fix: format issues

* chore: address pull request feedback
2024-06-22 21:02:17 +02:00
Meier Lukas f92aeba403 feat: test integration connection (#669)
* feat: add test integration for pi-hole

* refactor: test integration for pi-hole

* fix: multiple secrets of same type could be used for integration creation

* fix: remove integration test connection test and add mock for test-connection function

* fix: add missing onUpdateFn to mysql integration secrets

* fix: format issues

* feat: add home assistant test connection

* fix: deepsource issues

* test: add system integration tests for test connection

* fix: add before all for pulling home assistant image

* test: add unit tests for handleTestConnectionResponseAsync

* test: add unit test for testConnectionAsync

* test: add mroe tests to integration-test-connection

* fix: deepsource issues

* fix: deepsource issue

* chore: address pull request feedback
2024-06-22 21:02:04 +02:00
Meier Lukas 92afd82d22 refactor: add cron job core package (#704)
* refactor: add cron job core package

* docs: add comments to cron validation types

* chore(deps): move node-cron dependencies from tasks app to cron-jobs-core package

* fix: runOnInit is not running on start and rather on job creation

* fix: format issues

* fix: build fails when using top level await in cjs

* chore: update turbo gen package json typescript version to 5.5.2

* fix: format issue

* fix: deepsource issues

* chore: update turbo gen package json eslint version to 9.5.0

* chore: fix frozen lockfile and format
2024-06-22 20:00:20 +02:00
homarr-renovate[bot] ea12da991a chore(deps): update dependency testcontainers to ^10.10.0 (#705)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-22 15:47:58 +00:00
homarr-renovate[bot] af0b986b3e chore(deps): update dependency @types/node to ^20.14.8 (#703)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-22 08:12:17 +00:00
homarr-renovate[bot] 324a643fd1 fix(deps): update dependency @auth/drizzle-adapter to ^1.4.1 (#701)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-21 21:10:42 +00:00
homarr-renovate[bot] 05702bede8 fix(deps): update dependency @auth/core to ^0.34.1 (#702)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-21 20:48:15 +00:00
homarr-renovate[bot] 9087f4bfdf fix(deps): update dependency @auth/core to ^0.34.0 (#700)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-21 20:26:00 +00:00
homarr-renovate[bot] 8d7a7bc9b1 fix(deps): update dependency @tanstack/react-query-next-experimental to v5.46.0 (#699)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-21 09:25:33 +00:00
homarr-renovate[bot] 7b3143357e chore(deps): update dependency @types/node to ^20.14.7 (#698)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-20 21:24:10 +00:00
homarr-renovate[bot] d5f4bd0aab chore(deps): update dependency typescript to ^5.5.2 (#697)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-20 18:13:25 +00:00
homarr-renovate[bot] 21a2db6019 chore(deps): update dependency node to v20.15.0 (#696)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-20 16:33:02 +00:00
homarr-renovate[bot] d78b581104 fix(deps): update dependency eslint-plugin-jsx-a11y to ^6.9.0 (#695)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-20 06:48:21 +00:00
homarr-renovate[bot] 4291bde94f fix(deps): update dependency @auth/drizzle-adapter to ^1.3.0 (#694)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-20 02:44:06 +00:00
homarr-renovate[bot] 171fe40fd5 fix(deps): update dependency @auth/core to ^0.33.0 (#693)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-20 02:22:20 +00:00
homarr-renovate[bot] 541d745cea fix(deps): update dependency undici to v6.19.2 (#691)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-19 17:36:32 +00:00
ManuelandMeier Lukas 508369cb0b feat: add undici fetch interceptor (#687)
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-06-19 19:26:42 +02:00
homarr-renovate[bot] bf607349e0 chore(deps): update dependency @types/node to ^20.14.6 (#690)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-19 16:30:58 +00:00
homarr-renovate[bot] 0bfc0c5d25 fix(deps): update dependency glob to ^10.4.2 (#689)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-19 02:46:21 +00:00
homarr-renovate[bot] fdcf3a89c9 fix(deps): update dependency eslint-plugin-react to ^7.34.3 (#688)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-18 20:33:38 +00:00
homarr-renovate[bot] 86b49414f0 chore(deps): update docker/build-push-action action to v6 (#679)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-18 21:51:53 +02:00
homarr-renovate[bot] 64fe061fb0 chore(deps): update dependency @types/node to ^20.14.5 (#686)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-18 07:09:33 +00:00
homarr-renovate[bot] f96e25c0a2 chore(deps): update dependency @types/node to ^20.14.4 (#685)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-18 03:38:41 +00:00
homarr-renovate[bot] 4526fa6fc4 fix(deps): update dependency sass to ^1.77.6 (#683)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-17 21:23:43 +00:00
homarr-renovate[bot] 05690cc5e3 chore(deps): update dependency @types/node to ^20.14.3 (#682)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-17 20:08:32 +00:00
homarr-renovate[bot] e9d612051d fix(deps): update dependency typescript-eslint to ^7.13.1 (#681)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-17 17:47:57 +00:00
homarr-renovate[bot] 727f97226c chore(deps): update pnpm to v9.4.0 (#680)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-17 16:48:11 +00:00
homarr-renovate[bot] 33e8cc7412 fix(deps): update tanstack-query monorepo to ^5.45.1 (#677)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-16 20:33:50 +00:00
Meier Lukas f358c33bd3 fix: missing translations for apps / integrations #438 (#674)
* fix: missing translations for apps / integrations #438

* chore: remove unnecessary property from integration new dropdown
2024-06-16 22:10:17 +02:00
Meier Lukas e957c6b601 fix: icon selector is a select not an autocomplete #515 (#675) 2024-06-16 22:09:48 +02:00
homarr-renovate[bot] 0d14bad10b fix(deps): update dependency ws to ^8.17.1 (#676)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-16 15:25:33 +00:00
Meier Lukas 25f8564e97 chore: change turbo ui to stream because the other one is unusable (#670) 2024-06-15 22:47:31 +02:00
homarr-renovate[bot] 8b4cc5b994 chore(deps): update dependency eslint to ^9.5.0 (#668)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-14 19:48:24 +00:00
homarr-renovate[bot] 856cb2d005 chore(deps): update turbo monorepo to ^2.0.4 (#666)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-14 17:48:25 +00:00
homarr-renovate[bot] 10acb2bc76 fix(deps): update dependency mysql2 to v3.10.1 (#665)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-13 23:24:12 +00:00
homarr-renovate[bot] e4c6864a94 fix(deps): update dependency @tabler/icons-react to ^3.6.0 (#664)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-13 20:48:14 +00:00
homarr-renovate[bot] 4e9593b859 fix(deps): update mantine monorepo to ^7.10.2 (#662)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-13 09:26:34 +00:00
homarr-renovate[bot] 37ebcfe318 fix(deps): update dependency mantine-react-table to v2.0.0-beta.5 (#661)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-13 06:13:09 +00:00
homarr-renovate[bot] 5547e52001 fix(deps): update tanstack-query monorepo to ^5.45.0 (#660)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-12 13:12:23 +00:00
homarr-renovate[bot] f5f6388361 fix(deps): update dependency sass to ^1.77.5 (#659)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-12 03:48:16 +00:00
homarr-renovate[bot] 476fa59079 fix(deps): update nextjs monorepo to ^14.2.4 (#658)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-11 22:27:00 +00:00
homarr-renovate[bot] 8b3bc03b9b fix(deps): update tanstack-query monorepo to ^5.44.0 (#657)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-11 13:34:47 +00:00
homarr-renovate[bot] d69cda0313 fix(deps): update dependency prettier to ^3.3.2 (#656)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-11 06:32:24 +00:00
Meier Lukas 9cab001451 chore: improve importing of some packages (#647)
* chore: improve importing of some packages

* fix: not same version for all dependencies

* fix: lint and format issue
2024-06-10 21:26:39 +02:00
Meier Lukas c627384c4b test: add pi-hole test container integration test (#649)
* test: add pi-hole test container integration test

* chore: improve waiting logic for test container

* refactor: improve structure of pi hole test

* fix: eslint does not recognize test directory to be part of tsconfig
2024-06-10 21:18:24 +02:00
Meier Lukas 8e4ba37f94 fix: login with revalidate path and wrong preferences link (#654) 2024-06-10 21:17:51 +02:00
Manuel 2e782ae442 feat: add homeassistant integration (#578) 2024-06-10 21:16:39 +02:00
homarr-renovate[bot] 19498854fc fix(deps): update dependency typescript-eslint to ^7.13.0 (#653)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-10 17:34:03 +00:00
homarr-renovate[bot] d985fbe69a fix(deps): update dependency drizzle-kit to ^0.22.7 (#652)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-10 14:38:11 +00:00
homarr-renovate[bot] 6fc27dfce4 chore(deps): update pnpm to v9.3.0 (#651)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-10 13:13:08 +00:00
homarr-renovate[bot] 83b4631cde chore(deps): update dependency @vitejs/plugin-react to ^4.3.1 (#650)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-10 01:49:14 +00:00
homarr-renovate[bot] 84851db333 fix(deps): update dependency @trpc/client to v11.0.0-rc.401 (#648)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-09 19:48:18 +00:00
SeDemal 0710425e78 feat: DNS Hole summary Scalability (#646) 2024-06-09 17:36:18 +02:00
SeDemal 28927cfa28 feat: App tile scalability (#645)
* feat: App tile scalability

* fix: missing translation
2024-06-09 12:54:56 +02:00
Meier Lukas 3a3a8251bd feat: improve user init setup (#643) 2024-06-08 23:35:48 +02:00
SeDemal bac09d8be5 feat: Clock widget scalability (#644) 2024-06-08 23:35:35 +02:00
Meier Lukas 2c1b52aff9 fix: gridstack not working (#642)
* fix: gridstack not working

* chore: remove unneccessary comments
2024-06-08 22:22:15 +02:00
Meier Lukas e46ea71bc2 fix: renovate config with json does not support comments (#641) 2024-06-08 21:38:44 +02:00
Meier Lukas fb92c3e95c fix: pnpm dev did not work caused by tsx update (#638)
* fix: pnpm dev did not work caused by tsx update

* fix: format issues
2024-06-08 21:28:28 +02:00
homarr-renovate[bot] 38c32cbece fix(deps): update dependency @tanstack/react-query-next-experimental to v5.41.0 (#639)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-08 19:19:39 +00:00
homarr-renovate[bot]andMeier Lukas 1bae7352dc chore(deps): update dependency eslint to v9 (#452)
* chore(deps): update dependency eslint to v9

* chore: migrate eslint to v9

* fix: dependency issues

* fix: unit tests not working

* chore: disable lint check for Image component that does not work in ci

* fix: lint issue

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-06-08 20:49:57 +02:00
Meier Lukas d7ecdf5567 feat: add simple app ping (#580)
* feat: add simple ping

* refactor: make ping run on server and show errors

* fix: format issues

* fix: missing translation for enabled ping option for app

* refactor: remove ping queue as no longer needed

* chore: address pull request feedback

* test: add some unit tests

* fix: format issues

* fix: deepsource issues
2024-06-08 17:33:16 +02:00
Thomas Camlong 3dca787fa7 chore: configure i18n ally (#606)
Note: TypeScript files are read-only https://github.com/lokalise/i18n-ally/wiki/Locale-Formats#supported-locale-formats
2024-06-08 17:32:46 +02:00
homarr-renovate[bot]andMeier Lukas 1f730ab786 chore(deps): update turbo monorepo to v2 (major) (#621)
* chore(deps): update turbo monorepo to v2

* chore: run codemod

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-06-08 17:28:15 +02:00
homarr-renovate[bot] a3b861e13c chore(deps): update dependency tsx to v4.14.0 (#637)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-08 12:14:49 +00:00
homarr-renovate[bot] 66ddb45975 fix(deps): update dependency drizzle-kit to ^0.22.6 (#636)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-08 11:20:54 +00:00
homarr-renovate[bot] 4de5ab5d41 chore(deps): update dependency tsx to v4.13.3 (#635)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-08 03:26:43 +00:00
homarr-renovate[bot] 475f472cb0 fix(deps): update dependency @trpc/client to v11.0.0-rc.396 (#634)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-07 20:33:39 +00:00
homarr-renovate[bot] efd958d6cb fix(deps): update dependency drizzle-orm to ^0.31.2 (#632)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-07 15:48:32 +00:00
homarr-renovate[bot] 246272669e fix(deps): update dependency drizzle-kit to ^0.22.5 (#631)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-07 15:34:23 +00:00
homarr-renovate[bot] 493c22f9da chore(deps): update dependency tsx to v4.13.2 (#630)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-07 10:29:53 +00:00
homarr-renovate[bot] 1d6745b142 chore(deps): update dependency tsx to v4.13.1 (#629)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-07 07:09:43 +00:00
homarr-renovate[bot] 309111c600 chore(deps): update dependency tsx to v4.13.0 (#628)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-07 03:28:32 +00:00
homarr-renovate[bot] 98078556c3 chore(deps): update dependency tsx to v4.12.1 (#627)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-07 02:28:54 +00:00
homarr-renovate[bot] 5bf1ddde4b fix(deps): update dependency @trpc/client to v11.0.0-rc.394 (#626)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-06 23:35:42 +00:00
homarr-renovate[bot] afa96349c5 chore(deps): update pnpm to v9.2.0 (#624)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-06 18:39:58 +00:00
homarr-renovate[bot] 1aabc4dfb2 chore(deps): update dependency tsx to v4.12.0 (#614)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-06 18:30:41 +00:00
homarr-renovate[bot] 8f551aa485 fix(deps): update dependency prettier to ^3.3.1 (#623)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-06 18:12:17 +00:00
homarr-renovate[bot] dda34e7764 fix(deps): update dependency drizzle-kit to ^0.22.4 (#625)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-06 17:48:14 +00:00
homarr-renovate[bot] 899060c234 chore(deps): update turbo monorepo to ^1.13.4 (#620)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-06 17:35:59 +00:00
homarr-renovate[bot] f1dbc4420f chore(deps): update dependency @types/node to ^20.14.2 (#622)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-06 17:27:56 +00:00
Manuel 251cedf111 ci: use app instead of personal token (#611) 2024-06-06 18:06:28 +02:00
SeDemal cfd8b328b4 feat: weather widget scalable (#574)
* refactor: Make weather widget scalable

* fix: formatting

* fix: map key again

* fix: null assertions
2024-06-05 21:26:59 +02:00
homarr-renovate[bot] 2623708c6d fix(deps): update typescript-eslint monorepo to ^7.12.0 (#616)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-04 21:06:15 +02:00
homarr-renovate[bot] 946ea8753f fix(deps): update tanstack-query monorepo to ^5.40.1 (#617)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-04 21:05:32 +02:00
homarr-renovate[bot] f5aaf89a3d fix(deps): update dependency drizzle-kit to ^0.22.2 (#618)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-04 21:04:24 +02:00
homarr-renovate[bot] 710197b3a0 fix(deps): update dependency drizzle-orm to ^0.31.1 (#619)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-04 21:03:47 +02:00
homarr-renovate[bot] d993e8d811 fix(deps): update dependency jotai to ^2.8.3 (#615)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-04 21:03:03 +02:00
homarr-renovate[bot] 381832685f chore(deps): update dependency @types/node to ^20.14.1 (#613)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-04 21:02:15 +02:00
homarr-renovate[bot] 812b8d8306 fix(deps): update dependency @trpc/client to v11.0.0-rc.390 (#609)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-03 19:09:01 +00:00
Manuel 2b5f873c00 ci: add rider run configuration (#610) 2024-06-02 18:24:29 +02:00
homarr-renovate[bot] 20874cb96d fix(deps): update dependency next-auth to v5.0.0-beta.19 (#605)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-02 09:24:32 +00:00
homarr-renovate[bot]andMeier Lukas dc3b00736e fix(deps): update dependency @auth/core to ^0.32.0 (#603)
* fix(deps): update dependency @auth/core to ^0.32.0

* fix(deps): update dependency @auth/core to ^0.32.0

* fix: type issues with next-auth types

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-06-02 11:01:10 +02:00
homarr-renovate[bot] 869efbc638 fix(deps): update dependency @trpc/client to v11.0.0-rc.383 (#608)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-02 08:48:14 +00:00
homarr-renovate[bot] 2e044ac871 fix(deps): update dependency @auth/drizzle-adapter to ^1.2.0 (#604)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-02 05:33:55 +00:00
homarr-renovate[bot] 04c02d886d chore(deps): update actions/checkout action to v4 (#595)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-01 23:19:54 +02:00
Manuel 2be1ae8011 ci: fix pull request description 2024-06-01 23:10:04 +02:00
Manuel 67d4899ed3 ci: add automerge label to create PR step 2024-06-01 23:04:49 +02:00
Manuel a6a6734097 ci: fix pr number target 2024-06-01 23:01:27 +02:00
Manuel 4ff39b26e9 ci: remove if condition from create PR step 2024-06-01 22:52:32 +02:00
Manuel 4b304c74bc ci: fix fetch depth (#599) 2024-06-01 22:47:10 +02:00
Manuel d08bdf3e2d ci: fix branch to compare tags (#598) 2024-06-01 22:33:41 +02:00
Manuel 7cc2736d68 fix: default branch for tag compare (#597) 2024-06-01 22:16:21 +02:00
Manuel 452308336a refactor: clean up workflows (#596) 2024-06-01 22:04:42 +02:00
Manuel 26146f4037 ci: add automatic release workflow (#583) 2024-06-01 21:46:12 +02:00
homarr-renovate[bot] b1b839fcd8 fix(deps): update dependency prettier to ^3.3.0 (#594)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-06-01 17:25:39 +00:00
homarr-renovate[bot] fef070c42c fix(deps): update dependency mantine-react-table to v2.0.0-beta.4 (#593)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-31 20:24:11 +00:00
homarr-renovate[bot] e832bfbbdb chore(deps): update dependency @types/node to ^20.13.0 (#592)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-31 19:48:14 +00:00
homarr-renovate[bot] 777473ee36 chore(deps): update dependency @types/node to ^20.12.14 (#591)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-31 19:20:05 +00:00
homarr-renovate[bot] 96150f802d fix(deps): update dependency better-sqlite3 to v11 (#587)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-31 20:33:37 +02:00
homarr-renovate[bot] 51fb7cb402 fix(deps): update dependency drizzle-kit to ^0.22.1 (#590)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-31 12:59:18 +00:00
homarr-renovate[bot] 3b39e87212 fix(deps): update dependency drizzle-orm to ^0.31.0 (#589)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-31 08:48:13 +00:00
homarr-renovate[bot] d16281bea7 fix(deps): update dependency drizzle-kit to ^0.22.0 (#588)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-31 08:38:31 +00:00
homarr-renovate[bot] 79d977c008 fix(deps): update dependency sass to ^1.77.4 (#586)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-31 00:40:30 +00:00
homarr-renovate[bot] ff84c2bdb7 fix(deps): update dependency mysql2 to v3.10.0 (#585)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-30 19:22:13 +00:00
homarr-renovate[bot] 6d46e91a7c fix(deps): update dependency better-sqlite3 to ^10.1.0 (#584)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-30 18:13:37 +00:00
homarr-renovate[bot] ec29d77186 chore(deps): update pnpm to v9.1.4 (#582)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-30 12:16:50 +00:00
homarr-renovate[bot] b12d109f6d fix(deps): update mantine monorepo to ^7.10.1 (#581)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-30 10:29:27 +00:00
homarr-renovate[bot] 169fecaba1 fix(deps): update dependency sass to ^1.77.3 (#579)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-29 22:28:30 +00:00
Thomas CamlongandMeier Lukas dd2937a0d6 feat: add docker container table (#520)
* WIP On docker integration

* WIP on adding docker support

* WIP on adding docker support

* chore: Add cacheTime parameter to createCacheChannel function

* bugfix: Add node-loader npm dependency for webpack configuration

* revert changes

* chore: Add node-loader npm dependency for webpack configuration

* feat: Add Docker container list to DockerPage

* chore: apply pr suggestions

* fix: fix printing issue using a Date objext

* chore: Update npm dependencies

* feat: Create DockerTable component for displaying Docker container list

* feat: Refactor DockerPage to use DockerTable component

* feat: Refactor DockerPage to use DockerTable component

* feat: Add useTimeAgo hook for displaying relative timestamps

* feat: Add hooks module to common package

* refactor: Update DockerTable component

Include container actions and state badges

* feat: add information about instance for docker containers

* feat: Add OverflowBadge component for displaying overflowed data

* feat: Refactor DockerSingleton to use host and instance properties

This commit refactors the DockerSingleton class in the `docker.ts` file to use the `host` and `instance` properties instead of the previous `key` and `remoteApi` properties. This change improves clarity and consistency in the codebase.

* feat: Add OverflowBadge component for displaying overflowed data

* feat: Improve DockerTable component with Avatar and Name column

This commit enhances the DockerTable component in the `DockerTable.tsx` file by adding an Avatar and Name column. The Avatar column displays an icon based on the Docker container's image, while the Name column shows the container's name. This improvement provides better visual representation and identification of the containers in the table.

* feat: Enhance DockerTable component with Avatar and Name columns

* refactor: improve docker table and icon resolution

* chore: address pull request feedback

* fix: format issues

* chore: add missing translations

* refactor: remove black background

---------

Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-05-29 21:57:02 +02:00
homarr-renovate[bot] e030e06a16 chore(deps): update actions/checkout action to v4 (#571)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-29 21:52:44 +02:00
homarr-renovate[bot] dc7f455fe7 chore(deps): update dependency @types/node to ^20.12.13 (#577)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-29 17:27:00 +00:00
homarr-renovate[bot] 612b8d8c6e fix(deps): update dependency mysql2 to v3.9.9 (#576)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-29 14:48:11 +00:00
homarr-renovate[bot] fe43e74c53 fix(deps): update dependency flag-icons to ^7.2.3 (#575)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-29 11:21:16 +00:00
homarr-renovate[bot] 2cb3e95593 chore(deps): update node.js to v20.14.0 (#573)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-29 03:48:21 +00:00
homarr-renovate[bot] 9e499bd30b fix(deps): update dependency eslint-plugin-react to ^7.34.2 (#567)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-29 03:35:19 +00:00
Meier Lukas c2185e3489 fix: renovate automatic approval typo no file extension (#572) 2024-05-29 05:17:52 +02:00
homarr-renovate[bot] e448eeb0a6 fix(deps): update dependency @trpc/client to v11.0.0-rc.382 (#568)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-28 20:24:49 +00:00
homarr-renovate[bot] deea531607 chore(deps): update dependency node to v20.14.0 (#569)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-28 21:40:23 +02:00
Manuel ba46b6f869 ci: add conventional commits workflow (#541) 2024-05-28 21:40:04 +02:00
Meier Lukas bcbc2d1c56 ci: add github action that approves pull requests from renovate automatically (#566) 2024-05-28 21:39:15 +02:00
homarr-renovate[bot] c20f7a64a0 fix(deps): update typescript-eslint monorepo to ^7.11.0 (#565)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-28 17:48:13 +00:00
homarr-renovate[bot] 6f47adff8a fix(deps): update dependency jotai to ^2.8.2 (#561)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-28 16:11:10 +00:00
homarr-renovate[bot] e325e1c02c chore(deps): update dependency jsdom to ^24.1.0 (#564)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-27 21:52:27 +02:00
homarr-renovate[bot] 12e30c392e chore(deps): update dependency @types/react to ^18.3.3 (#555)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-27 21:51:40 +02:00
homarr-renovate[bot] ad3ef4c313 fix(deps): update mantine monorepo to ^7.10.0 (#538)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-27 19:48:39 +00:00
homarr-renovate[bot] 116d9dda04 chore(deps): update pnpm to v9.1.3 (#559)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-27 21:26:32 +02:00
homarr-renovate[bot] 2bc0431e4e fix(deps): update typescript-eslint monorepo to ^7.10.0 (#562)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-27 21:26:01 +02:00
homarr-renovate[bot] 3f364caced fix(deps): update dependency mysql2 to v3.9.8 (#558)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-27 21:24:32 +02:00
homarr-renovate[bot] abdf9bc122 fix(deps): update dependency @trpc/client to v11.0.0-rc.377 (#553)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-27 21:23:48 +02:00
homarr-renovate[bot] a0322bfd99 fix(deps): update dependency glob to ^10.4.1 (#531)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-27 21:23:27 +02:00
homarr-renovate[bot] 8f50def4c9 fix(deps): update tanstack-query monorepo to ^5.40.0 (#552)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-27 19:09:15 +00:00
homarr-renovate[bot] 56b6d76f43 fix(deps): update dependency drizzle-kit to ^0.21.4 (#535)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-27 20:13:01 +02:00
homarr-renovate[bot] 6e655b7ad2 chore(deps): update dependency @vitejs/plugin-react to ^4.3.0 (#536)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-27 18:12:06 +00:00
Meier Lukas 4d1e4d55bc fix: typo in renovate config name (#557) 2024-05-27 18:05:31 +02:00
homarr-renovate[bot]andMeier Lukas 0ccf258a90 chore(deps): update dependency tsx to v4.11.0 (#537)
* chore(deps): update dependency tsx to v4.11.0

* fix: build not working

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-05-26 17:51:12 +02:00
homarr-renovate[bot] 98ebabc9ca chore(deps): update pnpm to v9.1.2 (#530)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-26 17:22:02 +02:00
homarr-renovate[bot] 30fe9fef84 fix(deps): update typescript-eslint monorepo to v7.10.0 (#529)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-26 17:20:48 +02:00
ManuelandMeier Lukas 7e64d39693 feat: add analytics (#528)
* feat: add analytics

* feat: send data to umami

* refactor: fix format

* fix: click behavior of switches

* refactor: format

* chore: rerun ci

---------

Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-05-26 17:18:25 +02:00
Meier Lukas d57b771a17 feat: add pi hole summary integration (#521)
* feat: add pi hole summary integration

* feat: add pi hole summary widget

* fix: type issues with integrations and integrationIds

* feat: add middleware for integrations and improve cache redis channel

* feat: add error boundary for widgets

* fix: broken lock file

* fix: format format issues

* fix: typecheck issue

* fix: deepsource issues

* fix: widget sandbox without error boundary

* chore: address pull request feedback

* chore: remove todo comment and created issue

* fix: format issues

* fix: deepsource issue
2024-05-26 17:13:34 +02:00
homarr-renovate[bot] 96c71aed6e chore(deps): update dependency @vitejs/plugin-react to v4.3.0 (#545)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-25 19:19:26 +00:00
homarr-renovate[bot] 1569862baf fix(deps): update dependency @homarr/gridstack to v1.0.2 (#542)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-25 19:08:36 +00:00
homarr-renovate[bot] cd09d54163 chore(deps): update dependency @types/react to v18.3.3 (#546)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-25 19:57:09 +02:00
homarr-renovate[bot] a029abe6f3 fix(deps): update tanstack-query monorepo to v5.38.0 (#551)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-25 19:56:55 +02:00
Manuel b76fa9d722 ci: report vitest code coverage (#549) 2024-05-25 19:56:24 +02:00
Manuel b678d4f951 ci: validate pr title (#550) 2024-05-25 19:56:11 +02:00
Manuel 4ef668c5ea ci: use semver workflow action (#548) 2024-05-25 19:56:02 +02:00
homarr-renovate[bot] 7b46d92d4f fix(deps): update dependency glob to v10.4.1 (#544)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-24 23:44:38 +02:00
Manuel 9e199b7dff config: format json hbs as json (#540) 2024-05-24 21:49:25 +02:00
homarr-renovate[bot] 114176ee17 chore(deps): update anothrnick/github-tag-action action to v1.69.0 (#348)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-23 16:42:18 +00:00
Manuel 3940d296f2 config; activate automerge (#539) 2024-05-23 18:15:53 +02:00
homarr-renovate[bot] 63f743175e fix(deps): update dependency @tabler/icons-react to ^3.5.0 (#532)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-23 17:53:51 +02:00
homarr-renovate[bot] f45fa50024 fix(deps): update dependency flag-icons to ^7.2.2 (#533)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-23 17:53:36 +02:00
homarr-renovate[bot] c668d0a765 fix(deps): update dependency jotai to ^2.8.1 (#534)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-23 17:53:22 +02:00
Meier Lukas e097cffe59 refactor: improve behaviour of edit mode when navigating away and back (#525) 2024-05-22 21:28:45 +02:00
Thomas Camlong 5a9e8edf70 feat: Add VOLUME instruction to Dockerfile (#527) 2024-05-20 17:34:16 +02:00
Thomas Camlong 048711fe05 chore: Update trpc logger info (#526)
It now includes the username of the person doing the tRPC request (because the user id is not enough)
2024-05-20 17:00:50 +02:00
Thomas Camlong f617c60916 Merge pull request #464 from homarr-labs/ajnart/fix-duplicate-users 2024-05-19 23:44:46 +02:00
Meier Lukas c3b2215c7a Merge branch 'dev' into ajnart/fix-duplicate-users 2024-05-19 23:08:04 +02:00
homarr-renovate[bot] eb0db3ec4e fix(deps): update dependency @trpc/client to v11.0.0-rc.374 (#522)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-19 23:02:09 +02:00
Meier Lukas 26b1c4a319 feat: add custom css for board and custom classes in advanced options for items (#512)
* feat: add custom css for board and custom classes in advanced options for items

* chore: add mysql migration

* fix: test not working

* fix: format issues

* fix: typecheck issue

* fix: build issue

* chore: add missing translations

* fix: merge issues related to migrations

* fix: format issues

* fix: merge issue with migration

* fix: format issue
2024-05-19 23:01:26 +02:00
Thomas CamlongandMeier Lukas f1b1ec59ec chore: update prettier configuration for print width (#519)
* feat: update prettier configuration for print width

* chore: apply code formatting to entire repository

* fix: remove build files

* fix: format issue

---------

Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-05-19 22:38:39 +02:00
Manuel 919161798e feat: add server settings (#487)
* feat: add server settings

* feat: remove old migration

* feat: add new migrations

* refactor: format

* fix: build error

* refactor: format

* fix: lint
2024-05-19 22:29:15 +02:00
Meier Lukas d9f5158662 perf: improve typescript performance (#523) 2024-05-19 19:55:44 +02:00
Meier Lukas 7e339c09c8 feat: add home board for users (#505)
* feat: add home board for users

* fix: format issues

* fix: deepsource issue

* chore: address pull request feedback

* fix: typecheck issue
2024-05-18 16:57:00 +02:00
Meier Lukas dfed804f65 feat: add i18n translated form errors (#509) 2024-05-18 16:55:08 +02:00
homarr-renovate[bot] b312032f02 fix(deps): update tanstack-query monorepo to ^5.37.1 (#513)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-18 16:44:35 +02:00
Thomas Camlong a29cc78acd Merge pull request #517 from homarr-labs/create-cache-channel 2024-05-18 15:48:56 +02:00
homarr-renovate[bot] abffc866c0 fix(deps): update mantine monorepo to ^7.9.2 (#510)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-18 15:32:25 +02:00
homarr-renovate[bot] dc9a8dd9c6 chore(deps): update dependency tsx to v4.10.5 (#507)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-18 15:31:34 +02:00
homarr-renovate[bot] 7664b00be0 fix(deps): update dependency sass to ^1.77.2 (#506)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-18 15:30:22 +02:00
Meier Lukas e05deef6e2 feat: add redis cache channel 2024-05-18 15:28:05 +02:00
Manuel 31c2694185 feat: language selector (#484)
* feat: language selector

* refactor: move user general page

* feat: language selector

* refactor: move user general page

* feat: add language combobox in user general
2024-05-18 13:54:43 +02:00
Meier Lukas 7fa120c474 fix: create user async is called twice 2024-05-18 13:50:25 +02:00
Meier Lukas f30f133bfa Merge branch 'dev' into ajnart/fix-duplicate-users 2024-05-18 13:49:25 +02:00
Meier Lukas f0891dda31 Merge branch 'dev' into ajnart/fix-duplicate-users 2024-05-18 13:47:25 +02:00
Meier Lukas 8e8f9081b0 fix: when no dead icons, all icons are removed (#516) 2024-05-18 13:12:16 +02:00
Manuel dcaff1d91c feat: add async suffix eslint rule (#485) 2024-05-18 12:25:33 +02:00
Meier Lukas 5723295856 fix: mantine react table style issue (#508) 2024-05-17 21:42:45 +02:00
homarr-renovate[bot] 1abf441cdb fix(deps): update dependency @trpc/client to v11.0.0-rc.373 (#493)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-16 21:55:05 +02:00
homarr-renovate[bot] db48615096 chore(deps): update dependency tsx to v4.10.3 (#490)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-16 21:46:40 +02:00
homarr-renovate[bot] 8166fdb8e2 fix(deps): update dependency drizzle-kit to ^0.21.2 (#495)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-16 21:43:29 +02:00
Thomas Camlong ff3244d9ac Update run.sh (#498) 2024-05-16 21:26:07 +02:00
Meier Lukas 9a73b13ae5 chore: fix db studio command not working (#503)
* chore: fix db studio command not working

* fix: format issue
2024-05-16 21:12:59 +02:00
homarr-renovate[bot] 023feafafe fix(deps): update tanstack-query monorepo to ^5.36.2 (#496)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-16 21:11:36 +02:00
homarr-renovate[bot] 1b6a9c5aee chore(deps): update dependency @types/node to ^20.12.12 (#492)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-16 21:10:36 +02:00
homarr-renovate[bot] 3fe1a19e37 fix(deps): update dependency @tabler/icons-react to ^3.4.0 (#501)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-16 21:10:04 +02:00
Meier Lukas 669a79ef08 style: improve styling of items on board (#504)
style: improve styling of items on board by defining margin depending on screen size, removing general padding on card of items and reducing size of no app icon
2024-05-16 18:48:20 +02:00
Meier Lukas 333dc571fa perf: improve performance of icon updater from 10s to 300ms (#502) 2024-05-16 17:06:03 +02:00
Manuel f329e2a393 config: fix db push command (#497) 2024-05-15 21:14:27 +02:00
homarr-renovate[bot] a702f7dc67 fix(deps): update typescript-eslint monorepo to ^7.9.0 (#491)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-14 21:59:12 +02:00
homarr-renovate[bot] 8b84695079 fix(deps): update dependency mantine-react-table to v2.0.0-beta.3 (#488)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-14 21:58:45 +02:00
homarr-renovate[bot] 18d1aa6fcd chore(deps): update pnpm to v9.1.1 (#489)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-14 21:50:28 +02:00
homarr-renovate[bot] b18b364270 fix(deps): update tiptap monorepo to v2.4.0 (#494)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-14 21:47:18 +02:00
Manuel 87fe03dd00 feat: add hero banner (#463) 2024-05-12 18:19:01 +02:00
homarr-renovate[bot] 1570faa20a fix(deps): update tanstack-query monorepo to ^5.36.0 (#481)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-12 16:32:21 +02:00
homarr-renovate[bot] 143db86b77 chore(deps): update dependency tsx to v4.10.1 (#480)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-12 16:31:43 +02:00
Meier Lukas fd44ee48f4 fix: rdb files can not be saved because of permission issues bug: redis can not save RDB files #318 (#472)
* fix: rdb files can not be saved because of permission issues bug: redis can not save RDB files #318

* refactor: move db and redis dumps to /appdata directory
2024-05-12 16:28:44 +02:00
Meier Lukas db01301845 feat: user preferences (#470)
* wip: improve user preferences

* wip: fix translations and add user danger zone

* feat: add user delete button to danger zone

* fix: test not working

* refactor: add access checks for user edit page, improve not found behaviour, change user preference link in avatar menu to correct link

* fix: remove invalid bg for container

* chore: address pull request feedback
2024-05-12 16:27:56 +02:00
homarr-renovate[bot] f0da1d81a6 fix(deps): update dependency better-sqlite3 to v10 (#479)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-12 10:18:54 +02:00
homarr-renovate[bot] 333b124f67 fix(deps): update dependency glob to ^10.3.15 (#478)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-12 10:17:41 +02:00
Meier Lukas 94af21abbf feat: add user invite registration (#477) 2024-05-12 10:04:20 +02:00
Thomas Camlong fe7de2cf6d Merge branch 'dev' into ajnart/fix-duplicate-users 2024-05-12 01:02:07 +02:00
homarr-renovate[bot] 82d41abf46 fix(deps): update dependency @auth/drizzle-adapter to ^1.1.0 (#474)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-11 23:12:22 +02:00
homarr-renovate[bot]andMeier Lukas 95ddd03763 fix(deps): update dependency @auth/core to ^0.31.0 (#473)
* fix(deps): update dependency @auth/core to ^0.31.0

* fix: typecheck issue

* fix: more issues with types

* fix: add newest next-auth beta version as types were changed and depend on each other

* fix: format issues

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-05-11 22:44:00 +02:00
homarr-renovate[bot] 99114f0727 chore(deps): update dependency tsx to v4.10.0 (#476)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-11 22:24:15 +02:00
homarr-renovate[bot] d970cb54f5 chore(deps): update dependency @types/react to ^18.3.2 (#471)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-11 13:01:01 +02:00
homarr-renovate[bot] cb6f754492 fix(deps): update dependency sass to ^1.77.1 (#469)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-11 13:00:36 +02:00
homarr-renovate[bot] 8dd5987e5e chore(deps): update dependency tsx to v4.9.4 (#467)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-11 11:03:04 +02:00
homarr-renovate[bot] 627f8957e5 fix(deps): update dependency mantine-react-table to v2.0.0-beta.2 (#466)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-11 10:58:45 +02:00
homarr-renovate[bot] 8e6d143edc fix(deps): update tanstack-query monorepo to ^5.35.5 (#465)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-11 10:50:51 +02:00
homarr-renovate[bot]andMeier Lukas 1ce6fb0d0f fix(deps): update dependency drizzle-kit to ^0.21.1 (#462)
* fix(deps): update dependency drizzle-kit to ^0.21.0

* fix(deps): update dependency drizzle-kit to ^0.21.1

* fix: migrate to drizzle kit 0.21

* fix: format issues

* feat: add default env variables for db dialect and driver

* fix: issue with driver seems to be fixed

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-05-10 23:46:01 +02:00
ajnart 0008ceffed Fix prettier 2024-05-10 20:05:18 +02:00
ajnart 543bfc0835 Fix profile accordion error display 2024-05-10 20:02:57 +02:00
Thomas Camlong 6e2bd0ce11 fix: Handle existing user when editing profile 2024-05-10 15:24:40 +02:00
Thomas Camlong f5d71aebb4 Add successful profile edit message 2024-05-10 15:24:20 +02:00
Thomas Camlong 0ae8a75a5e feat: cannot change username to the current one 2024-05-10 15:23:57 +02:00
Thomas Camlong 65025a5dda fix: Update check for user existence 2024-05-10 14:24:35 +02:00
Thomas Camlong c2026d0962 refactor: Update UserCreateStepperComponent
To use ErrorDisplay component
2024-05-10 14:16:45 +02:00
Thomas Camlong 245c2f483c feat: Add ErrorDisplay component 2024-05-10 14:16:24 +02:00
Thomas Camlong 781247de51 feat: add username validation to prevent duplicate 2024-05-10 13:39:21 +02:00
Thomas Camlong 400fa3d480 propose forcing lowercase usernames 2024-05-10 13:36:46 +02:00
homarr-renovate[bot] 2434e2e758 chore(deps): update dependency node to v20.13.1 (#458)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-10 11:22:07 +02:00
homarr-renovate[bot] 48d7aaaf1d fix(deps): update mantine monorepo to ^7.9.1 (#457)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-10 11:21:02 +02:00
homarr-renovate[bot] 687556ad96 fix(deps): update dependency zod to ^3.23.8 (#460)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-09 21:35:33 +02:00
homarr-renovate[bot] 8bd08d39ca fix(deps): update dependency glob to ^10.3.14 (#461)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-09 21:35:15 +02:00
homarr-renovate[bot] 382be496ff fix(deps): update tiptap monorepo to v2.3.2 (#459)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-08 19:15:27 +02:00
homarr-renovate[bot] 1172d84223 fix(deps): update dependency @trpc/client to v11.0.0-rc.366 (#454)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-08 06:26:48 +02:00
homarr-renovate[bot] cd4762377a chore(deps): update dependency node (#455)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-08 06:07:24 +02:00
homarr-renovate[bot] cab34052f9 fix(deps): update dependency zod to ^3.23.7 (#456)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-08 06:01:34 +02:00
homarr-renovate[bot] 442d45dd15 chore(deps): update dependency dotenv-cli to ^7.4.2 (#453)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-07 16:16:07 +02:00
homarr-renovate[bot] 3ae96d94a2 fix(deps): update dependency sass to ^1.77.0 (#451)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-07 06:26:12 +02:00
homarr-renovate[bot] 5eb1d716de fix(deps): update dependency drizzle-kit to ^0.20.18 (#449)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-06 21:38:32 +02:00
homarr-renovate[bot] 25ce74a82f chore(deps): update pnpm to v9.1.0 (#447)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-06 21:37:27 +02:00
homarr-renovate[bot] 5ae7bc957c chore(deps): update dependency @types/node to ^20.12.10 (#448)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-06 21:35:09 +02:00
homarr-renovate[bot] 35ba58a0d9 chore(deps): update dependency tsx to v4.9.3 (#435)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-06 21:34:41 +02:00
Meier Lukas c88464498f fix: unable to select integration on board page (#450) 2024-05-06 21:12:55 +02:00
Manuel dc0184af07 feat: log sql queries (#444) 2024-05-06 20:14:51 +02:00
ManuelandMeier Lukas 3cda718474 feat: add contributors to about page (#445)
* feat: add contributors to about page

* fix: remove unnecessary client component for generic-contribution-link-card

---------

Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-05-06 20:10:40 +02:00
homarr-renovate[bot] 96158bcb5e fix(deps): update tanstack-query monorepo to ^5.35.1 (#446)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-06 12:03:38 +02:00
Meier Lukas 5d30301b95 feat: show creator on board page (#440) 2024-05-05 22:20:51 +02:00
Meier Lukas 7b31684c84 feat: add job on start option for icons updater (#442) 2024-05-05 22:20:38 +02:00
Meier Lukas 4b80b16b53 fix: integration links in manage section do not work (#441) 2024-05-05 22:20:18 +02:00
homarr-renovate[bot] 08d1b6c638 fix(deps): update tanstack-query monorepo to ^5.34.2 (#439)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-05 15:00:47 +02:00
Manuel 60a35e2583 feat: #420 reimplement icon picker (#421) 2024-05-04 23:00:15 +02:00
Manuel 51aaab2f23 feat: add login and logout (#436) 2024-05-04 22:57:13 +02:00
891 changed files with 93070 additions and 12800 deletions

No files matched your search

+2 -1
View File
@@ -5,4 +5,5 @@ npm-debug.log
README.md
.next
.git
dev
dev
.build
-2
View File
@@ -20,8 +20,6 @@ DB_URL='FULL_PATH_TO_YOUR_SQLITE_DB_FILE'
# DB_PASSWORD='password'
# DB_NAME='name-of-database'
# @see https://next-auth.js.org/configuration/options#nextauth_url
AUTH_URL='http://localhost:3000'
# You can generate the secret via 'openssl rand -base64 32' on Unix
# @see https://next-auth.js.org/configuration/options#secret
-15
View File
@@ -1,15 +0,0 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["config:recommended"],
"packageRules": [
{
"matchPackagePatterns": ["^@homarr/"],
"enabled": false
}
],
"updateInternalDeps": true,
"rangeStrategy": "bump",
"automerge": false,
"baseBranches": ["dev"],
"dependencyDashboard": false
}
+19
View File
@@ -0,0 +1,19 @@
{
$schema: "https://docs.renovatebot.com/renovate-schema.json",
extends: ["config:recommended"],
packageRules: [
{
matchPackagePatterns: ["^@homarr/"],
enabled: false,
},
{
matchUpdateTypes: ["minor", "patch", "pin", "digest"],
automerge: true,
},
],
updateInternalDeps: true,
rangeStrategy: "bump",
automerge: false,
baseBranches: ["dev"],
dependencyDashboard: false,
}
-31
View File
@@ -1,31 +0,0 @@
name: Build apps and migration script
on:
pull_request:
branches: ["*"]
push:
branches: ["main"]
merge_group:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
env:
FORCE_COLOR: 3
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup
uses: ./tooling/github/setup
- name: Copy env
shell: bash
run: cp .env.example .env
- name: Build
run: pnpm build
+20 -2
View File
@@ -1,4 +1,4 @@
name: Code quality analysis
name: "[Quality] Code Analysis"
on:
pull_request:
@@ -8,7 +8,7 @@ on:
merge_group:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
group: "${{ github.workflow }}-${{ github.ref }}"
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
# You can leverage Vercel Remote Caching with Turbo to speed up your builds
@@ -66,3 +66,21 @@ jobs:
- name: Test
run: pnpm test
- name: 'Report Coverage'
# Set if: always() to also generate the report if tests are failing
# Only works if you set `reportOnFailure: true` in your vite config as specified above
if: always()
uses: davelosert/vitest-coverage-report-action@v2
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup
uses: ./tooling/github/setup
- name: Copy env
shell: bash
run: cp .env.example .env
- name: Build
run: pnpm build
@@ -0,0 +1,14 @@
# https://github.com/webiny/action-conventional-commits?tab=readme-ov-file
name: "[Conventions] Semantic Commits"
on:
pull_request:
branches: [ dev ]
jobs:
build:
name: Conventional Commits
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: webiny/action-conventional-commits@v1.3.0
@@ -0,0 +1,19 @@
name: "[Conventions] Semantic PRs"
on:
pull_request_target:
types:
- opened
- edited
- synchronize
permissions:
pull-requests: read
jobs:
validate-pull-request-title:
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@v5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,135 @@
name: "[Deployment] Release"
on:
push:
branches:
- main
workflow_dispatch:
inputs:
send-notifications:
type: boolean
required: false
default: true
description: Send notifications
push-image:
type: boolean
required: false
default: true
description: Push Docker Image
permissions:
contents: write
packages: write
env:
SKIP_ENV_VALIDATION: true
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
TURBO_TELEMETRY_DISABLED: 1
concurrency: production
jobs:
deploy:
name: Deploy docker image
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [20]
steps:
- name: Discord notification
if: ${{ github.events.inputs.send-notifications != false }}
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@master
with:
args: "Deployment of an image has been triggered: [run ${{ github.run_number }}](<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}>)"
- uses: actions/checkout@v4
- name: Get Next Version
id: semver
uses: ietf-tools/semver-action@v1
with:
token: ${{ github.token }}
branch: dev
- name: Discord notification
if: ${{ github.events.inputs.send-notifications != false }}
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@master
with:
args: "Semver computed next tag to be ${{ steps.semver.outputs.next }}. Current is ${{ steps.semver.outputs.current }}"
- uses: pnpm/action-setup@v2
with:
version: 8
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- name: Discord notification
if: ${{ github.events.inputs.send-notifications != false }}
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@master
with:
args: "Built application artifacts. Building images..."
- name: Log in to the Container registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: "${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}"
tags: |
type=raw,value=alpha
type=raw,value=early-adopters
# tags: |
# type=raw,value=latest
# type=raw,value=${{ steps.semver.outputs.next }}
- name: Build and push
id: buildPushAction
uses: docker/build-push-action@v6
if: ${{ github.events.inputs.push-image == 'true' || github.events.inputs.push-image == null }}
with:
platforms: linux/amd64,linux/arm64
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
network: host
env:
SKIP_ENV_VALIDATION: true
- name: Build
id: buildPushDryAction
uses: docker/build-push-action@v6
if: ${{ github.events.inputs.push-image == 'false' }}
with:
platforms: linux/amd64,linux/arm64
context: .
push: false
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
network: host
env:
SKIP_ENV_VALIDATION: true
- name: Discord notification
if: ${{ github.events.inputs.send-notifications != false && (github.events.inputs.push-image == 'true' || github.events.inputs.push-image == null) }}
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@master
with:
args: "Deployment of image has completed. Image ID is '${{ steps.buildPushAction.outputs.imageid }}'."
- name: Discord notification
if: ${{ github.events.inputs.send-notifications != false && !(github.events.inputs.push-image == 'true' || github.events.inputs.push-image == null) }}
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@master
with:
args: "Deployment of image has completed. Image ID is '${{ steps.buildPushDryAction.outputs.imageid }}'. This was a dry run."
@@ -0,0 +1,101 @@
name: "[Deployment] Automatic Weekly Release"
on:
schedule:
- cron: "0 19 * * 5" # https://crontab.guru/#0_19_*_*_5
workflow_dispatch:
inputs:
send-notifications:
type: boolean
required: false
default: true
description: Send notifications
permissions:
contents: write
pull-requests: write
jobs:
create-and-merge-pr:
runs-on: ubuntu-latest
steps:
- name: Discord notification
if: ${{ github.events.inputs.send-notifications }}
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@master
with:
args: "Automatic release has been triggered: [run ${{ github.run_number }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})"
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Get Next Version
id: semver
uses: ietf-tools/semver-action@v1
with:
token: ${{ github.token }}
branch: dev
- name: Create pull request
run: "gh pr create --title \"chore(release): automatic release ${{ steps.semver.outputs.next }}\" --body \"**This is an automatic release**.<br/>Manual action may be required for major bumps.<br/>Detected change to be ``${{ steps.semver.outputs.bump }}``<br/>Bump version from ``${{ steps.semver.outputs.current }}`` to ``${{ steps.semver.outputs.next }}``\" --base main --head dev --label automerge"
env:
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
- name: Discord notification
if: ${{ github.events.inputs.send-notifications }}
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@master
with:
args: "Created a release PR ${{ steps.create-pull-request.outputs.url }} for version ${{ steps.semver.outputs.next }} (new behaviour: ${{ steps.semver.outputs.bump }})"
- name: Obtain token
id: obtainApprovalToken
uses: tibdex/github-app-token@v2
with:
private_key: ${{ secrets.RENOVATE_APPROVE_PRIVATE_KEY }}
app_id: ${{ secrets.RENOVATE_APPROVE_APP_ID }}
- name: Approve PR
env:
GITHUB_TOKEN: ${{ steps.obtainApprovalToken.outputs.token }}
run: |
gh pr review --approve --body "Automatically approved by GitHub Action"
- name: Obtain token
id: obtainMergeToken
uses: tibdex/github-app-token@v2
with:
private_key: ${{ secrets.RENOVATE_MERGE_PRIVATE_KEY }}
app_id: ${{ secrets.RENOVATE_MERGE_APP_ID }}
- id: automerge
if: ${{ steps.semver.outputs.bump != 'major' }}
name: automerge
uses: "pascalgn/automerge-action@v0.16.4"
env:
GITHUB_TOKEN: ${{ steps.obtainMergeToken.outputs.token }}
MERGE_METHOD: merge # we prefer merge commits for merging to master
MERGE_COMMIT_MESSAGE: "chore(release): automatic release ${{ steps.semver.outputs.next }}"
MERGE_DELETE_BRANCH: false # never set to true!
PULL_REQUEST: "${{ steps.create-pull-request.outputs.pr_number }}"
MERGE_RETRIES: 20 # 20 retries * MERGE_RETRY_SLEEP until step fails
MERGE_RETRY_SLEEP: 10000 # 10 seconds * MERGE_RETRIES until step fails
MERGE_REQUIRED_APPROVALS: 0 # do not require approvals
- name: Merged Discord notification
if: ${{ steps.automerge.outputs.mergeResult == 'merged' && github.events.inputs.send-notifications }}
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@master
with:
args: "Merged PR ${{ steps.create-pull-request.outputs.url }} for release ${{ steps.semver.outputs.next }}"
- name: Major Bump Discord notification
if: ${{ steps.semver.outputs.bump == 'major' && github.events.inputs.send-notifications }}
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@master
with:
args: "The release PR must be manually merged because the next version is a major version: ${{ steps.create-pull-request.outputs.url }} for release ${{ steps.semver.outputs.next }}"
- name: Discord Fail Notification
if: failure() && github.events.inputs.send-notifications
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@master
with:
args: "The automatic release workflow [run ${{ github.run_number }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) has failed"
-89
View File
@@ -1,89 +0,0 @@
name: Docker image
on:
pull_request:
types:
- closed
branches:
- main
workflow_dispatch: {}
permissions:
contents: write
packages: write
env:
TURBO_TELEMETRY_DISABLED: 1
concurrency: production
jobs:
deploy:
name: Deploy docker image
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [20]
steps:
- name: Discord notification
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@master
with:
args: "Deployment of an image has been triggered"
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v2
with:
version: 8
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: "pnpm"
- name: Install dependencies
run: pnpm install
- name: Build artifacts
run: pnpm build
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Bump version and push tag
id: githubTagAction
uses: anothrNick/github-tag-action@1.67.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
WITH_V: false
DRY_RUN: true
- name: Discord notification
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@master
with:
args: "Image has been tagged as ${{ steps.githubTagAction.outputs.new_tag }}"
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=raw,value=latest
type=raw,value=${{ steps.githubTagAction.outputs.new_tag }}
- name: Build and push
id: buildPushAction
uses: docker/build-push-action@v5
with:
platforms: linux/amd64,linux/arm64,linux/riscv64,linux/arm/v7,linux/arm/v6
context: .
push: false
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
network: host
- name: Discord notification
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@master
with:
args: "Image built with ID ${{ steps.buildPushAction.outputs.imageid }}"
@@ -0,0 +1,25 @@
name: "[Dependency Updates] Auto Approve"
on:
pull_request:
types: [opened, synchronize]
jobs:
approve-renovate-prs:
runs-on: ubuntu-latest
if: github.actor_id == 158783068 # Id of renovate bot see https://api.github.com/users/homarr-renovate%5Bbot%5D
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Obtain token
id: obtainToken
uses: tibdex/github-app-token@v2
with:
private_key: ${{ secrets.RENOVATE_APPROVE_PRIVATE_KEY }}
app_id: ${{ secrets.RENOVATE_APPROVE_APP_ID }}
- name: Install GitHub CLI
run: sudo apt-get install -y gh
- name: Approve Renovate PRs
env:
GITHUB_TOKEN: ${{ steps.obtainToken.outputs.token }}
run: |
gh pr review ${{github.event.pull_request.number}} --approve --body "Automatically approved by GitHub Action"
+13 -4
View File
@@ -14,8 +14,8 @@ coverage
out/
next-env.d.ts
# nest.js
apps/nestjs/dist
# artifacts
packages/db/migrations/*/migrate.cjs
# nitro
.nitro/
@@ -48,7 +48,16 @@ yarn-error.log*
.turbo
# database
db.sqlite
*.sqlite
# logs
*.log
*.log
apps/tasks/tasks.cjs
apps/websocket/wssServer.cjs
apps/nextjs/.million/
packages/cli/cli.cjs
#personal backgrounds
apps/nextjs/public/images/background.png
+1 -1
View File
@@ -1 +1 @@
20.12.2
20.18.0
+13
View File
@@ -0,0 +1,13 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="db:migration:mysql:generate" type="js.build_tools.npm">
<package-json value="$PROJECT_DIR$/package.json" />
<command value="run" />
<scripts>
<script value="db:migration:mysql:generate" />
</scripts>
<node-interpreter value="project" />
<package-manager value="pnpm" />
<envs />
<method v="2" />
</configuration>
</component>
+13
View File
@@ -0,0 +1,13 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="db:migration:sqlite:generate" type="js.build_tools.npm">
<package-json value="$PROJECT_DIR$/package.json" />
<command value="run" />
<scripts>
<script value="db:migration:sqlite:generate" />
</scripts>
<node-interpreter value="project" />
<package-manager value="pnpm" />
<envs />
<method v="2" />
</configuration>
</component>
+13
View File
@@ -0,0 +1,13 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="db:push" type="js.build_tools.npm">
<package-json value="$PROJECT_DIR$/package.json" />
<command value="run" />
<scripts>
<script value="db:push" />
</scripts>
<node-interpreter value="project" />
<package-manager value="pnpm" />
<envs />
<method v="2" />
</configuration>
</component>
+13
View File
@@ -0,0 +1,13 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="db:studio" type="js.build_tools.npm">
<package-json value="$PROJECT_DIR$/package.json" />
<command value="run" />
<scripts>
<script value="db:studio" />
</scripts>
<node-interpreter value="project" />
<package-manager value="pnpm" />
<envs />
<method v="2" />
</configuration>
</component>
+13
View File
@@ -0,0 +1,13 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="dev" type="js.build_tools.npm" nameIsGenerated="true">
<package-json value="$PROJECT_DIR$/package.json" />
<command value="run" />
<scripts>
<script value="dev" />
</scripts>
<node-interpreter value="project" />
<package-manager value="pnpm" />
<envs />
<method v="2" />
</configuration>
</component>
+13
View File
@@ -0,0 +1,13 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="docker:dev" type="js.build_tools.npm">
<package-json value="$PROJECT_DIR$/package.json" />
<command value="run" />
<scripts>
<script value="docker:dev" />
</scripts>
<node-interpreter value="project" />
<package-manager value="pnpm" />
<envs />
<method v="2" />
</configuration>
</component>
+13
View File
@@ -0,0 +1,13 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="format" type="js.build_tools.npm">
<package-json value="$PROJECT_DIR$/package.json" />
<command value="run" />
<scripts>
<script value="format" />
</scripts>
<node-interpreter value="project" />
<package-manager value="pnpm" />
<envs />
<method v="2" />
</configuration>
</component>
+13
View File
@@ -0,0 +1,13 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="format:fix" type="js.build_tools.npm">
<package-json value="$PROJECT_DIR$/package.json" />
<command value="run" />
<scripts>
<script value="format:fix" />
</scripts>
<node-interpreter value="project" />
<package-manager value="pnpm" />
<envs />
<method v="2" />
</configuration>
</component>
+13
View File
@@ -0,0 +1,13 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="test" type="js.build_tools.npm">
<package-json value="$PROJECT_DIR$/package.json" />
<command value="run" />
<scripts>
<script value="test" />
</scripts>
<node-interpreter value="project" />
<package-manager value="pnpm" />
<envs />
<method v="2" />
</configuration>
</component>
+13
View File
@@ -0,0 +1,13 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="test:ui" type="js.build_tools.npm">
<package-json value="$PROJECT_DIR$/package.json" />
<command value="run" />
<scripts>
<script value="test:ui" />
</scripts>
<node-interpreter value="project" />
<package-manager value="pnpm" />
<envs />
<method v="2" />
</configuration>
</component>
+2 -1
View File
@@ -2,6 +2,7 @@
"recommendations": [
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"yoavbls.pretty-ts-errors"
"yoavbls.pretty-ts-errors",
"million.million-lint"
]
}
+24 -3
View File
@@ -4,11 +4,32 @@
"mode": "auto"
}
],
"eslint.experimental.useFlatConfig": true,
"typescript.tsdk": "node_modules\\typescript\\lib",
"js/ts.implicitProjectConfig.experimentalDecorators": true,
"prettier.configPath": "./tooling/prettier/index.mjs",
"cSpell.words": [
"superjson",
"ajnart",
"cqmin",
"gridstack",
"homarr",
"trpc"
]
"jellyfin",
"mantine",
"manuel-rw",
"Meierschlumpf",
"overseerr",
"Sabnzbd",
"SeDemal",
"Sonarr",
"superjson",
"tabler",
"trpc",
"Umami"
],
"i18n-ally.dirStructure": "auto",
"i18n-ally.enabledFrameworks": ["next-international"],
"i18n-ally.localesPaths": ["./packages/translation/src/lang/"],
"i18n-ally.enabledParsers": ["ts"],
"i18n-ally.extract.keyMaxLength": 0,
"i18n-ally.keystyle": "flat"
}
+53 -17
View File
@@ -1,8 +1,9 @@
FROM node:20.12.2-alpine AS base
FROM node:20.18.0-alpine AS base
FROM base AS builder
RUN apk add --no-cache libc6-compat
RUN apk update
# Set working directory
WORKDIR /app
COPY . .
@@ -11,6 +12,7 @@ RUN turbo prune @homarr/nextjs --docker --out-dir ./next-out
RUN turbo prune @homarr/tasks --docker --out-dir ./tasks-out
RUN turbo prune @homarr/websocket --docker --out-dir ./websocket-out
RUN turbo prune @homarr/db --docker --out-dir ./migration-out
RUN turbo prune @homarr/cli --docker --out-dir ./cli-out
# Add lockfile and package.json's of isolated subworkspace
FROM base AS installer
@@ -22,19 +24,19 @@ WORKDIR /app
COPY .gitignore .gitignore
COPY --from=builder /app/tasks-out/json/ .
COPY --from=builder /app/tasks-out/pnpm-lock.yaml ./pnpm-lock.yaml
RUN corepack enable pnpm && pnpm install
COPY --from=builder /app/websocket-out/json/ .
COPY --from=builder /app/websocket-out/pnpm-lock.yaml ./pnpm-lock.yaml
RUN corepack enable pnpm && pnpm install
COPY --from=builder /app/migration-out/json/ .
COPY --from=builder /app/migration-out/pnpm-lock.yaml ./pnpm-lock.yaml
RUN corepack enable pnpm && pnpm install
COPY --from=builder /app/cli-out/json/ .
COPY --from=builder /app/next-out/json/ .
COPY --from=builder /app/next-out/pnpm-lock.yaml ./pnpm-lock.yaml
COPY --from=builder /app/pnpm-lock.yaml ./pnpm-lock.yaml
# Is used for postinstall of docs definitions
COPY --from=builder /app/packages/definitions/src/docs ./packages/definitions/src/docs
# Uses the lockfile to install the dependencies
RUN corepack enable pnpm && pnpm install --recursive --frozen-lockfile
# Install sharp for image optimization
RUN corepack enable pnpm && pnpm install sharp -w
# Build the project
@@ -42,17 +44,45 @@ COPY --from=builder /app/tasks-out/full/ .
COPY --from=builder /app/websocket-out/full/ .
COPY --from=builder /app/next-out/full/ .
COPY --from=builder /app/migration-out/full/ .
ARG SKIP_ENV_VALIDATION=true
RUN corepack enable pnpm && pnpm turbo run build
COPY --from=builder /app/cli-out/full/ .
# Copy static data as it is not part of the build
COPY static-data ./static-data
ARG SKIP_ENV_VALIDATION='true'
ARG CI='true'
ARG DISABLE_REDIS_LOGS='true'
RUN corepack enable pnpm && pnpm build
FROM base AS runner
WORKDIR /app
RUN apk add --no-cache redis
# gettext is required for envsubst
RUN apk add --no-cache redis nginx bash gettext
RUN mkdir /appdata
RUN mkdir /appdata/db
RUN mkdir /appdata/redis
VOLUME /appdata
RUN mkdir /secrets
VOLUME /secrets
# Don't run production as root
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
# Enable homarr cli
COPY --from=installer --chown=nextjs:nodejs /app/packages/cli/cli.cjs /app/apps/cli/cli.cjs
RUN echo $'#!/bin/bash\ncd /app/apps/cli && node ./cli.cjs "$@"' > /usr/bin/homarr
RUN chmod +x /usr/bin/homarr
# Don't run production as root
RUN chown -R nextjs:nodejs /appdata
RUN chown -R nextjs:nodejs /secrets
RUN mkdir -p /var/cache/nginx && chown -R nextjs:nodejs /var/cache/nginx && \
mkdir -p /var/log/nginx && chown -R nextjs:nodejs /var/log/nginx && \
mkdir -p /var/lib/nginx && chown -R nextjs:nodejs /var/lib/nginx && \
touch /run/nginx/nginx.pid && chown -R nextjs:nodejs /run/nginx/nginx.pid && \
mkdir -p /etc/nginx/templates /etc/nginx/ssl/certs && chown -R nextjs:nodejs /etc/nginx
USER nextjs
COPY --from=installer /app/apps/nextjs/next.config.mjs .
@@ -63,7 +93,6 @@ COPY --from=installer --chown=nextjs:nodejs /app/apps/websocket/wssServer.cjs ./
COPY --from=installer --chown=nextjs:nodejs /app/node_modules/better-sqlite3/build/Release/better_sqlite3.node /app/build/better_sqlite3.node
COPY --from=installer --chown=nextjs:nodejs /app/packages/db/migrations ./db/migrations
COPY --from=installer --chown=nextjs:nodejs /app/packages/db/migrate.cjs ./db/migrate.cjs
# Automatically leverage output traces to reduce image size
# https://nextjs.org/docs/advanced-features/output-file-tracing
@@ -71,7 +100,14 @@ COPY --from=installer --chown=nextjs:nodejs /app/apps/nextjs/.next/standalone ./
COPY --from=installer --chown=nextjs:nodejs /app/apps/nextjs/.next/static ./apps/nextjs/.next/static
COPY --from=installer --chown=nextjs:nodejs /app/apps/nextjs/public ./apps/nextjs/public
COPY --chown=nextjs:nodejs scripts/run.sh ./run.sh
COPY --chown=nextjs:nodejs scripts/generateEncryptionKey.js ./generateEncryptionKey.js
COPY --chown=nextjs:nodejs packages/redis/redis.conf /app/redis.conf
COPY --chown=nextjs:nodejs nginx.conf /etc/nginx/templates/nginx.conf
ENV DB_URL='/app/db/db.sqlite'
ENV DB_URL='/appdata/db/db.sqlite'
ENV DB_DIALECT='sqlite'
ENV DB_DRIVER='better-sqlite3'
ENV AUTH_PROVIDERS='credentials'
CMD ["sh", "run.sh"]
+2
View File
@@ -1,5 +1,7 @@
# THIS PROJECT IS STILL UNSTABLE AND WE DO NOT PROVIDE ANY SUPPORT FOR ISSUES THAT OCCURE.
## PLEASE DO NOT OPEN ANY ISSUES OR DISCUSSIONS
### EVERYTHING IS SUBJECT TO CHANGE
Please use [this](https://github.com/ajnart/homarr) version of Homarr when you want to use it
+13
View File
@@ -0,0 +1,13 @@
import baseConfig from "@homarr/eslint-config/base";
import nextjsConfig from "@homarr/eslint-config/nextjs";
import reactConfig from "@homarr/eslint-config/react";
/** @type {import('typescript-eslint').Config} */
export default [
{
ignores: [".next/**"],
},
...baseConfig,
...reactConfig,
...nextjsConfig,
];
+20 -14
View File
@@ -1,7 +1,10 @@
// Importing env files here to validate on build
import "./src/env.mjs";
import "@homarr/auth/env.mjs";
import MillionLint from "@million/lint";
import "./src/env.mjs";
/** @type {import("next").NextConfig} */
const config = {
output: "standalone",
@@ -9,23 +12,26 @@ const config = {
/** We already do linting and typechecking as separate tasks in CI */
eslint: { ignoreDuringBuilds: true },
typescript: { ignoreBuildErrors: true },
experimental: {
optimizePackageImports: [
"@mantine/core",
"@mantine/hooks",
"@tabler/icons-react",
],
webpack: (config, { isServer }) => {
if (isServer) {
config.module.rules.push({
test: /\.node$/,
loader: "node-loader",
});
}
return config;
},
transpilePackages: [
"@homarr/ui",
"@homarr/notifications",
"@homarr/modals",
"@homarr/spotlight",
"@homarr/widgets",
],
experimental: {
optimizePackageImports: ["@mantine/core", "@mantine/hooks", "@tabler/icons-react"],
},
transpilePackages: ["@homarr/ui", "@homarr/notifications", "@homarr/modals", "@homarr/spotlight", "@homarr/widgets"],
images: {
domains: ["cdn.jsdelivr.net"],
},
};
// Skip transform is used because of webpack loader, without it for example 'Tooltip.Floating' will not work and show an error
const withMillionLint = MillionLint.next({ rsc: true, skipTransform: true, telemetry: false });
export default config;
+49 -38
View File
@@ -7,54 +7,72 @@
"build": "pnpm with-env next build",
"clean": "git clean -xdf .next .turbo node_modules",
"dev": "pnpm with-env next dev",
"lint": "dotenv -v SKIP_ENV_VALIDATION=1 next lint",
"format": "prettier --check . --ignore-path ../../.gitignore",
"lint": "eslint",
"start": "pnpm with-env next start",
"typecheck": "tsc --noEmit",
"with-env": "dotenv -e ../../.env --"
},
"prettier": "@homarr/prettier-config",
"dependencies": {
"@homarr/analytics": "workspace:^0.1.0",
"@homarr/api": "workspace:^0.1.0",
"@homarr/auth": "workspace:^0.1.0",
"@homarr/common": "workspace:^0.1.0",
"@homarr/cron-job-status": "workspace:^0.1.0",
"@homarr/db": "workspace:^0.1.0",
"@homarr/definitions": "workspace:^0.1.0",
"@homarr/form": "workspace:^0.1.0",
"@homarr/gridstack": "^1.0.0",
"@homarr/gridstack": "^1.0.3",
"@homarr/integrations": "workspace:^0.1.0",
"@homarr/log": "workspace:^",
"@homarr/modals": "workspace:^0.1.0",
"@homarr/modals-collection": "workspace:^0.1.0",
"@homarr/notifications": "workspace:^0.1.0",
"@homarr/old-schema": "workspace:^0.1.0",
"@homarr/redis": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0",
"@homarr/spotlight": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@homarr/widgets": "workspace:^0.1.0",
"@mantine/colors-generator": "^7.9.0",
"@mantine/hooks": "^7.9.0",
"@mantine/modals": "^7.9.0",
"@mantine/tiptap": "^7.9.0",
"@t3-oss/env-nextjs": "^0.10.1",
"@tanstack/react-query": "^5.34.1",
"@tanstack/react-query-devtools": "^5.34.1",
"@tanstack/react-query-next-experimental": "5.34.1",
"@trpc/client": "11.0.0-rc.364",
"@mantine/colors-generator": "^7.13.4",
"@mantine/core": "^7.13.4",
"@mantine/hooks": "^7.13.4",
"@mantine/modals": "^7.13.4",
"@mantine/tiptap": "^7.13.4",
"@million/lint": "1.0.11",
"@t3-oss/env-nextjs": "^0.11.1",
"@tabler/icons-react": "^3.20.0",
"@tanstack/react-query": "^5.59.16",
"@tanstack/react-query-devtools": "^5.59.16",
"@tanstack/react-query-next-experimental": "5.59.16",
"@trpc/client": "next",
"@trpc/next": "next",
"@trpc/react-query": "next",
"@trpc/server": "next",
"@xterm/addon-canvas": "^0.7.0",
"@xterm/addon-fit": "0.10.0",
"@xterm/xterm": "^5.5.0",
"chroma-js": "^2.4.2",
"dayjs": "^1.11.11",
"chroma-js": "^3.1.2",
"clsx": "^2.1.1",
"dayjs": "^1.11.13",
"dotenv": "^16.4.5",
"glob": "^10.3.12",
"jotai": "^2.8.0",
"next": "^14.2.3",
"postcss-preset-mantine": "^1.15.0",
"react": "18.3.1",
"react-dom": "18.3.1",
"sass": "^1.76.0",
"flag-icons": "^7.2.3",
"glob": "^11.0.0",
"jotai": "^2.10.1",
"mantine-react-table": "2.0.0-beta.7",
"next": "^14.2.16",
"postcss-preset-mantine": "^1.17.0",
"prismjs": "^1.29.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-error-boundary": "^4.1.2",
"react-simple-code-editor": "^0.14.1",
"sass": "^1.80.4",
"superjson": "2.2.1",
"swagger-ui-react": "^5.17.14",
"use-deep-compare-effect": "^1.8.1"
},
"devDependencies": {
@@ -62,22 +80,15 @@
"@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0",
"@types/chroma-js": "2.4.4",
"@types/node": "^20.12.8",
"@types/react": "^18.3.1",
"@types/react-dom": "^18.3.0",
"concurrently": "^8.2.2",
"eslint": "^8.57.0",
"prettier": "^3.2.5",
"tsx": "4.9.0",
"typescript": "^5.4.5"
},
"eslintConfig": {
"root": true,
"extends": [
"@homarr/eslint-config/base",
"@homarr/eslint-config/nextjs",
"@homarr/eslint-config/react"
]
},
"prettier": "@homarr/prettier-config"
"@types/node": "^20.17.1",
"@types/prismjs": "^1.26.5",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"@types/swagger-ui-react": "^4.18.3",
"concurrently": "^9.0.1",
"eslint": "^9.13.0",
"node-loader": "^2.0.0",
"prettier": "^3.3.3",
"typescript": "^5.6.3"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 497 B

+25
View File
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="1024" height="1024" version="1.1" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<defs>
<clipPath id="a">
<circle cx="512" cy="512" r="410" fill="#989898" stroke-width="3.5906"/>
</clipPath>
<clipPath id="b">
<path d="m512 636l0-565 -330 565 330 0z" fill="#000"/>
<path d="m512 388l0 565 330-565 -330 0z" fill="#000"/>
</clipPath>
</defs>
<g id="lidarr-group-logo" transform="translate(5e-6 .26738)">
<circle id="lidarr-black-circle" cx="512" cy="512" r="410" stroke-width="1.8"/>
<path id="lidarr-honeycomb-a" d="m852.12 33.49l23.46 14.44 23.22-14.44 0-28.87 -23.22-14.44 -23.46 14.44 0 28.87zm-46.44-28.87l-23.22-14.44 -23.2 14.44 0 28.87 23.2 14.44 23.22-14.44 0-28.87 23.22-14.44 23.22 14.44m-46.44 28.87l23.22 14.44 23.22-14.44m-46.44 57.49l0 28.87 23.22 14.44 23.22-14.44 0-28.87 -23.22-14.18 -23.22 14.18 -23.22-14.18 -23.2 14.18m92.86 28.87l23.46 14.44 23.22-14.44 0-28.87 -23.22-14.18 -23.46 14.18m23.46-43.05l0 28.87m-46.68-28.87l0 28.87m69.9-72.18l23.22-14.44 23.22 14.44 23.22-14.44 23.22 14.44 23.2-14.44 23.22 14.44 0 28.87 23.22 14.44 0 28.87 -23.22 14.18 0 28.87 23.22 14.44 0 28.87 -23.22 14.44 0 28.87 23.22 14.44 0 28.87 -23.22 14.16 0 28.87 23.22 14.44 0 28.87 -23.22 14.44 0 28.87 23.22 14.44 0 28.87 -23.22 14.16 0 28.87 23.22 14.44 0 28.87 -23.22 14.45 0 28.87 23.22 14.44 0 28.87 -23.22 14.16 0 28.87 23.22 14.44 0 28.87 -23.22 14.44 0 28.87 23.22 14.44 0 28.87 -23.22 14.16 0 28.87 23.22 14.44 0 28.87 -23.22 14.44 0 28.87 23.22 14.44 0 28.87 -23.22 14.18 0 28.87 23.22 14.44 0 28.87 -23.22 14.44 -23.22-14.44 -23.2 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.46 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.2 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.46 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.2 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.2 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.46 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.22 14.44 -23.2-14.44 -23.22 14.44 -23.22-14.44 -23.46 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 0-28.87 -23.22-14.44 0-28.87 23.22-14.18 0-28.87 -23.22-14.44 0-28.87 23.22-14.44 0-28.87 -23.22-14.44 0-28.87 23.22-14.16 0-28.87 -23.22-14.44 0-28.87 23.22-14.44 0-28.87 -23.22-14.44 0-28.87 23.22-14.16 0-28.87 -23.22-14.44 0-28.87 23.22-14.45 0-28.87 -23.22-14.44 0-28.87 23.22-14.16 0-28.87 -23.22-14.44 0-28.87 23.22-14.44 0-28.87 -23.22-14.44 0-28.87 23.22-14.16 0-28.87 -23.22-14.44 0-28.87 23.22-14.44 0-28.87 -23.22-14.44 0-28.87 23.22-14.18 0-28.87 -23.22-14.44 0-28.87 23.22-14.44 23.22 14.44 23.22-14.44 23.22 14.44 23.22-14.44 23.22 14.44 23.46-14.44 23.22 14.44 23.22-14.44 23.2 14.44 23.22-14.44 23.22 14.44 23.22-14.44 23.22 14.44 23.22-14.44 23.22 14.44 23.46-14.44 23.22 14.44 23.22-14.44 23.22 14.44 23.2-14.44 23.22 14.44 23.22-14.44 23.22 14.44 23.22-14.44 23.22 14.44 23.2-14.44 23.22 14.44 23.22-14.44 23.22 14.44 23.46-14.44 23.22 14.44 23.22-14.44 23.22 14.44 23.22-14.44 23.22 14.44m-46.44 0l0 28.87 23.22 14.44 23.22-14.44m-46.44 57.49l0 28.87 23.22 14.44 23.22-14.44 0-28.87 -23.22-14.18 -23.22 14.18 -23.22-14.18 -23.22 14.18m116.08-43.05l0 28.87m-46.42-28.87l0 28.87m23.22 100.79l0 28.87 23.2 14.44 23.22-14.44 0-28.87 -23.22-14.44 -23.2 14.44 -23.22-14.44 -23.22 14.44 0 28.87 23.22 14.44 23.22-14.44m46.42-86.61l-23.22 14.44 0 28.87m-23.2-43.31l23.2 14.44m-46.42 0l0 28.87m0 57.74l0 28.87 23.22 14.16 23.2-14.16 0-28.87m46.44-86.61l0 28.87 23.22 14.44 23.46-14.44 0-28.87m-46.68 28.87l-23.22 14.44m-23.22 72.18l23.22 14.16 23.22-14.16 0-28.87 -23.22-14.44m46.44-28.87l0 28.87 23.46 14.44 23.22-14.44 0-28.87 -23.22-14.44m0 57.74l0 28.87 23.22 14.16 23.22-14.16 0-28.87 -23.22-14.44m-69.9 14.44l23.22-14.44m-185.74-201.84l0 28.87 23.22 14.44 23.22-14.44m-139.56-28.87l0 28.87 23.22 14.44 23.22-14.44 0-28.87m0 28.87l23.46 14.44 23.22-14.44m-46.68 57.49l0 28.87 23.46 14.44 23.22-14.44 0-28.87 -23.22-14.18 -23.46 14.18 -23.22-14.18 -23.22 14.18 0 28.87 23.22 14.44 23.22-14.44m-23.22-71.92l0 28.87m93.12-28.87l0 28.87m-46.44-28.87l0 28.87m-116.32-72.18l0 28.87 23.2 14.44 23.22-14.44m-92.86-28.87l0 28.87 23.22 14.44 23.22-14.44m-23.22 43.31l-23.22 14.18 0 28.87 23.22 14.44 23.22-14.44 0-28.87 -23.22-14.18zm69.64 14.18l-23.22-14.18 -23.2 14.18m-23.22-43.05l0 28.87m46.42-28.87l0 28.87m23.22 43.05l-23.22 14.44 0 28.87 23.22 14.44 23.22-14.44 0-28.87m-92.86 0l0 28.87 23.22 14.44 23.2-14.44m-46.42 86.61l23.22 14.16 23.2-14.16 0-28.87 -23.2-14.44 -23.22 14.44 0 28.87 -23.22 14.16 0 28.87 23.22 14.44 23.22-14.44 0-28.87m23.2-43.03l23.22-14.44 0-28.87m-46.42-57.74l23.2 14.44m-23.2 72.18l0-28.87m116.32-43.31l0 28.87 23.22 14.44 23.22-14.44 0-28.87 -23.22-14.44m-93.12 86.61l23.22 14.44 23.22-14.44 0-28.87 -23.22-14.44m46.68 0l-23.46 14.44m23.46 72.18l23.22 14.16 23.22-14.16 0-28.87 -23.22-14.44 -23.22 14.44 0 28.87 -23.46 14.16 0 28.87 -23.22 14.44 0 28.87 23.22 14.44 23.46-14.44 0-28.87 -23.46-14.44m-69.66-43.03l23.22 14.16 23.22-14.16 0-28.87m23.22-14.44l23.46 14.44m23.22-14.44l0-28.87m0 86.34l0 28.87 23.22 14.44 23.22-14.44 0-28.87 -23.22-14.16m-69.9 100.77l0 28.87 23.46 14.44 23.22-14.44 0-28.87 -23.22-14.44m23.22 43.31l23.22 14.44 23.22-14.44 0-28.87 -23.22-14.44 -23.22 14.44m-23.22-43.31l23.22-14.44m23.22 14.44l0 28.87m-93.12-28.87l-23.22-14.44 -23.22 14.44 0 28.87 23.22 14.44 23.22-14.44m-23.22-43.31l0-28.87m-69.64 72.18l-23.22 14.44 0 28.87 23.22 14.44 23.22-14.44 0-28.87 -23.22-14.44zm23.22 4Line truncated
<ellipse cx="512" cy="512" rx="460" ry="460" style="fill:none;stroke-width:99;stroke:#e5e5e5"/>
<ellipse cx="512" cy="512" rx="270" ry="270" style="fill:#e5e5e5;stroke-width:76;stroke:#e5e5e5"/>
<ellipse ry="410" rx="410" cy="512" cx="512" style="fill-opacity:null;fill:none;stroke-width:12;stroke:#009252"/>
<path d="m512 636l0-565 -330 565 330 0z" fill="#000"/>
<path d="m512 388l0 565 330-565 -330 0z" fill="#000"/>
<path id="lidarr-honeycomb-b" d="m852.12 33.49l23.46 14.44 23.22-14.44 0-28.87 -23.22-14.44 -23.46 14.44 0 28.87zm-46.44-28.87l-23.22-14.44 -23.2 14.44 0 28.87 23.2 14.44 23.22-14.44 0-28.87 23.22-14.44 23.22 14.44m-46.44 28.87l23.22 14.44 23.22-14.44m-46.44 57.49l0 28.87 23.22 14.44 23.22-14.44 0-28.87 -23.22-14.18 -23.22 14.18 -23.22-14.18 -23.2 14.18m92.86 28.87l23.46 14.44 23.22-14.44 0-28.87 -23.22-14.18 -23.46 14.18m23.46-43.05l0 28.87m-46.68-28.87l0 28.87m69.9-72.18l23.22-14.44 23.22 14.44 23.22-14.44 23.22 14.44 23.2-14.44 23.22 14.44 0 28.87 23.22 14.44 0 28.87 -23.22 14.18 0 28.87 23.22 14.44 0 28.87 -23.22 14.44 0 28.87 23.22 14.44 0 28.87 -23.22 14.16 0 28.87 23.22 14.44 0 28.87 -23.22 14.44 0 28.87 23.22 14.44 0 28.87 -23.22 14.16 0 28.87 23.22 14.44 0 28.87 -23.22 14.45 0 28.87 23.22 14.44 0 28.87 -23.22 14.16 0 28.87 23.22 14.44 0 28.87 -23.22 14.44 0 28.87 23.22 14.44 0 28.87 -23.22 14.16 0 28.87 23.22 14.44 0 28.87 -23.22 14.44 0 28.87 23.22 14.44 0 28.87 -23.22 14.18 0 28.87 23.22 14.44 0 28.87 -23.22 14.44 -23.22-14.44 -23.2 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.46 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.2 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.46 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.2 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.2 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.46 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.22 14.44 -23.2-14.44 -23.22 14.44 -23.22-14.44 -23.46 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 -23.22 14.44 -23.22-14.44 0-28.87 -23.22-14.44 0-28.87 23.22-14.18 0-28.87 -23.22-14.44 0-28.87 23.22-14.44 0-28.87 -23.22-14.44 0-28.87 23.22-14.16 0-28.87 -23.22-14.44 0-28.87 23.22-14.44 0-28.87 -23.22-14.44 0-28.87 23.22-14.16 0-28.87 -23.22-14.44 0-28.87 23.22-14.45 0-28.87 -23.22-14.44 0-28.87 23.22-14.16 0-28.87 -23.22-14.44 0-28.87 23.22-14.44 0-28.87 -23.22-14.44 0-28.87 23.22-14.16 0-28.87 -23.22-14.44 0-28.87 23.22-14.44 0-28.87 -23.22-14.44 0-28.87 23.22-14.18 0-28.87 -23.22-14.44 0-28.87 23.22-14.44 23.22 14.44 23.22-14.44 23.22 14.44 23.22-14.44 23.22 14.44 23.46-14.44 23.22 14.44 23.22-14.44 23.2 14.44 23.22-14.44 23.22 14.44 23.22-14.44 23.22 14.44 23.22-14.44 23.22 14.44 23.46-14.44 23.22 14.44 23.22-14.44 23.22 14.44 23.2-14.44 23.22 14.44 23.22-14.44 23.22 14.44 23.22-14.44 23.22 14.44 23.2-14.44 23.22 14.44 23.22-14.44 23.22 14.44 23.46-14.44 23.22 14.44 23.22-14.44 23.22 14.44 23.22-14.44 23.22 14.44m-46.44 0l0 28.87 23.22 14.44 23.22-14.44m-46.44 57.49l0 28.87 23.22 14.44 23.22-14.44 0-28.87 -23.22-14.18 -23.22 14.18 -23.22-14.18 -23.22 14.18m116.08-43.05l0 28.87m-46.42-28.87l0 28.87m23.22 100.79l0 28.87 23.2 14.44 23.22-14.44 0-28.87 -23.22-14.44 -23.2 14.44 -23.22-14.44 -23.22 14.44 0 28.87 23.22 14.44 23.22-14.44m46.42-86.61l-23.22 14.44 0 28.87m-23.2-43.31l23.2 14.44m-46.42 0l0 28.87m0 57.74l0 28.87 23.22 14.16 23.2-14.16 0-28.87m46.44-86.61l0 28.87 23.22 14.44 23.46-14.44 0-28.87m-46.68 28.87l-23.22 14.44m-23.22 72.18l23.22 14.16 23.22-14.16 0-28.87 -23.22-14.44m46.44-28.87l0 28.87 23.46 14.44 23.22-14.44 0-28.87 -23.22-14.44m0 57.74l0 28.87 23.22 14.16 23.22-14.16 0-28.87 -23.22-14.44m-69.9 14.44l23.22-14.44m-185.74-201.84l0 28.87 23.22 14.44 23.22-14.44m-139.56-28.87l0 28.87 23.22 14.44 23.22-14.44 0-28.87m0 28.87l23.46 14.44 23.22-14.44m-46.68 57.49l0 28.87 23.46 14.44 23.22-14.44 0-28.87 -23.22-14.18 -23.46 14.18 -23.22-14.18 -23.22 14.18 0 28.87 23.22 14.44 23.22-14.44m-23.22-71.92l0 28.87m93.12-28.87l0 28.87m-46.44-28.87l0 28.87m-116.32-72.18l0 28.87 23.2 14.44 23.22-14.44m-92.86-28.87l0 28.87 23.22 14.44 23.22-14.44m-23.22 43.31l-23.22 14.18 0 28.87 23.22 14.44 23.22-14.44 0-28.87 -23.22-14.18zm69.64 14.18l-23.22-14.18 -23.2 14.18m-23.22-43.05l0 28.87m46.42-28.87l0 28.87m23.22 43.05l-23.22 14.44 0 28.87 23.22 14.44 23.22-14.44 0-28.87m-92.86 0l0 28.87 23.22 14.44 23.2-14.44m-46.42 86.61l23.22 14.16 23.2-14.16 0-28.87 -23.2-14.44 -23.22 14.44 0 28.87 -23.22 14.16 0 28.87 23.22 14.44 23.22-14.44 0-28.87m23.2-43.03l23.22-14.44 0-28.87m-46.42-57.74l23.2 14.44m-23.2 72.18l0-28.87m116.32-43.31l0 28.87 23.22 14.44 23.22-14.44 0-28.87 -23.22-14.44m-93.12 86.61l23.22 14.44 23.22-14.44 0-28.87 -23.22-14.44m46.68 0l-23.46 14.44m23.46 72.18l23.22 14.16 23.22-14.16 0-28.87 -23.22-14.44 -23.22 14.44 0 28.87 -23.46 14.16 0 28.87 -23.22 14.44 0 28.87 23.22 14.44 23.46-14.44 0-28.87 -23.46-14.44m-69.66-43.03l23.22 14.16 23.22-14.16 0-28.87m23.22-14.44l23.46 14.44m23.22-14.44l0-28.87m0 86.34l0 28.87 23.22 14.44 23.22-14.44 0-28.87 -23.22-14.16m-69.9 100.77l0 28.87 23.46 14.44 23.22-14.44 0-28.87 -23.22-14.44m23.22 43.31l23.22 14.44 23.22-14.44 0-28.87 -23.22-14.44 -23.22 14.44m-23.22-43.31l23.22-14.44m23.22 14.44l0 28.87m-93.12-28.87l-23.22-14.44 -23.22 14.44 0 28.87 23.22 14.44 23.22-14.44m-23.22-43.31l0-28.87m-69.64 72.18l-23.22 14.44 0 28.87 23.22 14.44 23.22-14.44 0-28.87 -23.22-14.44zm23.22 4Line truncated
<path d="m512 636l0-565 -330 565 330 0z" style="fill:none;stroke-width:16;stroke:#009252;"/>
<path d="m512 388l0 565 330-565 -330 0z" style="fill:none;stroke-width:16;stroke:#009252;"/>
<ellipse cx="512" cy="512" rx="150" ry="150" style="fill-opacity:null;fill:#009252;stroke-opacity:null;stroke-width:null;stroke:null"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 54 KiB

@@ -0,0 +1 @@
<svg height="1024" viewBox="0 0 1024 1024" width="1024" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><path id="a" d="m0 0h1024v1024h-1024z"/><clipPath id="b"><use clip-rule="evenodd" xlink:href="#a"/></clipPath></defs><g clip-path="url(#b)"><use fill="none" xlink:href="#a"/><g transform="translate(70 21.00012)"><path d="m105.302 154.943 7.522 714.549c-60.173 7.522-105.30242-22.565-105.30242-82.737l-7.52158-594.205c0-188.03894 172.996-233.1684 278.298-157.9526l534.032 308.3846c75.216 52.651 90.259 150.431 52.651 218.125-7.521-52.651-30.086-82.737-75.216-112.823l-601.726-338.471c-45.129-30.0862-82.737-22.5646-82.737 45.13z" fill="#24292e"/><path d="m0 376.079c45.1295 15.043 90.259 7.521 127.867-15.043l616.769-361.036c37.608 52.651 30.087 105.302-15.043 135.388l-518.989 300.863c-75.216 37.608-172.9961 0-210.604-60.172z" fill="#24292e" transform="translate(60.17249 531.0214)"/><path d="m0 413.687 368.557-210.604-361.03543-203.083z" fill="#ffc230" transform="translate(240.6902 282.8092)"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@@ -0,0 +1 @@
<svg version="1.1" viewBox="0 0 1000 1000" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(.97895 0 0 .97895 -2.2026 -2.2026)"><g stroke="#443c3c" stroke-width="1.5"><circle cx="513" cy="513" r="510" fill="#eee"/><circle cx="513" cy="513" r="440" fill="#443c3c"/><circle cx="513" cy="513" r="387" fill="#8e2222"/></g><g stroke-width="1.5"><circle cx="513" cy="513" r="378" fill="#eee" stroke="#8e2222"/><circle cx="511.67" cy="514.33" r="265" fill="#443c3c" stroke="#443c3c"/></g><g stroke="#8e2222"><path d="m176.71 682.24-5.71-356.67c0.634-53.106 17.5-47.829 30.454-49.405 198.58 10.83 270.91 71.252 275.35 73.499 13.323 5.018 20.937 31.782 20.302 31.123 0.634 0.658 4.441 420.6 3.807 419.94 3.172 22.455-13.323 21.002-13.958 20.343-124.99-98.152-297.56-122.85-298.19-123.51-12.055-0.795-12.055-15.326-12.055-15.326zm670.08 0.82 5.711-357.54c-0.635-53.236-17.501-47.946-30.456-49.526-198.6 10.857-270.93 71.426-275.38 73.679-13.325 5.03-20.939 31.859-20.304 31.199-0.635 0.66-4.442 421.63-3.807 420.97-3.173 22.51 13.325 21.053 13.959 20.393 125-98.392 297.58-123.15 298.22-123.81 12.056-0.797 12.056-15.363 12.056-15.363z" fill="#eee" stroke-width="10"/><path d="m174.14 739.57-5.802-356.67c0.645-53.106 17.782-47.829 30.945-49.405 201.79 10.83 275.28 71.252 279.8 73.499 13.539 5.018 21.275 31.782 20.63 31.123 0.645 0.658 4.513 420.6 3.868 419.94 3.224 22.455-13.539 21.002-14.183 20.343-127-98.152-302.36-122.85-303.01-123.51-12.249-0.795-12.249-15.326-12.249-15.326zm675.22 0.49 5.803-357.54c-0.645-53.236-17.784-47.946-30.948-49.526-201.81 10.857-275.31 71.426-279.82 73.679-13.54 5.03-21.277 31.859-20.632 31.199-0.645 0.66-4.513 421.63-3.869 420.97-3.224 22.51 13.54 21.053 14.184 20.393 127.02-98.392 302.39-123.15 303.03-123.81 12.25-0.797 12.25-15.363 12.25-15.363z" fill="#8e2222" stroke-width="5"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><g clip-rule="evenodd"><path fill="#eee" fill-rule="evenodd" d="M47.978 24c0 6.602-2.331 12.26-6.993 16.974a3.773 3.773 0 0 1-.52.509 20.53 20.53 0 0 1-2.435 2.047C33.988 46.51 29.318 48 24.022 48c-5.304 0-9.966-1.49-13.986-4.47a21.726 21.726 0 0 1-2.988-2.556c-3.622-3.6-5.846-7.783-6.672-12.548-.162-.93-.27-1.874-.32-2.833a38.27 38.27 0 0 1 0-3.197c0-.052.014-.104.044-.155.346-5.887 2.662-10.973 6.948-15.259C11.762 2.327 17.42 0 24.022 0c6.624 0 12.279 2.327 16.963 6.982 4.662 4.743 6.993 10.416 6.993 17.018z"/><path fill="#3a3f51" fill-rule="evenodd" d="m43.098 9.405-4.957 4.957c-2.899 2.899-3.153 5.422-3.153 9.87 0 3.97.63 7.602 3.585 10.556 2.156 2.157 4.204 4.194 4.204 4.194a27.962 27.962 0 0 1-1.792 1.992 3.773 3.773 0 0 1-.52.509 20.05 20.05 0 0 1-1.749 1.538l-3.883-3.884c-3.452-3.452-6.196-3.784-10.756-3.784-4.375 0-7.352.403-10.556 3.607a2715.831 2715.831 0 0 0-4.105 4.116 21.196 21.196 0 0 1-2.368-2.102 27.739 27.739 0 0 1-1.737-1.903s2.168-2.18 4.238-4.25c3.066-3.065 3.563-6.62 3.563-10.589 0-3.872-.636-7.485-3.452-10.301C7.705 11.975 5 9.284 5 9.284a25.954 25.954 0 0 1 2.047-2.302A29.761 29.761 0 0 1 9.04 5.201l4.504 4.503c2.877 2.877 6.565 3.618 10.533 3.618 4.087 0 7.763-.791 10.756-3.784 1.84-1.841 4.27-4.26 4.27-4.26a25.168 25.168 0 0 1 1.882 1.704c.767.782 1.471 1.59 2.113 2.423z"/><path fill="#0cf" fill-rule="evenodd" d="M17.438 25.228a6.986 6.986 0 0 1-.1-1.228c0-.155.005-.303.012-.443 0-.014.004-.029.011-.044.096-1.63.738-3.039 1.925-4.227 1.306-1.29 2.874-1.936 4.703-1.936 1.837 0 3.404.645 4.703 1.936 1.29 1.313 1.936 2.884 1.936 4.714s-.645 3.397-1.936 4.703c-.045.051-.093.1-.144.143a6.056 6.056 0 0 1-.675.565c-1.121.826-2.416 1.239-3.884 1.239s-2.759-.413-3.873-1.24a5.818 5.818 0 0 1-.83-.707c-1.003-.996-1.619-2.155-1.848-3.475z"/><path fill="none" stroke="#0cf" stroke-miterlimit="1" stroke-width=".4426" d="m34.943 13.223-3.32 3.242M6.834 7.198l9.044 9.012M34.6 34.855l6.154 6.369m.41-34.056-6.22 6.056M7.18 41.107l6.053-6.063"/><path fill="none" stroke="#0cf" stroke-miterlimit="1" stroke-width="1.5491" d="m34.943 13.223-3.75 3.806m-18.12-3.617 3.806 3.795m-3.662 17.854 3.706-3.851m13.705-.309 3.99 3.971"/></g></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="100px" height="54px" viewBox="0 0 100 54" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Logo tvdb</title>
<g id="Logo-tvdb" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<path d="M0,5.09590006 C0,1.81024006 2.9636,-0.441498938 6.46228,0.0733078623 L6.46228,0.0733078623 L52.10124,6.03470006 C54.15254,6.33652006 55.78724,8.54666006 55.78724,10.9536001 L55.78724,10.9536001 L55.78654,17.1835001 C51.94104,19.7605001 49.42044,24.0737001 49.42044,28.9596001 C49.42044,33.8924001 51.87974,38.1680001 55.78724,40.7361001 L55.78724,40.7361001 L55.78724,43.4756001 C55.78724,45.8825001 54.15254,48.0927001 52.10124,48.3945001 L52.10124,48.3945001 L11.60314,53.9266001 C8.10444,54.4417001 5.14084,52.1897001 5.14084,48.9040001 L5.14084,48.9040001 Z M19.68044,10.8218001 L13.66114,10.8218001 L13.66114,18.7064001 L9.84244,18.7064001 L9.84244,23.2621001 L13.66114,23.2621001 L13.66114,32.0227001 C13.4846091,37.5274601 15.6467584,39.9923503 20.6149401,40.0386142 L25.25134,40.0387001 L25.25134,35.4830001 L22.87064,35.4830001 C20.17484,35.3516001 19.59134,34.5631001 19.68074,31.0149001 L19.68074,23.2617001 L27.08014,23.2617001 L33.93424,40.0384001 L40.40294,40.0384001 L49.83694,18.7061001 L43.45734,18.7061001 L37.34794,33.3806001 L31.77694,18.7064001 L19.68044,18.7064001 L19.68044,10.8218001 Z" id="Combined-Shape" fill="#6CD591" fill-rule="nonzero"></path>
<path d="M88.60974,18.2771001 C92.51784,18.2771001 95.12314,19.2407001 97.09994,21.4310001 C98.71734,23.1831001 99.57074,25.7677001 99.57074,28.6584001 C99.57074,32.8634001 97.86394,36.1487001 94.76414,38.0323001 C92.74234,39.2590001 90.99054,39.6094001 87.03734,39.6094001 L77.24404,39.6094001 L77.24404,10.3925001 L83.26404,10.3925001 L83.26404,18.2771001 L88.60974,18.2771001 Z M83.26404,35.0537001 L87.71094,35.0537001 C91.26004,35.0537001 93.41634,32.6884001 93.41634,28.8334001 C93.41634,24.8035001 91.52964,22.8324001 87.71094,22.8324001 L83.26404,22.8324001 L83.26404,35.0537001 Z" id="Shape" fill="#FFFFFF" fill-rule="nonzero"></path>
<path d="M68.01354,10.3925001 L74.03354,10.3925001 L74.03354,39.6094001 L63.65594,39.6094001 C59.43354,39.6094001 57.41174,38.9962001 55.25524,37.1126001 C53.05394,35.1416001 51.93124,32.3384001 51.93124,28.7898001 C51.93124,25.1102001 53.14404,22.3070001 55.70494,20.2481001 C57.32204,18.9342001 59.52364,18.2771001 62.35354,18.2771001 L68.01384,18.2771001 L68.01384,10.3925001 L68.01354,10.3925001 Z M68.01354,22.8327001 L63.65594,22.8327001 C60.15224,22.8327001 58.04064,25.0667001 58.04064,28.7898001 C58.04064,32.6884001 60.19654,35.0537001 63.65594,35.0537001 L68.01354,35.0537001 L68.01354,22.8327001 Z" id="Shape" fill="#FFFFFF" fill-rule="nonzero"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

@@ -0,0 +1 @@
<svg viewBox="0 0 90 90" xmlns="http://www.w3.org/2000/svg"><g fill="none"><path fill="#31BEEC" d="M90 38.197v19.137L48.942 80.999V61.864z"/><path d="M41.086 61.863V81L0 57.333V38.197l18.566 10.687c.02.016.043.03.067.04l22.453 12.94Z" fill="#0095D5"/><path fill="#AEADAE" d="m61.621 45.506-16.607 9.576-16.622-9.576 16.622-9.575z"/><path fill="#0095D5" d="M86.086 31.416 69.464 40.99 48.942 29.15V10z"/><path fill="#31BEEC" d="M41.086 10v19.15l-20.55 11.827-16.621-9.561z"/></g></svg>

After

Width:  |  Height:  |  Size: 484 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><linearGradient id="a" x1="100%" x2="0" y1="0" y2="100%" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ff8d30"/><stop offset="1" stop-color="#e32929"/></linearGradient></defs><circle cx="50%" cy="50%" r="50%" fill="url(#a)"/><path fill="#fff" d="M246.6 200.8h18.7v110.6h-18.7zm-182.3 0H83v110.7H64.3zm91.1 123.9h18.7V367h-18.7zm-45.7-47.5h18.7v68.5h-18.7zm91.2 0h18.6v68.4h-18.6zm228.2-76.5h18.7v110.7h-18.7zM338 145.5h18.7v42.3H338zm45.7 21.2h18.7v68.2h-18.7zm-91.5 0h18.7v68.1h-18.7z"/></svg>

After

Width:  |  Height:  |  Size: 577 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@@ -0,0 +1,74 @@
"use client";
import type { PropsWithChildren } from "react";
import type { MantineColorScheme, MantineColorSchemeManager } from "@mantine/core";
import { createTheme, DirectionProvider, MantineProvider } from "@mantine/core";
import dayjs from "dayjs";
import { clientApi } from "@homarr/api/client";
import { useSession } from "@homarr/auth/client";
import { parseCookies, setClientCookie } from "@homarr/common";
export const CustomMantineProvider = ({ children }: PropsWithChildren) => {
const manager = useColorSchemeManager();
return (
<DirectionProvider>
<MantineProvider
defaultColorScheme="dark"
colorSchemeManager={manager}
theme={createTheme({
primaryColor: "red",
autoContrast: true,
})}
>
{children}
</MantineProvider>
</DirectionProvider>
);
};
function useColorSchemeManager(): MantineColorSchemeManager {
const key = "homarr-color-scheme";
const { data: session } = useSession();
const updateCookieValue = (value: Exclude<MantineColorScheme, "auto">) => {
setClientCookie(key, value, { expires: dayjs().add(1, "year").toDate(), path: "/" });
};
const { mutate: mutateColorScheme } = clientApi.user.changeColorScheme.useMutation({
onSuccess: (_, variables) => {
updateCookieValue(variables.colorScheme);
},
});
return {
get: (defaultValue) => {
if (typeof window === "undefined") {
return defaultValue;
}
try {
const cookies = parseCookies(document.cookie);
return (cookies[key] as MantineColorScheme | undefined) ?? defaultValue;
} catch {
return defaultValue;
}
},
set: (value) => {
if (value === "auto") return;
try {
if (session) {
mutateColorScheme({ colorScheme: value });
}
updateCookieValue(value);
} catch (error) {
console.warn("[@mantine/core] Color scheme manager was unable to save color scheme.", error);
}
},
subscribe: () => undefined,
unsubscribe: () => undefined,
clear: () => undefined,
};
}
@@ -3,10 +3,7 @@ import type { PropsWithChildren } from "react";
import { defaultLocale } from "@homarr/translation";
import { I18nProviderClient } from "@homarr/translation/client";
export const NextInternationalProvider = ({
children,
locale,
}: PropsWithChildren<{ locale: string }>) => {
export const NextInternationalProvider = ({ children, locale }: PropsWithChildren<{ locale: string }>) => {
return (
<I18nProviderClient locale={locale} fallback={defaultLocale}>
{children}
@@ -1,17 +1,46 @@
"use client";
import { createContext, useContext, useEffect } from "react";
import type { PropsWithChildren } from "react";
import dayjs from "dayjs";
import type { Session } from "@homarr/auth";
import { SessionProvider } from "@homarr/auth/client";
import { SessionProvider, signIn } from "@homarr/auth/client";
interface AuthProviderProps {
interface AuthProviderProps extends AuthContextProps {
session: Session | null;
}
export const AuthProvider = ({
children,
session,
}: PropsWithChildren<AuthProviderProps>) => {
return <SessionProvider session={session}>{children}</SessionProvider>;
export const AuthProvider = ({ children, session, logoutUrl }: PropsWithChildren<AuthProviderProps>) => {
useLoginRedirectOnSessionExpiry(session);
return (
<SessionProvider session={session}>
<AuthContext.Provider value={{ logoutUrl }}>{children}</AuthContext.Provider>
</SessionProvider>
);
};
interface AuthContextProps {
logoutUrl: string | undefined;
}
const AuthContext = createContext<AuthContextProps | null>(null);
export const useAuthContext = () => {
const context = useContext(AuthContext);
if (!context) throw new Error("useAuthContext must be used within an AuthProvider");
return context;
};
const useLoginRedirectOnSessionExpiry = (session: Session | null) => {
useEffect(() => {
// eslint-disable-next-line @typescript-eslint/no-empty-function
if (!session) return () => {};
//setTimeout doesn't allow for a number higher than 2147483647 (2³¹-1 , or roughly 24 days)
const timeout = setTimeout(() => void signIn(), Math.min(dayjs(session.expires).diff(), 2147483647));
return () => clearTimeout(timeout);
}, [session]);
};
@@ -7,7 +7,10 @@ import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
import { ReactQueryStreamedHydration } from "@tanstack/react-query-next-experimental";
import {
createWSClient,
httpLink,
isNonJsonSerializable,
loggerLink,
splitLink,
unstable_httpBatchStreamLink,
wsLink,
} from "@trpc/client";
@@ -16,8 +19,23 @@ import superjson from "superjson";
import type { AppRouter } from "@homarr/api";
import { clientApi } from "@homarr/api/client";
import { env } from "~/env.mjs";
const constructWebsocketUrl = () => {
const fallback = "ws://localhost:3001/websockets";
if (typeof window === "undefined") {
return fallback;
}
if (env.NODE_ENV === "development") {
return fallback;
}
return `ws://${window.location.hostname}:${window.location.port}/websockets`;
};
const wsClient = createWSClient({
url: "ws://localhost:3001",
url: constructWebsocketUrl(),
});
export function TRPCReactProvider(props: PropsWithChildren) {
@@ -37,21 +55,31 @@ export function TRPCReactProvider(props: PropsWithChildren) {
links: [
loggerLink({
enabled: (opts) =>
process.env.NODE_ENV === "development" ||
(opts.direction === "down" && opts.result instanceof Error),
process.env.NODE_ENV === "development" || (opts.direction === "down" && opts.result instanceof Error),
}),
(args) => {
return ({ op, next }) => {
console.log("op", op.type, op.input, op.path, op.id);
if (op.type === "subscription") {
const link = wsLink<AppRouter>({
client: wsClient,
transformer: superjson,
});
return link(args)({ op, next });
}
return unstable_httpBatchStreamLink({
splitLink({
condition: ({ type }) => type === "subscription",
true: wsLink<AppRouter>({
client: wsClient,
transformer: superjson,
}),
false: splitLink({
condition: ({ input }) => isNonJsonSerializable(input),
true: httpLink({
/**
* We don't want to transform the data here as we want to use form data
*/
transformer: {
serialize(object: unknown) {
return object;
},
deserialize(data: unknown) {
return data;
},
},
url: `${getBaseUrl()}/api/trpc`,
}),
false: unstable_httpBatchStreamLink({
transformer: superjson,
url: `${getBaseUrl()}/api/trpc`,
headers() {
@@ -59,9 +87,9 @@ export function TRPCReactProvider(props: PropsWithChildren) {
headers.set("x-trpc-source", "nextjs-react");
return headers;
},
})(args)({ op, next });
};
},
}),
}),
}),
],
});
});
@@ -69,9 +97,7 @@ export function TRPCReactProvider(props: PropsWithChildren) {
return (
<clientApi.Provider client={trpcClient} queryClient={queryClient}>
<QueryClientProvider client={queryClient}>
<ReactQueryStreamedHydration transformer={superjson}>
{props.children}
</ReactQueryStreamedHydration>
<ReactQueryStreamedHydration transformer={superjson}>{props.children}</ReactQueryStreamedHydration>
<ReactQueryDevtools initialIsOpen={false} />
</QueryClientProvider>
</clientApi.Provider>
@@ -0,0 +1,87 @@
"use client";
import { useRouter } from "next/navigation";
import { Button, PasswordInput, Stack, TextInput } from "@mantine/core";
import { clientApi } from "@homarr/api/client";
import { useZodForm } from "@homarr/form";
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
import { useScopedI18n } from "@homarr/translation/client";
import { CustomPasswordInput } from "@homarr/ui";
import type { z } from "@homarr/validation";
import { validation } from "@homarr/validation";
interface RegistrationFormProps {
invite: {
id: string;
token: string;
};
}
export const RegistrationForm = ({ invite }: RegistrationFormProps) => {
const t = useScopedI18n("user");
const router = useRouter();
const { mutate, isPending } = clientApi.user.register.useMutation();
const form = useZodForm(validation.user.registration, {
initialValues: {
username: "",
password: "",
confirmPassword: "",
},
});
const handleSubmit = (values: z.infer<typeof validation.user.registration>) => {
mutate(
{
...values,
inviteId: invite.id,
token: invite.token,
},
{
onSuccess() {
showSuccessNotification({
title: t("action.register.notification.success.title"),
message: t("action.register.notification.success.message"),
});
router.push("/auth/login");
},
onError(error) {
const message =
error.data?.code === "CONFLICT"
? t("error.usernameTaken")
: t("action.register.notification.error.message");
showErrorNotification({
title: t("action.register.notification.error.title"),
message,
});
},
},
);
};
return (
<Stack gap="xl">
<form onSubmit={form.onSubmit(handleSubmit)}>
<Stack gap="lg">
<TextInput label={t("field.username.label")} autoComplete="off" {...form.getInputProps("username")} />
<CustomPasswordInput
withPasswordRequirements
label={t("field.password.label")}
autoComplete="new-password"
{...form.getInputProps("password")}
/>
<PasswordInput
label={t("field.passwordConfirm.label")}
autoComplete="new-password"
{...form.getInputProps("confirmPassword")}
/>
<Button type="submit" fullWidth loading={isPending}>
{t("action.register.label")}
</Button>
</Stack>
</form>
</Stack>
);
};
@@ -0,0 +1,69 @@
import { notFound } from "next/navigation";
import { Card, Center, Stack, Text, Title } from "@mantine/core";
import { auth } from "@homarr/auth/next";
import { isProviderEnabled } from "@homarr/auth/server";
import { and, db, eq } from "@homarr/db";
import { invites } from "@homarr/db/schema/sqlite";
import { getScopedI18n } from "@homarr/translation/server";
import { HomarrLogoWithTitle } from "~/components/layout/logo/homarr-logo";
import { RegistrationForm } from "./_registration-form";
interface InviteUsagePageProps {
params: {
id: string;
};
searchParams: {
token: string;
};
}
export default async function InviteUsagePage({ params, searchParams }: InviteUsagePageProps) {
if (!isProviderEnabled("credentials")) notFound();
const session = await auth();
if (session) notFound();
const invite = await db.query.invites.findFirst({
where: and(eq(invites.id, params.id), eq(invites.token, searchParams.token)),
columns: {
id: true,
token: true,
expirationDate: true,
},
with: {
creator: {
columns: {
name: true,
},
},
},
});
if (!invite || invite.expirationDate < new Date()) notFound();
const t = await getScopedI18n("user.page.invite");
return (
<Center>
<Stack align="center" mt="xl">
<HomarrLogoWithTitle size="lg" />
<Stack gap={6} align="center">
<Title order={3} fw={400} ta="center">
{t("title")}
</Title>
<Text size="sm" c="gray.5" ta="center">
{t("subtitle")}
</Text>
</Stack>
<Card bg="dark.8" w={64 * 6} maw="90vw">
<RegistrationForm invite={invite} />
</Card>
<Text size="xs" c="gray.5" ta="center">
{t("description", { username: invite.creator.name })}
</Text>
</Stack>
</Center>
);
}
@@ -1,82 +1,185 @@
"use client";
import { useState } from "react";
import type { PropsWithChildren } from "react";
import { useCallback, useEffect, useRef, useState } from "react";
import { useRouter } from "next/navigation";
import {
Alert,
Button,
PasswordInput,
rem,
Stack,
TextInput,
} from "@mantine/core";
import { IconAlertTriangle } from "@tabler/icons-react";
import { Anchor, Button, Card, Code, Collapse, Divider, PasswordInput, Stack, Text, TextInput } from "@mantine/core";
import { useDisclosure } from "@mantine/hooks";
import { signIn } from "@homarr/auth/client";
import { useForm, zodResolver } from "@homarr/form";
import { revalidatePathActionAsync } from "@homarr/common/client";
import type { useForm } from "@homarr/form";
import { useZodForm } from "@homarr/form";
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
import { useScopedI18n } from "@homarr/translation/client";
import type { z } from "@homarr/validation";
import { validation } from "@homarr/validation";
import { validation, z } from "@homarr/validation";
export const LoginForm = () => {
interface LoginFormProps {
providers: string[];
oidcClientName: string;
isOidcAutoLoginEnabled: boolean;
callbackUrl: string;
}
const extendedValidation = validation.user.signIn.extend({ provider: z.enum(["credentials", "ldap"]) });
export const LoginForm = ({ providers, oidcClientName, isOidcAutoLoginEnabled, callbackUrl }: LoginFormProps) => {
const t = useScopedI18n("user");
const router = useRouter();
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState<string>();
const form = useForm<FormType>({
validate: zodResolver(validation.user.signIn),
const [isPending, setIsPending] = useState(false);
const form = useZodForm(extendedValidation, {
initialValues: {
name: "",
password: "",
provider: "credentials",
},
});
const handleSubmit = async (values: FormType) => {
setIsLoading(true);
setError(undefined);
await signIn("credentials", {
...values,
redirect: false,
callbackUrl: "/",
})
.then((response) => {
if (!response?.ok || response.error) {
throw response?.error;
}
const credentialInputsVisible = providers.includes("credentials") || providers.includes("ldap");
void router.push("/");
})
.catch((error: Error | string) => {
setIsLoading(false);
setError(error.toString());
const onSuccess = useCallback(
async (response: Awaited<ReturnType<typeof signIn>>) => {
if (response && (!response.ok || response.error)) {
// eslint-disable-next-line @typescript-eslint/only-throw-error
throw response.error;
}
showSuccessNotification({
title: t("action.login.notification.success.title"),
message: t("action.login.notification.success.message"),
});
};
// Redirect to the callback URL if the response is defined and comes from a credentials provider (ldap or credentials). oidc is redirected automatically.
if (response) {
await revalidatePathActionAsync("/");
router.push(callbackUrl);
}
},
[t, router, callbackUrl],
);
const onError = useCallback(() => {
setIsPending(false);
showErrorNotification({
title: t("action.login.notification.error.title"),
message: t("action.login.notification.error.message"),
autoClose: 10000,
});
}, [t]);
const signInAsync = useCallback(
async (provider: string, options?: Parameters<typeof signIn>[1]) => {
setIsPending(true);
await signIn(provider, {
...options,
redirect: false,
callbackUrl: new URL(callbackUrl, window.location.href).href,
})
.then(onSuccess)
.catch(onError);
},
[setIsPending, onSuccess, onError, callbackUrl],
);
const isLoginInProgress = useRef(false);
useEffect(() => {
if (isOidcAutoLoginEnabled && !isPending && !isLoginInProgress.current) {
isLoginInProgress.current = true;
void signInAsync("oidc");
}
}, [signInAsync, isOidcAutoLoginEnabled, isPending]);
return (
<Stack gap="xl">
<form onSubmit={form.onSubmit((values) => void handleSubmit(values))}>
<Stack gap="lg">
<TextInput
label={t("field.username.label")}
{...form.getInputProps("name")}
/>
<PasswordInput
label={t("field.password.label")}
{...form.getInputProps("password")}
/>
<Button type="submit" fullWidth loading={isLoading}>
{t("action.login")}
</Button>
</Stack>
</form>
<Stack gap="lg">
{credentialInputsVisible && (
<>
<form onSubmit={form.onSubmit((credentials) => void signInAsync(credentials.provider, credentials))}>
<Stack gap="lg">
<TextInput label={t("field.username.label")} {...form.getInputProps("name")} />
<PasswordInput label={t("field.password.label")} {...form.getInputProps("password")} />
{error && (
<Alert icon={<IconAlertTriangle size={rem(16)} />} color="red">
{error}
</Alert>
)}
{providers.includes("credentials") && (
<Stack gap="sm">
<SubmitButton isPending={isPending} form={form} provider="credentials">
{t("action.login.label")}
</SubmitButton>
<PasswordForgottenCollapse username={form.values.name} />
</Stack>
)}
{providers.includes("ldap") && (
<SubmitButton isPending={isPending} form={form} provider="ldap">
{t("action.login.labelWith", { provider: "LDAP" })}
</SubmitButton>
)}
</Stack>
</form>
{providers.includes("oidc") && <Divider label="OIDC" labelPosition="center" />}
</>
)}
{providers.includes("oidc") && (
<Button fullWidth variant="light" onClick={async () => await signInAsync("oidc")}>
{t("action.login.labelWith", { provider: oidcClientName })}
</Button>
)}
</Stack>
</Stack>
);
};
type FormType = z.infer<typeof validation.user.signIn>;
interface SubmitButtonProps {
isPending: boolean;
form: ReturnType<typeof useForm<FormType, (values: FormType) => FormType>>;
provider: "credentials" | "ldap";
}
const SubmitButton = ({ isPending, form, provider, children }: PropsWithChildren<SubmitButtonProps>) => {
const isCurrentProviderActive = form.getValues().provider === provider;
return (
<Button
type="submit"
name={provider}
fullWidth
onClick={() => form.setFieldValue("provider", provider)}
loading={isPending && isCurrentProviderActive}
disabled={isPending && !isCurrentProviderActive}
>
{children}
</Button>
);
};
interface PasswordForgottenCollapseProps {
username: string;
}
const PasswordForgottenCollapse = ({ username }: PasswordForgottenCollapseProps) => {
const [visible, { toggle }] = useDisclosure(false);
const tForgotPassword = useScopedI18n("user.action.login.forgotPassword");
const commandUsername = username.trim().length >= 1 ? username.trim() : "<username>";
return (
<>
<Anchor type="button" component="button" onClick={toggle}>
{tForgotPassword("label")}
</Anchor>
<Collapse in={visible}>
<Card>
<Stack gap="xs">
<Text size="sm">{tForgotPassword("description")}</Text>
<Code>homarr reset-password -u {commandUsername}</Code>
</Stack>
</Card>
</Collapse>
</>
);
};
type FormType = z.infer<typeof extendedValidation>;
@@ -1,11 +1,26 @@
import { redirect } from "next/navigation";
import { Card, Center, Stack, Text, Title } from "@mantine/core";
import { env } from "@homarr/auth/env.mjs";
import { auth } from "@homarr/auth/next";
import { getScopedI18n } from "@homarr/translation/server";
import { HomarrLogoWithTitle } from "~/components/layout/logo/homarr-logo";
import { LoginForm } from "./_login-form";
export default async function Login() {
interface LoginProps {
searchParams: {
callbackUrl?: string;
};
}
export default async function Login({ searchParams }: LoginProps) {
const session = await auth();
if (session) {
redirect(searchParams.callbackUrl ?? "/");
}
const t = await getScopedI18n("user.page.login");
return (
@@ -21,7 +36,12 @@ export default async function Login() {
</Text>
</Stack>
<Card bg="dark.8" w={64 * 6} maw="90vw">
<LoginForm />
<LoginForm
providers={env.AUTH_PROVIDERS}
oidcClientName={env.AUTH_OIDC_CLIENT_NAME}
isOidcAutoLoginEnabled={env.AUTH_OIDC_AUTO_LOGIN}
callbackUrl={searchParams.callbackUrl ?? "/"}
/>
</Card>
</Stack>
</Center>
@@ -3,7 +3,7 @@ import { api } from "@homarr/api/server";
import { createBoardContentPage } from "../_creator";
export default createBoardContentPage<{ locale: string }>({
async getInitialBoard() {
return await api.board.getDefaultBoard();
async getInitialBoardAsync() {
return await api.board.getHomeBoard();
},
});
@@ -1,6 +1,6 @@
import definition from "./_definition";
const { generateMetadata, page } = definition;
const { generateMetadataAsync: generateMetadata, page } = definition;
export default page;
@@ -3,7 +3,7 @@ import { api } from "@homarr/api/server";
import { createBoardContentPage } from "../_creator";
export default createBoardContentPage<{ locale: string; name: string }>({
async getInitialBoard({ name }) {
async getInitialBoardAsync({ name }) {
return await api.board.getBoardByName({ name });
},
});
@@ -1,6 +1,6 @@
import definition from "./_definition";
const { generateMetadata, page } = definition;
const { generateMetadataAsync: generateMetadata, page } = definition;
export default page;
@@ -18,9 +18,7 @@ export const updateBoardName = (name: string | null) => {
boardName = name;
};
type UpdateCallback = (
prev: RouterOutputs["board"]["getDefaultBoard"],
) => RouterOutputs["board"]["getDefaultBoard"];
type UpdateCallback = (prev: RouterOutputs["board"]["getHomeBoard"]) => RouterOutputs["board"]["getHomeBoard"];
export const useUpdateBoard = () => {
const utils = clientApi.useUtils();
@@ -46,9 +44,9 @@ export const ClientBoard = () => {
const board = useRequiredBoard();
const isReady = useIsBoardReady();
const sortedSections = board.sections.sort(
(sectionA, sectionB) => sectionA.position - sectionB.position,
);
const fullWidthSortedSections = board.sections
.filter((section) => section.kind === "empty" || section.kind === "category")
.sort((sectionA, sectionB) => sectionA.yOffset - sectionB.yOffset);
const ref = useRef<HTMLDivElement>(null);
@@ -61,24 +59,12 @@ export const ClientBoard = () => {
loaderProps={{ size: "lg" }}
h={fullHeightWithoutHeaderAndFooter}
/>
<Stack
ref={ref}
h="100%"
style={{ visibility: isReady ? "visible" : "hidden" }}
>
{sortedSections.map((section) =>
<Stack ref={ref} h="100%" style={{ visibility: isReady ? "visible" : "hidden" }}>
{fullWidthSortedSections.map((section) =>
section.kind === "empty" ? (
<BoardEmptySection
key={section.id}
section={section}
mainRef={ref}
/>
<BoardEmptySection key={section.id} section={section} />
) : (
<BoardCategorySection
key={section.id}
section={section}
mainRef={ref}
/>
<BoardCategorySection key={section.id} section={section} />
),
)}
</Stack>
@@ -1,13 +1,7 @@
"use client";
import type { PropsWithChildren } from "react";
import {
createContext,
useCallback,
useContext,
useEffect,
useState,
} from "react";
import type { Dispatch, PropsWithChildren, SetStateAction } from "react";
import { createContext, useCallback, useContext, useEffect, useState } from "react";
import { usePathname } from "next/navigation";
import type { RouterOutputs } from "@homarr/api";
@@ -16,9 +10,11 @@ import { clientApi } from "@homarr/api/client";
import { updateBoardName } from "./_client";
const BoardContext = createContext<{
board: RouterOutputs["board"]["getDefaultBoard"];
board: RouterOutputs["board"]["getHomeBoard"];
isReady: boolean;
markAsReady: (id: string) => void;
isEditMode: boolean;
setEditMode: Dispatch<SetStateAction<boolean>>;
} | null>(null);
export const BoardProvider = ({
@@ -30,11 +26,11 @@ export const BoardProvider = ({
const pathname = usePathname();
const utils = clientApi.useUtils();
const [readySections, setReadySections] = useState<string[]>([]);
const [isEditMode, setEditMode] = useState(false);
const { data } = clientApi.board.getBoardByName.useQuery(
{ name: initialBoard.name },
{
initialData: initialBoard,
refetchOnMount: false,
refetchOnWindowFocus: false,
refetchOnReconnect: false,
},
@@ -52,18 +48,12 @@ export const BoardProvider = ({
}, [pathname, utils, initialBoard.name]);
useEffect(() => {
setReadySections((previous) =>
previous.filter((id) =>
data.sections.some((section) => section.id === id),
),
);
setReadySections((previous) => previous.filter((id) => data.sections.some((section) => section.id === id)));
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [data.sections.length, setReadySections]);
const markAsReady = useCallback((id: string) => {
setReadySections((previous) =>
previous.includes(id) ? previous : [...previous, id],
);
setReadySections((previous) => (previous.includes(id) ? previous : [...previous, id]));
}, []);
return (
@@ -72,6 +62,8 @@ export const BoardProvider = ({
board: data,
isReady: data.sections.length === readySections.length,
markAsReady,
isEditMode,
setEditMode,
}}
>
{children}
@@ -114,3 +106,13 @@ export const useOptionalBoard = () => {
return context?.board;
};
export const useEditMode = () => {
const context = useContext(BoardContext);
if (!context) {
throw new Error("Board is required");
}
return [context.isEditMode, context.setEditMode] as const;
};
@@ -1,11 +1,15 @@
import type { Metadata } from "next";
import { TRPCError } from "@trpc/server";
import { capitalize } from "@homarr/common";
// Placed here because gridstack styles are used for board content
import "~/styles/gridstack.scss";
import { IntegrationProvider } from "@homarr/auth/client";
import { auth } from "@homarr/auth/next";
import { getIntegrationsWithPermissionsAsync } from "@homarr/auth/server";
import { getI18n } from "@homarr/translation/server";
import { createMetaTitle } from "~/metadata";
import { createBoardLayout } from "../_layout-creator";
import type { Board } from "../_types";
import { ClientBoard } from "./_client";
@@ -14,35 +18,41 @@ import { BoardContentHeaderActions } from "./_header-actions";
export type Params = Record<string, unknown>;
interface Props<TParams extends Params> {
getInitialBoard: (params: TParams) => Promise<Board>;
getInitialBoardAsync: (params: TParams) => Promise<Board>;
}
export const createBoardContentPage = <
TParams extends Record<string, unknown>,
>({
getInitialBoard,
export const createBoardContentPage = <TParams extends Record<string, unknown>>({
getInitialBoardAsync: getInitialBoard,
}: Props<TParams>) => {
return {
layout: createBoardLayout({
headerActions: <BoardContentHeaderActions />,
getInitialBoard,
isBoardContentPage: true,
getInitialBoardAsync: getInitialBoard,
}),
page: () => {
return <ClientBoard />;
// eslint-disable-next-line no-restricted-syntax
page: async () => {
const session = await auth();
const integrations = await getIntegrationsWithPermissionsAsync(session);
return (
<IntegrationProvider integrations={integrations}>
<ClientBoard />
</IntegrationProvider>
);
},
generateMetadata: async ({
params,
}: {
params: TParams;
}): Promise<Metadata> => {
generateMetadataAsync: async ({ params }: { params: TParams }): Promise<Metadata> => {
try {
const board = await getInitialBoard(params);
const t = await getI18n();
return {
title: board.metaTitle ?? `${capitalize(board.name)} board | Homarr`,
title: board.metaTitle ?? createMetaTitle(t("board.content.metaTitle", { boardName: board.name })),
icons: {
icon: board.faviconImageUrl ? board.faviconImageUrl : undefined,
apple: board.faviconImageUrl ? board.faviconImageUrl : undefined,
},
appleWebApp: {
startupImage: { url: board.faviconImageUrl ? board.faviconImageUrl : "/logo/logo.png" },
},
};
} catch (error) {
@@ -0,0 +1,9 @@
"use client";
import { useRequiredBoard } from "./_context";
export const CustomCss = () => {
const board = useRequiredBoard();
return <style>{board.customCss}</style>;
};
@@ -2,37 +2,34 @@
import { useCallback } from "react";
import { Group, Menu } from "@mantine/core";
import { useHotkeys } from "@mantine/hooks";
import {
IconBox,
IconBoxAlignTop,
IconChevronDown,
IconPackageImport,
IconPencil,
IconPencilOff,
IconPlus,
IconResize,
IconSettings,
} from "@tabler/icons-react";
import { useAtom, useAtomValue } from "jotai";
import { clientApi } from "@homarr/api/client";
import { revalidatePathActionAsync } from "@homarr/common/client";
import { useModalAction } from "@homarr/modals";
import {
showErrorNotification,
showSuccessNotification,
} from "@homarr/notifications";
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
import { useI18n, useScopedI18n } from "@homarr/translation/client";
import { revalidatePathAction } from "~/app/revalidatePathAction";
import { editModeAtom } from "~/components/board/editMode";
import { ItemSelectModal } from "~/components/board/items/item-select-modal";
import { useBoardPermissions } from "~/components/board/permissions/client";
import { useCategoryActions } from "~/components/board/sections/category/category-actions";
import { CategoryEditModal } from "~/components/board/sections/category/category-edit-modal";
import { useDynamicSectionActions } from "~/components/board/sections/dynamic/dynamic-actions";
import { HeaderButton } from "~/components/layout/header/button";
import { useRequiredBoard } from "./_context";
import { useEditMode, useRequiredBoard } from "./_context";
export const BoardContentHeaderActions = () => {
const isEditMode = useAtomValue(editModeAtom);
const [isEditMode] = useEditMode();
const board = useRequiredBoard();
const { hasChangeAccess } = useBoardPermissions(board);
@@ -54,10 +51,10 @@ export const BoardContentHeaderActions = () => {
};
const AddMenu = () => {
const { openModal: openCategoryEditModal } =
useModalAction(CategoryEditModal);
const { openModal: openCategoryEditModal } = useModalAction(CategoryEditModal);
const { openModal: openItemSelectModal } = useModalAction(ItemSelectModal);
const { addCategoryToEnd } = useCategoryActions();
const { addDynamicSection } = useDynamicSectionActions();
const t = useI18n();
const handleAddCategory = useCallback(
@@ -95,65 +92,57 @@ const AddMenu = () => {
</HeaderButton>
</Menu.Target>
<Menu.Dropdown style={{ transform: "translate(-3px, 0)" }}>
<Menu.Item
leftSection={<IconBox size={20} />}
onClick={handleSelectItem}
>
<Menu.Item leftSection={<IconBox size={20} />} onClick={handleSelectItem}>
{t("item.action.create")}
</Menu.Item>
<Menu.Item leftSection={<IconPackageImport size={20} />}>
{t("item.action.import")}
</Menu.Item>
<Menu.Divider />
<Menu.Item
leftSection={<IconBoxAlignTop size={20} />}
onClick={handleAddCategory}
>
<Menu.Item leftSection={<IconBoxAlignTop size={20} />} onClick={handleAddCategory}>
{t("section.category.action.create")}
</Menu.Item>
<Menu.Item leftSection={<IconResize size={20} />} onClick={addDynamicSection}>
{t("section.dynamic.action.create")}
</Menu.Item>
</Menu.Dropdown>
</Menu>
);
};
const EditModeMenu = () => {
const [isEditMode, setEditMode] = useAtom(editModeAtom);
const [isEditMode, setEditMode] = useEditMode();
const board = useRequiredBoard();
const utils = clientApi.useUtils();
const t = useScopedI18n("board.action.edit");
const { mutate: saveBoard, isPending } =
clientApi.board.saveBoard.useMutation({
onSuccess() {
showSuccessNotification({
title: t("notification.success.title"),
message: t("notification.success.message"),
});
void utils.board.getBoardByName.invalidate({ name: board.name });
void revalidatePathAction(`/boards/${board.name}`);
setEditMode(false);
},
onError() {
showErrorNotification({
title: t("notification.error.title"),
message: t("notification.error.message"),
});
},
});
const { mutate: saveBoard, isPending } = clientApi.board.saveBoard.useMutation({
onSuccess() {
showSuccessNotification({
title: t("notification.success.title"),
message: t("notification.success.message"),
});
void utils.board.getBoardByName.invalidate({ name: board.name });
void revalidatePathActionAsync(`/boards/${board.name}`);
setEditMode(false);
},
onError() {
showErrorNotification({
title: t("notification.error.title"),
message: t("notification.error.message"),
});
},
});
const toggle = useCallback(() => {
if (isEditMode) return saveBoard(board);
setEditMode(true);
}, [board, isEditMode, saveBoard, setEditMode]);
useHotkeys([["mod+e", toggle]]);
return (
<HeaderButton onClick={toggle} loading={isPending}>
{isEditMode ? (
<IconPencilOff stroke={1.5} />
) : (
<IconPencil stroke={1.5} />
)}
{isEditMode ? <IconPencilOff stroke={1.5} /> : <IconPencil stroke={1.5} />}
</HeaderButton>
);
};
@@ -22,9 +22,7 @@ export const BoardMantineProvider = ({ children }: PropsWithChildren) => {
};
export const generateColors = (hex: string) => {
const lightnessForColors = [
-0.25, -0.2, -0.15, -0.1, -0.05, 0, 0.05, 0.1, 0.15, 0.2,
] as const;
const lightnessForColors = [-0.25, -0.2, -0.15, -0.1, -0.05, 0, 0.05, 0.1, 0.15, 0.2] as const;
const rgbaColors = lightnessForColors.map((lightness) => {
if (lightness < 0) {
return lighten(hex, -lightness);
@@ -35,6 +33,7 @@ export const generateColors = (hex: string) => {
return rgbaColors.map((color) => {
return (
"#" +
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
color
.split("(")[1]!
.replaceAll(" ", "")
@@ -5,8 +5,7 @@ import { createBoardLayout } from "../_layout-creator";
export default createBoardLayout<{ locale: string; name: string }>({
headerActions: <BoardOtherHeaderActions />,
async getInitialBoard({ name }) {
async getInitialBoardAsync({ name }) {
return await api.board.getBoardByName({ name });
},
isBoardContentPage: false,
});
@@ -1,105 +0,0 @@
"use client";
import { useState } from "react";
import { Group, Stack, Tabs } from "@mantine/core";
import { IconUser, IconUserDown, IconUsersGroup } from "@tabler/icons-react";
import type { RouterOutputs } from "@homarr/api";
import { clientApi } from "@homarr/api/client";
import { useScopedI18n } from "@homarr/translation/client";
import type { TablerIcon } from "@homarr/ui";
import { CountBadge } from "@homarr/ui";
import type { Board } from "../../_types";
import { GroupsForm } from "./_access/group-access";
import { InheritTable } from "./_access/inherit-access";
import { UsersForm } from "./_access/user-access";
interface Props {
board: Board;
initialPermissions: RouterOutputs["board"]["getBoardPermissions"];
}
export const AccessSettingsContent = ({ board, initialPermissions }: Props) => {
const { data: permissions } = clientApi.board.getBoardPermissions.useQuery(
{
id: board.id,
},
{
initialData: initialPermissions,
refetchOnMount: false,
refetchOnWindowFocus: false,
refetchOnReconnect: false,
},
);
const [counts, setCounts] = useState({
user: initialPermissions.userPermissions.length + (board.creator ? 1 : 0),
group: initialPermissions.groupPermissions.length,
});
return (
<Stack>
<Tabs color="red" defaultValue="user">
<Tabs.List grow>
<TabItem value="user" count={counts.user} icon={IconUser} />
<TabItem value="group" count={counts.group} icon={IconUsersGroup} />
<TabItem
value="inherited"
count={initialPermissions.inherited.length}
icon={IconUserDown}
/>
</Tabs.List>
<Tabs.Panel value="user">
<UsersForm
board={board}
initialPermissions={permissions}
onCountChange={(callback) =>
setCounts(({ user, ...others }) => ({
user: callback(user),
...others,
}))
}
/>
</Tabs.Panel>
<Tabs.Panel value="group">
<GroupsForm
board={board}
initialPermissions={permissions}
onCountChange={(callback) =>
setCounts(({ group, ...others }) => ({
group: callback(group),
...others,
}))
}
/>
</Tabs.Panel>
<Tabs.Panel value="inherited">
<InheritTable initialPermissions={permissions} />
</Tabs.Panel>
</Tabs>
</Stack>
);
};
interface TabItemProps {
value: "user" | "group" | "inherited";
count: number;
icon: TablerIcon;
}
const TabItem = ({ value, icon: Icon, count }: TabItemProps) => {
const t = useScopedI18n("board.setting.section.access.permission");
return (
<Tabs.Tab value={value} leftSection={<Icon stroke={1.5} size={16} />}>
<Group gap="sm">
{t(`tab.${value}`)}
<CountBadge count={count} />
</Group>
</Tabs.Tab>
);
};
@@ -1,139 +0,0 @@
import { useCallback } from "react";
import type { ReactNode } from "react";
import type { SelectProps } from "@mantine/core";
import {
Button,
Flex,
Group,
Select,
TableTd,
TableTr,
Text,
} from "@mantine/core";
import {
IconCheck,
IconEye,
IconPencil,
IconSettings,
} from "@tabler/icons-react";
import type { BoardPermission } from "@homarr/definitions";
import { boardPermissions } from "@homarr/definitions";
import { useI18n, useScopedI18n } from "@homarr/translation/client";
import type { TablerIcon } from "@homarr/ui";
import type { OnCountChange } from "./form";
import { useFormContext } from "./form";
const icons = {
"board-change": IconPencil,
"board-view": IconEye,
"board-full": IconSettings,
} satisfies Record<BoardPermission | "board-full", TablerIcon>;
interface BoardAccessSelectRowProps {
itemContent: ReactNode;
permission: BoardPermission;
index: number;
onCountChange: OnCountChange;
}
export const BoardAccessSelectRow = ({
itemContent,
permission,
index,
onCountChange,
}: BoardAccessSelectRowProps) => {
const tRoot = useI18n();
const tPermissions = useScopedI18n("board.setting.section.access.permission");
const form = useFormContext();
const Icon = icons[permission];
const handleRemove = useCallback(() => {
form.setFieldValue(
"items",
form.values.items.filter((_, i) => i !== index),
);
onCountChange((prev) => prev - 1);
}, [form, index, onCountChange]);
return (
<TableTr>
<TableTd w={{ sm: 128, lg: 256 }}>{itemContent}</TableTd>
<TableTd>
<Flex
direction={{ base: "column", xs: "row" }}
align={{ base: "end", xs: "center" }}
wrap="nowrap"
>
<Select
allowDeselect={false}
flex="1"
leftSection={<Icon size="1rem" />}
renderOption={RenderOption}
variant="unstyled"
data={boardPermissions.map((permission) => ({
value: permission,
label: tPermissions(`item.${permission}.label`),
}))}
{...form.getInputProps(`items.${index}.permission`)}
/>
<Button size="xs" variant="subtle" onClick={handleRemove}>
{tRoot("common.action.remove")}
</Button>
</Flex>
</TableTd>
</TableTr>
);
};
interface BoardAccessDisplayRowProps {
itemContent: ReactNode;
permission: BoardPermission | "board-full";
}
export const BoardAccessDisplayRow = ({
itemContent,
permission,
}: BoardAccessDisplayRowProps) => {
const tPermissions = useScopedI18n("board.setting.section.access.permission");
const Icon = icons[permission];
return (
<TableTr>
<TableTd w={{ sm: 128, lg: 256 }}>{itemContent}</TableTd>
<TableTd>
<Group gap={0}>
<Flex w={34} h={34} align="center" justify="center">
<Icon
size="1rem"
color="var(--input-section-color, var(--mantine-color-dimmed))"
/>
</Flex>
<Text size="sm">{tPermissions(`item.${permission}.label`)}</Text>
</Group>
</TableTd>
</TableTr>
);
};
const iconProps = {
stroke: 1.5,
color: "currentColor",
opacity: 0.6,
size: "1rem",
};
const RenderOption: SelectProps["renderOption"] = ({ option, checked }) => {
const Icon = icons[option.value as BoardPermission];
return (
<Group flex="1" gap="xs" wrap="nowrap">
<Icon {...iconProps} />
{option.label}
{checked && (
<IconCheck style={{ marginInlineStart: "auto" }} {...iconProps} />
)}
</Group>
);
};
@@ -1,14 +0,0 @@
import type { BoardPermission } from "@homarr/definitions";
import { createFormContext } from "@homarr/form";
export interface BoardAccessFormType {
items: {
itemId: string;
permission: BoardPermission;
}[];
}
export const [FormProvider, useFormContext, useForm] =
createFormContext<BoardAccessFormType>();
export type OnCountChange = (callback: (prev: number) => number) => void;
@@ -1,148 +0,0 @@
import { useCallback, useState } from "react";
import Link from "next/link";
import {
Anchor,
Button,
Group,
Stack,
Table,
TableTbody,
TableTh,
TableThead,
TableTr,
} from "@mantine/core";
import { IconPlus } from "@tabler/icons-react";
import type { RouterOutputs } from "@homarr/api";
import { clientApi } from "@homarr/api/client";
import { useModalAction } from "@homarr/modals";
import { useI18n, useScopedI18n } from "@homarr/translation/client";
import { BoardAccessSelectRow } from "./board-access-table-rows";
import type { BoardAccessFormType } from "./form";
import { FormProvider, useForm } from "./form";
import { GroupSelectModal } from "./group-select-modal";
import type { FormProps } from "./user-access";
export const GroupsForm = ({
board,
initialPermissions,
onCountChange,
}: FormProps) => {
const { mutate, isPending } =
clientApi.board.saveGroupBoardPermissions.useMutation();
const utils = clientApi.useUtils();
const [groups, setGroups] = useState<Map<string, Group>>(
new Map(
initialPermissions.groupPermissions.map(({ group }) => [group.id, group]),
),
);
const { openModal } = useModalAction(GroupSelectModal);
const t = useI18n();
const tPermissions = useScopedI18n("board.setting.section.access.permission");
const form = useForm({
initialValues: {
items: initialPermissions.groupPermissions.map(
({ group, permission }) => ({
itemId: group.id,
permission,
}),
),
},
});
const handleSubmit = useCallback(
(values: BoardAccessFormType) => {
mutate(
{
id: board.id,
permissions: values.items,
},
{
onSuccess: () => {
void utils.board.getBoardPermissions.invalidate();
},
},
);
},
[board.id, mutate, utils.board.getBoardPermissions],
);
const handleAddUser = useCallback(() => {
openModal({
presentGroupIds: form.values.items.map(({ itemId: id }) => id),
onSelect: (group) => {
setGroups((prev) => new Map(prev).set(group.id, group));
form.setFieldValue("items", [
{
itemId: group.id,
permission: "board-view",
},
...form.values.items,
]);
onCountChange((prev) => prev + 1);
},
});
}, [form, openModal, onCountChange]);
return (
<form onSubmit={form.onSubmit(handleSubmit)}>
<FormProvider form={form}>
<Stack pt="sm">
<Table>
<TableThead>
<TableTr>
<TableTh style={{ whiteSpace: "nowrap" }}>
{tPermissions("field.group.label")}
</TableTh>
<TableTh>{tPermissions("field.permission.label")}</TableTh>
</TableTr>
</TableThead>
<TableTbody>
{form.values.items.map((row, index) => (
<BoardAccessSelectRow
key={row.itemId}
itemContent={
<GroupItemContent group={groups.get(row.itemId)!} />
}
permission={row.permission}
index={index}
onCountChange={onCountChange}
/>
))}
</TableTbody>
</Table>
<Group justify="space-between">
<Button
rightSection={<IconPlus size="1rem" />}
variant="light"
onClick={handleAddUser}
>
{t("common.action.add")}
</Button>
<Button type="submit" loading={isPending} color="teal">
{t("common.action.saveChanges")}
</Button>
</Group>
</Stack>
</FormProvider>
</form>
);
};
export const GroupItemContent = ({ group }: { group: Group }) => {
return (
<Anchor
component={Link}
href={`/manage/users/groups/${group.id}`}
size="sm"
style={{ whiteSpace: "nowrap" }}
>
{group.name}
</Anchor>
);
};
type Group =
RouterOutputs["board"]["getBoardPermissions"]["groupPermissions"][0]["group"];
@@ -1,72 +0,0 @@
import { useState } from "react";
import { Button, Group, Loader, Select, Stack } from "@mantine/core";
import { clientApi } from "@homarr/api/client";
import { useForm } from "@homarr/form";
import { createModal } from "@homarr/modals";
import { useI18n } from "@homarr/translation/client";
interface InnerProps {
presentGroupIds: string[];
onSelect: (props: { id: string; name: string }) => void | Promise<void>;
confirmLabel?: string;
}
interface GroupSelectFormType {
groupId: string;
}
export const GroupSelectModal = createModal<InnerProps>(
({ actions, innerProps }) => {
const t = useI18n();
const { data: groups, isPending } = clientApi.group.selectable.useQuery();
const [loading, setLoading] = useState(false);
const form = useForm<GroupSelectFormType>();
const handleSubmit = async (values: GroupSelectFormType) => {
const currentGroup = groups?.find((group) => group.id === values.groupId);
if (!currentGroup) return;
setLoading(true);
await innerProps.onSelect({
id: currentGroup.id,
name: currentGroup.name,
});
setLoading(false);
actions.closeModal();
};
const confirmLabel = innerProps.confirmLabel ?? t("common.action.add");
return (
<form onSubmit={form.onSubmit((values) => void handleSubmit(values))}>
<Stack>
<Select
{...form.getInputProps("groupId")}
label={t("group.action.select.label")}
clearable
searchable
leftSection={isPending ? <Loader size="xs" /> : undefined}
nothingFoundMessage={t("group.action.select.notFound")}
limit={5}
data={groups
?.filter(
(group) => !innerProps.presentGroupIds.includes(group.id),
)
.map((group) => ({ value: group.id, label: group.name }))}
/>
<Group justify="end">
<Button variant="default" onClick={actions.closeModal}>
{t("common.action.cancel")}
</Button>
<Button type="submit" loading={loading}>
{confirmLabel}
</Button>
</Group>
</Stack>
</form>
);
},
).withOptions({
defaultTitle: (t) =>
t("board.setting.section.access.permission.groupSelect.title"),
});
@@ -1,66 +0,0 @@
import {
Stack,
Table,
TableTbody,
TableTh,
TableThead,
TableTr,
} from "@mantine/core";
import type { RouterOutputs } from "@homarr/api";
import { getPermissionsWithChildren } from "@homarr/definitions";
import type { BoardPermission, GroupPermissionKey } from "@homarr/definitions";
import { useScopedI18n } from "@homarr/translation/client";
import { BoardAccessDisplayRow } from "./board-access-table-rows";
import { GroupItemContent } from "./group-access";
export interface InheritTableProps {
initialPermissions: RouterOutputs["board"]["getBoardPermissions"];
}
const mapPermissions = {
"board-full-access": "board-full",
"board-modify-all": "board-change",
"board-view-all": "board-view",
} satisfies Partial<Record<GroupPermissionKey, BoardPermission | "board-full">>;
export const InheritTable = ({ initialPermissions }: InheritTableProps) => {
const tPermissions = useScopedI18n("board.setting.section.access.permission");
return (
<Stack pt="sm">
<Table>
<TableThead>
<TableTr>
<TableTh>{tPermissions("field.user.label")}</TableTh>
<TableTh>{tPermissions("field.permission.label")}</TableTh>
</TableTr>
</TableThead>
<TableTbody>
{initialPermissions.inherited.map(({ group, permission }) => {
const boardPermission =
permission in mapPermissions
? mapPermissions[permission as keyof typeof mapPermissions]
: getPermissionsWithChildren([permission]).includes(
"board-full-access",
)
? "board-full"
: null;
if (!boardPermission) {
return null;
}
return (
<BoardAccessDisplayRow
key={group.id}
itemContent={<GroupItemContent group={group} />}
permission={boardPermission}
/>
);
})}
</TableTbody>
</Table>
</Stack>
);
};
@@ -1,173 +0,0 @@
import { useCallback, useState } from "react";
import Link from "next/link";
import {
Anchor,
Box,
Button,
Group,
Stack,
Table,
TableTbody,
TableTh,
TableThead,
TableTr,
} from "@mantine/core";
import { IconPlus } from "@tabler/icons-react";
import type { RouterOutputs } from "@homarr/api";
import { clientApi } from "@homarr/api/client";
import { useModalAction } from "@homarr/modals";
import { useI18n, useScopedI18n } from "@homarr/translation/client";
import { UserAvatar } from "@homarr/ui";
import type { Board } from "../../../_types";
import {
BoardAccessDisplayRow,
BoardAccessSelectRow,
} from "./board-access-table-rows";
import type { BoardAccessFormType, OnCountChange } from "./form";
import { FormProvider, useForm } from "./form";
import { UserSelectModal } from "./user-select-modal";
export interface FormProps {
board: Pick<Board, "id" | "creatorId" | "creator">;
initialPermissions: RouterOutputs["board"]["getBoardPermissions"];
onCountChange: OnCountChange;
}
export const UsersForm = ({
board,
initialPermissions,
onCountChange,
}: FormProps) => {
const { mutate, isPending } =
clientApi.board.saveUserBoardPermissions.useMutation();
const utils = clientApi.useUtils();
const [users, setUsers] = useState<Map<string, User>>(
new Map(
initialPermissions.userPermissions.map(({ user }) => [user.id, user]),
),
);
const { openModal } = useModalAction(UserSelectModal);
const t = useI18n();
const tPermissions = useScopedI18n("board.setting.section.access.permission");
const form = useForm({
initialValues: {
items: initialPermissions.userPermissions.map(({ user, permission }) => ({
itemId: user.id,
permission,
})),
},
});
const handleSubmit = useCallback(
(values: BoardAccessFormType) => {
mutate(
{
id: board.id,
permissions: values.items,
},
{
onSuccess: () => {
void utils.board.getBoardPermissions.invalidate();
},
},
);
},
[board.id, mutate, utils.board.getBoardPermissions],
);
const handleAddUser = useCallback(() => {
const presentUserIds = form.values.items.map(({ itemId: id }) => id);
openModal({
presentUserIds: board.creatorId
? presentUserIds.concat(board.creatorId)
: presentUserIds,
onSelect: (user) => {
setUsers((prev) => new Map(prev).set(user.id, user));
form.setFieldValue("items", [
{
itemId: user.id,
permission: "board-view",
},
...form.values.items,
]);
onCountChange((prev) => prev + 1);
},
});
}, [form, openModal, board.creatorId, onCountChange]);
return (
<form onSubmit={form.onSubmit(handleSubmit)}>
<FormProvider form={form}>
<Stack pt="sm">
<Table>
<TableThead>
<TableTr>
<TableTh>{tPermissions("field.user.label")}</TableTh>
<TableTh>{tPermissions("field.permission.label")}</TableTh>
</TableTr>
</TableThead>
<TableTbody>
{board.creator && (
<BoardAccessDisplayRow
itemContent={<UserItemContent user={board.creator} />}
permission="board-full"
/>
)}
{form.values.items.map((row, index) => (
<BoardAccessSelectRow
key={row.itemId}
itemContent={
<UserItemContent user={users.get(row.itemId)!} />
}
permission={row.permission}
index={index}
onCountChange={onCountChange}
/>
))}
</TableTbody>
</Table>
<Group justify="space-between">
<Button
rightSection={<IconPlus size="1rem" />}
variant="light"
onClick={handleAddUser}
>
{t("common.action.add")}
</Button>
<Button type="submit" loading={isPending} color="teal">
{t("common.action.saveChanges")}
</Button>
</Group>
</Stack>
</FormProvider>
</form>
);
};
const UserItemContent = ({ user }: { user: User }) => {
return (
<Group wrap="nowrap">
<Box visibleFrom="xs">
<UserAvatar user={user} size="sm" />
</Box>
<Anchor
component={Link}
href={`/manage/users/${user.id}`}
size="sm"
style={{ whiteSpace: "nowrap" }}
>
{user.name}
</Anchor>
</Group>
);
};
interface User {
id: string;
name: string | null;
image: string | null;
}
@@ -1,112 +0,0 @@
import { useState } from "react";
import type { SelectProps } from "@mantine/core";
import { Button, Group, Loader, Select, Stack } from "@mantine/core";
import { IconCheck } from "@tabler/icons-react";
import type { RouterOutputs } from "@homarr/api";
import { clientApi } from "@homarr/api/client";
import { useForm } from "@homarr/form";
import { createModal } from "@homarr/modals";
import { useI18n } from "@homarr/translation/client";
import { UserAvatar } from "@homarr/ui";
interface InnerProps {
presentUserIds: string[];
onSelect: (props: {
id: string;
name: string;
image: string;
}) => void | Promise<void>;
confirmLabel?: string;
}
interface UserSelectFormType {
userId: string;
}
export const UserSelectModal = createModal<InnerProps>(
({ actions, innerProps }) => {
const t = useI18n();
const { data: users, isPending } = clientApi.user.selectable.useQuery();
const [loading, setLoading] = useState(false);
const form = useForm<UserSelectFormType>();
const handleSubmit = async (values: UserSelectFormType) => {
const currentUser = users?.find((user) => user.id === values.userId);
if (!currentUser) return;
setLoading(true);
await innerProps.onSelect({
id: currentUser.id,
name: currentUser.name ?? "",
image: currentUser.image ?? "",
});
setLoading(false);
actions.closeModal();
};
const confirmLabel = innerProps.confirmLabel ?? t("common.action.add");
const currentUser = users?.find((user) => user.id === form.values.userId);
return (
<form onSubmit={form.onSubmit((values) => void handleSubmit(values))}>
<Stack>
<Select
{...form.getInputProps("userId")}
label={t("user.action.select.label")}
searchable
clearable
leftSection={
isPending ? (
<Loader size="xs" />
) : currentUser ? (
<UserAvatar user={currentUser} size="xs" />
) : undefined
}
nothingFoundMessage={t("user.action.select.notFound")}
renderOption={createRenderOption(users ?? [])}
limit={5}
data={users
?.filter((user) => !innerProps.presentUserIds.includes(user.id))
.map((user) => ({ value: user.id, label: user.name ?? "" }))}
/>
<Group justify="end">
<Button variant="default" onClick={actions.closeModal}>
{t("common.action.cancel")}
</Button>
<Button type="submit" loading={loading}>
{confirmLabel}
</Button>
</Group>
</Stack>
</form>
);
},
).withOptions({
defaultTitle: (t) =>
t("board.setting.section.access.permission.userSelect.title"),
});
const iconProps = {
stroke: 1.5,
color: "currentColor",
opacity: 0.6,
size: "1rem",
};
const createRenderOption = (
users: RouterOutputs["user"]["selectable"],
): SelectProps["renderOption"] =>
function InnerRenderRoot({ option, checked }) {
const user = users.find((user) => user.id === option.value);
if (!user) return null;
return (
<Group flex="1" gap="xs">
<UserAvatar user={user} size="xs" />
{option.label}
{checked && (
<IconCheck style={{ marginInlineStart: "auto" }} {...iconProps} />
)}
</Group>
);
};
@@ -2,16 +2,13 @@
import { Button, Grid, Group, Stack, TextInput } from "@mantine/core";
import {
backgroundImageAttachments,
backgroundImageRepeats,
backgroundImageSizes,
} from "@homarr/definitions";
import { useForm } from "@homarr/form";
import { backgroundImageAttachments, backgroundImageRepeats, backgroundImageSizes } from "@homarr/definitions";
import { useZodForm } from "@homarr/form";
import type { TranslationObject } from "@homarr/translation";
import { useI18n } from "@homarr/translation/client";
import type { SelectItemWithDescriptionBadge } from "@homarr/ui";
import { SelectWithDescriptionBadge } from "@homarr/ui";
import { validation } from "@homarr/validation";
import type { Board } from "../../_types";
import { useSavePartialSettingsMutation } from "./_shared";
@@ -21,9 +18,8 @@ interface Props {
}
export const BackgroundSettingsContent = ({ board }: Props) => {
const t = useI18n();
const { mutate: savePartialSettings, isPending } =
useSavePartialSettingsMutation(board);
const form = useForm({
const { mutate: savePartialSettings, isPending } = useSavePartialSettingsMutation(board);
const form = useZodForm(validation.board.savePartialSettings, {
initialValues: {
backgroundImageUrl: board.backgroundImageUrl ?? "",
backgroundImageAttachment: board.backgroundImageAttachment,
@@ -36,14 +32,8 @@ export const BackgroundSettingsContent = ({ board }: Props) => {
"backgroundImageAttachment",
backgroundImageAttachments,
);
const backgroundImageSizeData = useBackgroundOptionData(
"backgroundImageSize",
backgroundImageSizes,
);
const backgroundImageRepeatData = useBackgroundOptionData(
"backgroundImageRepeat",
backgroundImageRepeats,
);
const backgroundImageSizeData = useBackgroundOptionData("backgroundImageSize", backgroundImageSizes);
const backgroundImageRepeatData = useBackgroundOptionData("backgroundImageRepeat", backgroundImageRepeats);
return (
<form
@@ -95,13 +85,9 @@ export const BackgroundSettingsContent = ({ board }: Props) => {
);
};
type BackgroundImageKey =
| "backgroundImageAttachment"
| "backgroundImageSize"
| "backgroundImageRepeat";
type BackgroundImageKey = "backgroundImageAttachment" | "backgroundImageSize" | "backgroundImageRepeat";
type inferOptions<TKey extends BackgroundImageKey> =
TranslationObject["board"]["field"][TKey]["option"];
type inferOptions<TKey extends BackgroundImageKey> = TranslationObject["board"]["field"][TKey]["option"];
const useBackgroundOptionData = <
TKey extends BackgroundImageKey,
@@ -119,9 +105,7 @@ const useBackgroundOptionData = <
(value) =>
({
label: t(`board.field.${key}.option.${value as string}.label` as never),
description: t(
`board.field.${key}.option.${value as string}.description` as never,
),
description: t(`board.field.${key}.option.${value as string}.description` as never),
value: value as string,
badge:
data.defaultValue === value
@@ -0,0 +1,69 @@
"use client";
import { IconEye, IconPencil, IconSettings } from "@tabler/icons-react";
import type { RouterOutputs } from "@homarr/api";
import { clientApi } from "@homarr/api/client";
import { boardPermissions, boardPermissionsMap } from "@homarr/definitions";
import { useI18n } from "@homarr/translation/client";
import { AccessSettings } from "~/components/access/access-settings";
import type { Board } from "../../_types";
interface Props {
board: Board;
initialPermissions: RouterOutputs["board"]["getBoardPermissions"];
}
export const BoardAccessSettings = ({ board, initialPermissions }: Props) => {
const groupMutation = clientApi.board.saveGroupBoardPermissions.useMutation();
const userMutation = clientApi.board.saveUserBoardPermissions.useMutation();
const utils = clientApi.useUtils();
const t = useI18n();
const { data: permissions } = clientApi.board.getBoardPermissions.useQuery(
{
id: board.id,
},
{
initialData: initialPermissions,
refetchOnMount: false,
refetchOnWindowFocus: false,
refetchOnReconnect: false,
},
);
return (
<AccessSettings
entity={{
id: board.id,
ownerId: board.creatorId,
owner: board.creator,
}}
query={{
invalidate: () => utils.board.getBoardPermissions.invalidate(),
data: permissions,
}}
groupsMutation={{
mutate: groupMutation.mutate,
isPending: groupMutation.isPending,
}}
usersMutation={{
mutate: userMutation.mutate,
isPending: userMutation.isPending,
}}
translate={(key) => t(`board.setting.section.access.permission.item.${key}.label`)}
permission={{
items: boardPermissions,
default: "view",
fullAccessGroupPermission: "board-full-all",
groupPermissionMapping: boardPermissionsMap,
icons: {
modify: IconPencil,
view: IconEye,
full: IconSettings,
},
}}
/>
);
};
@@ -17,8 +17,9 @@ import {
} from "@mantine/core";
import { useDisclosure } from "@mantine/hooks";
import { useForm } from "@homarr/form";
import { useZodForm } from "@homarr/form";
import { useI18n } from "@homarr/translation/client";
import { validation } from "@homarr/validation";
import type { Board } from "../../_types";
import { generateColors } from "../../(content)/_theme";
@@ -33,7 +34,7 @@ const hexRegex = /^#[0-9a-fA-F]{6}$/;
const progressPercentageLabel = (value: number) => `${value}%`;
export const ColorSettingsContent = ({ board }: Props) => {
const form = useForm({
const form = useZodForm(validation.board.savePartialSettings, {
initialValues: {
primaryColor: board.primaryColor,
secondaryColor: board.secondaryColor,
@@ -43,8 +44,7 @@ export const ColorSettingsContent = ({ board }: Props) => {
const [showPreview, { toggle }] = useDisclosure(false);
const t = useI18n();
const theme = useMantineTheme();
const { mutate: savePartialSettings, isPending } =
useSavePartialSettingsMutation(board);
const { mutate: savePartialSettings, isPending } = useSavePartialSettingsMutation(board);
return (
<form
@@ -76,11 +76,7 @@ export const ColorSettingsContent = ({ board }: Props) => {
/>
</Grid.Col>
<Grid.Col span={12}>
<Anchor onClick={toggle}>
{showPreview
? t("common.preview.hide")
: t("common.preview.show")}
</Anchor>
<Anchor onClick={toggle}>{showPreview ? t("common.preview.hide") : t("common.preview.show")}</Anchor>
</Grid.Col>
<Grid.Col span={12}>
<Collapse in={showPreview}>
@@ -114,15 +110,13 @@ export const ColorSettingsContent = ({ board }: Props) => {
};
interface ColorsPreviewProps {
previewColor: string;
previewColor: string | undefined;
}
const ColorsPreview = ({ previewColor }: ColorsPreviewProps) => {
const theme = useMantineTheme();
const colors = hexRegex.test(previewColor)
? generateColors(previewColor)
: generateColors("#000000");
const colors = previewColor && hexRegex.test(previewColor) ? generateColors(previewColor) : generateColors("#000000");
return (
<Group gap={0} wrap="nowrap">
@@ -1,7 +1,91 @@
"use client";
// TODO: add some sort of store (maybe directory on GitHub)
import { Alert, Button, Group, Input, Stack } from "@mantine/core";
import { highlight, languages } from "prismjs";
import Editor from "react-simple-code-editor";
export const CustomCssSettingsContent = () => {
return null;
import "~/styles/prismjs.scss";
import { IconInfoCircle } from "@tabler/icons-react";
import { useForm } from "@homarr/form";
import { useI18n, useScopedI18n } from "@homarr/translation/client";
import type { Board } from "../../_types";
import { useSavePartialSettingsMutation } from "./_shared";
import classes from "./customcss.module.css";
interface Props {
board: Board;
}
export const CustomCssSettingsContent = ({ board }: Props) => {
const t = useI18n();
const customCssT = useScopedI18n("board.field.customCss");
const { mutate: savePartialSettings, isPending } = useSavePartialSettingsMutation(board);
const form = useForm({
initialValues: {
customCss: board.customCss ?? "",
},
});
return (
<form
onSubmit={form.onSubmit((values) => {
savePartialSettings({
id: board.id,
...values,
});
})}
>
<Stack>
<CustomCssInput {...form.getInputProps("customCss")} />
<Alert variant="light" color="cyan" title={customCssT("customClassesAlert.title")} icon={<IconInfoCircle />}>
{customCssT("customClassesAlert.description")}
</Alert>
<Group justify="end">
<Button type="submit" loading={isPending} color="teal">
{t("common.action.saveChanges")}
</Button>
</Group>
</Stack>
</form>
);
};
interface CustomCssInputProps {
value?: string;
onChange: (value: string) => void;
}
const CustomCssInput = ({ value, onChange }: CustomCssInputProps) => {
const customCssT = useScopedI18n("board.field.customCss");
return (
<Input.Wrapper
label={customCssT("label")}
labelProps={{
htmlFor: "custom-css",
}}
description={customCssT("description")}
inputWrapperOrder={["label", "description", "input", "error"]}
>
<div className={classes.codeEditorRoot}>
<Editor
textareaId="custom-css"
onValueChange={onChange}
value={value ?? ""}
highlight={(code) => highlight(code, languages.extend("css", {}), "css")}
padding={10}
style={{
fontFamily: '"Fira code", "Fira Mono", monospace',
fontSize: 12,
minHeight: 250,
}}
/>
</div>
</Input.Wrapper>
);
};
@@ -20,8 +20,7 @@ export const DangerZoneSettingsContent = () => {
const { openModal } = useModalAction(BoardRenameModal);
const { mutate: changeVisibility, isPending: isChangeVisibilityPending } =
clientApi.board.changeBoardVisibility.useMutation();
const { mutate: deleteBoard, isPending: isDeletePending } =
clientApi.board.deleteBoard.useMutation();
const { mutate: deleteBoard, isPending: isDeletePending } = clientApi.board.deleteBoard.useMutation();
const utils = clientApi.useUtils();
const visibility = board.isPublic ? "public" : "private";
@@ -37,12 +36,8 @@ export const DangerZoneSettingsContent = () => {
const onVisibilityClick = useCallback(() => {
openConfirmModal({
title: t(
`section.dangerZone.action.visibility.confirm.${visibility}.title`,
),
children: t(
`section.dangerZone.action.visibility.confirm.${visibility}.description`,
),
title: t(`section.dangerZone.action.visibility.confirm.${visibility}.title`),
children: t(`section.dangerZone.action.visibility.confirm.${visibility}.description`),
onConfirm: () => {
changeVisibility(
{
@@ -52,7 +47,7 @@ export const DangerZoneSettingsContent = () => {
{
onSettled() {
void utils.board.getBoardByName.invalidate({ name: board.name });
void utils.board.getDefaultBoard.invalidate();
void utils.board.getHomeBoard.invalidate();
},
},
);
@@ -64,7 +59,7 @@ export const DangerZoneSettingsContent = () => {
changeVisibility,
t,
utils.board.getBoardByName,
utils.board.getDefaultBoard,
utils.board.getHomeBoard,
visibility,
openConfirmModal,
]);
@@ -98,12 +93,8 @@ export const DangerZoneSettingsContent = () => {
<Divider />
<DangerZoneRow
label={t("section.dangerZone.action.visibility.label")}
description={t(
`section.dangerZone.action.visibility.description.${visibility}`,
)}
buttonText={t(
`section.dangerZone.action.visibility.button.${visibility}`,
)}
description={t(`section.dangerZone.action.visibility.description.${visibility}`)}
buttonText={t(`section.dangerZone.action.visibility.button.${visibility}`)}
onClick={onVisibilityClick}
isPending={isChangeVisibilityPending}
/>
@@ -127,13 +118,7 @@ interface DangerZoneRowProps {
onClick: () => void;
}
const DangerZoneRow = ({
label,
description,
buttonText,
onClick,
isPending,
}: DangerZoneRowProps) => {
const DangerZoneRow = ({ label, description, buttonText, onClick, isPending }: DangerZoneRowProps) => {
return (
<Group justify="space-between" px="md" className={classes.dangerZoneGroup}>
<Stack gap={0}>
@@ -143,12 +128,7 @@ const DangerZoneRow = ({
<Text size="sm">{description}</Text>
</Stack>
<Group justify="end" w={{ base: "100%", xs: "auto" }}>
<Button
variant="subtle"
color="red"
loading={isPending}
onClick={onClick}
>
<Button variant="subtle" color="red" loading={isPending} onClick={onClick}>
{buttonText}
</Button>
</Group>
@@ -1,25 +1,15 @@
"use client";
import { useEffect, useRef } from "react";
import {
Button,
Grid,
Group,
Loader,
Stack,
TextInput,
Tooltip,
} from "@mantine/core";
import {
useDebouncedValue,
useDocumentTitle,
useFavicon,
} from "@mantine/hooks";
import { Button, Grid, Group, Loader, Stack, TextInput, Tooltip } from "@mantine/core";
import { useDebouncedValue, useDocumentTitle, useFavicon } from "@mantine/hooks";
import { IconAlertTriangle } from "@tabler/icons-react";
import { useForm } from "@homarr/form";
import { useZodForm } from "@homarr/form";
import { useI18n } from "@homarr/translation/client";
import { validation } from "@homarr/validation";
import { createMetaTitle } from "~/metadata";
import type { Board } from "../../_types";
import { useUpdateBoard } from "../../(content)/_client";
import { useSavePartialSettingsMutation } from "./_shared";
@@ -36,22 +26,31 @@ export const GeneralSettingsContent = ({ board }: Props) => {
});
const { updateBoard } = useUpdateBoard();
const { mutate: savePartialSettings, isPending } =
useSavePartialSettingsMutation(board);
const form = useForm({
initialValues: {
pageTitle: board.pageTitle ?? "",
logoImageUrl: board.logoImageUrl ?? "",
metaTitle: board.metaTitle ?? "",
faviconImageUrl: board.faviconImageUrl ?? "",
const { mutate: savePartialSettings, isPending } = useSavePartialSettingsMutation(board);
const form = useZodForm(
validation.board.savePartialSettings
.pick({
pageTitle: true,
logoImageUrl: true,
metaTitle: true,
faviconImageUrl: true,
})
.required(),
{
initialValues: {
pageTitle: board.pageTitle ?? "",
logoImageUrl: board.logoImageUrl ?? "",
metaTitle: board.metaTitle ?? "",
faviconImageUrl: board.faviconImageUrl ?? "",
},
onValuesChange({ pageTitle }) {
updateBoard((previous) => ({
...previous,
pageTitle,
}));
},
},
onValuesChange({ pageTitle }) {
updateBoard((previous) => ({
...previous,
pageTitle,
}));
},
});
);
const metaTitleStatus = useMetaTitlePreview(form.values.metaTitle);
const faviconStatus = useFaviconPreview(form.values.faviconImageUrl);
@@ -94,7 +93,7 @@ export const GeneralSettingsContent = ({ board }: Props) => {
<Grid.Col span={{ xs: 12, md: 6 }}>
<TextInput
label={t("board.field.metaTitle.label")}
placeholder="Default Board | Homarr"
placeholder={createMetaTitle(t("board.content.metaTitle", { boardName: board.name }))}
rightSection={<PendingOrInvalidIndicator {...metaTitleStatus} />}
{...form.getInputProps("metaTitle")}
/>
@@ -126,22 +125,12 @@ export const GeneralSettingsContent = ({ board }: Props) => {
);
};
const PendingOrInvalidIndicator = ({
isPending,
isInvalid,
}: {
isPending: boolean;
isInvalid?: boolean;
}) => {
const PendingOrInvalidIndicator = ({ isPending, isInvalid }: { isPending: boolean; isInvalid?: boolean }) => {
const t = useI18n();
if (isInvalid) {
return (
<Tooltip
multiline
w={220}
label={t("board.setting.section.general.unrecognizedLink")}
>
<Tooltip multiline w={220} label={t("board.setting.section.general.unrecognizedLink")}>
<IconAlertTriangle size="1rem" color="red" />
</Tooltip>
);
@@ -183,8 +172,7 @@ const useMetaTitlePreview = (title: string | null) => {
const validFaviconExtensions = ["ico", "png", "svg", "gif"];
const isValidUrl = (url: string) =>
url.includes("/") &&
validFaviconExtensions.some((extension) => url.endsWith(`.${extension}`));
url.includes("/") && validFaviconExtensions.some((extension) => url.endsWith(`.${extension}`));
const useFaviconPreview = (url: string | null) => {
const [faviconDebounced] = useDebouncedValue(url ?? "", 500);
@@ -2,8 +2,9 @@
import { Button, Grid, Group, Input, Slider, Stack } from "@mantine/core";
import { useForm } from "@homarr/form";
import { useZodForm } from "@homarr/form";
import { useI18n } from "@homarr/translation/client";
import { validation } from "@homarr/validation";
import type { Board } from "../../_types";
import { useSavePartialSettingsMutation } from "./_shared";
@@ -13,9 +14,8 @@ interface Props {
}
export const LayoutSettingsContent = ({ board }: Props) => {
const t = useI18n();
const { mutate: savePartialSettings, isPending } =
useSavePartialSettingsMutation(board);
const form = useForm({
const { mutate: savePartialSettings, isPending } = useSavePartialSettingsMutation(board);
const form = useZodForm(validation.board.savePartialSettings.pick({ columnCount: true }).required(), {
initialValues: {
columnCount: board.columnCount,
},
@@ -34,13 +34,7 @@ export const LayoutSettingsContent = ({ board }: Props) => {
<Grid>
<Grid.Col span={{ sm: 12, md: 6 }}>
<Input.Wrapper label={t("board.field.columnCount.label")}>
<Slider
mt="xs"
min={1}
max={24}
step={1}
{...form.getInputProps("columnCount")}
/>
<Slider mt="xs" min={1} max={24} step={1} {...form.getInputProps("columnCount")} />
</Input.Wrapper>
</Grid.Col>
</Grid>
@@ -7,7 +7,7 @@ export const useSavePartialSettingsMutation = (board: Board) => {
return clientApi.board.savePartialBoardSettings.useMutation({
onSettled() {
void utils.board.getBoardByName.invalidate({ name: board.name });
void utils.board.getDefaultBoard.invalidate();
void utils.board.getHomeBoard.invalidate();
},
});
};
@@ -0,0 +1,22 @@
.codeEditorFooter {
border-bottom-left-radius: var(--mantine-radius-sm);
border-bottom-right-radius: var(--mantine-radius-sm);
background-color: light-dark(var(--mantine-color-gray-1), var(--mantine-color-dark-7));
}
.codeEditorRoot {
margin-top: 4px;
border-color: light-dark(var(--mantine-color-gray-4), var(--mantine-color-dark-4));
border-width: 1px;
border-style: solid;
border-radius: var(--mantine-radius-sm);
}
.codeEditor {
background-color: light-dark(white, var(--mantine-color-dark-6));
font-size: var(--mantine-font-size-xs);
}
.codeEditor ::placeholder {
color: light-dark(var(--mantine-color-gray-5), var(--mantine-color-dark-3));
}
@@ -1,14 +1,6 @@
import type { PropsWithChildren } from "react";
import { notFound } from "next/navigation";
import {
AccordionControl,
AccordionItem,
AccordionPanel,
Container,
Stack,
Text,
Title,
} from "@mantine/core";
import { AccordionControl, AccordionItem, AccordionPanel, Container, Stack, Text, Title } from "@mantine/core";
import {
IconAlertTriangle,
IconBrush,
@@ -26,10 +18,10 @@ import type { TranslationObject } from "@homarr/translation";
import { getScopedI18n } from "@homarr/translation/server";
import type { TablerIcon } from "@homarr/ui";
import { getBoardPermissions } from "~/components/board/permissions/server";
import { getBoardPermissionsAsync } from "~/components/board/permissions/server";
import { ActiveTabAccordion } from "../../../../../components/active-tab-accordion";
import { AccessSettingsContent } from "./_access";
import { BackgroundSettingsContent } from "./_background";
import { BoardAccessSettings } from "./_board-access";
import { ColorSettingsContent } from "./_colors";
import { CustomCssSettingsContent } from "./_customCss";
import { DangerZoneSettingsContent } from "./_danger";
@@ -45,15 +37,15 @@ interface Props {
};
}
const getBoardAndPermissions = async (params: Props["params"]) => {
const getBoardAndPermissionsAsync = async (params: Props["params"]) => {
try {
const board = await api.board.getBoardByName({ name: params.name });
const { hasFullAccess } = await getBoardPermissions(board);
const { hasFullAccess } = await getBoardPermissionsAsync(board);
const permissions = hasFullAccess
? await api.board.getBoardPermissions({ id: board.id })
: {
userPermissions: [],
groupPermissions: [],
users: [],
groups: [],
inherited: [],
};
@@ -69,22 +61,16 @@ const getBoardAndPermissions = async (params: Props["params"]) => {
}
};
export default async function BoardSettingsPage({
params,
searchParams,
}: Props) {
const { board, permissions } = await getBoardAndPermissions(params);
const { hasFullAccess } = await getBoardPermissions(board);
export default async function BoardSettingsPage({ params, searchParams }: Props) {
const { board, permissions } = await getBoardAndPermissionsAsync(params);
const { hasFullAccess } = await getBoardPermissionsAsync(board);
const t = await getScopedI18n("board.setting");
return (
<Container>
<Stack>
<Title>{t("title", { boardName: capitalize(board.name) })}</Title>
<ActiveTabAccordion
variant="separated"
defaultValue={searchParams.tab ?? "general"}
>
<ActiveTabAccordion variant="separated" defaultValue={searchParams.tab ?? "general"}>
<AccordionItemFor value="general" icon={IconSettings}>
<GeneralSettingsContent board={board} />
</AccordionItemFor>
@@ -98,22 +84,14 @@ export default async function BoardSettingsPage({
<ColorSettingsContent board={board} />
</AccordionItemFor>
<AccordionItemFor value="customCss" icon={IconFileTypeCss}>
<CustomCssSettingsContent />
<CustomCssSettingsContent board={board} />
</AccordionItemFor>
{hasFullAccess && (
<>
<AccordionItemFor value="access" icon={IconUser}>
<AccessSettingsContent
board={board}
initialPermissions={permissions}
/>
<BoardAccessSettings board={board} initialPermissions={permissions} />
</AccordionItemFor>
<AccordionItemFor
value="dangerZone"
icon={IconAlertTriangle}
danger
noPadding
>
<AccordionItemFor value="dangerZone" icon={IconAlertTriangle} danger noPadding>
<DangerZoneSettingsContent />
</AccordionItemFor>
</>
@@ -131,13 +109,7 @@ type AccordionItemForProps = PropsWithChildren<{
noPadding?: boolean;
}>;
const AccordionItemFor = async ({
value,
children,
icon: Icon,
danger,
noPadding,
}: AccordionItemForProps) => {
const AccordionItemFor = async ({ value, children, icon: Icon, danger, noPadding }: AccordionItemForProps) => {
const t = await getScopedI18n("board.setting.section");
return (
<AccordionItem
@@ -158,13 +130,7 @@ const AccordionItemFor = async ({
{t(`${value}.title`)}
</Text>
</AccordionControl>
<AccordionPanel
styles={
noPadding
? { content: { paddingRight: 0, paddingLeft: 0 } }
: undefined
}
>
<AccordionPanel styles={noPadding ? { content: { paddingRight: 0, paddingLeft: 0 } } : undefined}>
{children}
</AccordionPanel>
</AccordionItem>
@@ -4,7 +4,6 @@ import { AppShellMain } from "@mantine/core";
import { TRPCError } from "@trpc/server";
import { logger } from "@homarr/log";
import { GlobalItemServerDataRunner } from "@homarr/widgets";
import { MainHeader } from "~/components/layout/header";
import { BoardLogoWithTitle } from "~/components/layout/logo/board-logo";
@@ -12,18 +11,17 @@ import { ClientShell } from "~/components/layout/shell";
import type { Board } from "./_types";
import { BoardProvider } from "./(content)/_context";
import type { Params } from "./(content)/_creator";
import { CustomCss } from "./(content)/_custom-css";
import { BoardMantineProvider } from "./(content)/_theme";
interface CreateBoardLayoutProps<TParams extends Params> {
headerActions: JSX.Element;
getInitialBoard: (params: TParams) => Promise<Board>;
isBoardContentPage: boolean;
getInitialBoardAsync: (params: TParams) => Promise<Board>;
}
export const createBoardLayout = <TParams extends Params>({
headerActions,
getInitialBoard,
isBoardContentPage,
getInitialBoardAsync: getInitialBoard,
}: CreateBoardLayoutProps<TParams>) => {
const Layout = async ({
params,
@@ -41,23 +39,19 @@ export const createBoardLayout = <TParams extends Params>({
});
return (
<GlobalItemServerDataRunner
board={initialBoard}
shouldRun={isBoardContentPage}
>
<BoardProvider initialBoard={initialBoard}>
<BoardMantineProvider>
<ClientShell hasNavigation={false}>
<MainHeader
logo={<BoardLogoWithTitle size="md" hideTitleOnMobile />}
actions={headerActions}
hasNavigation={false}
/>
<AppShellMain>{children}</AppShellMain>
</ClientShell>
</BoardMantineProvider>
</BoardProvider>
</GlobalItemServerDataRunner>
<BoardProvider initialBoard={initialBoard}>
<BoardMantineProvider>
<CustomCss />
<ClientShell hasNavigation={false}>
<MainHeader
logo={<BoardLogoWithTitle size="md" hideTitleOnMobile />}
actions={headerActions}
hasNavigation={false}
/>
<AppShellMain>{children}</AppShellMain>
</ClientShell>
</BoardMantineProvider>
</BoardProvider>
);
};
@@ -1,14 +1,12 @@
import type { RouterOutputs } from "@homarr/api";
import type { WidgetKind } from "@homarr/definitions";
export type Board = RouterOutputs["board"]["getDefaultBoard"];
export type Board = RouterOutputs["board"]["getHomeBoard"];
export type Section = Board["sections"][number];
export type Item = Section["items"][number];
export type CategorySection = Extract<Section, { kind: "category" }>;
export type EmptySection = Extract<Section, { kind: "empty" }>;
export type DynamicSection = Extract<Section, { kind: "dynamic" }>;
export type ItemOfKind<TKind extends WidgetKind> = Extract<
Item,
{ kind: TKind }
>;
export type ItemOfKind<TKind extends WidgetKind> = Extract<Item, { kind: TKind }>;
+7 -10
View File
@@ -5,14 +5,11 @@ type PropsWithChildren = Required<React.PropsWithChildren>;
export const composeWrappers = (
wrappers: React.FunctionComponent<PropsWithChildren>[],
): React.FunctionComponent<PropsWithChildren> => {
return wrappers
.reverse()
.reduce((Acc, Current): React.FunctionComponent<PropsWithChildren> => {
// eslint-disable-next-line react/display-name
return (props) => (
<Current>
<Acc {...props} />
</Current>
);
});
return wrappers.reverse().reduce((Acc, Current): React.FunctionComponent<PropsWithChildren> => {
return (props) => (
<Current>
<Acc {...props} />
</Current>
);
});
};
@@ -4,24 +4,18 @@ import { useRouter } from "next/navigation";
import { Button, PasswordInput, Stack, TextInput } from "@mantine/core";
import { clientApi } from "@homarr/api/client";
import { useForm, zodResolver } from "@homarr/form";
import {
showErrorNotification,
showSuccessNotification,
} from "@homarr/notifications";
import { useZodForm } from "@homarr/form";
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
import { useScopedI18n } from "@homarr/translation/client";
import { CustomPasswordInput } from "@homarr/ui";
import type { z } from "@homarr/validation";
import { validation } from "@homarr/validation";
export const InitUserForm = () => {
const router = useRouter();
const t = useScopedI18n("user");
const { mutateAsync, error, isPending } =
clientApi.user.initUser.useMutation();
const form = useForm<FormType>({
validate: zodResolver(validation.user.init),
validateInputOnBlur: true,
validateInputOnChange: true,
const { mutateAsync, error, isPending } = clientApi.user.initUser.useMutation();
const form = useZodForm(validation.user.init, {
initialValues: {
username: "",
password: "",
@@ -29,7 +23,7 @@ export const InitUserForm = () => {
},
});
const handleSubmit = async (values: FormType) => {
const handleSubmitAsync = async (values: FormType) => {
await mutateAsync(values, {
onSuccess: () => {
showSuccessNotification({
@@ -51,23 +45,18 @@ export const InitUserForm = () => {
<Stack gap="xl">
<form
onSubmit={form.onSubmit(
(values) => void handleSubmit(values),
(values) => void handleSubmitAsync(values),
(err) => console.log(err),
)}
>
<Stack gap="lg">
<TextInput
label={t("field.username.label")}
{...form.getInputProps("username")}
/>
<PasswordInput
<TextInput label={t("field.username.label")} {...form.getInputProps("username")} />
<CustomPasswordInput
withPasswordRequirements
label={t("field.password.label")}
{...form.getInputProps("password")}
/>
<PasswordInput
label={t("field.passwordConfirm.label")}
{...form.getInputProps("confirmPassword")}
/>
<PasswordInput label={t("field.passwordConfirm.label")} {...form.getInputProps("confirmPassword")} />
<Button type="submit" fullWidth loading={isPending}>
{t("action.create")}
</Button>
+44 -32
View File
@@ -3,15 +3,21 @@ import { Inter } from "next/font/google";
import "@homarr/notifications/styles.css";
import "@homarr/spotlight/styles.css";
import "@mantine/core/styles.css";
import "@homarr/ui/styles.css";
import "~/styles/scroll-area.scss";
import { ColorSchemeScript, createTheme, MantineProvider } from "@mantine/core";
import { cookies } from "next/headers";
import { env } from "@homarr/auth/env.mjs";
import { auth } from "@homarr/auth/next";
import { ModalProvider } from "@homarr/modals";
import { Notifications } from "@homarr/notifications";
import { getScopedI18n } from "@homarr/translation/server";
import { Analytics } from "~/components/layout/analytics";
import { SearchEngineOptimization } from "~/components/layout/search-engine-optimization";
import { JotaiProvider } from "./_client-providers/jotai";
import { CustomMantineProvider } from "./_client-providers/mantine";
import { NextInternationalProvider } from "./_client-providers/next-international";
import { AuthProvider } from "./_client-providers/session";
import { TRPCReactProvider } from "./_client-providers/trpc";
@@ -22,8 +28,7 @@ const fontSans = Inter({
variable: "--font-sans",
});
export const metadata: Metadata = {
metadataBase: new URL("http://localhost:3000"),
export const generateMetadata = (): Metadata => ({
title: "Homarr",
description:
"Simplify the management of your server with Homarr - a sleek, modern dashboard that puts all of your apps and services at your fingertips.",
@@ -34,12 +39,17 @@ export const metadata: Metadata = {
url: "https://homarr.dev",
siteName: "Homarr Documentation",
},
twitter: {
card: "summary_large_image",
site: "@jullerino",
creator: "@jullerino",
icons: {
icon: "/logo/logo.png",
apple: "/logo/logo.png",
},
};
appleWebApp: {
title: "Homarr",
capable: true,
startupImage: { url: "/logo/logo.png" },
statusBarStyle: getColorScheme() === "dark" ? "black-translucent" : "default",
},
});
export const viewport: Viewport = {
themeColor: [
@@ -48,39 +58,37 @@ export const viewport: Viewport = {
],
};
export default function Layout(props: {
children: React.ReactNode;
params: { locale: string };
}) {
const colorScheme = "dark";
export default async function Layout(props: { children: React.ReactNode; params: { locale: string } }) {
const session = await auth();
const colorScheme = getColorScheme();
const tCommon = await getScopedI18n("common");
const direction = tCommon("direction");
const StackedProvider = composeWrappers([
async (innerProps) => {
const session = await auth();
return <AuthProvider session={session} {...innerProps} />;
(innerProps) => {
return <AuthProvider session={session} logoutUrl={env.AUTH_LOGOUT_REDIRECT_URL} {...innerProps} />;
},
(innerProps) => <JotaiProvider {...innerProps} />,
(innerProps) => <TRPCReactProvider {...innerProps} />,
(innerProps) => (
<NextInternationalProvider {...innerProps} locale={props.params.locale} />
),
(innerProps) => (
<MantineProvider
{...innerProps}
defaultColorScheme="dark"
theme={createTheme({
primaryColor: "red",
autoContrast: true,
})}
/>
),
(innerProps) => <NextInternationalProvider {...innerProps} locale={props.params.locale} />,
(innerProps) => <CustomMantineProvider {...innerProps} />,
(innerProps) => <ModalProvider {...innerProps} />,
]);
return (
<html lang="en" suppressHydrationWarning>
// Instead of ColorSchemScript we use data-mantine-color-scheme to prevent flickering
<html
lang="en"
dir={direction}
data-mantine-color-scheme={colorScheme}
style={{
backgroundColor: colorScheme === "dark" ? "#242424" : "#fff",
}}
suppressHydrationWarning
>
<head>
<ColorSchemeScript defaultColorScheme={colorScheme} />
<Analytics />
<SearchEngineOptimization />
</head>
<body className={["font-sans", fontSans.variable].join(" ")}>
<StackedProvider>
@@ -91,3 +99,7 @@ export default function Layout(props: {
</html>
);
}
const getColorScheme = () => {
return cookies().get("homarr-color-scheme")?.value ?? "dark";
};
@@ -1,17 +1,5 @@
import { Center, Stack, Text, Title } from "@mantine/core";
import { notFound } from "next/navigation";
import { getScopedI18n } from "@homarr/translation/server";
export default async function NotFound() {
const t = await getScopedI18n("management.notFound");
return (
<Center h="100%">
<Stack align="center">
<Title order={1} tt="uppercase">
{t("title")}
</Title>
<Text>{t("text")}</Text>
</Stack>
</Center>
);
export default function NotFound() {
return notFound();
}
@@ -0,0 +1,36 @@
.bannerContainer {
border-radius: 8px;
overflow: hidden;
background: linear-gradient(
130deg,
#fa52521f 0%,
var(--mantine-color-dark-6) 35%,
var(--mantine-color-dark-6) 100%
) !important;
}
.scrollContainer {
height: 100%;
transform: rotateZ(10deg);
}
@keyframes scrolling {
0% {
transform: translateY(0);
}
100% {
transform: translateY(-50.8%);
}
}
.scrollAnimationContainer {
animation: scrolling;
animation-timing-function: linear;
animation-iteration-count: infinite;
}
@media (prefers-reduced-motion: reduce) {
.scrollAnimationContainer {
animation: none !important;
}
}
@@ -0,0 +1,78 @@
import { Box, Grid, GridCol, Group, Image, Stack, Title } from "@mantine/core";
import { splitToNChunks } from "@homarr/common";
import classes from "./hero-banner.module.css";
const icons = [
"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/homarr.svg",
"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/sabnzbd.svg",
"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/deluge.svg",
"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/radarr.svg",
"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/sonarr.svg",
"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/lidarr.svg",
"https://cdn.jsdelivr.net/gh/loganmarchione/homelab-svg-assets/assets/pihole.svg",
"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/dashdot.png",
"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/overseerr.svg",
"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/plex.svg",
"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/jellyfin.svg",
"https://cdn.jsdelivr.net/gh/loganmarchione/homelab-svg-assets/assets/homeassistant.svg",
"https://cdn.jsdelivr.net/gh/loganmarchione/homelab-svg-assets/assets/freshrss.svg",
"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/readarr.svg",
"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/transmission.svg",
"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/qbittorrent.svg",
"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/nzbget.png",
"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/openmediavault.svg",
"https://cdn.jsdelivr.net/gh/loganmarchione/homelab-svg-assets/assets/docker.svg",
"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/jellyseerr.svg",
"https://cdn.jsdelivr.net/gh/loganmarchione/homelab-svg-assets/assets/adguardhome.svg",
"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/tdarr.png",
"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/prowlarr.svg",
];
const countIconGroups = 3;
const animationDurationInSeconds = 12;
export const HeroBanner = () => {
const arrayInChunks = splitToNChunks(icons, countIconGroups);
const gridSpan = 12 / countIconGroups;
return (
<Box className={classes.bannerContainer} p={{ base: "lg", md: "3rem" }} bg="dark.6" pos="relative">
<Stack gap={0}>
<Title fz={{ base: "h4", md: "h2" }} c="dimmed">
Welcome back to your
</Title>
<Group gap="xs" wrap="nowrap">
<Image src="/logo/logo.png" w={{ base: 32, md: 40 }} h={{ base: 32, md: 40 }} />
<Title fz={{ base: "h3", md: "h1" }}>Homarr Board</Title>
</Group>
</Stack>
<Box visibleFrom="md" className={classes.scrollContainer} w={"30%"} top={0} right={0} pos="absolute">
<Grid>
{Array(countIconGroups)
.fill(0)
.map((_, columnIndex) => (
<GridCol key={`grid-column-${columnIndex}`} span={gridSpan}>
<Stack
className={classes.scrollAnimationContainer}
style={{
animationDuration: `${animationDurationInSeconds - columnIndex}s`,
}}
>
{arrayInChunks[columnIndex]?.map((icon, index) => (
<Image key={`grid-column-${columnIndex}-scroll-1-${index}`} src={icon} radius="md" w={50} h={50} />
))}
{/* This is used for making the animation seem seamless */}
{arrayInChunks[columnIndex]?.map((icon, index) => (
<Image key={`grid-column-${columnIndex}-scroll-2-${index}`} src={icon} radius="md" w={50} h={50} />
))}
</Stack>
</GridCol>
))}
</Grid>
</Box>
</Box>
);
};
@@ -0,0 +1,3 @@
.contributorCard {
background-color: light-dark(var(--mantine-color-gray-1), var(--mantine-color-dark-5));
}
@@ -1,36 +0,0 @@
.root {
border-radius: var(--mantine-radius-sm);
background-color: light-dark(
var(--mantine-color-gray-0),
var(--mantine-color-dark-6)
);
}
.item {
background-color: light-dark(
var(--mantine-color-gray-0),
var(--mantine-color-dark-6)
);
border: 1px solid transparent;
position: relative;
z-index: 0;
transition: transform 150ms ease;
&[data-active] {
transform: scale(1.015);
z-index: 1;
background-color: var(--mantine-color-body);
border-color: light-dark(
var(--mantine-color-gray-2),
var(--mantine-color-dark-4)
);
box-shadow: var(--mantine-shadow-md);
border-radius: var(--mantine-radius-md);
}
}
.chevron {
&[data-rotate] {
transform: rotate(-90deg);
}
}
@@ -1,10 +1,15 @@
import { headers } from "next/headers";
import Image from "next/image";
import {
Accordion,
AccordionControl,
AccordionItem,
AccordionPanel,
AspectRatio,
Avatar,
Card,
Center,
Flex,
Group,
List,
ListItem,
@@ -13,62 +18,109 @@ import {
Title,
} from "@mantine/core";
import { IconLanguage, IconLibrary, IconUsers } from "@tabler/icons-react";
import { setStaticParamsLocale } from "next-international/server";
import { getScopedI18n, getStaticParams } from "@homarr/translation/server";
import { getScopedI18n } from "@homarr/translation/server";
import { homarrLogoPath } from "~/components/layout/logo/homarr-logo";
import { DynamicBreadcrumb } from "~/components/navigation/dynamic-breadcrumb";
import { createMetaTitle } from "~/metadata";
import { getPackageAttributesAsync } from "~/versions/package-reader";
import logo from "../../../../../public/logo/logo.png";
import classes from "./accordion.module.css";
import type githubContributorsJson from "../../../../../../../static-data/contributors.json";
import type crowdinContributorsJson from "../../../../../../../static-data/translators.json";
import classes from "./about.module.css";
export async function generateMetadata() {
const t = await getScopedI18n("management");
const metaTitle = `${t("metaTitle")} • Homarr`;
return {
title: metaTitle,
title: createMetaTitle(t("metaTitle")),
};
}
interface PageProps {
params: {
locale: string;
};
}
const getHost = () => {
if (process.env.HOSTNAME) {
return `${process.env.HOSTNAME}:3000`;
}
export default async function AboutPage({ params: { locale } }: PageProps) {
setStaticParamsLocale(locale);
return headers().get("host");
};
export default async function AboutPage() {
const baseServerUrl = `http://${getHost()}`;
const t = await getScopedI18n("management.page.about");
const attributes = await getPackageAttributesAsync();
const githubContributors = (await fetch(`${baseServerUrl}/api/about/contributors/github`).then((res) =>
res.json(),
)) as typeof githubContributorsJson;
const crowdinContributors = (await fetch(`${baseServerUrl}/api/about/contributors/crowdin`).then((res) =>
res.json(),
)) as typeof crowdinContributorsJson;
return (
<div>
<DynamicBreadcrumb />
<Center w="100%">
<Group py="lg">
<Image src={logo} width={100} height={100} alt="" />
<Image src={homarrLogoPath} width={100} height={100} alt="" />
<Stack gap={0}>
<Title order={1} tt="uppercase">
Homarr
</Title>
<Title order={2}>
{t("version", { version: attributes.version })}
</Title>
<Title order={2}>{t("version", { version: attributes.version })}</Title>
</Stack>
</Group>
</Center>
<Text mb="xl">{t("text")}</Text>
<Accordion classNames={classes}>
<Accordion defaultValue="contributors" variant="filled" radius="md">
<AccordionItem value="contributors">
<AccordionControl icon={<IconUsers size="1rem" />}>
{t("accordion.contributors.title")}
<Stack gap={0}>
<Text>{t("accordion.contributors.title")}</Text>
<Text size="sm" c="dimmed">
{t("accordion.contributors.subtitle", {
count: githubContributors.length,
})}
</Text>
</Stack>
</AccordionControl>
<AccordionPanel></AccordionPanel>
<AccordionPanel>
<Flex wrap="wrap" gap="xs">
{githubContributors.map((contributor) => (
<GenericContributorLinkCard
key={contributor.login}
link={`https://github.com/${contributor.login}`}
image={contributor.avatar_url}
name={contributor.login}
/>
))}
</Flex>
</AccordionPanel>
</AccordionItem>
<AccordionItem value="translators">
<AccordionControl icon={<IconLanguage size="1rem" />}>
{t("accordion.translators.title")}
<Stack gap={0}>
<Text>{t("accordion.translators.title")}</Text>
<Text size="sm" c="dimmed">
{t("accordion.translators.subtitle", {
count: crowdinContributors.length,
})}
</Text>
</Stack>
</AccordionControl>
<AccordionPanel></AccordionPanel>
<AccordionPanel>
<Flex wrap="wrap" gap="xs">
{crowdinContributors.map((translator) => (
<GenericContributorLinkCard
key={translator.username}
link={`https://crowdin.com/profile/${translator.username}`}
image={translator.avatarUrl}
name={translator.username}
/>
))}
</Flex>
</AccordionPanel>
</AccordionItem>
<AccordionItem value="libraries">
<AccordionControl icon={<IconLibrary size="1rem" />}>
@@ -102,8 +154,23 @@ export default async function AboutPage({ params: { locale } }: PageProps) {
);
}
export function generateStaticParams() {
return getStaticParams();
interface GenericContributorLinkCardProps {
name: string;
link: string;
image: string;
}
export const dynamic = "force-static";
const GenericContributorLinkCard = ({ name, image, link }: GenericContributorLinkCardProps) => {
return (
<AspectRatio ratio={1}>
<Card className={classes.contributorCard} component="a" href={link} target="_blank" w={100}>
<Stack align="center">
<Avatar src={image} alt={name} size={40} display="block" />
<Text lineClamp={1} size="sm">
{name}
</Text>
</Stack>
</Card>
</AspectRatio>
);
};
@@ -6,15 +6,11 @@ import { IconTrash } from "@tabler/icons-react";
import type { RouterOutputs } from "@homarr/api";
import { clientApi } from "@homarr/api/client";
import { revalidatePathActionAsync } from "@homarr/common/client";
import { useConfirmModal } from "@homarr/modals";
import {
showErrorNotification,
showSuccessNotification,
} from "@homarr/notifications";
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
import { useScopedI18n } from "@homarr/translation/client";
import { revalidatePathAction } from "../../../revalidatePathAction";
interface AppDeleteButtonProps {
app: RouterOutputs["app"]["all"][number];
}
@@ -37,7 +33,7 @@ export const AppDeleteButton = ({ app }: AppDeleteButtonProps) => {
title: t("notification.success.title"),
message: t("notification.success.message"),
});
void revalidatePathAction("/manage/apps");
void revalidatePathActionAsync("/manage/apps");
},
onError: () => {
showErrorNotification({
@@ -52,13 +48,7 @@ export const AppDeleteButton = ({ app }: AppDeleteButtonProps) => {
}, [app, mutate, t, openConfirmModal]);
return (
<ActionIcon
loading={isPending}
variant="subtle"
color="red"
onClick={onClick}
aria-label="Delete app"
>
<ActionIcon loading={isPending} variant="subtle" color="red" onClick={onClick} aria-label={t("title")}>
<IconTrash color="red" size={16} stroke={1.5} />
</ActionIcon>
);
@@ -3,13 +3,14 @@
import Link from "next/link";
import { Button, Group, Stack, Textarea, TextInput } from "@mantine/core";
import { useForm, zodResolver } from "@homarr/form";
import { useZodForm } from "@homarr/form";
import type { TranslationFunction } from "@homarr/translation";
import { useI18n } from "@homarr/translation/client";
import type { z } from "@homarr/validation";
import { validation } from "@homarr/validation";
// TODO: add icon picker
import { IconPicker } from "~/components/icons/picker/icon-picker";
type FormType = z.infer<typeof validation.app.manage>;
interface AppFormProps {
@@ -20,31 +21,25 @@ interface AppFormProps {
}
export const AppForm = (props: AppFormProps) => {
const { submitButtonTranslation, handleSubmit, initialValues, isPending } =
props;
const { submitButtonTranslation, handleSubmit, initialValues, isPending } = props;
const t = useI18n();
const form = useForm({
const form = useZodForm(validation.app.manage, {
initialValues: initialValues ?? {
name: "",
description: "",
iconUrl: "",
href: "",
},
validate: zodResolver(validation.app.manage),
});
return (
<form onSubmit={form.onSubmit(handleSubmit)}>
<Stack>
<TextInput {...form.getInputProps("name")} withAsterisk label="Name" />
<TextInput
{...form.getInputProps("iconUrl")}
withAsterisk
label="Icon URL"
/>
<Textarea {...form.getInputProps("description")} label="Description" />
<TextInput {...form.getInputProps("href")} label="URL" />
<TextInput {...form.getInputProps("name")} withAsterisk label={t("app.field.name.label")} />
<IconPicker initialValue={initialValues?.iconUrl} {...form.getInputProps("iconUrl")} />
<Textarea {...form.getInputProps("description")} label={t("app.field.description.label")} />
<TextInput {...form.getInputProps("href")} label={t("app.field.url.label")} />
<Group justify="end">
<Button variant="default" component={Link} href="/manage/apps">
@@ -5,15 +5,12 @@ import { useRouter } from "next/navigation";
import type { RouterOutputs } from "@homarr/api";
import { clientApi } from "@homarr/api/client";
import {
showErrorNotification,
showSuccessNotification,
} from "@homarr/notifications";
import { revalidatePathActionAsync } from "@homarr/common/client";
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
import type { TranslationFunction } from "@homarr/translation";
import { useScopedI18n } from "@homarr/translation/client";
import type { validation, z } from "@homarr/validation";
import { revalidatePathAction } from "~/app/revalidatePathAction";
import { AppForm } from "../../_form";
interface AppEditFormProps {
@@ -30,7 +27,7 @@ export const AppEditForm = ({ app }: AppEditFormProps) => {
title: t("success.title"),
message: t("success.message"),
});
void revalidatePathAction("/manage/apps").then(() => {
void revalidatePathActionAsync("/manage/apps").then(() => {
router.push("/manage/apps");
});
},
@@ -52,10 +49,7 @@ export const AppEditForm = ({ app }: AppEditFormProps) => {
[mutate, app.id],
);
const submitButtonTranslation = useCallback(
(t: TranslationFunction) => t("common.action.save"),
[],
);
const submitButtonTranslation = useCallback((t: TranslationFunction) => t("common.action.save"), []);
return (
<AppForm
@@ -3,6 +3,7 @@ import { Container, Stack, Title } from "@mantine/core";
import { api } from "@homarr/api/server";
import { getI18n } from "@homarr/translation/server";
import { DynamicBreadcrumb } from "~/components/navigation/dynamic-breadcrumb";
import { AppEditForm } from "./_app-edit-form";
interface AppEditPageProps {
@@ -14,11 +15,14 @@ export default async function AppEditPage({ params }: AppEditPageProps) {
const t = await getI18n();
return (
<Container>
<Stack>
<Title>{t("app.page.edit.title")}</Title>
<AppEditForm app={app} />
</Stack>
</Container>
<>
<DynamicBreadcrumb dynamicMappings={new Map([[params.id, app.name]])} nonInteractable={["edit"]} />
<Container>
<Stack>
<Title>{t("app.page.edit.title")}</Title>
<AppEditForm app={app} />
</Stack>
</Container>
</>
);
}
@@ -4,15 +4,12 @@ import { useCallback } from "react";
import { useRouter } from "next/navigation";
import { clientApi } from "@homarr/api/client";
import {
showErrorNotification,
showSuccessNotification,
} from "@homarr/notifications";
import { revalidatePathActionAsync } from "@homarr/common/client";
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
import type { TranslationFunction } from "@homarr/translation";
import { useScopedI18n } from "@homarr/translation/client";
import type { validation, z } from "@homarr/validation";
import { revalidatePathAction } from "~/app/revalidatePathAction";
import { AppForm } from "../_form";
export const AppNewForm = () => {
@@ -25,7 +22,7 @@ export const AppNewForm = () => {
title: t("success.title"),
message: t("success.message"),
});
void revalidatePathAction("/manage/apps").then(() => {
void revalidatePathActionAsync("/manage/apps").then(() => {
router.push("/manage/apps");
});
},
@@ -44,16 +41,9 @@ export const AppNewForm = () => {
[mutate],
);
const submitButtonTranslation = useCallback(
(t: TranslationFunction) => t("common.action.create"),
[],
);
const submitButtonTranslation = useCallback((t: TranslationFunction) => t("common.action.create"), []);
return (
<AppForm
submitButtonTranslation={submitButtonTranslation}
handleSubmit={handleSubmit}
isPending={isPending}
/>
<AppForm submitButtonTranslation={submitButtonTranslation} handleSubmit={handleSubmit} isPending={isPending} />
);
};
@@ -1,14 +1,22 @@
import { Container, Stack, Title } from "@mantine/core";
import { getI18n } from "@homarr/translation/server";
import { DynamicBreadcrumb } from "~/components/navigation/dynamic-breadcrumb";
import { AppNewForm } from "./_app-new-form";
export default function AppNewPage() {
export default async function AppNewPage() {
const t = await getI18n();
return (
<Container>
<Stack>
<Title>New app</Title>
<AppNewForm />
</Stack>
</Container>
<>
<DynamicBreadcrumb />
<Container>
<Stack>
<Title>{t("app.page.create.title")}</Title>
<AppNewForm />
</Stack>
</Container>
</>
);
}
@@ -1,36 +1,30 @@
import Link from "next/link";
import {
ActionIcon,
ActionIconGroup,
Anchor,
Avatar,
Button,
Card,
Container,
Group,
Stack,
Text,
Title,
} from "@mantine/core";
import { ActionIcon, ActionIconGroup, Anchor, Avatar, Card, Group, Stack, Text, Title } from "@mantine/core";
import { IconApps, IconPencil } from "@tabler/icons-react";
import type { RouterOutputs } from "@homarr/api";
import { api } from "@homarr/api/server";
import { getI18n } from "@homarr/translation/server";
import { parseAppHrefWithVariablesServer } from "@homarr/common/server";
import { getI18n, getScopedI18n } from "@homarr/translation/server";
import { ManageContainer } from "~/components/manage/manage-container";
import { MobileAffixButton } from "~/components/manage/mobile-affix-button";
import { DynamicBreadcrumb } from "~/components/navigation/dynamic-breadcrumb";
import { AppDeleteButton } from "./_app-delete-button";
export default async function AppsPage() {
const apps = await api.app.all();
const t = await getScopedI18n("app");
return (
<Container>
<ManageContainer>
<DynamicBreadcrumb />
<Stack>
<Group justify="space-between" align="center">
<Title>Apps</Title>
<Button component={Link} href="/manage/apps/new">
New app
</Button>
<Title>{t("page.list.title")}</Title>
<MobileAffixButton component={Link} href="/manage/apps/new">
{t("page.create.title")}
</MobileAffixButton>
</Group>
{apps.length === 0 && <AppNoResults />}
{apps.length > 0 && (
@@ -41,7 +35,7 @@ export default async function AppsPage() {
</Stack>
)}
</Stack>
</Container>
</ManageContainer>
);
}
@@ -49,10 +43,12 @@ interface AppCardProps {
app: RouterOutputs["app"]["all"][number];
}
const AppCard = ({ app }: AppCardProps) => {
const AppCard = async ({ app }: AppCardProps) => {
const t = await getScopedI18n("app");
return (
<Card>
<Group justify="space-between">
<Group justify="space-between" wrap="nowrap">
<Group align="top" justify="start" wrap="nowrap">
<Avatar
size="sm"
@@ -65,15 +61,17 @@ const AppCard = ({ app }: AppCardProps) => {
}}
/>
<Stack gap={0}>
<Text fw={500}>{app.name}</Text>
<Text fw={500} lineClamp={1}>
{app.name}
</Text>
{app.description && (
<Text size="sm" c="gray.6">
<Text size="sm" c="gray.6" lineClamp={4}>
{app.description}
</Text>
)}
{app.href && (
<Anchor href={app.href} size="sm" w="min-content">
{app.href}
<Anchor href={parseAppHrefWithVariablesServer(app.href)} lineClamp={1} size="sm" w="min-content">
{parseAppHrefWithVariablesServer(app.href)}
</Anchor>
)}
</Stack>
@@ -85,7 +83,7 @@ const AppCard = ({ app }: AppCardProps) => {
href={`/manage/apps/edit/${app.id}`}
variant="subtle"
color="gray"
aria-label="Edit app"
aria-label={t("page.edit.title")}
>
<IconPencil size={16} stroke={1.5} />
</ActionIcon>
@@ -107,9 +105,7 @@ const AppNoResults = async () => {
<Text fw={500} size="lg">
{t("app.page.list.noResults.title")}
</Text>
<Anchor href="/manage/apps/new">
{t("app.page.list.noResults.description")}
</Anchor>
<Anchor href="/manage/apps/new">{t("app.page.list.noResults.action")}</Anchor>
</Stack>
</Card>
);
@@ -3,14 +3,14 @@
import { useCallback } from "react";
import Link from "next/link";
import { Menu } from "@mantine/core";
import { IconSettings, IconTrash } from "@tabler/icons-react";
import { IconHome, IconSettings, IconTrash } from "@tabler/icons-react";
import type { RouterOutputs } from "@homarr/api";
import { clientApi } from "@homarr/api/client";
import { revalidatePathActionAsync } from "@homarr/common/client";
import { useConfirmModal } from "@homarr/modals";
import { useScopedI18n } from "@homarr/translation/client";
import { revalidatePathAction } from "~/app/revalidatePathAction";
import { useBoardPermissions } from "~/components/board/permissions/client";
const iconProps = {
@@ -21,18 +21,11 @@ const iconProps = {
interface BoardCardMenuDropdownProps {
board: Pick<
RouterOutputs["board"]["getAllBoards"][number],
| "id"
| "name"
| "creator"
| "userPermissions"
| "groupPermissions"
| "isPublic"
"id" | "name" | "creator" | "userPermissions" | "groupPermissions" | "isPublic"
>;
}
export const BoardCardMenuDropdown = ({
board,
}: BoardCardMenuDropdownProps) => {
export const BoardCardMenuDropdown = ({ board }: BoardCardMenuDropdownProps) => {
const t = useScopedI18n("management.page.board.action");
const tCommon = useScopedI18n("common");
@@ -40,9 +33,15 @@ export const BoardCardMenuDropdown = ({
const { openConfirmModal } = useConfirmModal();
const { mutateAsync, isPending } = clientApi.board.deleteBoard.useMutation({
const setHomeBoardMutation = clientApi.board.setHomeBoard.useMutation({
onSettled: async () => {
await revalidatePathAction("/manage/boards");
// Revalidate all as it's part of the user settings, /boards page and board manage page
await revalidatePathActionAsync("/");
},
});
const deleteBoardMutation = clientApi.board.deleteBoard.useMutation({
onSettled: async () => {
await revalidatePathActionAsync("/manage/boards");
},
});
@@ -52,36 +51,45 @@ export const BoardCardMenuDropdown = ({
children: t("delete.confirm.description", {
name: board.name,
}),
// eslint-disable-next-line no-restricted-syntax
onConfirm: async () => {
await mutateAsync({
await deleteBoardMutation.mutateAsync({
id: board.id,
});
},
});
}, [board.id, board.name, mutateAsync, openConfirmModal, t]);
}, [board.id, board.name, deleteBoardMutation, openConfirmModal, t]);
const handleSetHomeBoard = useCallback(async () => {
await setHomeBoardMutation.mutateAsync({ id: board.id });
}, [board.id, setHomeBoardMutation]);
return (
<Menu.Dropdown>
<Menu.Item onClick={handleSetHomeBoard} leftSection={<IconHome {...iconProps} />}>
{t("setHomeBoard.label")}
</Menu.Item>
{hasChangeAccess && (
<Menu.Item
component={Link}
href={`/boards/${board.name}/settings`}
leftSection={<IconSettings {...iconProps} />}
>
{t("settings.label")}
</Menu.Item>
<>
<Menu.Divider />
<Menu.Item
component={Link}
href={`/boards/${board.name}/settings`}
leftSection={<IconSettings {...iconProps} />}
>
{t("settings.label")}
</Menu.Item>
</>
)}
{hasFullAccess && (
<>
<Menu.Divider />
<Menu.Label c="red.7">
{tCommon("menu.section.dangerZone.title")}
</Menu.Label>
<Menu.Label c="red.7">{tCommon("dangerZone")}</Menu.Label>
<Menu.Item
c="red.7"
leftSection={<IconTrash {...iconProps} />}
onClick={handleDeletion}
disabled={isPending}
disabled={deleteBoardMutation.isPending}
>
{t("delete.label")}
</Menu.Item>
@@ -1,48 +1,47 @@
"use client";
import { useCallback } from "react";
import { Button } from "@mantine/core";
import { IconCategoryPlus } from "@tabler/icons-react";
import { Affix, Button, Group, Menu } from "@mantine/core";
import { IconCategoryPlus, IconChevronDown, IconFileImport } from "@tabler/icons-react";
import { clientApi } from "@homarr/api/client";
import { useModalAction } from "@homarr/modals";
import { AddBoardModal, ImportBoardModal } from "@homarr/modals-collection";
import { useI18n } from "@homarr/translation/client";
import { BetaBadge } from "@homarr/ui";
import { revalidatePathAction } from "~/app/revalidatePathAction";
import { AddBoardModal } from "~/components/manage/boards/add-board-modal";
interface CreateBoardButtonProps {
boardNames: string[];
}
export const CreateBoardButton = ({ boardNames }: CreateBoardButtonProps) => {
export const CreateBoardButton = () => {
const t = useI18n();
const { openModal } = useModalAction(AddBoardModal);
const { openModal: openAddModal } = useModalAction(AddBoardModal);
const { openModal: openImportModal } = useModalAction(ImportBoardModal);
const { mutateAsync, isPending } = clientApi.board.createBoard.useMutation({
onSettled: async () => {
await revalidatePathAction("/manage/boards");
},
});
const onClick = useCallback(() => {
openModal({
onSuccess: async (values) => {
await mutateAsync({
name: values.name,
});
},
boardNames,
});
}, [mutateAsync, boardNames, openModal]);
const buttonGroupContent = (
<>
<Button leftSection={<IconCategoryPlus size="1rem" />} onClick={openAddModal}>
{t("management.page.board.action.new.label")}
</Button>
<Menu position="bottom-end">
<Menu.Target>
<Button px="xs" ms={1}>
<IconChevronDown size="1rem" />
</Button>
</Menu.Target>
<Menu.Dropdown>
<Menu.Item onClick={openImportModal} leftSection={<IconFileImport size="1rem" />}>
<Group>
{t("board.action.oldImport.label")}
<BetaBadge size="xs" />
</Group>
</Menu.Item>
</Menu.Dropdown>
</Menu>
</>
);
return (
<Button
leftSection={<IconCategoryPlus size="1rem" />}
onClick={onClick}
loading={isPending}
>
{t("management.page.board.action.new.label")}
</Button>
<>
<Button.Group visibleFrom="md">{buttonGroupContent}</Button.Group>
<Affix hiddenFrom="md" position={{ bottom: 20, right: 20 }}>
<Button.Group>{buttonGroupContent}</Button.Group>
</Affix>
</>
);
};
Loaded 100 of 891 files, more files were not shown because too many files have changed in this diff. Show more