Documentation
Column Reordering
Column reordering allows users to drag and drop columns to reorganize the table layout according to their preferences. Columns can be reordered by dragging column headers or through the column editor (when editColumns=).
1import { useState } from "react";2import { SimpleTable } from "@simple-table/react";3import type { Theme, ReactHeaderObject } from "@simple-table/react";4import { columnReorderingConfig } from "./column-reordering.demo-data";5import "@simple-table/react/styles.css";67const ColumnReorderingDemo = ({8 height = "400px",9 theme,10}: {11 height?: string | number;12 theme?: Theme;13}) => {14 const [headers, setHeaders] = useState(() => [...columnReorderingConfig.headers]);1516 const handleColumnOrderChange = (newHeaders: ReactHeaderObject[]) => {17 setHeaders(newHeaders);18 };1920 return (21 <SimpleTable22 columnReordering={columnReorderingConfig.tableProps.columnReordering}23 defaultHeaders={headers}24 rows={columnReorderingConfig.rows}25 height={height}26 theme={theme}27 onColumnOrderChange={handleColumnOrderChange}28 />29 );30};3132export default ColumnReorderingDemo;
1<template>2 <SimpleTable3 :column-reordering="true"4 :default-headers="headers"5 :rows="columnReorderingConfig.rows"6 :height="height"7 :theme="theme"8 @column-order-change="handleColumnOrderChange"9 />10</template>1112<script setup lang="ts">13import { ref } from "vue";14import { SimpleTable } from "@simple-table/vue";15import type { Theme, VueHeaderObject } from "@simple-table/vue";16import { columnReorderingConfig } from "./column-reordering.demo-data";17import "@simple-table/vue/styles.css";1819withDefaults(defineProps<{ height?: string | number; theme?: Theme }>(), {20 height: "400px",21});2223const headers = ref<VueHeaderObject[]>([...columnReorderingConfig.headers]);2425const handleColumnOrderChange = (newHeaders: VueHeaderObject[]) => {26 headers.value = newHeaders;27};28</script>
1import { Component, Input } from "@angular/core";2import { SimpleTableComponent } from "@simple-table/angular";3import type { AngularHeaderObject, Row, Theme } from "@simple-table/angular";4import { columnReorderingConfig } from "./column-reordering.demo-data";5import "@simple-table/angular/styles.css";67@Component({8 selector: "column-reordering-demo",9 standalone: true,10 imports: [SimpleTableComponent],11 template: `12 <simple-table13 [rows]="rows"14 [defaultHeaders]="headers"15 [height]="height"16 [theme]="theme"17 [columnReordering]="true"18 (columnOrderChange)="onColumnOrderChange($event)"19 ></simple-table>20 `,21})22export class ColumnReorderingDemoComponent {23 @Input() height: string | number = "400px";24 @Input() theme?: Theme;2526 readonly rows: Row[] = columnReorderingConfig.rows;27 headers: AngularHeaderObject[] = [...columnReorderingConfig.headers];2829 onColumnOrderChange(newHeaders: AngularHeaderObject[]): void {30 this.headers = newHeaders;31 }32}333435// column-reordering.demo-data.ts36// Self-contained demo table setup for this example.37import type { AngularHeaderObject } from "@simple-table/angular";383940export const columnReorderingHeaders: AngularHeaderObject[] = [41 { accessor: "id", label: "ID", width: 60, type: "number" },42 { accessor: "name", label: "Name", width: "1fr", type: "string" },43 { accessor: "age", label: "Age", width: 80, align: "right", type: "number" },44 { accessor: "role", label: "Role", minWidth: 100, width: "1fr", type: "string" },45 { accessor: "department", disableReorder: true, label: "Department", width: "1fr", type: "string" },46];4748export const columnReorderingData = [49 { id: 1, name: "Captain Stella Vega", age: 38, role: "Mission Commander", department: "Flight Operations" },50 { id: 2, name: "Dr. Cosmos Rivera", age: 34, role: "Astrophysicist", department: "Science" },51 { id: 3, name: "Commander Nebula Johnson", age: 42, role: "Operations Director", department: "Mission Control" },52 { id: 4, name: "Cadet Orbit Williams", age: 26, role: "Flight Engineer", department: "Engineering" },53 { id: 5, name: "Dr. Galaxy Chen", age: 31, role: "Life Support Specialist", department: "Engineering" },54 { id: 6, name: "Lt. Meteor Lee", age: 29, role: "Navigation Officer", department: "Flight Operations" },55 { id: 7, name: "Dr. Comet Hassan", age: 33, role: "Mission Planner", department: "Planning" },56 { id: 8, name: "Major Pulsar White", age: 36, role: "Communications Director", department: "Communications" },57 { id: 9, name: "Specialist Quasar Black", age: 28, role: "Systems Analyst", department: "Technology" },58 { id: 10, name: "Engineer Supernova Blue", age: 35, role: "Propulsion Engineer", department: "Engineering" },59 { id: 11, name: "Dr. Aurora Kumar", age: 30, role: "Planetary Geologist", department: "Science" },60 { id: 12, name: "Admiral Cosmos Silver", age: 45, role: "Program Director", department: "Leadership" },61];6263export const columnReorderingConfig = {64 headers: columnReorderingHeaders,65 rows: columnReorderingData,66 tableProps: { columnReordering: true },67} as const;68
1<script lang="ts">2 import { SimpleTable } from "@simple-table/svelte";3 import type { Theme, SvelteHeaderObject } from "@simple-table/svelte";4 import { columnReorderingConfig } from "./column-reordering.demo-data";5 import "@simple-table/svelte/styles.css";67 let { height = "400px", theme }: { height?: string | number; theme?: Theme } = $props();8 let headers: SvelteHeaderObject[] = $state([...columnReorderingConfig.headers]);910 function handleColumnOrderChange(newHeaders: SvelteHeaderObject[]) {11 headers = newHeaders;12 }13</script>1415<SimpleTable16 columnReordering17 defaultHeaders={headers}18 rows={columnReorderingConfig.rows}19 {height}20 {theme}21 onColumnOrderChange={handleColumnOrderChange}22/>
1import { createSignal } from "solid-js";2import { SimpleTable } from "@simple-table/solid";3import type { Theme } from "@simple-table/solid";4import { columnReorderingConfig } from "./column-reordering.demo-data";5import "@simple-table/solid/styles.css";67export default function ColumnReorderingDemo(props: { height?: string | number; theme?: Theme }) {8 const [headers, setHeaders] = createSignal([...columnReorderingConfig.headers]);910 return (11 <SimpleTable12 columnReordering13 defaultHeaders={headers()}14 rows={columnReorderingConfig.rows}15 height={props.height ?? "400px"}16 theme={props.theme}17 onColumnOrderChange={setHeaders}18 />19 );20}
1import { SimpleTableVanilla } from "simple-table-core";2import type { Theme } from "simple-table-core";3import { columnReorderingConfig } from "./column-reordering.demo-data";4import "simple-table-core/styles.css";56export function renderColumnReorderingDemo(7 container: HTMLElement,8 options?: { height?: string | number; theme?: Theme }9): SimpleTableVanilla {10 const table = new SimpleTableVanilla(container, {11 defaultHeaders: columnReorderingConfig.headers,12 rows: columnReorderingConfig.rows,13 height: options?.height ?? "400px",14 theme: options?.theme,15 columnReordering: true,16 });17 return table;18}192021// column-reordering.demo-data.ts22// Self-contained demo table setup for this example.23import type { HeaderObject } from "simple-table-core";2425export const columnReorderingHeaders: HeaderObject[] = [26 { accessor: "id", label: "ID", width: 60, type: "number" },27 { accessor: "name", label: "Name", width: "1fr", type: "string" },28 { accessor: "age", label: "Age", width: 80, align: "right", type: "number" },29 { accessor: "role", label: "Role", minWidth: 100, width: "1fr", type: "string" },30 { accessor: "department", label: "Department", width: "1fr", type: "string" },31];3233export const columnReorderingData = [34 {35 id: 1,36 name: "Captain Stella Vega",37 age: 38,38 role: "Mission Commander",39 department: "Flight Operations",40 },41 { id: 2, name: "Dr. Cosmos Rivera", age: 34, role: "Astrophysicist", department: "Science" },42 {43 id: 3,44 name: "Commander Nebula Johnson",45 age: 42,46 role: "Operations Director",47 department: "Mission Control",48 },49 {50 id: 4,51 name: "Cadet Orbit Williams",52 age: 26,53 role: "Flight Engineer",54 department: "Engineering",55 },56 {57 id: 5,58 name: "Dr. Galaxy Chen",59 age: 31,60 role: "Life Support Specialist",61 department: "Engineering",62 },63 {64 id: 6,65 name: "Lt. Meteor Lee",66 age: 29,67 role: "Navigation Officer",68 department: "Flight Operations",69 },70 { id: 7, name: "Dr. Comet Hassan", age: 33, role: "Mission Planner", department: "Planning" },71 {72 id: 8,73 name: "Major Pulsar White",74 age: 36,75 role: "Communications Director",76 department: "Communications",77 },78 {79 id: 9,80 name: "Specialist Quasar Black",81 age: 28,82 role: "Systems Analyst",83 department: "Technology",84 },85 {86 id: 10,87 name: "Engineer Supernova Blue",88 age: 35,89 role: "Propulsion Engineer",90 department: "Engineering",91 },92 { id: 11, name: "Dr. Aurora Kumar", age: 30, role: "Planetary Geologist", department: "Science" },93 {94 id: 12,95 name: "Admiral Cosmos Silver",96 age: 45,97 role: "Program Director",98 department: "Leadership",99 },100];101102export const columnReorderingConfig = {103 headers: columnReorderingHeaders,104 rows: columnReorderingData,105 tableProps: { columnReordering: true },106} as const;107
Basic Implementation
Column reordering is enabled by adding the columnReordering prop to the SimpleTable component. Users can drag and drop column headers to rearrange them.
Column Reordering Configuration
| Property | Required | Description | Example |
|---|---|---|---|
Property | Required | Description | Example |
columnReorderingboolean | Optional | Enables drag-and-drop column reordering functionality. When true, users can drag column headers to rearrange them. | |
onColumnOrderChange(newHeaders: ReactHeaderObject[]) => void | Optional | Callback function that fires when column order changes. With `@simple-table/react`, receives `ReactHeaderObject[]`. Angular, Svelte, and Solid adapters use `AngularHeaderObject[]`, `SvelteHeaderObject[]`, and `SolidHeaderObject[]` respectively. | |
HeaderObject.disableReorderboolean | Optional | Prevents specific columns from being reordered. Set this on individual header objects to lock them in place. |
Tip
The onColumnOrderChange callback is useful for saving user preferences. You can store the new column order in localStorage or in your backend to persist the user's preferred layout across sessions.
Usage with Other Features
Column reordering works seamlessly with other Simple Table features. You can combine it with column resizing, column visibility, and pinned columns to create a highly customizable table experience.
Best Practice
When using column reordering with pinned columns, pinned columns will remain in their respective pinned areas (left or right) but can be reordered within those areas.