1 parent
7a098a276a
commit
e1a4242729
6 files changed
+72
-1
No files matched your search
@@ -2541,6 +2541,7 @@ const {
|
||||
} = useDataGridColumnLayoutState({
|
||||
columns: computed(() => props.result.columns),
|
||||
sourceColumns: computed(() => props.sourceColumns),
|
||||
columnComments: () => props.resultColumnComments,
|
||||
commentByColumn: columnCommentMap,
|
||||
displayableColumnIndexes,
|
||||
allNullColumnIndexes: allNullColumnIndexesForResult,
|
||||
@@ -2557,6 +2558,7 @@ const goToColumnItems = computed(() =>
|
||||
buildDataGridColumnLookupItems({
|
||||
columns: props.result.columns,
|
||||
sourceColumns: props.sourceColumns,
|
||||
columnComments: props.resultColumnComments,
|
||||
displayableIndexes: displayableColumnIndexes.value,
|
||||
commentByColumn: columnCommentMap.value,
|
||||
}),
|
||||
|
||||
@@ -12,4 +12,9 @@ describe("DataGrid column comments", () => {
|
||||
expect(dataGridSource).toContain(':tooltip-column-comment="resolvedColumnComment(col.name, col.actualColIdx)"');
|
||||
expect(dataGridSource).toContain("(column, index) => headerColumnComment(column, index)");
|
||||
});
|
||||
|
||||
it("routes per-ordinal comments to field filtering and go-to-column lookup", () => {
|
||||
expect(dataGridSource).toMatch(/useDataGridColumnLayoutState\(\{[\s\S]*?columnComments: \(\) => props\.resultColumnComments,[\s\S]*?\}\);/);
|
||||
expect(dataGridSource).toMatch(/const goToColumnItems = computed\(\(\) =>[\s\S]*?buildDataGridColumnLookupItems\(\{[\s\S]*?columnComments: props\.resultColumnComments,[\s\S]*?\}\),[\s\S]*?\);/);
|
||||
});
|
||||
});
|
||||
@@ -255,6 +255,28 @@ describe("useDataGridColumnLayout", () => {
|
||||
scope.stop();
|
||||
});
|
||||
|
||||
it("uses grouped result comments in field filtering without name-map fallback", () => {
|
||||
const scope = effectScope();
|
||||
const state = scope.run(() =>
|
||||
useDataGridColumnLayoutState({
|
||||
columns: ref(["asin_url", "total"]),
|
||||
sourceColumns: ref(undefined),
|
||||
columnComments: ref(["asin亚马逊前台地址", undefined]),
|
||||
commentByColumn: ref(new Map([["total", "Wrong aggregate comment"]])),
|
||||
displayableColumnIndexes: ref([0, 1]),
|
||||
allNullColumnIndexes: ref([]),
|
||||
columnOrderKeys: ref(["asin_url\0\0", "total\0\0"]),
|
||||
layoutScopeKey: ref("grouped-result-comments"),
|
||||
tableScopeKey: ref(""),
|
||||
}),
|
||||
)!;
|
||||
|
||||
expect(state.orderedColumnLayoutOptions.value.map((option) => option.comment)).toEqual(["asin亚马逊前台地址", undefined]);
|
||||
expect(state.filteredColumnLayoutOptions("亚马逊").map((option) => option.column)).toEqual(["asin_url"]);
|
||||
expect(state.filteredColumnLayoutOptions("wrong")).toEqual([]);
|
||||
scope.stop();
|
||||
});
|
||||
|
||||
it("keeps a new resize active when the previous resize completion frame is pending", () => {
|
||||
const frames = new Map<number, FrameRequestCallback>();
|
||||
let nextFrame = 1;
|
||||
|
||||
@@ -83,6 +83,7 @@ export function dataGridHorizontalColumnWindow(options: { widths: readonly numbe
|
||||
export function useDataGridColumnLayoutState(options: {
|
||||
columns: MaybeRefOrGetter<readonly string[]>;
|
||||
sourceColumns?: MaybeRefOrGetter<readonly (string | undefined)[] | undefined>;
|
||||
columnComments?: MaybeRefOrGetter<readonly (string | undefined)[] | undefined>;
|
||||
commentByColumn?: MaybeRefOrGetter<ReadonlyMap<string, string>>;
|
||||
displayableColumnIndexes: MaybeRefOrGetter<readonly number[]>;
|
||||
allNullColumnIndexes: MaybeRefOrGetter<readonly number[]>;
|
||||
@@ -116,6 +117,7 @@ export function useDataGridColumnLayoutState(options: {
|
||||
buildDataGridColumnLookupItems({
|
||||
columns: toValue(options.columns),
|
||||
sourceColumns: toValue(options.sourceColumns),
|
||||
columnComments: toValue(options.columnComments),
|
||||
displayableIndexes: toValue(options.displayableColumnIndexes),
|
||||
commentByColumn: toValue(options.commentByColumn),
|
||||
}),
|
||||
|
||||
@@ -37,4 +37,41 @@ describe("data grid column lookup search", () => {
|
||||
it("returns all columns for an empty query", () => {
|
||||
expect(filterDataGridColumnLookupItems(items, " ")).toEqual(items);
|
||||
});
|
||||
|
||||
it("keeps grouped comments aligned by result ordinal and searches them", () => {
|
||||
const groupedItems = buildDataGridColumnLookupItems({
|
||||
columns: ["label", "label", "total"],
|
||||
columnComments: ["Primary label", "Joined label", undefined],
|
||||
commentByColumn: new Map([
|
||||
["label", "Wrong name-based label"],
|
||||
["total", "Wrong aggregate label"],
|
||||
]),
|
||||
});
|
||||
|
||||
expect(groupedItems.map((item) => item.comment)).toEqual(["Primary label", "Joined label", undefined]);
|
||||
expect(filterDataGridColumnLookupItems(groupedItems, "joined").map((item) => item.index)).toEqual([1]);
|
||||
expect(filterDataGridColumnLookupItems(groupedItems, "wrong")).toEqual([]);
|
||||
});
|
||||
|
||||
it("falls back to source metadata only when ordinal comments are absent", () => {
|
||||
const comments = new Map([
|
||||
["department", "Department name"],
|
||||
["total", "Unsafe aggregate fallback"],
|
||||
]);
|
||||
|
||||
expect(
|
||||
buildDataGridColumnLookupItems({
|
||||
columns: ["dept"],
|
||||
sourceColumns: ["department"],
|
||||
commentByColumn: comments,
|
||||
}),
|
||||
).toMatchObject([{ comment: "Department name" }]);
|
||||
expect(
|
||||
buildDataGridColumnLookupItems({
|
||||
columns: ["total"],
|
||||
columnComments: [undefined],
|
||||
commentByColumn: comments,
|
||||
}),
|
||||
).toEqual([{ index: 0, name: "total" }]);
|
||||
});
|
||||
});
|
||||
@@ -10,6 +10,7 @@ export interface DataGridColumnLookupItem {
|
||||
export interface DataGridColumnLookupOptions {
|
||||
columns: readonly string[];
|
||||
sourceColumns?: readonly (string | undefined)[];
|
||||
columnComments?: readonly (string | undefined)[];
|
||||
displayableIndexes?: readonly number[];
|
||||
commentByColumn?: ReadonlyMap<string, string>;
|
||||
}
|
||||
@@ -38,7 +39,9 @@ export function buildDataGridColumnLookupItems(options: DataGridColumnLookupOpti
|
||||
return indexes.map((index) => {
|
||||
const name = options.columns[index] ?? `#${index + 1}`;
|
||||
const sourceName = options.sourceColumns?.[index];
|
||||
const comment = dataGridColumnCommentFor(options.commentByColumn, name, sourceName);
|
||||
// A present ordinal array owns unresolved entries too; falling back by
|
||||
// name there could leak another source's comment onto an aggregate/alias.
|
||||
const comment = options.columnComments === undefined ? dataGridColumnCommentFor(options.commentByColumn, name, sourceName) : nonEmptyComment(options.columnComments[index]);
|
||||
return {
|
||||
index,
|
||||
name,
|
||||
|
||||
Reference in new issue
Block a user