From b9802154e729716e42063827b5c28a9b57c2f019 Mon Sep 17 00:00:00 2001 From: Francesco Spissu <94986937+francescospissu@users.noreply.github.com> Date: Thu, 6 Oct 2022 11:56:59 +0200 Subject: [PATCH 1/4] put arduino libs at the top of the lib manager --- .../browser/library/library-list-widget.ts | 26 +++++++++++++++++++ .../filterable-list-container.tsx | 19 +++----------- .../widgets/component-list/list-widget.tsx | 20 +++++++++++++- .../src/common/protocol/arduino-component.ts | 1 + .../src/node/library-service-impl.ts | 1 + 5 files changed, 51 insertions(+), 16 deletions(-) diff --git a/arduino-ide-extension/src/browser/library/library-list-widget.ts b/arduino-ide-extension/src/browser/library/library-list-widget.ts index cd2b196df..0f3d6a65c 100644 --- a/arduino-ide-extension/src/browser/library/library-list-widget.ts +++ b/arduino-ide-extension/src/browser/library/library-list-widget.ts @@ -189,6 +189,32 @@ export class LibraryListWidget extends ListWidget< { timeout: 3000 } ); } + + protected override filterableListSort( + items: LibraryPackage[] + ): LibraryPackage[] { + const isArduinoMaintainedComparator = ( + left: LibraryPackage, + right: LibraryPackage + ) => { + if (left.isArduinoMaintained && !right.isArduinoMaintained) { + return -1; + } + + if (!left.isArduinoMaintained && right.isArduinoMaintained) { + return 1; + } + + return 0; + }; + + return items.sort((left, right) => { + return ( + isArduinoMaintainedComparator(left, right) || + this.defaultSortComparator(left, right) + ); + }); + } } class MessageBoxDialog extends AbstractDialog { diff --git a/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx b/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx index 20b5f317f..3702d092c 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx +++ b/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx @@ -111,19 +111,7 @@ export class FilterableListContainer< const { searchable } = this.props; searchable .search(searchOptions) - .then((items) => this.setState({ items: this.sort(items) })); - } - - protected sort(items: T[]): T[] { - const { itemLabel, itemDeprecated } = this.props; - return items.sort((left, right) => { - // always put deprecated items at the bottom of the list - if (itemDeprecated(left)) { - return 1; - } - - return itemLabel(left).localeCompare(itemLabel(right)); - }); + .then((items) => this.setState({ items: this.props.sort(items) })); } protected async install( @@ -139,7 +127,7 @@ export class FilterableListContainer< run: ({ progressId }) => install({ item, progressId, version }), }); const items = await searchable.search(this.state.searchOptions); - this.setState({ items: this.sort(items) }); + this.setState({ items: this.props.sort(items) }); } protected async uninstall(item: T): Promise { @@ -167,7 +155,7 @@ export class FilterableListContainer< run: ({ progressId }) => uninstall({ item, progressId }), }); const items = await searchable.search(this.state.searchOptions); - this.setState({ items: this.sort(items) }); + this.setState({ items: this.props.sort(items) }); } } @@ -204,6 +192,7 @@ export namespace FilterableListContainer { progressId: string; }) => Promise; readonly commandService: CommandService; + readonly sort: (items: T[]) => T[]; } export interface State { diff --git a/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx b/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx index 7e81c9b40..c580adf98 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx @@ -51,9 +51,11 @@ export abstract class ListWidget< */ protected firstActivate = true; + protected readonly defaultSortComparator: (left: T, right: T) => number; + constructor(protected options: ListWidget.Options) { super(); - const { id, label, iconClass } = options; + const { id, label, iconClass, itemDeprecated, itemLabel } = options; this.id = id; this.title.label = label; this.title.caption = label; @@ -63,6 +65,17 @@ export abstract class ListWidget< this.node.tabIndex = 0; // To be able to set the focus on the widget. this.scrollOptions = undefined; this.toDispose.push(this.searchOptionsChangeEmitter); + + this.defaultSortComparator = (left, right): number => { + // always put deprecated items at the bottom of the list + if (itemDeprecated(left)) { + return 1; + } + + return itemLabel(left).localeCompare(itemLabel(right)); + }; + + this.filterableListSort = this.filterableListSort.bind(this); } @postConstruct() @@ -128,6 +141,10 @@ export abstract class ListWidget< return this.options.installable.uninstall({ item, progressId }); } + protected filterableListSort(items: T[]): T[] { + return items.sort(this.defaultSortComparator); + } + render(): React.ReactNode { return ( @@ -145,6 +162,7 @@ export abstract class ListWidget< messageService={this.messageService} commandService={this.commandService} responseService={this.responseService} + sort={this.filterableListSort} /> ); } diff --git a/arduino-ide-extension/src/common/protocol/arduino-component.ts b/arduino-ide-extension/src/common/protocol/arduino-component.ts index 2cdfe38a2..f60dec28d 100644 --- a/arduino-ide-extension/src/common/protocol/arduino-component.ts +++ b/arduino-ide-extension/src/common/protocol/arduino-component.ts @@ -10,6 +10,7 @@ export interface ArduinoComponent { readonly availableVersions: Installable.Version[]; readonly installable: boolean; readonly installedVersion?: Installable.Version; + readonly isArduinoMaintained?: boolean; /** * This is the `Type` in IDE (1.x) UI. */ diff --git a/arduino-ide-extension/src/node/library-service-impl.ts b/arduino-ide-extension/src/node/library-service-impl.ts index bdd9631f1..1afb1ddcc 100644 --- a/arduino-ide-extension/src/node/library-service-impl.ts +++ b/arduino-ide-extension/src/node/library-service-impl.ts @@ -456,5 +456,6 @@ function toLibrary( summary: lib.getParagraph(), category: lib.getCategory(), types: lib.getTypesList(), + isArduinoMaintained: lib.getAuthor() === 'Arduino', // TODO check if .getMaintainer is more appropriate }; } From 91860b84bd5b7619a3f13e4f215a0e5ac942c096 Mon Sep 17 00:00:00 2001 From: Francesco Spissu <94986937+francescospissu@users.noreply.github.com> Date: Fri, 7 Oct 2022 11:52:09 +0200 Subject: [PATCH 2/4] moves over Arduino libs based on types field --- .../src/browser/library/library-list-widget.ts | 17 ++++++++++------- .../widgets/component-list/list-widget.tsx | 10 +++++----- .../src/common/protocol/arduino-component.ts | 1 - .../src/node/library-service-impl.ts | 1 - 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/arduino-ide-extension/src/browser/library/library-list-widget.ts b/arduino-ide-extension/src/browser/library/library-list-widget.ts index 0f3d6a65c..56368e275 100644 --- a/arduino-ide-extension/src/browser/library/library-list-widget.ts +++ b/arduino-ide-extension/src/browser/library/library-list-widget.ts @@ -190,18 +190,21 @@ export class LibraryListWidget extends ListWidget< ); } - protected override filterableListSort( + protected override filterableListSort = ( items: LibraryPackage[] - ): LibraryPackage[] { - const isArduinoMaintainedComparator = ( + ): LibraryPackage[] => { + const isArduinoTypeComparator = ( left: LibraryPackage, right: LibraryPackage ) => { - if (left.isArduinoMaintained && !right.isArduinoMaintained) { + const aIsArduinoType = left.types.includes('Arduino'); + const bIsArduinoType = right.types.includes('Arduino'); + + if (aIsArduinoType && !bIsArduinoType) { return -1; } - if (!left.isArduinoMaintained && right.isArduinoMaintained) { + if (!aIsArduinoType && bIsArduinoType) { return 1; } @@ -210,11 +213,11 @@ export class LibraryListWidget extends ListWidget< return items.sort((left, right) => { return ( - isArduinoMaintainedComparator(left, right) || + isArduinoTypeComparator(left, right) || this.defaultSortComparator(left, right) ); }); - } + }; } class MessageBoxDialog extends AbstractDialog { diff --git a/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx b/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx index c580adf98..2cbfc0acf 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx @@ -74,14 +74,14 @@ export abstract class ListWidget< return itemLabel(left).localeCompare(itemLabel(right)); }; - - this.filterableListSort = this.filterableListSort.bind(this); } @postConstruct() protected init(): void { this.toDispose.pushAll([ - this.notificationCenter.onIndexUpdateDidComplete(() => this.refresh(undefined)), + this.notificationCenter.onIndexUpdateDidComplete(() => + this.refresh(undefined) + ), this.notificationCenter.onDaemonDidStart(() => this.refresh(undefined)), this.notificationCenter.onDaemonDidStop(() => this.refresh(undefined)), ]); @@ -141,9 +141,9 @@ export abstract class ListWidget< return this.options.installable.uninstall({ item, progressId }); } - protected filterableListSort(items: T[]): T[] { + protected filterableListSort = (items: T[]): T[] => { return items.sort(this.defaultSortComparator); - } + }; render(): React.ReactNode { return ( diff --git a/arduino-ide-extension/src/common/protocol/arduino-component.ts b/arduino-ide-extension/src/common/protocol/arduino-component.ts index f60dec28d..2cdfe38a2 100644 --- a/arduino-ide-extension/src/common/protocol/arduino-component.ts +++ b/arduino-ide-extension/src/common/protocol/arduino-component.ts @@ -10,7 +10,6 @@ export interface ArduinoComponent { readonly availableVersions: Installable.Version[]; readonly installable: boolean; readonly installedVersion?: Installable.Version; - readonly isArduinoMaintained?: boolean; /** * This is the `Type` in IDE (1.x) UI. */ diff --git a/arduino-ide-extension/src/node/library-service-impl.ts b/arduino-ide-extension/src/node/library-service-impl.ts index 1afb1ddcc..bdd9631f1 100644 --- a/arduino-ide-extension/src/node/library-service-impl.ts +++ b/arduino-ide-extension/src/node/library-service-impl.ts @@ -456,6 +456,5 @@ function toLibrary( summary: lib.getParagraph(), category: lib.getCategory(), types: lib.getTypesList(), - isArduinoMaintained: lib.getAuthor() === 'Arduino', // TODO check if .getMaintainer is more appropriate }; } From 9f82175199aadcddb828638b8ced273d06d8fce0 Mon Sep 17 00:00:00 2001 From: Francesco Spissu <94986937+francescospissu@users.noreply.github.com> Date: Fri, 7 Oct 2022 12:54:28 +0200 Subject: [PATCH 3/4] put Arduino boards on top --- .../browser/library/library-list-widget.ts | 29 ------------------- .../widgets/component-list/list-widget.tsx | 22 +++++++++++++- 2 files changed, 21 insertions(+), 30 deletions(-) diff --git a/arduino-ide-extension/src/browser/library/library-list-widget.ts b/arduino-ide-extension/src/browser/library/library-list-widget.ts index 56368e275..cd2b196df 100644 --- a/arduino-ide-extension/src/browser/library/library-list-widget.ts +++ b/arduino-ide-extension/src/browser/library/library-list-widget.ts @@ -189,35 +189,6 @@ export class LibraryListWidget extends ListWidget< { timeout: 3000 } ); } - - protected override filterableListSort = ( - items: LibraryPackage[] - ): LibraryPackage[] => { - const isArduinoTypeComparator = ( - left: LibraryPackage, - right: LibraryPackage - ) => { - const aIsArduinoType = left.types.includes('Arduino'); - const bIsArduinoType = right.types.includes('Arduino'); - - if (aIsArduinoType && !bIsArduinoType) { - return -1; - } - - if (!aIsArduinoType && bIsArduinoType) { - return 1; - } - - return 0; - }; - - return items.sort((left, right) => { - return ( - isArduinoTypeComparator(left, right) || - this.defaultSortComparator(left, right) - ); - }); - }; } class MessageBoxDialog extends AbstractDialog { diff --git a/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx b/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx index 2cbfc0acf..f14602ccb 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx @@ -142,7 +142,27 @@ export abstract class ListWidget< } protected filterableListSort = (items: T[]): T[] => { - return items.sort(this.defaultSortComparator); + const isArduinoTypeComparator = (left: T, right: T) => { + const aIsArduinoType = left.types.includes('Arduino'); + const bIsArduinoType = right.types.includes('Arduino'); + + if (aIsArduinoType && !bIsArduinoType) { + return -1; + } + + if (!aIsArduinoType && bIsArduinoType) { + return 1; + } + + return 0; + }; + + return items.sort((left, right) => { + return ( + isArduinoTypeComparator(left, right) || + this.defaultSortComparator(left, right) + ); + }); }; render(): React.ReactNode { From fd9e6f73a1bde31fa7b921c5304c20dd831745af Mon Sep 17 00:00:00 2001 From: Francesco Spissu <94986937+francescospissu@users.noreply.github.com> Date: Fri, 7 Oct 2022 18:07:02 +0200 Subject: [PATCH 4/4] put deprecated items at the bottom of the list --- .../src/browser/widgets/component-list/list-widget.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx b/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx index f14602ccb..a27fa3cdc 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx @@ -146,11 +146,11 @@ export abstract class ListWidget< const aIsArduinoType = left.types.includes('Arduino'); const bIsArduinoType = right.types.includes('Arduino'); - if (aIsArduinoType && !bIsArduinoType) { + if (aIsArduinoType && !bIsArduinoType && !left.deprecated) { return -1; } - if (!aIsArduinoType && bIsArduinoType) { + if (!aIsArduinoType && bIsArduinoType && !right.deprecated) { return 1; }