v0.5.0
GitHub

reactiveColumnVisibility

The reactiveColumnVisibility function creates a column visibility plugin for table instances, enabling dynamic control over which columns are displayed.

Signature

			function reactiveColumnVisibility<T>(
	options?: ColumnVisibilityOptions<T>
): TablePlugin<T, ColumnVisibilityState<T>, 'columnVisibility'>;
		

Parameters

ParameterTypeDescription
optionsColumnVisibilityOptions<T>Optional configuration for column visibility behavior

ColumnVisibilityOptions

PropertyTypeDefaultDescription
hiddenColumns(keyof T)[][]Array of column keys to hide initially

Return Value

Returns a TablePlugin that adds column visibility functionality when passed to the use method of the table.

Basic Usage

			<script lang="ts">
	import { reactiveTable, reactiveColumnVisibility } from 'svelte-reactive-table';

	const data = [
		/* Your data array */
	];
	const columns = [
		/* Your column definitions */
	];

	// Create a table with column visibility plugin
	const table = reactiveTable(data, columns).use(
		reactiveColumnVisibility({
			hiddenColumns: ['age'] // Initially hide the age column
		})
	);

	// Access the column visibility API through table.plugins
	const { columnVisibility } = table.plugins;
</script>

<!-- Column visibility controls -->
<div>
	<button onclick={() => columnVisibility.toggleVisibility('age')}>
		{columnVisibility.isVisible('age') ? 'Hide' : 'Show'} Age
	</button>
</div>

<table>
	<thead>
		<tr>
			{#each table.headers as header}
				<th>{header}</th>
			{/each}
		</tr>
	</thead>
	<tbody>
		{#each table.rows as row}
			<tr>
				{#each row.cells as cell}
					<td>{cell.value}</td>
				{/each}
			</tr>
		{/each}
	</tbody>
</table>
		

Column Visibility Properties

When column visibility plugin is used, these properties are available:

PropertyTypeDescription
columnVisibility.hiddenColumns(keyof T)[]Array of hidden column accessors

Column Visibility Methods

These methods are available on the columnVisibility plugin state:

MethodReturn TypeDescription
isVisible(accessor: keyof T)booleanCheck if a specific column is visible
setVisibility(accessor: keyof T, isVisible: boolean)voidSet a specific column’s visibility
toggleVisibility(accessor: keyof T)voidToggle visibility of a specific column
showColumn(accessor: keyof T)voidMake a column visible
hideColumn(accessor: keyof T)voidHide a column
showColumns(accessors: (keyof T)[])voidMake multiple columns visible
hideColumns(accessors: (keyof T)[])voidHide multiple columns
setVisibleColumns(accessors: (keyof T)[])voidShow only specified columns, hiding all others
resetVisibility()voidReset all columns to their default visibility

Example Controls

			<div class="column-controls">
	<!-- Toggle individual column -->
	<button onclick={() => columnVisibility.toggleVisibility('age')}> Toggle Age Column </button>

	<!-- Reset all column visibility -->
	<button onclick={columnVisibility.resetVisibility}> Show All Columns </button>

	<!-- Show only specific columns -->
	<button onclick={() => columnVisibility.setVisibleColumns(['name', 'email'])}>
		Show Only Name & Email
	</button>
</div>
		

Column Selector Interface

Complete implementation of a column visibility selector:

			<div class="column-selector">
	<h3>Visible Columns</h3>
	<div class="column-checkboxes">
		{#each table.allColumns as column}
			<label class="column-toggle">
				<input
					type="checkbox"
					checked={columnVisibility.isVisible(column.accessor)}
					onchange={() => columnVisibility.toggleVisibility(column.accessor)}
				/>
				<span>{column.header}</span>
			</label>
		{/each}
	</div>

	<div class="column-actions">
		<button onclick={columnVisibility.resetVisibility}> Show All </button>
		<button onclick={() => columnVisibility.hideColumns(['age', 'email'])}>
			Hide Personal Info
		</button>
	</div>
</div>

<style>
	.column-selector {
		padding: 1rem;
		border: 1px solid #e2e8f0;
		border-radius: 0.5rem;
		background: #f8fafc;
	}

	.column-checkboxes {
		display: flex;
		flex-direction: column;
		gap: 0.5rem;
		margin: 1rem 0;
	}

	.column-toggle {
		display: flex;
		align-items: center;
		gap: 0.5rem;
		cursor: pointer;
	}

	.column-actions {
		display: flex;
		gap: 0.5rem;
	}
</style>
		

Batch Operations Example

			<script>
	// Predefined column groups for quick toggling
	const columnGroups = {
		personal: ['name', 'age', 'email'],
		work: ['department', 'position', 'salary'],
		contact: ['email', 'phone', 'address']
	};

	function showGroup(groupName) {
		const columns = columnGroups[groupName];
		columnVisibility.showColumns(columns);
	}

	function hideGroup(groupName) {
		const columns = columnGroups[groupName];
		columnVisibility.hideColumns(columns);
	}

	function showOnlyGroup(groupName) {
		const columns = columnGroups[groupName];
		columnVisibility.setVisibleColumns(columns);
	}
</script>

<div class="group-controls">
	{#each Object.keys(columnGroups) as groupName}
		<div class="group-actions">
			<span>{groupName}:</span>
			<button onclick={() => showGroup(groupName)}>Show</button>
			<button onclick={() => hideGroup(groupName)}>Hide</button>
			<button onclick={() => showOnlyGroup(groupName)}>Only</button>
		</div>
	{/each}
</div>
		

TypeScript Support

			import { reactiveTable, reactiveColumnVisibility } from 'svelte-reactive-table';

type User = {
	id: number;
	name: string;
	age: number;
	email: string;
};

const table = reactiveTable<User>(users, columns).use(
	reactiveColumnVisibility<User>({
		hiddenColumns: ['email']
	})
);

// TypeScript will infer the correct column visibility state type
const { columnVisibility } = table.plugins;