Compare commits

..
Author SHA1 Message Date
Meier Lukas 27b04e620e wip: experiment with dropping to a div and removing item 2024-07-07 12:37:24 +02: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
Meier Lukas b888fad1fc fix: modal transition not working (#433) 2024-05-04 20:58:44 +02:00
Meier Lukas 5abd438a49 fix: tsx not working (#434)
* fix: tsx not working

* fix: format issues
2024-05-04 20:58:30 +02:00
Meier Lukas b1e065f1da feat: board access group permissions (#422)
* fix: cache is not exportet from react

* fix: format issue

* wip: add usage of group permissions

* feat: show inherited groups and add manage group

* refactor: improve board access management

* chore: address pull request feedback

* fix: type issues

* fix: migrations

* test: add unit tests for board permissions, permissions and board router

* test: add unit tests for board router and get current user permissions method

* fix: format issues

* fix: deepsource issue
2024-05-04 18:34:41 +02:00
Manuel ca49a01352 config: add vscode launch profiles (#432) 2024-05-04 18:18:56 +02:00
homarr-renovate[bot] 2139f81a1d chore(deps): update dependency tsx to ^4.9.1 (#428)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-04 17:18:56 +02:00
homarr-renovate[bot] fb43fc6046 fix(deps): update tanstack-query monorepo to ^5.34.1 (#427)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-04 17:18:35 +02:00
homarr-renovate[bot] 3047f3bf2b chore(deps): update vitest monorepo to ^1.6.0 (#426)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-03 17:31:16 +02:00
homarr-renovate[bot] 4d313be37e chore(deps): update dependency tsx to ^4.9.0 (#425)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-03 12:05:21 +02:00
homarr-renovate[bot] 11c20ce711 fix(deps): update dependency zod to ^3.23.6 (#424)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-03 06:50:55 +02:00
homarr-renovate[bot] 90b9d56729 fix(deps): update mantine monorepo to ^7.9.0 (#423)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-02 16:37:01 +02:00
homarr-renovate[bot] e8805dfb5a chore(deps): update dependency @types/node to ^20.12.8 (#415)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-01 21:57:56 +02:00
Meier Lukas 7c98b65401 fix: server data is loaded on settings page #363 (#414) 2024-05-01 21:57:24 +02:00
Manuel 84801d3174 refactor: move integration pages to management pages (#419) 2024-05-01 21:57:18 +02:00
Meier Lukas fba767bde3 fix: cache is not exportet from react (#417)
* fix: cache is not exportet from react

* fix: format issue

* fix: type issue
2024-05-01 21:17:28 +02:00
Manuel 48c2473ab3 fix: docker development path in package.json (#416) 2024-05-01 21:10:31 +02:00
Meier Lukas ad1796dc02 refactor: add dev directory to organize dev files #398 (#408)
* refactor: add dev directory to organize dev files #398

* chore: address pull request feedback
2024-05-01 19:58:58 +02:00
homarr-renovate[bot] 14d941e57a fix(deps): update dependency drizzle-orm to ^0.30.10 (#413)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-01 19:55:13 +02:00
Meier Lukas 0278e3a854 fix: add rtl compliance for symbols #366 (#406) 2024-05-01 12:05:09 +02:00
homarr-renovate[bot] efaf721b5a chore(deps): update dependency tsx to ^4.8.2 (#412)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-01 12:04:49 +02:00
homarr-renovate[bot] e556bf3e66 fix(deps): update dependency sass to ^1.76.0 (#410)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-01 07:12:55 +02:00
homarr-renovate[bot] a138e83f16 chore(deps): update dependency tsx to ^4.8.1 (#411)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-01 07:12:16 +02:00
homarr-renovate[bot] 7bc7bd6bf9 fix(deps): update dependency @trpc/client to v11.0.0-rc.364 (#409)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-05-01 07:06:45 +02:00
homarr-renovate[bot] 0020680ca0 fix(deps): update dependency @trpc/client to v11.0.0-rc.362 (#407)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-30 22:13:19 +02:00
homarr-renovate[bot] 876f21a26d fix(deps): update tiptap monorepo to v2.3.1 (#403)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-30 21:56:27 +02:00
homarr-renovate[bot] 46bb3ee0c9 fix(deps): update dependency @tabler/icons-react to ^3.3.0 (#405)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-30 21:55:51 +02:00
homarr-renovate[bot] 6dff7c48e2 fix(deps): update dependency @trpc/client to v11.0.0-rc.361 (#404)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-30 21:33:40 +02:00
Meier Lukas 7ab9dc2501 feat: implement board access control (#349)
* feat: implement board access control

* fix: deepsource issues

* wip: address pull request feedback

* chore: address pull request feedback

* fix: format issue

* test: improve tests

* fix: type and lint issue

* chore: address pull request feedback

* refactor: rename board procedures
2024-04-30 21:32:55 +02:00
homarr-renovate[bot] 56388eb8ef fix(deps): update dependency zod to ^3.23.5 (#399)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-30 21:16:57 +02:00
homarr-renovate[bot] c988f3d7f8 fix(deps): update tanstack-query monorepo to ^5.32.1 (#402)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-30 21:15:52 +02:00
homarr-renovate[bot] e5d024c62f chore(deps): update vitest monorepo to ^1.5.3 (#401)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-30 21:14:56 +02:00
homarr-renovate[bot] fc1360d6bb fix(deps): update dependency video.js to ^8.12.0 (#400)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-30 21:14:24 +02:00
homarr-renovate[bot] 584483aa9c fix(deps): update typescript-eslint monorepo to ^7.8.0 (#395)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-30 21:12:43 +02:00
homarr-renovate[bot] 47accae90d fix(deps): update dependency @trpc/client to v11.0.0-rc.359 (#394)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-29 21:55:54 +02:00
homarr-renovate[bot] 03c2993611 fix(deps): update dependency dayjs to ^1.11.11 (#393)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-29 21:51:30 +02:00
homarr-renovate[bot] 55822ee7a5 fix(deps): update dependency ws to ^8.17.0 (#392)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-29 21:50:52 +02:00
Meier Lukas 7a9e9fb203 ci: add build workflow (#389) 2024-04-29 21:49:57 +02:00
Meier Lukas 5f247977fa fix: sharp is not installed (#397)
Closes #320
2024-04-29 21:46:58 +02:00
Meier Lukas 036925bf78 feat: add user groups (#376)
* feat: add user groups

* wip: add unit tests

* wip: add more tests and normalized name for creation and update

* test: add unit tests for group router

* fix: type issues, missing mysql schema, rename column creator_id to owner_id

* fix: lint and format issues

* fix: deepsource issues

* fix: forgot to add log message

* fix: build not working

* chore: address pull request feedback

* feat: add mysql migration and fix merge conflicts

* fix: format issue and test issue
2024-04-29 21:46:30 +02:00
Meier Lukas 621f6c81ae feat: add user invite management (#338)
* feat: add invite management page

* refactor: improve existing translations

* test: add test for invite router

* feat: update mysql schema to match sqlite schema

* fix: format issues

* fix: deepsource issues

* fix: lint issues

* chore: address pull request feedback
2024-04-29 12:09:34 +02:00
Manuel 16e42d654d feat: read all packages on about page (#391) 2024-04-27 21:51:35 +02:00
homarr-renovate[bot] 45ffbadeec fix(deps): update dependency better-sqlite3 to ^9.6.0 (#386)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-27 18:28:53 +02:00
homarr-renovate[bot] 73a72dc675 fix(deps): update dependency @t3-oss/env-nextjs to ^0.10.1 (#375)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-27 18:25:13 +02:00
Manuel 42a5a1a563 feat: add about page (#388) 2024-04-27 18:24:27 +02:00
homarr-renovate[bot] 0cdf0b73bf fix(deps): update tanstack-query monorepo to ^5.32.0 (#374)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-27 15:35:21 +02:00
homarr-renovate[bot] bfdc8d584b fix(deps): update dependency next-auth to v5.0.0-beta.17 (#383)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-27 15:34:44 +02:00
homarr-renovate[bot]andMeier Lukas 6dfdc8971d chore(deps): update dependency @types/better-sqlite3 to v7.6.10 (#371)
* chore(deps): update dependency @types/better-sqlite3 to v7.6.10

* chore(deps): update dependency @types/better-sqlite3 to v7.6.10

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-04-27 15:33:51 +02:00
homarr-renovate[bot] f5002c3265 fix(deps): update dependency drizzle-orm to ^0.30.9 (#370)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-27 15:26:13 +02:00
homarr-renovate[bot] cc93824fe0 chore(deps): update turbo monorepo to ^1.13.3 (#385)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-27 14:36:32 +02:00
homarr-renovate[bot]andMeier Lukas 392a185640 fix(deps): update dependency zod to ^3.23.4 (#373)
* fix(deps): update dependency zod to ^3.23.4

* 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-04-27 14:35:07 +02:00
homarr-renovate[bot] 92b417a37e fix(deps): update mantine monorepo to ^7.8.1 (#377)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-27 14:25:20 +02:00
homarr-renovate[bot] 3b5bd809a4 chore(deps): update pnpm to v9.0.6 (#372)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-27 14:21:46 +02:00
homarr-renovate[bot] 51ea67fc88 fix(deps): update dependency mysql2 to v3.9.7 (#369)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-27 14:19:53 +02:00
homarr-renovate[bot] d88b6def75 fix(deps): update dependency @trpc/client to v11.0.0-rc.354 (#368)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-27 14:18:45 +02:00
homarr-renovate[bot] ea528ea076 fix(deps): update dependency @auth/drizzle-adapter to v1 (#359)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-27 14:13:42 +02:00
homarr-renovate[bot] 847adffe7b fix(deps): update tiptap monorepo to v2.3.0 (#317)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-27 14:06:05 +02:00
homarr-renovate[bot] f204f34850 chore(deps): update vitest monorepo to ^1.5.2 (#380)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-27 12:57:39 +02:00
homarr-renovate[bot] b8780d24bc chore(deps): update dependency tsx to ^4.7.3 (#382)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-27 12:52:58 +02:00
homarr-renovate[bot] a9e593e004 chore(deps): update react monorepo (#384)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-27 12:49:17 +02:00
homarr-renovate[bot] 75e4e8176e fix(deps): update nextjs monorepo to ^14.2.3 (#381)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-27 12:31:46 +02:00
homarr-renovate[bot] 84175e6a7e fix(deps): update dependency postcss-preset-mantine to ^1.15.0 (#387)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-27 12:24:55 +02:00
Meier Lukas b78d32b81c fix: nextjs is slow dev server (#364)
* fix: nextjs slow compile time

* fix: change optimized package imports and transpile packages

* fix: format issue
2024-04-25 22:06:15 +02:00
homarr-renovate[bot] 04a313186f fix(deps): update dependency drizzle-kit to ^0.20.17 (#367)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-24 20:31:19 +02:00
homarr-renovate[bot] 0342a177bb fix(deps): update typescript-eslint monorepo to ^7.7.1 (#354)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-24 06:31:49 +02:00
Meier Lukas e47187512c Merge pull request #379 from homarr-labs/main
chore: add codeowners (#378)
2024-04-23 19:43:42 +02:00
Meier Lukas 974b4cf115 chore: add codeowners (#378) 2024-04-23 19:27:04 +02:00
Meier Lukas c0594f2419 docs: add notice about unstable and no support 2024-04-23 19:20:30 +02:00
Meier Lukas 4970c3a1b2 fix: defaultTitle invalid attribute on div (#350) 2024-04-20 12:52:02 +02:00
homarr-renovate[bot] 9615568ff3 chore(deps): update dependency @types/react to ^18.2.79 (#355)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-20 12:51:19 +02:00
homarr-renovate[bot] f58d0ddd94 fix(deps): update dependency drizzle-kit to ^0.20.16 (#362)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-20 12:50:47 +02:00
homarr-renovate[bot] 8c0ce672d0 chore(deps): update dependency @types/eslint to ^8.56.10 (#360)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-20 12:50:23 +02:00
homarr-renovate[bot] f6c0f3ab78 fix(deps): update dependency @auth/core to ^0.30.0 (#358)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-20 12:49:58 +02:00
homarr-renovate[bot] e7689beee8 chore(deps): update dependency @types/video.js to ^7.3.58 (#353)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-20 12:48:24 +02:00
homarr-renovate[bot] 20f44d3494 fix(deps): update dependency ioredis to v5.4.1 (#357)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-20 12:48:04 +02:00
homarr-renovate[bot] 0ba6455982 fix(deps): update dependency @trpc/client to v11.0.0-rc.345 (#351)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-20 12:28:28 +02:00
homarr-renovate[bot] 7f9f29bba5 chore(deps): update pnpm to v9 (#356)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-20 11:25:46 +02:00
homarr-renovate[bot] cb2b934c83 fix(deps): update dependency zod to ^3.22.5 (#361)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-20 11:17:57 +02:00
homarr-renovate[bot] b465b95ca2 fix(deps): update nextjs monorepo to ^14.2.2 (#345)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-20 11:12:03 +02:00
homarr-renovate[bot] a6d65fda6b fix(deps): update dependency mysql2 to v3.9.6 (#311)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-20 11:04:00 +02:00
homarr-renovate[bot] 3e3299a358 fix(deps): update mantine monorepo to ^7.8.0 (#343)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-13 16:04:56 +02:00
homarr-renovate[bot] 859fdf4c44 fix(deps): update tanstack-query monorepo to ^5.29.2 (#340)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-13 16:03:53 +02:00
homarr-renovate[bot] 0cc5225e32 fix(deps): update dependency sass to ^1.75.0 (#347)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-13 14:27:29 +02:00
homarr-renovate[bot] 01f471ccce chore(deps): update dependency @types/react to ^18.2.78 (#346)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-13 14:27:02 +02:00
homarr-renovate[bot] c40533e758 fix(deps): update dependency @tabler/icons-react to ^3.2.0 (#342)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-13 14:26:19 +02:00
homarr-renovate[bot] 0edce9fd0b chore(deps): update dependency @types/eslint to ^8.56.9 (#341)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-13 14:25:28 +02:00
homarr-renovate[bot] 49e45e8122 fix(deps): update dependency postcss-preset-mantine to ^1.14.4 (#336)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-13 14:23:51 +02:00
homarr-renovate[bot]andMeier Lukas f50550b3e1 fix(deps): update dependency drizzle-orm to ^0.30.8 (#339)
* fix(deps): update dependency drizzle-orm to ^0.30.8

* fix: format issue

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-04-13 14:23:04 +02:00
homarr-renovate[bot] 48a4b8ba7e fix(deps): update dependency better-sqlite3 to ^9.5.0 (#335)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-13 14:12:59 +02:00
homarr-renovate[bot] ed5e5d1edc fix(deps): update dependency @trpc/client to v11.0.0-rc.334 (#334)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-13 14:12:27 +02:00
homarr-renovate[bot] 2ccb7d1765 fix(deps): update typescript-eslint monorepo to ^7.6.0 (#329)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-13 14:11:32 +02:00
Meier Lukas 9ed298d641 refactor: improve board manage page (#323)
* refactor: improve board manage page

* chore: address pull request feedback
2024-04-13 12:42:03 +02:00
Meier Lukas 6b1879cbb1 feat: add notebook widget (#294)
* feat: add nestjs replacement, remove nestjs

* feat: add notebook widget

* fix: format issue

* fix: add missing tiptap packages

* refactor: improve structure of table options

* fix: downgrade to tiptap 2.2.5 as not yet supported by mantine/tiptap

* fix: format issue

* fix: deepsource issues

* fix: typecheck issues

* refactor: move default notebook content to seperate file

* fix: format issue
2024-04-13 12:32:55 +02:00
Meier Lukas 8f4897186c feat: add iframe widget (#291)
* feat: add nestjs replacement, remove nestjs

* feat: add iframe widget

* fix: format issue

* fix: format issue

* fix: format issue

* fix: lockfile frozen
2024-04-13 11:58:41 +02:00
Meier Lukas 82e9887f36 feat: add video widget (#287)
* feat: add nestjs replacement, remove nestjs

* feat: add video widget

* feat: add notice about youtube not supported with video.js

* fix: format issue

* fix: format issue
2024-04-13 11:44:16 +02:00
Meier Lukas 80d2d485b8 feat: add weather widget (#286)
* feat: add nestjs replacement, remove nestjs

* feat: add weather widget

* fix: lock issue

* fix: format issue

* fix: deepsource issues

* fix: change timezone to auto
2024-04-13 11:34:55 +02:00
homarr-renovate[bot]andMeier Lukas 7fb0decd5b fix(deps): update dependency @auth/drizzle-adapter to ^0.9.0 (#328)
* fix(deps): update dependency @auth/drizzle-adapter to ^0.9.0

* fix(deps): update dependency @auth/drizzle-adapter to ^0.9.0

* Merge branch 'dev' into renovate/auth-drizzle-adapter-0.x

* 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-04-11 21:24:50 +02:00
homarr-renovate[bot] 719d1cd845 fix(deps): update dependency @auth/core to ^0.29.0 (#327)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-11 21:15:18 +02:00
homarr-renovate[bot] 27c858dc81 fix(deps): update dependency jotai to ^2.8.0 (#326)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-11 21:14:04 +02:00
homarr-renovate[bot]andMeier Lukas 57c6c7385a chore(deps): update dependency node to v20.12.2 (#331)
* chore(deps): update dependency node to v20.12.2

* 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-04-11 21:09:19 +02:00
homarr-renovate[bot] e0bb40a47e chore(deps): update vitest monorepo to ^1.5.0 (#344)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-11 20:58:08 +02:00
homarr-renovate[bot] 6a2ed0a8cf chore(deps): update react monorepo (#330)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-11 20:56:49 +02:00
homarr-renovate[bot] cb65d465aa chore(deps): update dependency typescript to ^5.4.5 (#337)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-11 20:56:02 +02:00
Meier Lukas 8988880439 feat: add app actions (#322)
* feat: add app actions

* fix: broken lockfile

* fix: app should only load when one is selected and server data not fail when no app found

* fix: add missing dependency

* fix: format issue
2024-04-09 21:51:00 +02:00
Meier Lukas e6e6e4e7d6 fix: xterm-addon-fit deprecated (#321) 2024-04-09 21:50:35 +02:00
Meier Lukas 669c6c8955 config: migrate from nestjs to tasks and websocket server in docker (#316)
* feat: make tasks script run in docker

* feat: make websocket server work in docker

* fix: format issue

* fix: broken lockfile

* fix: non matching typescript versions
2024-04-07 11:32:29 +02:00
Meier Lukas 35ca732744 feat: add web search engines (#290) 2024-04-06 17:47:12 +02:00
homarr-renovate[bot]andMeier Lukas 75224e0533 fix(deps): update tiptap monorepo to ^2.2.5 (#315)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-04-06 16:34:35 +02:00
homarr-renovate[bot]andMeier Lukas a5b8fdb397 fix(deps): update xterm monorepo (#312)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-04-06 16:34:06 +02:00
homarr-renovate[bot] fffefbb4c8 fix(deps): update tanstack-query monorepo to ^5.29.0 (#313)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-06 16:30:04 +02:00
homarr-renovate[bot] a6729a2b18 chore(deps): update dependency typescript to ^5.4.4 (#310)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-06 16:28:11 +02:00
homarr-renovate[bot] 48f45d7377 fix(deps): update dependency node-cron to ^3.0.3 (#309)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-06 16:25:17 +02:00
homarr-renovate[bot] 50c162444c fix(deps): update dependency @trpc/client to v11.0.0-rc.332 (#308)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-06 16:21:19 +02:00
homarr-renovate[bot] 6cea1cbd85 chore(deps): update dependency tsx to ^4.7.2 (#307)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-06 16:20:34 +02:00
homarr-renovate[bot] e68a2e5813 fix(deps): update dependency sass to ^1.74.1 (#306)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-06 16:19:57 +02:00
homarr-renovate[bot] 7db5adf110 chore(deps): update dependency @types/react-dom to ^18.2.24 (#305)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-06 16:19:30 +02:00
homarr-renovate[bot]andMeier Lukas 362257cf2b fix(deps): update dependency drizzle-orm to ^0.30.7 (#303)
* fix(deps): update dependency drizzle-orm to ^0.30.7

* fix: duplicate occurence of dependency

* fix: format issue

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-04-06 16:18:28 +02:00
homarr-renovate[bot]andMeier Lukas 7bff8e5148 fix(deps): update dependency better-sqlite3 to ^9.4.5 (#302)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-04-06 15:58:53 +02:00
homarr-renovate[bot]andMeier Lukas fbea026122 chore(deps): update dependency node to v20.12.1 (#301)
* chore(deps): update dependency node to v20.12.1

* fix: format issue

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-04-06 15:54:41 +02:00
Meier Lukas 1fc2df19ec fix: revert mysql2 to version 3.9.2 as with 3.9.3 nextjs build fails 2024-04-04 21:59:23 +02:00
Meier Lukas 1936596c04 feat: add nestjs replacement, remove nestjs (#285)
* feat: add nestjs replacement, remove nestjs

* fix: format issues

* fix: dependency issues

* fix: dependency issues

* fix: format issue

* fix: wrong channel used for logging channel
2024-04-04 18:31:40 +02:00
ManuelandMeier Lukas c82915c6dc feat: add real time logger page (#276)
* feat: add real time logger

* feat: add subscription for logging

* feat: use timestamp and level in xterm, migrate to new xterm package

* feat: improve design on log page

* fit: remove xterm fit addon

* fix: dispose terminal correctly

* style: format code

* refactor: add jsdoc for redis-transport

* fix: redis connection not possible sometimes

* feat: make terminal full size

* fix: deepsource issues

* fix: lint issue

---------

Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-04-04 18:07:23 +02:00
homarr-renovate[bot] 2fb0535260 chore(deps): update dependency @types/react to ^18.2.74 (#300)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-02 21:03:45 +02:00
homarr-renovate[bot] a4f316f10f fix(deps): update tanstack-query monorepo to ^5.28.14 (#299)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-02 21:03:30 +02:00
homarr-renovate[bot] 54a7d1f4ae fix(deps): update typescript-eslint monorepo to ^7.5.0 (#298)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-02 21:02:57 +02:00
homarr-renovate[bot] 538c79528d chore(deps): update pnpm to v8.15.6 (#297)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-02 21:01:36 +02:00
homarr-renovate[bot]andMeier Lukas 3a1b4c3738 chore(deps): update turbo monorepo to ^1.13.2 (#296)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-04-02 20:58:27 +02:00
homarr-renovate[bot]andMeier Lukas fdf060a3a2 chore(deps): update dependency @types/eslint to ^8.56.7 (#295)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-04-02 20:54:14 +02:00
homarr-renovate[bot]andMeier Lukas fbc69f6078 fix(deps): update dependency @auth/drizzle-adapter to ^0.8.2 (#293)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-04-02 20:48:30 +02:00
homarr-renovate[bot]andMeier Lukas ba16ba1382 fix(deps): update dependency @auth/core to ^0.28.2 (#292)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-04-02 20:43:56 +02:00
homarr-renovate[bot] d8d25d5037 fix(deps): update dependency @trpc/client to v11.0.0-rc.330 (#288)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-02 20:38:52 +02:00
homarr-renovate[bot] d06528f311 fix(deps): update dependency jotai to ^2.7.2 (#284)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-02 06:47:43 +02:00
homarr-renovate[bot] 6ef58beead fix(deps): update dependency drizzle-orm to ^0.30.6 (#282)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-02 06:45:57 +02:00
homarr-renovate[bot]andMeier Lukas e74926d382 fix(deps): update tanstack-query monorepo (#280)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-04-02 06:45:17 +02:00
homarr-renovate[bot]andMeier Lukas 085bd94704 chore(deps): update dependency node to v20.12.0 (#278)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-04-02 06:37:04 +02:00
homarr-renovate[bot] 415c632495 chore(deps): update react monorepo (#275)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-02 06:31:25 +02:00
homarr-renovate[bot] e1b62ecd53 fix(deps): update dependency mantine-react-table to v2.0.0-beta.1 (#277)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-04-02 06:30:45 +02:00
homarr-renovate[bot]andMeier Lukas b0bba1418b fix(deps): update dependency mysql2 to ^3.9.3 (#273)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-04-01 18:23:42 +02:00
homarr-renovate[bot]andMeier Lukas c9e15805a9 fix(deps): update mantine monorepo to ^7.7.1 (#272)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-04-01 18:16:19 +02:00
homarr-renovate[bot]andMeier Lukas dd7f04e395 fix(deps): update dependency @typescript-eslint/eslint-plugin to ^7.4.0 (#271)
* fix(deps): update dependency @typescript-eslint/eslint-plugin to ^7.4.0

* 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-04-01 18:10:14 +02:00
Manuel c00d856e1a refactor: improve user table design (#279) 2024-03-26 22:55:43 +01:00
ManuelandMeier Lukas 1825e56349 feat: add redis (#242)
* feat: add refis

* feat: add redis package

Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>

* feat: add example docker compose, add redis connection in package

* fix: usage of client after subscribe

* feat: add logger for redis

* refactor: format files

Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>

---------

Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-25 21:09:40 +01:00
homarr-renovate[bot] c4a4452839 fix(deps): update dependency @typescript-eslint/parser to ^7.4.0 (#270)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-25 19:38:15 +01:00
homarr-renovate[bot] 36073dbc5e fix(deps): update dependency vite to ^5.2.6 (#262)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-25 19:24:02 +01:00
homarr-renovate[bot] 724b348106 fix(deps): update dependency winston to v3.13.0 (#263)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-25 19:23:43 +01:00
homarr-renovate[bot] 4783aaea20 fix(deps): update tanstack-query monorepo to ^5.28.8 (#265)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-25 19:23:05 +01:00
homarr-renovate[bot] 98a8eaac09 fix(deps): update dependency @auth/drizzle-adapter to ^0.8.1 (#267)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-25 19:22:18 +01:00
homarr-renovate[bot] ba27871765 fix(deps): update dependency next-auth to v5.0.0-beta.16 (#268)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-25 19:12:21 +01:00
homarr-renovate[bot] c72f4bb80d fix(deps): update dependency @auth/core to ^0.28.1 (#266)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-25 19:10:42 +01:00
homarr-renovate[bot] 0f59b10c64 chore(deps): update dependency @types/react to ^18.2.70 (#264)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-25 19:07:32 +01:00
Meier Lukas 058a8c4776 feat: add actual user for trpc wss-dev-server (#261)
* feat: add actual user for trpc wss-dev-server #233

* chore: address pull request feedback

* fix: deepsource issue
2024-03-25 18:57:59 +01:00
homarr-renovate[bot]andMeier Lukas 87808c1349 fix(deps): update dependency sharp to ^0.33.3 (#260)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-24 12:20:54 +01:00
homarr-renovate[bot] 8d40f54d7d fix(deps): update dependency vite to ^5.2.5 (#259)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-24 10:49:10 +01:00
homarr-renovate[bot] 78b8cf6b29 chore(deps): update dependency @types/react to ^18.2.69 (#258)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-22 22:37:27 +01:00
homarr-renovate[bot] e4e3463d04 fix(deps): update tanstack-query monorepo to ^5.28.6 (#256)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-22 22:37:11 +01:00
homarr-renovate[bot] d867ab162a chore(deps): update dependency typescript to ^5.4.3 (#254)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-22 22:36:58 +01:00
homarr-renovate[bot] 1dfc6a9f0b chore(deps): update turbo monorepo to ^1.13.0 (#257)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-22 21:00:19 +01:00
homarr-renovate[bot] 7214df3e44 fix(deps): update dependency vite to ^5.2.3 (#253)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-22 20:59:18 +01:00
homarr-renovate[bot]andMeier Lukas 28f630f58b fix(deps): update nextjs monorepo to ^14.1.4 (#252)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-22 20:58:45 +01:00
homarr-renovate[bot] 1f359cd87c chore(deps): update dependency @types/eslint to ^8.56.6 (#251)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-22 20:51:30 +01:00
homarr-renovate[bot] cdc4870925 fix(deps): update dependency drizzle-orm to ^0.30.4 (#250)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-22 20:51:09 +01:00
homarr-renovate[bot] 36e509a474 fix(deps): update typescript-eslint monorepo to ^7.3.1 (#247)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-22 20:50:52 +01:00
homarr-renovate[bot]andMeier Lukas aeed1d7583 chore(deps): update dependency @types/react to ^18.2.67 (#246)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-22 20:50:25 +01:00
homarr-renovate[bot] 0ffb3f18b9 fix(deps): update nest monorepo to ^10.3.5 (#245)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-22 20:41:26 +01:00
homarr-renovate[bot] ab55a1357d fix(deps): update dependency @trpc/client to v11.0.0-next-beta.318 (#234)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-22 20:40:36 +01:00
Meier Lukas 92a8db718c chore: restrict usage of variables shorther than 3 characters (#255)
* chore: restrict usage of variables shorther than 3 characters

* chore: change highlighting to warning
2024-03-20 20:58:24 +01:00
Meier Lukas 361700b239 feat: add board access settings (#249)
* wip: add board access settings

* wip: add user access control

* wip: add user access control

* feat: add user access control

* refactor: move away from mantine-modal-manager

* fix: ci issues and failing tests

* fix: lint issue

* fix: format issue

* fix: deepsource issues

* chore: address pull request feedback
2024-03-20 20:30:58 +01:00
homarr-renovate[bot] 4753bc7162 chore(deps): update dependency @types/node to ^20.11.30 (#248)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-19 21:03:42 +01:00
homarr-renovate[bot] 4a52c6e3bc chore(deps): update pnpm to v8.15.5 (#244)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-18 11:58:40 +01:00
homarr-renovate[bot] c5428efd60 fix(deps): update dependency @ianvs/prettier-plugin-sort-imports to ^4.2.1 (#243)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-17 09:43:55 +01:00
Manuel 0440af3566 fix: add sharp (#241) 2024-03-16 19:01:02 +01:00
homarr-renovate[bot] 30278f37d2 fix(deps): update tanstack-query monorepo to ^5.28.4 (#235)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-16 16:47:27 +01:00
homarr-renovate[bot] 333aaf34dc fix(deps): update dependency @tabler/icons-react to ^3.1.0 (#236)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-16 16:47:19 +01:00
homarr-renovate[bot] 9ba6f91570 chore(deps): update node.js to v20 (#237)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-16 16:47:11 +01:00
homarr-renovate[bot] 75ab823019 fix(deps): update dependency jotai to ^2.7.1 (#238)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-16 15:52:54 +01:00
homarr-renovate[bot] 8b009db4fe chore(deps): update vitest monorepo to ^1.4.0 (#239)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-16 15:51:55 +01:00
homarr-renovate[bot] 404f2945dc fix(deps): update dependency eslint-plugin-react to ^7.34.1 (#240)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-16 15:51:47 +01:00
ManuelandMeier Lukas 98c353349a config: add dockerfile (#214)
* config: add dockerfile

* feat: add working dockerfile for nest and next app with sqlite migration

---------

Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-16 15:51:34 +01:00
homarr-renovate[bot] a4951037e3 chore(deps): update dependency @swc/core to ^1.4.8 (#223)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-14 18:55:37 +01:00
homarr-renovate[bot] cf57b33d2c chore(deps): update dependency vite-tsconfig-paths to ^4.3.2 (#228)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-14 18:55:27 +01:00
homarr-renovate[bot] 64354e4b43 fix(deps): update dependency @tabler/icons-react to ^3.0.3 (#229)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-14 18:55:13 +01:00
homarr-renovate[bot] 4bab91f8de fix(deps): update dependency sass to ^1.72.0 (#230)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-14 18:53:27 +01:00
homarr-renovate[bot] 603b8a01af chore(deps): update dependency @types/react to ^18.2.66 (#231)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-14 18:53:13 +01:00
homarr-renovate[bot] 90465175f9 fix(deps): update dependency drizzle-orm to ^0.30.2 (#232)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-14 18:52:59 +01:00
Manuel 4f375cbe6d feat: add trpc websocket (#205) 2024-03-14 18:43:47 +01:00
homarr-renovate[bot] 9ae99ad06c chore(deps): update dependency @types/react-dom to ^18.2.22 (#224)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-13 19:01:00 +01:00
homarr-renovate[bot] 9a203e8fac fix(deps): update tanstack-query monorepo to ^5.28.0 (#225)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-13 19:00:50 +01:00
homarr-renovate[bot] 72011147d1 chore(deps): update dependency @types/node to ^20.11.27 (#226)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-13 19:00:41 +01:00
homarr-renovate[bot] 179ceaebf0 fix(deps): update dependency @ianvs/prettier-plugin-sort-imports to ^4.2.0 (#227)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-13 19:00:31 +01:00
homarr-renovate[bot]andMeier Lukas fc29db0151 fix(deps): update mantine monorepo to ^7.6.2 (#221)
* fix(deps): update mantine monorepo to ^7.6.2

* fix: lint issue as use-element-size ref is typed correctly again

* fix: remove unnecessary type convertion

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-13 08:29:05 +01:00
homarr-renovate[bot] b63b2c8e90 fix(deps): update dependency mantine-modal-manager to ^7.6.2 (#222)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-13 08:15:02 +01:00
homarr-renovate[bot]andMeier Lukas 2ee5027a3c chore(deps): update turbo monorepo to ^1.12.5 (#202)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-12 22:01:49 +01:00
homarr-renovate[bot]andMeier Lukas 084adeb166 chore(deps): update dependency @types/node to ^20.11.26 (#219)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-12 21:57:12 +01:00
homarr-renovate[bot] ea79953353 fix(deps): update typescript-eslint monorepo to ^7.2.0 (#218)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-12 21:49:55 +01:00
homarr-renovate[bot] a3c9afddab chore(deps): update dependency vite to ^5.1.6 (#217)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-12 21:49:08 +01:00
homarr-renovate[bot] efbc4cf8fe fix(deps): update tanstack-query monorepo (#216)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-12 21:48:21 +01:00
homarr-renovate[bot]andMeier Lukas 1c222ed89c fix(deps): update dependency @tabler/icons-react to v3 (#215)
* fix(deps): update dependency @tabler/icons-react to v3

* fix: type issues caused by removal of TablerIconProps

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-12 21:46:37 +01:00
Meier Lukas 24ec13c2ab feat: add mysql support (#212)
* feat: add mysql support

* fix: lockfile broken

* fix: ci issues

* fix: ci issues

* fix: ci issues
2024-03-12 21:23:45 +01:00
Meier Lukas c4ff968cbc feat: add app widget (#206)
* refactor: move server api to api package

* feat: add app widget

* refactor: add element size for widget components on board

* feat: add resize listener for widget width

* feat: add widget app input

* refactor: add better responsibe layout, add missing translations

* fix: ci issues

* fix: deepsource issues

* chore: address pull request feedback
2024-03-12 21:23:25 +01:00
homarr-renovate[bot] 7d5b999ab8 chore(deps): update dependency @types/react to ^18.2.65 (#220)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-12 20:09:45 +01:00
Manuel 5000c4f008 config: fix pr template 2024-03-10 12:42:14 +01:00
homarr-renovate[bot] 851e3701c2 chore(deps): update dependency dotenv-cli to ^7.4.1 (#213)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-10 11:32:21 +01:00
TagaishiandMeier Lukas edcba9ceb6 feat: Clock widget and dayjs locale standard (#79)
* feat: Clock widget and dayjs locale standard

Co-authored-by: Meier Lukas
- Widget options modifications
<meierschlumpf@gmail.com>

* perf: add improved time state for clock widget

* fix: final fixes

* refactor: unify selectOptions

* chore: fix CI & remove serverdata from clock widget

* chore: Change custom title to be under a toggle

---------

Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-09 19:25:48 +01:00
Tagaishi dceec34929 Merge branch 'dev' of https://github.com/homarr-labs/homarr into dev 2024-03-09 18:14:16 +01:00
Tagaishi 0ee8c5ad91 fix: create board submit button inverted 2024-03-09 18:14:01 +01:00
homarr-renovate[bot] be9434bf8c chore(deps): update dependency dotenv-cli to ^7.4.0 (#209)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-09 18:13:43 +01:00
homarr-renovate[bot] e34161f33e fix(deps): update dependency drizzle-orm to ^0.30.1 (#210)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-09 18:13:30 +01:00
homarr-renovate[bot] 19243b8681 chore(deps): update dependency @swc/core to ^1.4.6 (#211)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-09 18:12:16 +01:00
homarr-renovate[bot] ef7bd4cffb chore(deps): update dependency @types/node to ^20.11.25 (#200)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-07 07:10:45 +01:00
homarr-renovate[bot] 56d5e709bc fix(deps): update nextjs monorepo to ^14.1.3 (#208)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-07 07:10:35 +01:00
homarr-renovate[bot] a1342ea809 chore(deps): update dependency @types/react-dom to ^18.2.21 (#207)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-07 07:09:53 +01:00
homarr-renovate[bot] 4f41765f10 fix(deps): update dependency drizzle-orm to ^0.29.5 (#203)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-06 21:21:44 +01:00
homarr-renovate[bot] 1728d16177 chore(deps): update dependency @types/react to ^18.2.64 (#201)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-06 21:21:22 +01:00
homarr-renovate[bot] 46955830d9 chore(deps): update dependency typescript to ^5.4.2 (#204)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-06 21:21:09 +01:00
Manuel beb7defd32 feat: add change password form (#199) 2024-03-06 21:20:41 +01:00
homarr-renovate[bot] c0401702f0 chore(deps): update dependency @types/react-dom to ^18.2.20 (#197)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-06 18:23:31 +01:00
homarr-renovate[bot] 82e8a02d8e chore(deps): update dependency @swc/core to ^1.4.5 (#198)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-06 18:23:20 +01:00
homarr-renovate[bot] 345843b01c chore(deps): update dependency @swc/core to ^1.4.4 (#195)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-05 21:11:52 +01:00
Manuel 41b99f191c feat: add edit user page (#173) 2024-03-05 21:10:19 +01:00
homarr-renovate[bot]andMeier Lukas 8c9adb31f3 fix(deps): update tanstack-query monorepo to ^5.25.0 (#196)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-05 20:40:20 +01:00
homarr-renovate[bot] e2bc88d9b6 chore(deps): update dependency @types/react to ^18.2.63 (#194)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-05 20:30:30 +01:00
homarr-renovate[bot] 8df514dec8 fix(deps): update nextjs monorepo to ^14.1.2 (#193)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-05 20:30:02 +01:00
Meier Lukas 8d5984c58a feat: Add apps crud (#174)
* wip: add apps crud

* wip: add edit for apps

* feat: add apps crud

* fix: color of icon for no app results wrong

* ci: fix lint issues

* test: add unit tests for app crud

* ci: fix format issue

* fix: missing rename in edit form

* fix: missing callback deepsource issues
2024-03-04 22:13:40 +01:00
homarr-renovate[bot]andMeier Lukas 70f34efd53 fix(deps): update dependency next-auth to v5.0.0-beta.15 (#167)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-04 21:32:40 +01:00
homarr-renovate[bot]andMeier Lukas 50fd4c17ad fix(deps): update dependency @auth/drizzle-adapter to ^0.8.0 (#170)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-04 21:28:30 +01:00
homarr-renovate[bot] aa19139cf7 fix(deps): update dependency @auth/core to ^0.28.0 (#169)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-04 21:24:13 +01:00
homarr-renovate[bot] 27a63dbf7a fix(deps): update typescript-eslint monorepo to ^7.1.1 (#192)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-04 21:22:48 +01:00
homarr-renovate[bot] b454ed38eb chore(deps): update dependency vite to ^5.1.5 (#191)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-04 21:22:35 +01:00
homarr-renovate[bot] a9abc5bfe2 chore(deps): update dependency @types/react to ^18.2.62 (#190)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-04 21:21:55 +01:00
homarr-renovate[bot]andMeier Lukas acf9d1803f fix(deps): update dependency mantine-modal-manager to ^7.6.1 (#171)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-04 21:20:22 +01:00
homarr-renovate[bot]andMeier Lukas 8c0534f54c fix(deps): update mantine monorepo to ^7.6.1 (#157)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-04 21:15:43 +01:00
homarr-renovate[bot]andMeier Lukas 4cd897d521 fix(deps): update dependency eslint-plugin-react to ^7.34.0 (#189)
* fix(deps): update dependency eslint-plugin-react to ^7.34.0

* fix: lockfile broken

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-04 21:11:01 +01:00
homarr-renovate[bot]andMeier Lukas fde6d6601d fix(deps): update dependency winston to v3.12.0 (#188)
* fix(deps): update dependency winston to v3.12.0

* fix: lockfile broken

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-04 21:09:29 +01:00
homarr-renovate[bot]andMeier Lukas f98046d9e2 fix(deps): update tanstack-query monorepo to ^5.24.8 (#187)
* fix(deps): update tanstack-query monorepo to ^5.24.8

* fix: lockfile broken

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-04 21:07:02 +01:00
homarr-renovate[bot]andMeier Lukas f4b93d1eae fix(deps): update dependency rimraf to v5 (#186)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-04 21:06:46 +01:00
homarr-renovate[bot]andMeier Lukas 0da3253d21 chore(deps): update dependency supertest to ^6.3.4 (#183)
* chore(deps): update dependency supertest to ^6.3.4

* ci: fix format issue

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-04 21:01:31 +01:00
homarr-renovate[bot]andMeier Lukas e1a98f7fc0 fix(deps): update dependency rxjs to ^7.8.1 (#181)
* fix(deps): update dependency rxjs to ^7.8.1

* fix: lockfile broken

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-04 21:01:22 +01:00
homarr-renovate[bot]andMeier Lukas 9ee96a1462 fix(deps): update dependency reflect-metadata to ^0.2.1 (#182)
* fix(deps): update dependency reflect-metadata to ^0.2.1

* fix: lockfile broken

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-04 21:01:10 +01:00
homarr-renovate[bot]andMeier Lukas ada16317e3 chore(deps): update dependency vite to v5 (#185)
* chore(deps): update dependency vite to v5

* fix: lockfile broken

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-04 20:53:54 +01:00
homarr-renovate[bot]andMeier Lukas 27a039d27a chore(deps): update dependency tsconfig-paths to v4 (#184)
* chore(deps): update dependency tsconfig-paths to v4

* ci: fix format issue

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-04 20:47:43 +01:00
homarr-renovate[bot]andMeier Lukas dc2e13dcb5 chore(deps): update dependency @types/express to ^4.17.21 (#176)
* chore(deps): update dependency @types/express to ^4.17.21

* ci: fix format issue

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-04 20:38:11 +01:00
homarr-renovate[bot]andMeier Lukas 6ef69475e2 chore(deps): update dependency ts-node to ^10.9.2 (#178)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-04 20:37:56 +01:00
homarr-renovate[bot]andMeier Lukas 9b8255aac7 chore(deps): update dependency @types/supertest to ^2.0.16 (#177)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-04 20:37:37 +01:00
homarr-renovate[bot]andMeier Lukas fd5fe529e8 chore(deps): update dependency @swc/core to ^1.4.2 (#175)
* chore(deps): update dependency @swc/core to ^1.4.2

* ci: fix typecheck issue

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-04 20:32:23 +01:00
Manuel 9440d04261 feat: add nestjs app (#172) 2024-03-03 21:07:27 +01:00
homarr-renovate[bot] 7f2ab7f192 fix(deps): update tanstack-query monorepo to ^5.24.6 (#168)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-03 16:49:22 +01:00
Meier Lukas bb02163e25 feat: board settings (#137)
* refactor: improve user feedback for general board settings section

* wip: add board settings for background and colors, move danger zone to own file, refactor code

* feat: add shade selector

* feat: add slider for opacity

* fix: issue with invalid hex values for color preview

* refactor: add shared mutation hook for saving partial board settings with invalidate query

* fix: add cleanup for not applied changes to logo and page title

* feat: add layout settings

* feat: add empty custom css section to board settings

* refactor: improve layout of board logo on mobile

* feat: add theme provider for board colors

* refactor: add auto contrast for better contrast of buttons with low primary shade

* feat: add background for boards

* feat: add opacity for boards

* feat: add rename board

* feat: add visibility and delete of board settings

* fix: issue that wrong data is updated with update board method

* refactor: improve danger zone button placement for mobile

* fix: board not revalidated when already in boards layout

* refactor: improve board color preview

* refactor: change save button color to teal, add placeholders for general board settings

* chore: update initial migration

* refactor: remove unnecessary div

* chore: address pull request feedback

* fix: ci issues

* fix: deepsource issues

* chore: address pull request feedback

* fix: formatting issue

* chore: address pull request feedback
2024-03-03 16:01:32 +01:00
ManuelandMeier Lukas 2a83df3485 feat: use password input (#163)
* feat: use password input

* chore: address pull request feedback

* fix: typo in function name

* fix: deepsource issues

---------

Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-02 17:46:03 +01:00
homarr-renovate[bot]andMeier Lukas 990be660c5 chore(deps): update dependency @types/react to ^18.2.61 (#165)
* chore(deps): update dependency @types/react to ^18.2.61

* fix: formatting issue

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-02 16:41:21 +01:00
homarr-renovate[bot]andMeier Lukas 258ad94bd2 chore(deps): update dependency @types/eslint to ^8.56.5 (#164)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-02 15:58:22 +01:00
homarr-renovate[bot]andMeier Lukas af203e19e7 fix(deps): update dependency jotai to ^2.7.0 (#162)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-02 15:56:01 +01:00
homarr-renovate[bot]andMeier Lukas 14cf39b996 chore(deps): update dependency @types/node to ^20.11.24 (#161)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-03-02 15:51:40 +01:00
homarr-renovate[bot]andMeier Lukas b407f2a9ac fix(deps): update nextjs monorepo to ^14.1.1 (#147)
* fix(deps): update nextjs monorepo to ^14.1.1

* 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-03-02 15:37:40 +01:00
homarr-renovate[bot] baa541afa9 fix(deps): update dependency better-sqlite3 to ^9.4.3 (#118)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-03-02 15:28:02 +01:00
homarr-renovate[bot] fc8d9071aa fix(deps): update dependency jotai to ^2.6.5 (#106)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-27 21:54:13 +01:00
Manuel c6c8778397 feat: add password input field (#160) 2024-02-27 21:53:53 +01:00
homarr-renovate[bot] 212063a51e fix(deps): update tiptap monorepo to ^2.2.4 (#153)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-27 21:19:29 +01:00
homarr-renovate[bot] e74a41165d chore(deps): update dependency eslint to ^8.57.0 (#154)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-27 21:19:06 +01:00
homarr-renovate[bot] 47f44128f5 chore(deps): update dependency @types/node to ^20.11.20 (#151)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-27 21:18:35 +01:00
homarr-renovate[bot] f211ffbf78 fix(deps): update dependency mantine-react-table to v2.0.0-beta.0 (#149)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-27 20:53:06 +01:00
homarr-renovate[bot] 4cf505f0c5 fix(deps): update dependency drizzle-orm to ^0.29.4 (#150)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-27 20:43:40 +01:00
homarr-renovate[bot] c4ffa59ede chore(deps): update pnpm to v8.15.4 (#155)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-27 20:43:16 +01:00
homarr-renovate[bot] 3022e7f0af fix(deps): update tanstack-query monorepo to ^5.24.1 (#156)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-27 20:43:09 +01:00
homarr-renovate[bot] e9b02519a4 chore(deps): update dependency @types/react to ^18.2.60 (#158)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-27 20:42:23 +01:00
homarr-renovate[bot] 8e5379225a fix(deps): update typescript-eslint monorepo to ^7.1.0 (#159)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-27 20:42:06 +01:00
Meier Lukas b2cee8f693 fix: next auth host not trusted (#144) 2024-02-23 17:15:24 +01:00
homarr-renovate[bot] cfb3daef95 chore(deps): update dependency @types/react to ^18.2.58 (#152)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-23 17:05:43 +01:00
homarr-renovate[bot] f060f50caf chore(deps): update dependency @types/eslint to ^8.56.3 (#111)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-23 17:05:31 +01:00
homarr-renovate[bot] abc4a9afbc fix(deps): update dependency sass to ^1.71.1 (#148)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-21 21:24:43 +01:00
Manuel 60dec6e3be feat: add 404 page (#145) 2024-02-21 21:24:33 +01:00
homarr-renovate[bot]andMeier Lukas 5d68300600 fix(deps): update tanstack-query monorepo (#141)
* fix(deps): update tanstack-query monorepo

* fix: lockfile broken

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-02-20 21:43:21 +01:00
homarr-renovate[bot]andMeier Lukas 4d011364bf fix(deps): update dependency next to ^14.1.1-canary.63 (#146)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-02-20 21:33:40 +01:00
Meier Lukas 3d50f8165f feat: add winston logger (#143)
* feat: add winston logger

* refactor: improve usage of winston logger overide, remove start.js file and logger.js file used for override

* fix: formatting

* fix: formatting
2024-02-20 21:28:27 +01:00
Manuel b4749e7091 feat: add user management (#134) 2024-02-20 21:18:47 +01:00
homarr-renovate[bot]andMeier Lukas fde634d834 fix(deps): update dependency next to ^14.1.1-canary.62 (#140)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-02-20 20:15:25 +01:00
homarr-renovate[bot] 859eeed329 fix(deps): update typescript-eslint monorepo to ^7.0.2 (#122)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-20 20:09:20 +01:00
homarr-renovate[bot] 69b9247550 chore(deps): update dependency @types/react to ^18.2.57 (#139)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-20 20:08:59 +01:00
homarr-renovate[bot] 72feb06610 chore(deps): update vitest monorepo to ^1.3.1 (#142)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-20 20:08:35 +01:00
homarr-renovate[bot] 64194c51ed fix(deps): update dependency next-auth to v5.0.0-beta.13 (#108)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-20 20:08:11 +01:00
Manuel a4fc6f6444 refactor: client side navigation (#135) 2024-02-19 18:04:01 +01:00
homarr-renovate[bot] 6a02afbfe2 fix(deps): update dependency next to ^14.1.1-canary.61 (#138)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-19 06:31:42 +01:00
homarr-renovate[bot]andMeier Lukas e150577c7e fix(deps): update tanstack-query monorepo to ^5.21.7 (#133)
* fix(deps): update tanstack-query monorepo to ^5.21.7

* fix: formatting issue

* fix: formatting issue

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-02-18 22:13:19 +01:00
homarr-renovate[bot]andMeier Lukas 4565f38bef fix(deps): update dependency mantine-modal-manager to ^7.5.3 (#132)
* fix(deps): update dependency mantine-modal-manager to ^7.5.3

* fix: formatting issue

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-02-18 22:03:38 +01:00
Manuel 7d648600ee config. replace logo (#136) 2024-02-18 21:53:51 +01:00
Manuel e3e38e7f44 feat: add create board modal (#131) 2024-02-18 15:44:49 +01:00
Meier Lukas f1aa422614 feat: add support for multiple integration kind options (#127)
* feat: add support for multiple integration kind options

* fix: deepsource issue JS-0417 missing use callback
2024-02-18 14:24:07 +01:00
Meier Lukas 1e414af57c fix: issue with category removal and ready state (#129) 2024-02-18 09:10:16 +01:00
homarr-renovate[bot] 4f911c4f56 fix(deps): update dependency next to ^14.1.1-canary.59 (#121)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-18 08:50:26 +01:00
homarr-renovate[bot] dbf02c6264 fix(deps): update dependency @tanstack/react-query-devtools to ^5.21.5 (#130)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-18 08:48:40 +01:00
homarr-renovate[bot] a9a3d98248 fix(deps): update tanstack-query monorepo to ^5.21.4 (#128)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-17 22:07:12 +01:00
Manuel 3d3c1b50a3 Merge branch 'dev' of https://github.com/homarr-labs/homarr into dev 2024-02-17 16:22:14 +01:00
Manuel 547f75d19c fix: crash with no user in session 2024-02-17 16:22:05 +01:00
Meier Lukas d5025da789 Add search spotlight with registration hook (#82)
* wip: add spotlight

* feat: add spotlight with registration hook and group chips

* chore: address pull request feedback

* docs: add documentation for usage of spotlight actions

* fix: deepsource issue JS-0415

* feat: add support for dependencies of spotlight actions

* fix: lockfile broken

* feat: add hover effect for spotlight action

* docs: Add documentation about dependency array

* refactor: remove test spotlight actions, disallow all as group for actions

* fix: type issues

* chore: address pull request feedback
2024-02-17 14:11:23 +01:00
homarr-renovate[bot]andMeier Lukas 3577bd6ac3 chore(deps): update dependency @types/react to ^18.2.56 (#104)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-02-17 12:58:01 +01:00
homarr-renovate[bot]andMeier Lukas 71521c0768 fix(deps)!: update tanstack-query monorepo (#126)
* fix(deps): update tanstack-query monorepo to ^5.21.2

* fix(deps): update tanstack-query monorepo

* fix: type issue with transformer

* fix: issues with next-auth, updated to next canary

* chore: fix type issue in trpc route

* chore: fix formatting

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-02-17 12:52:25 +01:00
Manuel 3bdd117659 ci: remove automatic-release.yml 2024-02-16 23:05:30 +01:00
homarr-renovate[bot] 1d3fa16484 chore(deps): update dependency node to v20.11.1 (#92)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-16 22:57:08 +01:00
homarr-renovate[bot] 3e44644ef6 fix(deps): update tiptap monorepo to ^2.2.3 (#95)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-16 22:55:32 +01:00
homarr-renovate[bot] 9a60588a03 fix(deps): update dependency sass to ^1.71.0 (#96)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-16 22:53:43 +01:00
homarr-renovate[bot] ba0c3c72ed chore(deps): update vitest monorepo to ^1.3.0 (#98)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-16 22:53:09 +01:00
homarr-renovate[bot] 4ea1d14966 fix(deps): update dependency @tanstack/react-query-devtools to ^5.21.0 (#101)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-16 22:50:43 +01:00
homarr-renovate[bot] 35edfc74c4 fix(deps): update mantine monorepo to ^7.5.3 (#97)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-16 22:49:45 +01:00
homarr-renovate[bot] 5d69ff74f3 chore(deps): update pnpm to v8.15.3 (#94)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-16 22:43:16 +01:00
Manuel 5997afdd7b chore: merge update branch 2024-02-16 22:26:28 +01:00
Meier Lukas 144e1512f7 ci: update node version to 20 2024-02-16 20:26:48 +01:00
homarr-renovate[bot] f91338446d fix(deps): update typescript-eslint monorepo to v7 (#87)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-15 20:40:50 +01:00
homarr-renovate[bot]andMeier Lukas 6c5e4752ea fix(deps): update dependency @auth/core to ^0.27.0 (#89)
* fix(deps): update dependency @auth/core to ^0.27.0

* fix: lockfile broken

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-02-15 20:39:55 +01:00
homarr-renovate[bot]andMeier Lukas 11393525d9 fix(deps): update dependency @auth/drizzle-adapter to ^0.7.0 (#90)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-02-15 20:28:21 +01:00
homarr-renovate[bot] 336dc38b2d fix(deps): update dependency next-auth to v5.0.0-beta.11 (#91)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-15 20:23:57 +01:00
homarr-renovate[bot] b77e652822 fix(deps): update tanstack-query monorepo to ^5.20.5 (#86)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-15 20:22:00 +01:00
homarr-renovate[bot] 966425c119 chore(deps): update pnpm to v8.15.2 (#88)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-14 22:55:18 +01:00
homarr-renovate[bot] c5fb8075ce chore(deps): update turbo monorepo to ^1.12.4 (#93)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-14 22:54:32 +01:00
Meier Lukas 25693b10b1 Fix issue where gridstack items can have a width of zero (#85) 2024-02-11 16:18:15 +01:00
homarr-renovate[bot] 34f06e817d fix(deps): update dependency better-sqlite3 to ^9.4.1 (#83)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-11 09:37:37 +01:00
Manuel 08fa338abb feat: add user avatar menu (#80) 2024-02-10 23:14:02 +01:00
Meier Lukas 16442bc379 feat: add support for should hide option i widget edit modal (#78) 2024-02-10 19:11:40 +01:00
Meier Lukas f070a0cb0a test: add initial unit tests (#56)
* chore: add initial db migration

* test: add unit tests for packages auth, common, widgets

* fix: deep source issues

* fix: format issues

* wip: add unit tests for api routers

* fix: deep source issues

* test:  add missing unit tests for integration router

* wip: board tests

* test: add unit tests for board router

* fix: remove unnecessary null assertions

* fix: deepsource issues

* fix: formatting

* fix: pnpm lock

* fix: lint and typecheck issues

* chore: address pull request feedback

* fix: non-null assertions

* fix: lockfile broken
2024-02-10 19:00:08 +01:00
Manuel 13aae82790 docs: add pull request template 2024-02-10 18:22:23 +01:00
Manuel 34875dfd15 feat: add winston logger (#77) 2024-02-10 18:07:24 +01:00
homarr-renovate[bot] 00f4a288a4 fix(deps): update tanstack-query monorepo to ^5.20.1 (#75)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-10 13:45:18 +01:00
homarr-renovate[bot] 60d5ebbc11 fix(deps): update dependency next-international to ^1.2.4 (#76)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-10 11:27:31 +01:00
Manuel 3e732fc613 config: add permissions to automatic release workflow 2024-02-09 23:05:50 +01:00
homarr-renovate[bot] f704bad36e fix(deps): update dependency mantine-modal-manager to ^7.5.2 (#72)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-09 22:20:41 +01:00
Manuel 5ef79edc1a feat: add boards management page (#55) 2024-02-09 22:20:28 +01:00
homarr-renovate[bot] 81e61b4d6b fix(deps): update mantine monorepo to ^7.5.2 (#71)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-09 22:05:39 +01:00
homarr-renovate[bot] 7f4ad88b0f chore(deps): update dependency @types/node to ^20.11.17 (#70)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-09 21:23:24 +01:00
deepsource-autofix[bot]andMeier Lukas a4f6a7c16a refactor: replace short hand type conversions with function calls (#65)
* refactor: replace short hand type conversions with function calls

Prefer using explicit casts by calling `Number`, `Boolean`, or `String` over using operators like `+`, `!!` or `"" +`. This is considered best practice as it improves readability.

* fix: formatting

---------

Co-authored-by: deepsource-autofix[bot] <62050782+deepsource-autofix[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-02-08 20:06:57 +01:00
homarr-renovate[bot]andMeier Lukas 11d1568714 fix(deps): update dependency @t3-oss/env-nextjs to ^0.9.2 (#69)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-02-08 20:05:09 +01:00
homarr-renovate[bot]andMeier Lukas 15f08011a6 fix(deps): update dependency prettier to ^3.2.5 (#53)
* fix(deps): update dependency prettier to ^3.2.5

* fix: formatting

* fix: formatting

* fix: formatting

---------

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-02-08 19:58:56 +01:00
Meier Lukas 975f9123dd feat: add widget server loader (#16)
* wip: Add gridstack board

* wip: Centralize board pages, Add board settings page

* fix: remove cyclic dependency and rename widget-sort to kind

* improve: Add header actions as parallel route

* feat: add item select modal, add category edit modal,

* feat: add edit item modal

* feat: add remove item modal

* wip: add category actions

* feat: add saving of board, wip: add app widget

* Merge branch 'main' into add-board

* chore: update turbo dependencies

* chore: update mantine dependencies

* chore: fix typescript errors, lint and format

* feat: add confirm modal to category removal, move items of removed category to above wrapper

* feat: remove app widget to continue in another branch

* feat: add loading spinner until board is initialized

* fix: issue with cellheight of gridstack items

* feat: add translations for board

* fix: issue with translation for settings page

* feat: add widget server loader

* fix: typing issue

* chore: address pull request feedback

* fix: formatting
2024-02-08 07:00:00 +01:00
homarr-renovate[bot] cc52c2ba78 fix(deps): update dependency next-auth to v5.0.0-beta.9 (#68)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-08 06:48:19 +01:00
Tagaishi 55ec60041a fix: Remove version override (#67)
* 🐛 remove version override

* fix: configuration userid error
2024-02-07 21:24:50 +01:00
deepsource-autofix[bot] 91812531b4 refactor: remove true from boolean attribute (#66)
When using a boolean attribute in JSX, you can set the attribute value to true or omit the value. This helps to keep consistency in code.

Co-authored-by: deepsource-autofix[bot] <62050782+deepsource-autofix[bot]@users.noreply.github.com>
2024-02-07 21:02:22 +01:00
homarr-renovate[bot] 6797cca259 fix(deps): update dependency @auth/drizzle-adapter to ^0.6.3 (#52)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-07 20:54:51 +01:00
homarr-renovate[bot] 5cbd02b142 fix(deps): update dependency @auth/core to ^0.26.3 (#54)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-07 20:45:29 +01:00
homarr-renovate[bot] 941307b954 chore(deps): update turbo monorepo to ^1.12.3 (#62)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-07 20:45:17 +01:00
homarr-renovate[bot] 593bc9ca1c fix(deps): update tiptap monorepo to ^2.2.2 (#63)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-07 20:45:09 +01:00
homarr-renovate[bot] 8994ac2501 chore(deps): update dependency @types/react-dom to ^18.2.19 (#64)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-07 20:44:59 +01:00
homarr-renovate[bot] 544a6d9926 fix(deps): update dependency next-auth to v5.0.0-beta.8 (#60)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-06 21:52:11 +01:00
homarr-renovate[bot] ddc6f1fa16 chore(deps): update dependency @types/react to ^18.2.55 (#61)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-06 21:51:51 +01:00
homarr-renovate[bot] e683d61568 fix(deps): update typescript-eslint monorepo to ^6.21.0 (#58)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-05 20:32:29 +01:00
homarr-renovate[bot] 5d3ca5b190 chore(deps): update dependency @types/react to ^18.2.54 (#59)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-05 20:32:16 +01:00
homarr-renovate[bot] 19588d77c8 chore(deps): update dependency @types/react to ^18.2.53 (#57)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-05 07:12:16 +01:00
Manuel c89d13557d config: add telemetry opt out to env 2024-02-04 11:26:05 +01:00
Meier Lukas ae12f0c9df test: add vitest for unit tests (#50)
* feat: add vitest for unit tests

* chore: address pull request feedback

* test: add unit test code quality workflow
2024-02-04 09:47:23 +01:00
ca04bf692d chore(deps): update dependency node to v20 (#42)
Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-02-04 09:21:53 +01:00
homarr-renovate[bot] 7cd56217eb chore(deps): update anothrnick/github-tag-action action to v1.67.0 (#43)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-04 09:21:05 +01:00
4815230f8b fix(deps): update typescript-eslint monorepo to ^6.20.0 (#41)
Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-02-04 09:15:59 +01:00
homarr-renovate[bot] 59f024184b chore(deps): update actions/setup-node action to v4 (#44)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-04 09:15:51 +01:00
homarr-renovate[bot] 2b5ebda727 chore(deps): update docker/build-push-action action to v5 (#45)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-04 09:14:57 +01:00
homarr-renovate[bot] a1e15c65d2 chore(deps): update docker/metadata-action action to v5 (#46)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-04 09:14:04 +01:00
1e01312fcd fix(deps): update tiptap monorepo to ^2.2.1 (#40)
Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-02-04 09:12:40 +01:00
homarr-renovate[bot] 58803bcece chore(deps): update docker/setup-buildx-action action to v3 (#47)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-04 09:11:28 +01:00
717e919450 fix(deps): update tanstack-query monorepo to ^5.18.1 (#39)
Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-02-04 09:08:36 +01:00
homarr-renovate[bot] 33c918603c chore(deps): update docker/setup-qemu-action action to v3 (#48)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-04 09:07:27 +01:00
dadfc0c5d7 fix(deps): update nextjs monorepo to ^14.1.0 (#38)
Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-02-04 09:05:59 +01:00
homarr-renovate[bot] ab7c884fbf chore(deps): update peter-evans/create-pull-request action to v6 (#49)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2024-02-04 09:05:27 +01:00
9aaec5495d fix(deps): update dependency prettier to ^3.2.4 (#37)
* fix(deps): update dependency prettier to ^3.2.4

* fix: formatting issues

---------

Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-02-04 09:03:22 +01:00
ManuelandRenovate Bot d73e7a3c3f fix(deps): update dependency postcss-preset-mantine to ^1.13.0 (#36)
Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
2024-02-04 08:53:33 +01:00
ManuelandRenovate Bot b8fe04144f fix(deps): update dependency next-international to ^1.2.3 (#35)
Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
2024-02-04 08:53:16 +01:00
ManuelandRenovate Bot 837e3900fa fix(deps): update dependency eslint-config-turbo to ^1.12.2 (#34)
Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
2024-02-04 08:47:20 +01:00
ManuelandRenovate Bot 00db901833 fix(deps): update dependency better-sqlite3 to ^9.4.0 (#33)
Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
2024-02-04 08:46:39 +01:00
ManuelandRenovate Bot 6a892e02c8 fix(deps): update dependency @tabler/icons-react to ^2.47.0 (#32)
Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
2024-02-04 08:46:26 +01:00
f8a3aae116 fix(deps): update dependency @t3-oss/env-nextjs to ^0.8.0 (#31)
Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-02-04 08:46:06 +01:00
191d773aaf fix(deps): update dependency @auth/drizzle-adapter to ^0.5.0 (#30)
* fix(deps): update dependency @auth/drizzle-adapter to ^0.5.0

* fix: remove duplication of auth dependencies

* fix: formatting issue

---------

Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-02-04 08:41:56 +01:00
ManuelandRenovate Bot 8bcbc45943 fix(deps): update dependency @auth/core to ^0.25.0 (#29)
Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
2024-02-04 08:31:02 +01:00
ManuelandRenovate Bot d9d169c0ce chore(deps): update pnpm to v8.15.1 (#28)
Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
2024-02-04 08:29:40 +01:00
ManuelandRenovate Bot a7d5c36aa7 fix(deps): update dependency jotai to ^2.6.4 (#24)
Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
2024-02-04 08:29:21 +01:00
ManuelandRenovate Bot b3e2032b54 chore(deps): update dependency @types/cookies to v0.9.0 (#25)
Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
2024-02-04 08:28:18 +01:00
ManuelandRenovate Bot 7da312134c chore(deps): update dependency @types/eslint to ^8.56.2 (#26)
Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
2024-02-04 08:28:05 +01:00
ManuelandRenovate Bot 8a4fc849a2 chore(deps): update dependency node to v18.19.0 (#27)
Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
2024-02-04 08:27:51 +01:00
ManuelandRenovate Bot f3bb990c4d fix(deps): update dependency eslint-plugin-import to ^2.29.1 (#23)
Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
2024-02-03 23:13:50 +01:00
ManuelandRenovate Bot 8a9656a01e chore(deps): update dependency drizzle-kit to ^0.20.14 (#22)
Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
2024-02-03 23:13:43 +01:00
deepsource-io[bot] 2e555fbb35 ci: update .deepsource.toml 2024-02-03 22:06:11 +00:00
deepsource-io[bot] e6a5c83d9c ci: add .deepsource.toml 2024-02-03 22:01:50 +00:00
Meier Lukas 2943819f74 chore: update gridstack to homarr/gridstack package (#20)
* chore: migrate gridstack to homarr gridstack

* fix: formatting issue
2024-02-03 22:59:34 +01:00
d3c11f49dc chore(deps): update dependency @types/better-sqlite3 to v7.6.9 (#17)
* chore(deps): update dependency @types/better-sqlite3 to v7.6.9

* fix: lint issue

---------

Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2024-02-03 22:59:15 +01:00
Manuel 74e1ad2f00 config: push webhook on image build 2024-02-03 22:57:49 +01:00
Manuel a3156bcb18 config: disable turborepo telemetry 2024-02-03 22:50:01 +01:00
Manuel ea7cb27cfa config: add pnpm to deployment workflow 2024-02-03 22:46:21 +01:00
Manuel 154fc050cd config: add docker image workflow 2024-02-03 22:35:30 +01:00
Meier Lukas 9d520874f4 feat: add board (#15)
* wip: Add gridstack board
* wip: Centralize board pages, Add board settings page
* fix: remove cyclic dependency and rename widget-sort to kind
* improve: Add header actions as parallel route
* feat: add item select modal, add category edit modal,
* feat: add edit item modal
* feat: add remove item modal
* wip: add category actions
* feat: add saving of board, wip: add app widget
* Merge branch 'main' into add-board
* chore: update turbo dependencies
* chore: update mantine dependencies
* chore: fix typescript errors, lint and format
* feat: add confirm modal to category removal, move items of removed category to above wrapper
* feat: remove app widget to continue in another branch
* feat: add loading spinner until board is initialized
* fix: issue with cellheight of gridstack items
* feat: add translations for board
* fix: issue with translation for settings page
* chore: address pull request feedback
2024-02-03 22:26:12 +01:00
Manuel cfd1c14034 Merge remote-tracking branch 'origin/dev' into dev 2024-02-03 22:10:45 +01:00
Manuel f0fa0eb321 config: disable dependency dashboard 2024-02-03 22:10:21 +01:00
ManuelandRenovate Bot e9c6583d21 chore(deps): update dependency @types/react to ^18.2.52 (#18)
Co-authored-by: Renovate Bot <renovate@whitesourcesoftware.com>
2024-02-03 22:09:11 +01:00
Manuel 3e2bc9df0e config: remove renovate workflow 2024-02-03 22:06:40 +01:00
Manuel c736f17f14 config: disable auto discover 2024-02-03 21:59:49 +01:00
Manuel 39b4e761de config: migrate renovate config 2024-02-03 21:56:58 +01:00
Manuel 89311c44a0 config: remove docker properties renovate 2024-02-03 21:53:15 +01:00
Manuel b678401020 config: add base branch to renovate 2024-02-03 21:50:55 +01:00
Manuel f12192e6f2 config: add renovate CI 2024-02-03 21:50:08 +01:00
Manuel 3724071fcb docs: update funding 2024-02-03 21:39:25 +01:00
Manuel b671f68b13 config: add deployment workflow (#8) 2024-02-03 21:30:45 +01:00
Meier Lukas 1740450648 feat: Add widget integration option (#14)
* wip: add widget integrations

* feat: Add integration option to widgets

* feat: Add translation for widget integration select

* fix: formatting issue

* chore: address pull request feedback
2024-02-03 10:24:39 +01:00
Meier Lukas 3a0f280984 chore: update dependencies (#13)
* chore: update dependencies

* chore: update nextauth dependency to beta 5

* chore: fix formatting
2024-01-23 21:49:47 +01:00
Meier Lukas 81d35656ba refactor: move integration pages to main directory for main layout 2024-01-03 06:04:42 +01:00
Meier Lukas 367beb6759 feat: add crud for integrations (#11)
* wip: add crud for services and integrations

* feat: remove services

* feat: move integration definitions to homarr/definitions, add temporary test connection solution without actual request

* feat: add integration count badge

* feat: add translation for integrations

* feat: add notifications and translate them

* feat: add notice to integration forms about test connection

* chore: fix ci check issues

* feat: add confirm modals for integration deletion and secret card cancellation, change ordering for list page, add name property to integrations

* refactor: move revalidate path action

* chore: fix ci check issues

* chore: install missing dependencies

* chore: fix ci check issues

* chore: address pull request feedback
2024-01-02 17:12:26 +01:00
Manuel 2809e01b03 feat: add management pages (#12) 2024-01-02 16:49:02 +01:00
Meier Lukas 782897527f feat: add widget preview pages (#9)
* feat: add widget definition system

* fix: wrong typecheck command in turbo generator

* chore: fix formatting

* feat: add widget preview page

* chore: fix formatting and type errors

* chore: fix from widget edit modal and remove some never casts

* chore: address pull request feedback
2024-01-02 15:36:59 +01:00
Meier Lukas fa19966fcc chore: restructure packages of the project (#7)
* chore: restructure validation package

* chore: move zod only to validation package

* chore: rename packages from alparr to homarr

* chore: move mantine core, dates and icons library to ui package, move most other mantine packages to seperate packages for further customization and centralization

* chore: fix formatting

* fix: wrong typecheck command in turbo generator

* chore: fix formatting

* chore: address pull request feedback

* chore: fix ci check issues
2024-01-02 14:18:37 +01:00
Meier Lukas a082f70470 feat: add next-international translations (#2)
* feat: add next-international translations
* chore: fix formatting
* chore: address pull request feedback
2023-12-19 23:09:41 +01:00
Meier Lukas 3cedb7fba5 feat: add credentials authentication (#1) 2023-12-10 17:12:20 +01:00
Meier Lukas 41e54d940b refactor: migrate to sqlite as database 2023-12-09 00:32:45 +01:00
Meier Lukas f6094c6ae2 chore: add ui package and custom theme colors 2023-12-08 23:47:55 +01:00
Meier Lukas 9ea96899b1 chore: rename local packages from acme to alparr 2023-12-08 23:13:46 +01:00
Meier Lukas d115779c85 chore: migrate from tailwind to mantine 2023-12-08 23:11:37 +01:00
Meier Lukas a2cedf73c0 Initial commit 2023-12-08 22:35:15 +01:00
667 changed files with 57198 additions and 0 deletions

No files matched your search

+11
View File
@@ -0,0 +1,11 @@
version = 1
[[analyzers]]
name = "javascript"
[analyzers.meta]
plugins = ["react"]
environment = ["nodejs"]
[[transformers]]
name = "prettier"
+8
View File
@@ -0,0 +1,8 @@
Dockerfile
.dockerignore
node_modules
npm-debug.log
README.md
.next
.git
dev
+33
View File
@@ -0,0 +1,33 @@
# Since .env is gitignored, you can use .env.example to build a new `.env` file when you clone the repo.
# Keep this file up-to-date when you add new variables to \`.env\`.
# This file will be committed to version control, so make sure not to have any secrets in it.
# If you are cloning this repo, create a copy of this file named `.env` and populate it with your secrets.
# This is how you can use the sqlite driver:
DB_DRIVER='better-sqlite3'
DB_URL='FULL_PATH_TO_YOUR_SQLITE_DB_FILE'
# Those are the two ways to use the mysql2 driver:
# 1. Using the URL format:
# DB_DRIVER='mysql2'
# DB_URL='mysql://user:password@host:port/database'
# 2. Using the connection options format:
# DB_DRIVER='mysql2'
# DB_HOST='localhost'
# DB_PORT='3306'
# DB_USER='username'
# 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
AUTH_SECRET='supersecret'
TURBO_TELEMETRY_DISABLED=1
# Configure logging to use winston logger
NODE_OPTIONS='-r @homarr/log/override'
+3
View File
@@ -0,0 +1,3 @@
# These are supported funding model platforms
open_collective: homarr
+37
View File
@@ -0,0 +1,37 @@
name: 🐞 Bug Report
description: Create a bug report to help us improve
title: "bug: "
labels: ["🐞❔ unconfirmed bug"]
body:
- type: textarea
attributes:
label: Provide environment information
description: |
Run this command in your project root and paste the results in a code block:
```bash
npx envinfo --system --binaries
```
validations:
required: true
- type: textarea
attributes:
label: Describe the bug
description: A clear and concise description of the bug, as well as what you expected to happen when encountering it.
validations:
required: true
- type: input
attributes:
label: Link to reproduction
description: Please provide a link to a reproduction of the bug. Issues without a reproduction repo may be ignored.
validations:
required: true
- type: textarea
attributes:
label: To reproduce
description: Describe how to reproduce your bug. Steps, code snippets, reproduction repos etc.
validations:
required: true
- type: textarea
attributes:
label: Additional information
description: Add any other information related to the bug here, screenshots if applicable.
@@ -0,0 +1,28 @@
# This template is heavily inspired by the Next.js's template:
# See here: https://github.com/vercel/next.js/blob/canary/.github/ISSUE_TEMPLATE/3.feature_request.yml
name: 🛠 Feature Request
description: Create a feature request for the core packages
title: "feat: "
labels: ["✨ enhancement"]
body:
- type: markdown
attributes:
value: |
Thank you for taking the time to file a feature request. Please fill out this form as completely as possible.
- type: textarea
attributes:
label: Describe the feature you'd like to request
description: Please describe the feature as clear and concise as possible. Remember to add context as to why you believe this feature is needed.
validations:
required: true
- type: textarea
attributes:
label: Describe the solution you'd like to see
description: Please describe the solution you would like to see. Adding example usage is a good way to provide context.
validations:
required: true
- type: textarea
attributes:
label: Additional information
description: Add any other information related to the feature here. If your feature request is related to any issues or discussions, link them here.
+13
View File
@@ -0,0 +1,13 @@
<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)
+31
View File
@@ -0,0 +1,31 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:recommended"
],
"packageRules": [
{
"matchPackagePatterns": [
"^@homarr/",
"tsx" // Disabled for now as version 0.14.4 did not work with the current version of homarr. It resulted in a ERR_MODULE_NOT_FOUND error
],
"enabled": false
},
{
"matchUpdateTypes": [
"minor",
"patch",
"pin",
"digest"
],
"automerge": true
}
],
"updateInternalDeps": true,
"rangeStrategy": "bump",
"automerge": false,
"baseBranches": [
"dev"
],
"dependencyDashboard": false
}
+86
View File
@@ -0,0 +1,86 @@
name: "[Quality] Code Analysis"
on:
pull_request:
branches: ["*"]
push:
branches: ["main"]
merge_group:
concurrency:
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
# @link https://turborepo.org/docs/core-concepts/remote-caching#remote-caching-on-vercel-builds
env:
FORCE_COLOR: 3
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
TURBO_TEAM: ${{ vars.TURBO_TEAM }}
jobs:
lint:
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: Lint
run: pnpm lint && pnpm lint:ws
format:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup
uses: ./tooling/github/setup
- name: Format
run: pnpm format
typecheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup
uses: ./tooling/github/setup
- name: Typecheck
run: turbo typecheck
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup
uses: ./tooling/github/setup
- 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,94 @@
name: "[Deployment] Release"
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: [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: master
- name: Discord notification
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 }}
cache: "pnpm"
- name: Install dependencies
run: pnpm install
- name: Build artifacts
run: pnpm build
- name: Discord notification
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@master
with:
args: "Built application artifacts. Building images..."
- 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=latest
type=raw,value=${{ steps.semver.outputs.next }}
- name: Build and push
id: buildPushAction
uses: docker/build-push-action@v6
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: "Deployment of image has completed. Image ID is '${{ steps.buildPushAction.outputs.imageid }}'. This was a dry run."
@@ -0,0 +1,82 @@
name: "[Deployment] Automatic Weekly Release"
on:
schedule:
- cron: "0 19 * * 5" # https://crontab.guru/#0_19_*_*_5
workflow_dispatch:
permissions:
contents: write
pull-requests: write
jobs:
create-and-merge-pr:
runs-on: ubuntu-latest
steps:
- name: Discord notification
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
uses: devops-infra/action-pull-request@v0.5.5
id: create-pull-request
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
title: "chore(release): automatic release ${{ steps.semver.outputs.next }}"
new_string: "**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 }}``"
source_branch: dev
target_branch: main
label: automerge
- name: Discord notification
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 }})"
- id: automerge
if: ${{ steps.semver.outputs.bump != 'major' }}
name: automerge
uses: "pascalgn/automerge-action@v0.16.3"
env:
GITHUB_TOKEN: "${{ secrets.GITHUB_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' }}
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' }}
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()
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"
@@ -0,0 +1,26 @@
name: "[Dependency Updates] Auto Approve"
on:
pull_request:
types: [opened, synchronize]
jobs:
approve-renovate-prs:
runs-on: ubuntu-latest
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: |
for pr in $(gh pr list --author homarr-renovate[bot] --json number --jq .[].number); do
gh pr review $pr --approve --body "Automatically approved by GitHub Action"
done
+57
View File
@@ -0,0 +1,57 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
node_modules
.pnp
.pnp.js
.idea/
# testing
coverage
# next.js
.next/
out/
next-env.d.ts
# artifacts
packages/db/migrations/*/migrate.cjs
# nitro
.nitro/
.output/
# production
build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
# local env files
.env
.env*.local
# vercel
.vercel
# typescript
*.tsbuildinfo
# turbo
.turbo
# database
db.sqlite
# logs
*.log
apps/tasks/tasks.cjs
apps/websocket/wssServer.cjs
+5
View File
@@ -0,0 +1,5 @@
# Expo doesn't play nice with pnpm by default.
# The symbolic links of pnpm break the rules of Expo monorepos.
# @link https://docs.expo.dev/guides/monorepos/#common-issues
node-linker=hoisted
strict-peer-dependencies=false
+1
View File
@@ -0,0 +1 @@
20.15.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>
+7
View File
@@ -0,0 +1,7 @@
{
"recommendations": [
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"yoavbls.pretty-ts-errors"
]
}
+87
View File
@@ -0,0 +1,87 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "dev",
"type": "node-terminal",
"request": "launch",
"command": "pnpm dev",
"cwd": "${workspaceFolder}",
"skipFiles": ["<node_internals>/**"]
},
{
"name": "docker dev",
"type": "node-terminal",
"request": "launch",
"command": "pnpm docker:dev",
"cwd": "${workspaceFolder}",
"skipFiles": [
"<node_internals>/**"
]
},
{
"name": "lint fix",
"type": "node-terminal",
"request": "launch",
"command": "pnpm lint:fix",
"cwd": "${workspaceFolder}",
"skipFiles": [
"<node_internals>/**"
]
},
{
"name": "format fix",
"type": "node-terminal",
"request": "launch",
"command": "pnpm format:fix",
"cwd": "${workspaceFolder}",
"skipFiles": [
"<node_internals>/**"
]
},
{
"name": "db push",
"type": "node-terminal",
"request": "launch",
"command": "pnpm db:push",
"cwd": "${workspaceFolder}",
"skipFiles": ["<node_internals>/**"]
},
{
"name": "db studio",
"type": "node-terminal",
"request": "launch",
"command": "pnpm db:studio",
"cwd": "${workspaceFolder}",
"skipFiles": ["<node_internals>/**"]
},
{
"name": "db migration run",
"type": "node-terminal",
"request": "launch",
"command": "pnpm db:migration:run",
"cwd": "${workspaceFolder}",
"skipFiles": ["<node_internals>/**"]
},
{
"name": "test",
"type": "node-terminal",
"request": "launch",
"command": "pnpm test",
"cwd": "${workspaceFolder}",
"skipFiles": [
"<node_internals>/**"
]
},
{
"name": "test ui",
"type": "node-terminal",
"request": "launch",
"command": "pnpm test:ui",
"cwd": "${workspaceFolder}",
"skipFiles": [
"<node_internals>/**"
]
}
]
}
+26
View File
@@ -0,0 +1,26 @@
{
"eslint.workingDirectories": [
{
"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": [
"cqmin",
"homarr",
"jellyfin",
"superjson",
"trpc",
"Umami",
"Sonarr"
],
"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"
}
+1
View File
@@ -0,0 +1 @@
* @homarr-labs/maintainers
+87
View File
@@ -0,0 +1,87 @@
FROM node:20.15.0-alpine AS base
FROM base AS builder
RUN apk add --no-cache libc6-compat
RUN apk update
# Set working directory
WORKDIR /app
COPY . .
RUN npm i -g turbo
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
# Add lockfile and package.json's of isolated subworkspace
FROM base AS installer
RUN apk add --no-cache libc6-compat curl bash
RUN apk update
WORKDIR /app
# First install the dependencies (as they change less often)
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/next-out/json/ .
COPY --from=builder /app/next-out/pnpm-lock.yaml ./pnpm-lock.yaml
RUN corepack enable pnpm && pnpm install sharp -w
# Build the project
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/ .
# Copy static data as it is not part of the build
COPY static-data ./static-data
ARG SKIP_ENV_VALIDATION=true
RUN corepack enable pnpm && pnpm turbo run build
FROM base AS runner
WORKDIR /app
RUN apk add --no-cache redis
RUN mkdir /appdata
RUN mkdir /appdata/db
RUN mkdir /appdata/redis
VOLUME /appdata
# Don't run production as root
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
RUN chown -R nextjs:nodejs /appdata
USER nextjs
COPY --from=installer /app/apps/nextjs/next.config.mjs .
COPY --from=installer /app/apps/nextjs/package.json .
COPY --from=installer --chown=nextjs:nodejs /app/apps/tasks/tasks.cjs ./apps/tasks/tasks.cjs
COPY --from=installer --chown=nextjs:nodejs /app/apps/websocket/wssServer.cjs ./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
# Automatically leverage output traces to reduce image size
# https://nextjs.org/docs/advanced-features/output-file-tracing
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 packages/redis/redis.conf /app/redis.conf
ENV DB_URL='/appdata/db/db.sqlite'
ENV DB_DIALECT='sqlite'
ENV DB_DRIVER='better-sqlite3'
CMD ["sh", "run.sh"]
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2023 Julius Marminge
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+7
View File
@@ -0,0 +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
+28
View File
@@ -0,0 +1,28 @@
# Create T3 App
This is a [T3 Stack](https://create.t3.gg/) project bootstrapped with `create-t3-app`.
## What's next? How do I make an app with this?
We try to keep this project as simple as possible, so you can start with just the scaffolding we set up for you, and add additional things later when they become necessary.
If you are not familiar with the different technologies used in this project, please refer to the respective docs. If you still are in the wind, please join our [Discord](https://t3.gg/discord) and ask for help.
- [Next.js](https://nextjs.org)
- [NextAuth.js](https://next-auth.js.org)
- [Drizzle](https://orm.drizzle.team)
- [Tailwind CSS](https://tailwindcss.com)
- [tRPC](https://trpc.io)
## Learn More
To learn more about the [T3 Stack](https://create.t3.gg/), take a look at the following resources:
- [Documentation](https://create.t3.gg/)
- [Learn the T3 Stack](https://create.t3.gg/en/faq#what-learning-resources-are-currently-available) — Check out these awesome tutorials
You can check out the [create-t3-app GitHub repository](https://github.com/t3-oss/create-t3-app) — your feedback and contributions are welcome!
## How do I deploy this?
Follow our deployment guides for [Vercel](https://create.t3.gg/en/deployment/vercel) and [Docker](https://create.t3.gg/en/deployment/docker) for more information.
+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,
];
+28
View File
@@ -0,0 +1,28 @@
// Importing env files here to validate on build
import "@homarr/auth/env.mjs";
import "./src/env.mjs";
/** @type {import("next").NextConfig} */
const config = {
output: "standalone",
reactStrictMode: true,
/** We already do linting and typechecking as separate tasks in CI */
eslint: { ignoreDuringBuilds: true },
typescript: { ignoreBuildErrors: true },
webpack: (config) => {
config.module.rules.push({
test: /\.node$/,
loader: "node-loader",
});
return config;
},
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"],
},
};
export default config;
+88
View File
@@ -0,0 +1,88 @@
{
"name": "@homarr/nextjs",
"version": "0.1.0",
"private": true,
"type": "module",
"scripts": {
"build": "pnpm with-env next build",
"clean": "git clean -xdf .next .turbo node_modules",
"dev": "pnpm with-env next dev",
"lint": "eslint",
"format": "prettier --check . --ignore-path ../../.gitignore",
"start": "pnpm with-env next start",
"typecheck": "tsc --noEmit",
"with-env": "dotenv -e ../../.env --"
},
"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/integrations": "workspace:^0.1.0",
"@homarr/log": "workspace:^",
"@homarr/modals": "workspace:^0.1.0",
"@homarr/notifications": "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.11.1",
"@mantine/core": "^7.11.1",
"@mantine/hooks": "^7.11.1",
"@mantine/modals": "^7.11.1",
"@mantine/tiptap": "^7.11.1",
"@homarr/server-settings": "workspace:^0.1.0",
"@t3-oss/env-nextjs": "^0.10.1",
"@tanstack/react-query": "^5.50.1",
"@tanstack/react-query-devtools": "^5.50.1",
"@tanstack/react-query-next-experimental": "5.50.1",
"@tabler/icons-react": "^3.9.0",
"@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",
"clsx": "^2.1.1",
"dayjs": "^1.11.11",
"dotenv": "^16.4.5",
"flag-icons": "^7.2.3",
"glob": "^10.4.3",
"jotai": "^2.8.4",
"mantine-react-table": "2.0.0-beta.5",
"next": "^14.2.4",
"postcss-preset-mantine": "^1.15.0",
"prismjs": "^1.29.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-error-boundary": "^4.0.13",
"react-simple-code-editor": "^0.14.1",
"sass": "^1.77.6",
"superjson": "2.2.1",
"use-deep-compare-effect": "^1.8.1"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0",
"@types/chroma-js": "2.4.4",
"@types/node": "^20.14.10",
"@types/prismjs": "^1.26.4",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
"concurrently": "^8.2.2",
"eslint": "^9.6.0",
"node-loader": "^2.0.0",
"prettier": "^3.3.2",
"typescript": "^5.5.3"
},
"prettier": "@homarr/prettier-config"
}
+14
View File
@@ -0,0 +1,14 @@
module.exports = {
plugins: {
"postcss-preset-mantine": {},
"postcss-simple-vars": {
variables: {
"mantine-breakpoint-xs": "36em",
"mantine-breakpoint-sm": "48em",
"mantine-breakpoint-md": "62em",
"mantine-breakpoint-lg": "75em",
"mantine-breakpoint-xl": "88em",
},
},
},
};
Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

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.3 KiB

@@ -0,0 +1,14 @@
import type { PropsWithChildren } from "react";
import { AppShellMain } from "@mantine/core";
import { MainHeader } from "~/components/layout/header";
import { ClientShell } from "~/components/layout/shell";
export default function MainLayout({ children }: PropsWithChildren) {
return (
<ClientShell hasNavigation={false}>
<MainHeader />
<AppShellMain>{children}</AppShellMain>
</ClientShell>
);
}
@@ -0,0 +1,9 @@
import { Stack, Title } from "@mantine/core";
export default function HomePage() {
return (
<Stack>
<Title>Home</Title>
</Stack>
);
}
@@ -0,0 +1,8 @@
"use client";
import type { PropsWithChildren } from "react";
import { Provider } from "jotai";
export const JotaiProvider = ({ children }: PropsWithChildren) => {
return <Provider>{children}</Provider>;
};
@@ -0,0 +1,12 @@
import type { PropsWithChildren } from "react";
import { defaultLocale } from "@homarr/translation";
import { I18nProviderClient } from "@homarr/translation/client";
export const NextInternationalProvider = ({ children, locale }: PropsWithChildren<{ locale: string }>) => {
return (
<I18nProviderClient locale={locale} fallback={defaultLocale}>
{children}
</I18nProviderClient>
);
};
@@ -0,0 +1,14 @@
"use client";
import type { PropsWithChildren } from "react";
import type { Session } from "@homarr/auth";
import { SessionProvider } from "@homarr/auth/client";
interface AuthProviderProps {
session: Session | null;
}
export const AuthProvider = ({ children, session }: PropsWithChildren<AuthProviderProps>) => {
return <SessionProvider session={session}>{children}</SessionProvider>;
};
@@ -0,0 +1,77 @@
"use client";
import type { PropsWithChildren } from "react";
import { useState } from "react";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
import { ReactQueryStreamedHydration } from "@tanstack/react-query-next-experimental";
import { createWSClient, loggerLink, unstable_httpBatchStreamLink, wsLink } from "@trpc/client";
import superjson from "superjson";
import type { AppRouter } from "@homarr/api";
import { clientApi } from "@homarr/api/client";
const wsClient = createWSClient({
url: "ws://localhost:3001",
});
export function TRPCReactProvider(props: PropsWithChildren) {
const [queryClient] = useState(
() =>
new QueryClient({
defaultOptions: {
queries: {
staleTime: 5 * 1000,
},
},
}),
);
const [trpcClient] = useState(() => {
return clientApi.createClient({
links: [
loggerLink({
enabled: (opts) =>
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({
transformer: superjson,
url: `${getBaseUrl()}/api/trpc`,
headers() {
const headers = new Headers();
headers.set("x-trpc-source", "nextjs-react");
return headers;
},
})(args)({ op, next });
};
},
],
});
});
return (
<clientApi.Provider client={trpcClient} queryClient={queryClient}>
<QueryClientProvider client={queryClient}>
<ReactQueryStreamedHydration transformer={superjson}>{props.children}</ReactQueryStreamedHydration>
<ReactQueryDevtools initialIsOpen={false} />
</QueryClientProvider>
</clientApi.Provider>
);
}
function getBaseUrl() {
if (typeof window !== "undefined") return window.location.origin;
if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}`;
return `http://localhost:${process.env.PORT ?? 3000}`;
}
@@ -0,0 +1,85 @@
"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 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")} />
<PasswordInput
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,66 @@
import { notFound } from "next/navigation";
import { Card, Center, Stack, Text, Title } from "@mantine/core";
import { auth } from "@homarr/auth/next";
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) {
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>
);
}
@@ -0,0 +1,78 @@
"use client";
import { 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 { signIn } from "@homarr/auth/client";
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 { revalidatePathActionAsync } from "~/app/revalidatePathAction";
export const LoginForm = () => {
const t = useScopedI18n("user");
const router = useRouter();
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState<string>();
const form = useZodForm(validation.user.signIn, {
initialValues: {
name: "",
password: "",
},
});
const handleSubmitAsync = async (values: z.infer<typeof validation.user.signIn>) => {
setIsLoading(true);
setError(undefined);
await signIn("credentials", {
...values,
redirect: false,
callbackUrl: "/",
})
.then(async (response) => {
if (!response?.ok || response.error) {
throw response?.error;
}
showSuccessNotification({
title: t("action.login.notification.success.title"),
message: t("action.login.notification.success.message"),
});
await revalidatePathActionAsync("/");
router.push("/");
})
.catch((error: Error | string) => {
setIsLoading(false);
setError(error.toString());
showErrorNotification({
title: t("action.login.notification.error.title"),
message: t("action.login.notification.error.message"),
});
});
};
return (
<Stack gap="xl">
<form onSubmit={form.onSubmit((values) => void handleSubmitAsync(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.label")}
</Button>
</Stack>
</form>
{error && (
<Alert icon={<IconAlertTriangle size={rem(16)} />} color="red">
{error}
</Alert>
)}
</Stack>
);
};
@@ -0,0 +1,29 @@
import { Card, Center, Stack, Text, Title } from "@mantine/core";
import { getScopedI18n } from "@homarr/translation/server";
import { HomarrLogoWithTitle } from "~/components/layout/logo/homarr-logo";
import { LoginForm } from "./_login-form";
export default async function Login() {
const t = await getScopedI18n("user.page.login");
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">
<LoginForm />
</Card>
</Stack>
</Center>
);
}
@@ -0,0 +1,9 @@
import { api } from "@homarr/api/server";
import { createBoardContentPage } from "../_creator";
export default createBoardContentPage<{ locale: string }>({
async getInitialBoardAsync() {
return await api.board.getHomeBoard();
},
});
@@ -0,0 +1,5 @@
import definition from "./_definition";
const { layout } = definition;
export default layout;
@@ -0,0 +1,7 @@
import definition from "./_definition";
const { generateMetadataAsync: generateMetadata, page } = definition;
export default page;
export { generateMetadata };
@@ -0,0 +1,9 @@
import { api } from "@homarr/api/server";
import { createBoardContentPage } from "../_creator";
export default createBoardContentPage<{ locale: string; name: string }>({
async getInitialBoardAsync({ name }) {
return await api.board.getBoardByName({ name });
},
});
@@ -0,0 +1,5 @@
import definition from "./_definition";
const { layout } = definition;
export default layout;
@@ -0,0 +1,7 @@
import definition from "./_definition";
const { generateMetadataAsync: generateMetadata, page } = definition;
export default page;
export { generateMetadata };
@@ -0,0 +1,107 @@
"use client";
import { useCallback, useEffect, useRef } from "react";
import { Box, LoadingOverlay, Stack } from "@mantine/core";
import type { RouterOutputs } from "@homarr/api";
import { clientApi } from "@homarr/api/client";
import { DDGridStack } from "@homarr/gridstack";
import { BoardCategorySection } from "~/components/board/sections/category-section";
import { BoardEmptySection } from "~/components/board/sections/empty-section";
import { BoardBackgroundVideo } from "~/components/layout/background";
import { fullHeightWithoutHeaderAndFooter } from "~/constants";
import { useIsBoardReady, useRequiredBoard } from "./_context";
let boardName: string | null = null;
export const updateBoardName = (name: string | null) => {
boardName = name;
};
type UpdateCallback = (prev: RouterOutputs["board"]["getHomeBoard"]) => RouterOutputs["board"]["getHomeBoard"];
export const useUpdateBoard = () => {
const utils = clientApi.useUtils();
const updateBoard = useCallback(
(updaterWithoutUndefined: UpdateCallback) => {
if (!boardName) {
throw new Error("Board name is not set");
}
utils.board.getBoardByName.setData({ name: boardName }, (previous) =>
previous ? updaterWithoutUndefined(previous) : previous,
);
},
[utils],
);
return {
updateBoard,
};
};
const dd = new DDGridStack();
export const ClientBoard = () => {
const board = useRequiredBoard();
const isReady = useIsBoardReady();
const { updateBoard } = useUpdateBoard();
const sortedSections = board.sections.sort((sectionA, sectionB) => sectionA.position - sectionB.position);
const ref = useRef<HTMLDivElement>(null);
const boxRef = useRef<HTMLDivElement>(null);
useEffect(() => {
if (!boxRef.current) return;
dd.droppable(boxRef.current, {
accept: () => true,
})
.on(boxRef.current, "dropover", (event, el, helper) => {
console.log("dropover", event, el, helper);
})
.on(boxRef.current, "dropout", (event, el, helper) => {
console.log("dropout", event, el, helper);
})
.on(boxRef.current, "drop", (event, el, helper) => {
console.log("drop", event, el, helper);
const itemId = el.getAttribute("data-id");
if (!itemId) return;
// Same as removeItem
updateBoard((previous) => {
return {
...previous,
// Filter removed item out of items array
sections: previous.sections.map((section) => ({
...section,
items: section.items.filter((item) => item.id !== itemId),
})),
};
});
});
}, []);
return (
<Box h="100%" pos="relative">
<BoardBackgroundVideo />
<LoadingOverlay
visible={!isReady}
transitionProps={{ duration: 500 }}
loaderProps={{ size: "lg" }}
h={fullHeightWithoutHeaderAndFooter}
/>
<Stack ref={ref} h="100%" style={{ visibility: isReady ? "visible" : "hidden" }}>
<Box ref={boxRef} w="100%" h={80} bg="red"></Box>
{sortedSections.map((section) =>
section.kind === "empty" ? (
<BoardEmptySection key={section.id} section={section} mainRef={ref} />
) : (
<BoardCategorySection key={section.id} section={section} mainRef={ref} />
),
)}
</Stack>
</Box>
);
};
@@ -0,0 +1,117 @@
"use client";
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";
import { clientApi } from "@homarr/api/client";
import { updateBoardName } from "./_client";
const BoardContext = createContext<{
board: RouterOutputs["board"]["getHomeBoard"];
isReady: boolean;
markAsReady: (id: string) => void;
isEditMode: boolean;
setEditMode: Dispatch<SetStateAction<boolean>>;
} | null>(null);
export const BoardProvider = ({
children,
initialBoard,
}: PropsWithChildren<{
initialBoard: RouterOutputs["board"]["getBoardByName"];
}>) => {
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,
refetchOnWindowFocus: false,
refetchOnReconnect: false,
},
);
// Update the board name so it can be used within updateBoard method
updateBoardName(initialBoard.name);
// Invalidate the board when the pathname changes
// This allows to refetch the board when it might have changed - e.g. if someone else added an item
useEffect(() => {
return () => {
setReadySections([]);
void utils.board.getBoardByName.invalidate({ name: initialBoard.name });
};
}, [pathname, utils, initialBoard.name]);
useEffect(() => {
setReadySections((previous) => previous.filter((id) => data.sections.some((section) => section.id === id)));
}, [data.sections.length, setReadySections]);
const markAsReady = useCallback((id: string) => {
setReadySections((previous) => (previous.includes(id) ? previous : [...previous, id]));
}, []);
return (
<BoardContext.Provider
value={{
board: data,
isReady: data.sections.length === readySections.length,
markAsReady,
isEditMode,
setEditMode,
}}
>
{children}
</BoardContext.Provider>
);
};
export const useMarkSectionAsReady = () => {
const context = useContext(BoardContext);
if (!context) {
throw new Error("Board is required");
}
return context.markAsReady;
};
export const useIsBoardReady = () => {
const context = useContext(BoardContext);
if (!context) {
throw new Error("Board is required");
}
return context.isReady;
};
export const useRequiredBoard = () => {
const optionalBoard = useOptionalBoard();
if (!optionalBoard) {
throw new Error("Board is required");
}
return optionalBoard;
};
export const useOptionalBoard = () => {
const context = useContext(BoardContext);
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;
};
@@ -0,0 +1,54 @@
import type { Metadata } from "next";
import { TRPCError } from "@trpc/server";
// Placed here because gridstack styles are used for board content
import "~/styles/gridstack.scss";
import { getI18n } from "@homarr/translation/server";
import { createMetaTitle } from "~/metadata";
import { createBoardLayout } from "../_layout-creator";
import type { Board } from "../_types";
import { ClientBoard } from "./_client";
import { BoardContentHeaderActions } from "./_header-actions";
export type Params = Record<string, unknown>;
interface Props<TParams extends Params> {
getInitialBoardAsync: (params: TParams) => Promise<Board>;
}
export const createBoardContentPage = <TParams extends Record<string, unknown>>({
getInitialBoardAsync: getInitialBoard,
}: Props<TParams>) => {
return {
layout: createBoardLayout({
headerActions: <BoardContentHeaderActions />,
getInitialBoardAsync: getInitialBoard,
isBoardContentPage: true,
}),
page: () => {
return <ClientBoard />;
},
generateMetadataAsync: async ({ params }: { params: TParams }): Promise<Metadata> => {
try {
const board = await getInitialBoard(params);
const t = await getI18n();
return {
title: board.metaTitle ?? createMetaTitle(t("board.content.metaTitle", { boardName: board.name })),
icons: {
icon: board.faviconImageUrl ? board.faviconImageUrl : undefined,
},
};
} catch (error) {
// Ignore not found errors and return empty metadata
if (error instanceof TRPCError && error.code === "NOT_FOUND") {
return {};
}
throw error;
}
},
};
};
@@ -0,0 +1,9 @@
"use client";
import { useRequiredBoard } from "./_context";
export const CustomCss = () => {
const board = useRequiredBoard();
return <style>{board.customCss}</style>;
};
@@ -0,0 +1,140 @@
"use client";
import { useCallback } from "react";
import { Group, Menu } from "@mantine/core";
import {
IconBox,
IconBoxAlignTop,
IconChevronDown,
IconPackageImport,
IconPencil,
IconPencilOff,
IconPlus,
IconSettings,
} from "@tabler/icons-react";
import { clientApi } from "@homarr/api/client";
import { useModalAction } from "@homarr/modals";
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
import { useI18n, useScopedI18n } from "@homarr/translation/client";
import { revalidatePathActionAsync } from "~/app/revalidatePathAction";
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 { HeaderButton } from "~/components/layout/header/button";
import { useEditMode, useRequiredBoard } from "./_context";
export const BoardContentHeaderActions = () => {
const [isEditMode] = useEditMode();
const board = useRequiredBoard();
const { hasChangeAccess } = useBoardPermissions(board);
if (!hasChangeAccess) {
return null; // Hide actions for user without access
}
return (
<>
{isEditMode && <AddMenu />}
<EditModeMenu />
<HeaderButton href={`/boards/${board.name}/settings`}>
<IconSettings stroke={1.5} />
</HeaderButton>
</>
);
};
const AddMenu = () => {
const { openModal: openCategoryEditModal } = useModalAction(CategoryEditModal);
const { openModal: openItemSelectModal } = useModalAction(ItemSelectModal);
const { addCategoryToEnd } = useCategoryActions();
const t = useI18n();
const handleAddCategory = useCallback(
() =>
openCategoryEditModal(
{
category: {
id: "new",
name: "",
},
onSuccess({ name }) {
addCategoryToEnd({ name });
},
submitLabel: t("section.category.create.submit"),
},
{
title: (t) => t("section.category.create.title"),
},
),
[addCategoryToEnd, openCategoryEditModal, t],
);
const handleSelectItem = useCallback(() => {
openItemSelectModal();
}, [openItemSelectModal]);
return (
<Menu position="bottom-end" withArrow>
<Menu.Target>
<HeaderButton w="auto" px={4}>
<Group gap={4} wrap="nowrap">
<IconPlus stroke={1.5} />
<IconChevronDown color="gray" size={16} />
</Group>
</HeaderButton>
</Menu.Target>
<Menu.Dropdown style={{ transform: "translate(-3px, 0)" }}>
<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}>
{t("section.category.action.create")}
</Menu.Item>
</Menu.Dropdown>
</Menu>
);
};
const EditModeMenu = () => {
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 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]);
return (
<HeaderButton onClick={toggle} loading={isPending}>
{isEditMode ? <IconPencilOff stroke={1.5} /> : <IconPencil stroke={1.5} />}
</HeaderButton>
);
};
@@ -0,0 +1,48 @@
"use client";
import type { PropsWithChildren } from "react";
import type { MantineColorsTuple } from "@mantine/core";
import { createTheme, darken, lighten, MantineProvider } from "@mantine/core";
import { useRequiredBoard } from "./_context";
export const BoardMantineProvider = ({ children }: PropsWithChildren) => {
const board = useRequiredBoard();
const theme = createTheme({
colors: {
primaryColor: generateColors(board.primaryColor),
secondaryColor: generateColors(board.secondaryColor),
},
primaryColor: "primaryColor",
autoContrast: true,
});
return <MantineProvider theme={theme}>{children}</MantineProvider>;
};
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 rgbaColors = lightnessForColors.map((lightness) => {
if (lightness < 0) {
return lighten(hex, -lightness);
}
return darken(hex, lightness);
});
return rgbaColors.map((color) => {
return (
"#" +
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
color
.split("(")[1]!
.replaceAll(" ", "")
.replace(")", "")
.split(",")
.map((color) => parseInt(color, 10))
.slice(0, 3)
.map((color) => color.toString(16).padStart(2, "0"))
.join("")
);
}) as unknown as MantineColorsTuple;
};
@@ -0,0 +1,12 @@
import { api } from "@homarr/api/server";
import { BoardOtherHeaderActions } from "../_header-actions";
import { createBoardLayout } from "../_layout-creator";
export default createBoardLayout<{ locale: string; name: string }>({
headerActions: <BoardOtherHeaderActions />,
async getInitialBoardAsync({ name }) {
return await api.board.getBoardByName({ name });
},
isBoardContentPage: false,
});
@@ -0,0 +1,101 @@
"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>
);
};
@@ -0,0 +1,109 @@
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>
);
};
@@ -0,0 +1,13 @@
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;
@@ -0,0 +1,116 @@
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}
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
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"];
@@ -0,0 +1,67 @@
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 handleSubmitAsync = 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 handleSubmitAsync(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"),
});
@@ -0,0 +1,57 @@
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>
);
};
@@ -0,0 +1,137 @@
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}
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
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;
}
@@ -0,0 +1,97 @@
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 handleSubmitAsync = 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 handleSubmitAsync(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>
);
};
@@ -0,0 +1,119 @@
"use client";
import { Button, Grid, Group, Stack, TextInput } from "@mantine/core";
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";
interface Props {
board: Board;
}
export const BackgroundSettingsContent = ({ board }: Props) => {
const t = useI18n();
const { mutate: savePartialSettings, isPending } = useSavePartialSettingsMutation(board);
const form = useZodForm(validation.board.savePartialSettings, {
initialValues: {
backgroundImageUrl: board.backgroundImageUrl ?? "",
backgroundImageAttachment: board.backgroundImageAttachment,
backgroundImageRepeat: board.backgroundImageRepeat,
backgroundImageSize: board.backgroundImageSize,
},
});
const backgroundImageAttachmentData = useBackgroundOptionData(
"backgroundImageAttachment",
backgroundImageAttachments,
);
const backgroundImageSizeData = useBackgroundOptionData("backgroundImageSize", backgroundImageSizes);
const backgroundImageRepeatData = useBackgroundOptionData("backgroundImageRepeat", backgroundImageRepeats);
return (
<form
onSubmit={form.onSubmit((values) => {
savePartialSettings({
id: board.id,
...values,
});
})}
>
<Stack>
<Grid>
<Grid.Col span={12}>
<TextInput
label={t("board.field.backgroundImageUrl.label")}
{...form.getInputProps("backgroundImageUrl")}
/>
</Grid.Col>
<Grid.Col span={12}>
<SelectWithDescriptionBadge
label={t("board.field.backgroundImageAttachment.label")}
data={backgroundImageAttachmentData}
{...form.getInputProps("backgroundImageAttachment")}
/>
</Grid.Col>
<Grid.Col span={12}>
<SelectWithDescriptionBadge
label={t("board.field.backgroundImageSize.label")}
data={backgroundImageSizeData}
{...form.getInputProps("backgroundImageSize")}
/>
</Grid.Col>
<Grid.Col span={12}>
<SelectWithDescriptionBadge
label={t("board.field.backgroundImageRepeat.label")}
data={backgroundImageRepeatData}
{...form.getInputProps("backgroundImageRepeat")}
/>
</Grid.Col>
</Grid>
<Group justify="end">
<Button type="submit" loading={isPending} color="teal">
{t("common.action.saveChanges")}
</Button>
</Group>
</Stack>
</form>
);
};
type BackgroundImageKey = "backgroundImageAttachment" | "backgroundImageSize" | "backgroundImageRepeat";
type inferOptions<TKey extends BackgroundImageKey> = TranslationObject["board"]["field"][TKey]["option"];
const useBackgroundOptionData = <
TKey extends BackgroundImageKey,
TOptions extends inferOptions<TKey> = inferOptions<TKey>,
>(
key: TKey,
data: {
values: (keyof TOptions)[];
defaultValue: keyof TOptions;
},
) => {
const t = useI18n();
return data.values.map(
(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),
value: value as string,
badge:
data.defaultValue === value
? {
color: "blue",
label: t("common.select.badge.recommended"),
}
: undefined,
}) satisfies SelectItemWithDescriptionBadge,
);
};
@@ -0,0 +1,152 @@
"use client";
import {
Anchor,
Button,
Collapse,
ColorInput,
ColorSwatch,
Grid,
Group,
InputWrapper,
isLightColor,
Slider,
Stack,
Text,
useMantineTheme,
} from "@mantine/core";
import { useDisclosure } from "@mantine/hooks";
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";
import { useSavePartialSettingsMutation } from "./_shared";
interface Props {
board: Board;
}
const hexRegex = /^#[0-9a-fA-F]{6}$/;
const progressPercentageLabel = (value: number) => `${value}%`;
export const ColorSettingsContent = ({ board }: Props) => {
const form = useZodForm(validation.board.savePartialSettings, {
initialValues: {
primaryColor: board.primaryColor,
secondaryColor: board.secondaryColor,
opacity: board.opacity,
},
});
const [showPreview, { toggle }] = useDisclosure(false);
const t = useI18n();
const theme = useMantineTheme();
const { mutate: savePartialSettings, isPending } = useSavePartialSettingsMutation(board);
return (
<form
onSubmit={form.onSubmit((values) => {
savePartialSettings({
id: board.id,
...values,
});
})}
>
<Stack>
<Grid>
<Grid.Col span={{ sm: 12, md: 6 }}>
<Stack gap="xs">
<ColorInput
label={t("board.field.primaryColor.label")}
format="hex"
swatches={Object.values(theme.colors).map((color) => color[6])}
{...form.getInputProps("primaryColor")}
/>
</Stack>
</Grid.Col>
<Grid.Col span={{ sm: 12, md: 6 }}>
<ColorInput
label={t("board.field.secondaryColor.label")}
format="hex"
swatches={Object.values(theme.colors).map((color) => color[6])}
{...form.getInputProps("secondaryColor")}
/>
</Grid.Col>
<Grid.Col span={12}>
<Anchor onClick={toggle}>{showPreview ? t("common.preview.hide") : t("common.preview.show")}</Anchor>
</Grid.Col>
<Grid.Col span={12}>
<Collapse in={showPreview}>
<Stack>
<ColorsPreview previewColor={form.values.primaryColor} />
<ColorsPreview previewColor={form.values.secondaryColor} />
</Stack>
</Collapse>
</Grid.Col>
<Grid.Col span={{ sm: 12, md: 6 }}>
<InputWrapper label={t("board.field.opacity.label")}>
<Slider
my={6}
min={0}
max={100}
step={5}
label={progressPercentageLabel}
{...form.getInputProps("opacity")}
/>
</InputWrapper>
</Grid.Col>
</Grid>
<Group justify="end">
<Button type="submit" loading={isPending} color="teal">
{t("common.action.saveChanges")}
</Button>
</Group>
</Stack>
</form>
);
};
interface ColorsPreviewProps {
previewColor: string | undefined;
}
const ColorsPreview = ({ previewColor }: ColorsPreviewProps) => {
const theme = useMantineTheme();
const colors = previewColor && hexRegex.test(previewColor) ? generateColors(previewColor) : generateColors("#000000");
return (
<Group gap={0} wrap="nowrap">
{colors.map((color, index) => (
<ColorSwatch
key={index}
color={color}
w="10%"
pb="10%"
c={isLightColor(color) ? "black" : "white"}
radius={0}
styles={{
colorOverlay: {
borderTopLeftRadius: index === 0 ? theme.radius.md : 0,
borderBottomLeftRadius: index === 0 ? theme.radius.md : 0,
borderTopRightRadius: index === 9 ? theme.radius.md : 0,
borderBottomRightRadius: index === 9 ? theme.radius.md : 0,
},
}}
>
<Stack align="center" gap={4}>
<Text visibleFrom="md" fw={500} size="lg">
{index}
</Text>
<Text visibleFrom="md" fw={500} size="xs" tt="uppercase">
{color}
</Text>
</Stack>
</ColorSwatch>
))}
</Group>
);
};
@@ -0,0 +1,91 @@
"use client";
import { Alert, Button, Group, Input, Stack } from "@mantine/core";
import { highlight, languages } from "prismjs";
import Editor from "react-simple-code-editor";
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>
);
};
@@ -0,0 +1,137 @@
"use client";
import { useCallback } from "react";
import { useRouter } from "next/navigation";
import { Button, Divider, Group, Stack, Text } from "@mantine/core";
import { clientApi } from "@homarr/api/client";
import { useConfirmModal, useModalAction } from "@homarr/modals";
import { useScopedI18n } from "@homarr/translation/client";
import { BoardRenameModal } from "~/components/board/modals/board-rename-modal";
import { useRequiredBoard } from "../../(content)/_context";
import classes from "./danger.module.css";
export const DangerZoneSettingsContent = () => {
const board = useRequiredBoard();
const t = useScopedI18n("board.setting");
const router = useRouter();
const { openConfirmModal } = useConfirmModal();
const { openModal } = useModalAction(BoardRenameModal);
const { mutate: changeVisibility, isPending: isChangeVisibilityPending } =
clientApi.board.changeBoardVisibility.useMutation();
const { mutate: deleteBoard, isPending: isDeletePending } = clientApi.board.deleteBoard.useMutation();
const utils = clientApi.useUtils();
const visibility = board.isPublic ? "public" : "private";
const onRenameClick = useCallback(
() =>
openModal({
id: board.id,
previousName: board.name,
onSuccess: (name) => router.push(`/boards/${name}/settings`),
}),
[board.id, board.name, router, openModal],
);
const onVisibilityClick = useCallback(() => {
openConfirmModal({
title: t(`section.dangerZone.action.visibility.confirm.${visibility}.title`),
children: t(`section.dangerZone.action.visibility.confirm.${visibility}.description`),
onConfirm: () => {
changeVisibility(
{
id: board.id,
visibility: visibility === "public" ? "private" : "public",
},
{
onSettled() {
void utils.board.getBoardByName.invalidate({ name: board.name });
void utils.board.getHomeBoard.invalidate();
},
},
);
},
});
}, [
board.id,
board.name,
changeVisibility,
t,
utils.board.getBoardByName,
utils.board.getHomeBoard,
visibility,
openConfirmModal,
]);
const onDeleteClick = useCallback(() => {
openConfirmModal({
title: t("section.dangerZone.action.delete.confirm.title"),
children: t("section.dangerZone.action.delete.confirm.description"),
onConfirm: () => {
deleteBoard(
{ id: board.id },
{
onSettled: () => {
router.push("/");
},
},
);
},
});
}, [board.id, deleteBoard, router, t, openConfirmModal]);
return (
<Stack gap="sm">
<Divider />
<DangerZoneRow
label={t("section.dangerZone.action.rename.label")}
description={t("section.dangerZone.action.rename.description")}
buttonText={t("section.dangerZone.action.rename.button")}
onClick={onRenameClick}
/>
<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}`)}
onClick={onVisibilityClick}
isPending={isChangeVisibilityPending}
/>
<Divider />
<DangerZoneRow
label={t("section.dangerZone.action.delete.label")}
description={t("section.dangerZone.action.delete.description")}
buttonText={t("section.dangerZone.action.delete.button")}
onClick={onDeleteClick}
isPending={isDeletePending}
/>
</Stack>
);
};
interface DangerZoneRowProps {
label: string;
description: string;
buttonText: string;
isPending?: boolean;
onClick: () => void;
}
const DangerZoneRow = ({ label, description, buttonText, onClick, isPending }: DangerZoneRowProps) => {
return (
<Group justify="space-between" px="md" className={classes.dangerZoneGroup}>
<Stack gap={0}>
<Text fw="bold" size="sm">
{label}
</Text>
<Text size="sm">{description}</Text>
</Stack>
<Group justify="end" w={{ base: "100%", xs: "auto" }}>
<Button variant="subtle" color="red" loading={isPending} onClick={onClick}>
{buttonText}
</Button>
</Group>
</Group>
);
};
@@ -0,0 +1,185 @@
"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 { IconAlertTriangle } from "@tabler/icons-react";
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";
interface Props {
board: Board;
}
export const GeneralSettingsContent = ({ board }: Props) => {
const t = useI18n();
const ref = useRef({
pageTitle: board.pageTitle,
logoImageUrl: board.logoImageUrl,
});
const { updateBoard } = useUpdateBoard();
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,
}));
},
},
);
const metaTitleStatus = useMetaTitlePreview(form.values.metaTitle);
const faviconStatus = useFaviconPreview(form.values.faviconImageUrl);
const logoStatus = useLogoPreview(form.values.logoImageUrl);
// Cleanup for not applied changes of the page title and logo image URL
useEffect(() => {
return () => {
updateBoard((previous) => ({
...previous,
pageTitle: ref.current.pageTitle,
logoImageUrl: ref.current.logoImageUrl,
}));
};
}, [updateBoard]);
return (
<form
onSubmit={form.onSubmit((values) => {
// Save the current values to the ref so that it does not reset if the form is submitted
ref.current = {
pageTitle: values.pageTitle,
logoImageUrl: values.logoImageUrl,
};
savePartialSettings({
id: board.id,
...values,
});
})}
>
<Stack>
<Grid>
<Grid.Col span={{ xs: 12, md: 6 }}>
<TextInput
label={t("board.field.pageTitle.label")}
placeholder="Homarr"
{...form.getInputProps("pageTitle")}
/>
</Grid.Col>
<Grid.Col span={{ xs: 12, md: 6 }}>
<TextInput
label={t("board.field.metaTitle.label")}
placeholder={createMetaTitle(t("board.content.metaTitle", { boardName: board.name }))}
rightSection={<PendingOrInvalidIndicator {...metaTitleStatus} />}
{...form.getInputProps("metaTitle")}
/>
</Grid.Col>
<Grid.Col span={{ xs: 12, md: 6 }}>
<TextInput
label={t("board.field.logoImageUrl.label")}
placeholder="/logo/logo.png"
rightSection={<PendingOrInvalidIndicator {...logoStatus} />}
{...form.getInputProps("logoImageUrl")}
/>
</Grid.Col>
<Grid.Col span={{ xs: 12, md: 6 }}>
<TextInput
label={t("board.field.faviconImageUrl.label")}
placeholder="/logo/logo.png"
rightSection={<PendingOrInvalidIndicator {...faviconStatus} />}
{...form.getInputProps("faviconImageUrl")}
/>
</Grid.Col>
</Grid>
<Group justify="end">
<Button type="submit" loading={isPending} color="teal">
{t("common.action.saveChanges")}
</Button>
</Group>
</Stack>
</form>
);
};
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")}>
<IconAlertTriangle size="1rem" color="red" />
</Tooltip>
);
}
if (isPending) {
return <Loader size="xs" />;
}
return null;
};
const useLogoPreview = (url: string | null) => {
const { updateBoard } = useUpdateBoard();
const [logoDebounced] = useDebouncedValue(url ?? "", 500);
useEffect(() => {
if (!logoDebounced.includes(".") && logoDebounced.length >= 1) return;
updateBoard((previous) => ({
...previous,
logoImageUrl: logoDebounced.length >= 1 ? logoDebounced : null,
}));
}, [logoDebounced, updateBoard]);
return {
isPending: (url ?? "") !== logoDebounced,
isInvalid: logoDebounced.length >= 1 && !logoDebounced.includes("."),
};
};
const useMetaTitlePreview = (title: string | null) => {
const [metaTitleDebounced] = useDebouncedValue(title ?? "", 200);
useDocumentTitle(metaTitleDebounced);
return {
isPending: (title ?? "") !== metaTitleDebounced,
};
};
const validFaviconExtensions = ["ico", "png", "svg", "gif"];
const isValidUrl = (url: string) =>
url.includes("/") && validFaviconExtensions.some((extension) => url.endsWith(`.${extension}`));
const useFaviconPreview = (url: string | null) => {
const [faviconDebounced] = useDebouncedValue(url ?? "", 500);
useFavicon(isValidUrl(faviconDebounced) ? faviconDebounced : "");
return {
isPending: (url ?? "") !== faviconDebounced,
isInvalid: faviconDebounced.length >= 1 && !isValidUrl(faviconDebounced),
};
};
@@ -0,0 +1,49 @@
"use client";
import { Button, Grid, Group, Input, Slider, Stack } from "@mantine/core";
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";
interface Props {
board: Board;
}
export const LayoutSettingsContent = ({ board }: Props) => {
const t = useI18n();
const { mutate: savePartialSettings, isPending } = useSavePartialSettingsMutation(board);
const form = useZodForm(validation.board.savePartialSettings.pick({ columnCount: true }).required(), {
initialValues: {
columnCount: board.columnCount,
},
});
return (
<form
onSubmit={form.onSubmit((values) => {
savePartialSettings({
id: board.id,
...values,
});
})}
>
<Stack>
<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")} />
</Input.Wrapper>
</Grid.Col>
</Grid>
<Group justify="end">
<Button type="submit" loading={isPending} color="teal">
{t("common.action.saveChanges")}
</Button>
</Group>
</Stack>
</form>
);
};
@@ -0,0 +1,13 @@
import { clientApi } from "@homarr/api/client";
import type { Board } from "../../_types";
export const useSavePartialSettingsMutation = (board: Board) => {
const utils = clientApi.useUtils();
return clientApi.board.savePartialBoardSettings.useMutation({
onSettled() {
void utils.board.getBoardByName.invalidate({ name: board.name });
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));
}
@@ -0,0 +1,5 @@
@media (min-width: 36em) {
.dangerZoneGroup {
--group-wrap: nowrap !important;
}
}
@@ -0,0 +1,138 @@
import type { PropsWithChildren } from "react";
import { notFound } from "next/navigation";
import { AccordionControl, AccordionItem, AccordionPanel, Container, Stack, Text, Title } from "@mantine/core";
import {
IconAlertTriangle,
IconBrush,
IconFileTypeCss,
IconLayout,
IconPhoto,
IconSettings,
IconUser,
} from "@tabler/icons-react";
import { TRPCError } from "@trpc/server";
import { api } from "@homarr/api/server";
import { capitalize } from "@homarr/common";
import type { TranslationObject } from "@homarr/translation";
import { getScopedI18n } from "@homarr/translation/server";
import type { TablerIcon } from "@homarr/ui";
import { getBoardPermissionsAsync } from "~/components/board/permissions/server";
import { ActiveTabAccordion } from "../../../../../components/active-tab-accordion";
import { AccessSettingsContent } from "./_access";
import { BackgroundSettingsContent } from "./_background";
import { ColorSettingsContent } from "./_colors";
import { CustomCssSettingsContent } from "./_customCss";
import { DangerZoneSettingsContent } from "./_danger";
import { GeneralSettingsContent } from "./_general";
import { LayoutSettingsContent } from "./_layout";
interface Props {
params: {
name: string;
};
searchParams: {
tab?: keyof TranslationObject["board"]["setting"]["section"];
};
}
const getBoardAndPermissionsAsync = async (params: Props["params"]) => {
try {
const board = await api.board.getBoardByName({ name: params.name });
const { hasFullAccess } = await getBoardPermissionsAsync(board);
const permissions = hasFullAccess
? await api.board.getBoardPermissions({ id: board.id })
: {
userPermissions: [],
groupPermissions: [],
inherited: [],
};
return { board, permissions };
} catch (error) {
// Ignore not found errors and redirect to 404
// error is already logged in _layout-creator.tsx
if (error instanceof TRPCError && error.code === "NOT_FOUND") {
notFound();
}
throw error;
}
};
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"}>
<AccordionItemFor value="general" icon={IconSettings}>
<GeneralSettingsContent board={board} />
</AccordionItemFor>
<AccordionItemFor value="layout" icon={IconLayout}>
<LayoutSettingsContent board={board} />
</AccordionItemFor>
<AccordionItemFor value="background" icon={IconPhoto}>
<BackgroundSettingsContent board={board} />
</AccordionItemFor>
<AccordionItemFor value="color" icon={IconBrush}>
<ColorSettingsContent board={board} />
</AccordionItemFor>
<AccordionItemFor value="customCss" icon={IconFileTypeCss}>
<CustomCssSettingsContent board={board} />
</AccordionItemFor>
{hasFullAccess && (
<>
<AccordionItemFor value="access" icon={IconUser}>
<AccessSettingsContent board={board} initialPermissions={permissions} />
</AccordionItemFor>
<AccordionItemFor value="dangerZone" icon={IconAlertTriangle} danger noPadding>
<DangerZoneSettingsContent />
</AccordionItemFor>
</>
)}
</ActiveTabAccordion>
</Stack>
</Container>
);
}
type AccordionItemForProps = PropsWithChildren<{
value: keyof TranslationObject["board"]["setting"]["section"];
icon: TablerIcon;
danger?: boolean;
noPadding?: boolean;
}>;
const AccordionItemFor = async ({ value, children, icon: Icon, danger, noPadding }: AccordionItemForProps) => {
const t = await getScopedI18n("board.setting.section");
return (
<AccordionItem
value={value}
styles={
danger
? {
item: {
"--__item-border-color": "rgba(248,81,73,0.4)",
borderWidth: 4,
},
}
: undefined
}
>
<AccordionControl icon={<Icon />}>
<Text fw="bold" size="lg">
{t(`${value}.title`)}
</Text>
</AccordionControl>
<AccordionPanel styles={noPadding ? { content: { paddingRight: 0, paddingLeft: 0 } } : undefined}>
{children}
</AccordionPanel>
</AccordionItem>
);
};
@@ -0,0 +1,16 @@
"use client";
import { IconLayoutBoard } from "@tabler/icons-react";
import { HeaderButton } from "~/components/layout/header/button";
import { useRequiredBoard } from "./(content)/_context";
export const BoardOtherHeaderActions = () => {
const board = useRequiredBoard();
return (
<HeaderButton href={`/boards/${board.name}`}>
<IconLayoutBoard stroke={1.5} />
</HeaderButton>
);
};
@@ -0,0 +1,64 @@
import type { PropsWithChildren } from "react";
import { notFound } from "next/navigation";
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";
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;
getInitialBoardAsync: (params: TParams) => Promise<Board>;
isBoardContentPage: boolean;
}
export const createBoardLayout = <TParams extends Params>({
headerActions,
getInitialBoardAsync: getInitialBoard,
isBoardContentPage,
}: CreateBoardLayoutProps<TParams>) => {
const Layout = async ({
params,
children,
}: PropsWithChildren<{
params: TParams;
}>) => {
const initialBoard = await getInitialBoard(params).catch((error) => {
if (error instanceof TRPCError && error.code === "NOT_FOUND") {
logger.warn(error);
notFound();
}
throw error;
});
return (
<GlobalItemServerDataRunner board={initialBoard} shouldRun={isBoardContentPage}>
<BoardProvider initialBoard={initialBoard}>
<BoardMantineProvider>
<CustomCss />
<ClientShell hasNavigation={false}>
<MainHeader
logo={<BoardLogoWithTitle size="md" hideTitleOnMobile />}
actions={headerActions}
hasNavigation={false}
/>
<AppShellMain>{children}</AppShellMain>
</ClientShell>
</BoardMantineProvider>
</BoardProvider>
</GlobalItemServerDataRunner>
);
};
return Layout;
};
@@ -0,0 +1,11 @@
import type { RouterOutputs } from "@homarr/api";
import type { WidgetKind } from "@homarr/definitions";
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 ItemOfKind<TKind extends WidgetKind> = Extract<Item, { kind: TKind }>;
+15
View File
@@ -0,0 +1,15 @@
import React from "react";
type PropsWithChildren = Required<React.PropsWithChildren>;
export const composeWrappers = (
wrappers: React.FunctionComponent<PropsWithChildren>[],
): React.FunctionComponent<PropsWithChildren> => {
return wrappers.reverse().reduce((Acc, Current): React.FunctionComponent<PropsWithChildren> => {
return (props) => (
<Current>
<Acc {...props} />
</Current>
);
});
};
@@ -0,0 +1,64 @@
"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 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 = useZodForm(validation.user.init, {
initialValues: {
username: "",
password: "",
confirmPassword: "",
},
});
const handleSubmitAsync = async (values: FormType) => {
await mutateAsync(values, {
onSuccess: () => {
showSuccessNotification({
title: "User created",
message: "You can now log in",
});
router.push("/auth/login");
},
onError: () => {
showErrorNotification({
title: "User creation failed",
message: error?.message ?? "Unknown error",
});
},
});
};
return (
<Stack gap="xl">
<form
onSubmit={form.onSubmit(
(values) => void handleSubmitAsync(values),
(err) => console.log(err),
)}
>
<Stack gap="lg">
<TextInput label={t("field.username.label")} {...form.getInputProps("username")} />
<PasswordInput label={t("field.password.label")} {...form.getInputProps("password")} />
<PasswordInput label={t("field.passwordConfirm.label")} {...form.getInputProps("confirmPassword")} />
<Button type="submit" fullWidth loading={isPending}>
{t("action.create")}
</Button>
</Stack>
</form>
</Stack>
);
};
type FormType = z.infer<typeof validation.user.init>;
@@ -0,0 +1,41 @@
import { notFound } from "next/navigation";
import { Card, Center, Stack, Text, Title } from "@mantine/core";
import { db } from "@homarr/db";
import { getScopedI18n } from "@homarr/translation/server";
import { HomarrLogoWithTitle } from "~/components/layout/logo/homarr-logo";
import { InitUserForm } from "./_init-user-form";
export default async function InitUser() {
const firstUser = await db.query.users.findFirst({
columns: {
id: true,
},
});
if (firstUser) {
notFound();
}
const t = await getScopedI18n("user.page.init");
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">
<InitUserForm />
</Card>
</Stack>
</Center>
);
}
+90
View File
@@ -0,0 +1,90 @@
import type { Metadata, Viewport } from "next";
import { Inter } from "next/font/google";
import "@homarr/ui/styles.css";
import "@homarr/notifications/styles.css";
import "@homarr/spotlight/styles.css";
import { ColorSchemeScript, createTheme, MantineProvider } from "@mantine/core";
import { auth } from "@homarr/auth/next";
import { ModalProvider } from "@homarr/modals";
import { Notifications } from "@homarr/notifications";
import { Analytics } from "~/components/layout/analytics";
import { JotaiProvider } from "./_client-providers/jotai";
import { NextInternationalProvider } from "./_client-providers/next-international";
import { AuthProvider } from "./_client-providers/session";
import { TRPCReactProvider } from "./_client-providers/trpc";
import { composeWrappers } from "./compose";
const fontSans = Inter({
subsets: ["latin"],
variable: "--font-sans",
});
export const metadata: Metadata = {
metadataBase: new URL("http://localhost:3000"),
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.",
openGraph: {
title: "Homarr Dashboard",
description:
"Simplify the management of your server with Homarr - a sleek, modern dashboard that puts all of your apps and services at your fingertips.",
url: "https://homarr.dev",
siteName: "Homarr Documentation",
},
twitter: {
card: "summary_large_image",
site: "@jullerino",
creator: "@jullerino",
},
};
export const viewport: Viewport = {
themeColor: [
{ media: "(prefers-color-scheme: light)", color: "white" },
{ media: "(prefers-color-scheme: dark)", color: "black" },
],
};
export default function Layout(props: { children: React.ReactNode; params: { locale: string } }) {
const colorScheme = "dark";
const StackedProvider = composeWrappers([
async (innerProps) => {
const session = await auth();
return <AuthProvider session={session} {...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) => <ModalProvider {...innerProps} />,
]);
return (
<html lang="en" suppressHydrationWarning>
<head>
<ColorSchemeScript defaultColorScheme={colorScheme} />
<Analytics />
</head>
<body className={["font-sans", fontSans.variable].join(" ")}>
<StackedProvider>
<Notifications />
{props.children}
</StackedProvider>
</body>
</html>
);
}
+9
View File
@@ -0,0 +1,9 @@
import { Center, Loader } from "@mantine/core";
export default function CommonLoading() {
return (
<Center h="100vh">
<Loader />
</Center>
);
}
@@ -0,0 +1,5 @@
import { notFound } from "next/navigation";
export default function NotFound() {
return notFound();
}
Loaded 100 of 667 files, more files were not shown because too many files have changed in this diff. Show more