From 350135b56e9e633ab2c20d7530e72aa18decd9da Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Wed, 19 Mar 2025 10:15:59 -0400 Subject: [PATCH 1/9] update packages --- bun.lock | 133 ---------------------- yarn.lock | 334 ++++-------------------------------------------------- 2 files changed, 23 insertions(+), 444 deletions(-) diff --git a/bun.lock b/bun.lock index cb82852215..a78c8ac5c8 100644 --- a/bun.lock +++ b/bun.lock @@ -137,43 +137,6 @@ "typescript": "^5.7.3", }, }, - "apps/web": { - "name": "web", - "version": "0.1.0", - "dependencies": { - "@next/third-parties": "^15.1.7", - "@t3-oss/env-nextjs": "^0.11.1", - "@tailwindcss/postcss": "^4.0.13", - "@trigger.dev/sdk": "^3.3.15", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "framer-motion": "^11.18.2", - "ky": "^1.7.5", - "lucide-react": "^0.469.0", - "motion": "^11.18.2", - "next": "^15.2.0", - "next-turnstile": "^1.0.2", - "posthog-js": "^1.217.2", - "posthog-node": "^4.5.2", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-wrap-balancer": "^1.1.1", - "resend": "^4.1.2", - "tailwind-merge": "^2.6.0", - "tailwindcss-animate": "^1.0.7", - "uuid": "^11.0.5", - }, - "devDependencies": { - "@bubba/analytics": "workspace:*", - "@trigger.dev/build": "^3.3.15", - "@types/node": "^22.13.2", - "@types/react": "^19.0.8", - "@types/react-dom": "^19.0.3", - "postcss": "^8.5.3", - "tailwindcss": "^4.0.13", - "typescript": "^5.7.3", - }, - }, "packages/analytics": { "name": "@bubba/analytics", "version": "1.0.0", @@ -769,8 +732,6 @@ "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.2.2", "", { "os": "win32", "cpu": "x64" }, "sha512-52nWy65S/R6/kejz3jpvHAjZDPKIbEQu4x9jDBzmB9jJfuOy5rspjKu4u77+fI4M/WzLXrrQd57hlFGzz1ubcQ=="], - "@next/third-parties": ["@next/third-parties@15.2.1", "", { "dependencies": { "third-party-capital": "1.0.20" }, "peerDependencies": { "next": "^13.0.0 || ^14.0.0 || ^15.0.0", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0" } }, "sha512-XIOqG5NptLoH7MUBuxZP58DMjgX/XeDhY2UTcLHjMMMXfvu2kckGOUYFfoueWzkLmmfKbj7e8nq03pkcN6vXUA=="], - "@noble/ciphers": ["@noble/ciphers@0.6.0", "", {}, "sha512-mIbq/R9QXk5/cTfESb1OKtyFnk7oc1Om/8onA1158K9/OZUQFDEVy55jVTato+xmp3XX6F6Qh0zz0Nc1AxAlRQ=="], "@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], @@ -1227,38 +1188,6 @@ "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], - "@t3-oss/env-core": ["@t3-oss/env-core@0.11.1", "", { "peerDependencies": { "typescript": ">=5.0.0", "zod": "^3.0.0" }, "optionalPeers": ["typescript"] }, "sha512-MaxOwEoG1ntCFoKJsS7nqwgcxLW1SJw238AJwfJeaz3P/8GtkxXZsPPolsz1AdYvUTbe3XvqZ/VCdfjt+3zmKw=="], - - "@t3-oss/env-nextjs": ["@t3-oss/env-nextjs@0.11.1", "", { "dependencies": { "@t3-oss/env-core": "0.11.1" }, "peerDependencies": { "typescript": ">=5.0.0", "zod": "^3.0.0" }, "optionalPeers": ["typescript"] }, "sha512-rx2XL9+v6wtOqLNJbD5eD8OezKlQD1BtC0WvvtHwBgK66jnF5+wGqtgkKK4Ygie1LVmoDClths2T4tdFmRvGrQ=="], - - "@tailwindcss/node": ["@tailwindcss/node@4.0.13", "", { "dependencies": { "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "tailwindcss": "4.0.13" } }, "sha512-P9TmtE9Vew0vv5FwyD4bsg/dHHsIsAuUXkenuGUc5gm8fYgaxpdoxIKngCyEMEQxyCKR8PQY5V5VrrKNOx7exg=="], - - "@tailwindcss/oxide": ["@tailwindcss/oxide@4.0.13", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.0.13", "@tailwindcss/oxide-darwin-arm64": "4.0.13", "@tailwindcss/oxide-darwin-x64": "4.0.13", "@tailwindcss/oxide-freebsd-x64": "4.0.13", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.13", "@tailwindcss/oxide-linux-arm64-gnu": "4.0.13", "@tailwindcss/oxide-linux-arm64-musl": "4.0.13", "@tailwindcss/oxide-linux-x64-gnu": "4.0.13", "@tailwindcss/oxide-linux-x64-musl": "4.0.13", "@tailwindcss/oxide-win32-arm64-msvc": "4.0.13", "@tailwindcss/oxide-win32-x64-msvc": "4.0.13" } }, "sha512-pTH3Ex5zAWC9LbS+WsYAFmkXQW3NRjmvxkKJY3NP1x0KHBWjz0Q2uGtdGMJzsa0EwoZ7wq9RTbMH1UNPceCpWw=="], - - "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.0.13", "", { "os": "android", "cpu": "arm64" }, "sha512-+9zmwaPQ8A9ycDcdb+hRkMn6NzsmZ4YJBsW5Xqq5EdOu9xlIgmuMuJauVzDPB5BSbIWfhPdZ+le8NeRZpl1coA=="], - - "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.0.13", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Bj1QGlEJSjs/205CIRfb5/jeveOqzJ4pFMdRxu0gyiYWxBRyxsExXqaD+7162wnLP/EDKh6S1MC9E/1GwEhLtA=="], - - "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.0.13", "", { "os": "darwin", "cpu": "x64" }, "sha512-lRTkxjTpMGXhLLM5GjZ0MtjPczMuhAo9j7PeSsaU6Imkm7W7RbrXfT8aP934kS7cBBV+HKN5U19Z0WWaORfb8Q=="], - - "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.0.13", "", { "os": "freebsd", "cpu": "x64" }, "sha512-p/YLyKhs+xFibVeAPlpMGDVMKgjChgzs12VnDFaaqRSJoOz+uJgRSKiir2tn50e7Nm4YYw35q/DRBwpDBNo1MQ=="], - - "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.0.13", "", { "os": "linux", "cpu": "arm" }, "sha512-Ua/5ydE/QOTX8jHuc7M9ICWnaLi6K2MV/r+Ws2OppsOjy8tdlPbqYainJJ6Kl7ofm524K+4Fk9CQITPzeIESPw=="], - - "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.0.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-/W1+Q6tBAVgZWh/bhfOHo4n7Ryh6E7zYj4bJd9SRbkPyLtRioyK3bi6RLuDj57sa7Amk/DeomSV9iycS0xqIPA=="], - - "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.0.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-GQj6TWevNxwsYw20FdT2r2d1f7uiRsF07iFvNYxPIvIyPEV74eZ0zgFEsAH1daK1OxPy+LXdZ4grV17P5tVzhQ=="], - - "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.0.13", "", { "os": "linux", "cpu": "x64" }, "sha512-sQRH09faifF9w9WS6TKDWr1oLi4hoPx0EIWXZHQK/jcjarDpXGQ2DbF0KnALJCwWBxOIP/1nrmU01fZwwMzY3g=="], - - "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.0.13", "", { "os": "linux", "cpu": "x64" }, "sha512-Or1N8DIF3tP+LsloJp+UXLTIMMHMUcWXFhJLCsM4T7MzFzxkeReewRWXfk5mk137cdqVeUEH/R50xAhY1mOkTQ=="], - - "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.0.13", "", { "os": "win32", "cpu": "arm64" }, "sha512-u2mQyqCFrr9vVTP6sfDRfGE6bhOX3/7rInehzxNhHX1HYRIx09H3sDdXzTxnZWKOjIg3qjFTCrYFUZckva5PIg=="], - - "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.0.13", "", { "os": "win32", "cpu": "x64" }, "sha512-sOEc4iCanp1Yqyeu9suQcEzfaUcHnqjBUgDg0ZXpjUMUwdSi37S1lu1RGoV1BYInvvGu3y3HHTmvsSfDhx2L8w=="], - - "@tailwindcss/postcss": ["@tailwindcss/postcss@4.0.13", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.0.13", "@tailwindcss/oxide": "4.0.13", "lightningcss": "1.29.2", "postcss": "^8.4.41", "tailwindcss": "4.0.13" } }, "sha512-zTmnPGDYb2HKClTBTBwB+lLQH+Rq4etnQXFXs2lisRyXryUnoJIBByFTljkaK9F1d7o14h6t4NJIlfbZuOHR+A=="], - "@tailwindcss/typography": ["@tailwindcss/typography@0.5.16", "", { "dependencies": { "lodash.castarray": "^4.4.0", "lodash.isplainobject": "^4.0.6", "lodash.merge": "^4.6.2", "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA=="], "@tanstack/query-core": ["@tanstack/query-core@4.36.1", "", {}, "sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA=="], @@ -2009,8 +1938,6 @@ "engine.io-parser": ["engine.io-parser@5.2.3", "", {}, "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q=="], - "enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="], - "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], "es-abstract": ["es-abstract@1.23.9", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.3", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.0", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-regex": "^1.2.1", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.0", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.18" } }, "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA=="], @@ -2473,28 +2400,6 @@ "leac": ["leac@0.6.0", "", {}, "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg=="], - "lightningcss": ["lightningcss@1.29.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.29.2", "lightningcss-darwin-x64": "1.29.2", "lightningcss-freebsd-x64": "1.29.2", "lightningcss-linux-arm-gnueabihf": "1.29.2", "lightningcss-linux-arm64-gnu": "1.29.2", "lightningcss-linux-arm64-musl": "1.29.2", "lightningcss-linux-x64-gnu": "1.29.2", "lightningcss-linux-x64-musl": "1.29.2", "lightningcss-win32-arm64-msvc": "1.29.2", "lightningcss-win32-x64-msvc": "1.29.2" } }, "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA=="], - - "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.29.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA=="], - - "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.29.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w=="], - - "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.29.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg=="], - - "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.29.2", "", { "os": "linux", "cpu": "arm" }, "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg=="], - - "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.29.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ=="], - - "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.29.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ=="], - - "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.29.2", "", { "os": "linux", "cpu": "x64" }, "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg=="], - - "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.29.2", "", { "os": "linux", "cpu": "x64" }, "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w=="], - - "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.29.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw=="], - - "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.29.2", "", { "os": "win32", "cpu": "x64" }, "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA=="], - "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], @@ -2687,8 +2592,6 @@ "module-details-from-path": ["module-details-from-path@1.0.3", "", {}, "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A=="], - "motion": ["motion@11.18.2", "", { "dependencies": { "framer-motion": "^11.18.2", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-JLjvFDuFr42NFtcVoMAyC2sEjnpA8xpy6qWPyzQvCloznAyQ8FIXioxWfHiLtgYhoVpfUqSWpn1h9++skj9+Wg=="], - "motion-dom": ["motion-dom@12.5.0", "", { "dependencies": { "motion-utils": "^12.5.0" } }, "sha512-uH2PETDh7m+Hjd1UQQ56yHqwn83SAwNjimNPE/kC+Kds0t4Yh7+29rfo5wezVFpPOv57U4IuWved5d1x0kNhbQ=="], "motion-utils": ["motion-utils@12.5.0", "", {}, "sha512-+hFFzvimn0sBMP9iPxBa9OtRX35ZQ3py0UHnb8U29VD+d8lQ8zH3dTygJWqK7av2v6yhg7scj9iZuvTS0f4+SA=="], @@ -2723,8 +2626,6 @@ "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="], - "next-turnstile": ["next-turnstile@1.0.2", "", { "peerDependencies": { "next": ">=12", "react": ">=16", "react-dom": ">=16" } }, "sha512-PdCDkMQgJLGeTJpBz/cmmsKcysI0z+eN8uYab/8HuxWQ3i3NbhAfufE/Gw3ubXEd/xDezve/eVp+QBX3T7shOQ=="], - "node-addon-api": ["node-addon-api@8.3.1", "", {}, "sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA=="], "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], @@ -3075,8 +2976,6 @@ "react-use-draggable-scroll": ["react-use-draggable-scroll@0.4.7", "", { "peerDependencies": { "react": ">=16" } }, "sha512-6gCxGPO9WV5dIsBaDrgUKBaac8CY07PkygcArfajijYSNDwAq0girDRjaBuF1+lRqQryoLFQfpVaV2u/Yh6CrQ=="], - "react-wrap-balancer": ["react-wrap-balancer@1.1.1", "", { "peerDependencies": { "react": ">=16.8.0 || ^17.0.0 || ^18" } }, "sha512-AB+l7FPRWl6uZ28VcJ8skkwLn2+UC62bjiw8tQUrZPlEWDVnR9MG0lghyn7EyxuJSsFEpht4G+yh2WikEqQ/5Q=="], - "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="], "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], @@ -3333,8 +3232,6 @@ "tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="], - "tapable": ["tapable@2.2.1", "", {}, "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="], - "tar": ["tar@2.2.2", "", { "dependencies": { "block-stream": "*", "fstream": "^1.0.12", "inherits": "2" } }, "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA=="], "tar-fs": ["tar-fs@3.0.8", "", { "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { "bare-fs": "^4.0.1", "bare-path": "^3.0.0" } }, "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg=="], @@ -3349,8 +3246,6 @@ "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], - "third-party-capital": ["third-party-capital@1.0.20", "", {}, "sha512-oB7yIimd8SuGptespDAZnNkzIz+NWaJCu2RMsbs4Wmp9zSDUM8Nhi3s2OOcqYuv3mN4hitXc8DVx+LyUmbUDiA=="], - "throttleit": ["throttleit@2.1.0", "", {}, "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw=="], "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], @@ -3525,8 +3420,6 @@ "wcwidth": ["wcwidth@1.0.1", "", { "dependencies": { "defaults": "^1.0.3" } }, "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg=="], - "web": ["web@workspace:apps/web"], - "web-streams-polyfill": ["web-streams-polyfill@4.0.0-beta.3", "", {}, "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug=="], "web-vitals": ["web-vitals@4.2.4", "", {}, "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw=="], @@ -3725,12 +3618,6 @@ "@smithy/middleware-retry/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - "@tailwindcss/node/jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], - - "@tailwindcss/node/tailwindcss": ["tailwindcss@4.0.13", "", {}, "sha512-gbvFrB0fOsTv/OugXWi2PtflJ4S6/ctu6Mmn3bCftmLY/6xRsQVEJPgIIpABwpZ52DpONkCA3bEj5b54MHxF2Q=="], - - "@tailwindcss/postcss/tailwindcss": ["tailwindcss@4.0.13", "", {}, "sha512-gbvFrB0fOsTv/OugXWi2PtflJ4S6/ctu6Mmn3bCftmLY/6xRsQVEJPgIIpABwpZ52DpONkCA3bEj5b54MHxF2Q=="], - "@tanstack/react-query/@tanstack/query-core": ["@tanstack/query-core@5.68.0", "", {}, "sha512-r8rFYYo8/sY/LNaOqX84h12w7EQev4abFXDWy4UoDVUJzJ5d9Fbmb8ayTi7ScG+V0ap44SF3vNs/45mkzDGyGw=="], "@trigger.dev/core/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.52.1", "", { "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@types/shimmer": "^1.0.2", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw=="], @@ -3907,8 +3794,6 @@ "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], - "motion/framer-motion": ["framer-motion@11.18.2", "", { "dependencies": { "motion-dom": "^11.18.1", "motion-utils": "^11.18.1", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w=="], - "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], "next-auth/@auth/core": ["@auth/core@0.37.2", "", { "dependencies": { "@panva/hkdf": "^1.2.1", "@types/cookie": "0.6.0", "cookie": "0.7.1", "jose": "^5.9.3", "oauth4webapi": "^3.0.0", "preact": "10.11.3", "preact-render-to-string": "5.2.3" }, "peerDependencies": { "@simplewebauthn/browser": "^9.0.1", "@simplewebauthn/server": "^9.0.2", "nodemailer": "^6.8.0" }, "optionalPeers": ["@simplewebauthn/browser", "@simplewebauthn/server", "nodemailer"] }, "sha512-kUvzyvkcd6h1vpeMAojK2y7+PAV5H+0Cc9+ZlKYDFhDY31AlvsB+GW5vNO4qE3Y07KeQgvNO9U0QUx/fN62kBw=="], @@ -4017,16 +3902,6 @@ "verror/core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="], - "web/framer-motion": ["framer-motion@11.18.2", "", { "dependencies": { "motion-dom": "^11.18.1", "motion-utils": "^11.18.1", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w=="], - - "web/lucide-react": ["lucide-react@0.469.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-28vvUnnKQ/dBwiCQtwJw7QauYnE7yd2Cyp4tTTJpvglX4EMpbflcdBgrgToX2j71B3YvugK/NH3BGUk+E/p/Fw=="], - - "web/tailwind-merge": ["tailwind-merge@2.6.0", "", {}, "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA=="], - - "web/tailwindcss": ["tailwindcss@4.0.13", "", {}, "sha512-gbvFrB0fOsTv/OugXWi2PtflJ4S6/ctu6Mmn3bCftmLY/6xRsQVEJPgIIpABwpZ52DpONkCA3bEj5b54MHxF2Q=="], - - "web/typescript": ["typescript@5.8.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ=="], - "whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], "write-file-atomic/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], @@ -4199,10 +4074,6 @@ "languine/@trigger.dev/sdk/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - "motion/framer-motion/motion-dom": ["motion-dom@11.18.1", "", { "dependencies": { "motion-utils": "^11.18.1" } }, "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw=="], - - "motion/framer-motion/motion-utils": ["motion-utils@11.18.1", "", {}, "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA=="], - "next-auth/@auth/core/preact": ["preact@10.11.3", "", {}, "sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg=="], "next-auth/@auth/core/preact-render-to-string": ["preact-render-to-string@5.2.3", "", { "dependencies": { "pretty-format": "^3.8.0" }, "peerDependencies": { "preact": ">=10" } }, "sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA=="], @@ -4255,10 +4126,6 @@ "tailwindcss/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], - "web/framer-motion/motion-dom": ["motion-dom@11.18.1", "", { "dependencies": { "motion-utils": "^11.18.1" } }, "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw=="], - - "web/framer-motion/motion-utils": ["motion-utils@11.18.1", "", {}, "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA=="], - "@aws-crypto/sha1-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], diff --git a/yarn.lock b/yarn.lock index b4b8249544..d32c8e9b91 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1041,14 +1041,14 @@ formdata-node "^4.3.2" node-fetch "^2.6.7" -"@bubba/analytics@^workspace:packages/analytics", "@bubba/analytics@workspace:*": +"@bubba/analytics@packages/analytics": version "workspace:packages/analytics" resolved "workspace:packages/analytics" dependencies: posthog-js "^1.215.3" posthog-node "^4.4.1" -"@bubba/db@^workspace:packages/db", "@bubba/db@workspace:*": +"@bubba/db@packages/db", "@bubba/db@workspace:*": version "workspace:packages/db" resolved "workspace:packages/db" devDependencies: @@ -1063,7 +1063,7 @@ "@prisma/extension-accelerate" "^1.2.2" prisma "^6.5.0" -"@bubba/email@^workspace:packages/email": +"@bubba/email@packages/email": version "workspace:packages/email" resolved "workspace:packages/email" devDependencies: @@ -1083,7 +1083,7 @@ react-email "3.0.4" responsive-react-email "^0.0.5" -"@bubba/integrations@^workspace:packages/integrations": +"@bubba/integrations@packages/integrations": version "workspace:packages/integrations" resolved "workspace:packages/integrations" devDependencies: @@ -1097,14 +1097,14 @@ sharp "^0.33.5" zod "^3.24.2" -"@bubba/kv@^workspace:packages/kv": +"@bubba/kv@packages/kv": version "workspace:packages/kv" resolved "workspace:packages/kv" dependencies: "@upstash/redis" "^1.34.2" server-only "0.0.1" -"@bubba/notifications@^workspace:packages/notifications", "@bubba/notifications@workspace:*": +"@bubba/notifications@packages/notifications", "@bubba/notifications@workspace:*": version "workspace:packages/notifications" resolved "workspace:packages/notifications" devDependencies: @@ -1113,11 +1113,11 @@ "@novu/node" "^2.0.1" nanoid "5.1.0" -"@bubba/tsconfig@^workspace:packages/tsconfig", "@bubba/tsconfig@workspace:*": +"@bubba/tsconfig@packages/tsconfig", "@bubba/tsconfig@workspace:*": version "workspace:packages/tsconfig" resolved "workspace:packages/tsconfig" -"@bubba/ui@^workspace:packages/ui", "@bubba/ui@workspace:*": +"@bubba/ui@packages/ui", "@bubba/ui@workspace:*": version "workspace:packages/ui" resolved "workspace:packages/ui" devDependencies: @@ -1181,7 +1181,7 @@ use-callback-ref "^1.3.3" vaul "^1.0.0" -"@bubba/utils@^workspace:packages/utils", "@bubba/utils@workspace:*": +"@bubba/utils@packages/utils", "@bubba/utils@workspace:*": version "workspace:packages/utils" resolved "workspace:packages/utils" devDependencies: @@ -2186,13 +2186,6 @@ resolved "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.2.tgz" integrity sha512-52nWy65S/R6/kejz3jpvHAjZDPKIbEQu4x9jDBzmB9jJfuOy5rspjKu4u77+fI4M/WzLXrrQd57hlFGzz1ubcQ== -"@next/third-parties@^15.1.7": - version "15.2.1" - resolved "https://registry.npmjs.org/@next/third-parties/-/third-parties-15.2.1.tgz" - integrity sha512-XIOqG5NptLoH7MUBuxZP58DMjgX/XeDhY2UTcLHjMMMXfvu2kckGOUYFfoueWzkLmmfKbj7e8nq03pkcN6vXUA== - dependencies: - third-party-capital "1.0.20" - "@noble/ciphers@^0.6.0": version "0.6.0" resolved "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.6.0.tgz" @@ -4392,111 +4385,6 @@ dependencies: tslib "^2.8.0" -"@t3-oss/env-core@0.11.1": - version "0.11.1" - resolved "https://registry.npmjs.org/@t3-oss/env-core/-/env-core-0.11.1.tgz" - integrity sha512-MaxOwEoG1ntCFoKJsS7nqwgcxLW1SJw238AJwfJeaz3P/8GtkxXZsPPolsz1AdYvUTbe3XvqZ/VCdfjt+3zmKw== - -"@t3-oss/env-nextjs@^0.11.1": - version "0.11.1" - resolved "https://registry.npmjs.org/@t3-oss/env-nextjs/-/env-nextjs-0.11.1.tgz" - integrity sha512-rx2XL9+v6wtOqLNJbD5eD8OezKlQD1BtC0WvvtHwBgK66jnF5+wGqtgkKK4Ygie1LVmoDClths2T4tdFmRvGrQ== - dependencies: - "@t3-oss/env-core" "0.11.1" - -"@tailwindcss/node@4.0.13": - version "4.0.13" - resolved "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.13.tgz" - integrity sha512-P9TmtE9Vew0vv5FwyD4bsg/dHHsIsAuUXkenuGUc5gm8fYgaxpdoxIKngCyEMEQxyCKR8PQY5V5VrrKNOx7exg== - dependencies: - enhanced-resolve "^5.18.1" - jiti "^2.4.2" - tailwindcss "4.0.13" - -"@tailwindcss/oxide@4.0.13": - version "4.0.13" - resolved "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.13.tgz" - integrity sha512-pTH3Ex5zAWC9LbS+WsYAFmkXQW3NRjmvxkKJY3NP1x0KHBWjz0Q2uGtdGMJzsa0EwoZ7wq9RTbMH1UNPceCpWw== - optionalDependencies: - "@tailwindcss/oxide-android-arm64" "4.0.13" - "@tailwindcss/oxide-darwin-arm64" "4.0.13" - "@tailwindcss/oxide-darwin-x64" "4.0.13" - "@tailwindcss/oxide-freebsd-x64" "4.0.13" - "@tailwindcss/oxide-linux-arm-gnueabihf" "4.0.13" - "@tailwindcss/oxide-linux-arm64-gnu" "4.0.13" - "@tailwindcss/oxide-linux-arm64-musl" "4.0.13" - "@tailwindcss/oxide-linux-x64-gnu" "4.0.13" - "@tailwindcss/oxide-linux-x64-musl" "4.0.13" - "@tailwindcss/oxide-win32-arm64-msvc" "4.0.13" - "@tailwindcss/oxide-win32-x64-msvc" "4.0.13" - -"@tailwindcss/oxide-android-arm64@4.0.13": - version "4.0.13" - resolved "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.13.tgz" - integrity sha512-+9zmwaPQ8A9ycDcdb+hRkMn6NzsmZ4YJBsW5Xqq5EdOu9xlIgmuMuJauVzDPB5BSbIWfhPdZ+le8NeRZpl1coA== - -"@tailwindcss/oxide-darwin-arm64@4.0.13": - version "4.0.13" - resolved "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.13.tgz" - integrity sha512-Bj1QGlEJSjs/205CIRfb5/jeveOqzJ4pFMdRxu0gyiYWxBRyxsExXqaD+7162wnLP/EDKh6S1MC9E/1GwEhLtA== - -"@tailwindcss/oxide-darwin-x64@4.0.13": - version "4.0.13" - resolved "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.13.tgz" - integrity sha512-lRTkxjTpMGXhLLM5GjZ0MtjPczMuhAo9j7PeSsaU6Imkm7W7RbrXfT8aP934kS7cBBV+HKN5U19Z0WWaORfb8Q== - -"@tailwindcss/oxide-freebsd-x64@4.0.13": - version "4.0.13" - resolved "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.13.tgz" - integrity sha512-p/YLyKhs+xFibVeAPlpMGDVMKgjChgzs12VnDFaaqRSJoOz+uJgRSKiir2tn50e7Nm4YYw35q/DRBwpDBNo1MQ== - -"@tailwindcss/oxide-linux-arm-gnueabihf@4.0.13": - version "4.0.13" - resolved "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.13.tgz" - integrity sha512-Ua/5ydE/QOTX8jHuc7M9ICWnaLi6K2MV/r+Ws2OppsOjy8tdlPbqYainJJ6Kl7ofm524K+4Fk9CQITPzeIESPw== - -"@tailwindcss/oxide-linux-arm64-gnu@4.0.13": - version "4.0.13" - resolved "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.13.tgz" - integrity sha512-/W1+Q6tBAVgZWh/bhfOHo4n7Ryh6E7zYj4bJd9SRbkPyLtRioyK3bi6RLuDj57sa7Amk/DeomSV9iycS0xqIPA== - -"@tailwindcss/oxide-linux-arm64-musl@4.0.13": - version "4.0.13" - resolved "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.13.tgz" - integrity sha512-GQj6TWevNxwsYw20FdT2r2d1f7uiRsF07iFvNYxPIvIyPEV74eZ0zgFEsAH1daK1OxPy+LXdZ4grV17P5tVzhQ== - -"@tailwindcss/oxide-linux-x64-gnu@4.0.13": - version "4.0.13" - resolved "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.13.tgz" - integrity sha512-sQRH09faifF9w9WS6TKDWr1oLi4hoPx0EIWXZHQK/jcjarDpXGQ2DbF0KnALJCwWBxOIP/1nrmU01fZwwMzY3g== - -"@tailwindcss/oxide-linux-x64-musl@4.0.13": - version "4.0.13" - resolved "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.13.tgz" - integrity sha512-Or1N8DIF3tP+LsloJp+UXLTIMMHMUcWXFhJLCsM4T7MzFzxkeReewRWXfk5mk137cdqVeUEH/R50xAhY1mOkTQ== - -"@tailwindcss/oxide-win32-arm64-msvc@4.0.13": - version "4.0.13" - resolved "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.13.tgz" - integrity sha512-u2mQyqCFrr9vVTP6sfDRfGE6bhOX3/7rInehzxNhHX1HYRIx09H3sDdXzTxnZWKOjIg3qjFTCrYFUZckva5PIg== - -"@tailwindcss/oxide-win32-x64-msvc@4.0.13": - version "4.0.13" - resolved "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.13.tgz" - integrity sha512-sOEc4iCanp1Yqyeu9suQcEzfaUcHnqjBUgDg0ZXpjUMUwdSi37S1lu1RGoV1BYInvvGu3y3HHTmvsSfDhx2L8w== - -"@tailwindcss/postcss@^4.0.13": - version "4.0.13" - resolved "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.0.13.tgz" - integrity sha512-zTmnPGDYb2HKClTBTBwB+lLQH+Rq4etnQXFXs2lisRyXryUnoJIBByFTljkaK9F1d7o14h6t4NJIlfbZuOHR+A== - dependencies: - "@alloc/quick-lru" "^5.2.0" - "@tailwindcss/node" "4.0.13" - "@tailwindcss/oxide" "4.0.13" - lightningcss "1.29.2" - postcss "^8.4.41" - tailwindcss "4.0.13" - "@tailwindcss/typography@^0.5.16": version "0.5.16" resolved "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz" @@ -4799,7 +4687,7 @@ resolved "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz" integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== -"@trigger.dev/build@3.3.17", "@trigger.dev/build@^3.3.15": +"@trigger.dev/build@3.3.17": version "3.3.17" resolved "https://registry.npmjs.org/@trigger.dev/build/-/build-3.3.17.tgz" integrity sha512-dfreMuVeLAcZypS3kkUA9nWNviiuOPIQ3ldy2ywPCmwmbHyd0BE8tI5D3A4kmVq/f53TdRMls4c+cYafxlwubQ== @@ -4900,7 +4788,7 @@ uuid "^9.0.0" ws "^8.11.0" -"@trigger.dev/sdk@3.3.17", "@trigger.dev/sdk@^3.3.15": +"@trigger.dev/sdk@3.3.17": version "3.3.17" resolved "https://registry.npmjs.org/@trigger.dev/sdk/-/sdk-3.3.17.tgz" integrity sha512-wjIjlQWKybYWw/J7LxFIOO1pXzxXoj9lxbFMvjb51JtfebxnQnh6aExN47nOGhVhV38wHYstfBI/8ClWwBnFYw== @@ -6296,7 +6184,7 @@ cjs-module-lexer@^1.2.2: resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz" integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q== -class-variance-authority@^0.7.0, class-variance-authority@^0.7.1: +class-variance-authority@^0.7.0: version "0.7.1" resolved "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz" integrity sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg== @@ -6436,7 +6324,7 @@ commander@11.1.0: resolved "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz" integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== -comp.ai@^workspace:apps/app: +"comp.ai@apps/app": version "workspace:apps/app" resolved "workspace:apps/app" devDependencies: @@ -7413,14 +7301,6 @@ engine.io-parser@~5.2.1: resolved "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz" integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== -enhanced-resolve@^5.18.1: - version "5.18.1" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz" - integrity sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - entities@^4.2.0, entities@^4.4.0, entities@^4.5.0: version "4.5.0" resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" @@ -8081,15 +7961,6 @@ fraction.js@^4.3.7: resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== -framer-motion@^11.18.2: - version "11.18.2" - resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-11.18.2.tgz" - integrity sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w== - dependencies: - motion-dom "^11.18.1" - motion-utils "^11.18.1" - tslib "^2.4.0" - framer-motion@^12.5.0: version "12.5.0" resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-12.5.0.tgz" @@ -8349,7 +8220,7 @@ graceful-fs@4.2.10: resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.2.4: +graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.1.6: version "4.2.11" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -9100,11 +8971,6 @@ jiti@^1.21.6: resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz" integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== -jiti@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz" - integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A== - jju@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz" @@ -9396,74 +9262,6 @@ leac@^0.6.0: resolved "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz" integrity sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg== -lightningcss@1.29.2: - version "1.29.2" - resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz" - integrity sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA== - optionalDependencies: - lightningcss-darwin-arm64 "1.29.2" - lightningcss-darwin-x64 "1.29.2" - lightningcss-freebsd-x64 "1.29.2" - lightningcss-linux-arm-gnueabihf "1.29.2" - lightningcss-linux-arm64-gnu "1.29.2" - lightningcss-linux-arm64-musl "1.29.2" - lightningcss-linux-x64-gnu "1.29.2" - lightningcss-linux-x64-musl "1.29.2" - lightningcss-win32-arm64-msvc "1.29.2" - lightningcss-win32-x64-msvc "1.29.2" - dependencies: - detect-libc "^2.0.3" - -lightningcss-darwin-arm64@1.29.2: - version "1.29.2" - resolved "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz" - integrity sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA== - -lightningcss-darwin-x64@1.29.2: - version "1.29.2" - resolved "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz" - integrity sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w== - -lightningcss-freebsd-x64@1.29.2: - version "1.29.2" - resolved "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz" - integrity sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg== - -lightningcss-linux-arm-gnueabihf@1.29.2: - version "1.29.2" - resolved "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz" - integrity sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg== - -lightningcss-linux-arm64-gnu@1.29.2: - version "1.29.2" - resolved "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz" - integrity sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ== - -lightningcss-linux-arm64-musl@1.29.2: - version "1.29.2" - resolved "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz" - integrity sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ== - -lightningcss-linux-x64-gnu@1.29.2: - version "1.29.2" - resolved "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz" - integrity sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg== - -lightningcss-linux-x64-musl@1.29.2: - version "1.29.2" - resolved "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz" - integrity sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w== - -lightningcss-win32-arm64-msvc@1.29.2: - version "1.29.2" - resolved "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz" - integrity sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw== - -lightningcss-win32-x64-msvc@1.29.2: - version "1.29.2" - resolved "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz" - integrity sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA== - lilconfig@^3.0.0, lilconfig@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz" @@ -9624,11 +9422,6 @@ lucide-react@^0.447.0: resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.447.0.tgz" integrity sha512-SZ//hQmvi+kDKrNepArVkYK7/jfeZ5uFNEnYmd45RKZcbGD78KLnrcNXmgeg6m+xNHFvTG+CblszXCy4n6DN4w== -lucide-react@^0.469.0: - version "0.469.0" - resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.469.0.tgz" - integrity sha512-28vvUnnKQ/dBwiCQtwJw7QauYnE7yd2Cyp4tTTJpvglX4EMpbflcdBgrgToX2j71B3YvugK/NH3BGUk+E/p/Fw== - magic-string@^0.30.11: version "0.30.17" resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz" @@ -10268,21 +10061,6 @@ module-details-from-path@^1.0.3: resolved "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz" integrity sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A== -motion@^11.18.2: - version "11.18.2" - resolved "https://registry.npmjs.org/motion/-/motion-11.18.2.tgz" - integrity sha512-JLjvFDuFr42NFtcVoMAyC2sEjnpA8xpy6qWPyzQvCloznAyQ8FIXioxWfHiLtgYhoVpfUqSWpn1h9++skj9+Wg== - dependencies: - framer-motion "^11.18.2" - tslib "^2.4.0" - -motion-dom@^11.18.1: - version "11.18.1" - resolved "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz" - integrity sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw== - dependencies: - motion-utils "^11.18.1" - motion-dom@^12.5.0: version "12.5.0" resolved "https://registry.npmjs.org/motion-dom/-/motion-dom-12.5.0.tgz" @@ -10290,11 +10068,6 @@ motion-dom@^12.5.0: dependencies: motion-utils "^12.5.0" -motion-utils@^11.18.1: - version "11.18.1" - resolved "https://registry.npmjs.org/motion-utils/-/motion-utils-11.18.1.tgz" - integrity sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA== - motion-utils@^12.5.0: version "12.5.0" resolved "https://registry.npmjs.org/motion-utils/-/motion-utils-12.5.0.tgz" @@ -10392,7 +10165,7 @@ next@15.0.4: postcss "8.4.31" styled-jsx "5.1.6" -next@*, "next@>= 14.0.0", next@>=12, next@>=13.2.0, next@>=14.2.0, "next@^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0", "next@^13.0.0 || ^14.0.0 || ^15.0.0", "next@^14.0.0-0 || ^15.0.0-0", next@^15.2.0, next@^15.2.2: +next@*, "next@>= 14.0.0", next@>=13.2.0, next@>=14.2.0, "next@^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0", "next@^14.0.0-0 || ^15.0.0-0", next@^15.2.0, next@^15.2.2: version "15.2.2" resolved "https://registry.npmjs.org/next/-/next-15.2.2.tgz" integrity sha512-dgp8Kcx5XZRjMw2KNwBtUzhngRaURPioxoNIVl5BOyJbhi9CUgEtKDO7fx5wh8Z8vOVX1nYZ9meawJoRrlASYA== @@ -10450,11 +10223,6 @@ next-themes@^0.4.6: resolved "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz" integrity sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA== -next-turnstile@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/next-turnstile/-/next-turnstile-1.0.2.tgz" - integrity sha512-PdCDkMQgJLGeTJpBz/cmmsKcysI0z+eN8uYab/8HuxWQ3i3NbhAfufE/Gw3ubXEd/xDezve/eVp+QBX3T7shOQ== - node-addon-api@^8.1.0: version "8.3.1" resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.3.1.tgz" @@ -11113,7 +10881,7 @@ plist@^3.1.0: base64-js "^1.5.1" xmlbuilder "^15.1.1" -portal@^workspace:apps/portal: +"portal@apps/portal": version "workspace:apps/portal" resolved "workspace:apps/portal" devDependencies: @@ -11147,7 +10915,7 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@>=8.0.9, postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.41, postcss@^8.4.47, postcss@^8.4.48, postcss@^8.5.2, postcss@^8.5.3: +postcss@>=8.0.9, postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.47, postcss@^8.4.48, postcss@^8.5.2, postcss@^8.5.3: version "8.5.3" resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz" integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== @@ -11262,7 +11030,7 @@ postgres-range@^1.1.1: resolved "https://registry.npmjs.org/postgres-range/-/postgres-range-1.1.4.tgz" integrity sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w== -posthog-js@^1.215.3, posthog-js@^1.217.2, posthog-js@^1.231.0: +posthog-js@^1.215.3, posthog-js@^1.231.0: version "1.231.0" resolved "https://registry.npmjs.org/posthog-js/-/posthog-js-1.231.0.tgz" integrity sha512-8v3zRytQBg3KyKUPLy/9S5fw7ATeiKz3n3pLFxl1fQsV/a2mIt/MAwkIREZXTzi7mamsvtfXhSdggG7UYK/Ojw== @@ -11272,7 +11040,7 @@ posthog-js@^1.215.3, posthog-js@^1.217.2, posthog-js@^1.231.0: preact "^10.19.3" web-vitals "^4.2.4" -posthog-node@^4.10.1, posthog-node@^4.4.1, posthog-node@^4.5.2: +posthog-node@^4.10.1, posthog-node@^4.4.1: version "4.10.1" resolved "https://registry.npmjs.org/posthog-node/-/posthog-node-4.10.1.tgz" integrity sha512-rEzVszfaOkUFTjEabDcRLJNRqMwTOeU1WpqKgQEDV3x82O4ODifkvkoCERaPxl/ossi1NtqKXBOZ+XnhQ19pNQ== @@ -11722,7 +11490,7 @@ react@18.2.0, react@18.x, "react@^16.8 || ^17.0 || ^18.0", react@^18.0.0, react@ dependencies: loose-envify "^1.1.0" -react@*, react@19.0.0, "react@>= 16.8 || 18.0.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0", "react@>= 18.2.0", react@>=16, react@>=16.6.0, react@>=16.8, "react@>=16.8.0 || ^17.0.0 || ^18", react@>=16.8.1, "react@>=16.8.6 || ^17.0.0 || ^18.0.0", react@>=17, react@>=18, "react@>=18.2.0 || ^19.0.0-0", "react@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc", "react@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^17.0.2 || ^18.0.0 || ^19.0.0", "react@^18 || ^19", "react@^18 || ^19 || ^19.0.0-rc", "react@^18.0 || ^19.0", "react@^18.0 || ^19.0 || ^19.0.0-rc", "react@^18.0.0 || ^19.0.0", "react@^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^18.2.0 || 19.0.0-rc-66855b96-20241106 || ^19.0.0", "react@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react@^18.2.0 || ^19.0.0-0", react@^19.0.0: +react@*, react@19.0.0, "react@>= 16.8 || 18.0.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0", "react@>= 18.2.0", react@>=16, react@>=16.6.0, react@>=16.8, react@>=16.8.1, "react@>=16.8.6 || ^17.0.0 || ^18.0.0", react@>=17, react@>=18, "react@>=18.2.0 || ^19.0.0-0", "react@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc", "react@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^17.0.2 || ^18.0.0 || ^19.0.0", "react@^18 || ^19", "react@^18 || ^19 || ^19.0.0-rc", "react@^18.0 || ^19.0", "react@^18.0 || ^19.0 || ^19.0.0-rc", "react@^18.0.0 || ^19.0.0", "react@^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^18.2.0 || 19.0.0-rc-66855b96-20241106 || ^19.0.0", "react@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react@^18.2.0 || ^19.0.0-0", react@^19.0.0: version "19.0.0" resolved "https://registry.npmjs.org/react/-/react-19.0.0.tgz" integrity sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ== @@ -11748,7 +11516,7 @@ react-dom@18.2.0, "react-dom@^16.8 || ^17.0 || ^18.0", react-dom@^18.0.0: loose-envify "^1.1.0" scheduler "^0.23.0" -react-dom@19.0.0, "react-dom@>= 18.2.0", react-dom@>=16, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=16.8.1, "react-dom@>=16.8.6 || ^17.0.0 || ^18.0.0", react-dom@>=17, react-dom@>=18.0.0, "react-dom@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18 || ^19 || ^19.0.0-rc", "react-dom@^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^18.2.0 || 19.0.0-rc-66855b96-20241106 || ^19.0.0", "react-dom@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", react-dom@^19.0.0: +react-dom@19.0.0, "react-dom@>= 18.2.0", react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=16.8.1, "react-dom@>=16.8.6 || ^17.0.0 || ^18.0.0", react-dom@>=17, react-dom@>=18.0.0, "react-dom@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18 || ^19 || ^19.0.0-rc", "react-dom@^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^18.2.0 || 19.0.0-rc-66855b96-20241106 || ^19.0.0", "react-dom@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", react-dom@^19.0.0: version "19.0.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz" integrity sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ== @@ -11964,11 +11732,6 @@ react-use-draggable-scroll@^0.4.7: resolved "https://registry.npmjs.org/react-use-draggable-scroll/-/react-use-draggable-scroll-0.4.7.tgz" integrity sha512-6gCxGPO9WV5dIsBaDrgUKBaac8CY07PkygcArfajijYSNDwAq0girDRjaBuF1+lRqQryoLFQfpVaV2u/Yh6CrQ== -react-wrap-balancer@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/react-wrap-balancer/-/react-wrap-balancer-1.1.1.tgz" - integrity sha512-AB+l7FPRWl6uZ28VcJ8skkwLn2+UC62bjiw8tQUrZPlEWDVnR9MG0lghyn7EyxuJSsFEpht4G+yh2WikEqQ/5Q== - read-cache@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" @@ -13052,7 +12815,7 @@ tailwind-merge@2.5.3: resolved "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.3.tgz" integrity sha512-d9ZolCAIzom1nf/5p4LdD5zvjmgSxY0BGgdSvmXIoMYAiPdAW/dSpP7joCDYFY7r/HkEa2qmPtkgsu0xjQeQtw== -tailwind-merge@^2.4.0, tailwind-merge@^2.6.0: +tailwind-merge@^2.4.0: version "2.6.0" resolved "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz" integrity sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA== @@ -13085,21 +12848,11 @@ tailwind-merge@^2.4.0, tailwind-merge@^2.6.0: resolve "^1.22.8" sucrase "^3.35.0" -tailwindcss@4.0.13, tailwindcss@^4.0.13: - version "4.0.13" - resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.13.tgz" - integrity sha512-gbvFrB0fOsTv/OugXWi2PtflJ4S6/ctu6Mmn3bCftmLY/6xRsQVEJPgIIpABwpZ52DpONkCA3bEj5b54MHxF2Q== - tailwindcss-animate@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz" integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA== -tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - tar@^2.0.0: version "2.2.2" resolved "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz" @@ -13158,11 +12911,6 @@ thenify-all@^1.0.0: dependencies: thenify ">= 3.1.0 < 4" -third-party-capital@1.0.20: - version "1.0.20" - resolved "https://registry.npmjs.org/third-party-capital/-/third-party-capital-1.0.20.tgz" - integrity sha512-oB7yIimd8SuGptespDAZnNkzIz+NWaJCu2RMsbs4Wmp9zSDUM8Nhi3s2OOcqYuv3mN4hitXc8DVx+LyUmbUDiA== - throttleit@2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz" @@ -13689,7 +13437,7 @@ uuid@^9.0.0, uuid@^9.0.1: resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== -uuid@^11.0.5, uuid@^11.1.0: +uuid@^11.1.0: version "11.1.0" resolved "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz" integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== @@ -13798,42 +13546,6 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -web@^workspace:apps/web: - version "workspace:apps/web" - resolved "workspace:apps/web" - devDependencies: - "@bubba/analytics" "workspace:*" - devDependencies: - "@trigger.dev/build" "^3.3.15" - "@types/node" "^22.13.2" - "@types/react" "^19.0.8" - "@types/react-dom" "^19.0.3" - postcss "^8.5.3" - tailwindcss "^4.0.13" - typescript "^5.7.3" - dependencies: - "@next/third-parties" "^15.1.7" - "@t3-oss/env-nextjs" "^0.11.1" - "@tailwindcss/postcss" "^4.0.13" - "@trigger.dev/sdk" "^3.3.15" - class-variance-authority "^0.7.1" - clsx "^2.1.1" - framer-motion "^11.18.2" - ky "^1.7.5" - lucide-react "^0.469.0" - motion "^11.18.2" - next "^15.2.0" - next-turnstile "^1.0.2" - posthog-js "^1.217.2" - posthog-node "^4.5.2" - react "^19.0.0" - react-dom "^19.0.0" - react-wrap-balancer "^1.1.1" - resend "^4.1.2" - tailwind-merge "^2.6.0" - tailwindcss-animate "^1.0.7" - uuid "^11.0.5" - web-streams-polyfill@^3.0.3: version "3.3.3" resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz" From 0ccad7a6c492bfc5a9ba9f4a989d73f8d0515445 Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Wed, 19 Mar 2025 11:58:05 -0400 Subject: [PATCH 2/9] move everything under [orgId] and add org switcher --- .../actions/getFrameworkCategoriesAction.ts | 0 .../(home)/actions/getFrameworksAction.ts | 0 .../(home)/actions/selectFrameworksAction.ts | 0 .../(home)/components/FrameworkProgress.tsx | 0 .../(home)/components/FrameworksGrid.tsx | 0 .../(home)/components/FrameworksOverview.tsx | 0 .../components/RequirementStatusChart.tsx | 0 .../(home)/hooks/useFrameworks.ts | 0 .../{ => [orgId]}/(home)/layout.tsx | 0 .../actions/getOrganizationCategories.ts | 0 .../getOrganizationControlsProgress.ts | 0 .../actions/getOrganizationFramework.ts | 0 .../components/FrameworkControls.tsx | 0 .../components/FrameworkOverview.tsx | 0 .../table/FrameworkControlsTable.tsx | 0 .../table/FrameworkControlsTableColumns.tsx | 0 .../table/FrameworkControlsTableHeader.tsx | 0 .../hooks/useOrganizationCategories.ts | 0 .../hooks/useOrganizationFramework.ts | 0 .../frameworks/[frameworkId]/page.tsx | 0 .../[id]/actions/getOrganizationControl.ts | 0 .../actions/getOrganizationControlProgress.ts | 0 .../getOrganizationControlRequirements.ts | 0 .../[id]/components/SingleControl.tsx | 0 .../[id]/components/SingleControlSkeleton.tsx | 0 .../table/ControlRequirementsTable.tsx | 0 .../table/ControlRequirementsTableColumns.tsx | 0 .../table/ControlRequirementsTableHeader.tsx | 0 .../controls/[id]/components/table/types.ts | 0 .../[id]/hooks/useOrganizationControl.ts | 0 .../hooks/useOrganizationControlProgress.ts | 0 .../useOrganizationControlRequirements.ts | 0 .../frameworks/controls/[id]/page.tsx | 0 .../(dashboard)/{ => [orgId]}/(home)/page.tsx | 0 .../(app)/(dashboard)/{ => [orgId]}/error.tsx | 0 .../evidence/[id]/actions/assignEvidence.ts | 0 .../[id]/actions/deleteEvidenceFile.ts | 0 .../[id]/actions/getEvidenceFileUrl.ts | 0 .../evidence/[id]/actions/publishEvidence.ts | 0 .../evidence/[id]/actions/toggleRelevance.ts | 0 .../[id]/actions/updateEvidenceDepartment.ts | 0 .../[id]/actions/updateEvidenceFrequency.ts | 0 .../[id]/actions/updateEvidenceUrls.ts | 0 .../[id]/actions/uploadEvidenceFile.ts | 0 .../[id]/components/AssigneeSection.tsx | 0 .../[id]/components/DepartmentSection.tsx | 0 .../[id]/components/EvidenceDetails.tsx | 0 .../evidence/[id]/components/FileCard.tsx | 0 .../evidence/[id]/components/FileIcon.tsx | 0 .../evidence/[id]/components/FileSection.tsx | 0 .../evidence/[id]/components/FileUpload.tsx | 0 .../[id]/components/FrequencySection.tsx | 0 .../[id]/components/ReviewDateCard.tsx | 0 .../[id]/components/ReviewSection.tsx | 0 .../evidence/[id]/components/UrlSection.tsx | 0 .../[id]/edit/components/EditEvidenceForm.tsx | 0 .../{ => [orgId]}/evidence/[id]/edit/page.tsx | 0 .../evidence/[id]/hooks/useFileDelete.ts | 0 .../evidence/[id]/hooks/useFilePreview.ts | 0 .../evidence/[id]/hooks/useFileUpload.ts | 0 .../[id]/hooks/useOrganizationAdmins.ts | 0 .../[id]/hooks/useOrganizationEvidence.ts | 0 .../evidence/[id]/hooks/useUrlManagement.ts | 0 .../{ => [orgId]}/evidence/[id]/layout.tsx | 0 .../{ => [orgId]}/evidence/[id]/page.tsx | 0 .../{ => [orgId]}/evidence/[id]/types.ts | 0 .../getAllOrganizationControlRequirements.ts | 0 .../evidence/actions/getEvidence.ts | 0 .../evidence/actions/getEvidenceTasksStats.ts | 0 .../evidence/actions/getOrganizationAdmins.ts | 0 .../actions/getOrganizationEmployees.ts | 0 .../actions/getOrganizationEvidence.ts | 0 .../actions/getOrganizationEvidenceTasks.ts | 0 .../{ => [orgId]}/evidence/constants.ts | 0 .../evidence/hooks/useEvidenceTasks.ts | 0 .../evidence/hooks/useEvidenceTasksStats.ts | 0 .../evidence/list/components/EvidenceList.tsx | 0 .../list/components/EvidenceListUIStates.tsx | 0 .../list/components/EvidenceSummaryCards.tsx | 0 .../evidence/list/components/index.ts | 0 .../EvidenceFilters/ActiveFilterBadges.tsx | 0 .../components/table/EvidenceFilters/index.ts | 0 .../components/table/EvidenceListColumns.tsx | 0 .../components/table/EvidenceListHeader.tsx | 0 .../components/table/EvidenceListTable.tsx | 0 .../table/components/AssigneeAvatar.tsx | 0 .../table/components/filterCategories.tsx | 0 .../table/components/filterConfigs.tsx | 0 .../evidence/list/components/table/index.ts | 0 .../list/hooks/useEvidenceTableContext.tsx | 0 .../{ => [orgId]}/evidence/list/layout.tsx | 0 .../{ => [orgId]}/evidence/list/page.tsx | 0 .../{ => [orgId]}/evidence/list/types.ts | 0 .../overview/components/AnimatedBar.tsx | 0 .../AssigneeChart/AssigneeBarChart.tsx | 0 .../AssigneeChart/AssigneeChartRow.tsx | 0 .../DepartmentChart/DepartmentBarChart.tsx | 0 .../DepartmentChart/DepartmentChartRow.tsx | 0 .../overview/components/EvidenceOverview.tsx | 0 .../overview/components/EvidenceUIStates.tsx | 0 .../FrameworkChart/FrameworkBarChart.tsx | 0 .../FrameworkChart/FrameworkChartRow.tsx | 0 .../components/HorizontalBarChart.tsx | 0 .../overview/constants/departments.ts | 0 .../overview/constants/evidence-status.ts | 0 .../overview/data/getEvidenceDashboard.ts | 0 .../overview/hooks/useAssigneeData.ts | 0 .../overview/hooks/useEvidenceData.ts | 0 .../overview/hooks/useFrameworkData.ts | 0 .../overview/hooks/useScrollPosition.tsx | 0 .../overview/hooks/useStatusTranslation.ts | 0 .../evidence/overview/layout.tsx | 0 .../evidence/overview/loading.tsx | 0 .../{ => [orgId]}/evidence/overview/page.tsx | 0 .../{ => [orgId]}/evidence/page.tsx | 0 .../{ => [orgId]}/integrations/page.tsx | 0 .../(app)/(dashboard)/[orgId]/layout.tsx | 46 +++++++++++++ .../actions/get-employee-details.ts | 0 .../[employeeId]/actions/update-department.ts | 0 .../components/EditableDepartment.tsx | 0 .../components/EmployeeDetails.tsx | 0 .../people/[employeeId]/page.tsx | 0 .../people/[employeeId]/types/index.ts | 0 .../people/actions/get-employees.ts | 0 .../people/components/EmployeesList.tsx | 0 .../components/EmployeesListSkeleton.tsx | 0 .../components/table/EmployeesTable.tsx | 0 .../people/components/table/columns.tsx | 0 .../table/components/filterCategories.tsx | 0 .../table/hooks/useEmployeesTableContext.tsx | 0 .../people/components/table/types.ts | 0 .../{ => [orgId]}/people/hooks/useEmployee.ts | 0 .../people/hooks/useEmployees.ts | 0 .../{ => [orgId]}/people/layout.tsx | 0 .../(dashboard)/{ => [orgId]}/people/page.tsx | 0 .../(dashboard)/{ => [orgId]}/people/types.ts | 0 .../{ => [orgId]}/people/types/index.ts | 0 .../people/types/search-params.ts | 0 .../policies/(overview)/layout.tsx | 0 .../policies/(overview)/page.tsx | 0 .../all/(overview)/actions/get-policies.ts | 0 .../(overview)/components/PoliciesList.tsx | 0 .../components/PoliciesListSkeleton.tsx | 0 .../components/table/PoliciesTable.tsx | 0 .../(overview)/components/table/columns.tsx | 0 .../table/components/filterCategories.tsx | 0 .../table/components/filterConfigs.tsx | 0 .../table/hooks/usePoliciesTableContext.tsx | 0 .../all/(overview)/components/table/types.ts | 0 .../all/(overview)/components/table/utils.ts | 0 .../all/(overview)/hooks/usePolicies.ts | 0 .../all/(overview)/hooks/usePolicy.ts | 0 .../policies/all/(overview)/layout.tsx | 0 .../policies/all/(overview)/page.tsx | 0 .../policies/all/(overview)/types/index.ts | 0 .../all/(overview)/types/search-params.ts | 0 .../editor/actions/get-policy-details.ts | 0 .../editor/actions/update-policy.ts | 0 .../editor/components/PolicyDetails.tsx | 0 .../editor/components/PolicyHeader.tsx | 0 .../policies/all/[policyId]/editor/page.tsx | 0 .../all/[policyId]/editor/types/index.ts | 0 .../policies/all/[policyId]/layout.tsx | 0 .../policies/all/[policyId]/page.tsx | 0 .../{ => [orgId]}/risk/(overview)/layout.tsx | 0 .../{ => [orgId]}/risk/(overview)/page.tsx | 0 .../risk/[riskId]/comments/page.tsx | 0 .../{ => [orgId]}/risk/[riskId]/layout.tsx | 0 .../{ => [orgId]}/risk/[riskId]/page.tsx | 0 .../[taskId]/actions/getTaskAttachments.ts | 0 .../[taskId]/hooks/useTaskAttachments.ts | 0 .../risk/[riskId]/tasks/[taskId]/page.tsx | 0 .../risk/[riskId]/tasks/search-params.ts | 0 .../risk/register/RiskRegisterTable.tsx | 0 .../risk/register/actions/getRisks.ts | 0 .../components/table/RiskRegisterColumns.tsx | 0 .../components/table/RiskRegisterFilters.tsx | 0 .../risk/register/hooks/useRisks.ts | 0 .../{ => [orgId]}/risk/register/layout.tsx | 0 .../{ => [orgId]}/risk/register/page.tsx | 0 .../risk/register/search-params.ts | 0 .../{ => [orgId]}/settings/api-keys/page.tsx | 0 .../{ => [orgId]}/settings/layout.tsx | 0 .../{ => [orgId]}/settings/members/page.tsx | 0 .../{ => [orgId]}/settings/page.tsx | 0 .../{ => [orgId]}/tests/(overview)/layout.tsx | 0 .../{ => [orgId]}/tests/(overview)/page.tsx | 0 .../tests/all/[testId]/actions/assignTest.ts | 0 .../all/[testId]/actions/createTestComment.ts | 0 .../tests/all/[testId]/actions/getTest.ts | 0 .../tests/all/[testId]/actions/types.ts | 0 .../[testId]/components/AssigneeSection.tsx | 0 .../all/[testId]/components/TestComments.tsx | 0 .../all/[testId]/components/TestDetails.tsx | 0 .../[testId]/hooks/useOrganizationAdmins.ts | 0 .../{ => [orgId]}/tests/all/[testId]/page.tsx | 0 .../all/actions/getOrganizationAdmins.ts | 0 .../tests/all/actions/getTests.ts | 0 .../tests/all/actions/refreshTests.ts | 0 .../tests/all/components/TestsList.tsx | 0 .../all/components/TestsListSkeleton.tsx | 0 .../{ => [orgId]}/tests/all/hooks/useTest.ts | 0 .../{ => [orgId]}/tests/all/hooks/useTests.ts | 0 .../{ => [orgId]}/tests/all/layout.tsx | 0 .../{ => [orgId]}/tests/all/page.tsx | 0 .../{ => [orgId]}/tests/all/types/index.ts | 0 .../tests/all/types/search-params.ts | 0 .../vendors/(overview)/layout.tsx | 0 .../{ => [orgId]}/vendors/(overview)/page.tsx | 0 .../app/[locale]/(app)/(dashboard)/layout.tsx | 58 ---------------- apps/app/src/app/page.tsx | 16 +++++ apps/app/src/components/header.tsx | 68 +++++++++++-------- .../src/components/organization-switcher.tsx | 66 ++++++++++++++++++ apps/app/src/data/getOrganizations.ts | 34 ++++++++++ apps/app/src/hooks/use-compliance-scores.ts | 6 +- apps/app/src/middleware.ts | 46 +++++++++---- 216 files changed, 235 insertions(+), 105 deletions(-) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/actions/getFrameworkCategoriesAction.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/actions/getFrameworksAction.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/actions/selectFrameworksAction.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/components/FrameworkProgress.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/components/FrameworksGrid.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/components/FrameworksOverview.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/components/RequirementStatusChart.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/hooks/useFrameworks.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/layout.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/[frameworkId]/actions/getOrganizationCategories.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/[frameworkId]/actions/getOrganizationControlsProgress.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/[frameworkId]/actions/getOrganizationFramework.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/[frameworkId]/components/FrameworkControls.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/[frameworkId]/components/FrameworkOverview.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/[frameworkId]/components/table/FrameworkControlsTable.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/[frameworkId]/components/table/FrameworkControlsTableColumns.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/[frameworkId]/components/table/FrameworkControlsTableHeader.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/[frameworkId]/hooks/useOrganizationCategories.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/[frameworkId]/hooks/useOrganizationFramework.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/[frameworkId]/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/controls/[id]/actions/getOrganizationControl.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/controls/[id]/actions/getOrganizationControlProgress.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/controls/[id]/actions/getOrganizationControlRequirements.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/controls/[id]/components/SingleControl.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/controls/[id]/components/SingleControlSkeleton.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/controls/[id]/components/table/ControlRequirementsTable.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/controls/[id]/components/table/ControlRequirementsTableColumns.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/controls/[id]/components/table/ControlRequirementsTableHeader.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/controls/[id]/components/table/types.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/controls/[id]/hooks/useOrganizationControl.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/controls/[id]/hooks/useOrganizationControlProgress.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/controls/[id]/hooks/useOrganizationControlRequirements.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/overview/frameworks/controls/[id]/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/(home)/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/error.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/actions/assignEvidence.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/actions/deleteEvidenceFile.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/actions/getEvidenceFileUrl.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/actions/publishEvidence.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/actions/toggleRelevance.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/actions/updateEvidenceDepartment.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/actions/updateEvidenceFrequency.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/actions/updateEvidenceUrls.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/actions/uploadEvidenceFile.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/components/AssigneeSection.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/components/DepartmentSection.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/components/EvidenceDetails.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/components/FileCard.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/components/FileIcon.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/components/FileSection.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/components/FileUpload.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/components/FrequencySection.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/components/ReviewDateCard.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/components/ReviewSection.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/components/UrlSection.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/edit/components/EditEvidenceForm.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/edit/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/hooks/useFileDelete.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/hooks/useFilePreview.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/hooks/useFileUpload.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/hooks/useOrganizationAdmins.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/hooks/useOrganizationEvidence.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/hooks/useUrlManagement.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/layout.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/[id]/types.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/actions/getAllOrganizationControlRequirements.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/actions/getEvidence.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/actions/getEvidenceTasksStats.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/actions/getOrganizationAdmins.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/actions/getOrganizationEmployees.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/actions/getOrganizationEvidence.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/actions/getOrganizationEvidenceTasks.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/constants.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/hooks/useEvidenceTasks.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/hooks/useEvidenceTasksStats.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/list/components/EvidenceList.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/list/components/EvidenceListUIStates.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/list/components/EvidenceSummaryCards.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/list/components/index.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/list/components/table/EvidenceFilters/ActiveFilterBadges.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/list/components/table/EvidenceFilters/index.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/list/components/table/EvidenceListColumns.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/list/components/table/EvidenceListHeader.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/list/components/table/EvidenceListTable.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/list/components/table/components/AssigneeAvatar.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/list/components/table/components/filterCategories.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/list/components/table/components/filterConfigs.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/list/components/table/index.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/list/hooks/useEvidenceTableContext.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/list/layout.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/list/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/list/types.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/overview/components/AnimatedBar.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/overview/components/AssigneeChart/AssigneeBarChart.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/overview/components/AssigneeChart/AssigneeChartRow.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/overview/components/DepartmentChart/DepartmentBarChart.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/overview/components/DepartmentChart/DepartmentChartRow.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/overview/components/EvidenceOverview.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/overview/components/EvidenceUIStates.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/overview/components/FrameworkChart/FrameworkBarChart.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/overview/components/FrameworkChart/FrameworkChartRow.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/overview/components/HorizontalBarChart.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/overview/constants/departments.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/overview/constants/evidence-status.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/overview/data/getEvidenceDashboard.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/overview/hooks/useAssigneeData.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/overview/hooks/useEvidenceData.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/overview/hooks/useFrameworkData.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/overview/hooks/useScrollPosition.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/overview/hooks/useStatusTranslation.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/overview/layout.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/overview/loading.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/overview/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/evidence/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/integrations/page.tsx (100%) create mode 100644 apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/layout.tsx rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/people/[employeeId]/actions/get-employee-details.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/people/[employeeId]/actions/update-department.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/people/[employeeId]/components/EditableDepartment.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/people/[employeeId]/components/EmployeeDetails.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/people/[employeeId]/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/people/[employeeId]/types/index.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/people/actions/get-employees.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/people/components/EmployeesList.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/people/components/EmployeesListSkeleton.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/people/components/table/EmployeesTable.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/people/components/table/columns.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/people/components/table/components/filterCategories.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/people/components/table/hooks/useEmployeesTableContext.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/people/components/table/types.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/people/hooks/useEmployee.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/people/hooks/useEmployees.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/people/layout.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/people/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/people/types.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/people/types/index.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/people/types/search-params.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/(overview)/layout.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/(overview)/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/(overview)/actions/get-policies.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/(overview)/components/PoliciesList.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/(overview)/components/PoliciesListSkeleton.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/(overview)/components/table/PoliciesTable.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/(overview)/components/table/columns.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/(overview)/components/table/components/filterCategories.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/(overview)/components/table/components/filterConfigs.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/(overview)/components/table/hooks/usePoliciesTableContext.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/(overview)/components/table/types.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/(overview)/components/table/utils.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/(overview)/hooks/usePolicies.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/(overview)/hooks/usePolicy.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/(overview)/layout.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/(overview)/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/(overview)/types/index.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/(overview)/types/search-params.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/[policyId]/editor/actions/get-policy-details.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/[policyId]/editor/actions/update-policy.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/[policyId]/editor/components/PolicyDetails.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/[policyId]/editor/components/PolicyHeader.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/[policyId]/editor/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/[policyId]/editor/types/index.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/[policyId]/layout.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/policies/all/[policyId]/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/risk/(overview)/layout.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/risk/(overview)/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/risk/[riskId]/comments/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/risk/[riskId]/layout.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/risk/[riskId]/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/risk/[riskId]/tasks/[taskId]/actions/getTaskAttachments.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/risk/[riskId]/tasks/[taskId]/hooks/useTaskAttachments.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/risk/[riskId]/tasks/[taskId]/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/risk/[riskId]/tasks/search-params.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/risk/register/RiskRegisterTable.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/risk/register/actions/getRisks.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/risk/register/components/table/RiskRegisterColumns.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/risk/register/components/table/RiskRegisterFilters.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/risk/register/hooks/useRisks.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/risk/register/layout.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/risk/register/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/risk/register/search-params.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/settings/api-keys/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/settings/layout.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/settings/members/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/settings/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/(overview)/layout.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/(overview)/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/all/[testId]/actions/assignTest.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/all/[testId]/actions/createTestComment.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/all/[testId]/actions/getTest.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/all/[testId]/actions/types.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/all/[testId]/components/AssigneeSection.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/all/[testId]/components/TestComments.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/all/[testId]/components/TestDetails.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/all/[testId]/hooks/useOrganizationAdmins.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/all/[testId]/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/all/actions/getOrganizationAdmins.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/all/actions/getTests.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/all/actions/refreshTests.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/all/components/TestsList.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/all/components/TestsListSkeleton.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/all/hooks/useTest.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/all/hooks/useTests.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/all/layout.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/all/page.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/all/types/index.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/tests/all/types/search-params.ts (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/vendors/(overview)/layout.tsx (100%) rename apps/app/src/app/[locale]/(app)/(dashboard)/{ => [orgId]}/vendors/(overview)/page.tsx (100%) delete mode 100644 apps/app/src/app/[locale]/(app)/(dashboard)/layout.tsx create mode 100644 apps/app/src/app/page.tsx create mode 100644 apps/app/src/components/organization-switcher.tsx create mode 100644 apps/app/src/data/getOrganizations.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/actions/getFrameworkCategoriesAction.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/actions/getFrameworkCategoriesAction.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/actions/getFrameworkCategoriesAction.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/actions/getFrameworkCategoriesAction.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/actions/getFrameworksAction.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/actions/getFrameworksAction.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/actions/getFrameworksAction.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/actions/getFrameworksAction.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/actions/selectFrameworksAction.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/actions/selectFrameworksAction.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/actions/selectFrameworksAction.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/actions/selectFrameworksAction.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/components/FrameworkProgress.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/components/FrameworkProgress.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/components/FrameworkProgress.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/components/FrameworkProgress.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/components/FrameworksGrid.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/components/FrameworksGrid.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/components/FrameworksGrid.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/components/FrameworksGrid.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/components/FrameworksOverview.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/components/FrameworksOverview.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/components/FrameworksOverview.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/components/FrameworksOverview.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/components/RequirementStatusChart.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/components/RequirementStatusChart.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/components/RequirementStatusChart.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/components/RequirementStatusChart.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/hooks/useFrameworks.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/hooks/useFrameworks.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/hooks/useFrameworks.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/hooks/useFrameworks.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/layout.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/layout.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/layout.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/actions/getOrganizationCategories.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/actions/getOrganizationCategories.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/actions/getOrganizationCategories.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/actions/getOrganizationCategories.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/actions/getOrganizationControlsProgress.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/actions/getOrganizationControlsProgress.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/actions/getOrganizationControlsProgress.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/actions/getOrganizationControlsProgress.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/actions/getOrganizationFramework.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/actions/getOrganizationFramework.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/actions/getOrganizationFramework.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/actions/getOrganizationFramework.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/components/FrameworkControls.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/components/FrameworkControls.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/components/FrameworkControls.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/components/FrameworkControls.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/components/FrameworkOverview.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/components/FrameworkOverview.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/components/FrameworkOverview.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/components/FrameworkOverview.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/components/table/FrameworkControlsTable.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/components/table/FrameworkControlsTable.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/components/table/FrameworkControlsTable.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/components/table/FrameworkControlsTable.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/components/table/FrameworkControlsTableColumns.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/components/table/FrameworkControlsTableColumns.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/components/table/FrameworkControlsTableColumns.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/components/table/FrameworkControlsTableColumns.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/components/table/FrameworkControlsTableHeader.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/components/table/FrameworkControlsTableHeader.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/components/table/FrameworkControlsTableHeader.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/components/table/FrameworkControlsTableHeader.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/hooks/useOrganizationCategories.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/hooks/useOrganizationCategories.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/hooks/useOrganizationCategories.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/hooks/useOrganizationCategories.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/hooks/useOrganizationFramework.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/hooks/useOrganizationFramework.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/hooks/useOrganizationFramework.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/hooks/useOrganizationFramework.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/[frameworkId]/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/[frameworkId]/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/actions/getOrganizationControl.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/actions/getOrganizationControl.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/actions/getOrganizationControl.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/actions/getOrganizationControl.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/actions/getOrganizationControlProgress.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/actions/getOrganizationControlProgress.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/actions/getOrganizationControlProgress.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/actions/getOrganizationControlProgress.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/actions/getOrganizationControlRequirements.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/actions/getOrganizationControlRequirements.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/actions/getOrganizationControlRequirements.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/actions/getOrganizationControlRequirements.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/components/SingleControl.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/components/SingleControl.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/components/SingleControl.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/components/SingleControl.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/components/SingleControlSkeleton.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/components/SingleControlSkeleton.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/components/SingleControlSkeleton.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/components/SingleControlSkeleton.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/components/table/ControlRequirementsTable.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/components/table/ControlRequirementsTable.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/components/table/ControlRequirementsTable.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/components/table/ControlRequirementsTable.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/components/table/ControlRequirementsTableColumns.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/components/table/ControlRequirementsTableColumns.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/components/table/ControlRequirementsTableColumns.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/components/table/ControlRequirementsTableColumns.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/components/table/ControlRequirementsTableHeader.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/components/table/ControlRequirementsTableHeader.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/components/table/ControlRequirementsTableHeader.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/components/table/ControlRequirementsTableHeader.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/components/table/types.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/components/table/types.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/components/table/types.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/components/table/types.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/hooks/useOrganizationControl.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/hooks/useOrganizationControl.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/hooks/useOrganizationControl.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/hooks/useOrganizationControl.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/hooks/useOrganizationControlProgress.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/hooks/useOrganizationControlProgress.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/hooks/useOrganizationControlProgress.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/hooks/useOrganizationControlProgress.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/hooks/useOrganizationControlRequirements.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/hooks/useOrganizationControlRequirements.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/hooks/useOrganizationControlRequirements.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/hooks/useOrganizationControlRequirements.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/overview/frameworks/controls/[id]/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/(home)/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/(home)/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/error.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/error.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/error.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/error.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/assignEvidence.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/actions/assignEvidence.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/assignEvidence.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/actions/assignEvidence.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/deleteEvidenceFile.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/actions/deleteEvidenceFile.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/deleteEvidenceFile.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/actions/deleteEvidenceFile.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/getEvidenceFileUrl.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/actions/getEvidenceFileUrl.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/getEvidenceFileUrl.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/actions/getEvidenceFileUrl.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/publishEvidence.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/actions/publishEvidence.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/publishEvidence.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/actions/publishEvidence.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/toggleRelevance.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/actions/toggleRelevance.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/toggleRelevance.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/actions/toggleRelevance.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/updateEvidenceDepartment.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/actions/updateEvidenceDepartment.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/updateEvidenceDepartment.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/actions/updateEvidenceDepartment.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/updateEvidenceFrequency.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/actions/updateEvidenceFrequency.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/updateEvidenceFrequency.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/actions/updateEvidenceFrequency.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/updateEvidenceUrls.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/actions/updateEvidenceUrls.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/updateEvidenceUrls.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/actions/updateEvidenceUrls.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/uploadEvidenceFile.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/actions/uploadEvidenceFile.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/actions/uploadEvidenceFile.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/actions/uploadEvidenceFile.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/AssigneeSection.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/AssigneeSection.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/AssigneeSection.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/AssigneeSection.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/DepartmentSection.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/DepartmentSection.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/DepartmentSection.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/DepartmentSection.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/EvidenceDetails.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/EvidenceDetails.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/EvidenceDetails.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/EvidenceDetails.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/FileCard.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/FileCard.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/FileCard.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/FileCard.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/FileIcon.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/FileIcon.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/FileIcon.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/FileIcon.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/FileSection.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/FileSection.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/FileSection.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/FileSection.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/FileUpload.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/FileUpload.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/FileUpload.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/FileUpload.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/FrequencySection.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/FrequencySection.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/FrequencySection.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/FrequencySection.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/ReviewDateCard.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/ReviewDateCard.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/ReviewDateCard.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/ReviewDateCard.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/ReviewSection.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/ReviewSection.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/ReviewSection.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/ReviewSection.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/UrlSection.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/UrlSection.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/components/UrlSection.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/components/UrlSection.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/edit/components/EditEvidenceForm.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/edit/components/EditEvidenceForm.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/edit/components/EditEvidenceForm.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/edit/components/EditEvidenceForm.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/edit/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/edit/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/edit/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/edit/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useFileDelete.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/hooks/useFileDelete.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useFileDelete.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/hooks/useFileDelete.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useFilePreview.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/hooks/useFilePreview.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useFilePreview.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/hooks/useFilePreview.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useFileUpload.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/hooks/useFileUpload.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useFileUpload.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/hooks/useFileUpload.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useOrganizationAdmins.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/hooks/useOrganizationAdmins.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useOrganizationAdmins.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/hooks/useOrganizationAdmins.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useOrganizationEvidence.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/hooks/useOrganizationEvidence.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useOrganizationEvidence.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/hooks/useOrganizationEvidence.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useUrlManagement.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/hooks/useUrlManagement.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/hooks/useUrlManagement.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/hooks/useUrlManagement.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/layout.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/layout.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/layout.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/types.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/types.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/[id]/types.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/[id]/types.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getAllOrganizationControlRequirements.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/actions/getAllOrganizationControlRequirements.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getAllOrganizationControlRequirements.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/actions/getAllOrganizationControlRequirements.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getEvidence.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/actions/getEvidence.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getEvidence.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/actions/getEvidence.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getEvidenceTasksStats.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/actions/getEvidenceTasksStats.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getEvidenceTasksStats.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/actions/getEvidenceTasksStats.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getOrganizationAdmins.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/actions/getOrganizationAdmins.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getOrganizationAdmins.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/actions/getOrganizationAdmins.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getOrganizationEmployees.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/actions/getOrganizationEmployees.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getOrganizationEmployees.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/actions/getOrganizationEmployees.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getOrganizationEvidence.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/actions/getOrganizationEvidence.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getOrganizationEvidence.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/actions/getOrganizationEvidence.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getOrganizationEvidenceTasks.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/actions/getOrganizationEvidenceTasks.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/actions/getOrganizationEvidenceTasks.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/actions/getOrganizationEvidenceTasks.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/constants.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/constants.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/constants.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/constants.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/hooks/useEvidenceTasks.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/hooks/useEvidenceTasks.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/hooks/useEvidenceTasks.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/hooks/useEvidenceTasks.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/hooks/useEvidenceTasksStats.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/hooks/useEvidenceTasksStats.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/hooks/useEvidenceTasksStats.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/hooks/useEvidenceTasksStats.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/EvidenceList.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/EvidenceList.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/EvidenceList.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/EvidenceList.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/EvidenceListUIStates.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/EvidenceListUIStates.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/EvidenceListUIStates.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/EvidenceListUIStates.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/EvidenceSummaryCards.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/EvidenceSummaryCards.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/EvidenceSummaryCards.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/EvidenceSummaryCards.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/index.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/index.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/index.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/index.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/table/EvidenceFilters/ActiveFilterBadges.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/table/EvidenceFilters/ActiveFilterBadges.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/table/EvidenceFilters/ActiveFilterBadges.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/table/EvidenceFilters/ActiveFilterBadges.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/table/EvidenceFilters/index.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/table/EvidenceFilters/index.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/table/EvidenceFilters/index.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/table/EvidenceFilters/index.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/table/EvidenceListColumns.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/table/EvidenceListColumns.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/table/EvidenceListColumns.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/table/EvidenceListColumns.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/table/EvidenceListHeader.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/table/EvidenceListHeader.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/table/EvidenceListHeader.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/table/EvidenceListHeader.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/table/EvidenceListTable.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/table/EvidenceListTable.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/table/EvidenceListTable.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/table/EvidenceListTable.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/table/components/AssigneeAvatar.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/table/components/AssigneeAvatar.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/table/components/AssigneeAvatar.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/table/components/AssigneeAvatar.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/table/components/filterCategories.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/table/components/filterCategories.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/table/components/filterCategories.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/table/components/filterCategories.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/table/components/filterConfigs.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/table/components/filterConfigs.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/table/components/filterConfigs.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/table/components/filterConfigs.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/table/index.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/table/index.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/components/table/index.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/components/table/index.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/hooks/useEvidenceTableContext.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/hooks/useEvidenceTableContext.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/hooks/useEvidenceTableContext.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/hooks/useEvidenceTableContext.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/layout.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/layout.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/layout.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/types.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/types.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/list/types.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/types.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/AnimatedBar.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/components/AnimatedBar.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/AnimatedBar.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/components/AnimatedBar.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/AssigneeChart/AssigneeBarChart.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/components/AssigneeChart/AssigneeBarChart.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/AssigneeChart/AssigneeBarChart.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/components/AssigneeChart/AssigneeBarChart.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/AssigneeChart/AssigneeChartRow.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/components/AssigneeChart/AssigneeChartRow.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/AssigneeChart/AssigneeChartRow.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/components/AssigneeChart/AssigneeChartRow.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/DepartmentChart/DepartmentBarChart.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/components/DepartmentChart/DepartmentBarChart.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/DepartmentChart/DepartmentBarChart.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/components/DepartmentChart/DepartmentBarChart.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/DepartmentChart/DepartmentChartRow.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/components/DepartmentChart/DepartmentChartRow.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/DepartmentChart/DepartmentChartRow.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/components/DepartmentChart/DepartmentChartRow.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/EvidenceOverview.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/components/EvidenceOverview.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/EvidenceOverview.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/components/EvidenceOverview.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/EvidenceUIStates.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/components/EvidenceUIStates.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/EvidenceUIStates.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/components/EvidenceUIStates.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/FrameworkChart/FrameworkBarChart.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/components/FrameworkChart/FrameworkBarChart.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/FrameworkChart/FrameworkBarChart.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/components/FrameworkChart/FrameworkBarChart.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/FrameworkChart/FrameworkChartRow.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/components/FrameworkChart/FrameworkChartRow.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/FrameworkChart/FrameworkChartRow.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/components/FrameworkChart/FrameworkChartRow.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/HorizontalBarChart.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/components/HorizontalBarChart.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/components/HorizontalBarChart.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/components/HorizontalBarChart.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/constants/departments.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/constants/departments.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/constants/departments.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/constants/departments.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/constants/evidence-status.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/constants/evidence-status.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/constants/evidence-status.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/constants/evidence-status.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/data/getEvidenceDashboard.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/data/getEvidenceDashboard.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/data/getEvidenceDashboard.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/data/getEvidenceDashboard.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/hooks/useAssigneeData.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/hooks/useAssigneeData.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/hooks/useAssigneeData.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/hooks/useAssigneeData.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/hooks/useEvidenceData.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/hooks/useEvidenceData.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/hooks/useEvidenceData.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/hooks/useEvidenceData.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/hooks/useFrameworkData.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/hooks/useFrameworkData.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/hooks/useFrameworkData.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/hooks/useFrameworkData.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/hooks/useScrollPosition.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/hooks/useScrollPosition.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/hooks/useScrollPosition.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/hooks/useScrollPosition.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/hooks/useStatusTranslation.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/hooks/useStatusTranslation.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/hooks/useStatusTranslation.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/hooks/useStatusTranslation.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/layout.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/layout.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/layout.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/loading.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/loading.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/loading.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/loading.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/overview/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/evidence/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/evidence/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/integrations/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/integrations/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/integrations/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/integrations/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/layout.tsx new file mode 100644 index 0000000000..b14581486d --- /dev/null +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/layout.tsx @@ -0,0 +1,46 @@ +import { auth } from "@/auth"; +import { Header } from "@/components/header"; +import { Sidebar } from "@/components/sidebar"; +import { db } from "@bubba/db"; +import dynamic from "next/dynamic"; +import { redirect } from "next/navigation"; +import { cache } from "react"; + +const HotKeys = dynamic( + () => import("@/components/hot-keys").then((mod) => mod.HotKeys), + { + ssr: true, + }, +); + +export default async function Layout({ + children, + params, +}: { + children: React.ReactNode; + params: Promise<{ orgId: string }>; +}) { + const session = await auth(); + const orgId = (await params).orgId; + + if (!session) { + redirect("/auth"); + } + + if (!orgId) { + redirect("/"); + } + + return ( +
+ + +
+
+
{children}
+
+ + +
+ ); +} diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/people/[employeeId]/actions/get-employee-details.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/[employeeId]/actions/get-employee-details.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/people/[employeeId]/actions/get-employee-details.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/[employeeId]/actions/get-employee-details.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/people/[employeeId]/actions/update-department.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/[employeeId]/actions/update-department.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/people/[employeeId]/actions/update-department.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/[employeeId]/actions/update-department.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/people/[employeeId]/components/EditableDepartment.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/[employeeId]/components/EditableDepartment.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/people/[employeeId]/components/EditableDepartment.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/[employeeId]/components/EditableDepartment.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/people/[employeeId]/components/EmployeeDetails.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/[employeeId]/components/EmployeeDetails.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/people/[employeeId]/components/EmployeeDetails.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/[employeeId]/components/EmployeeDetails.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/people/[employeeId]/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/[employeeId]/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/people/[employeeId]/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/[employeeId]/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/people/[employeeId]/types/index.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/[employeeId]/types/index.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/people/[employeeId]/types/index.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/[employeeId]/types/index.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/people/actions/get-employees.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/actions/get-employees.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/people/actions/get-employees.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/actions/get-employees.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/people/components/EmployeesList.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/components/EmployeesList.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/people/components/EmployeesList.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/components/EmployeesList.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/people/components/EmployeesListSkeleton.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/components/EmployeesListSkeleton.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/people/components/EmployeesListSkeleton.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/components/EmployeesListSkeleton.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/people/components/table/EmployeesTable.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/components/table/EmployeesTable.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/people/components/table/EmployeesTable.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/components/table/EmployeesTable.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/people/components/table/columns.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/components/table/columns.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/people/components/table/columns.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/components/table/columns.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/people/components/table/components/filterCategories.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/components/table/components/filterCategories.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/people/components/table/components/filterCategories.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/components/table/components/filterCategories.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/people/components/table/hooks/useEmployeesTableContext.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/components/table/hooks/useEmployeesTableContext.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/people/components/table/hooks/useEmployeesTableContext.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/components/table/hooks/useEmployeesTableContext.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/people/components/table/types.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/components/table/types.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/people/components/table/types.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/components/table/types.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/people/hooks/useEmployee.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/hooks/useEmployee.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/people/hooks/useEmployee.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/hooks/useEmployee.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/people/hooks/useEmployees.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/hooks/useEmployees.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/people/hooks/useEmployees.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/hooks/useEmployees.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/people/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/layout.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/people/layout.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/layout.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/people/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/people/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/people/types.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/types.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/people/types.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/types.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/people/types/index.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/types/index.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/people/types/index.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/types/index.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/people/types/search-params.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/types/search-params.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/people/types/search-params.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/people/types/search-params.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/(overview)/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/(overview)/layout.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/(overview)/layout.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/(overview)/layout.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/(overview)/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/(overview)/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/(overview)/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/(overview)/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/actions/get-policies.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/actions/get-policies.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/actions/get-policies.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/actions/get-policies.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/components/PoliciesList.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/PoliciesList.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/components/PoliciesList.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/PoliciesList.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/components/PoliciesListSkeleton.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/PoliciesListSkeleton.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/components/PoliciesListSkeleton.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/PoliciesListSkeleton.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/components/table/PoliciesTable.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/table/PoliciesTable.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/components/table/PoliciesTable.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/table/PoliciesTable.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/components/table/columns.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/table/columns.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/components/table/columns.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/table/columns.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/components/table/components/filterCategories.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/table/components/filterCategories.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/components/table/components/filterCategories.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/table/components/filterCategories.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/components/table/components/filterConfigs.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/table/components/filterConfigs.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/components/table/components/filterConfigs.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/table/components/filterConfigs.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/components/table/hooks/usePoliciesTableContext.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/table/hooks/usePoliciesTableContext.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/components/table/hooks/usePoliciesTableContext.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/table/hooks/usePoliciesTableContext.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/components/table/types.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/table/types.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/components/table/types.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/table/types.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/components/table/utils.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/table/utils.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/components/table/utils.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/table/utils.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/hooks/usePolicies.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/hooks/usePolicies.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/hooks/usePolicies.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/hooks/usePolicies.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/hooks/usePolicy.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/hooks/usePolicy.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/hooks/usePolicy.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/hooks/usePolicy.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/layout.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/layout.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/layout.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/types/index.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/types/index.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/types/index.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/types/index.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/types/search-params.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/types/search-params.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/(overview)/types/search-params.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/types/search-params.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/editor/actions/get-policy-details.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/editor/actions/get-policy-details.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/editor/actions/get-policy-details.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/editor/actions/get-policy-details.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/editor/actions/update-policy.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/editor/actions/update-policy.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/editor/actions/update-policy.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/editor/actions/update-policy.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/editor/components/PolicyDetails.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/editor/components/PolicyDetails.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/editor/components/PolicyDetails.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/editor/components/PolicyDetails.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/editor/components/PolicyHeader.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/editor/components/PolicyHeader.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/editor/components/PolicyHeader.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/editor/components/PolicyHeader.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/editor/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/editor/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/editor/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/editor/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/editor/types/index.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/editor/types/index.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/editor/types/index.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/editor/types/index.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/layout.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/layout.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/layout.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/policies/all/[policyId]/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/risk/(overview)/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/(overview)/layout.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/risk/(overview)/layout.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/(overview)/layout.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/risk/(overview)/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/(overview)/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/risk/(overview)/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/(overview)/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/risk/[riskId]/comments/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/[riskId]/comments/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/risk/[riskId]/comments/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/[riskId]/comments/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/risk/[riskId]/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/[riskId]/layout.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/risk/[riskId]/layout.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/[riskId]/layout.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/risk/[riskId]/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/[riskId]/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/risk/[riskId]/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/[riskId]/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/risk/[riskId]/tasks/[taskId]/actions/getTaskAttachments.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/[riskId]/tasks/[taskId]/actions/getTaskAttachments.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/risk/[riskId]/tasks/[taskId]/actions/getTaskAttachments.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/[riskId]/tasks/[taskId]/actions/getTaskAttachments.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/risk/[riskId]/tasks/[taskId]/hooks/useTaskAttachments.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/[riskId]/tasks/[taskId]/hooks/useTaskAttachments.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/risk/[riskId]/tasks/[taskId]/hooks/useTaskAttachments.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/[riskId]/tasks/[taskId]/hooks/useTaskAttachments.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/risk/[riskId]/tasks/[taskId]/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/[riskId]/tasks/[taskId]/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/risk/[riskId]/tasks/[taskId]/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/[riskId]/tasks/[taskId]/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/risk/[riskId]/tasks/search-params.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/[riskId]/tasks/search-params.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/risk/[riskId]/tasks/search-params.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/[riskId]/tasks/search-params.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/risk/register/RiskRegisterTable.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/register/RiskRegisterTable.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/risk/register/RiskRegisterTable.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/register/RiskRegisterTable.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/risk/register/actions/getRisks.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/register/actions/getRisks.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/risk/register/actions/getRisks.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/register/actions/getRisks.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/risk/register/components/table/RiskRegisterColumns.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/register/components/table/RiskRegisterColumns.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/risk/register/components/table/RiskRegisterColumns.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/register/components/table/RiskRegisterColumns.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/risk/register/components/table/RiskRegisterFilters.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/register/components/table/RiskRegisterFilters.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/risk/register/components/table/RiskRegisterFilters.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/register/components/table/RiskRegisterFilters.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/risk/register/hooks/useRisks.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/register/hooks/useRisks.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/risk/register/hooks/useRisks.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/register/hooks/useRisks.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/risk/register/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/register/layout.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/risk/register/layout.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/register/layout.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/risk/register/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/register/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/risk/register/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/register/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/risk/register/search-params.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/register/search-params.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/risk/register/search-params.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/risk/register/search-params.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/settings/api-keys/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/settings/api-keys/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/settings/api-keys/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/settings/api-keys/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/settings/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/settings/layout.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/settings/layout.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/settings/layout.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/settings/members/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/settings/members/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/settings/members/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/settings/members/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/settings/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/settings/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/settings/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/settings/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/(overview)/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/(overview)/layout.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/(overview)/layout.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/(overview)/layout.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/(overview)/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/(overview)/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/(overview)/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/(overview)/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/[testId]/actions/assignTest.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/[testId]/actions/assignTest.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/[testId]/actions/assignTest.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/[testId]/actions/assignTest.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/[testId]/actions/createTestComment.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/[testId]/actions/createTestComment.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/[testId]/actions/createTestComment.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/[testId]/actions/createTestComment.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/[testId]/actions/getTest.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/[testId]/actions/getTest.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/[testId]/actions/getTest.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/[testId]/actions/getTest.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/[testId]/actions/types.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/[testId]/actions/types.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/[testId]/actions/types.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/[testId]/actions/types.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/[testId]/components/AssigneeSection.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/[testId]/components/AssigneeSection.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/[testId]/components/AssigneeSection.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/[testId]/components/AssigneeSection.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/[testId]/components/TestComments.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/[testId]/components/TestComments.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/[testId]/components/TestComments.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/[testId]/components/TestComments.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/[testId]/components/TestDetails.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/[testId]/components/TestDetails.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/[testId]/components/TestDetails.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/[testId]/components/TestDetails.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/[testId]/hooks/useOrganizationAdmins.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/[testId]/hooks/useOrganizationAdmins.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/[testId]/hooks/useOrganizationAdmins.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/[testId]/hooks/useOrganizationAdmins.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/[testId]/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/[testId]/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/[testId]/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/[testId]/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/actions/getOrganizationAdmins.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/actions/getOrganizationAdmins.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/actions/getOrganizationAdmins.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/actions/getOrganizationAdmins.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/actions/getTests.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/actions/getTests.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/actions/getTests.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/actions/getTests.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/actions/refreshTests.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/actions/refreshTests.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/actions/refreshTests.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/actions/refreshTests.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/components/TestsList.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/components/TestsList.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/components/TestsList.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/components/TestsList.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/components/TestsListSkeleton.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/components/TestsListSkeleton.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/components/TestsListSkeleton.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/components/TestsListSkeleton.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/hooks/useTest.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/hooks/useTest.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/hooks/useTest.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/hooks/useTest.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/hooks/useTests.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/hooks/useTests.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/hooks/useTests.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/hooks/useTests.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/layout.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/layout.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/layout.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/types/index.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/types/index.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/types/index.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/types/index.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/types/search-params.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/types/search-params.ts similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/tests/all/types/search-params.ts rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/types/search-params.ts diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/(overview)/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/vendors/(overview)/layout.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/vendors/(overview)/layout.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/vendors/(overview)/layout.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/vendors/(overview)/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/vendors/(overview)/page.tsx similarity index 100% rename from apps/app/src/app/[locale]/(app)/(dashboard)/vendors/(overview)/page.tsx rename to apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/vendors/(overview)/page.tsx diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/layout.tsx deleted file mode 100644 index c5be7799bc..0000000000 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/layout.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { auth } from "@/auth"; -import { Header } from "@/components/header"; -import { Sidebar } from "@/components/sidebar"; -import { db } from "@bubba/db"; -import dynamic from "next/dynamic"; -import { redirect } from "next/navigation"; -import { cache } from "react"; - -const HotKeys = dynamic( - () => import("@/components/hot-keys").then((mod) => mod.HotKeys), - { - ssr: true, - }, -); - -export default async function Layout({ - children, -}: { - children: React.ReactNode; -}) { - const session = await auth(); - - if (!session?.user || !session.user.organizationId) { - redirect("/auth"); - } - - const isSetup = await isOrganizationSetup(session.user.organizationId); - - if (!isSetup) { - redirect("/setup"); - } - - return ( -
- - -
-
-
{children}
-
- - -
- ); -} - -const isOrganizationSetup = cache(async (organizationId: string) => { - const organization = await db.organization.findUnique({ - where: { - id: organizationId, - }, - select: { - setup: true, - }, - }); - - return organization?.setup; -}); diff --git a/apps/app/src/app/page.tsx b/apps/app/src/app/page.tsx new file mode 100644 index 0000000000..e0ead87c27 --- /dev/null +++ b/apps/app/src/app/page.tsx @@ -0,0 +1,16 @@ +import { auth } from "@/auth"; +import { redirect } from "next/navigation"; + +export default async function RootPage() { + const session = await auth(); + + if (!session) { + redirect("/auth"); + } + + if (session.user?.organizationId) { + redirect(`/${session.user.organizationId}`); + } + + redirect("/setup"); +} diff --git a/apps/app/src/components/header.tsx b/apps/app/src/components/header.tsx index e5332d5f83..a6ef3e371a 100644 --- a/apps/app/src/components/header.tsx +++ b/apps/app/src/components/header.tsx @@ -8,39 +8,49 @@ import { Suspense } from "react"; import { FeedbackForm } from "./feedback-form"; import { MobileMenu } from "./mobile-menu"; import { NotificationCenter } from "./notification-center"; +import { OrganizationSwitcher } from "./organization-switcher"; +import { getOrganizations } from "@/data/getOrganizations"; export async function Header() { - const t = await getI18n(); + const t = await getI18n(); + const { organizations, currentOrganization } = await getOrganizations(); - return ( -
- + return ( +
+ -
-
- - -
+ }> + + - +
+
+ + +
- }> - - -
-
- ); + + + }> + + + +
+ ); } diff --git a/apps/app/src/components/organization-switcher.tsx b/apps/app/src/components/organization-switcher.tsx new file mode 100644 index 0000000000..0b4152c94f --- /dev/null +++ b/apps/app/src/components/organization-switcher.tsx @@ -0,0 +1,66 @@ +"use client"; + +import { Button } from "@bubba/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@bubba/ui/dropdown-menu"; +import { Building2, ChevronDown, Plus } from "lucide-react"; +import { useRouter } from "next/navigation"; + +interface Organization { + id: string; + name: string; +} + +interface OrganizationSwitcherProps { + organizations: Organization[]; + currentOrganization: Organization; +} + +export function OrganizationSwitcher({ + organizations, + currentOrganization, +}: OrganizationSwitcherProps) { + const router = useRouter(); + + const handleOrganizationChange = (organizationId: string) => { + router.push(`/organization/${organizationId}`); + }; + + return ( + + + + + + {organizations.map((org) => ( + handleOrganizationChange(org.id)} + className="flex items-center gap-2 cursor-pointer" + > + {org.name} + + ))} + { + router.push("/setup"); + }} + > + + Create new org + + + + ); +} diff --git a/apps/app/src/data/getOrganizations.ts b/apps/app/src/data/getOrganizations.ts new file mode 100644 index 0000000000..b406bbf379 --- /dev/null +++ b/apps/app/src/data/getOrganizations.ts @@ -0,0 +1,34 @@ +import { db } from "@bubba/db"; +import { auth } from "@/auth"; + +export async function getOrganizations() { + const session = await auth(); + const user = session?.user; + + if (!user) { + throw new Error("Not authenticated"); + } + + const organizations = await db.organization.findMany({ + where: { + users: { + some: { + id: user.id, + }, + }, + }, + select: { + id: true, + name: true, + }, + }); + + const currentOrganization = + organizations.find((org) => org.id === user.organizationId) || + organizations[0]; + + return { + organizations, + currentOrganization, + }; +} diff --git a/apps/app/src/hooks/use-compliance-scores.ts b/apps/app/src/hooks/use-compliance-scores.ts index dcdba51e7f..e207de7693 100644 --- a/apps/app/src/hooks/use-compliance-scores.ts +++ b/apps/app/src/hooks/use-compliance-scores.ts @@ -1,14 +1,14 @@ "use client"; import { useMemo } from "react"; -import { usePolicies } from "@/app/[locale]/(app)/(dashboard)/policies/all/(overview)/hooks/usePolicies"; -import { useTests } from "@/app/[locale]/(app)/(dashboard)/tests/all/hooks/useTests"; +import { usePolicies } from "@/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/hooks/usePolicies"; +import { useTests } from "@/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/hooks/useTests"; import type { Framework, OrganizationControl, OrganizationFramework, } from "@bubba/db/types"; -import { useOrganizationEvidenceTasks } from "@/app/[locale]/(app)/(dashboard)/evidence/hooks/useEvidenceTasks"; +import { useOrganizationEvidenceTasks } from "@/app/[locale]/(app)/(dashboard)/[orgId]/evidence/hooks/useEvidenceTasks"; import { usePoliciesByFramework } from "./use-policies-by-framework"; interface UseComplianceScoresProps { diff --git a/apps/app/src/middleware.ts b/apps/app/src/middleware.ts index 2459c3854c..b83a6d940d 100644 --- a/apps/app/src/middleware.ts +++ b/apps/app/src/middleware.ts @@ -1,31 +1,47 @@ import { createI18nMiddleware } from "next-international/middleware"; import type { NextRequest } from "next/server"; +import { NextResponse } from "next/server"; const I18nMiddleware = createI18nMiddleware({ - locales: ["en", "es", "fr", "no", "pt"], - defaultLocale: "en", - urlMappingStrategy: "rewrite", + locales: ["en", "es", "fr", "no", "pt"], + defaultLocale: "en", + urlMappingStrategy: "rewrite", }); export async function middleware(request: NextRequest) { - const response = await I18nMiddleware(request); - const nextUrl = request.nextUrl; + // Only handle root path redirects + if (request.nextUrl.pathname === "/") { + const hasSession = request.cookies.has("authjs.session-token"); - const pathnameLocale = nextUrl.pathname.split("/", 2)?.[1]; + if (!hasSession) { + // If not authenticated, redirect to auth + return NextResponse.redirect(new URL("/auth", request.url)); + } - const pathnameWithoutLocale = pathnameLocale - ? nextUrl.pathname.slice(pathnameLocale.length + 1) - : nextUrl.pathname; + // If authenticated, let the page handle the redirection + // This way we avoid Prisma in middleware + return NextResponse.next(); + } - const newUrl = new URL(pathnameWithoutLocale || "/", request.url); + const response = await I18nMiddleware(request); + const nextUrl = request.nextUrl; - response.headers.set("x-pathname", request.nextUrl.pathname); + const pathnameLocale = nextUrl.pathname.split("/", 2)?.[1]; - return response; + const pathnameWithoutLocale = pathnameLocale + ? nextUrl.pathname.slice(pathnameLocale.length + 1) + : nextUrl.pathname; + + const newUrl = new URL(pathnameWithoutLocale || "/", request.url); + + response.headers.set("x-pathname", request.nextUrl.pathname); + + return response; } export const config = { - matcher: [ - "/((?!api|_next/static|_next/image|favicon.ico|monitoring|ingest).*)", - ], + matcher: [ + // Skip auth-related routes + "/((?!api|_next/static|_next/image|favicon.ico|monitoring|ingest|auth/callback|auth/signin|auth/signout).*)", + ], }; From a03a9f9c3448f03424c2dbe5e571372c4ed09983 Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Wed, 19 Mar 2025 11:59:43 -0400 Subject: [PATCH 3/9] fix yarn --- yarn.lock | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/yarn.lock b/yarn.lock index f8833c6da8..ea2ff66ef8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1041,18 +1041,19 @@ formdata-node "^4.3.2" node-fetch "^2.6.7" -"@bubba/analytics@packages/analytics": +"@bubba/analytics@^workspace:packages/analytics": version "workspace:packages/analytics" resolved "workspace:packages/analytics" dependencies: posthog-js "^1.215.3" posthog-node "^4.4.1" -"@bubba/db@packages/db", "@bubba/db@workspace:*": +"@bubba/db@^workspace:packages/db", "@bubba/db@workspace:*": version "workspace:packages/db" resolved "workspace:packages/db" devDependencies: "@bubba/tsconfig" "workspace:*" + devDependencies: typescript "^5.8.2" dependencies: "@auth/prisma-adapter" "^2.8.0" @@ -1062,7 +1063,7 @@ "@prisma/extension-accelerate" "^1.2.2" prisma "^6.5.0" -"@bubba/email@packages/email": +"@bubba/email@^workspace:packages/email": version "workspace:packages/email" resolved "workspace:packages/email" devDependencies: @@ -1082,7 +1083,7 @@ react-email "3.0.4" responsive-react-email "^0.0.5" -"@bubba/integrations@packages/integrations": +"@bubba/integrations@^workspace:packages/integrations": version "workspace:packages/integrations" resolved "workspace:packages/integrations" devDependencies: @@ -1096,14 +1097,14 @@ sharp "^0.33.5" zod "^3.24.2" -"@bubba/kv@packages/kv": +"@bubba/kv@^workspace:packages/kv": version "workspace:packages/kv" resolved "workspace:packages/kv" dependencies: "@upstash/redis" "^1.34.2" server-only "0.0.1" -"@bubba/notifications@packages/notifications", "@bubba/notifications@workspace:*": +"@bubba/notifications@^workspace:packages/notifications", "@bubba/notifications@workspace:*": version "workspace:packages/notifications" resolved "workspace:packages/notifications" devDependencies: @@ -1112,11 +1113,11 @@ "@novu/node" "^2.0.1" nanoid "5.1.0" -"@bubba/tsconfig@packages/tsconfig", "@bubba/tsconfig@workspace:*": +"@bubba/tsconfig@^workspace:packages/tsconfig", "@bubba/tsconfig@workspace:*": version "workspace:packages/tsconfig" resolved "workspace:packages/tsconfig" -"@bubba/ui@packages/ui", "@bubba/ui@workspace:*": +"@bubba/ui@^workspace:packages/ui", "@bubba/ui@workspace:*": version "workspace:packages/ui" resolved "workspace:packages/ui" devDependencies: @@ -1180,7 +1181,7 @@ use-callback-ref "^1.3.3" vaul "^1.0.0" -"@bubba/utils@packages/utils", "@bubba/utils@workspace:*": +"@bubba/utils@^workspace:packages/utils", "@bubba/utils@workspace:*": version "workspace:packages/utils" resolved "workspace:packages/utils" devDependencies: @@ -6335,7 +6336,7 @@ commander@11.1.0: resolved "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz" integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== -"comp.ai@apps/app": +comp.ai@^workspace:apps/app: version "workspace:apps/app" resolved "workspace:apps/app" devDependencies: @@ -10892,12 +10893,13 @@ plist@^3.1.0: base64-js "^1.5.1" xmlbuilder "^15.1.1" -"portal@apps/portal": +portal@^workspace:apps/portal: version "workspace:apps/portal" resolved "workspace:apps/portal" devDependencies: "@bubba/db" "workspace:*" "@bubba/ui" "workspace:*" + devDependencies: "@types/node" "^22.13.2" "@types/react" "^19.0.8" "@types/react-dom" "^19.0.3" @@ -13453,7 +13455,7 @@ uuid@^11.1.0: resolved "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz" integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== -"valibot@1.0.0-beta.15", "valibot@>= 0.36.0": +"valibot@1.0.0-beta.15", "valibot@>= 0.36.0", "valibot@^1.0.0-beta.7 || ^1.0.0": version "1.0.0-beta.15" resolved "https://registry.npmjs.org/valibot/-/valibot-1.0.0-beta.15.tgz" integrity sha512-BKy8XosZkDHWmYC+cJG74LBzP++Gfntwi33pP3D3RKztz2XV9jmFWnkOi21GoqARP8wAWARwhV6eTr1JcWzjGw== @@ -13880,7 +13882,7 @@ zod@3.23.8: resolved "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz" integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== -"zod@>= 3", zod@^3.0.0, zod@^3.18.0, zod@^3.20.2, zod@^3.24.1, zod@^3.24.2: +"zod@>= 3", zod@^3.0.0, zod@^3.18.0, zod@^3.20.2, zod@^3.24.0, zod@^3.24.1, zod@^3.24.2: version "3.24.2" resolved "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz" integrity sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ== From f5b5f8dd63bb2a9ed2c8ee1cd28f868d62db2c6b Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Wed, 19 Mar 2025 16:04:45 -0400 Subject: [PATCH 4/9] fix policies paths and some other stuff --- apps/app/src/actions/change-organization.ts | 59 +++ .../create-organization-action.ts | 111 ++-- .../src/actions/policies/create-new-policy.ts | 121 +++-- .../actions/policies/update-policy-action.ts | 8 +- .../policies/update-policy-form-action.ts | 25 +- .../policies/update-policy-overview-action.ts | 10 +- .../actions/policy/create-policy-comment.ts | 2 +- .../(home)/components/FrameworkProgress.tsx | 323 ++++++------ .../table/ControlRequirementsTable.tsx | 11 +- .../[orgId]/evidence/list/layout.tsx | 41 +- .../[orgId]/evidence/list/loading.tsx | 16 + .../[orgId]/evidence/overview/layout.tsx | 41 +- .../[orgId]/policies/(overview)/layout.tsx | 38 +- .../[orgId]/policies/(overview)/page.tsx | 166 +++--- .../components/table/PoliciesTable.tsx | 15 +- .../policies/all/(overview)/layout.tsx | 38 +- .../editor/components/PolicyDetails.tsx | 100 ++-- .../policies/all/[policyId]/editor/page.tsx | 35 +- .../policies/all/[policyId]/layout.tsx | 96 ++-- .../[orgId]/policies/all/[policyId]/page.tsx | 65 +-- .../[orgId]/settings/members/loading.tsx | 104 ++-- .../[orgId]/tests/(overview)/layout.tsx | 39 +- .../[orgId]/tests/(overview)/page.tsx | 167 +++--- .../[orgId]/tests/all/hooks/useTest.ts | 17 +- .../(dashboard)/[orgId]/tests/all/layout.tsx | 13 +- .../app/src/app/[locale]/(app)/setup/page.tsx | 44 +- apps/app/src/auth/config.ts | 135 ++--- apps/app/src/auth/org.ts | 126 ++--- .../forms/create-organization-form.tsx | 479 +++++++++--------- .../forms/create-test-comment-form.tsx | 166 +++--- apps/app/src/components/google-sign-in.tsx | 56 +- apps/app/src/components/header.tsx | 16 +- apps/app/src/components/main-menu.tsx | 150 ++++-- apps/app/src/components/mobile-menu.tsx | 47 +- .../src/components/organization-switcher.tsx | 33 +- .../policies/charts/policies-by-framework.tsx | 2 +- .../components/sheets/invite-user-sheet.tsx | 2 +- .../components/sheets/test-comment-sheet.tsx | 102 ++-- apps/app/src/components/sidebar.tsx | 46 +- .../components/tables/policies/columns.tsx | 117 ++--- .../tables/policies/empty-states.tsx | 70 +-- .../components/tables/tests/data-table.tsx | 368 +++++++------- .../tables/tests/filter-toolbar.tsx | 197 +++---- .../components/ui/data-table/DataTable.tsx | 2 +- .../ui/data-table/DataTableSkeleton.tsx | 72 ++- apps/app/src/data/getOrganizations.ts | 20 +- apps/app/src/middleware.ts | 12 +- packages/db/docker-compose.yml | 6 +- packages/docs/development.mdx | 25 +- 49 files changed, 2093 insertions(+), 1861 deletions(-) create mode 100644 apps/app/src/actions/change-organization.ts create mode 100644 apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/loading.tsx diff --git a/apps/app/src/actions/change-organization.ts b/apps/app/src/actions/change-organization.ts new file mode 100644 index 0000000000..c8ad0fda76 --- /dev/null +++ b/apps/app/src/actions/change-organization.ts @@ -0,0 +1,59 @@ +"use server"; + +import { authActionClient } from "./safe-action"; +import { z } from "zod"; +import { db } from "@bubba/db"; + +export const changeOrganizationAction = authActionClient + .schema( + z.object({ + organizationId: z.string(), + }) + ) + .metadata({ + name: "change-organization", + track: { + event: "create-employee", + channel: "server", + }, + }) + .action(async ({ parsedInput, ctx }) => { + const { organizationId } = parsedInput; + const { user } = ctx; + + try { + const organization = await db.organization.findUnique({ + where: { + id: organizationId, + }, + }); + + if (!organization) { + return { + success: false, + error: "Organization not found", + }; + } + + await db.user.update({ + where: { + id: user.id, + }, + data: { + organizationId: organization.id, + }, + }); + + return { + success: true, + data: organization, + }; + } catch (error) { + console.error("Error changing organization:", error); + + return { + success: false, + error: "Failed to change organization", + }; + } + }); diff --git a/apps/app/src/actions/organization/create-organization-action.ts b/apps/app/src/actions/organization/create-organization-action.ts index 21432c933f..728e4f54c4 100644 --- a/apps/app/src/actions/organization/create-organization-action.ts +++ b/apps/app/src/actions/organization/create-organization-action.ts @@ -1,73 +1,56 @@ -// update-organization-action.ts - "use server"; import { createOrganizationAndConnectUser } from "@/auth/org"; -import { db } from "@bubba/db"; import { authActionClient } from "../safe-action"; import { organizationSchema } from "../schema"; import { tasks } from "@trigger.dev/sdk/v3"; import type { createOrganizationTask } from "@/jobs/tasks/organization/create-organization"; export const createOrganizationAction = authActionClient - .schema(organizationSchema) - .metadata({ - name: "create-organization", - track: { - event: "create-organization", - channel: "server", - }, - }) - .action(async ({ parsedInput, ctx }) => { - const { name, website, frameworks } = parsedInput; - const { id: userId, organizationId } = ctx.user; - - if (!name || !website) { - console.log("Invalid input detected:", { name, website }); - throw new Error("Invalid user input"); - } - - if (!organizationId) { - await createOrganizationAndConnectUser({ - userId, - normalizedEmail: ctx.user.email!, - }); - } - - const organization = await db.organization.findFirst({ - where: { - users: { - some: { - id: userId, - }, - }, - }, - }); - - if (!organization) { - throw new Error("Organization not found"); - } - - try { - const handle = await tasks.trigger( - "create-organization", - { - userId, - fullName: name, - website, - frameworkIds: frameworks, - organizationId: organization.id, - }, - ); - - return { - success: true, - runId: handle.id, - publicAccessToken: handle.publicAccessToken, - }; - } catch (error) { - console.error("Error during organization update:", error); - - throw new Error("Failed to update organization"); - } - }); + .schema(organizationSchema) + .metadata({ + name: "create-organization", + track: { + event: "create-organization", + channel: "server", + }, + }) + .action(async ({ parsedInput, ctx }) => { + const { name, website, frameworks } = parsedInput; + const { id: userId } = ctx.user; + + if (!name || !website) { + console.log("Invalid input detected:", { name, website }); + throw new Error("Invalid user input"); + } + + const newOrganization = await createOrganizationAndConnectUser({ + userId, + normalizedEmail: ctx.user.email!, + orgName: name, + }); + + try { + const handle = await tasks.trigger( + "create-organization", + { + userId, + fullName: name, + website, + frameworkIds: frameworks, + organizationId: newOrganization.id, + } + ); + + return { + success: true, + runId: handle.id, + publicAccessToken: handle.publicAccessToken, + newOrganization, + }; + } catch (error) { + console.error("Error during organization update:", error); + + throw new Error("Failed to update organization"); + } + }); diff --git a/apps/app/src/actions/policies/create-new-policy.ts b/apps/app/src/actions/policies/create-new-policy.ts index ec1594e558..63c176b6fb 100644 --- a/apps/app/src/actions/policies/create-new-policy.ts +++ b/apps/app/src/actions/policies/create-new-policy.ts @@ -1,76 +1,73 @@ "use server"; import { db } from "@bubba/db"; -import { - Departments, - Frequency, -} from "@bubba/db/types"; +import { Departments, Frequency } from "@bubba/db/types"; import { revalidatePath, revalidateTag } from "next/cache"; import { authActionClient } from "../safe-action"; import { createPolicySchema } from "../schema"; export const createPolicyAction = authActionClient - .schema(createPolicySchema) - .metadata({ - name: "create-policy", - track: { - event: "create-policy", - channel: "server", - }, - }) - .action(async ({ parsedInput, ctx }) => { - const { title, description, frameworkIds, controlIds } = parsedInput; - const { user } = ctx; + .schema(createPolicySchema) + .metadata({ + name: "create-policy", + track: { + event: "create-policy", + channel: "server", + }, + }) + .action(async ({ parsedInput, ctx }) => { + const { title, description, frameworkIds, controlIds } = parsedInput; + const { user } = ctx; - if (!user || !user.organizationId) { - return { - success: false, - error: "Not authorized", - }; - } + if (!user || !user.organizationId) { + return { + success: false, + error: "Not authorized", + }; + } - try { - const policy = await db.policy.create({ - data: { - slug: title, - name: title, - description, - content: [ - { type: "paragraph", content: [{ type: "text", text: "" }] }, - ], - usedBy: JSON.stringify([]), - policyFrameworks: { - create: frameworkIds.map((id) => ({ frameworkId: id })), - }, - PolicyControl: { - create: controlIds.map((id) => ({ controlId: id })), - }, - }, - }); + try { + const policy = await db.policy.create({ + data: { + slug: title, + name: title, + description, + content: [ + { type: "paragraph", content: [{ type: "text", text: "" }] }, + ], + usedBy: JSON.stringify([]), + policyFrameworks: { + create: frameworkIds.map((id) => ({ frameworkId: id })), + }, + PolicyControl: { + create: controlIds.map((id) => ({ controlId: id })), + }, + }, + }); - await db.organizationPolicy.create({ - data: { - organizationId: user.organizationId, - policyId: policy.id, - ownerId: user.id, - department: Departments.none, - frequency: Frequency.monthly, - }, - }); + await db.organizationPolicy.create({ + data: { + organizationId: user.organizationId, + policyId: policy.id, + ownerId: user.id, + department: Departments.none, + frequency: Frequency.monthly, + }, + }); - revalidatePath("/policies"); - revalidateTag("policies"); + revalidatePath(`/${user.organizationId}/policies`); + revalidateTag("policies"); - return { - success: true, - policyId: policy.id, - }; - } catch (error) { - console.error(error); + return { + success: true, + policyId: policy.id, + }; + } catch (error) { + console.error(error); - return { - success: false, - error: "Failed to create policy", - }; - } - }); + return { + success: false, + error: "Failed to create policy", + }; + } + }); diff --git a/apps/app/src/actions/policies/update-policy-action.ts b/apps/app/src/actions/policies/update-policy-action.ts index 014b944ae5..f75dc79c40 100644 --- a/apps/app/src/actions/policies/update-policy-action.ts +++ b/apps/app/src/actions/policies/update-policy-action.ts @@ -17,7 +17,7 @@ interface ContentNode { // Simplified content processor that creates a new plain object function processContent( - content: ContentNode | ContentNode[], + content: ContentNode | ContentNode[] ): ContentNode | ContentNode[] { if (!content) return content; @@ -87,7 +87,7 @@ export const updatePolicyAction = authActionClient // Create a new plain object from the content const processedContent = JSON.parse( - JSON.stringify(processContent(content as ContentNode)), + JSON.stringify(processContent(content as ContentNode)) ); await db.organizationPolicy.update({ @@ -95,8 +95,8 @@ export const updatePolicyAction = authActionClient data: { content: processedContent.content }, }); - revalidatePath(`/policies/${id}`); - revalidatePath("/policies"); + revalidatePath(`/${user.organizationId}/policies/${id}`); + revalidatePath(`/${user.organizationId}/policies`); revalidateTag(`user_${user.id}`); return { diff --git a/apps/app/src/actions/policies/update-policy-form-action.ts b/apps/app/src/actions/policies/update-policy-form-action.ts index 74dfef2371..3743c528e2 100644 --- a/apps/app/src/actions/policies/update-policy-form-action.ts +++ b/apps/app/src/actions/policies/update-policy-form-action.ts @@ -11,7 +11,7 @@ import { PolicyStatus } from "@bubba/db/types"; // Helper function to calculate next review date based on frequency function calculateNextReviewDate( frequency: string, - baseDate: Date = new Date(), + baseDate: Date = new Date() ): Date { const nextDate = new Date(baseDate); @@ -43,8 +43,15 @@ export const updatePolicyFormAction = authActionClient }, }) .action(async ({ parsedInput, ctx }) => { - const { id, status, ownerId, department, review_frequency, review_date, isRequiredToSign } = - parsedInput; + const { + id, + status, + ownerId, + department, + review_frequency, + review_date, + isRequiredToSign, + } = parsedInput; const { user } = ctx; if (!user.id || !user.organizationId) { @@ -95,26 +102,26 @@ export const updatePolicyFormAction = authActionClient if (isRequiredToSign !== undefined) { const orgPolicy = await db.organizationPolicy.findUnique({ where: { id }, - select: { + select: { policyId: true, }, }); - + if (orgPolicy?.policyId) { // Update the policy using the Prisma client with type assertion await db.policy.update({ where: { id: orgPolicy.policyId }, - data: { + data: { // Use type assertion to handle the new field // that might not be in the generated types yet - isRequiredToSign: isRequiredToSign === "required" + isRequiredToSign: isRequiredToSign === "required", } as any, }); } } - revalidatePath("/policies"); - revalidatePath(`/policies/all/${id}`); + revalidatePath(`/${user.organizationId}/policies`); + revalidatePath(`/${user.organizationId}/policies/all/${id}`); revalidateTag("policies"); return { diff --git a/apps/app/src/actions/policies/update-policy-overview-action.ts b/apps/app/src/actions/policies/update-policy-overview-action.ts index f3e9830ac6..4a821c12f6 100644 --- a/apps/app/src/actions/policies/update-policy-overview-action.ts +++ b/apps/app/src/actions/policies/update-policy-overview-action.ts @@ -51,15 +51,17 @@ export const updatePolicyOverviewAction = authActionClient description, // Use type assertion to handle the new field // that might not be in the generated types yet - ...(isRequiredToSign !== undefined ? { isRequiredToSign: isRequiredToSign === "required" } as any : {}), + ...(isRequiredToSign !== undefined + ? ({ isRequiredToSign: isRequiredToSign === "required" } as any) + : {}), }, }, }, }); - revalidatePath(`/policies/all/${id}`); - revalidatePath("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/policies/all"); - revalidatePath("/policies"); + revalidatePath(`/${user.organizationId}/policies/all/${id}`); + revalidatePath(`/${user.organizationId}/policies/all`); + revalidatePath(`/${user.organizationId}/policies`); return { success: true, diff --git a/apps/app/src/actions/policy/create-policy-comment.ts b/apps/app/src/actions/policy/create-policy-comment.ts index d896b50112..7e286b22a4 100644 --- a/apps/app/src/actions/policy/create-policy-comment.ts +++ b/apps/app/src/actions/policy/create-policy-comment.ts @@ -31,7 +31,7 @@ export const createPolicyCommentAction = authActionClient }, }); - revalidatePath(`/policies/all/${policyId}`); + revalidatePath(`/${user.organizationId}/policies/all/${policyId}`); revalidateTag(`policy_${user.organizationId}`); return { success: true }; diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/components/FrameworkProgress.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/components/FrameworkProgress.tsx index 6ea731744b..87cf230595 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/components/FrameworkProgress.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/components/FrameworkProgress.tsx @@ -3,9 +3,9 @@ import { useComplianceScores } from "@/hooks/use-compliance-scores"; import { useI18n } from "@/locales/client"; import type { - Framework, - OrganizationControl, - OrganizationFramework, + Framework, + OrganizationControl, + OrganizationFramework, } from "@bubba/db/types"; import { Button } from "@bubba/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@bubba/ui/card"; @@ -13,169 +13,172 @@ import { FileStack } from "lucide-react"; import Link from "next/link"; import { useMediaQuery } from "@bubba/ui/hooks"; import type { ReactNode } from "react"; - +import { useParams } from "next/navigation"; +import { auth } from "@/auth"; interface Props { - frameworks: (OrganizationFramework & { - organizationControl: OrganizationControl[]; - framework: Framework; - })[]; + frameworks: (OrganizationFramework & { + organizationControl: OrganizationControl[]; + framework: Framework; + })[]; } export function FrameworkProgress({ frameworks }: Props) { - const t = useI18n(); - const { - policiesCompliance, - evidenceTasksCompliance, - cloudTestsCompliance, - overallCompliance, - isLoading, - } = useComplianceScores({ frameworks }); + const t = useI18n(); + const { + policiesCompliance, + evidenceTasksCompliance, + cloudTestsCompliance, + overallCompliance, + isLoading, + } = useComplianceScores({ frameworks }); + + const { orgId } = useParams<{ orgId: string }>(); - const isMobile = useMediaQuery("(max-width: 640px)"); + const isMobile = useMediaQuery("(max-width: 640px)"); - const CircleProgress = ({ - percentage, - label, - href, - }: { - percentage: number; - label: ReactNode; - href: string; - }) => ( - -
- - {/* Background circle */} - - {/* Progress circle */} - - -
-
{percentage}%
-
-
-
- {label} -
- - ); + const CircleProgress = ({ + percentage, + label, + href, + }: { + percentage: number; + label: ReactNode; + href: string; + }) => ( + +
+ + {/* Background circle */} + + {/* Progress circle */} + + +
+
{percentage}%
+
+
+
+ {label} +
+ + ); - return ( - - - {t("frameworks.overview.progress.title")} - - - {isLoading ? ( -
-
-

- Loading compliance data... -

-
- ) : frameworks.length === 0 ? ( -
- -

- {t("frameworks.overview.progress.empty.title")} -

-

- {t("frameworks.overview.progress.empty.description")} -

- -
- ) : ( -
- {/* Main compliance circle */} -
-
- - {/* Background circle */} - - {/* Progress circle */} - - -
-
- {overallCompliance}% -
-
Compliant
-
-
-
+ return ( + + + {t("frameworks.overview.progress.title")} + + + {isLoading ? ( +
+
+

+ Loading compliance data... +

+
+ ) : frameworks.length === 0 ? ( +
+ +

+ {t("frameworks.overview.progress.empty.title")} +

+

+ {t("frameworks.overview.progress.empty.description")} +

+ +
+ ) : ( +
+ {/* Main compliance circle */} +
+
+ + {/* Background circle */} + + {/* Progress circle */} + + +
+
+ {overallCompliance}% +
+
Compliant
+
+
+
- {/* Three smaller circles */} -
- - - Evidence - Evidence Tasks - - } - href="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/evidence/list" - /> - - Tests - Cloud Tests - - } - href="/tests" - /> -
-
- )} - - - ); + {/* Three smaller circles */} +
+ + + Evidence + Evidence Tasks + + } + href={`/${orgId}/evidence/list`} + /> + + Tests + Cloud Tests + + } + href={`/${orgId}/tests`} + /> +
+
+ )} +
+
+ ); } diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/components/table/ControlRequirementsTable.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/components/table/ControlRequirementsTable.tsx index 660ffaa0ef..8b6972d6b9 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/components/table/ControlRequirementsTable.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/(home)/overview/frameworks/controls/[id]/components/table/ControlRequirementsTable.tsx @@ -9,7 +9,7 @@ import { import { Table, TableBody, TableCell, TableRow } from "@bubba/ui/table"; import { ControlRequirementsTableColumns } from "./ControlRequirementsTableColumns"; import { ControlRequirementsTableHeader } from "./ControlRequirementsTableHeader"; -import { useRouter } from "next/navigation"; +import { useParams, useRouter } from "next/navigation"; import type { OrganizationControlRequirement, OrganizationEvidence, @@ -28,6 +28,7 @@ interface DataTableProps { export function ControlRequirementsTable({ data }: DataTableProps) { const router = useRouter(); + const { orgId } = useParams<{ orgId: string }>(); const table = useReactTable({ data, @@ -42,12 +43,16 @@ export function ControlRequirementsTable({ data }: DataTableProps) { switch (requirement.type) { case "policy": if (requirement.organizationPolicyId) { - router.push(`/policies/all/${requirement.organizationPolicyId}`); + router.push( + `/${orgId}/policies/all/${requirement.organizationPolicyId}`, + ); } break; case "evidence": if (requirement.organizationEvidenceId) { - router.push(`/evidence/${requirement.organizationEvidenceId}`); + router.push( + `/${orgId}/evidence/${requirement.organizationEvidenceId}`, + ); } break; default: diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/layout.tsx index 063655d889..12a3e9d9cb 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/layout.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/layout.tsx @@ -1,26 +1,33 @@ +import { auth } from "@/auth"; import { getI18n } from "@/locales/server"; import { SecondaryMenu } from "@bubba/ui/secondary-menu"; export default async function Layout({ - children, + children, }: { - children: React.ReactNode; + children: React.ReactNode; }) { - const t = await getI18n(); + const t = await getI18n(); + const session = await auth(); + const user = session?.user; + const organizationId = user?.organizationId; - return ( -
- + return ( +
+ -
{children}
-
- ); +
{children}
+
+ ); } diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/loading.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/loading.tsx new file mode 100644 index 0000000000..a683eafd55 --- /dev/null +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/list/loading.tsx @@ -0,0 +1,16 @@ +import { DataTableSkeleton } from "@/components/ui/data-table"; +import { Card } from "@bubba/ui/card"; + +export default function EvidenceListLoading() { + return ( + + + + ); +} diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/layout.tsx index 063655d889..12a3e9d9cb 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/layout.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/evidence/overview/layout.tsx @@ -1,26 +1,33 @@ +import { auth } from "@/auth"; import { getI18n } from "@/locales/server"; import { SecondaryMenu } from "@bubba/ui/secondary-menu"; export default async function Layout({ - children, + children, }: { - children: React.ReactNode; + children: React.ReactNode; }) { - const t = await getI18n(); + const t = await getI18n(); + const session = await auth(); + const user = session?.user; + const organizationId = user?.organizationId; - return ( -
- + return ( +
+ -
{children}
-
- ); +
{children}
+
+ ); } diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/(overview)/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/(overview)/layout.tsx index 17ae5cf486..ed7c769148 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/(overview)/layout.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/(overview)/layout.tsx @@ -1,23 +1,33 @@ +import { auth } from "@/auth"; import { getI18n } from "@/locales/server"; import { SecondaryMenu } from "@bubba/ui/secondary-menu"; export default async function Layout({ - children, + children, }: { - children: React.ReactNode; + children: React.ReactNode; }) { - const t = await getI18n(); + const t = await getI18n(); + const session = await auth(); + const user = session?.user; + const organizationId = user?.organizationId; - return ( -
- + return ( +
+ -
{children}
-
- ); +
{children}
+
+ ); } diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/(overview)/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/(overview)/page.tsx index 8aef55f8f7..662593c842 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/(overview)/page.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/(overview)/page.tsx @@ -9,103 +9,103 @@ import { unstable_cache } from "next/cache"; import { redirect } from "next/navigation"; export default async function PoliciesOverview({ - params, + params, }: { - params: Promise<{ locale: string }>; + params: Promise<{ locale: string }>; }) { - const { locale } = await params; - setStaticParamsLocale(locale); + const { locale } = await params; + setStaticParamsLocale(locale); - const session = await auth(); + const session = await auth(); - if (!session?.user?.organizationId) { - redirect("/onboarding"); - } + if (!session?.user?.organizationId) { + redirect("/onboarding"); + } - const overview = await getPoliciesOverview(session.user.organizationId); + const overview = await getPoliciesOverview(session.user.organizationId); - if (overview?.totalPolicies === 0) { - redirect("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/policies/all"); - } + if (overview?.totalPolicies === 0) { + redirect(`/${session.user.organizationId}/policies/all`); + } - return ( -
-
- - -
-
- ); + return ( +
+
+ + +
+
+ ); } const getPoliciesOverview = unstable_cache( - async (organizationId: string) => { - return await db.$transaction(async (tx) => { - const [ - totalPolicies, - publishedPolicies, - draftPolicies, - archivedPolicies, - needsReviewPolicies, - ] = await Promise.all([ - tx.organizationPolicy.count({ - where: { - organizationId, - }, - }), - tx.organizationPolicy.count({ - where: { - organizationId, - status: "published", - }, - }), - tx.organizationPolicy.count({ - where: { - organizationId, - status: "draft", - }, - }), - tx.organizationPolicy.count({ - where: { - organizationId, - status: "archived", - }, - }), - tx.organizationPolicy.count({ - where: { - organizationId, - status: "needs_review", - }, - }), - ]); + async (organizationId: string) => { + return await db.$transaction(async (tx) => { + const [ + totalPolicies, + publishedPolicies, + draftPolicies, + archivedPolicies, + needsReviewPolicies, + ] = await Promise.all([ + tx.organizationPolicy.count({ + where: { + organizationId, + }, + }), + tx.organizationPolicy.count({ + where: { + organizationId, + status: "published", + }, + }), + tx.organizationPolicy.count({ + where: { + organizationId, + status: "draft", + }, + }), + tx.organizationPolicy.count({ + where: { + organizationId, + status: "archived", + }, + }), + tx.organizationPolicy.count({ + where: { + organizationId, + status: "needs_review", + }, + }), + ]); - return { - totalPolicies, - publishedPolicies, - draftPolicies, - archivedPolicies, - needsReviewPolicies, - }; - }); - }, - ["policies-overview-cache"], + return { + totalPolicies, + publishedPolicies, + draftPolicies, + archivedPolicies, + needsReviewPolicies, + }; + }); + }, + ["policies-overview-cache"], ); export async function generateMetadata({ - params, + params, }: { - params: Promise<{ locale: string }>; + params: Promise<{ locale: string }>; }): Promise { - const { locale } = await params; - setStaticParamsLocale(locale); - const t = await getI18n(); + const { locale } = await params; + setStaticParamsLocale(locale); + const t = await getI18n(); - return { - title: t("sidebar.policies"), - }; + return { + title: t("sidebar.policies"), + }; } diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/table/PoliciesTable.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/table/PoliciesTable.tsx index 6c87823857..42a1e911eb 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/table/PoliciesTable.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/components/table/PoliciesTable.tsx @@ -1,7 +1,7 @@ "use client"; import { DataTable } from "@/components/ui/data-table"; -import { useRouter } from "next/navigation"; +import { useParams, useRouter } from "next/navigation"; import { Plus } from "lucide-react"; import { getFilterCategories } from "./components/filterCategories"; import { getColumns } from "./columns"; @@ -10,6 +10,7 @@ import { usePoliciesTable } from "./hooks/usePoliciesTableContext"; export function PoliciesTable({ users }: PoliciesTableProps) { const router = useRouter(); + const { orgId } = useParams<{ orgId: string }>(); const { page, setPage, @@ -30,7 +31,7 @@ export function PoliciesTable({ users }: PoliciesTableProps) { } = usePoliciesTable(); const handleRowClick = (policyId: string) => { - router.push(`/policies/all/${policyId}`); + router.replace(`/${orgId}/policies/all/${policyId}`); }; const activeFilterCount = [status, ownerId].filter(Boolean).length; @@ -78,11 +79,11 @@ export function PoliciesTable({ users }: PoliciesTableProps) { onClearFilters: clearFilters, activeFilterCount, }} - ctaButton={{ - label: "Create Policy", - onClick: () => router.push("/policies/all/new"), - icon: , - }} + // ctaButton={{ + // label: "Create Policy", + // onClick: () => router.push(`/${orgId}/policies/all/new`), + // icon: , + // }} /> ); } diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/layout.tsx index 17ae5cf486..ed7c769148 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/layout.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/(overview)/layout.tsx @@ -1,23 +1,33 @@ +import { auth } from "@/auth"; import { getI18n } from "@/locales/server"; import { SecondaryMenu } from "@bubba/ui/secondary-menu"; export default async function Layout({ - children, + children, }: { - children: React.ReactNode; + children: React.ReactNode; }) { - const t = await getI18n(); + const t = await getI18n(); + const session = await auth(); + const user = session?.user; + const organizationId = user?.organizationId; - return ( -
- + return ( +
+ -
{children}
-
- ); +
{children}
+
+ ); } diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/editor/components/PolicyDetails.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/editor/components/PolicyDetails.tsx index 666003e60d..a80bd88f09 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/editor/components/PolicyDetails.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/editor/components/PolicyDetails.tsx @@ -2,70 +2,68 @@ import { Card, CardContent, CardHeader } from "@bubba/ui/card"; import { Skeleton } from "@bubba/ui/skeleton"; -import { redirect } from "next/navigation"; +import { redirect, useParams } from "next/navigation"; import { PolicyEditor } from "@/components/editor/policy-editor"; import { usePolicyDetails } from "../../../(overview)/hooks/usePolicy"; import type { JSONContent } from "@tiptap/react"; import "@bubba/ui/editor.css"; interface PolicyDetailsProps { - policyId: string; + policyId: string; } export function PolicyDetails({ policyId }: PolicyDetailsProps) { - const { policy, isLoading, updatePolicy } = usePolicyDetails(policyId); + const { policy, isLoading, updatePolicy } = usePolicyDetails(policyId); + const { orgId } = useParams(); - if (isLoading) { - return ( -
-
- - -
- - - - - -
- - - -
-
-
-
- ); - } + if (isLoading) { + return ( +
+
+ + +
+ + + + + +
+ + + +
+
+
+
+ ); + } - if (!policy) return redirect("/policies"); + if (!policy) return redirect(`/${orgId}/policies`); - const formattedContent = Array.isArray(policy.content) - ? policy.content - : typeof policy.content === "object" && policy.content !== null - ? [policy.content as JSONContent] - : []; + const formattedContent = Array.isArray(policy.content) + ? policy.content + : typeof policy.content === "object" && policy.content !== null + ? [policy.content as JSONContent] + : []; - const handleSavePolicy = async (content: JSONContent[]): Promise => { - if (!policy) return; + const handleSavePolicy = async (content: JSONContent[]): Promise => { + if (!policy) return; - try { - await updatePolicy({ - ...policy, - content, - }); - } catch (error) { - console.error("Error saving policy:", error); - throw error; - } - }; + try { + await updatePolicy({ + ...policy, + content, + }); + } catch (error) { + console.error("Error saving policy:", error); + throw error; + } + }; - return ( -
- -
- ); + return ( +
+ +
+ ); } diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/editor/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/editor/page.tsx index ee9818a971..dd96ab394d 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/editor/page.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/editor/page.tsx @@ -1,39 +1,30 @@ -import { auth } from "@/auth"; import { getI18n } from "@/locales/server"; import type { Metadata } from "next"; import { setStaticParamsLocale } from "next-international/server"; -import { redirect } from "next/navigation"; import { PolicyDetails } from "./components/PolicyDetails"; export default async function PolicyEditor({ - params, + params, }: { - params: Promise<{ locale: string; policyId: string }>; + params: Promise<{ locale: string; policyId: string }>; }) { - const { locale, policyId } = await params; - setStaticParamsLocale(locale); + const { locale, policyId } = await params; + setStaticParamsLocale(locale); - const session = await auth(); - const organizationId = session?.user.organizationId; - - if (!organizationId) { - redirect("/"); - } - - return ; + return ; } export async function generateMetadata({ - params, + params, }: { - params: Promise<{ locale: string; policyId: string }>; + params: Promise<{ locale: string; policyId: string }>; }): Promise { - const { locale } = await params; + const { locale } = await params; - setStaticParamsLocale(locale); - const t = await getI18n(); + setStaticParamsLocale(locale); + const t = await getI18n(); - return { - title: t("sub_pages.policies.policy_details"), - }; + return { + title: t("sub_pages.policies.policy_details"), + }; } diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/layout.tsx index 0f710e56a0..90e98cfa72 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/layout.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/layout.tsx @@ -2,67 +2,63 @@ import { auth } from "@/auth"; import { getI18n } from "@/locales/server"; import { db } from "@bubba/db"; import { SecondaryMenu } from "@bubba/ui/secondary-menu"; -import { unstable_cache } from "next/cache"; import { redirect } from "next/navigation"; +import { cache } from "react"; interface LayoutProps { - children: React.ReactNode; - params: Promise<{ policyId: string }>; + children: React.ReactNode; + params: Promise<{ policyId: string; orgId: string }>; } export default async function Layout({ children, params }: LayoutProps) { - const t = await getI18n(); - const session = await auth(); + const t = await getI18n(); + const { policyId, orgId } = await params; - if (!session || !session.user.organizationId) { - redirect("/"); - } + const session = await auth(); + const organizationId = session?.user.organizationId; - const policyId = await params; - const policy = await getPolicy( - policyId.policyId, - session.user.organizationId, - ); + if (!organizationId) { + redirect("/"); + } - if (!policy) { - redirect("/policies"); - } + const policy = await getPolicy(policyId, organizationId); - return ( -
- + if (!policy) { + redirect("/"); + } -
{children}
-
- ); + return ( +
+ + +
{children}
+
+ ); } -const getPolicy = unstable_cache( - async (policyId: string, organizationId: string) => { - const policy = await db.organizationPolicy.findUnique({ - where: { - id: policyId, - organizationId: organizationId, - }, - include: { - policy: true, - }, - }); +const getPolicy = cache(async (policyId: string, organizationId: string) => { + const policy = await db.organizationPolicy.findUnique({ + where: { + id: policyId, + organizationId: organizationId, + }, + include: { + policy: true, + }, + }); - return policy; - }, - ["policy-cache"], -); + return policy; +}); diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/page.tsx index 89227fc5b3..f07a4063d4 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/page.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/policies/all/[policyId]/page.tsx @@ -1,34 +1,25 @@ -import { auth } from "@/auth"; import { PolicyComment } from "@/components/policies/policy-comments"; import { PolicyOverview } from "@/components/policies/policy-overview"; import { getI18n } from "@/locales/server"; import { db } from "@bubba/db"; import type { Metadata } from "next"; import { setStaticParamsLocale } from "next-international/server"; -import { unstable_cache } from "next/cache"; import { redirect } from "next/navigation"; +import { cache } from "react"; export default async function PolicyDetails({ params, }: { - params: Promise<{ locale: string; policyId: string }>; + params: Promise<{ locale: string; policyId: string; orgId: string }>; }) { - const { locale, policyId } = await params; - + const { locale, policyId, orgId } = await params; setStaticParamsLocale(locale); - const session = await auth(); - const organizationId = session?.user.organizationId; - - if (!organizationId) { - redirect("/"); - } - - const policy = await getPolicy(policyId, organizationId); - const users = await getUsers(organizationId); + const policy = await getPolicy(policyId, orgId); + const users = await getUsers(orgId); if (!policy) { - redirect("/policies"); + redirect(`/${orgId}/policies/all`); } return ( @@ -54,28 +45,26 @@ export async function generateMetadata({ }; } -const getPolicy = unstable_cache( - async (policyId: string, organizationId: string) => { - const policy = await db.organizationPolicy.findUnique({ - where: { id: policyId, organizationId }, - include: { - policy: true, - PolicyComments: true, - }, - }); - return policy; - }, - ["policy-details"], - { tags: ["policies", "policy-details"] }, -); +const getPolicy = cache(async (policyId: string, organizationId: string) => { + const policy = await db.organizationPolicy.findUnique({ + where: { id: policyId, organizationId }, + include: { + policy: true, + PolicyComments: true, + }, + }); + return policy; +}); + +const getUsers = async (organizationId: string) => { + const orgMembers = await db.organizationMember.findMany({ + where: { organizationId: organizationId }, + include: { + user: true, + }, + }); -const getUsers = unstable_cache( - async (organizationId: string) => { - const users = await db.user.findMany({ - where: { organizationId: organizationId }, - }); + const users = orgMembers.map((member) => member.user); - return users; - }, - ["users-cache"], -); + return users; +}; diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/settings/members/loading.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/settings/members/loading.tsx index b9353c994c..5d1632eb9b 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/settings/members/loading.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/settings/members/loading.tsx @@ -1,56 +1,60 @@ -import { Tabs, TabsContent, TabsList, TabsTrigger } from "@bubba/ui/tabs"; -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@bubba/ui/card"; -import { Avatar, AvatarFallback } from "@bubba/ui/avatar"; -import { Badge } from "@bubba/ui/badge"; -import { getI18n } from "@/locales/server"; import { LogoSpinner } from "@/components/logo-spinner"; +import { getI18n } from "@/locales/server"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@bubba/ui/card"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@bubba/ui/tabs"; export default async function Loading() { - const t = await getI18n(); + const t = await getI18n(); - return ( -
- - - - {t("settings.team.tabs.members")} - - - {t("settings.team.tabs.invite")} - - + return ( +
+ + + + {t("settings.team.tabs.members")} + + + {t("settings.team.tabs.invite")} + + - - - - {t("settings.team.members.title")} - - - - - - - + + + + {t("settings.team.members.title")} + + + + + + + - -
- - - {t("settings.team.invite.title")} - - {t("settings.team.invite.description")} - - - - - -
-
-
- -
- - -
- ); -} \ No newline at end of file + +
+ + + {t("settings.team.invite.title")} + + {t("settings.team.invite.description")} + + + + + +
+
+
+ +
+ + +
+ ); +} diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/(overview)/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/(overview)/layout.tsx index f1fa1f2b71..dc0ffbb307 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/(overview)/layout.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/(overview)/layout.tsx @@ -1,23 +1,32 @@ import { getI18n } from "@/locales/server"; import { SecondaryMenu } from "@bubba/ui/secondary-menu"; - +import { auth } from "@/auth"; export default async function Layout({ - children, + children, }: { - children: React.ReactNode; + children: React.ReactNode; }) { - const t = await getI18n(); + const t = await getI18n(); + const session = await auth(); + const user = session?.user; + const organizationId = user?.organizationId; - return ( -
- + return ( +
+ -
{children}
-
- ); +
{children}
+
+ ); } diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/(overview)/page.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/(overview)/page.tsx index c48a62a4a3..53fce7bab4 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/(overview)/page.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/(overview)/page.tsx @@ -9,104 +9,105 @@ import { unstable_cache } from "next/cache"; import { redirect } from "next/navigation"; export default async function TestsOverview({ - params, + params, }: { - params: Promise<{ locale: string }>; + params: Promise<{ locale: string }>; }) { - const { locale } = await params; - setStaticParamsLocale(locale); + const { locale } = await params; + setStaticParamsLocale(locale); - const session = await auth(); + const session = await auth(); - if (!session?.user?.organizationId) { - redirect("/onboarding"); - } + if (!session?.user?.organizationId) { + redirect("/onboarding"); + } - const overview = await getTestsOverview(session.user.organizationId); + const overview = await getTestsOverview(session.user.organizationId); + const organizationId = session.user.organizationId; - if (overview?.totalTests === 0) { - redirect("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/tests/all"); - } + if (overview?.totalTests === 0) { + redirect(`/${organizationId}/tests/all`); + } - return ( -
-
- - -
-
- ); + return ( +
+
+ + +
+
+ ); } const getTestsOverview = unstable_cache( - async (organizationId: string) => { - return await db.$transaction(async (tx) => { - const [ - totalTests, - lowSeverityTests, - mediumSeverityTests, - highSeverityTests, - criticalSeverityTests, - ] = await Promise.all([ - tx.organizationIntegrationResults.count({ - where: { - organizationId, - }, - }), - tx.organizationIntegrationResults.count({ - where: { - organizationId, - label: "LOW", - }, - }), - tx.organizationIntegrationResults.count({ - where: { - organizationId, - label: "MEDIUM", - }, - }), - tx.organizationIntegrationResults.count({ - where: { - organizationId, - label: "HIGH", - }, - }), - tx.organizationIntegrationResults.count({ - where: { - organizationId, - label: "CRITICAL", - }, - }), - ]); + async (organizationId: string) => { + return await db.$transaction(async (tx) => { + const [ + totalTests, + lowSeverityTests, + mediumSeverityTests, + highSeverityTests, + criticalSeverityTests, + ] = await Promise.all([ + tx.organizationIntegrationResults.count({ + where: { + organizationId, + }, + }), + tx.organizationIntegrationResults.count({ + where: { + organizationId, + label: "LOW", + }, + }), + tx.organizationIntegrationResults.count({ + where: { + organizationId, + label: "MEDIUM", + }, + }), + tx.organizationIntegrationResults.count({ + where: { + organizationId, + label: "HIGH", + }, + }), + tx.organizationIntegrationResults.count({ + where: { + organizationId, + label: "CRITICAL", + }, + }), + ]); - return { - totalTests, - lowSeverityTests, - mediumSeverityTests, - highSeverityTests, - criticalSeverityTests, - }; - }); - }, - ["tests-overview-cache"], + return { + totalTests, + lowSeverityTests, + mediumSeverityTests, + highSeverityTests, + criticalSeverityTests, + }; + }); + }, + ["tests-overview-cache"], ); export async function generateMetadata({ - params, + params, }: { - params: Promise<{ locale: string }>; + params: Promise<{ locale: string }>; }): Promise { - const { locale } = await params; - setStaticParamsLocale(locale); - const t = await getI18n(); + const { locale } = await params; + setStaticParamsLocale(locale); + const t = await getI18n(); - return { - title: t("sidebar.tests"), - }; + return { + title: t("sidebar.tests"), + }; } diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/hooks/useTest.ts b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/hooks/useTest.ts index 6d94481a38..bb0b6a0ff6 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/hooks/useTest.ts +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/hooks/useTest.ts @@ -1,19 +1,22 @@ "use client"; import useSWR from "swr"; -import { getTest } from "@/app/[locale]/(app)/(dashboard)/tests/all/[testId]/actions/getTest"; -import type { AppError, Test } from "@/app/[locale]/(app)/(dashboard)/tests/all/types"; +import { getTest } from "@/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/[testId]/actions/getTest"; +import type { + AppError, + Test, +} from "@/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/types"; async function fetchTest(testId: string): Promise { try { const response = await getTest({ testId }); - + if (response.success) { return response.data; - } else { - throw response.error; } + + throw response.error; } catch (error) { - if (error && typeof error === 'object' && 'message' in error) { + if (error && typeof error === "object" && "message" in error) { throw error as AppError; } throw { message: "An unexpected error occurred" }; @@ -36,4 +39,4 @@ export function useTest(testId: string) { error, mutate, }; -} \ No newline at end of file +} diff --git a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/layout.tsx b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/layout.tsx index 5b647fae1f..f07a4308bf 100644 --- a/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/layout.tsx +++ b/apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/layout.tsx @@ -1,3 +1,4 @@ +import { auth } from "@/auth"; import { getI18n } from "@/locales/server"; import { SecondaryMenu } from "@bubba/ui/secondary-menu"; @@ -7,13 +8,21 @@ export default async function Layout({ children: React.ReactNode; }) { const t = await getI18n(); + const session = await auth(); + const organizationId = session?.user?.organizationId; return (
{children}
diff --git a/apps/app/src/app/[locale]/(app)/setup/page.tsx b/apps/app/src/app/[locale]/(app)/setup/page.tsx index 9397d81300..66a03c985d 100644 --- a/apps/app/src/app/[locale]/(app)/setup/page.tsx +++ b/apps/app/src/app/[locale]/(app)/setup/page.tsx @@ -1,50 +1,22 @@ -import { auth } from "@/auth"; import { Onboarding } from "@/components/forms/create-organization-form"; import { db } from "@bubba/db"; import type { Metadata } from "next"; -import { redirect } from "next/navigation"; import { cache } from "react"; export const metadata: Metadata = { - title: "Organization Setup | Comp AI", + title: "Organization Setup | Comp AI", }; export default async function Page() { - const session = await auth(); + const frameworks = await getFrameworks(); - if (!session?.user?.id) { - return redirect("/"); - } - - if (!session.user.organizationId) { - return redirect("/"); - } - - const isSetup = await isOrganizationSetup(session.user.organizationId); - const frameworks = await getFrameworks(); - - if (isSetup) { - return redirect("/"); - } - - return ; + return ; } const getFrameworks = cache(async () => { - return await db.framework.findMany({ - orderBy: { - name: "asc", - }, - }); -}); - -const isOrganizationSetup = cache(async (organizationId: string) => { - const organization = await db.organization.findUnique({ - where: { id: organizationId }, - select: { - setup: true, - }, - }); - - return organization?.setup; + return await db.framework.findMany({ + orderBy: { + name: "asc", + }, + }); }); diff --git a/apps/app/src/auth/config.ts b/apps/app/src/auth/config.ts index 39972711c8..fc03a3d016 100644 --- a/apps/app/src/auth/config.ts +++ b/apps/app/src/auth/config.ts @@ -7,76 +7,77 @@ import Resend from "next-auth/providers/resend"; import { createOrganizationAndConnectUser } from "./org"; declare module "next-auth" { - interface User { - organizationId?: string; - onboarded?: boolean; - full_name?: string; - avatar_url?: string; - } + interface User { + organizationId?: string; + onboarded?: boolean; + full_name?: string; + avatar_url?: string; + } - interface Session extends DefaultSession { - user: { - id: string; - organizationId?: string; - onboarded?: boolean; - full_name?: string; - avatar_url?: string; - } & DefaultSession["user"]; - } + interface Session extends DefaultSession { + user: { + id: string; + organizationId?: string; + onboarded?: boolean; + full_name?: string; + avatar_url?: string; + } & DefaultSession["user"]; + } } export const authConfig: NextAuthConfig = { - providers: [ - GoogleProvider({ - clientId: process.env.AUTH_GOOGLE_ID!, - clientSecret: process.env.AUTH_GOOGLE_SECRET!, - allowDangerousEmailAccountLinking: true, - }), - Resend({ - apiKey: process.env.RESEND_API_KEY!, - from: "noreply@mail.trycomp.ai", - async sendVerificationRequest(params) { - await sendMagicLinkEmail({ - email: params.identifier, - url: params.url, - }); - }, - }), - ], - adapter: PrismaAdapter(db), - callbacks: { - session: ({ session, user }) => ({ - ...session, - user: { - ...session.user, - id: user.id, - organizationId: user.organizationId, - onboarded: user.onboarded, - }, - }), - }, - events: { - signIn: async ({ user, isNewUser }) => { - if (user?.id) { - await db.user.update({ - where: { - id: user.id, - }, - data: { - lastLogin: new Date(), - organizationId: user.organizationId, - }, - }); - } + providers: [ + GoogleProvider({ + clientId: process.env.AUTH_GOOGLE_ID!, + clientSecret: process.env.AUTH_GOOGLE_SECRET!, + allowDangerousEmailAccountLinking: true, + }), + Resend({ + apiKey: process.env.RESEND_API_KEY!, + from: "noreply@mail.trycomp.ai", + async sendVerificationRequest(params) { + await sendMagicLinkEmail({ + email: params.identifier, + url: params.url, + }); + }, + }), + ], + adapter: PrismaAdapter(db), + callbacks: { + session: ({ session, user }) => ({ + ...session, + user: { + ...session.user, + id: user.id, + organizationId: user.organizationId, + onboarded: user.onboarded, + }, + }), + }, + events: { + signIn: async ({ user, isNewUser }) => { + if (user?.id) { + await db.user.update({ + where: { + id: user.id, + }, + data: { + lastLogin: new Date(), + organizationId: user.organizationId, + }, + }); + } - if (isNewUser && user.email && user.id) { - if (!user.organizationId) { - await createOrganizationAndConnectUser({ - userId: user.id, - normalizedEmail: user.email, - }); - } - } - }, - }, + if (isNewUser && user.email && user.id) { + if (!user.organizationId) { + await createOrganizationAndConnectUser({ + userId: user.id, + normalizedEmail: user.email, + orgName: "My Organization", + }); + } + } + }, + }, } satisfies NextAuthConfig; diff --git a/apps/app/src/auth/org.ts b/apps/app/src/auth/org.ts index 8471dc2ffa..ef9092be33 100644 --- a/apps/app/src/auth/org.ts +++ b/apps/app/src/auth/org.ts @@ -2,77 +2,77 @@ import { db } from "@bubba/db"; import { stripe } from "./stripe"; async function createStripeCustomer(input: { - name: string; - email: string; - organizationId: string; + name: string; + email: string; + organizationId: string; }): Promise { - try { - const customer = await stripe.customers.create({ - name: input.name, - email: input.email, - metadata: { - organizationId: input.organizationId, - }, - }); + try { + const customer = await stripe.customers.create({ + name: input.name, + email: input.email, + metadata: { + organizationId: input.organizationId, + }, + }); - return customer.id; - } catch (error) { - console.error("Error creating Stripe customer", error); - throw error; - } + return customer.id; + } catch (error) { + console.error("Error creating Stripe customer", error); + throw error; + } } export async function createOrganizationAndConnectUser(input: { - userId: string; - normalizedEmail: string; -}): Promise { - const initialName = "New Organization"; - - const [organization] = await db.$transaction([ - db.organization.create({ - data: { - name: initialName, - tier: "free", - website: "", - members: { - create: { - userId: input.userId, - role: "owner", - }, - }, - }, - select: { - id: true, - }, - }), - db.user.update({ - where: { id: input.userId }, - data: { role: "admin" }, - select: { - id: true, - }, - }), - ]); + userId: string; + normalizedEmail: string; + orgName: string; +}) { + const [organization] = await db.$transaction([ + db.organization.create({ + data: { + name: input.orgName, + tier: "free", + website: "", + members: { + create: { + userId: input.userId, + role: "owner", + }, + }, + }, + select: { + id: true, + name: true, + }, + }), + db.user.update({ + where: { id: input.userId }, + data: { role: "admin" }, + select: { + id: true, + }, + }), + ]); - const stripeCustomerId = await createStripeCustomer({ - name: initialName, - email: input.normalizedEmail, - organizationId: organization.id, - }); + const stripeCustomerId = await createStripeCustomer({ + name: organization.name, + email: input.normalizedEmail, + organizationId: organization.id, + }); - if (!stripeCustomerId) { - console.warn("Stripe customer ID is missing"); - } + if (!stripeCustomerId) { + console.warn("Stripe customer ID is missing"); + } - await db.organization.update({ - where: { id: organization.id }, - data: { stripeCustomerId }, - }); + await db.organization.update({ + where: { id: organization.id }, + data: { stripeCustomerId }, + }); - await db.user.update({ - where: { id: input.userId }, - data: { organizationId: organization.id }, - }); + await db.user.update({ + where: { id: input.userId }, + data: { organizationId: organization.id }, + }); - return organization.id; + return organization; } diff --git a/apps/app/src/components/forms/create-organization-form.tsx b/apps/app/src/components/forms/create-organization-form.tsx index fead4419e9..a49c1cde4d 100644 --- a/apps/app/src/components/forms/create-organization-form.tsx +++ b/apps/app/src/components/forms/create-organization-form.tsx @@ -5,23 +5,23 @@ import { organizationSchema } from "@/actions/schema"; import { useI18n } from "@/locales/client"; import { Button } from "@bubba/ui/button"; import { - Form, - FormControl, - FormField, - FormItem, - FormLabel, - FormMessage, + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, } from "@bubba/ui/form"; import { Input } from "@bubba/ui/input"; import { zodResolver } from "@hookform/resolvers/zod"; import { ArrowRight, Loader2 } from "lucide-react"; import { useSession } from "next-auth/react"; import { useAction } from "next-safe-action/hooks"; -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import type { z } from "zod"; -import type { Framework } from "@bubba/db/types"; +import type { Framework, Organization } from "@bubba/db/types"; import { Icons } from "@bubba/ui/icons"; import Link from "next/link"; import { Checkbox } from "@bubba/ui/checkbox"; @@ -30,243 +30,266 @@ import { useRealtimeRun } from "@trigger.dev/react-hooks"; import { useRouter } from "next/navigation"; import { LogoSpinner } from "../logo-spinner"; -function RealtimeStatus({ runId, publicAccessToken }: { runId: string; publicAccessToken: string }) { - const t = useI18n(); - const router = useRouter() +function RealtimeStatus({ + runId, + publicAccessToken, + newOrganization, +}: { + runId: string; + publicAccessToken: string; + newOrganization: Pick | null; +}) { + const t = useI18n(); + const router = useRouter(); - const { run, error } = useRealtimeRun(runId, { - accessToken: publicAccessToken, - onComplete: (run, error) => { - if (error) { - toast.error(t("common.actions.error"), { duration: 5000 }); - return; - } - }, - }); + const { run, error } = useRealtimeRun(runId, { + accessToken: publicAccessToken, + onComplete: (run, error) => { + if (error) { + toast.error(t("common.actions.error"), { duration: 5000 }); + return; + } + }, + }); - useEffect(() => { - if (run?.status === "COMPLETED") { - router.push("/"); - } - }, [run, router]); + useEffect(() => { + if (run?.status === "COMPLETED" && newOrganization) { + router.push(`/${newOrganization.id}`); + } + }, [run, router, newOrganization]); - return ( -
- {run?.status !== "FAILED" && run?.status !== "COMPLETED" && ( -
- -

- {t("onboarding.trigger.title")} -

-

- {t("onboarding.trigger.creating")} -

-
- )} -
- ); + return ( +
+ {run?.status !== "FAILED" && run?.status !== "COMPLETED" && ( +
+ +

+ {t("onboarding.trigger.title")} +

+

+ {t("onboarding.trigger.creating")} +

+
+ )} +
+ ); } function OnboardingClient({ frameworks }: { frameworks: Framework[] }) { - const t = useI18n(); - const { data: session } = useSession(); - const [runId, setRunId] = useState(null); - const [publicAccessToken, setPublicAccessToken] = useState(null); + const t = useI18n(); + const { data: session } = useSession(); + const [runId, setRunId] = useState(null); + const [publicAccessToken, setPublicAccessToken] = useState( + null, + ); + const newOrganizationRef = useRef | null>( + null, + ); - const createOrganization = useAction(createOrganizationAction, { - onSuccess: async (data) => { - setRunId(data.data?.runId ?? null); - setPublicAccessToken(data.data?.publicAccessToken ?? null); - }, - onError: () => { - toast.error(t("common.actions.error"), { duration: 5000 }); - }, - }); + const createOrganization = useAction(createOrganizationAction, { + onSuccess: async (data) => { + setRunId(data.data?.runId ?? null); + setPublicAccessToken(data.data?.publicAccessToken ?? null); + newOrganizationRef.current = data.data?.newOrganization ?? null; + }, + onError: () => { + toast.error(t("common.actions.error"), { duration: 5000 }); + }, + }); - const form = useForm>({ - resolver: zodResolver(organizationSchema), - defaultValues: { - fullName: session?.user?.name ?? "", - name: "", - website: "", - frameworks: [], - }, - mode: "onChange", - }); + const form = useForm>({ + resolver: zodResolver(organizationSchema), + defaultValues: { + fullName: session?.user?.name ?? "", + name: "", + website: "", + frameworks: [], + }, + mode: "onChange", + }); - const onSubmit = async (data: z.infer) => { - createOrganization.execute(data); - }; + const onSubmit = async (data: z.infer) => { + createOrganization.execute(data); + }; - if (runId && publicAccessToken) { - return ( -
-
- -
-
- ); - } + if (runId && publicAccessToken) { + return ( +
+
+ +
+
+ ); + } - return ( -
-
-
- - - -
+ return ( +
+
+
+ + + +
-
-

- {t("onboarding.setup")} -

-

- {t("onboarding.description")} -

-
+
+

+ {t("onboarding.setup")} +

+

+ {t("onboarding.description")} +

+
-
- - ( - - - {t("onboarding.fields.fullName.label")} - - - - - - - )} - /> + + + ( + + + {t("onboarding.fields.fullName.label")} + + + + + + + )} + /> - ( - - - {t("onboarding.fields.name.label")} - - - - - - - )} - /> + ( + + + {t("onboarding.fields.name.label")} + + + + + + + )} + /> - ( - - - {t("onboarding.fields.website.label")} - - - - - - - )} - /> - ( - - - {t("frameworks.overview.grid.title")} - - -
- {frameworks.map((framework) => ( -
{ - const newValue = !field.value.includes(framework.id) - ? [...field.value, framework.id] - : field.value.filter((id) => id !== framework.id); - field.onChange(newValue); - }} - > -
-
-

{framework.name}

-

- {framework.description} -

-

- {`${t("frameworks.overview.grid.version")}: ${framework.version}`} -

-
-
e.stopPropagation()}> - { - const newValue = checked - ? [...field.value, framework.id] - : field.value.filter((id) => id !== framework.id); - field.onChange(newValue); - }} - /> -
-
-
- ))} -
-
- -
- )} - /> + ( + + + {t("onboarding.fields.website.label")} + + + + + + + )} + /> + ( + + + {t("frameworks.overview.grid.title")} + + +
+ + {t("frameworks.overview.grid.title")} + + {frameworks.map((framework) => ( + + ))} +
+
+ +
+ )} + /> - - - -
-
- ); + + + +
+
+ ); } export function Onboarding({ frameworks }: { frameworks: Framework[] }) { - return ; + return ; } diff --git a/apps/app/src/components/forms/create-test-comment-form.tsx b/apps/app/src/components/forms/create-test-comment-form.tsx index 7420a8ca09..ca1e65a98d 100644 --- a/apps/app/src/components/forms/create-test-comment-form.tsx +++ b/apps/app/src/components/forms/create-test-comment-form.tsx @@ -1,21 +1,21 @@ "use client"; -import { createTestCommentAction } from "@/app/[locale]/(app)/(dashboard)/tests/all/[testId]/actions/createTestComment"; -import { createTestCommentSchema } from "@/app/[locale]/(app)/(dashboard)/tests/all/[testId]/actions/types"; +import { createTestCommentAction } from "@/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/[testId]/actions/createTestComment"; +import { createTestCommentSchema } from "@/app/[locale]/(app)/(dashboard)/[orgId]/tests/all/[testId]/actions/types"; import { useI18n } from "@/locales/client"; import { - Accordion, - AccordionContent, - AccordionItem, - AccordionTrigger, + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, } from "@bubba/ui/accordion"; import { Button } from "@bubba/ui/button"; import { - Form, - FormControl, - FormField, - FormItem, - FormMessage, + Form, + FormControl, + FormField, + FormItem, + FormMessage, } from "@bubba/ui/form"; import { Textarea } from "@bubba/ui/textarea"; import { zodResolver } from "@hookform/resolvers/zod"; @@ -29,80 +29,80 @@ import { toast } from "sonner"; import type { z } from "zod"; export function CreateTestCommentForm() { - const t = useI18n(); - const [_, setTestCommentSheet] = useQueryState("test-comment-sheet"); - const params = useParams<{ testId: string }>(); + const t = useI18n(); + const [_, setTestCommentSheet] = useQueryState("test-comment-sheet"); + const params = useParams<{ testId: string }>(); - const createPolicyComment = useAction(createTestCommentAction, { - onSuccess: () => { - toast.success(t("common.comments.success")); - setTestCommentSheet(null); - }, - onError: () => { - toast.error(t("common.comments.error")); - }, - }); + const createPolicyComment = useAction(createTestCommentAction, { + onSuccess: () => { + toast.success(t("common.comments.success")); + setTestCommentSheet(null); + }, + onError: () => { + toast.error(t("common.comments.error")); + }, + }); - const form = useForm>({ - resolver: zodResolver(createTestCommentSchema), - defaultValues: { - content: "", - testId: params.testId, - }, - }); + const form = useForm>({ + resolver: zodResolver(createTestCommentSchema), + defaultValues: { + content: "", + testId: params.testId, + }, + }); - const onSubmit = (data: z.infer) => { - createPolicyComment.execute(data); - }; + const onSubmit = (data: z.infer) => { + createPolicyComment.execute(data); + }; - return ( -
- -
-
- - - {t("common.comments.new")} - -
- ( - - -