From 3e757db7995bb599d76ffa295455fd0c33fe2571 Mon Sep 17 00:00:00 2001 From: Chris Farhood Date: Thu, 19 Feb 2026 13:31:01 -0500 Subject: [PATCH] chore: release v0.2.2 Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude Co-Authored-By: Happy --- CHANGELOG.md | 10 +++++++- artifacthub-pkg.yml | 20 ++++++---------- headlamp-tns-csi-plugin-0.2.2.tar.gz | Bin 0 -> 17355 bytes package.json | 2 +- src/index.tsx | 34 ++++++++++++++++++++++++--- 5 files changed, 48 insertions(+), 18 deletions(-) create mode 100644 headlamp-tns-csi-plugin-0.2.2.tar.gz diff --git a/CHANGELOG.md b/CHANGELOG.md index 61e62a7..aa1813b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.2.2] - 2026-02-19 + +### Fixed + +- **Duplicate columns** — Protocol and Pool columns on mixed-driver clusters (tns-csi + rook-ceph) are now merged into a single shared column rather than duplicated; whichever plugin loads first owns the column and the second merges into it +- **Plugin settings name** — settings entry now registers as `tns-csi` instead of `headlamp-tns-csi-plugin` + ## [0.2.1] - 2026-02-19 ### Fixed @@ -55,7 +62,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - TypeScript strict mode with zero `any` types - ESLint + Prettier code quality tooling -[Unreleased]: https://github.com/privilegedescalation/headlamp-tns-csi-plugin/compare/v0.2.1...HEAD +[Unreleased]: https://github.com/privilegedescalation/headlamp-tns-csi-plugin/compare/v0.2.2...HEAD +[0.2.2]: https://github.com/privilegedescalation/headlamp-tns-csi-plugin/compare/v0.2.1...v0.2.2 [0.2.1]: https://github.com/privilegedescalation/headlamp-tns-csi-plugin/compare/v0.2.0...v0.2.1 [0.2.0]: https://github.com/privilegedescalation/headlamp-tns-csi-plugin/compare/v0.1.0...v0.2.0 [0.1.0]: https://github.com/privilegedescalation/headlamp-tns-csi-plugin/releases/tag/v0.1.0 diff --git a/artifacthub-pkg.yml b/artifacthub-pkg.yml index a6da6d3..366873c 100644 --- a/artifacthub-pkg.yml +++ b/artifacthub-pkg.yml @@ -1,4 +1,4 @@ -version: "0.2.1" +version: "0.2.2" name: headlamp-tns-csi-plugin displayName: TrueNAS CSI (tns-csi) description: >- @@ -47,19 +47,13 @@ links: url: https://github.com/longhorn/kbench changes: - - kind: added - description: "Overview dashboard: driver health, storage summary, protocol distribution, non-Bound PVC alerts" - - kind: added - description: "Storage Classes, Volumes, Snapshots pages with slide-in detail panels" - - kind: added - description: "Metrics page: Prometheus WebSocket health, volume ops, CSI ops from controller pod" - - kind: added - description: "Benchmark page: kbench Job+PVC lifecycle, FIO log parser, results with IOPS/bandwidth/latency cards" - - kind: added - description: "PVC detail injection: TNS-CSI section on Headlamp PVC detail pages" + - kind: fixed + description: "Duplicate Protocol/Pool columns on mixed-driver clusters now merged into a single shared column" + - kind: fixed + description: "Plugin settings entry renamed from headlamp-tns-csi-plugin to tns-csi" annotations: - headlamp/plugin/archive-url: "https://github.com/privilegedescalation/headlamp-tns-csi-plugin/releases/download/v0.2.1/headlamp-tns-csi-plugin-0.2.1.tar.gz" - headlamp/plugin/archive-checksum: "sha256:9d53ae89996be6edbfbdb239c95d9d808fcab2de19c23b8f7b8d9abe1c51877b" + headlamp/plugin/archive-url: "https://github.com/privilegedescalation/headlamp-tns-csi-plugin/releases/download/v0.2.2/headlamp-tns-csi-plugin-0.2.2.tar.gz" + headlamp/plugin/archive-checksum: "sha256:fa6506d581ea5a609598912596995f3dd2b2501ee4f66aff5f6cd93beb525549" headlamp/plugin/version-compat: ">=0.20.0" headlamp/plugin/distro-compat: "in-cluster,web,app" diff --git a/headlamp-tns-csi-plugin-0.2.2.tar.gz b/headlamp-tns-csi-plugin-0.2.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..66f323901ef6bc6559a740b0f2a83eefa1d85ea3 GIT binary patch literal 17355 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 C_wF44 literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 5791188..3ba3925 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "headlamp-tns-csi-plugin", - "version": "0.2.1", + "version": "0.2.2", "description": "Headlamp plugin for TNS-CSI driver visibility and benchmarking", "repository": { "type": "git", diff --git a/src/index.tsx b/src/index.tsx index ecea5b8..ebcf33e 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -187,12 +187,40 @@ registerDetailsViewSection(({ resource }) => { // Table column processors — native StorageClass and PV tables // --------------------------------------------------------------------------- +// Merges incoming columns into existing ones by label. +// If a column with the same label already exists, the incoming getValue/render +// takes priority and falls back to the existing one (for mixed-driver tables). +function mergeColumns( + existing: T[], + incoming: Array<{ label: string; getValue: (r: unknown) => unknown; render: (r: unknown) => React.ReactNode }> +): T[] { + type ObjCol = { label: string; getValue: (r: unknown) => unknown; render: (r: unknown) => React.ReactNode }; + const isObjCol = (c: unknown): c is ObjCol => + typeof c === 'object' && c !== null && 'label' in c; + const result = [...existing]; + const toAppend: typeof incoming = []; + for (const col of incoming) { + const idx = result.findIndex(c => isObjCol(c) && (c as ObjCol).label === col.label); + if (idx !== -1) { + const prev = result[idx] as ObjCol; + result[idx] = { + label: col.label, + getValue: (r: unknown) => col.getValue(r) ?? prev.getValue(r), + render: (r: unknown) => col.getValue(r) !== null ? col.render(r) : prev.render(r), + } as unknown as T; + } else { + toAppend.push(col); + } + } + return [...result, ...(toAppend as unknown as T[])]; +} + registerResourceTableColumnsProcessor(({ id, columns }) => { if (id === 'headlamp-storageclasses') { - return [...columns, ...buildStorageClassColumns()]; + return mergeColumns(columns, buildStorageClassColumns()); } if (id === 'headlamp-persistentvolumes') { - return [...columns, ...buildPVColumns()]; + return mergeColumns(columns, buildPVColumns()); } return columns; }); @@ -210,4 +238,4 @@ registerDetailsViewHeaderAction(({ resource }) => { // Plugin settings // --------------------------------------------------------------------------- -registerPluginSettings('headlamp-tns-csi-plugin', TnsCsiSettings, true); +registerPluginSettings('tns-csi', TnsCsiSettings, true);