142 lines
3.6 KiB
TypeScript
142 lines
3.6 KiB
TypeScript
import { strict as assert } from "node:assert";
|
|
import test from "node:test";
|
|
import {
|
|
buildTransposeRows,
|
|
nextTransposeState,
|
|
transposeAnchorRowIndex,
|
|
transposeFieldWidth,
|
|
transposeScrollLeftForRecord,
|
|
visibleTransposeRecordWindow,
|
|
} from "../src/lib/dataGridTranspose.ts";
|
|
|
|
test("row number double click opens transpose for a row", () => {
|
|
assert.deepEqual(nextTransposeState(false, null, 2), {
|
|
showTranspose: true,
|
|
transposeRowIndex: 2,
|
|
});
|
|
});
|
|
|
|
test("row number double click switches transpose to another row", () => {
|
|
assert.deepEqual(nextTransposeState(true, 2, 4), {
|
|
showTranspose: true,
|
|
transposeRowIndex: 4,
|
|
});
|
|
});
|
|
|
|
test("row number double click closes transpose for the same row", () => {
|
|
assert.deepEqual(nextTransposeState(true, 2, 2), {
|
|
showTranspose: false,
|
|
transposeRowIndex: null,
|
|
});
|
|
});
|
|
|
|
test("builds one virtualizable transpose row per field with all record values", () => {
|
|
const rows = buildTransposeRows({
|
|
columns: ["id", "name", "notes"],
|
|
records: [
|
|
[1, "Ada", null],
|
|
[2, "Grace", "compiler"],
|
|
],
|
|
typeByColumn: new Map([
|
|
["id", "int"],
|
|
["name", "varchar"],
|
|
]),
|
|
displayValue: (value) => (value === null ? "NULL" : String(value)),
|
|
});
|
|
|
|
assert.deepEqual(rows, [
|
|
{
|
|
id: "0:id",
|
|
column: "id",
|
|
type: "int",
|
|
values: [
|
|
{ value: 1, display: "1", isNull: false },
|
|
{ value: 2, display: "2", isNull: false },
|
|
],
|
|
},
|
|
{
|
|
id: "1:name",
|
|
column: "name",
|
|
type: "varchar",
|
|
values: [
|
|
{ value: "Ada", display: "Ada", isNull: false },
|
|
{ value: "Grace", display: "Grace", isNull: false },
|
|
],
|
|
},
|
|
{
|
|
id: "2:notes",
|
|
column: "notes",
|
|
type: "",
|
|
values: [
|
|
{ value: null, display: "NULL", isNull: true },
|
|
{ value: "compiler", display: "compiler", isNull: false },
|
|
],
|
|
},
|
|
]);
|
|
});
|
|
|
|
test("calculates a horizontal record window with spacer widths", () => {
|
|
assert.deepEqual(
|
|
visibleTransposeRecordWindow({
|
|
totalRecords: 100,
|
|
scrollLeft: 680,
|
|
viewportWidth: 720,
|
|
pinnedWidth: 320,
|
|
recordWidth: 160,
|
|
overscan: 1,
|
|
}),
|
|
{
|
|
start: 1,
|
|
end: 7,
|
|
beforeWidth: 160,
|
|
afterWidth: 14880,
|
|
},
|
|
);
|
|
});
|
|
|
|
test("uses the first selected row as the transpose anchor when context row is inside row selection", () => {
|
|
assert.equal(
|
|
transposeAnchorRowIndex({
|
|
requestedRowIndex: 3,
|
|
rowIds: [10, 11, 12, 13, 14, 15],
|
|
selectedRowIds: new Set([12, 13, 14]),
|
|
selectedRange: null,
|
|
}),
|
|
2,
|
|
);
|
|
});
|
|
|
|
test("uses the first selected cell range row as the transpose anchor when context row is inside range", () => {
|
|
assert.equal(
|
|
transposeAnchorRowIndex({
|
|
requestedRowIndex: 5,
|
|
rowIds: [10, 11, 12, 13, 14, 15],
|
|
selectedRowIds: new Set(),
|
|
selectedRange: { startRow: 2, endRow: 5, startCol: 0, endCol: 2 },
|
|
}),
|
|
2,
|
|
);
|
|
});
|
|
|
|
test("sizes the transpose field column from visible field names", () => {
|
|
assert.equal(transposeFieldWidth(["id", "iso3", "year"]), 104);
|
|
assert.equal(transposeFieldWidth(["country_name"]), 128);
|
|
});
|
|
|
|
test("caps the transpose field column width for long field names", () => {
|
|
assert.equal(transposeFieldWidth(["a_very_long_metric_column_name"]), 220);
|
|
});
|
|
|
|
test("aligns the selected transpose record at the start of the scrollable records", () => {
|
|
assert.equal(
|
|
transposeScrollLeftForRecord({
|
|
recordIndex: 55,
|
|
totalRecords: 100,
|
|
viewportWidth: 1200,
|
|
pinnedWidth: 104,
|
|
recordWidth: 168,
|
|
}),
|
|
9240,
|
|
);
|
|
});
|