SCM - history item now supports searching (#209070)

This commit is contained in:
Ladislau Szomoru 2024-03-28 22:52:51 +01:00 committed by GitHub
parent e49b522e12
commit a2acd131e4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -899,7 +899,7 @@ interface HistoryItemTemplate {
readonly disposables: IDisposable;
}
class HistoryItemRenderer implements ICompressibleTreeRenderer<SCMHistoryItemTreeElement, void, HistoryItemTemplate> {
class HistoryItemRenderer implements ICompressibleTreeRenderer<SCMHistoryItemTreeElement, LabelFuzzyScore, HistoryItemTemplate> {
static readonly TEMPLATE_ID = 'history-item';
get templateId(): string { return HistoryItemRenderer.TEMPLATE_ID; }
@ -915,7 +915,7 @@ class HistoryItemRenderer implements ICompressibleTreeRenderer<SCMHistoryItemTre
const element = append(container, $('.history-item'));
const iconLabel = new IconLabel(element, { supportIcons: true });
const iconLabel = new IconLabel(element, { supportIcons: true, supportHighlights: true, supportDescriptionHighlights: true });
const iconContainer = prepend(iconLabel.element, $('.icon-container'));
const disposables = new DisposableStore();
@ -931,7 +931,7 @@ class HistoryItemRenderer implements ICompressibleTreeRenderer<SCMHistoryItemTre
return { iconContainer, label: iconLabel, actionBar, statsContainer, filesLabel, insertionsLabel, deletionsLabel, elementDisposables: new DisposableStore(), disposables };
}
renderElement(node: ITreeNode<SCMHistoryItemTreeElement, void>, index: number, templateData: HistoryItemTemplate, height: number | undefined): void {
renderElement(node: ITreeNode<SCMHistoryItemTreeElement, LabelFuzzyScore>, index: number, templateData: HistoryItemTemplate, height: number | undefined): void {
const historyItem = node.element;
templateData.iconContainer.className = 'icon-container';
@ -939,7 +939,8 @@ class HistoryItemRenderer implements ICompressibleTreeRenderer<SCMHistoryItemTre
templateData.iconContainer.classList.add(...ThemeIcon.asClassNameArray(historyItem.icon));
}
templateData.label.setLabel(historyItem.label, historyItem.description);
const [matches, descriptionMatches] = this.processMatches(historyItem, node.filterData);
templateData.label.setLabel(historyItem.label, historyItem.description, { matches, descriptionMatches });
templateData.actionBar.clear();
templateData.actionBar.context = historyItem;
@ -953,11 +954,22 @@ class HistoryItemRenderer implements ICompressibleTreeRenderer<SCMHistoryItemTre
this.renderStatistics(node, index, templateData, height);
}
renderCompressedElements(node: ITreeNode<ICompressedTreeNode<SCMHistoryItemTreeElement>, void>, index: number, templateData: HistoryItemTemplate, height: number | undefined): void {
renderCompressedElements(node: ITreeNode<ICompressedTreeNode<SCMHistoryItemTreeElement>, LabelFuzzyScore>, index: number, templateData: HistoryItemTemplate, height: number | undefined): void {
throw new Error('Should never happen since node is incompressible');
}
private renderStatistics(node: ITreeNode<SCMHistoryItemTreeElement, void>, index: number, templateData: HistoryItemTemplate, height: number | undefined): void {
private processMatches(historyItem: SCMHistoryItemTreeElement, filterData: LabelFuzzyScore | undefined): [IMatch[] | undefined, IMatch[] | undefined] {
if (!filterData) {
return [undefined, undefined];
}
return [
historyItem.label === filterData.label ? createMatches(filterData.score) : undefined,
historyItem.description === filterData.label ? createMatches(filterData.score) : undefined
];
}
private renderStatistics(node: ITreeNode<SCMHistoryItemTreeElement, LabelFuzzyScore>, index: number, templateData: HistoryItemTemplate, height: number | undefined): void {
const historyItem = node.element;
if (historyItem.statistics) {
@ -988,9 +1000,10 @@ class HistoryItemRenderer implements ICompressibleTreeRenderer<SCMHistoryItemTre
templateData.statsContainer.classList.toggle('hidden', historyItem.statistics === undefined);
}
disposeElement(element: ITreeNode<SCMHistoryItemTreeElement, void>, index: number, templateData: HistoryItemTemplate, height: number | undefined): void {
disposeElement(element: ITreeNode<SCMHistoryItemTreeElement, LabelFuzzyScore>, index: number, templateData: HistoryItemTemplate, height: number | undefined): void {
templateData.elementDisposables.clear();
}
disposeTemplate(templateData: HistoryItemTemplate): void {
templateData.disposables.dispose();
}
@ -1289,7 +1302,10 @@ export class SCMTreeKeyboardNavigationLabelProvider implements ICompressibleKeyb
} else if (isSCMHistoryItemGroupTreeElement(element)) {
return element.label;
} else if (isSCMHistoryItemTreeElement(element)) {
return element.label;
// For a history item we want to match both the message and
// the author. A match in the message takes precedence over
// a match in the author.
return [element.label, element.description];
} else if (isSCMViewSeparator(element)) {
return element.label;
} else {