From 457abd6b62234e7bfaa3755d93c8969b21ba5373 Mon Sep 17 00:00:00 2001 From: Long Lam Date: Mon, 9 Mar 2026 21:00:10 -0400 Subject: [PATCH 1/8] fix: use juno-sdk 0.0.10 --- bun.lock | 86 ++-------------------------------------------------- package.json | 2 +- 2 files changed, 3 insertions(+), 85 deletions(-) diff --git a/bun.lock b/bun.lock index 7e1cfd7..3ceb367 100644 --- a/bun.lock +++ b/bun.lock @@ -23,7 +23,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "1.0.0", - "juno-sdk": "^0.0.9", + "juno-sdk": "^0.0.10", "lucide-react": "^0.487.0", "next": "15.2.6", "next-themes": "^0.4.6", @@ -377,30 +377,18 @@ "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], - "asn1": ["asn1@0.2.6", "", { "dependencies": { "safer-buffer": "~2.1.0" } }, "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ=="], - - "assert-plus": ["assert-plus@1.0.0", "", {}, "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="], - "ast-types-flow": ["ast-types-flow@0.0.8", "", {}, "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="], "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], - "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], - "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], - "aws-sign2": ["aws-sign2@0.7.0", "", {}, "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="], - - "aws4": ["aws4@1.13.2", "", {}, "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw=="], - "axe-core": ["axe-core@4.10.2", "", {}, "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w=="], "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "bcrypt-pbkdf": ["bcrypt-pbkdf@1.0.2", "", { "dependencies": { "tweetnacl": "^0.14.3" } }, "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w=="], - "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], @@ -423,8 +411,6 @@ "caniuse-lite": ["caniuse-lite@1.0.30001698", "", {}, "sha512-xJ3km2oiG/MbNU8G6zIq6XRZ6HtAOVXsbOrP/blGazi52kc5Yy7b6sDA5O+FbROzRrV7BSTllLHuNvmawYUJjw=="], - "caseless": ["caseless@0.12.0", "", {}, "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="], - "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], @@ -445,16 +431,12 @@ "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="], - "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], - "commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], "cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], - "core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="], - "create-require": ["create-require@1.1.1", "", {}, "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="], "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], @@ -487,8 +469,6 @@ "damerau-levenshtein": ["damerau-levenshtein@1.0.8", "", {}, "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="], - "dashdash": ["dashdash@1.14.1", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g=="], - "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="], @@ -505,8 +485,6 @@ "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], - "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], - "detect-libc": ["detect-libc@2.0.3", "", {}, "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw=="], "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], @@ -525,8 +503,6 @@ "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], - "ecc-jsbn": ["ecc-jsbn@0.1.2", "", { "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw=="], - "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], "enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="], @@ -585,10 +561,6 @@ "eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], - "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], - - "extsprintf": ["extsprintf@1.3.0", "", {}, "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="], - "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], "fast-equals": ["fast-equals@5.2.2", "", {}, "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw=="], @@ -615,10 +587,6 @@ "foreground-child": ["foreground-child@3.3.0", "", { "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" } }, "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg=="], - "forever-agent": ["forever-agent@0.6.1", "", {}, "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="], - - "form-data": ["form-data@2.3.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ=="], - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], @@ -637,8 +605,6 @@ "get-tsconfig": ["get-tsconfig@4.10.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A=="], - "getpass": ["getpass@0.1.7", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng=="], - "glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": "dist/esm/bin.mjs" }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], @@ -653,10 +619,6 @@ "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], - "har-schema": ["har-schema@2.0.0", "", {}, "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q=="], - - "har-validator": ["har-validator@5.1.5", "", { "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" } }, "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w=="], - "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], @@ -671,8 +633,6 @@ "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], - "http-signature": ["http-signature@1.2.0", "", { "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ=="], - "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], @@ -733,8 +693,6 @@ "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], - "is-typedarray": ["is-typedarray@1.0.0", "", {}, "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="], - "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], @@ -745,8 +703,6 @@ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - "isstream": ["isstream@0.1.2", "", {}, "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="], - "iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="], "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], @@ -757,25 +713,17 @@ "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": "bin/js-yaml.js" }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], - "jsbn": ["jsbn@0.1.1", "", {}, "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="], - "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], - "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], - "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], - "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], - "json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": "lib/cli.js" }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], - "jsprim": ["jsprim@1.4.2", "", { "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.4.0", "verror": "1.10.0" } }, "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw=="], - "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="], - "juno-sdk": ["juno-sdk@0.0.9", "", { "dependencies": { "@bitauth/libauth": "^1.17.1", "request": "^2.88.2" } }, "sha512-p4foLkl/+7+eS9R+5OBCr+E5ITyHImyovCPy60ncglnti8yXU/GXDoosV+Mn5SR1HzDWUz6XI0anuN11J/a0rw=="], + "juno-sdk": ["juno-sdk@0.0.10", "", { "dependencies": { "@bitauth/libauth": "^1.17.1" } }, "sha512-ezl1PGuywgWcBGz1eHjeBAta0vDhDgoVvy37BoLaCBPGHvfOwbRL13LxLxZNOleRJxEpCkpLUXsySoAxqxpYDA=="], "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], @@ -809,10 +757,6 @@ "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], - "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - - "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], @@ -833,8 +777,6 @@ "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], - "oauth-sign": ["oauth-sign@0.9.0", "", {}, "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="], - "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], "object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="], @@ -873,8 +815,6 @@ "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], - "performance-now": ["performance-now@2.1.0", "", {}, "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="], - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], @@ -905,12 +845,8 @@ "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], - "psl": ["psl@1.15.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w=="], - "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], - "qs": ["qs@6.5.3", "", {}, "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="], - "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], "react": ["react@19.0.0", "", {}, "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ=="], @@ -949,8 +885,6 @@ "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], - "request": ["request@2.88.2", "", { "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" } }, "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw=="], - "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": "bin/resolve" }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], @@ -963,14 +897,10 @@ "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], - "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], - "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], - "scheduler": ["scheduler@0.25.0", "", {}, "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="], "semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], @@ -1005,8 +935,6 @@ "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], - "sshpk": ["sshpk@1.18.0", "", { "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", "dashdash": "^1.12.0", "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" }, "bin": { "sshpk-conv": "bin/sshpk-conv", "sshpk-sign": "bin/sshpk-sign", "sshpk-verify": "bin/sshpk-verify" } }, "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ=="], - "stable-hash": ["stable-hash@0.0.4", "", {}, "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g=="], "streamsearch": ["streamsearch@1.1.0", "", {}, "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="], @@ -1059,8 +987,6 @@ "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], - "tough-cookie": ["tough-cookie@2.5.0", "", { "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" } }, "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g=="], - "ts-api-utils": ["ts-api-utils@2.0.1", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w=="], "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], @@ -1071,12 +997,8 @@ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], - "turbo-stream": ["turbo-stream@2.4.0", "", {}, "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g=="], - "tweetnacl": ["tweetnacl@0.14.5", "", {}, "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="], - "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], @@ -1103,12 +1025,8 @@ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], - "uuid": ["uuid@3.4.0", "", { "bin": { "uuid": "./bin/uuid" } }, "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="], - "v8-compile-cache-lib": ["v8-compile-cache-lib@3.0.1", "", {}, "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="], - "verror": ["verror@1.10.0", "", { "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw=="], - "victory-vendor": ["victory-vendor@36.9.2", "", { "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", "@types/d3-interpolate": "^3.0.1", "@types/d3-scale": "^4.0.2", "@types/d3-shape": "^3.1.0", "@types/d3-time": "^3.0.0", "@types/d3-timer": "^3.0.0", "d3-array": "^3.1.6", "d3-ease": "^3.0.1", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-shape": "^3.1.0", "d3-time": "^3.0.0", "d3-timer": "^3.0.1" } }, "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ=="], "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], diff --git a/package.json b/package.json index 3ac96c5..5feba68 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "1.0.0", - "juno-sdk": "^0.0.9", + "juno-sdk": "^0.0.10", "lucide-react": "^0.487.0", "next": "15.2.6", "next-themes": "^0.4.6", From 6ebf7f27fbbad9d22f3185109a1fad2210d836f0 Mon Sep 17 00:00:00 2001 From: Keshav Worathur Date: Tue, 31 Mar 2026 18:13:44 -0400 Subject: [PATCH 2/8] feat: display files as expandable subrows in File Directory table Add opt-in expanding support to BaseTable and restructure the file bucket table to show files as nested subrows with status chips, icons, and copy-to-clipboard actions. --- src/components/baseTable.tsx | 13 +++ src/components/fileBucketTable/columns.tsx | 108 +++++++++++++++--- .../fileBucketTable/fileBucketTable.tsx | 76 ++++++++---- 3 files changed, 158 insertions(+), 39 deletions(-) diff --git a/src/components/baseTable.tsx b/src/components/baseTable.tsx index 67e9c5d..bdd99a4 100644 --- a/src/components/baseTable.tsx +++ b/src/components/baseTable.tsx @@ -11,8 +11,10 @@ import { } from "@/components/ui/table"; import { ColumnDef, + ExpandedState, flexRender, getCoreRowModel, + getExpandedRowModel, getFilteredRowModel, Row, RowSelectionState, @@ -34,6 +36,7 @@ interface BaseTableProps { }; onAddNewRow?: () => void; onDeleteRow?: (rows: Row[]) => void; + expandable?: boolean; } export function BaseTable({ @@ -44,17 +47,26 @@ export function BaseTable({ filterParams, onAddNewRow, onDeleteRow, + expandable = false, }: BaseTableProps) { const [rowSelection, setRowSelection] = useState({}); + const [expanded, setExpanded] = useState({}); const table = useReactTable({ data, columns, getCoreRowModel: getCoreRowModel(), getFilteredRowModel: getFilteredRowModel(), + ...(expandable && { + getExpandedRowModel: getExpandedRowModel(), + onExpandedChange: setExpanded, + getSubRows: (row: TData) => + (row as TData & { subRows?: TData[] }).subRows, + }), onRowSelectionChange: setRowSelection, state: { rowSelection, + ...(expandable && { expanded }), }, }); @@ -121,6 +133,7 @@ export function BaseTable({ 0 ? "bg-muted/30" : ""} > {row.getVisibleCells().map((cell) => ( diff --git a/src/components/fileBucketTable/columns.tsx b/src/components/fileBucketTable/columns.tsx index 3291f7f..b6af7c6 100644 --- a/src/components/fileBucketTable/columns.tsx +++ b/src/components/fileBucketTable/columns.tsx @@ -1,18 +1,34 @@ "use client"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { ColumnDef } from "@tanstack/react-table"; -import { ItemListCell } from "../item-list-cell"; +import { ChevronDown, ChevronRight, Copy, File, Folder } from "lucide-react"; +import { toast } from "sonner"; -export type FileBucketColumn = { +export type FileStatus = "NOT UPLOADED" | "UPLOADED" | "EXTERNAL"; + +export type FileDirectoryRow = { + type: "bucket" | "file"; name: string; - configId: number; - configEnv: string; - providerName: string; - fileNames: string[]; + configId?: number; + configEnv?: string; + providerName?: string; + status?: FileStatus; + subRows?: FileDirectoryRow[]; +}; + +const statusStyles: Record = { + "NOT UPLOADED": + "border-transparent bg-red-500 text-white hover:bg-red-500/80", + UPLOADED: + "border-transparent bg-green-500 text-white hover:bg-green-500/80", + EXTERNAL: + "border-transparent bg-yellow-500 text-black hover:bg-yellow-500/80", }; -export const columns: ColumnDef[] = [ +export const columns: ColumnDef[] = [ { id: "select", header: ({ table }) => ( @@ -31,30 +47,90 @@ export const columns: ColumnDef[] = [ ), size: 50, }, + { + id: "expand", + header: () => null, + cell: ({ row }) => + row.getCanExpand() ? ( + + ) : null, + size: 40, + }, { accessorKey: "name", - header: "Bucket Name", + header: "Name", + cell: ({ row }) => ( +
+ {row.original.type === "bucket" ? ( + + ) : ( + + )} + {row.original.name} +
+ ), }, { accessorKey: "configId", header: "Config ID", + cell: ({ row }) => + row.original.type === "bucket" ? row.original.configId : null, }, { accessorKey: "configEnv", header: "Config Env", + cell: ({ row }) => + row.original.type === "bucket" ? row.original.configEnv : null, }, { accessorKey: "providerName", header: "Provider Name", + cell: ({ row }) => + row.original.type === "bucket" ? row.original.providerName : null, }, { - accessorKey: "fileNames", - header: "Files", - cell: ({ row }) => ( - - ), + id: "status", + header: "Status", + cell: ({ row }) => { + if (row.original.type !== "file" || !row.original.status) return null; + return ( + + {row.original.status} + + ); + }, + }, + { + id: "actions", + header: () => null, + cell: ({ row }) => { + if (row.original.type !== "file") return null; + return ( + + ); + }, }, ]; diff --git a/src/components/fileBucketTable/fileBucketTable.tsx b/src/components/fileBucketTable/fileBucketTable.tsx index 6a82b58..35b5536 100644 --- a/src/components/fileBucketTable/fileBucketTable.tsx +++ b/src/components/fileBucketTable/fileBucketTable.tsx @@ -1,8 +1,9 @@ "use client"; import { - FileBucketColumn, - columns as fileBucketColumns, + FileDirectoryRow, + FileStatus, + columns as fileDirectoryColumns, } from "@/components/fileBucketTable/columns"; import { Dialog, @@ -48,7 +49,7 @@ function isValidId(projectId: string | null, configId: number | undefined) { export function FileBucketTable({ projectId, configId }: FileBucketTableProps) { const [isAddDialogOpen, setIsAddDialogOpen] = useState(false); const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false); - const [selectedRows, setSelectedRows] = useState[]>([]); + const [selectedRows, setSelectedRows] = useState[]>([]); const queryClient = useQueryClient(); @@ -101,17 +102,30 @@ export function FileBucketTable({ projectId, configId }: FileBucketTableProps) { const isLoading = isBucketLoading && isProviderLoading; - const fileBucketRowData = (buckets ?? ([] as FileBucket[])) + const mockStatuses: FileStatus[] = ["NOT UPLOADED", "UPLOADED", "EXTERNAL"]; + + const fileDirectoryRowData: FileDirectoryRow[] = ( + buckets ?? ([] as FileBucket[]) + ) .filter((bucket) => bucket) - .map((bucket) => ({ - name: bucket.name, - configId: bucket.configId, - configEnv: bucket.configEnv, - providerName: bucket.fileProviderName, - fileNames: (bucket.fileServiceFile?.map( + .map((bucket) => { + const fileNames = (bucket.fileServiceFile?.map( (file) => (file as unknown as File)?.fileId?.path ?? "Unknown file", - ) ?? []) as string[], - })); + ) ?? []) as string[]; + + return { + type: "bucket" as const, + name: bucket.name, + configId: bucket.configId, + configEnv: bucket.configEnv, + providerName: bucket.fileProviderName, + subRows: fileNames.map((fileName, index) => ({ + type: "file" as const, + name: fileName, + status: mockStatuses[index % mockStatuses.length], + })), + }; + }); const fileProviderNames = (providers ?? ([] as FileProvider[])) .filter((provider) => provider) @@ -119,29 +133,44 @@ export function FileBucketTable({ projectId, configId }: FileBucketTableProps) { const deleteFileBucketHandler = useMutation({ mutationFn: () => { - const deletePromises = selectedRows.map(async (row) => { + const bucketRows = selectedRows.filter( + (row) => row.original.type === "bucket", + ); + const fileRows = selectedRows.filter( + (row) => row.original.type === "file", + ); + + const deletePromises = bucketRows.map(async (row) => { return deleteBucket( { name: row.original.name, - configId: row.original.configId, - fileProviderName: row.original.providerName, + configId: row.original.configId!, + fileProviderName: row.original.providerName!, }, projectId, ); }); + // TODO: Add file deletion API call when backend supports it + if (fileRows.length > 0) { + toast.info( + `${fileRows.length} file(s) selected for deletion (frontend only, backend not yet connected).`, + ); + } + return Promise.all(deletePromises); }, onSuccess: () => { toast.success("Success", { - description: `Successfully deleted file buckets.`, + description: `Successfully deleted selected items.`, }); queryClient.invalidateQueries({ queryKey: ["fileBucket", projectId, configId], }); }, onSettled: () => setIsDeleteDialogOpen(false), - onError: () => toast.error("An error occurred while deleting buckets."), + onError: () => + toast.error("An error occurred while deleting selected items."), }); const addFileBucketHandler = useMutation({ @@ -193,10 +222,10 @@ export function FileBucketTable({ projectId, configId }: FileBucketTableProps) { - Delete Selected File Buckets + Delete Selected Items Are you sure you want to delete {selectedRows.length} selected - bucket{selectedRows.length > 1 ? "s" : ""}? This action cannot be + item{selectedRows.length > 1 ? "s" : ""}? This action cannot be undone. @@ -219,13 +248,14 @@ export function FileBucketTable({ projectId, configId }: FileBucketTableProps) { -

File Buckets

+

File Directory

{ From 2d254dd7123fd1980f1994724e1ab7c3d628fb0e Mon Sep 17 00:00:00 2001 From: Keshav Worathur Date: Sat, 4 Apr 2026 10:07:55 -0500 Subject: [PATCH 3/8] feat: add mock data for File Directory table demo Populate the table with 4 mock buckets and 15 files across all three statuses (NOT UPLOADED, UPLOADED, EXTERNAL) so the UI can be demoed while backend integration is pending. Falls back to real API data when available. --- .../fileBucketTable/fileBucketTable.tsx | 109 ++++++++++++++---- 1 file changed, 85 insertions(+), 24 deletions(-) diff --git a/src/components/fileBucketTable/fileBucketTable.tsx b/src/components/fileBucketTable/fileBucketTable.tsx index 35b5536..58d2ab2 100644 --- a/src/components/fileBucketTable/fileBucketTable.tsx +++ b/src/components/fileBucketTable/fileBucketTable.tsx @@ -20,7 +20,7 @@ import { import { getAllFileProviders } from "@/lib/fileProvider"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { Row } from "@tanstack/react-table"; -import { FileBucket, FileProvider } from "juno-sdk/build/main/internal/index"; +import type { FileProvider } from "juno-sdk/build/main/internal/index"; import { useEffect, useState } from "react"; import { toast } from "sonner"; import { BaseTable } from "../baseTable"; @@ -102,30 +102,91 @@ export function FileBucketTable({ projectId, configId }: FileBucketTableProps) { const isLoading = isBucketLoading && isProviderLoading; - const mockStatuses: FileStatus[] = ["NOT UPLOADED", "UPLOADED", "EXTERNAL"]; + // TODO: Remove mock data once backend integration is complete + const mockData: FileDirectoryRow[] = [ + { + type: "bucket", + name: "user-uploads", + configId: 1, + configEnv: "production", + providerName: "aws-s3", + subRows: [ + { type: "file", name: "profile-photo.png", status: "UPLOADED" }, + { type: "file", name: "resume.pdf", status: "UPLOADED" }, + { type: "file", name: "cover-letter.docx", status: "NOT UPLOADED" }, + { type: "file", name: "avatar-backup.jpg", status: "EXTERNAL" }, + ], + }, + { + type: "bucket", + name: "project-assets", + configId: 2, + configEnv: "production", + providerName: "aws-s3", + subRows: [ + { type: "file", name: "logo.svg", status: "UPLOADED" }, + { type: "file", name: "banner-v2.png", status: "NOT UPLOADED" }, + { type: "file", name: "favicon.ico", status: "UPLOADED" }, + ], + }, + { + type: "bucket", + name: "temp-staging", + configId: 3, + configEnv: "staging", + providerName: "gcp-storage", + subRows: [ + { type: "file", name: "test-data.csv", status: "EXTERNAL" }, + { type: "file", name: "debug-log.txt", status: "NOT UPLOADED" }, + { type: "file", name: "migration-backup.sql", status: "EXTERNAL" }, + { type: "file", name: "config-snapshot.json", status: "UPLOADED" }, + { type: "file", name: "seed-records.json", status: "NOT UPLOADED" }, + ], + }, + { + type: "bucket", + name: "media-library", + configId: 1, + configEnv: "production", + providerName: "aws-s3", + subRows: [ + { type: "file", name: "hero-video.mp4", status: "UPLOADED" }, + { type: "file", name: "thumbnail-001.webp", status: "UPLOADED" }, + { type: "file", name: "podcast-ep12.mp3", status: "EXTERNAL" }, + ], + }, + ]; + + const fileDirectoryRowData: FileDirectoryRow[] = + buckets && buckets.length > 0 + ? buckets + .filter((bucket) => bucket) + .map((bucket) => { + const fileNames = (bucket.fileServiceFile?.map( + (file) => + (file as unknown as File)?.fileId?.path ?? "Unknown file", + ) ?? []) as string[]; - const fileDirectoryRowData: FileDirectoryRow[] = ( - buckets ?? ([] as FileBucket[]) - ) - .filter((bucket) => bucket) - .map((bucket) => { - const fileNames = (bucket.fileServiceFile?.map( - (file) => (file as unknown as File)?.fileId?.path ?? "Unknown file", - ) ?? []) as string[]; + const mockStatuses: FileStatus[] = [ + "NOT UPLOADED", + "UPLOADED", + "EXTERNAL", + ]; - return { - type: "bucket" as const, - name: bucket.name, - configId: bucket.configId, - configEnv: bucket.configEnv, - providerName: bucket.fileProviderName, - subRows: fileNames.map((fileName, index) => ({ - type: "file" as const, - name: fileName, - status: mockStatuses[index % mockStatuses.length], - })), - }; - }); + return { + type: "bucket" as const, + name: bucket.name, + configId: bucket.configId, + configEnv: bucket.configEnv, + providerName: bucket.fileProviderName, + subRows: fileNames.map((fileName, index) => ({ + type: "file" as const, + name: fileName, + status: mockStatuses[index % mockStatuses.length], + })), + }; + }) + : mockData; const fileProviderNames = (providers ?? ([] as FileProvider[])) .filter((provider) => provider) @@ -252,7 +313,7 @@ export function FileBucketTable({ projectId, configId }: FileBucketTableProps) { Date: Sat, 4 Apr 2026 11:13:01 -0500 Subject: [PATCH 4/8] test: mulit file select and delete --- src/components/baseTable.tsx | 4 +- src/components/fileBucketTable/columns.tsx | 58 ++++++---- .../fileBucketTable/fileBucketTable.tsx | 106 ++++++++++++------ 3 files changed, 107 insertions(+), 61 deletions(-) diff --git a/src/components/baseTable.tsx b/src/components/baseTable.tsx index bdd99a4..464d4d6 100644 --- a/src/components/baseTable.tsx +++ b/src/components/baseTable.tsx @@ -70,7 +70,9 @@ export function BaseTable({ }, }); - const selectedRows = table.getSelectedRowModel().rows; + const selectedRows = expandable + ? table.getSelectedRowModel().flatRows + : table.getSelectedRowModel().rows; return (
diff --git a/src/components/fileBucketTable/columns.tsx b/src/components/fileBucketTable/columns.tsx index b6af7c6..e966613 100644 --- a/src/components/fileBucketTable/columns.tsx +++ b/src/components/fileBucketTable/columns.tsx @@ -1,6 +1,5 @@ "use client"; -import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { ColumnDef } from "@tanstack/react-table"; @@ -19,13 +18,13 @@ export type FileDirectoryRow = { subRows?: FileDirectoryRow[]; }; +const statusPill = + "inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium text-white"; + const statusStyles: Record = { - "NOT UPLOADED": - "border-transparent bg-red-500 text-white hover:bg-red-500/80", - UPLOADED: - "border-transparent bg-green-500 text-white hover:bg-green-500/80", - EXTERNAL: - "border-transparent bg-yellow-500 text-black hover:bg-yellow-500/80", + "NOT UPLOADED": `${statusPill} bg-red-400/70`, + UPLOADED: `${statusPill} bg-emerald-400/70`, + EXTERNAL: `${statusPill} bg-amber-400/70 text-black`, }; export const columns: ColumnDef[] = [ @@ -70,6 +69,15 @@ export const columns: ColumnDef[] = [ { accessorKey: "name", header: "Name", + filterFn: (row, _columnId, filterValue: string) => { + const search = filterValue.toLowerCase(); + if (row.original.name.toLowerCase().includes(search)) return true; + return ( + row.original.subRows?.some((file) => + file.name.toLowerCase().includes(search), + ) ?? false + ); + }, cell: ({ row }) => (
[] = [ }, { id: "status", - header: "Status", + header: () =>
Status
, cell: ({ row }) => { if (row.original.type !== "file" || !row.original.status) return null; return ( - - {row.original.status} - +
+ + {row.original.status} + +
); }, }, { id: "actions", - header: () => null, + header: () =>
Actions
, cell: ({ row }) => { if (row.original.type !== "file") return null; return ( - +
+ +
); }, }, diff --git a/src/components/fileBucketTable/fileBucketTable.tsx b/src/components/fileBucketTable/fileBucketTable.tsx index 58d2ab2..4486a16 100644 --- a/src/components/fileBucketTable/fileBucketTable.tsx +++ b/src/components/fileBucketTable/fileBucketTable.tsx @@ -103,7 +103,7 @@ export function FileBucketTable({ projectId, configId }: FileBucketTableProps) { const isLoading = isBucketLoading && isProviderLoading; // TODO: Remove mock data once backend integration is complete - const mockData: FileDirectoryRow[] = [ + const [mockData, setMockData] = useState([ { type: "bucket", name: "user-uploads", @@ -139,7 +139,7 @@ export function FileBucketTable({ projectId, configId }: FileBucketTableProps) { { type: "file", name: "test-data.csv", status: "EXTERNAL" }, { type: "file", name: "debug-log.txt", status: "NOT UPLOADED" }, { type: "file", name: "migration-backup.sql", status: "EXTERNAL" }, - { type: "file", name: "config-snapshot.json", status: "UPLOADED" }, + { type: "file", name: "hero-video.mp4", status: "UPLOADED" }, { type: "file", name: "seed-records.json", status: "NOT UPLOADED" }, ], }, @@ -155,45 +155,75 @@ export function FileBucketTable({ projectId, configId }: FileBucketTableProps) { { type: "file", name: "podcast-ep12.mp3", status: "EXTERNAL" }, ], }, - ]; + ]); + + const usesMockData = !buckets || buckets.length === 0; - const fileDirectoryRowData: FileDirectoryRow[] = - buckets && buckets.length > 0 - ? buckets - .filter((bucket) => bucket) - .map((bucket) => { - const fileNames = (bucket.fileServiceFile?.map( - (file) => - (file as unknown as File)?.fileId?.path ?? "Unknown file", - ) ?? []) as string[]; + const fileDirectoryRowData: FileDirectoryRow[] = usesMockData + ? mockData + : buckets + .filter((bucket) => bucket) + .map((bucket) => { + const fileNames = (bucket.fileServiceFile?.map( + (file) => + (file as unknown as File)?.fileId?.path ?? "Unknown file", + ) ?? []) as string[]; - const mockStatuses: FileStatus[] = [ - "NOT UPLOADED", - "UPLOADED", - "EXTERNAL", - ]; + const mockStatuses: FileStatus[] = [ + "NOT UPLOADED", + "UPLOADED", + "EXTERNAL", + ]; - return { - type: "bucket" as const, - name: bucket.name, - configId: bucket.configId, - configEnv: bucket.configEnv, - providerName: bucket.fileProviderName, - subRows: fileNames.map((fileName, index) => ({ - type: "file" as const, - name: fileName, - status: mockStatuses[index % mockStatuses.length], - })), - }; - }) - : mockData; + return { + type: "bucket" as const, + name: bucket.name, + configId: bucket.configId, + configEnv: bucket.configEnv, + providerName: bucket.fileProviderName, + subRows: fileNames.map((fileName, index) => ({ + type: "file" as const, + name: fileName, + status: mockStatuses[index % mockStatuses.length], + })), + }; + }); const fileProviderNames = (providers ?? ([] as FileProvider[])) .filter((provider) => provider) .map((provider) => provider.providerName); + const deleteMockRows = () => { + const bucketNamesToDelete = new Set( + selectedRows + .filter((row) => row.original.type === "bucket") + .map((row) => row.original.name), + ); + const fileNamesToDelete = new Set( + selectedRows + .filter((row) => row.original.type === "file") + .map((row) => row.original.name), + ); + + setMockData((prev) => + prev + .filter((bucket) => !bucketNamesToDelete.has(bucket.name)) + .map((bucket) => ({ + ...bucket, + subRows: bucket.subRows?.filter( + (file) => !fileNamesToDelete.has(file.name), + ), + })), + ); + }; + const deleteFileBucketHandler = useMutation({ - mutationFn: () => { + mutationFn: async () => { + if (usesMockData) { + deleteMockRows(); + return; + } + const bucketRows = selectedRows.filter( (row) => row.original.type === "bucket", ); @@ -219,15 +249,17 @@ export function FileBucketTable({ projectId, configId }: FileBucketTableProps) { ); } - return Promise.all(deletePromises); + await Promise.all(deletePromises); }, onSuccess: () => { toast.success("Success", { description: `Successfully deleted selected items.`, }); - queryClient.invalidateQueries({ - queryKey: ["fileBucket", projectId, configId], - }); + if (!usesMockData) { + queryClient.invalidateQueries({ + queryKey: ["fileBucket", projectId, configId], + }); + } }, onSettled: () => setIsDeleteDialogOpen(false), onError: () => @@ -316,7 +348,7 @@ export function FileBucketTable({ projectId, configId }: FileBucketTableProps) { isLoading={isLoading && fileDirectoryRowData.length === 0} expandable={true} filterParams={{ - placeholder: "Filter by bucket name...", + placeholder: "Filter by bucket or file name...", filterColumn: "name", }} onAddNewRow={() => { From 53024f31ad88fa67675a3af0ea2eee57b3236d73 Mon Sep 17 00:00:00 2001 From: Keshav Worathur Date: Sat, 4 Apr 2026 11:22:15 -0500 Subject: [PATCH 5/8] fix: handle clipboard api rejection --- src/components/fileBucketTable/columns.tsx | 10 ++++++++-- src/components/fileBucketTable/fileBucketTable.tsx | 3 +-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/components/fileBucketTable/columns.tsx b/src/components/fileBucketTable/columns.tsx index e966613..0624ce3 100644 --- a/src/components/fileBucketTable/columns.tsx +++ b/src/components/fileBucketTable/columns.tsx @@ -135,8 +135,14 @@ export const columns: ColumnDef[] = [ size="sm" className="h-8 w-8 p-0" onClick={() => { - navigator.clipboard.writeText(row.original.name); - toast.success("Copied file name to clipboard"); + navigator.clipboard + .writeText(row.original.name) + .then(() => { + toast.success("Copied file name to clipboard"); + }) + .catch(() => { + toast.error("Failed to copy file name to clipboard"); + }); }} > diff --git a/src/components/fileBucketTable/fileBucketTable.tsx b/src/components/fileBucketTable/fileBucketTable.tsx index 4486a16..58a43ea 100644 --- a/src/components/fileBucketTable/fileBucketTable.tsx +++ b/src/components/fileBucketTable/fileBucketTable.tsx @@ -165,8 +165,7 @@ export function FileBucketTable({ projectId, configId }: FileBucketTableProps) { .filter((bucket) => bucket) .map((bucket) => { const fileNames = (bucket.fileServiceFile?.map( - (file) => - (file as unknown as File)?.fileId?.path ?? "Unknown file", + (file) => (file as unknown as File)?.fileId?.path ?? "Unknown file", ) ?? []) as string[]; const mockStatuses: FileStatus[] = [ From f168b143a854f9da151fe16dbe505b68f453bc04 Mon Sep 17 00:00:00 2001 From: Keshav Worathur Date: Tue, 31 Mar 2026 18:13:44 -0400 Subject: [PATCH 6/8] feat: display files as expandable subrows in File Directory table Add opt-in expanding support to BaseTable and restructure the file bucket table to show files as nested subrows with status chips, icons, and copy-to-clipboard actions. --- src/components/baseTable.tsx | 2 +- src/components/fileBucketTable/columns.tsx | 2 -- src/components/fileBucketTable/fileBucketTable.tsx | 5 ++--- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/components/baseTable.tsx b/src/components/baseTable.tsx index da6c797..d6e0152 100644 --- a/src/components/baseTable.tsx +++ b/src/components/baseTable.tsx @@ -53,7 +53,7 @@ export function BaseTable({ const [rowSelection, setRowSelection] = useState({}); const [expanded, setExpanded] = useState({}); const isReadOnly = useReadOnlyMode(); - + const table = useReactTable({ data, columns, diff --git a/src/components/fileBucketTable/columns.tsx b/src/components/fileBucketTable/columns.tsx index f2b1b9f..63dc4e4 100644 --- a/src/components/fileBucketTable/columns.tsx +++ b/src/components/fileBucketTable/columns.tsx @@ -37,7 +37,6 @@ export const getFileBucketColumns = ( table.toggleAllPageRowsSelected(!!value)} /> ), @@ -45,7 +44,6 @@ export const getFileBucketColumns = ( row.toggleSelected(!!value)} /> ), diff --git a/src/components/fileBucketTable/fileBucketTable.tsx b/src/components/fileBucketTable/fileBucketTable.tsx index 9e20905..96574ca 100644 --- a/src/components/fileBucketTable/fileBucketTable.tsx +++ b/src/components/fileBucketTable/fileBucketTable.tsx @@ -24,12 +24,10 @@ import { Row } from "@tanstack/react-table"; import type { FileProvider } from "juno-sdk/build/main/internal/index"; import { useEffect, useState } from "react"; import { toast } from "sonner"; -import { useReadOnlyMode } from "../providers/SessionProvider"; import { BaseTable } from "../baseTable"; import AddFileBucketForm from "../forms/AddFileBucketForm"; import { Button } from "../ui/button"; import { DialogHeader } from "../ui/dialog"; -import { getFileBucketColumns } from "./columns"; interface FileBucketTableProps { projectId: string; @@ -354,9 +352,10 @@ export function FileBucketTable({ projectId, configId }: FileBucketTableProps) { data={fileBucketRowData} columns={getFileBucketColumns(isReadOnly)} isLoading={isLoading} + expandable={true} filterParams={{ placeholder: "Filter by bucket or file name...", - filterColumn: "name", + filterColumn: "name", }} onAddNewRow={() => { if (isValidId(projectId, configId)) { From ab7102f5d8e32bc448b047e0d1ea26e4f09b55b6 Mon Sep 17 00:00:00 2001 From: Keshav Worathur Date: Sat, 4 Apr 2026 11:50:31 -0500 Subject: [PATCH 7/8] fix: merge conflicts with main --- src/components/fileBucketTable/columns.tsx | 7 ++++--- src/components/fileBucketTable/fileBucketTable.tsx | 9 ++------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/components/fileBucketTable/columns.tsx b/src/components/fileBucketTable/columns.tsx index 63dc4e4..3e6f3a7 100644 --- a/src/components/fileBucketTable/columns.tsx +++ b/src/components/fileBucketTable/columns.tsx @@ -27,15 +27,16 @@ const statusStyles: Record = { EXTERNAL: `${statusPill} bg-amber-400/70 text-black`, }; -export const columns: ColumnDef[] = [ + export const getFileBucketColumns = ( isReadOnly: boolean, -): ColumnDef[] => [ +): ColumnDef[] => {return [ { id: "select", header: ({ table }) => ( table.toggleAllPageRowsSelected(!!value)} /> @@ -154,4 +155,4 @@ export const getFileBucketColumns = ( ); }, }, -]; +]}; diff --git a/src/components/fileBucketTable/fileBucketTable.tsx b/src/components/fileBucketTable/fileBucketTable.tsx index 96574ca..0f7e681 100644 --- a/src/components/fileBucketTable/fileBucketTable.tsx +++ b/src/components/fileBucketTable/fileBucketTable.tsx @@ -3,9 +3,8 @@ import { FileDirectoryRow, FileStatus, - columns as fileDirectoryColumns, } from "@/components/fileBucketTable/columns"; -import { FileBucketColumn } from "@/components/fileBucketTable/columns"; +import { getFileBucketColumns } from "@/components/fileBucketTable/columns"; import { Dialog, DialogContent, @@ -28,6 +27,7 @@ import { BaseTable } from "../baseTable"; import AddFileBucketForm from "../forms/AddFileBucketForm"; import { Button } from "../ui/button"; import { DialogHeader } from "../ui/dialog"; +import { useReadOnlyMode } from "../providers/SessionProvider"; interface FileBucketTableProps { projectId: string; @@ -51,7 +51,6 @@ export function FileBucketTable({ projectId, configId }: FileBucketTableProps) { const [isAddDialogOpen, setIsAddDialogOpen] = useState(false); const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false); const [selectedRows, setSelectedRows] = useState[]>([]); - const [selectedRows, setSelectedRows] = useState[]>([]); const isReadOnly = useReadOnlyMode(); const queryClient = useQueryClient(); @@ -346,13 +345,9 @@ export function FileBucketTable({ projectId, configId }: FileBucketTableProps) {

File Directory

Date: Sat, 4 Apr 2026 11:52:42 -0500 Subject: [PATCH 8/8] styles: fix code formatting --- src/components/baseTable.tsx | 2 +- src/components/fileBucketTable/columns.tsx | 239 +++++++++--------- .../fileBucketTable/fileBucketTable.tsx | 2 +- 3 files changed, 122 insertions(+), 121 deletions(-) diff --git a/src/components/baseTable.tsx b/src/components/baseTable.tsx index d6e0152..da6c797 100644 --- a/src/components/baseTable.tsx +++ b/src/components/baseTable.tsx @@ -53,7 +53,7 @@ export function BaseTable({ const [rowSelection, setRowSelection] = useState({}); const [expanded, setExpanded] = useState({}); const isReadOnly = useReadOnlyMode(); - + const table = useReactTable({ data, columns, diff --git a/src/components/fileBucketTable/columns.tsx b/src/components/fileBucketTable/columns.tsx index 3e6f3a7..61de3ed 100644 --- a/src/components/fileBucketTable/columns.tsx +++ b/src/components/fileBucketTable/columns.tsx @@ -27,132 +27,133 @@ const statusStyles: Record = { EXTERNAL: `${statusPill} bg-amber-400/70 text-black`, }; - export const getFileBucketColumns = ( isReadOnly: boolean, -): ColumnDef[] => {return [ - { - id: "select", - header: ({ table }) => ( - table.toggleAllPageRowsSelected(!!value)} - /> - ), - cell: ({ row }) => ( - row.toggleSelected(!!value)} - /> - ), - size: 50, - }, - { - id: "expand", - header: () => null, - cell: ({ row }) => - row.getCanExpand() ? ( - - ) : null, - size: 40, - }, - { - accessorKey: "name", - header: "Name", - filterFn: (row, _columnId, filterValue: string) => { - const search = filterValue.toLowerCase(); - if (row.original.name.toLowerCase().includes(search)) return true; - return ( - row.original.subRows?.some((file) => - file.name.toLowerCase().includes(search), - ) ?? false - ); +): ColumnDef[] => { + return [ + { + id: "select", + header: ({ table }) => ( + table.toggleAllPageRowsSelected(!!value)} + /> + ), + cell: ({ row }) => ( + row.toggleSelected(!!value)} + /> + ), + size: 50, }, - cell: ({ row }) => ( -
- {row.original.type === "bucket" ? ( - - ) : ( - - )} - {row.original.name} -
- ), - }, - { - accessorKey: "configId", - header: "Config ID", - cell: ({ row }) => - row.original.type === "bucket" ? row.original.configId : null, - }, - { - accessorKey: "configEnv", - header: "Config Env", - cell: ({ row }) => - row.original.type === "bucket" ? row.original.configEnv : null, - }, - { - accessorKey: "providerName", - header: "Provider Name", - cell: ({ row }) => - row.original.type === "bucket" ? row.original.providerName : null, - }, - { - id: "status", - header: () =>
Status
, - cell: ({ row }) => { - if (row.original.type !== "file" || !row.original.status) return null; - return ( -
- - {row.original.status} - -
- ); - }, - }, - { - id: "actions", - header: () =>
Actions
, - cell: ({ row }) => { - if (row.original.type !== "file") return null; - return ( -
+ { + id: "expand", + header: () => null, + cell: ({ row }) => + row.getCanExpand() ? ( + ) : null, + size: 40, + }, + { + accessorKey: "name", + header: "Name", + filterFn: (row, _columnId, filterValue: string) => { + const search = filterValue.toLowerCase(); + if (row.original.name.toLowerCase().includes(search)) return true; + return ( + row.original.subRows?.some((file) => + file.name.toLowerCase().includes(search), + ) ?? false + ); + }, + cell: ({ row }) => ( +
+ {row.original.type === "bucket" ? ( + + ) : ( + + )} + {row.original.name}
- ); + ), + }, + { + accessorKey: "configId", + header: "Config ID", + cell: ({ row }) => + row.original.type === "bucket" ? row.original.configId : null, + }, + { + accessorKey: "configEnv", + header: "Config Env", + cell: ({ row }) => + row.original.type === "bucket" ? row.original.configEnv : null, }, - }, -]}; + { + accessorKey: "providerName", + header: "Provider Name", + cell: ({ row }) => + row.original.type === "bucket" ? row.original.providerName : null, + }, + { + id: "status", + header: () =>
Status
, + cell: ({ row }) => { + if (row.original.type !== "file" || !row.original.status) return null; + return ( +
+ + {row.original.status} + +
+ ); + }, + }, + { + id: "actions", + header: () =>
Actions
, + cell: ({ row }) => { + if (row.original.type !== "file") return null; + return ( +
+ +
+ ); + }, + }, + ]; +}; diff --git a/src/components/fileBucketTable/fileBucketTable.tsx b/src/components/fileBucketTable/fileBucketTable.tsx index 0f7e681..feaacd6 100644 --- a/src/components/fileBucketTable/fileBucketTable.tsx +++ b/src/components/fileBucketTable/fileBucketTable.tsx @@ -350,7 +350,7 @@ export function FileBucketTable({ projectId, configId }: FileBucketTableProps) { columns={getFileBucketColumns(isReadOnly)} filterParams={{ placeholder: "Filter by bucket or file name...", - filterColumn: "name", + filterColumn: "name", }} onAddNewRow={() => { if (isValidId(projectId, configId)) {