Skip to content

Commit 2d6db93

Browse files
committed
Remove decorations from individual files and clean up the code
1 parent afd407b commit 2d6db93

File tree

11 files changed

+54
-60
lines changed

11 files changed

+54
-60
lines changed

packages/ai-chat-ui/src/browser/change-set-actions/change-set-accept-action.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import { nls } from '@theia/core';
2323
@injectable()
2424
export class ChangeSetAcceptAction implements ChangeSetActionRenderer {
2525
readonly id = 'change-set-accept-action';
26-
2726
canRender(changeSet: ChangeSet): boolean {
2827
return changeSet.getElements().length > 0;
2928
}

packages/ai-chat-ui/src/browser/chat-input-widget.tsx

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ const ChatInput: React.FunctionComponent<ChatInputProperties> = (props: ChatInpu
268268
? buildChangeSetUI(
269269
props.chatModel.changeSet,
270270
props.labelProvider,
271+
props.decoratorService,
271272
props.actionService.getActionsForChangeset(props.chatModel.changeSet),
272273
onDeleteChangeSet,
273274
onDeleteChangeSetElement
@@ -382,6 +383,7 @@ const ChatInput: React.FunctionComponent<ChatInputProperties> = (props: ChatInpu
382383
setChangeSetUI(buildChangeSetUI(
383384
event.changeSet,
384385
props.labelProvider,
386+
props.decoratorService,
385387
props.actionService.getActionsForChangeset(event.changeSet),
386388
onDeleteChangeSet,
387389
onDeleteChangeSetElement
@@ -393,12 +395,12 @@ const ChatInput: React.FunctionComponent<ChatInputProperties> = (props: ChatInpu
393395
? buildChangeSetUI(
394396
props.chatModel.changeSet,
395397
props.labelProvider,
398+
props.decoratorService,
396399
props.actionService.getActionsForChangeset(props.chatModel.changeSet),
397400
onDeleteChangeSet,
398401
onDeleteChangeSetElement
399402
)
400403
: undefined);
401-
402404
return () => {
403405
listener?.dispose();
404406
responseListenerRef.current?.dispose();
@@ -423,6 +425,7 @@ const ChatInput: React.FunctionComponent<ChatInputProperties> = (props: ChatInpu
423425
setChangeSetUI(buildChangeSetUI(
424426
props.chatModel.changeSet,
425427
props.labelProvider,
428+
props.decoratorService,
426429
props.actionService.getActionsForChangeset(props.chatModel.changeSet),
427430
onDeleteChangeSet,
428431
onDeleteChangeSetElement
@@ -564,6 +567,7 @@ const noPropagation = (handler: () => void) => (e: React.MouseEvent) => {
564567
const buildChangeSetUI = (
565568
changeSet: ChangeSet,
566569
labelProvider: LabelProvider,
570+
decoratorService: ChangeSetDecoratorService,
567571
actions: ChangeSetActionRenderer[],
568572
onDeleteChangeSet: () => void,
569573
onDeleteChangeSetElement: (index: number) => void
@@ -574,24 +578,24 @@ const buildChangeSetUI = (
574578
elements: changeSet.getElements().map(element => ({
575579
open: element.open?.bind(element),
576580
iconClass: element.icon ?? labelProvider.getIcon(element.uri) ?? labelProvider.fileIcon,
577-
iconOverlayClass: element.iconOverlay,
578581
nameClass: `${element.type} ${element.state}`,
579582
name: element.name ?? labelProvider.getName(element.uri),
580583
additionalInfo: element.additionalInfo ?? labelProvider.getDetails(element.uri),
584+
additionalInfoSuffixIcon: decoratorService.getAdditionalInfoSuffixIcon(element),
581585
openChange: element?.openChange?.bind(element),
582586
apply: element.state !== 'applied' ? element?.apply?.bind(element) : undefined,
583587
revert: element.state === 'applied' || element.state === 'stale' ? element?.revert?.bind(element) : undefined,
584588
delete: () => onDeleteChangeSetElement(changeSet.getElements().indexOf(element))
585-
})),
589+
} satisfies ChangeSetUIElement)),
586590
actions
587591
});
588592

589593
interface ChangeSetUIElement {
590594
name: string;
591595
iconClass: string;
592-
iconOverlayClass?: string[];
593596
nameClass: string;
594597
additionalInfo: string;
598+
additionalInfoSuffixIcon?: string[];
595599
open?: () => void;
596600
openChange?: () => void;
597601
apply?: () => void;
@@ -622,16 +626,17 @@ const ChangeSetBox: React.FunctionComponent<{ changeSet: ChangeSetUI }> = React.
622626
{elements.map((element, index) => (
623627
<li key={index} title={nls.localize('theia/ai/chat-ui/openDiff', 'Open Diff')} onClick={() => element.openChange?.()}>
624628
<div className={`theia-ChatInput-ChangeSet-Icon ${element.iconClass}`}>
625-
{element.iconOverlayClass && <div className={`theia-ChatInput-ChangeSet-IconOverlay ${element.iconOverlayClass.join(' ')}`}></div>}
626629
</div>
627-
<span className='theia-ChatInput-ChangeSet-labelParts'>
630+
<div className='theia-ChatInput-ChangeSet-labelParts'>
628631
<span className={`theia-ChatInput-ChangeSet-title ${element.nameClass}`}>
629632
{element.name}
630633
</span>
631-
<span className='theia-ChatInput-ChangeSet-additionalInfo'>
632-
{element.additionalInfo}
633-
</span>
634-
</span>
634+
<div className='theia-ChatInput-ChangeSet-additionalInfo'>
635+
{element.additionalInfo && <span>{element.additionalInfo}</span>}
636+
{element.additionalInfoSuffixIcon
637+
&& <div className={`theia-ChatInput-ChangeSet-AdditionalInfo-SuffixIcon ${element.additionalInfoSuffixIcon.join(' ')}`}></div>}
638+
</div>
639+
</div>
635640
<div className='theia-ChatInput-ChangeSet-Actions'>
636641
{element.open && (
637642
<span

packages/ai-chat-ui/src/browser/style/index.css

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -323,25 +323,27 @@ div:last-child > .theia-ChatNode {
323323
font-size: var(--theia-ui-font-size1);
324324
}
325325

326-
.theia-ChatInput-ChangeSet-List .theia-ChatInput-ChangeSet-IconOverlay {
327-
position: absolute;
328-
top: -1px;
329-
right: -1px;
330-
font-size: var(--theia-ui-font-size0) px;
331-
}
332-
333326
.theia-ChatInput-ChangeSet-Actions .action {
334327
width: 16px;
335328
height: 16px;
336329
cursor: pointer;
337330
}
338331

339332
.theia-ChatInput-ChangeSet-additionalInfo {
333+
align-items: center;
334+
gap: 4px;
340335
margin-left: 8px;
341336
color: var(--theia-disabledForeground);
342337
}
343338

339+
.theia-ChatInput-ChangeSet-List
340+
.theia-ChatInput-ChangeSet-AdditionalInfo-SuffixIcon {
341+
font-size: var(--theia-ui-font-size0) px;
342+
margin-left: 4px;
343+
}
344+
344345
.theia-ChatInput-ChangeSet-labelParts {
346+
display: flex;
345347
overflow: hidden;
346348
text-overflow: ellipsis;
347349
}
@@ -366,6 +368,7 @@ div:last-child > .theia-ChatNode {
366368
.theia-ChatInput-ChangeSet-Header-Actions,
367369
.theia-ChatInput-ChangeSet-Box h3,
368370
.theia-ChatInput-ChangeSet-additionalInfo {
371+
display: flex;
369372
white-space: nowrap;
370373
overflow: hidden;
371374
text-overflow: ellipsis;

packages/ai-chat/src/browser/change-set-decorator-service.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@ import { inject, injectable, named } from '@theia/core/shared/inversify';
2020
import debounce = require('@theia/core/shared/lodash.debounce');
2121
import type { ChangeSetDecoration, ChangeSetElement } from '../common';
2222

23+
/**
24+
* A decorator for a change set element.
25+
* It allows to add additional information to the element, such as icons.
26+
*/
2327
export const ChangeSetDecorator = Symbol('ChangeSetDecorator');
24-
2528
export interface ChangeSetDecorator {
26-
2729
readonly id: string;
2830

2931
readonly onDidChangeDecorations: Event<void>;
@@ -63,8 +65,8 @@ export class ChangeSetDecoratorService implements FrontendApplicationContributio
6365
return decorations;
6466
}
6567

66-
getIconOverlay(element: ChangeSetElement): string[] | undefined {
68+
getAdditionalInfoSuffixIcon(element: ChangeSetElement): string[] | undefined {
6769
const decorations = this.getDecorations(element);
68-
return decorations.find(d => d.iconOverlay)?.iconOverlay;
70+
return decorations.find(d => d.additionalInfoSuffixIcon)?.additionalInfoSuffixIcon;
6971
}
7072
}

packages/ai-chat/src/browser/change-set-file-element.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,6 @@ export class ChangeSetFileElement implements ChangeSetElement {
7777

7878
protected readonly onDidChangeEmitter = new Emitter<void>();
7979
readonly onDidChange = this.onDidChangeEmitter.event;
80-
protected readonly onDidChangeDecorationsEmitter = new Emitter<void>();
81-
readonly onDidChangeDecorations = this.onDidChangeDecorationsEmitter.event;
8280

8381
protected readOnlyResource: UpdatableReferenceResource;
8482
protected changeResource: UpdatableReferenceResource;
@@ -89,9 +87,6 @@ export class ChangeSetFileElement implements ChangeSetElement {
8987
this.obtainOriginalContent();
9088
this.listenForOriginalFileChanges();
9189
this.toDispose.push(this.onDidChangeEmitter);
92-
this.toDispose.push(this.changeSetDecoratorService.onDidChangeDecorations(() => {
93-
this.onDidChangeDecorationsEmitter.fire();
94-
}));
9590
}
9691

9792
protected async obtainOriginalContent(): Promise<void> {
@@ -150,10 +145,6 @@ export class ChangeSetFileElement implements ChangeSetElement {
150145
return this.elementProps.icon ?? this.changeSetFileService.getIcon(this.uri);
151146
}
152147

153-
get iconOverlay(): string[] | undefined {
154-
return this.elementProps.iconOverlay ?? this.changeSetDecoratorService.getIconOverlay(this);
155-
}
156-
157148
get additionalInfo(): string | undefined {
158149
return this.changeSetFileService.getAdditionalInfo(this.uri);
159150
}

packages/ai-chat/src/common/chat-model.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@ export interface ChatModel {
102102

103103
export interface ChangeSet extends Disposable {
104104
onDidChange: Event<ChangeSetChangeEvent>;
105-
onDidDecorationChange: Event<void>;
106105
readonly title: string;
107106
getElements(): ChangeSetElement[];
108107
dispose(): void;
@@ -120,10 +119,8 @@ export interface ChangeSetElement {
120119
readonly uri: URI;
121120

122121
onDidChange?: Event<void>
123-
onDidChangeDecorations?: Event<void>
124122
readonly name?: string;
125123
readonly icon?: string;
126-
readonly iconOverlay?: string[];
127124
readonly additionalInfo?: string;
128125

129126
readonly state?: 'pending' | 'applied' | 'stale';
@@ -139,7 +136,7 @@ export interface ChangeSetElement {
139136

140137
export interface ChangeSetDecoration {
141138
readonly priority?: number;
142-
readonly iconOverlay?: string[];
139+
readonly additionalInfoSuffixIcon?: string[];
143140
}
144141

145142
export interface ChatRequest {
@@ -543,8 +540,6 @@ export interface ChatResponseModel {
543540
export class MutableChatModel implements ChatModel, Disposable {
544541
protected readonly _onDidChangeEmitter = new Emitter<ChatChangeEvent>();
545542
onDidChange: Event<ChatChangeEvent> = this._onDidChangeEmitter.event;
546-
protected readonly _onDidDecorationChangeEmitter = new Emitter<void>();
547-
onDidDecorationChange: Event<void> = this._onDidDecorationChangeEmitter.event;
548543

549544
protected _requests: MutableChatRequestModel[];
550545
protected _id: string;
@@ -650,8 +645,6 @@ interface ChangeSetChangeEvent {
650645
export class ChangeSetImpl implements ChangeSet {
651646
protected readonly _onDidChangeEmitter = new Emitter<ChangeSetChangeEvent>();
652647
onDidChange: Event<ChangeSetChangeEvent> = this._onDidChangeEmitter.event;
653-
protected readonly _onDidDecorationChangeEmitter = new Emitter<void>();
654-
onDidDecorationChange: Event<void> = this._onDidDecorationChangeEmitter.event;
655648

656649
protected _elements: ChangeSetElement[] = [];
657650

@@ -680,7 +673,6 @@ export class ChangeSetImpl implements ChangeSet {
680673
this._elements.push(element);
681674
}
682675
element.onDidChange?.(() => this.notifyChange({ state: [element.uri] }));
683-
element.onDidChangeDecorations?.(() => this._onDidDecorationChangeEmitter.fire());
684676
});
685677
toDispose.forEach(element => element.dispose?.());
686678
this.notifyChange({ added, modified });

packages/ai-scanoss/src/browser/ai-scanoss-code-scan-action.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,11 @@ const ScanOSSIntegration = React.memo((props: {
144144
title = nls.localize('theia/ai/scanoss/snippet/no-match', 'SCANOSS - No match');
145145
}
146146
}
147+
147148
return (
148149
<div
149150
className={`button scanoss-icon icon-container ${scanOSSResult === 'pending'
150-
? 'requesting'
151+
? 'pending'
151152
: scanOSSResult
152153
? scanOSSResult.type
153154
: ''

packages/ai-scanoss/src/browser/ai-scanoss-frontend-module.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@ import { CodePartRendererAction } from '@theia/ai-chat-ui/lib/browser/chat-respo
2323
import { ChangeSetActionRenderer } from '@theia/ai-chat-ui/lib/browser/change-set-actions/change-set-action-service';
2424
import { ChangeSetScanActionRenderer } from './change-set-scan-action/change-set-scan-action';
2525
import { ChangeSetDecorator } from '@theia/ai-chat/lib/browser/change-set-decorator-service';
26-
import { ScanChangeSetElementDecorator } from './change-set-scan-action/change-set-scan-decorator';
26+
import { ChangeSetScanDecorator } from './change-set-scan-action/change-set-scan-decorator';
2727

2828
export default new ContainerModule(bind => {
2929
bind(PreferenceContribution).toConstantValue({ schema: AIScanOSSPreferencesSchema });
3030
bind(ScanOSSScanButtonAction).toSelf().inSingletonScope();
3131
bind(CodePartRendererAction).toService(ScanOSSScanButtonAction);
3232
bind(ChangeSetScanActionRenderer).toSelf();
3333
bind(ChangeSetActionRenderer).toService(ChangeSetScanActionRenderer);
34-
bind(ScanChangeSetElementDecorator).toSelf().inSingletonScope();
35-
bind(ChangeSetDecorator).toService(ScanChangeSetElementDecorator);
34+
bind(ChangeSetScanDecorator).toSelf().inSingletonScope();
35+
bind(ChangeSetDecorator).toService(ChangeSetScanDecorator);
3636
});

packages/ai-scanoss/src/browser/change-set-scan-action/change-set-scan-action.tsx

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import { IDiffProviderFactoryService } from '@theia/monaco-editor-core/esm/vs/ed
2929
import { IDocumentDiffProvider } from '@theia/monaco-editor-core/esm/vs/editor/common/diff/documentDiffProvider';
3030
import { MonacoTextModelService } from '@theia/monaco/lib/browser/monaco-text-model-service';
3131
import { CancellationToken, Emitter, MessageService, nls } from '@theia/core';
32-
import { ScanChangeSetElementDecorator } from './change-set-scan-decorator';
32+
import { ChangeSetScanDecorator } from './change-set-scan-decorator';
3333

3434
type ScanOSSState = 'pending' | 'clean' | 'match' | 'error' | 'none';
3535
type ScanOSSResultOptions = 'pending' | ScanOSSResult[] | undefined;
@@ -53,8 +53,8 @@ export class ChangeSetScanActionRenderer implements ChangeSetActionRenderer {
5353
@inject(MessageService)
5454
protected readonly messageService: MessageService;
5555

56-
@inject(ScanChangeSetElementDecorator)
57-
protected readonly scanChangeSetElementDecorator: ScanChangeSetElementDecorator;
56+
@inject(ChangeSetScanDecorator)
57+
protected readonly scanChangeSetDecorator: ChangeSetScanDecorator;
5858

5959
protected differ: IDocumentDiffProvider;
6060

@@ -73,7 +73,7 @@ export class ChangeSetScanActionRenderer implements ChangeSetActionRenderer {
7373
return (
7474
<ChangeSetScanOSSIntegration
7575
changeSet={changeSet}
76-
decorator={this.scanChangeSetElementDecorator}
76+
decorator={this.scanChangeSetDecorator}
7777
scanOssMode={this.getPreferenceValues()}
7878
scanChangeSet={this._scan}
7979
/>
@@ -148,7 +148,7 @@ export class ChangeSetScanActionRenderer implements ChangeSetActionRenderer {
148148

149149
interface ChangeSetScanActionProps {
150150
changeSet: ChangeSet;
151-
decorator: ScanChangeSetElementDecorator;
151+
decorator: ChangeSetScanDecorator;
152152
scanOssMode: string;
153153
scanChangeSet: (changeSet: ChangeSetElement[], cache: Map<string, ScanOSSResult>, userTriggered: boolean) => Promise<ScanOSSResult[]>
154154
}
@@ -174,6 +174,7 @@ const ChangeSetScanOSSIntegration = React.memo(({
174174

175175
React.useEffect(() => {
176176
if (!Array.isArray(scanOSSResult)) {
177+
decorator.setScanResult([]);
177178
return;
178179
}
179180
decorator.setScanResult(scanOSSResult);
@@ -211,8 +212,8 @@ const ChangeSetScanOSSIntegration = React.memo(({
211212
} else if (state === 'clean' || state === 'pending') {
212213
return <div className='theia-changeSet-scanOss readonly'>
213214
<div
214-
className={`button scanoss-icon icon-container ${state === 'pending'
215-
? 'requesting'
215+
className={`scanoss-icon icon-container ${state === 'pending'
216+
? 'pending'
216217
: state
217218
? state
218219
: ''
@@ -229,7 +230,7 @@ const ChangeSetScanOSSIntegration = React.memo(({
229230
onClick={scanOSSClicked}
230231
>
231232
<div
232-
className={`button scanoss-icon icon-container ${state}`}
233+
className={`scanoss-icon icon-container ${state}`}
233234
title={title}
234235
>
235236
{icon}

packages/ai-scanoss/src/browser/change-set-scan-action/change-set-scan-decorator.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ import { injectable } from '@theia/core/shared/inversify';
2121
import type { ScanOSSResult } from '@theia/scanoss';
2222

2323
@injectable()
24-
export class ScanChangeSetElementDecorator implements ChangeSetDecorator {
25-
readonly id = 'theia-scan-change-element-decorator';
24+
export class ChangeSetScanDecorator implements ChangeSetDecorator {
25+
readonly id = 'thei-change-set-scanoss-decorator';
2626

2727
protected readonly emitter = new Emitter<void>();
2828
readonly onDidChangeDecorations = this.emitter.event;
@@ -44,7 +44,7 @@ export class ScanChangeSetElementDecorator implements ChangeSetDecorator {
4444

4545
if (match) {
4646
return {
47-
iconOverlay: ['scanoss-icon-overlay', 'match', 'codicon', 'codicon-warning'],
47+
additionalInfoSuffixIcon: ['additional-info-scanoss-icon', 'match', 'codicon', 'codicon-warning'],
4848
};
4949
}
5050

0 commit comments

Comments
 (0)