import { type Readable, type Writable } from 'svelte/store'; import type { BodyRow } from '../bodyRows.js'; import type { NewTablePropSet, TablePlugin } from '../types/TablePlugin.js'; /** * Configuration options for the addSortBy plugin. */ export interface SortByConfig { /** Initial sort keys to apply on mount. */ initialSortKeys?: SortKey[]; /** If true, prevents sorting by multiple columns. Defaults to false. */ disableMultiSort?: boolean; /** Function to detect multi-sort events (e.g., shift+click). Defaults to isShiftClick. */ isMultiSortEvent?: (_event: Event) => boolean; /** Custom toggle order cycle. Defaults to ['asc', 'desc', undefined]. */ toggleOrder?: ('asc' | 'desc' | undefined)[]; /** If true, sorting is handled server-side and rows are returned as-is. */ serverSide?: boolean; } /** * State exposed by the addSortBy plugin. * * @template Item - The type of data items in the table. */ export interface SortByState { /** Writable store containing the current sort keys. */ sortKeys: WritableSortKeys; /** Readable store containing the rows before sorting was applied. */ preSortedRows: Readable[]>; } /** * Per-column configuration options for sorting. */ export interface SortByColumnOptions { /** If true, this column cannot be sorted. */ disable?: boolean; /** Custom function to extract the sortable value from the cell value. */ getSortValue?: (_value: any) => string | number | (string | number)[]; /** Custom comparison function for sorting. */ compareFn?: (_left: any, _right: any) => number; /** If true, inverts the sort order for this column. */ invert?: boolean; } /** * Props added to table elements by the sort plugin. */ export type SortByPropSet = NewTablePropSet<{ 'thead.tr.th': { /** Current sort order for this column. */ order: 'asc' | 'desc' | undefined; /** Function to toggle sorting on this column. */ toggle: (_event: Event) => void; /** Function to clear sorting on this column. */ clear: () => void; /** Whether sorting is disabled for this column. */ disabled: boolean; }; 'tbody.tr.td': { /** Current sort order for this column. */ order: 'asc' | 'desc' | undefined; }; }>; /** * Represents a single sort key with column ID and direction. */ export interface SortKey { /** The column ID to sort by. */ id: string; /** The sort direction. */ order: 'asc' | 'desc'; } /** * Creates a writable store for managing sort keys with toggle and clear methods. * * @param initKeys - Initial sort keys. * @returns A WritableSortKeys store with toggle and clear functionality. * @example * ```typescript * const sortKeys = createSortKeysStore([{ id: 'name', order: 'asc' }]) * sortKeys.toggleId('age') // Adds ascending sort by age * sortKeys.clearId('name') // Removes sort by name * ``` */ export declare const createSortKeysStore: (initKeys: SortKey[]) => WritableSortKeys; /** * Options for the toggleId method. */ interface ToggleOptions { /** Whether to allow multiple sort keys. */ multiSort?: boolean; /** Custom toggle order cycle. */ toggleOrder?: ('asc' | 'desc' | undefined)[]; } /** * A writable store for sort keys with additional toggle and clear methods. */ export type WritableSortKeys = Writable & { /** Toggles the sort state for a column ID. */ toggleId: (_id: string, _options: ToggleOptions) => void; /** Clears the sort state for a column ID. */ clearId: (_id: string) => void; }; /** * Creates a sort plugin that enables sorting table rows by one or more columns. * Supports ascending, descending, and unsorted states with customizable toggle order. * * @template Item - The type of data items in the table. * @param config - Configuration options for sorting behavior. * @returns A TablePlugin that provides sorting functionality. * @example * ```typescript * const table = createTable(data, { * sort: addSortBy({ * initialSortKeys: [{ id: 'name', order: 'asc' }], * disableMultiSort: false * }) * }) * * // Access sort state in your component * const { sortKeys } = table.pluginStates.sort * ``` */ export declare const addSortBy: ({ initialSortKeys, disableMultiSort, isMultiSortEvent, toggleOrder, serverSide }?: SortByConfig) => TablePlugin, SortByColumnOptions, SortByPropSet>; export {};