@x12i/data 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,55 +1,219 @@
1
- // src/index.ts
2
- function defineColumns(columns) {
3
- return columns;
4
- }
5
- var SAVED_VIEW_VERSION = 1;
6
- var FILTER_OPERATORS = [
7
- "contains",
8
- "not-contains",
9
- "starts-with",
10
- "equals",
11
- "not-equals",
12
- "gt",
13
- "gte",
14
- "lt",
15
- "lte",
16
- "between",
17
- "in",
18
- "before",
19
- "after",
20
- "is-empty",
21
- "is-not-empty"
22
- ];
23
- var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
24
- var isOptionalNumber = (value) => value === void 0 || typeof value === "number" && Number.isFinite(value);
25
- function parseSavedView(value) {
26
- if (!isRecord(value) || value.version !== SAVED_VIEW_VERSION) return null;
27
- if (value.name !== void 0 && typeof value.name !== "string") return null;
28
- const { columns, sort, filter, group } = value;
29
- if (!Array.isArray(columns) || !Array.isArray(sort) || !Array.isArray(filter)) return null;
30
- if (group !== void 0 && !Array.isArray(group)) return null;
31
- for (const column of columns) {
32
- if (!isRecord(column) || typeof column.id !== "string") return null;
33
- if (!isOptionalNumber(column.width)) return null;
34
- if (column.hidden !== void 0 && typeof column.hidden !== "boolean") return null;
35
- if (column.pinned !== void 0 && column.pinned !== "start" && column.pinned !== "end") {
36
- return null;
37
- }
38
- }
39
- for (const item of sort) {
40
- if (!isRecord(item) || typeof item.field !== "string") return null;
41
- if (item.direction !== "asc" && item.direction !== "desc") return null;
42
- }
43
- for (const item of filter) {
44
- if (!isRecord(item) || typeof item.field !== "string") return null;
45
- if (!FILTER_OPERATORS.includes(item.operator)) return null;
46
- }
47
- for (const item of group ?? []) {
48
- if (!isRecord(item) || typeof item.field !== "string") return null;
49
- }
50
- return value;
51
- }
52
-
53
- export { FILTER_OPERATORS, SAVED_VIEW_VERSION, defineColumns, parseSavedView };
54
- //# sourceMappingURL=index.js.map
1
+ import {
2
+ DEFAULT_COLUMN_MAX_WIDTH,
3
+ DEFAULT_COLUMN_MIN_WIDTH,
4
+ DEFAULT_COLUMN_WIDTH,
5
+ EMPTY_SELECTION,
6
+ FILTER_OPERATORS,
7
+ OPERATORS_BY_FILTER_TYPE,
8
+ SAVED_VIEW_VERSION,
9
+ aggregateValues,
10
+ applySavedView,
11
+ buildDisplayRows,
12
+ buildGroupTree,
13
+ captureView,
14
+ clampColumnWidth,
15
+ clampNav,
16
+ clearSelection,
17
+ columnFieldName,
18
+ compareValues,
19
+ computeAggregate,
20
+ computeAggregates,
21
+ computeViewIndexes,
22
+ countSelected,
23
+ createAbortError,
24
+ createCellFormatter,
25
+ createClientDataSource,
26
+ createCollator,
27
+ createLocalStorageSavedViewStore,
28
+ createMemorySavedViewStore,
29
+ createSearchIndex,
30
+ createSelection,
31
+ createServerRowStore,
32
+ createValuePredicate,
33
+ createViewState,
34
+ dayStart,
35
+ defaultFormatLabels,
36
+ defaultMessages,
37
+ defineColumns,
38
+ deserializeSelection,
39
+ distinctValues,
40
+ escapeCsvField,
41
+ escapeDelimitedField,
42
+ exportableColumns,
43
+ filterIndexes,
44
+ formatCellValue,
45
+ formatMessage,
46
+ fromServerQuery,
47
+ getColumnValue,
48
+ gridToCsv,
49
+ gridToTsv,
50
+ indexColumns,
51
+ initialColumnWidth,
52
+ isAbortError,
53
+ isDateOnlyString,
54
+ isEditable,
55
+ isEmptyValue,
56
+ isFilterEffective,
57
+ isFilterable,
58
+ isNavigationKey,
59
+ isNumericCellType,
60
+ isResizable,
61
+ isSearchable,
62
+ isSelected,
63
+ isSelectionEmpty,
64
+ isSortable,
65
+ isValuelessOperator,
66
+ layoutColumns,
67
+ matchesFilter,
68
+ moveColumn,
69
+ moveColumnTo,
70
+ navigate,
71
+ nextDay,
72
+ normalizeText,
73
+ operatorsFor,
74
+ parseDelimited,
75
+ parseQuickFilter,
76
+ parseSavedView,
77
+ resizeColumn,
78
+ resolveColumnAlign,
79
+ resolveColumnOrder,
80
+ resolveDateFormatOptions,
81
+ resolveEditor,
82
+ resolveFilterType,
83
+ resolveMessages,
84
+ resolveNumberFormatOptions,
85
+ resolveSelectedIds,
86
+ selectAll,
87
+ selectAllExceptNone,
88
+ selectOnly,
89
+ selectRange,
90
+ serializeSelection,
91
+ setColumnFilter,
92
+ setPinning,
93
+ setSort,
94
+ sortIndexes,
95
+ sortRank,
96
+ sortRows,
97
+ summarizeSelection,
98
+ toBoolean,
99
+ toDate,
100
+ toDayString,
101
+ toNumber,
102
+ toServerQuery,
103
+ toSortKey,
104
+ toText,
105
+ toTimestamp,
106
+ toggleGroup,
107
+ toggleRow,
108
+ toggleSort
109
+ } from "./chunk-ASP4ABDG.js";
110
+ export {
111
+ DEFAULT_COLUMN_MAX_WIDTH,
112
+ DEFAULT_COLUMN_MIN_WIDTH,
113
+ DEFAULT_COLUMN_WIDTH,
114
+ EMPTY_SELECTION,
115
+ FILTER_OPERATORS,
116
+ OPERATORS_BY_FILTER_TYPE,
117
+ SAVED_VIEW_VERSION,
118
+ aggregateValues,
119
+ applySavedView,
120
+ buildDisplayRows,
121
+ buildGroupTree,
122
+ captureView,
123
+ clampColumnWidth,
124
+ clampNav,
125
+ clearSelection,
126
+ columnFieldName,
127
+ compareValues,
128
+ computeAggregate,
129
+ computeAggregates,
130
+ computeViewIndexes,
131
+ countSelected,
132
+ createAbortError,
133
+ createCellFormatter,
134
+ createClientDataSource,
135
+ createCollator,
136
+ createLocalStorageSavedViewStore,
137
+ createMemorySavedViewStore,
138
+ createSearchIndex,
139
+ createSelection,
140
+ createServerRowStore,
141
+ createValuePredicate,
142
+ createViewState,
143
+ dayStart,
144
+ defaultFormatLabels,
145
+ defaultMessages,
146
+ defineColumns,
147
+ deserializeSelection,
148
+ distinctValues,
149
+ escapeCsvField,
150
+ escapeDelimitedField,
151
+ exportableColumns,
152
+ filterIndexes,
153
+ formatCellValue,
154
+ formatMessage,
155
+ fromServerQuery,
156
+ getColumnValue,
157
+ gridToCsv,
158
+ gridToTsv,
159
+ indexColumns,
160
+ initialColumnWidth,
161
+ isAbortError,
162
+ isDateOnlyString,
163
+ isEditable,
164
+ isEmptyValue,
165
+ isFilterEffective,
166
+ isFilterable,
167
+ isNavigationKey,
168
+ isNumericCellType,
169
+ isResizable,
170
+ isSearchable,
171
+ isSelected,
172
+ isSelectionEmpty,
173
+ isSortable,
174
+ isValuelessOperator,
175
+ layoutColumns,
176
+ matchesFilter,
177
+ moveColumn,
178
+ moveColumnTo,
179
+ navigate,
180
+ nextDay,
181
+ normalizeText,
182
+ operatorsFor,
183
+ parseDelimited,
184
+ parseQuickFilter,
185
+ parseSavedView,
186
+ resizeColumn,
187
+ resolveColumnAlign,
188
+ resolveColumnOrder,
189
+ resolveDateFormatOptions,
190
+ resolveEditor,
191
+ resolveFilterType,
192
+ resolveMessages,
193
+ resolveNumberFormatOptions,
194
+ resolveSelectedIds,
195
+ selectAll,
196
+ selectAllExceptNone,
197
+ selectOnly,
198
+ selectRange,
199
+ serializeSelection,
200
+ setColumnFilter,
201
+ setPinning,
202
+ setSort,
203
+ sortIndexes,
204
+ sortRank,
205
+ sortRows,
206
+ summarizeSelection,
207
+ toBoolean,
208
+ toDate,
209
+ toDayString,
210
+ toNumber,
211
+ toServerQuery,
212
+ toSortKey,
213
+ toText,
214
+ toTimestamp,
215
+ toggleGroup,
216
+ toggleRow,
217
+ toggleSort
218
+ };
55
219
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";AAuGO,SAAS,cAAmB,OAAA,EAA6C;AAC9E,EAAA,OAAO,OAAA;AACT;AASO,IAAM,kBAAA,GAAqB;AAa3B,IAAM,gBAAA,GAAmB;AAAA,EAC9B,UAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF;AASA,IAAM,QAAA,GAAW,CAAC,KAAA,KAChB,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAErE,IAAM,gBAAA,GAAmB,CAAC,KAAA,KACxB,KAAA,KAAU,MAAA,IAAc,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA;AAOrE,SAAS,eAAe,KAAA,EAAkC;AAC/D,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,KAAK,KAAA,CAAM,OAAA,KAAY,oBAAoB,OAAO,IAAA;AACrE,EAAA,IAAI,MAAM,IAAA,KAAS,MAAA,IAAa,OAAO,KAAA,CAAM,IAAA,KAAS,UAAU,OAAO,IAAA;AAEvE,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,OAAM,GAAI,KAAA;AACzC,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,KAAK,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,KAAK,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,GAAG,OAAO,IAAA;AACtF,EAAA,IAAI,UAAU,MAAA,IAAa,CAAC,MAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,IAAA;AAEzD,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,CAAC,SAAS,MAAM,CAAA,IAAK,OAAO,MAAA,CAAO,EAAA,KAAO,UAAU,OAAO,IAAA;AAC/D,IAAA,IAAI,CAAC,gBAAA,CAAiB,MAAA,CAAO,KAAK,GAAG,OAAO,IAAA;AAC5C,IAAA,IAAI,OAAO,MAAA,KAAW,MAAA,IAAa,OAAO,MAAA,CAAO,MAAA,KAAW,WAAW,OAAO,IAAA;AAC9E,IAAA,IAAI,MAAA,CAAO,WAAW,MAAA,IAAa,MAAA,CAAO,WAAW,OAAA,IAAW,MAAA,CAAO,WAAW,KAAA,EAAO;AACvF,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,IAAA,IAAI,CAAC,SAAS,IAAI,CAAA,IAAK,OAAO,IAAA,CAAK,KAAA,KAAU,UAAU,OAAO,IAAA;AAC9D,IAAA,IAAI,KAAK,SAAA,KAAc,KAAA,IAAS,IAAA,CAAK,SAAA,KAAc,QAAQ,OAAO,IAAA;AAAA,EACpE;AACA,EAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,IAAA,IAAI,CAAC,SAAS,IAAI,CAAA,IAAK,OAAO,IAAA,CAAK,KAAA,KAAU,UAAU,OAAO,IAAA;AAC9D,IAAA,IAAI,CAAE,gBAAA,CAAwC,QAAA,CAAS,IAAA,CAAK,QAAQ,GAAG,OAAO,IAAA;AAAA,EAChF;AACA,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,IAAS,EAAC,EAAG;AAC9B,IAAA,IAAI,CAAC,SAAS,IAAI,CAAA,IAAK,OAAO,IAAA,CAAK,KAAA,KAAU,UAAU,OAAO,IAAA;AAAA,EAChE;AAEA,EAAA,OAAO,KAAA;AACT","file":"index.js","sourcesContent":["/**\r\n * Contracts for the kit's DataGrid (spec section 7). The grid is built on\r\n * TanStack Table and TanStack Virtual; these types are the stable surface that\r\n * apps, reports and charts depend on.\r\n */\r\n\r\nexport type SortDirection = \"asc\" | \"desc\";\r\n\r\nexport interface SortModelItem {\r\n field: string;\r\n direction: SortDirection;\r\n}\r\n\r\nexport type FilterOperator =\r\n | \"contains\"\r\n | \"not-contains\"\r\n | \"starts-with\"\r\n | \"equals\"\r\n | \"not-equals\"\r\n | \"gt\"\r\n | \"gte\"\r\n | \"lt\"\r\n | \"lte\"\r\n | \"between\"\r\n | \"in\"\r\n | \"before\"\r\n | \"after\"\r\n | \"is-empty\"\r\n | \"is-not-empty\";\r\n\r\nexport interface FilterModelItem {\r\n field: string;\r\n operator: FilterOperator;\r\n /** Absent for `is-empty` and `is-not-empty`. An array for `in` and `between`. */\r\n value?: unknown;\r\n}\r\n\r\nexport interface GroupModelItem {\r\n field: string;\r\n}\r\n\r\n/** What the grid asks a server for. Row indexes are zero-based and `endRow` is exclusive. */\r\nexport interface GetRowsRequest {\r\n startRow: number;\r\n endRow: number;\r\n sort: SortModelItem[];\r\n filter: FilterModelItem[];\r\n group: GroupModelItem[];\r\n}\r\n\r\nexport interface GetRowsResult<Row> {\r\n rows: Row[];\r\n /** Total rows matching the filter, so the grid can size its scrollbar. */\r\n total: number;\r\n}\r\n\r\nexport interface GetRowsOptions {\r\n /** Aborted when the grid no longer needs the answer, for example after a new sort. */\r\n signal?: AbortSignal;\r\n}\r\n\r\n/** The server data source: `getRows({ startRow, endRow, sort, filter, group })` returns `{ rows, total }`. */\r\nexport interface ServerDataSource<Row> {\r\n getRows(request: GetRowsRequest, options?: GetRowsOptions): Promise<GetRowsResult<Row>>;\r\n}\r\n\r\n/** Cell renderers the grid ships (spec section 7). */\r\nexport type CellType =\r\n | \"text\"\r\n | \"number\"\r\n | \"currency\"\r\n | \"percent\"\r\n | \"date\"\r\n | \"status\"\r\n | \"avatar\"\r\n | \"progress\"\r\n | \"sparkline\"\r\n | \"link\"\r\n | \"actions\";\r\n\r\n/** Logical sides, so a pinned column follows the reading direction in RTL. */\r\nexport type ColumnPin = \"start\" | \"end\";\r\n\r\nexport interface ColumnDef<Row> {\r\n /** Stable identifier, also used in saved views. */\r\n id: string;\r\n /** Header text. Pass a translated string. */\r\n header: string;\r\n /** Property of the row to read. */\r\n field?: Extract<keyof Row, string>;\r\n cellType?: CellType;\r\n /** An `Intl`-based format name or options key, by cell type. */\r\n format?: string;\r\n width?: number;\r\n minWidth?: number;\r\n pinned?: ColumnPin;\r\n sortable?: boolean;\r\n filterable?: boolean;\r\n resizable?: boolean;\r\n editable?: boolean;\r\n}\r\n\r\n/** Identity helper that infers `Row` for column authoring. */\r\nexport function defineColumns<Row>(columns: ColumnDef<Row>[]): ColumnDef<Row>[] {\r\n return columns;\r\n}\r\n\r\nexport interface ColumnState {\r\n id: string;\r\n width?: number;\r\n hidden?: boolean;\r\n pinned?: ColumnPin;\r\n}\r\n\r\nexport const SAVED_VIEW_VERSION = 1;\r\n\r\n/** Column state, filters and sort, serialized to JSON. */\r\nexport interface SavedView {\r\n version: typeof SAVED_VIEW_VERSION;\r\n name?: string;\r\n columns: ColumnState[];\r\n sort: SortModelItem[];\r\n filter: FilterModelItem[];\r\n group?: GroupModelItem[];\r\n}\r\n\n/** Every filter operator, as a runtime list for validation and pickers. */\nexport const FILTER_OPERATORS = [\n \"contains\",\n \"not-contains\",\n \"starts-with\",\n \"equals\",\n \"not-equals\",\n \"gt\",\n \"gte\",\n \"lt\",\n \"lte\",\n \"between\",\n \"in\",\n \"before\",\n \"after\",\n \"is-empty\",\n \"is-not-empty\",\n] as const satisfies readonly FilterOperator[];\n\n// Compile-time guard: adding an operator to `FilterOperator` without listing it\n// above makes this line fail to type-check.\nconst _everyOperatorListed: Exclude<FilterOperator, (typeof FILTER_OPERATORS)[number]> extends never\n ? true\n : never = true;\nvoid _everyOperatorListed;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isOptionalNumber = (value: unknown) =>\n value === undefined || (typeof value === \"number\" && Number.isFinite(value));\n\n/**\n * Reads a saved view from untrusted JSON (storage, a URL, a server). Returns\n * `null` when the value is not a view this version understands, so a bad or\n * newer record is ignored instead of crashing the grid.\n */\nexport function parseSavedView(value: unknown): SavedView | null {\n if (!isRecord(value) || value.version !== SAVED_VIEW_VERSION) return null;\n if (value.name !== undefined && typeof value.name !== \"string\") return null;\n\n const { columns, sort, filter, group } = value;\n if (!Array.isArray(columns) || !Array.isArray(sort) || !Array.isArray(filter)) return null;\n if (group !== undefined && !Array.isArray(group)) return null;\n\n for (const column of columns) {\n if (!isRecord(column) || typeof column.id !== \"string\") return null;\n if (!isOptionalNumber(column.width)) return null;\n if (column.hidden !== undefined && typeof column.hidden !== \"boolean\") return null;\n if (column.pinned !== undefined && column.pinned !== \"start\" && column.pinned !== \"end\") {\n return null;\n }\n }\n for (const item of sort) {\n if (!isRecord(item) || typeof item.field !== \"string\") return null;\n if (item.direction !== \"asc\" && item.direction !== \"desc\") return null;\n }\n for (const item of filter) {\n if (!isRecord(item) || typeof item.field !== \"string\") return null;\n if (!(FILTER_OPERATORS as readonly unknown[]).includes(item.operator)) return null;\n }\n for (const item of group ?? []) {\n if (!isRecord(item) || typeof item.field !== \"string\") return null;\n }\n\n return value as unknown as SavedView;\n}\n\n/** One saved view in a list, without loading its body. */\nexport interface SavedViewSummary {\n id: string;\n name?: string;\n}\n\n/**\n * Where an app keeps saved views. The grid does not care: pass any\n * implementation (local storage, your API, `@x12i/flowix-ui`'s Flowix adapter).\n */\nexport interface SavedViewStore {\n list(): Promise<SavedViewSummary[]>;\n /** `null` when the id does not exist or holds something `parseSavedView` rejects. */\n load(id: string): Promise<SavedView | null>;\n save(id: string, view: SavedView): Promise<void>;\n delete(id: string): Promise<void>;\n}\n"]}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}