Skip to content

Commit c3e2aa4

Browse files
author
Akos Kitta
committed
Generalized the list item renderers.
To support update/downgrade. Signed-off-by: Akos Kitta <kittaakos@typefox.io>
1 parent 63cd270 commit c3e2aa4

9 files changed

+84
-156
lines changed

arduino-ide-extension/src/browser/arduino-frontend-module.ts

+4-5
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@ import { ArduinoScmContribution } from './customization/arduino-scm-contribution
5252
import { SearchInWorkspaceFrontendContribution } from '@theia/search-in-workspace/lib/browser/search-in-workspace-frontend-contribution';
5353
import { ArduinoSearchInWorkspaceContribution } from './customization/arduino-search-in-workspace-contribution';
5454
import { LibraryListWidgetFrontendContribution } from './library/library-widget-frontend-contribution';
55-
import { LibraryItemRenderer } from './library/library-item-renderer';
56-
import { BoardItemRenderer } from './boards/boards-item-renderer';
5755
import { MonitorServiceClientImpl } from './monitor/monitor-service-client-impl';
5856
import { MonitorServicePath, MonitorService, MonitorServiceClient } from '../common/protocol/monitor-service';
5957
import { ConfigService, ConfigServicePath } from '../common/protocol/config-service';
@@ -72,6 +70,7 @@ import { AboutDialog } from '@theia/core/lib/browser/about-dialog';
7270
import { ArduinoAboutDialog } from './customization/arduino-about-dialog';
7371
import { ArduinoShellLayoutRestorer } from './shell/arduino-shell-layout-restorer';
7472
import { EditorMode } from './editor-mode';
73+
import { ListItemRenderer } from './components/component-list/list-item-renderer';
7574
const ElementQueries = require('css-element-queries/src/ElementQueries');
7675

7776
export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Unbind, isBound: interfaces.IsBound, rebind: interfaces.Rebind) => {
@@ -92,9 +91,11 @@ export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Un
9291
bind(LanguageGrammarDefinitionContribution).to(ArduinoLanguageGrammarContribution).inSingletonScope();
9392
bind(LanguageClientContribution).to(ArduinoLanguageClientContribution).inSingletonScope();
9493

94+
// Renderer for both the library and the core widgets.
95+
bind(ListItemRenderer).toSelf().inSingletonScope();
96+
9597
// Library service
9698
bind(LibraryService).toDynamicValue(context => WebSocketConnectionProvider.createProxy(context.container, LibraryServicePath)).inSingletonScope();
97-
9899
// Library list widget
99100
bind(LibraryListWidget).toSelf();
100101
bindViewContribution(bind, LibraryListWidgetFrontendContribution);
@@ -103,7 +104,6 @@ export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Un
103104
createWidget: () => context.container.get(LibraryListWidget)
104105
}));
105106
bind(FrontendApplicationContribution).toService(LibraryListWidgetFrontendContribution);
106-
bind(LibraryItemRenderer).toSelf().inSingletonScope();
107107

108108
// Sketch list service
109109
bind(SketchesService).toDynamicValue(context => WebSocketConnectionProvider.createProxy(context.container, SketchesServicePath)).inSingletonScope();
@@ -137,7 +137,6 @@ export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Un
137137
createWidget: () => context.container.get(BoardsListWidget)
138138
}));
139139
bind(FrontendApplicationContribution).toService(BoardsListWidgetFrontendContribution);
140-
bind(BoardItemRenderer).toSelf().inSingletonScope();
141140

142141
// Board select dialog
143142
bind(BoardsConfigDialogWidget).toSelf().inSingletonScope();

arduino-ide-extension/src/browser/boards/boards-item-renderer.tsx

-77
This file was deleted.

arduino-ide-extension/src/browser/boards/boards-list-widget.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { inject, injectable } from 'inversify';
22
import { BoardPackage, BoardsService } from '../../common/protocol/boards-service';
33
import { ListWidget } from '../components/component-list/list-widget';
4-
import { BoardItemRenderer } from './boards-item-renderer';
4+
import { ListItemRenderer } from '../components/component-list/list-item-renderer';
55

66
@injectable()
77
export class BoardsListWidget extends ListWidget<BoardPackage> {
@@ -11,7 +11,7 @@ export class BoardsListWidget extends ListWidget<BoardPackage> {
1111

1212
constructor(
1313
@inject(BoardsService) protected service: BoardsService,
14-
@inject(BoardItemRenderer) protected itemRenderer: BoardItemRenderer) {
14+
@inject(ListItemRenderer) protected itemRenderer: ListItemRenderer<BoardPackage>) {
1515

1616
super({
1717
id: BoardsListWidget.WIDGET_ID,

arduino-ide-extension/src/browser/components/component-list/list-item-renderer.tsx

+65-4
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { ArduinoComponent } from '../../../common/protocol/arduino-component';
66
import { ComponentListItem } from './component-list-item';
77

88
@injectable()
9-
export abstract class ListItemRenderer<T extends ArduinoComponent> {
9+
export class ListItemRenderer<T extends ArduinoComponent> {
1010

1111
@inject(WindowService)
1212
protected windowService: WindowService;
@@ -19,10 +19,71 @@ export abstract class ListItemRenderer<T extends ArduinoComponent> {
1919
}
2020
}
2121

22-
abstract renderItem(
22+
renderItem(
2323
input: ComponentListItem.State & { item: T },
2424
install: (item: T) => Promise<void>,
2525
onVersionChange: (version: Installable.Version) => void
26-
): React.ReactNode;
26+
): React.ReactNode {
2727

28-
}
28+
const { item } = input;
29+
const name = <span className='name'>{item.name}</span>;
30+
const author = <span className='author'>{item.author}</span>;
31+
const installedVersion = !!item.installedVersion && <div className='version-info'>
32+
<span className='version'>Version {item.installedVersion}</span>
33+
<span className='installed'>INSTALLED</span>
34+
</div>;
35+
36+
const summary = <div className='summary'>{item.summary}</div>;
37+
const description = <div className='summary'>{item.description}</div>;
38+
39+
const moreInfo = !!item.moreInfoLink && <a href={item.moreInfoLink} onClick={this.onMoreInfoClick}>More info</a>;
40+
const onClickInstall = () => install(item);
41+
const installButton = item.installable &&
42+
<button className='install' onClick={onClickInstall}>INSTALL</button>;
43+
44+
const onSelectChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
45+
const version = event.target.value;
46+
if (version) {
47+
onVersionChange(version);
48+
}
49+
}
50+
51+
const versions = (() => {
52+
const { availableVersions } = item;
53+
if (availableVersions.length === 0) {
54+
return undefined;
55+
} else if (availableVersions.length === 1) {
56+
return <label>{availableVersions[0]}</label>
57+
} else {
58+
return <select
59+
value={input.selectedVersion}
60+
onChange={onSelectChange}>
61+
{
62+
item.availableVersions
63+
.filter(version => version !== item.installedVersion) // Filter the version that is currently installed.
64+
.map(version => <option value={version} key={version}>{version}</option>)
65+
}
66+
</select>;
67+
}
68+
})();
69+
70+
return <div className='component-list-item noselect'>
71+
<div className='header'>
72+
<span>{name} by {author}</span>
73+
{installedVersion}
74+
</div>
75+
<div className='content'>
76+
{summary}
77+
{description}
78+
</div>
79+
<div className='info'>
80+
{moreInfo}
81+
</div>
82+
<div className='footer'>
83+
{installButton}
84+
{versions}
85+
</div>
86+
</div>;
87+
}
88+
89+
}

arduino-ide-extension/src/browser/library/library-item-renderer.tsx

-58
This file was deleted.

arduino-ide-extension/src/browser/library/library-list-widget.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { inject, injectable } from 'inversify';
22
import { Library, LibraryService } from '../../common/protocol/library-service';
33
import { ListWidget } from '../components/component-list/list-widget';
4-
import { LibraryItemRenderer } from './library-item-renderer';
4+
import { ListItemRenderer } from '../components/component-list/list-item-renderer';
55

66
@injectable()
77
export class LibraryListWidget extends ListWidget<Library> {
@@ -11,7 +11,7 @@ export class LibraryListWidget extends ListWidget<Library> {
1111

1212
constructor(
1313
@inject(LibraryService) protected service: LibraryService,
14-
@inject(LibraryItemRenderer) protected itemRenderer: LibraryItemRenderer) {
14+
@inject(ListItemRenderer) protected itemRenderer: ListItemRenderer<Library>) {
1515

1616
super({
1717
id: LibraryListWidget.WIDGET_ID,

arduino-ide-extension/src/node/core-client-provider-impl.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export class CoreClientProviderImpl implements CoreClientProvider {
5959
resolve(undefined);
6060
return
6161
}
62-
62+
6363
if (!workspaceRootOrResourceUri) {
6464
resolve(this.getOrCreateClient(roots[0]));
6565
return;

arduino-ide-extension/src/node/library-service-impl.ts

+9-6
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import { injectable, inject } from 'inversify';
22
import { Library, LibraryService } from '../common/protocol/library-service';
33
import { CoreClientProvider } from './core-client-provider';
4-
import { LibrarySearchReq, LibrarySearchResp, LibraryListReq, LibraryListResp, LibraryRelease,
5-
InstalledLibrary, LibraryInstallReq, LibraryInstallResp } from './cli-protocol/commands/lib_pb';
4+
import {
5+
LibrarySearchReq, LibrarySearchResp, LibraryListReq, LibraryListResp, LibraryRelease,
6+
InstalledLibrary, LibraryInstallReq, LibraryInstallResp
7+
} from './cli-protocol/commands/lib_pb';
68
import { ToolOutputServiceServer } from '../common/protocol/tool-output-service';
79
import { Installable } from '../common/protocol/installable';
810

@@ -44,6 +46,7 @@ export class LibraryServiceImpl implements LibraryService {
4446
.filter(item => !!item.getLatest())
4547
.slice(0, 50)
4648
.map(item => {
49+
const availableVersions = item.getReleasesMap().getEntryList().map(([key, _]) => key);
4750
let installedVersion: string | undefined;
4851
const installed = installedLibsIdx.get(item.getName());
4952
if (installed) {
@@ -52,8 +55,8 @@ export class LibraryServiceImpl implements LibraryService {
5255
return toLibrary({
5356
name: item.getName(),
5457
installable: true,
55-
installedVersion
56-
}, item.getLatest()!)
58+
installedVersion,
59+
}, item.getLatest()!, availableVersions)
5760
})
5861

5962
return { items };
@@ -88,14 +91,14 @@ export class LibraryServiceImpl implements LibraryService {
8891

8992
}
9093

91-
function toLibrary(tpl: Partial<Library>, release: LibraryRelease): Library {
94+
function toLibrary(tpl: Partial<Library>, release: LibraryRelease, availableVersions: string[]): Library {
9295
return {
9396
name: "",
9497
installable: false,
9598
...tpl,
9699

97100
author: release.getAuthor(),
98-
availableVersions: [release.getVersion()],
101+
availableVersions,
99102
description: release.getSentence(),
100103
moreInfoLink: release.getWebsite(),
101104
summary: release.getParagraph()

arduino-ide-extension/tsconfig.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,4 @@
2828
"files": [
2929
"../node_modules/@theia/monaco/src/typings/monaco/index.d.ts"
3030
]
31-
}
31+
}

0 commit comments

Comments
 (0)