SettingsPage now accepts PluginSettingsProps (data, onDataChange)
and is registered directly as a component (not wrapped in function).
This matches the pattern used in headlamp-polaris-plugin.
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
This matches the polaris plugin naming convention where the package
name is just 'polaris', causing Headlamp to display 'sealed-secrets'
in the plugin settings list instead of 'headlamp-sealed-secrets'.
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
- Fix extra closing Box tag in SettingsPage causing blank display
- Change display name from 'Sealed Secrets Plugin for Headlamp' to 'Sealed Secrets'
- Use default values for params to avoid undefined in hooks (fixes retry button issue)
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Major UX improvements:
- Changed detail view from full page to drawer (slides from right)
- Moved plugin settings from sidebar to Settings → Plugins (proper pattern)
- Fixed React error #310 by adding defensive String() wrappers
- Fixed syncMessage getter to always return string
- Added safety checks for encryptedData access
- Added error handling for useGet failures
The drawer approach keeps the list visible while viewing details,
matching Headlamp's design patterns. Settings are now properly
located in the global Settings → Plugins section instead of
cluttering the plugin's sidebar navigation.
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
The error was caused by attempting to read the response body twice:
- First with response.json()
- Then with response.text() in the error handler
This caused the 'Body is disturbed or locked' error that was being
displayed as 'The string did not match the expected pattern'.
Fix: Removed the duplicate response.text() call in error handler.
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
The plugin was importing from internal Headlamp paths like
'@kinvolk/headlamp-plugin/lib/lib/k8s/cluster' instead of using the
official public API '@kinvolk/headlamp-plugin/lib'.
This caused the plugin to fail loading in the browser with:
"TypeError: undefined is not an object (evaluating 'Ot.KubeObject')"
Changes:
- Updated imports to use K8s.cluster and ApiProxy from main export
- Added vite.config.js with custom globals (now obsolete with this fix)
- Moved node-forge to dependencies for proper bundling
The plugin now uses only the official documented Headlamp plugin API.
Fixes: #[issue number if exists]
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Moving node-forge from dependencies to devDependencies ensures it gets
bundled into the plugin instead of being externalized. This is required
because Headlamp doesn't provide node-forge as a shared library.
The .pluginrc file with empty externals forces bundling of all deps,
and keeping node-forge in devDependencies makes this behavior explicit.
This fixes the frontend loading error:
"TypeError: undefined is not an object (evaluating 'Ot.KubeObject')"
Changes:
- Moved node-forge from dependencies to devDependencies
- Updated package-lock.json to mark node-forge as dev dependency
- .pluginrc remains in place to enforce bundling
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
The Headlamp plugin build system was externalizing node-forge because it
was in dependencies. Since Headlamp doesn't provide node-forge as a shared
library, the plugin would fail to load in the browser.
Solution: Add .pluginrc with empty externals to force bundling all dependencies.
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Merged prepare-release and release workflows into a single workflow
that handles everything in one job. This eliminates the need for
separate tokens or manual intervention.
Single workflow now:
- Validates version format
- Updates package.json and artifacthub-pkg.yml
- Builds and packages plugin (with type check and linting)
- Computes checksum
- Verifies tarball contents
- Updates metadata with real checksum
- Commits all changes to main
- Creates and pushes tag
- Creates GitHub release with tarball
No more tag push triggers, no separate tokens needed.
Everything runs in one workflow_dispatch job.
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>