+ {/* Header: selection + name/remark, with status badge + actions menu */}
+
+
+ {!isTagRow && selectCell && (
+
{selectCell}
+ )}
+
{nameCell}
+
+
+ {statusCell}
+ {actionsCell}
+
+
+
+ {/* Body: labelled fields for every remaining column */}
+
+ {FIELD_COLUMN_IDS.map((id) => {
+ const content = renderCell(id)
+ return (
+
+
+ {fieldLabels[id]}
+
+
+ {content ?? -}
+
+
+ )
+ })}
+
+
+ )
+}
diff --git a/web/default/src/features/channels/components/channels-table.tsx b/web/default/src/features/channels/components/channels-table.tsx
index 53f66d48..df2979e6 100644
--- a/web/default/src/features/channels/components/channels-table.tsx
+++ b/web/default/src/features/channels/components/channels-table.tsx
@@ -51,12 +51,14 @@ import {
} from '../lib'
import type { Channel, ChannelSortBy } from '../types'
import { useChannelsColumns } from './channels-columns'
+import { ChannelCard } from './channel-card'
import { useChannels } from './channels-provider'
import { DataTableBulkActions } from './data-table-bulk-actions'
const route = getRouteApi('/_authenticated/channels/')
const CHANNELS_COLUMN_VISIBILITY_STORAGE_KEY =
'channels:column-visibility'
+const CHANNELS_VIEW_MODE_STORAGE_KEY = 'channels:view-mode'
const CHANNEL_SORTABLE_COLUMNS = new Set