Repository navigation
Conversation
…onnection configuration (#149)
* feat: implement file upload feature with S3 integration * fix: show new filename on rename * refactor: remove mock S3 server and related E2E tests for file upload feature * refactor: reduce duplicate code * style: formatting and linting * #92 add multiple files and directory upload, improve file rename checks on upload * #144 remove trailing slash on directory name * * #94 add delete action * #94 refactor, implement delete action in hdfs provider * #94 cleaned up types, use paraglide pluralisation * * #118 add pinned access * #118 add recently accessed file and locations * #118 show loading spinner for quick navigation, use daisyui tooltips, limit recent access item count * #118 show timestamp on hover, add preview action, add clickable label for recent locations * #118 refactor timestamp tooltip into own component, add timestamp tooltip to file explorer files * #131 fix download path for truncated previews, #118 add button to open context actions on pinned access * #118 refactor suggested code from #126, show pin location menu above breadcrumb menu * #118 fix timestamp string format, make timestamp display relative * #118 add month and year suffixes to last modified timestamp display * #118 fix visuals for pinned access entry width * fix duplicate json * fix: remove duplicate invalidateAll import in FileExplorer * fix: remove s3-mock from playwright config * remove test with wrong references * fix: update eslint ignore patterns to include .github/skills directory * fix: add exclude pattern for .github/skills directory in pre-commit config --------- Co-authored-by: F3l1x1vo <fli@ordix.de>
* #130 improve various ux issues from this ticket * #130 improve various ux issues from this ticket part 2 * #130 add badge and icon to file count display * chore: remove package duplicates with npm dedupe * feat: Add support for path-style and VirtualHosted addressing in S3 connection configuration (#149) * #92 S3 File Browser: Upload (#141) * feat: implement file upload feature with S3 integration * fix: show new filename on rename * refactor: remove mock S3 server and related E2E tests for file upload feature * refactor: reduce duplicate code * style: formatting and linting * #92 add multiple files and directory upload, improve file rename checks on upload * #144 remove trailing slash on directory name * * #94 add delete action * #94 refactor, implement delete action in hdfs provider * #94 cleaned up types, use paraglide pluralisation * * #118 add pinned access * #118 add recently accessed file and locations * #118 show loading spinner for quick navigation, use daisyui tooltips, limit recent access item count * #118 show timestamp on hover, add preview action, add clickable label for recent locations * #118 refactor timestamp tooltip into own component, add timestamp tooltip to file explorer files * #131 fix download path for truncated previews, #118 add button to open context actions on pinned access * #118 refactor suggested code from #126, show pin location menu above breadcrumb menu * #118 fix timestamp string format, make timestamp display relative * #118 add month and year suffixes to last modified timestamp display * #118 fix visuals for pinned access entry width * fix duplicate json * fix: remove duplicate invalidateAll import in FileExplorer * fix: remove s3-mock from playwright config * remove test with wrong references * fix: update eslint ignore patterns to include .github/skills directory * fix: add exclude pattern for .github/skills directory in pre-commit config --------- Co-authored-by: F3l1x1vo <fli@ordix.de> * chore: remove package duplicates with npm dedupe * #130 improve various ux issues from this ticket part 3 * #130 remove rename and move actions * #130 add locale to file size display * #130 centralize file size locale formatting * #130 allow custom file size format options * chore: remove unused import * style: enhance item count badges with improved icon size and font weight * Feat/s3 file browser button on breadcrumbs (#158) * feat: add pin button to breadcrumbs for easy location management * refactor: update pinButton snippet parameters for readability * #130 add space-taking transition to pin hover and reduced motion attribute --------- Co-authored-by: F3l1x1vo <fli@ordix.de> --------- Co-authored-by: dklOrdix <dkl@ordix.de>
* feat: Trino functions in Code Completion (#78) * Add Trino functions to completion list * fix: Unclosed subqueries (#110) * correctly classify completion slots inside unclosed parenthesised subqueries * chore: Helm cleanup (#109) * add missing envs to helm chart & add probes with /healthz endpoint * update tech debt * change trino.completionDisabled to features.trino.completion.enabled * refactor: use global states * refactor: reorganise component structure * #159 Add VS Code Settings and Extensions (#160) * #159 add vs code settings and extensions * #159 update deprecated setting * #159 remove ruler * refactor: improve logging levels and clean up unused code * fix: fix bookmarks handling and improve loading state management * refactor: adjust z-index values for improved layering in BucketList component * refactor: enhance unpin menu functionality and add close button * refactor: enhance unpin context menu with improved positioning and close button * refactor: streamline unpin menu handling and improve focus management * refactor(frontend): clean up and restructure app (#84) * refactor(frontend): clean up and restructure app * fix: add lint:fix script to package.json and clean up trailing comma in +layout.svelte * docs: update AGENTS.md to include Material UI icon library usage * refactor(header): move components for header into own directory * chore: dedupe lockfile * fix(sidebar): add hover cursor style to toggle button * chore(types): centralise navigation and auth types; update header/sidebar imports Co-authored-by: Copilot <copilot@github.com> * #114 save sidebar collapse state in localStorage * refactor: merge if statements * refactor: increase timeout for new clusters Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: unused export Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: restore hr seperator Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: restore previous layout css Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: replace Iconify with unplugin-icons * refactor: update icon library usage to unplugin-icons with material-symbols --------- Co-authored-by: F3l1x1vo <fli@ordix.de> Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: update bucket icons to use gravity-ui and add new dependency * chore: move gravity-ui to dev-dependencies --------- Co-authored-by: Benedikt Labrenz <benedikt@labrenz.org> Co-authored-by: F3l1x1vo <fli@ordix.de> Co-authored-by: Lukas Krug <lukas.krug@stackable.tech>
* #135 add garage instance to GitHub workflow for e2e tests * #135 fix yaml lint * #135 fix docker command in action * #135 fix docker options in action * #135 fix yaml format * #135 refactor GitHub action for s3 deployment with code fixes * #135 fix missing entrypoint in container * #135 remove format use on s3 creation * #135 add e2e tests that require a bucket * #135 allow local starting of s3 e2e tests, fix lint * #135 fix lint * #135 move garage.toml to permanent repository * #135 create keys and bucket via curl * #135 fix lint * #135 fix lint * Filebrowser: Refactor Filebrowser by using global state (#163) * feat: Trino functions in Code Completion (#78) * Add Trino functions to completion list * fix: Unclosed subqueries (#110) * correctly classify completion slots inside unclosed parenthesised subqueries * chore: Helm cleanup (#109) * add missing envs to helm chart & add probes with /healthz endpoint * update tech debt * change trino.completionDisabled to features.trino.completion.enabled * refactor: use global states * refactor: reorganise component structure * #159 Add VS Code Settings and Extensions (#160) * #159 add vs code settings and extensions * #159 update deprecated setting * #159 remove ruler * refactor: improve logging levels and clean up unused code * fix: fix bookmarks handling and improve loading state management * refactor: adjust z-index values for improved layering in BucketList component * refactor: enhance unpin menu functionality and add close button * refactor: enhance unpin context menu with improved positioning and close button * refactor: streamline unpin menu handling and improve focus management * refactor(frontend): clean up and restructure app (#84) * refactor(frontend): clean up and restructure app * fix: add lint:fix script to package.json and clean up trailing comma in +layout.svelte * docs: update AGENTS.md to include Material UI icon library usage * refactor(header): move components for header into own directory * chore: dedupe lockfile * fix(sidebar): add hover cursor style to toggle button * chore(types): centralise navigation and auth types; update header/sidebar imports Co-authored-by: Copilot <copilot@github.com> * #114 save sidebar collapse state in localStorage * refactor: merge if statements * refactor: increase timeout for new clusters Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: unused export Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: restore hr seperator Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: restore previous layout css Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: replace Iconify with unplugin-icons * refactor: update icon library usage to unplugin-icons with material-symbols --------- Co-authored-by: F3l1x1vo <fli@ordix.de> Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: update bucket icons to use gravity-ui and add new dependency * chore: move gravity-ui to dev-dependencies --------- Co-authored-by: Benedikt Labrenz <benedikt@labrenz.org> Co-authored-by: F3l1x1vo <fli@ordix.de> Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * Implement Garage S3 deployment and configuration for E2E testing --------- Co-authored-by: dklOrdix <dkl@ordix.de> Co-authored-by: Benedikt Labrenz <benedikt@labrenz.org> Co-authored-by: Lukas Krug <lukas.krug@stackable.tech>
* #135 add garage instance to GitHub workflow for e2e tests * #135 fix yaml lint * #135 fix docker command in action * #135 fix docker options in action * #135 fix yaml format * #135 refactor GitHub action for s3 deployment with code fixes * #135 fix missing entrypoint in container * #135 remove format use on s3 creation * #135 add e2e tests that require a bucket * #135 allow local starting of s3 e2e tests, fix lint * #135 fix lint * #135 move garage.toml to permanent repository * #135 create keys and bucket via curl * #135 fix lint * #135 fix lint * Filebrowser: Refactor Filebrowser by using global state (#163) * feat: Trino functions in Code Completion (#78) * Add Trino functions to completion list * fix: Unclosed subqueries (#110) * correctly classify completion slots inside unclosed parenthesised subqueries * chore: Helm cleanup (#109) * add missing envs to helm chart & add probes with /healthz endpoint * update tech debt * change trino.completionDisabled to features.trino.completion.enabled * refactor: use global states * refactor: reorganise component structure * #159 Add VS Code Settings and Extensions (#160) * #159 add vs code settings and extensions * #159 update deprecated setting * #159 remove ruler * refactor: improve logging levels and clean up unused code * fix: fix bookmarks handling and improve loading state management * refactor: adjust z-index values for improved layering in BucketList component * refactor: enhance unpin menu functionality and add close button * refactor: enhance unpin context menu with improved positioning and close button * refactor: streamline unpin menu handling and improve focus management * refactor(frontend): clean up and restructure app (#84) * refactor(frontend): clean up and restructure app * fix: add lint:fix script to package.json and clean up trailing comma in +layout.svelte * docs: update AGENTS.md to include Material UI icon library usage * refactor(header): move components for header into own directory * chore: dedupe lockfile * fix(sidebar): add hover cursor style to toggle button * chore(types): centralise navigation and auth types; update header/sidebar imports Co-authored-by: Copilot <copilot@github.com> * #114 save sidebar collapse state in localStorage * refactor: merge if statements * refactor: increase timeout for new clusters Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: unused export Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: restore hr seperator Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: restore previous layout css Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: replace Iconify with unplugin-icons * refactor: update icon library usage to unplugin-icons with material-symbols --------- Co-authored-by: F3l1x1vo <fli@ordix.de> Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: update bucket icons to use gravity-ui and add new dependency * chore: move gravity-ui to dev-dependencies --------- Co-authored-by: Benedikt Labrenz <benedikt@labrenz.org> Co-authored-by: F3l1x1vo <fli@ordix.de> Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * #135 add e2e tests for s3 file browser * #135 add coverage report in markdown * Filebrowser: Refactor Filebrowser by using global state (#163) * feat: Trino functions in Code Completion (#78) * Add Trino functions to completion list * fix: Unclosed subqueries (#110) * correctly classify completion slots inside unclosed parenthesised subqueries * chore: Helm cleanup (#109) * add missing envs to helm chart & add probes with /healthz endpoint * update tech debt * change trino.completionDisabled to features.trino.completion.enabled * refactor: use global states * refactor: reorganise component structure * #159 Add VS Code Settings and Extensions (#160) * #159 add vs code settings and extensions * #159 update deprecated setting * #159 remove ruler * refactor: improve logging levels and clean up unused code * fix: fix bookmarks handling and improve loading state management * refactor: adjust z-index values for improved layering in BucketList component * refactor: enhance unpin menu functionality and add close button * refactor: enhance unpin context menu with improved positioning and close button * refactor: streamline unpin menu handling and improve focus management * refactor(frontend): clean up and restructure app (#84) * refactor(frontend): clean up and restructure app * fix: add lint:fix script to package.json and clean up trailing comma in +layout.svelte * docs: update AGENTS.md to include Material UI icon library usage * refactor(header): move components for header into own directory * chore: dedupe lockfile * fix(sidebar): add hover cursor style to toggle button * chore(types): centralise navigation and auth types; update header/sidebar imports Co-authored-by: Copilot <copilot@github.com> * #114 save sidebar collapse state in localStorage * refactor: merge if statements * refactor: increase timeout for new clusters Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: unused export Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: restore hr seperator Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: restore previous layout css Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: replace Iconify with unplugin-icons * refactor: update icon library usage to unplugin-icons with material-symbols --------- Co-authored-by: F3l1x1vo <fli@ordix.de> Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: update bucket icons to use gravity-ui and add new dependency * chore: move gravity-ui to dev-dependencies --------- Co-authored-by: Benedikt Labrenz <benedikt@labrenz.org> Co-authored-by: F3l1x1vo <fli@ordix.de> Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * #135 fix lint * Implement Garage S3 deployment and configuration for E2E testing * #135 fix lint * #135 refactor e2e directory structure, split storage test file into smaller files * #135 fix lint * #135 fix lint * #135 fix missing admin token in s3 config for tests * #135 add e2e tests for csv and image previews * #135 Delete E2E_COVERAGE.md --------- Co-authored-by: dklOrdix <dkl@ordix.de> Co-authored-by: Benedikt Labrenz <benedikt@labrenz.org> Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
* feat: Trino functions in Code Completion (#78) * Add Trino functions to completion list * fix: Unclosed subqueries (#110) * correctly classify completion slots inside unclosed parenthesised subqueries * chore: Helm cleanup (#109) * add missing envs to helm chart & add probes with /healthz endpoint * update tech debt * change trino.completionDisabled to features.trino.completion.enabled * #159 Add VS Code Settings and Extensions (#160) * #159 add vs code settings and extensions * #159 update deprecated setting * #159 remove ruler * #135 add garage instance to GitHub workflow for e2e tests * #135 fix yaml lint * #135 fix docker command in action * #135 fix docker options in action * #135 fix yaml format * #135 refactor GitHub action for s3 deployment with code fixes * #135 fix missing entrypoint in container * #135 remove format use on s3 creation * #135 add e2e tests that require a bucket * #135 allow local starting of s3 e2e tests, fix lint * #135 fix lint * #135 move garage.toml to permanent repository * #135 create keys and bucket via curl * #135 fix lint * #135 fix lint * refactor(frontend): clean up and restructure app (#84) * refactor(frontend): clean up and restructure app * fix: add lint:fix script to package.json and clean up trailing comma in +layout.svelte * docs: update AGENTS.md to include Material UI icon library usage * refactor(header): move components for header into own directory * chore: dedupe lockfile * fix(sidebar): add hover cursor style to toggle button * chore(types): centralise navigation and auth types; update header/sidebar imports Co-authored-by: Copilot <copilot@github.com> * #114 save sidebar collapse state in localStorage * refactor: merge if statements * refactor: increase timeout for new clusters Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: unused export Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: restore hr seperator Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: restore previous layout css Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: replace Iconify with unplugin-icons * refactor: update icon library usage to unplugin-icons with material-symbols --------- Co-authored-by: F3l1x1vo <fli@ordix.de> Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * Filebrowser: Refactor Filebrowser by using global state (#163) * feat: Trino functions in Code Completion (#78) * Add Trino functions to completion list * fix: Unclosed subqueries (#110) * correctly classify completion slots inside unclosed parenthesised subqueries * chore: Helm cleanup (#109) * add missing envs to helm chart & add probes with /healthz endpoint * update tech debt * change trino.completionDisabled to features.trino.completion.enabled * refactor: use global states * refactor: reorganise component structure * #159 Add VS Code Settings and Extensions (#160) * #159 add vs code settings and extensions * #159 update deprecated setting * #159 remove ruler * refactor: improve logging levels and clean up unused code * fix: fix bookmarks handling and improve loading state management * refactor: adjust z-index values for improved layering in BucketList component * refactor: enhance unpin menu functionality and add close button * refactor: enhance unpin context menu with improved positioning and close button * refactor: streamline unpin menu handling and improve focus management * refactor(frontend): clean up and restructure app (#84) * refactor(frontend): clean up and restructure app * fix: add lint:fix script to package.json and clean up trailing comma in +layout.svelte * docs: update AGENTS.md to include Material UI icon library usage * refactor(header): move components for header into own directory * chore: dedupe lockfile * fix(sidebar): add hover cursor style to toggle button * chore(types): centralise navigation and auth types; update header/sidebar imports Co-authored-by: Copilot <copilot@github.com> * #114 save sidebar collapse state in localStorage * refactor: merge if statements * refactor: increase timeout for new clusters Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: unused export Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: restore hr seperator Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: restore previous layout css Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: replace Iconify with unplugin-icons * refactor: update icon library usage to unplugin-icons with material-symbols --------- Co-authored-by: F3l1x1vo <fli@ordix.de> Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: update bucket icons to use gravity-ui and add new dependency * chore: move gravity-ui to dev-dependencies --------- Co-authored-by: Benedikt Labrenz <benedikt@labrenz.org> Co-authored-by: F3l1x1vo <fli@ordix.de> Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * #135 add e2e tests for s3 file browser * fix: Deployment issues with Helm (#152) * fix deployment issues with Helm * allow configuring origin and proxy in helm chart * refactor values.yaml & use secretKeyRefs instead of clear-text secrets * #135 add coverage report in markdown * Filebrowser: Refactor Filebrowser by using global state (#163) * feat: Trino functions in Code Completion (#78) * Add Trino functions to completion list * fix: Unclosed subqueries (#110) * correctly classify completion slots inside unclosed parenthesised subqueries * chore: Helm cleanup (#109) * add missing envs to helm chart & add probes with /healthz endpoint * update tech debt * change trino.completionDisabled to features.trino.completion.enabled * refactor: use global states * refactor: reorganise component structure * #159 Add VS Code Settings and Extensions (#160) * #159 add vs code settings and extensions * #159 update deprecated setting * #159 remove ruler * refactor: improve logging levels and clean up unused code * fix: fix bookmarks handling and improve loading state management * refactor: adjust z-index values for improved layering in BucketList component * refactor: enhance unpin menu functionality and add close button * refactor: enhance unpin context menu with improved positioning and close button * refactor: streamline unpin menu handling and improve focus management * refactor(frontend): clean up and restructure app (#84) * refactor(frontend): clean up and restructure app * fix: add lint:fix script to package.json and clean up trailing comma in +layout.svelte * docs: update AGENTS.md to include Material UI icon library usage * refactor(header): move components for header into own directory * chore: dedupe lockfile * fix(sidebar): add hover cursor style to toggle button * chore(types): centralise navigation and auth types; update header/sidebar imports Co-authored-by: Copilot <copilot@github.com> * #114 save sidebar collapse state in localStorage * refactor: merge if statements * refactor: increase timeout for new clusters Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: unused export Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: restore hr seperator Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: restore previous layout css Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: replace Iconify with unplugin-icons * refactor: update icon library usage to unplugin-icons with material-symbols --------- Co-authored-by: F3l1x1vo <fli@ordix.de> Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * refactor: update bucket icons to use gravity-ui and add new dependency * chore: move gravity-ui to dev-dependencies --------- Co-authored-by: Benedikt Labrenz <benedikt@labrenz.org> Co-authored-by: F3l1x1vo <fli@ordix.de> Co-authored-by: Lukas Krug <lukas.krug@stackable.tech> * #135 fix lint * Implement Garage S3 deployment and configuration for E2E testing * chore: update deprecated actions (#165) * #135 fix lint * test: add component tests * tests: fix linting errors and improve coverage * #135 refactor e2e directory structure, split storage test file into smaller files * #135 fix lint * #135 fix lint * #135 fix missing admin token in s3 config for tests * tests: increase coverage in unit tests for storage feature * fix: use prod only dependencies for SBOM generation (#176) * fix unit test error * add unit test step * add playwright install * fix warnings and errors in tests * add sync step before running tests * remove e2e_coverage.md --------- Co-authored-by: Benedikt Labrenz <benedikt@labrenz.org> Co-authored-by: F3l1x1vo <fli@ordix.de> Co-authored-by: Lukas Krug <lukas.krug@stackable.tech>
* #154 add refresh button * #154 make the refresh button white * Feat: add refresh button test to reload file listing in S3 browser * Fix: update visibility checks for recent items to use exact match * Feat: update delete button selector to use exact match in tests --------- Co-authored-by: dklOrdix <dkl@ordix.de>
* #127 add env variables for preview sizes, page sizes, row limits * #127 add env variables for max recent files * #127 refactor deprecated flags * feat: add environment variable configuration for feature flags and storage preview limits * fix(unit tests): add mock setup for public env variables * fix: fix import path --------- Co-authored-by: dklOrdix <dkl@ordix.de>
* chore: Rename and cleanup (#188) * rename container image and chart from stackable-ui to cockpit * clean up files * use env.IMAGE_NAME in chart-directory * Rename: stackable-ui → stackable-cockpit (#190) * rename: stackable-ui → stackable-cockpit Rename all occurrences of the old repository name across source files: - Package name: @stackable/stackable-ui → @stackable/stackable-cockpit - Env var prefix: STACKABLE_UI_ → STACKABLE_COCKPIT_ (and PUBLIC_ variant) - Service/client identifiers, Kubernetes secret names, and Trino usernames - Log service label and X-Trino-Source header value - Dev setup scripts and Helm/Kubernetes config * rename: stackable-ui → stackable-cockpit * rename: stackable-ui → stackable-cockpit * rename: stackable-ui → stackable-cockpit in feature-branch additions Complete the rename for files introduced in feat/s3-file-browser: - dev/garage/garage.toml: tmp paths and e2e admin token - dev/garage/templates/deployment.yaml: container mount path - dev/setup.sh: Garage admin token in probe and setup commands; storage env vars (STACKABLE_COCKPIT_STORAGE_BROWSER_ENABLED and preview/pagination vars) added to both heredocs - .github/workflows/pr_checks.yaml: Garage admin token - .env.test: all STACKABLE_UI_ → STACKABLE_COCKPIT_ plus new storage/ pagination vars renamed; Garage token value updated - src/lib/server/feature-flags.ts: STACKABLE_UI_ → STACKABLE_COCKPIT_ for all storage browser and preview-limit flags - TECH_DEBT.md: update Helm chart path reference --------- Co-authored-by: Benedikt Labrenz <benedikt@labrenz.org>
…ctor/service-into-storagprovider
…ls.storageConfig via middleware
Conflicts were mostly from #380, which touched storage code that v1 has rewritten. Kept v1's structure and ported the #380 fixes onto it: - Type the storage connect/edit superforms messages with StorageConnectionMessage instead of the 'ok' / bare-string sentinel. - Stop trimming S3 object keys and prefixes in the storage API and in StorageObjectNameSchema; callers trim user input. - Keep v1's requireConfig (request-context.ts) instead of requireStorageConfig, and v1's server-side check that a changed access key needs a secret key. Drop main's client-side check, its duplicate e2e test and message key. - Take main's mock server ports in playwright.config.ts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The app webServer piped stdout, so every pino log line was interleaved with the Playwright output. Server stderr is still shown.
Archive entry names are relative to the download prefix since 7d3321a (sanitise archive entry names); the download tests still expected full object keys.
…nection The browse page load read connectionStore, which the storage layout load fills as a side effect, without awaiting parent(). After a full page load the page load could run first, see no active connection and redirect a valid bucket route to the storage overview. This made storage e2e tests flaky in Firefox.
The retry worked around the browse route redirecting to the storage overview, which is fixed now. Keeping it would hide a regression.
The dialog close event fires in a later task than dialog.close(). When a modal was closed and a new one opened through the same open binding before that event arrived, the destroyed Modal's handler set open to false and closed the new dialog. This made the drag-and-drop upload e2e tests flaky: a second drop after cancelling did not reopen the dialog.
Enter on the focused Cancel button in the delete dialog confirmed the delete. Remove the override so Enter activates the focused button, and invert the spec that locked the old behaviour in. The window-level Ctrl+A/C/V/X/Delete/F2/Escape handler fired from anywhere on the page: text could not be copied, and Delete in the tab bar opened the delete dialog. Together with the Cancel bug, typing a name with rows selected, then Delete, then Enter deleted the files. The handler now ignores events that were already handled, events from text fields, and events from outside the object list.
Conflict detection looked up `destPrefix + keyToName(key)`, which turns the folder `dir/` into the file `dir`. Real folder conflicts were never detected, while a file named like the folder was, and Replace deleted it. Since the same-folder guard only applied when every item conflicted, a same-folder paste with partial conflicts plus Replace deleted the source. Build destination keys with the trailing slash for folders and detect folders without a marker object via a one-item listing. Drop cut items that already sit in the destination, and skip Replace for any entry whose deletion would remove its own source (same key, or a folder that contains it). The server now refuses moves and copies onto the same key as defence in depth.
A cut that went through the conflict dialog left the clipboard in cut mode with the old source keys. A second paste with Replace then deleted the file that had just been moved, and the move failed because the source no longer existed. Both paste paths now point the clipboard at the moved items in copy mode. Copying an item back into its own folder is no longer treated as a conflict, so the server renames it as before instead of the paste silently doing nothing. A drag-and-drop move to the same path in another bucket is no longer dropped. The replace-destroys-source guard is computed in one place.
Copying or cutting `docs/` and pasting it into `docs/sub/`, where `docs/sub/docs/` already existed, offered Replace, which recursively deleted part of the source tree. `paste()` had no folder-into-itself guard, unlike drag-and-drop moves. Refuse such a paste with a warning toast, and make the Replace target check also reject a destination inside a folder source. The folder-into-itself check for moves now only applies within the same bucket, so a move to the same path in another bucket is allowed.
The preview endpoint parsed `offset` and `limit` with `parseInt` and only clamped them when infinite scroll was off, which is not the default. A single request with a huge limit on a large Parquet file made the server decode that many rows and could kill the pod. Validate both with zod before any S3 call, regardless of the infinite-scroll setting, and answer invalid values with 400. The maximum limit is the configured preview row count, but never below the client's chunk size, which is now a shared constant.
Saving merged the edited preview head (at most 256 KiB) with the stored bytes after the cut. A multi-byte character at the boundary was mangled, UTF-16 files were re-encoded as UTF-8 with the UTF-16 tail appended, and nothing guarded against a concurrent change. Editable text files up to the edit limit are now loaded in full, together with their ETag. The save endpoint writes exactly the bytes it receives, enforces the edit limit on the body itself, and refuses with 409 when the object changed since loading (HEAD compare, then a conditional PUT with If-Match). The editor is read-only, with a notice, for truncated, non-lossless UTF-8, archive-entry or ETag-less content. A UTF-8 BOM survives the round trip, and a second Ctrl+S during a save is ignored. adapter-node's default 512K body limit would have rejected these saves in production, so the image now sets BODY_SIZE_LIMIT=6M, the E2E app uses the same value, and the Helm chart can override it.
`uniqueDestKey` split the destination key at its last dot anywhere in the path, so `dir.v2/file` became `dir (1).v2/file` and the folder `v1.2/` became `v1 (1)/`. The create dialog had the same flaw. A shared `numberedName` helper now changes only the last path segment: folders get the number at the end, files before their last extension, and a leading dot does not count as an extension. The zip download, which had its own correct copy of this logic, uses the helper too.
Renaming during a move conflict first renamed the source in place. The dialog only checked the new name at the destination, so when a sibling with that name already existed next to the source, the server refused the rename but still answered 200, the client ignored the result, and then moved the existing sibling to the destination with a success toast. A renamed entry is now moved in one request straight to its new name at the destination. A rename or move to an explicit destination key that fails entirely now returns 409/400/500 instead of 200, and the client checks every rename result, showing an error or partial-failure toast instead of success. The paste path had the same unchecked rename. It also could not find a pasted folder without a marker object, so renaming a pasted folder (and "Keep both" for folders) always failed. The pasted folder root is now derived from its children's results, and after a cut the clipboard points at the renamed folder. Conflict rename names are validated (no "/", ".", ".." or invalid characters).
Each part of a multi-part download is its own server-side job, and jobs expired counting from creation: finished ones after 5 minutes, running ones after 30. The first finished part was therefore dropped about 5 minutes in; the client treated the resulting 404 as "not started yet" for its 60 s grace period and then finalised the whole download as an error, roughly 6-7 minutes after it started. A part streaming for more than 30 minutes was dropped mid-transfer. Jobs now track `updatedAt`, refreshed on progress and on completion, and expire 30 minutes after their last progress while running or 5 minutes after finishing. The client keeps the last status it saw for each job, so a finished job the server has forgotten keeps its outcome, and one that vanished while running ends in a new "unknown" status instead of "failed". Download operations are not shown in the operations menu, so for them this only affects when polling stops.
Delete, move and copy bodies validated existing keys with the schema for names users type, so keys created by other tools containing ? " < > \ | or . / .. segments could not be deleted, moved or renamed. Existing keys now use StorageObjectKeySchema (non-empty, at most 1024 UTF-8 bytes, no control characters); typed names keep the stricter policy.
The modal's capture-phase Escape listener ran before any inner handler, so Escape in Monaco's find widget closed the whole preview. The topmost dialog was also picked by document order, so with the search opened over the preview, Escape closed the preview. The listener now runs in the bubbling phase, so widgets that handle Escape (Monaco keybindings, nested layers) stop it first. An Escape that Monaco's text-area input prevents without handling (Firefox) still closes the dialog, which is why the capture listener existed. Dialogs are tracked in the order they were opened, matching the top layer. Escape in the editor with a selection or several cursors now clears those first; a second Escape closes the preview.
Browser Back/Forward reloaded the listing for the URL's continuation token but kept the single shared previous-page token stack, so the page number and Prev pointed at the wrong page. Store the stack in the history entry's page state and restore it when the listing is synced.
The create dialog ignored an invalid name without a word, the rename dialog closed as if cancelled, and the inline create menu only said the create failed. Both dialogs and the inline menu now validate the typed name as it is entered and explain the problem at the input in a polite live region, with aria-invalid and aria-describedby. An unchanged name with surrounding whitespace is not renamed. The create endpoint checked the full key with the strict name policy, so nothing could be created inside a folder such as reports?2024/. It now accepts any key S3 allows, as move already does; the strict policy stays a client-side check on the typed name.
The host check passed hosts straight to zod's IPv6 validator, which does not accept brackets, so `[::1]` and `http://[::1]:9000` were rejected, while a bare `::1` was stored unbracketed and produced the unparseable endpoint `http://::1:9000`. Bracketed IPv6 literals are now accepted and bare ones are stored bracketed. The SSRF policy is unchanged. Seven routes copied the same inline `key` presence check, create used `StorageObjectKeySchema`, and save-text had its own zod field. All nine now use `requireObjectKey`, which also applies the key schema, so read routes refuse keys over 1024 bytes or with control characters like delete, move and copy already do.
…ror page The Monaco "Save File" action label was hardcoded English; it now uses the storage_editor_save_action message (en + de). The storage error page relied solely on page.params for connection and bucket. When SvelteKit does not populate child-route params (client-side load errors), the bucket-specific message was lost and resolve() threw on the missing params, crashing the error page itself. Restore main's URL-path fallback for the new /storage/browse/[connection]/[bucket] layout, decode segments safely, and render the breadcrumb link only when both connection and bucket are known.
The paste, rename and move feature flags only hid UI actions; the copy and move endpoints never checked them, so the docs' claim that operators can disable these operations was misleading. Copy now requires the paste flag. A move whose explicit destination key stays in the source folder of the same bucket counts as a rename and requires the rename or paste flag; any other move requires the move or paste flag. Paste covers both because a cut-and-paste sends the same request as a drag move, and paste's "keep both" sends a rename. Blocked requests get 404, as other disabled features do, and a warn log. The cut/copy flag only fills the browser clipboard and is documented as client-only.
Existing object keys are now validated exactly as S3 does: non-empty and at most 1024 bytes of UTF-8. Control characters are no longer refused, so objects created by other tools can be previewed, downloaded, moved and deleted. Names the user types keep the strict policy. ListObjectsV2 requests EncodingType=url and, when the response echoes it, decodes keys and common prefixes, so keys with characters XML cannot carry, or that XML parsing normalises, arrive intact. Keys DeleteObjects cannot name in its XML body are deleted individually, four at a time, instead of failing the whole batch.
Leftovers from the key-validation changes: `hasControlCharacter` was split out only so the key schema could use it, and the key schema's doc comment still described existing keys only. Inline the helper again and describe what the schema actually validates. The download manifest routes checked their keys by hand; they now use body schemas built on `StorageObjectKeySchema` with the same limits and error message. A `null` body now gets 400 instead of a 500 TypeError. Tests pin that typed names still reject control characters.
Typed create names accepted empty segments, so `/a` created the marker `prefix/` + `/`, `a//b` produced `a//` markers, and a file named `a/` silently became a folder marker. File or folder is chosen in the menu and the folder slash is added by the app, so names that start or end with "/" or contain "//" are now rejected with an inline error. The server still accepts any legal key. The download manifests POST also validates its `prefix` query parameter with `StoragePrefixSchema` instead of storing it unchecked.
…er API Copy, cut/paste, drag-move and rename were orchestrated by the client as several non-atomic requests. The server now plans and runs transfers itself: - POST /api/storage/transfer/plan previews destinations, conflicts, suggested names and refusals for the conflict dialog. - POST /api/storage/transfer runs one copy, move or rename for up to 1000 selected items and streams NDJSON per item (item-start, progress, item-done, complete). Statuses: done, partial, failed, refused, cancelled. - Folder conflicts merge (destination-only files are kept); file conflicts replace by overwriting, never by deleting first. Keep both and rename pick a free name at execution time; a rename never overwrites. - A move deletes exactly the keys it copied, only after every copy of that item succeeded. - Destinations that overlap a source are refused, including a folder into its own subtree or into an ancestor that contains it. Destination prefixes must be folders, and child keys over 1024 bytes are refused before anything is copied. - Copies run server-side with CopyObject, also across buckets of one connection; no data streams through the app. - Cancel aborts running S3 calls and keeps the originals of unfinished items. A client disconnect does not cancel; the client reads the item results back from the job, which a heartbeat keeps alive. - Objects per item are copied through a pool sized by STACKABLE_COCKPIT_STORAGE_TRANSFER_CONCURRENCY (default 8).
Bohreromir
force-pushed
the
feat/s3-file-browser-v1
branch
from
October 14, 2026 13:55
dfacc87 to
662417e
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #129