@theia/scm 1.71.0-next.72 → 1.71.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.
Files changed (58) hide show
  1. package/lib/browser/dirty-diff/dirty-diff-widget.js +1 -1
  2. package/lib/browser/dirty-diff/dirty-diff-widget.js.map +1 -1
  3. package/lib/browser/scm-context-key-service.d.ts +6 -0
  4. package/lib/browser/scm-context-key-service.d.ts.map +1 -1
  5. package/lib/browser/scm-context-key-service.js +12 -0
  6. package/lib/browser/scm-context-key-service.js.map +1 -1
  7. package/lib/browser/scm-contribution.d.ts.map +1 -1
  8. package/lib/browser/scm-contribution.js +129 -1
  9. package/lib/browser/scm-contribution.js.map +1 -1
  10. package/lib/browser/scm-frontend-module.d.ts.map +1 -1
  11. package/lib/browser/scm-frontend-module.js +14 -0
  12. package/lib/browser/scm-frontend-module.js.map +1 -1
  13. package/lib/browser/scm-history-graph-helpers.d.ts +39 -0
  14. package/lib/browser/scm-history-graph-helpers.d.ts.map +1 -0
  15. package/lib/browser/scm-history-graph-helpers.js +167 -0
  16. package/lib/browser/scm-history-graph-helpers.js.map +1 -0
  17. package/lib/browser/scm-history-graph-lanes.d.ts +59 -0
  18. package/lib/browser/scm-history-graph-lanes.d.ts.map +1 -0
  19. package/lib/browser/scm-history-graph-lanes.js +183 -0
  20. package/lib/browser/scm-history-graph-lanes.js.map +1 -0
  21. package/lib/browser/scm-history-graph-lanes.spec.d.ts +2 -0
  22. package/lib/browser/scm-history-graph-lanes.spec.d.ts.map +1 -0
  23. package/lib/browser/scm-history-graph-lanes.spec.js +554 -0
  24. package/lib/browser/scm-history-graph-lanes.spec.js.map +1 -0
  25. package/lib/browser/scm-history-graph-model.d.ts +46 -0
  26. package/lib/browser/scm-history-graph-model.d.ts.map +1 -0
  27. package/lib/browser/scm-history-graph-model.js +184 -0
  28. package/lib/browser/scm-history-graph-model.js.map +1 -0
  29. package/lib/browser/scm-history-graph-model.spec.d.ts +2 -0
  30. package/lib/browser/scm-history-graph-model.spec.d.ts.map +1 -0
  31. package/lib/browser/scm-history-graph-model.spec.js +131 -0
  32. package/lib/browser/scm-history-graph-model.spec.js.map +1 -0
  33. package/lib/browser/scm-history-graph-tooltip.d.ts +14 -0
  34. package/lib/browser/scm-history-graph-tooltip.d.ts.map +1 -0
  35. package/lib/browser/scm-history-graph-tooltip.js +190 -0
  36. package/lib/browser/scm-history-graph-tooltip.js.map +1 -0
  37. package/lib/browser/scm-history-graph-widget.d.ts +77 -0
  38. package/lib/browser/scm-history-graph-widget.d.ts.map +1 -0
  39. package/lib/browser/scm-history-graph-widget.js +490 -0
  40. package/lib/browser/scm-history-graph-widget.js.map +1 -0
  41. package/lib/browser/scm-provider.d.ts +61 -0
  42. package/lib/browser/scm-provider.d.ts.map +1 -1
  43. package/lib/browser/scm-provider.js.map +1 -1
  44. package/package.json +7 -7
  45. package/src/browser/dirty-diff/dirty-diff-widget.ts +1 -1
  46. package/src/browser/scm-context-key-service.ts +18 -0
  47. package/src/browser/scm-contribution.ts +141 -0
  48. package/src/browser/scm-frontend-module.ts +15 -0
  49. package/src/browser/scm-history-graph-helpers.ts +175 -0
  50. package/src/browser/scm-history-graph-lanes.spec.ts +635 -0
  51. package/src/browser/scm-history-graph-lanes.ts +258 -0
  52. package/src/browser/scm-history-graph-model.spec.ts +171 -0
  53. package/src/browser/scm-history-graph-model.ts +207 -0
  54. package/src/browser/scm-history-graph-tooltip.ts +213 -0
  55. package/src/browser/scm-history-graph-widget.tsx +712 -0
  56. package/src/browser/scm-provider.ts +68 -0
  57. package/src/browser/style/index.css +12 -13
  58. package/src/browser/style/scm-history-graph.css +313 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scm-history-graph-model.d.ts","sourceRoot":"","sources":["../../src/browser/scm-history-graph-model.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAc,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAqB,MAAM,gBAAgB,CAAC;AACvF,OAAO,EAAoB,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAEvE,eAAO,MAAM,SAAS,KAAK,CAAC;AAE5B,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC/B;AAED,qBACa,oBAAoB;IAET,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAE9D,SAAS,CAAC,QAAQ,CAAC,SAAS,uBAA8B;IAC1D,SAAS,CAAC,QAAQ,CAAC,yBAAyB,uBAA8B;IAE1E,SAAS,CAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAM;IAC7C,SAAS,CAAC,QAAQ,UAAS;IAC3B,SAAS,CAAC,QAAQ,UAAS;IAC3B,SAAS,CAAC,iBAAiB,UAAS;IACpC,SAAS,CAAC,SAAS,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAEpD,SAAS,CAAC,QAAQ,CAAC,kBAAkB,gBAAuB;IAC5D,QAAQ,CAAC,WAAW,qDAAiC;IAErD,SAAS,CAAC,YAAY,0BAAiC;IAGvD,SAAS,CAAC,IAAI,IAAI,IAAI;IAStB,OAAO,IAAI,IAAI;IAKf,IAAI,QAAQ,IAAI,kBAAkB,GAAG,SAAS,CAE7C;IAED,IAAI,OAAO,IAAI,SAAS,iBAAiB,EAAE,CAE1C;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;;OAIG;IACH,IAAI,gBAAgB,IAAI,OAAO,CAE9B;IAED,OAAO,IAAI,IAAI;IA+BT,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;cAOf,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAyDzC;;;;OAIG;IACH,SAAS,CAAC,yBAAyB,IAAI,MAAM,EAAE;CAgBlD"}
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2026 EclipseSource GmbH and others.
4
+ //
5
+ // This program and the accompanying materials are made available under the
6
+ // terms of the Eclipse Public License v. 2.0 which is available at
7
+ // http://www.eclipse.org/legal/epl-2.0.
8
+ //
9
+ // This Source Code may also be made available under the following Secondary
10
+ // Licenses when the conditions for such availability set forth in the Eclipse
11
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
12
+ // with the GNU Classpath Exception which is available at
13
+ // https://www.gnu.org/software/classpath/license.html.
14
+ //
15
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
+ // *****************************************************************************
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.ScmHistoryGraphModel = exports.PAGE_SIZE = void 0;
19
+ const tslib_1 = require("tslib");
20
+ const inversify_1 = require("@theia/core/shared/inversify");
21
+ const disposable_1 = require("@theia/core/lib/common/disposable");
22
+ const event_1 = require("@theia/core/lib/common/event");
23
+ const cancellation_1 = require("@theia/core/lib/common/cancellation");
24
+ const scm_service_1 = require("./scm-service");
25
+ const scm_history_graph_lanes_1 = require("./scm-history-graph-lanes");
26
+ exports.PAGE_SIZE = 50;
27
+ let ScmHistoryGraphModel = class ScmHistoryGraphModel {
28
+ constructor() {
29
+ this.toDispose = new disposable_1.DisposableCollection();
30
+ this.toDisposeOnProviderChange = new disposable_1.DisposableCollection();
31
+ this._entries = [];
32
+ this._hasMore = false;
33
+ this._loading = false;
34
+ this._hasAttemptedLoad = false;
35
+ this.onDidChangeEmitter = new event_1.Emitter();
36
+ this.onDidChange = this.onDidChangeEmitter.event;
37
+ this.cancelSource = new cancellation_1.CancellationTokenSource();
38
+ }
39
+ init() {
40
+ this.toDispose.pushAll([
41
+ disposable_1.Disposable.create(() => this.toDisposeOnProviderChange.dispose()),
42
+ this.onDidChangeEmitter,
43
+ this.scmService.onDidChangeSelectedRepository(() => this.refresh()),
44
+ ]);
45
+ this.refresh();
46
+ }
47
+ dispose() {
48
+ this.cancelSource.cancel();
49
+ this.toDispose.dispose();
50
+ }
51
+ get provider() {
52
+ return this._provider;
53
+ }
54
+ get entries() {
55
+ return this._entries;
56
+ }
57
+ get hasMore() {
58
+ return this._hasMore;
59
+ }
60
+ get loading() {
61
+ return this._loading;
62
+ }
63
+ /**
64
+ * Returns true once the model has completed at least one load attempt
65
+ * (regardless of whether history items were found). This is used by
66
+ * the widget to distinguish "still initializing" from "no history".
67
+ */
68
+ get hasAttemptedLoad() {
69
+ return this._hasAttemptedLoad;
70
+ }
71
+ refresh() {
72
+ this.cancelSource.cancel();
73
+ this.cancelSource = new cancellation_1.CancellationTokenSource();
74
+ this.toDisposeOnProviderChange.dispose();
75
+ const repo = this.scmService.selectedRepository;
76
+ const hp = repo?.provider.historyProvider;
77
+ this._provider = hp;
78
+ if (this._provider) {
79
+ this.toDisposeOnProviderChange.push(this._provider.onDidChangeCurrentHistoryItemRefs(() => this.refresh()));
80
+ this.toDisposeOnProviderChange.push(this._provider.onDidChangeHistoryItemRefs(() => this.refresh()));
81
+ }
82
+ else if (repo) {
83
+ // historyProvider is not yet available; listen for provider changes
84
+ // so that refresh() is retried when historyProvider becomes available.
85
+ this.toDisposeOnProviderChange.push(repo.provider.onDidChange(() => this.refresh()));
86
+ }
87
+ this._entries = [];
88
+ this._hasMore = false;
89
+ this.loadPage();
90
+ }
91
+ async loadMore() {
92
+ if (this._loading || !this._hasMore) {
93
+ return;
94
+ }
95
+ await this.loadPage();
96
+ }
97
+ async loadPage() {
98
+ if (!this._provider) {
99
+ this._entries = [];
100
+ this._hasMore = false;
101
+ this._loading = false;
102
+ this._hasAttemptedLoad = true;
103
+ this.onDidChangeEmitter.fire();
104
+ return;
105
+ }
106
+ this._loading = true;
107
+ this.onDidChangeEmitter.fire();
108
+ const token = this.cancelSource.token;
109
+ try {
110
+ const historyItemRefs = this.getCurrentHistoryItemRefs();
111
+ const options = {
112
+ skip: this._entries.length,
113
+ limit: exports.PAGE_SIZE,
114
+ historyItemRefs: historyItemRefs.length > 0 ? historyItemRefs : undefined,
115
+ };
116
+ const items = await this._provider.provideHistoryItems(options, token);
117
+ if (token.isCancellationRequested) {
118
+ return;
119
+ }
120
+ const fetchedItems = items ?? [];
121
+ this._hasMore = fetchedItems.length >= exports.PAGE_SIZE;
122
+ // Filter out any items already loaded so the graph does not show duplicates.
123
+ const existingIds = new Set(this._entries.map(e => e.item.id));
124
+ const newItems = fetchedItems.filter(i => !existingIds.has(i.id));
125
+ const allItems = [...this._entries.map(e => e.item), ...newItems];
126
+ const graphRows = (0, scm_history_graph_lanes_1.computeGraphRows)(allItems.map(i => ({
127
+ id: i.id,
128
+ parentIds: i.parentIds,
129
+ })));
130
+ this._entries = allItems.map((item, idx) => ({
131
+ item,
132
+ graphRow: graphRows[idx],
133
+ }));
134
+ }
135
+ catch (err) {
136
+ if (!token.isCancellationRequested) {
137
+ console.error('ScmHistoryGraphModel: failed to load history', err);
138
+ }
139
+ }
140
+ finally {
141
+ if (!token.isCancellationRequested) {
142
+ this._loading = false;
143
+ this._hasAttemptedLoad = true;
144
+ this.onDidChangeEmitter.fire();
145
+ }
146
+ }
147
+ }
148
+ /**
149
+ * Returns the revisions of the current branch ref, its remote tracking ref,
150
+ * and the merge-base ref to pass to `provideHistoryItems`. Providers walk
151
+ * history starting from these revisions.
152
+ */
153
+ getCurrentHistoryItemRefs() {
154
+ if (!this._provider) {
155
+ return [];
156
+ }
157
+ const refs = [];
158
+ if (this._provider.currentHistoryItemRef) {
159
+ refs.push(this._provider.currentHistoryItemRef.revision ?? this._provider.currentHistoryItemRef.id);
160
+ }
161
+ if (this._provider.currentHistoryItemRemoteRef) {
162
+ refs.push(this._provider.currentHistoryItemRemoteRef.revision ?? this._provider.currentHistoryItemRemoteRef.id);
163
+ }
164
+ if (this._provider.currentHistoryItemBaseRef) {
165
+ refs.push(this._provider.currentHistoryItemBaseRef.revision ?? this._provider.currentHistoryItemBaseRef.id);
166
+ }
167
+ return refs;
168
+ }
169
+ };
170
+ exports.ScmHistoryGraphModel = ScmHistoryGraphModel;
171
+ tslib_1.__decorate([
172
+ (0, inversify_1.inject)(scm_service_1.ScmService),
173
+ tslib_1.__metadata("design:type", scm_service_1.ScmService)
174
+ ], ScmHistoryGraphModel.prototype, "scmService", void 0);
175
+ tslib_1.__decorate([
176
+ (0, inversify_1.postConstruct)(),
177
+ tslib_1.__metadata("design:type", Function),
178
+ tslib_1.__metadata("design:paramtypes", []),
179
+ tslib_1.__metadata("design:returntype", void 0)
180
+ ], ScmHistoryGraphModel.prototype, "init", null);
181
+ exports.ScmHistoryGraphModel = ScmHistoryGraphModel = tslib_1.__decorate([
182
+ (0, inversify_1.injectable)()
183
+ ], ScmHistoryGraphModel);
184
+ //# sourceMappingURL=scm-history-graph-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scm-history-graph-model.js","sourceRoot":"","sources":["../../src/browser/scm-history-graph-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scm-history-graph-model.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scm-history-graph-model.spec.d.ts","sourceRoot":"","sources":["../../src/browser/scm-history-graph-model.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2026 EclipseSource GmbH and others.
4
+ //
5
+ // This program and the accompanying materials are made available under the
6
+ // terms of the Eclipse Public License v. 2.0 which is available at
7
+ // http://www.eclipse.org/legal/epl-2.0.
8
+ //
9
+ // This Source Code may also be made available under the following Secondary
10
+ // Licenses when the conditions for such availability set forth in the Eclipse
11
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
12
+ // with the GNU Classpath Exception which is available at
13
+ // https://www.gnu.org/software/classpath/license.html.
14
+ //
15
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
+ // *****************************************************************************
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ const chai_1 = require("chai");
19
+ const event_1 = require("@theia/core/lib/common/event");
20
+ const scm_history_graph_model_1 = require("./scm-history-graph-model");
21
+ class StubHistoryProvider {
22
+ constructor() {
23
+ this.onDidChangeCurrentHistoryItemRefs = new event_1.Emitter().event;
24
+ this.onDidChangeHistoryItemRefs = new event_1.Emitter().event;
25
+ /** Pages this provider will return on consecutive calls (FIFO). */
26
+ this.pages = [];
27
+ /** Captured options for each call (so tests can assert what was sent). */
28
+ this.receivedOptions = [];
29
+ }
30
+ async provideHistoryItemRefs() {
31
+ return [];
32
+ }
33
+ async provideHistoryItems(options) {
34
+ this.receivedOptions.push(options);
35
+ return this.pages.shift() ?? [];
36
+ }
37
+ async provideHistoryItemChanges() {
38
+ return [];
39
+ }
40
+ async resolveHistoryItem() {
41
+ return undefined;
42
+ }
43
+ async resolveHistoryItemRefsCommonAncestor() {
44
+ return undefined;
45
+ }
46
+ }
47
+ function makeItems(start, count) {
48
+ const items = [];
49
+ for (let i = 0; i < count; i++) {
50
+ const id = `c${start + i}`;
51
+ items.push({
52
+ id,
53
+ subject: `commit ${id}`,
54
+ parentIds: [`c${start + i + 1}`],
55
+ });
56
+ }
57
+ return items;
58
+ }
59
+ /**
60
+ * Instantiates the model with a stub provider, bypassing inversify and the
61
+ * SCM service so tests can drive pagination directly via loadPage().
62
+ */
63
+ function createModel(provider) {
64
+ const model = new scm_history_graph_model_1.ScmHistoryGraphModel();
65
+ const internals = model;
66
+ internals.scmService = {
67
+ onDidChangeSelectedRepository: new event_1.Emitter().event,
68
+ selectedRepository: undefined,
69
+ };
70
+ internals.init();
71
+ internals._provider = provider;
72
+ return {
73
+ model,
74
+ loadPage: () => internals.loadPage(),
75
+ };
76
+ }
77
+ describe('ScmHistoryGraphModel - pagination', () => {
78
+ it('hasMore is true when a full page returns', async () => {
79
+ const provider = new StubHistoryProvider();
80
+ provider.pages = [makeItems(1, scm_history_graph_model_1.PAGE_SIZE)];
81
+ const { model, loadPage } = createModel(provider);
82
+ await loadPage();
83
+ (0, chai_1.expect)(model.entries).to.have.length(scm_history_graph_model_1.PAGE_SIZE);
84
+ (0, chai_1.expect)(model.hasMore).to.be.true;
85
+ });
86
+ it('hasMore is false when fewer than a full page is returned', async () => {
87
+ const provider = new StubHistoryProvider();
88
+ provider.pages = [makeItems(1, 10)];
89
+ const { model, loadPage } = createModel(provider);
90
+ await loadPage();
91
+ (0, chai_1.expect)(model.entries).to.have.length(10);
92
+ (0, chai_1.expect)(model.hasMore).to.be.false;
93
+ });
94
+ it('paginates using skip = current entry count', async () => {
95
+ const provider = new StubHistoryProvider();
96
+ provider.pages = [
97
+ makeItems(1, scm_history_graph_model_1.PAGE_SIZE),
98
+ makeItems(51, scm_history_graph_model_1.PAGE_SIZE),
99
+ makeItems(101, 10),
100
+ ];
101
+ const { model, loadPage } = createModel(provider);
102
+ await loadPage();
103
+ (0, chai_1.expect)(model.entries).to.have.length(scm_history_graph_model_1.PAGE_SIZE);
104
+ (0, chai_1.expect)(provider.receivedOptions[0].skip).to.equal(0);
105
+ await loadPage();
106
+ (0, chai_1.expect)(model.entries).to.have.length(2 * scm_history_graph_model_1.PAGE_SIZE);
107
+ (0, chai_1.expect)(provider.receivedOptions[1].skip).to.equal(scm_history_graph_model_1.PAGE_SIZE);
108
+ await loadPage();
109
+ (0, chai_1.expect)(model.entries).to.have.length(2 * scm_history_graph_model_1.PAGE_SIZE + 10);
110
+ (0, chai_1.expect)(provider.receivedOptions[2].skip).to.equal(2 * scm_history_graph_model_1.PAGE_SIZE);
111
+ });
112
+ it('passes skip and not cursor (cursor is not part of the VS Code SCM history options API)', async () => {
113
+ const provider = new StubHistoryProvider();
114
+ provider.pages = [makeItems(1, scm_history_graph_model_1.PAGE_SIZE)];
115
+ const { loadPage } = createModel(provider);
116
+ await loadPage();
117
+ (0, chai_1.expect)(provider.receivedOptions[0].cursor).to.be.undefined;
118
+ (0, chai_1.expect)(provider.receivedOptions[0]).to.have.property('skip');
119
+ });
120
+ it('does not grow entries when a provider re-returns duplicates', async () => {
121
+ const provider = new StubHistoryProvider();
122
+ const firstPage = makeItems(1, scm_history_graph_model_1.PAGE_SIZE);
123
+ provider.pages = [firstPage, firstPage.slice()];
124
+ const { model, loadPage } = createModel(provider);
125
+ await loadPage();
126
+ (0, chai_1.expect)(model.entries).to.have.length(scm_history_graph_model_1.PAGE_SIZE);
127
+ await loadPage();
128
+ (0, chai_1.expect)(model.entries).to.have.length(scm_history_graph_model_1.PAGE_SIZE, 'should not grow when all items are duplicates');
129
+ });
130
+ });
131
+ //# sourceMappingURL=scm-history-graph-model.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scm-history-graph-model.spec.js","sourceRoot":"","sources":["../../src/browser/scm-history-graph-model.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { MarkdownRenderer } from '@theia/core/lib/browser/markdown-rendering/markdown-renderer';
2
+ import { ScmHistoryItemRef } from './scm-provider';
3
+ import { HistoryGraphEntry } from './scm-history-graph-model';
4
+ export declare function formatRelativeTime(ms: number): string;
5
+ export declare function formatAbsoluteDate(ms: number): string;
6
+ /**
7
+ * Appends a theme icon `<i>` element followed by a text node into a container.
8
+ */
9
+ export declare function appendIconText(container: HTMLElement, iconName: string, text: string): void;
10
+ export declare function createHoverHr(): HTMLElement;
11
+ /** Creates a ref badge element for the HTML tooltip. */
12
+ export declare function buildTooltipRefBadge(ref: ScmHistoryItemRef, iconClass: string, showText: boolean, bgColor: string, extraClass?: string): HTMLElement;
13
+ export declare function buildHtmlTooltip(entry: HistoryGraphEntry, markdownRenderer: MarkdownRenderer): HTMLElement;
14
+ //# sourceMappingURL=scm-history-graph-tooltip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scm-history-graph-tooltip.d.ts","sourceRoot":"","sources":["../../src/browser/scm-history-graph-tooltip.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8DAA8D,CAAC;AAIhG,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CA2BrD;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQrD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAK3F;AAED,wBAAgB,aAAa,IAAI,WAAW,CAE3C;AAED,wDAAwD;AACxD,wBAAgB,oBAAoB,CAChC,GAAG,EAAE,iBAAiB,EACtB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,GACpB,WAAW,CAgBb;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,WAAW,CA8G1G"}
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2026 EclipseSource GmbH and others.
4
+ //
5
+ // This program and the accompanying materials are made available under the
6
+ // terms of the Eclipse Public License v. 2.0 which is available at
7
+ // http://www.eclipse.org/legal/epl-2.0.
8
+ //
9
+ // This Source Code may also be made available under the following Secondary
10
+ // Licenses when the conditions for such availability set forth in the Eclipse
11
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
12
+ // with the GNU Classpath Exception which is available at
13
+ // https://www.gnu.org/software/classpath/license.html.
14
+ //
15
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
+ // *****************************************************************************
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.formatRelativeTime = formatRelativeTime;
19
+ exports.formatAbsoluteDate = formatAbsoluteDate;
20
+ exports.appendIconText = appendIconText;
21
+ exports.createHoverHr = createHoverHr;
22
+ exports.buildTooltipRefBadge = buildTooltipRefBadge;
23
+ exports.buildHtmlTooltip = buildHtmlTooltip;
24
+ const markdown_string_1 = require("@theia/core/lib/common/markdown-rendering/markdown-string");
25
+ const widget_1 = require("@theia/core/lib/browser/widgets/widget");
26
+ const nls_1 = require("@theia/core/lib/common/nls");
27
+ const scm_history_graph_helpers_1 = require("./scm-history-graph-helpers");
28
+ function formatRelativeTime(ms) {
29
+ const now = Date.now();
30
+ const diffMs = now - ms;
31
+ const diffSec = Math.floor(diffMs / 1000);
32
+ const diffMin = Math.floor(diffSec / 60);
33
+ const diffHour = Math.floor(diffMin / 60);
34
+ const diffDay = Math.floor(diffHour / 24);
35
+ if (diffDay > 30) {
36
+ return new Date(ms).toLocaleDateString();
37
+ }
38
+ if (diffDay >= 1) {
39
+ return diffDay === 1
40
+ ? nls_1.nls.localizeByDefault('{0} day ago', diffDay)
41
+ : nls_1.nls.localizeByDefault('{0} days ago', diffDay);
42
+ }
43
+ if (diffHour >= 1) {
44
+ return diffHour === 1
45
+ ? nls_1.nls.localize('theia/scm/1HourAgo', '1 hour ago')
46
+ : nls_1.nls.localizeByDefault('{0} hours ago', diffHour);
47
+ }
48
+ if (diffMin >= 1) {
49
+ return diffMin === 1
50
+ ? nls_1.nls.localize('theia/scm/1MinuteAgo', '1 minute ago')
51
+ : nls_1.nls.localizeByDefault('{0} minutes ago', diffMin);
52
+ }
53
+ return nls_1.nls.localize('theia/scm/justNow', 'just now');
54
+ }
55
+ function formatAbsoluteDate(ms) {
56
+ return new Date(ms).toLocaleString(undefined, {
57
+ year: 'numeric',
58
+ month: 'long',
59
+ day: 'numeric',
60
+ hour: 'numeric',
61
+ minute: '2-digit',
62
+ });
63
+ }
64
+ /**
65
+ * Appends a theme icon `<i>` element followed by a text node into a container.
66
+ */
67
+ function appendIconText(container, iconName, text) {
68
+ const icon = document.createElement('i');
69
+ icon.className = (0, widget_1.codicon)(iconName) + ' icon-inline';
70
+ container.appendChild(icon);
71
+ container.appendChild(document.createTextNode(` ${text}`));
72
+ }
73
+ function createHoverHr() {
74
+ return document.createElement('hr');
75
+ }
76
+ /** Creates a ref badge element for the HTML tooltip. */
77
+ function buildTooltipRefBadge(ref, iconClass, showText, bgColor, extraClass) {
78
+ const badge = document.createElement('span');
79
+ badge.className = `scm-history-ref-badge ${(0, scm_history_graph_helpers_1.getRefBadgeClass)(ref)} tooltip-badge${extraClass ? ' ' + extraClass : ''}`;
80
+ badge.title = ref.description ?? ref.name;
81
+ badge.style.backgroundColor = bgColor;
82
+ badge.style.color = 'var(--theia-scmGraph-historyItemRefForeground, var(--theia-badge-foreground))';
83
+ const icon = document.createElement('i');
84
+ icon.className = `codicon ${iconClass} scm-history-ref-icon`;
85
+ badge.appendChild(icon);
86
+ if (showText) {
87
+ const text = document.createElement('span');
88
+ text.className = 'scm-history-ref-text';
89
+ text.textContent = ref.name;
90
+ badge.appendChild(text);
91
+ }
92
+ return badge;
93
+ }
94
+ function buildHtmlTooltip(entry, markdownRenderer) {
95
+ const { item } = entry;
96
+ const badgeColor = (0, scm_history_graph_helpers_1.laneColor)(entry.graphRow.color);
97
+ const container = document.createElement('div');
98
+ container.className = 'scm-history-tooltip';
99
+ // Header
100
+ if (item.author || item.timestamp !== undefined) {
101
+ const header = document.createElement('div');
102
+ header.className = 'scm-history-tooltip-header';
103
+ header.style.fontWeight = 'bold';
104
+ header.style.marginBottom = '4px';
105
+ if (item.author) {
106
+ appendIconText(header, 'account', item.author);
107
+ }
108
+ if (item.timestamp !== undefined) {
109
+ if (item.author) {
110
+ header.appendChild(document.createTextNode('\u00a0\u00a0'));
111
+ }
112
+ const timeSpan = document.createElement('span');
113
+ appendIconText(timeSpan, 'clock', `${formatRelativeTime(item.timestamp)} (${formatAbsoluteDate(item.timestamp)})`);
114
+ header.appendChild(timeSpan);
115
+ }
116
+ container.appendChild(header);
117
+ container.appendChild(createHoverHr());
118
+ }
119
+ // Body
120
+ const bodyText = (item.message && item.message.trim() !== item.subject.trim())
121
+ ? item.message.trim()
122
+ : item.subject;
123
+ const bodyMd = new markdown_string_1.MarkdownStringImpl(bodyText);
124
+ const rendered = markdownRenderer.render(bodyMd);
125
+ container.appendChild(rendered.element);
126
+ // Stats
127
+ if (item.statistics) {
128
+ const s = item.statistics;
129
+ container.appendChild(createHoverHr());
130
+ const stats = document.createElement('div');
131
+ stats.className = 'scm-history-tooltip-stats';
132
+ const fileCount = s.files === 1 ? '1 file changed' : `${s.files} files changed`;
133
+ const filesStrong = document.createElement('strong');
134
+ filesStrong.textContent = fileCount;
135
+ stats.appendChild(filesStrong);
136
+ if (s.insertions > 0) {
137
+ stats.appendChild(document.createTextNode(', '));
138
+ const ins = document.createElement('span');
139
+ ins.className = 'scm-history-stat-added';
140
+ ins.textContent = `${s.insertions} insertion${s.insertions === 1 ? '' : 's'}(+)`;
141
+ stats.appendChild(ins);
142
+ }
143
+ if (s.deletions > 0) {
144
+ stats.appendChild(document.createTextNode(', '));
145
+ const del = document.createElement('span');
146
+ del.className = 'scm-history-stat-deleted';
147
+ del.textContent = `${s.deletions} deletion${s.deletions === 1 ? '' : 's'}(-)`;
148
+ stats.appendChild(del);
149
+ }
150
+ container.appendChild(stats);
151
+ }
152
+ // Refs + hash
153
+ const hasRefs = item.references && item.references.length > 0;
154
+ if (hasRefs || item.displayId) {
155
+ container.appendChild(createHoverHr());
156
+ const refsRow = document.createElement('div');
157
+ refsRow.className = 'scm-history-tooltip-refs';
158
+ refsRow.style.display = 'flex';
159
+ refsRow.style.flexWrap = 'wrap';
160
+ refsRow.style.gap = '4px';
161
+ refsRow.style.alignItems = 'center';
162
+ if (hasRefs) {
163
+ const deduplicated = (0, scm_history_graph_helpers_1.deduplicateRefs)(item.references);
164
+ for (const { ref, hasBoth } of deduplicated) {
165
+ const isTag = (0, scm_history_graph_helpers_1.isTagRef)(ref);
166
+ const isRemote = (0, scm_history_graph_helpers_1.isRemoteRef)(ref);
167
+ if (isTag) {
168
+ refsRow.appendChild(buildTooltipRefBadge(ref, 'codicon-tag', true, badgeColor));
169
+ }
170
+ else if (isRemote) {
171
+ refsRow.appendChild(buildTooltipRefBadge(ref, 'codicon-cloud', true, badgeColor));
172
+ }
173
+ else {
174
+ refsRow.appendChild(buildTooltipRefBadge(ref, 'codicon-git-branch', true, badgeColor));
175
+ if (hasBoth) {
176
+ refsRow.appendChild(buildTooltipRefBadge(ref, 'codicon-cloud', false, badgeColor, 'scm-history-ref-badge-cloud'));
177
+ }
178
+ }
179
+ }
180
+ }
181
+ if (item.displayId) {
182
+ const hash = document.createElement('code');
183
+ hash.textContent = item.displayId;
184
+ refsRow.appendChild(hash);
185
+ }
186
+ container.appendChild(refsRow);
187
+ }
188
+ return container;
189
+ }
190
+ //# sourceMappingURL=scm-history-graph-tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scm-history-graph-tooltip.js","sourceRoot":"","sources":["../../src/browser/scm-history-graph-tooltip.ts"],"names":[],"mappings":"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"}